|
@@ -1,4 +1,7 @@
|
|
|
<?php
|
|
<?php
|
|
|
|
|
+error_reporting(E_ALL);
|
|
|
|
|
+ini_set('display_errors', 1);
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* controllers/ollamaGenerate.php
|
|
* controllers/ollamaGenerate.php
|
|
|
*
|
|
*
|
|
@@ -130,7 +133,81 @@ function sv(array $spec, array $row, string $col): mixed
|
|
|
$r = $row;
|
|
$r = $row;
|
|
|
$s = $spec;
|
|
$s = $spec;
|
|
|
|
|
|
|
|
-// ── Build comprehensive soil data block (ALL elements) ────────────────────────
|
|
|
|
|
|
|
+// ── Pre-compute all display values (heredocs don't support function calls) ────
|
|
|
|
|
+$d_ph_h2o = fv($r['ph_h2o'], 1); $d_ph_h2o_st = rangeStatus($r['ph_h2o'], 6.2, 6.8);
|
|
|
|
|
+$d_ph_cacl2 = fv($r['ph_cacl2'], 1);
|
|
|
|
|
+$d_ec = fv($r['ec'], 2);
|
|
|
|
|
+$d_colour = $r['colour'] ?? 'N/A';
|
|
|
|
|
+$d_texture = $r['texture'] ?? 'N/A';
|
|
|
|
|
+$d_gravel = fv($r['gravel'], 1);
|
|
|
|
|
+$d_ocarbon = fv($r['ocarbon'], 1);
|
|
|
|
|
+$d_omatter = fv($r['omatter'], 1);
|
|
|
|
|
+$d_cec = fv($r['cec'], 2);
|
|
|
|
|
+$d_tec = fv($r['tec'], 2);
|
|
|
|
|
+$d_paramag = fv($r['paramag'], 0);
|
|
|
|
|
+$d_no3 = fv($r['NO3_N'], 0); $d_no3_st = rangeStatus($r['NO3_N'], 10, 20);
|
|
|
|
|
+$d_nh3 = fv($r['NH3_N'], 0);
|
|
|
|
|
+$d_cn_ratio = fv($r['c_n_ratio'], 1);
|
|
|
|
|
+$d_p_colwell = fv($r['p_colwell'], 0);
|
|
|
|
|
+$d_p_morgan = fv($r['p_morgan'], 0);
|
|
|
|
|
+$d_p_mehlick = fv($r['p_mehlick'], 0);
|
|
|
|
|
+$d_p_bray2 = fv($r['p_bray2'], 0);
|
|
|
|
|
+
|
|
|
|
|
+// Major cations
|
|
|
|
|
+$d_ca_ppm = fv($r['BS_ca_ppm'], 0);
|
|
|
|
|
+$d_ca_min = fv(sv($s,$r,'ca_ppm_min'), 0); $d_ca_max = fv(sv($s,$r,'ca_ppm_max'), 0);
|
|
|
|
|
+$d_ca_st = rangeStatus($r['BS_ca_ppm'], sv($s,$r,'ca_ppm_min'), sv($s,$r,'ca_ppm_max'));
|
|
|
|
|
+$d_mg_ppm = fv($r['BS_mg_ppm'], 0);
|
|
|
|
|
+$d_mg_min = fv(sv($s,$r,'mg_ppm_min'), 0); $d_mg_max = fv(sv($s,$r,'mg_ppm_max'), 0);
|
|
|
|
|
+$d_mg_st = rangeStatus($r['BS_mg_ppm'], sv($s,$r,'mg_ppm_min'), sv($s,$r,'mg_ppm_max'));
|
|
|
|
|
+$d_k_ppm = fv($r['BS_k_ppm'], 0);
|
|
|
|
|
+$d_k_min = fv(sv($s,$r,'k_ppm_min'), 0); $d_k_max = fv(sv($s,$r,'k_ppm_max'), 0);
|
|
|
|
|
+$d_k_st = rangeStatus($r['BS_k_ppm'], sv($s,$r,'k_ppm_min'), sv($s,$r,'k_ppm_max'));
|
|
|
|
|
+$d_na_ppm = fv($r['BS_na_ppm'], 0);
|
|
|
|
|
+$d_na_min = fv(sv($s,$r,'na_ppm_min'), 0); $d_na_max = fv(sv($s,$r,'na_ppm_max'), 0);
|
|
|
|
|
+$d_na_st = rangeStatus($r['BS_na_ppm'], sv($s,$r,'na_ppm_min'), sv($s,$r,'na_ppm_max'));
|
|
|
|
|
+
|
|
|
|
|
+// Base saturations
|
|
|
|
|
+$d_ca_bs = fv($r['BS_ca2'], 2);
|
|
|
|
|
+$d_ca_bs_min = fv(sv($s,$r,'cabs_min'), 1); $d_ca_bs_max = fv(sv($s,$r,'cabs_max'), 1);
|
|
|
|
|
+$d_ca_bs_st = rangeStatus($r['BS_ca2'], sv($s,$r,'cabs_min'), sv($s,$r,'cabs_max'));
|
|
|
|
|
+$d_mg_bs = fv($r['BS_mg2'], 2);
|
|
|
|
|
+$d_mg_bs_min = fv(sv($s,$r,'mgbs_min'), 1); $d_mg_bs_max = fv(sv($s,$r,'mgbs_max'), 1);
|
|
|
|
|
+$d_mg_bs_st = rangeStatus($r['BS_mg2'], sv($s,$r,'mgbs_min'), sv($s,$r,'mgbs_max'));
|
|
|
|
|
+$d_k_bs = fv($r['BS_k'], 2);
|
|
|
|
|
+$d_k_bs_min = fv(sv($s,$r,'kbs_min'), 1); $d_k_bs_max = fv(sv($s,$r,'kbs_max'), 1);
|
|
|
|
|
+$d_k_bs_st = rangeStatus($r['BS_k'], sv($s,$r,'kbs_min'), sv($s,$r,'kbs_max'));
|
|
|
|
|
+$d_na_bs = fv($r['BS_na'], 2);
|
|
|
|
|
+$d_na_bs_min = fv(sv($s,$r,'nabs_min'), 1); $d_na_bs_max = fv(sv($s,$r,'nabs_max'), 1);
|
|
|
|
|
+$d_na_bs_st = rangeStatus($r['BS_na'], sv($s,$r,'nabs_min'), sv($s,$r,'nabs_max'));
|
|
|
|
|
+$d_ob = fv($r['BS_ob'], 2); $d_ob_rec = fv(sv($s,$r,'ob_rec'), 1);
|
|
|
|
|
+$d_h = fv($r['BS_h'], 2); $d_h_rec = fv(sv($s,$r,'h_rec'), 1);
|
|
|
|
|
+$d_al3 = fv($r['BS_al3'], 2);
|
|
|
|
|
+
|
|
|
|
|
+// Morgans
|
|
|
|
|
+$d_ca_m = fv($r['ca_morgan'], 2); $d_mg_m = fv($r['mg_morgan'], 2);
|
|
|
|
|
+$d_k_m = fv($r['k_morgan'], 2); $d_na_m = fv($r['na_morgan'], 2);
|
|
|
|
|
+
|
|
|
|
|
+// Mehlick-3
|
|
|
|
|
+$d_ca_me = fv($r['ca_mehlick3'], 2); $d_mg_me = fv($r['mg_mehlick3'], 2);
|
|
|
|
|
+$d_k_me = fv($r['k_mehlick3'], 2); $d_na_me = fv($r['na_mehlick3'], 2);
|
|
|
|
|
+$d_al_me = fv($r['al_mehlick3'], 2);
|
|
|
|
|
+
|
|
|
|
|
+// Trace elements
|
|
|
|
|
+$d_s = fv($r['s_morgan'], 2); $d_b = fv($r['b_cacl2'], 2);
|
|
|
|
|
+$d_mn = fv($r['mn_dtpa'], 2); $d_cu = fv($r['cu_dtpa'], 2);
|
|
|
|
|
+$d_zn = fv($r['zn_dtpa'], 2); $d_fe = fv($r['fe_dtpa'], 2);
|
|
|
|
|
+$d_fe_tot = fv($r['fe'], 2); $d_al = fv($r['al'], 2);
|
|
|
|
|
+$d_si = fv($r['sl_cacl2'], 2); $d_co = fv($r['co_dtpa'], 2);
|
|
|
|
|
+$d_mo = fv($r['m_dtpa'], 2); $d_se = fv($r['se'], 2);
|
|
|
|
|
+
|
|
|
|
|
+// Ratios
|
|
|
|
|
+$_ca_me_v = is_numeric($r['ca_mehlick3']) ? (float)$r['ca_mehlick3'] : 0;
|
|
|
|
|
+$_mg_me_v = is_numeric($r['mg_mehlick3']) ? (float)$r['mg_mehlick3'] : 0;
|
|
|
|
|
+$d_ca_mg_ratio = fv($_mg_me_v != 0 ? round($_ca_me_v / $_mg_me_v, 1) : null, 1);
|
|
|
|
|
+$d_ca_mg_ratio_rec = fv(sv($s,$r,'ca_mg_ratio'), 1);
|
|
|
|
|
+
|
|
|
|
|
+// Build comprehensive soil data block (ALL elements)
|
|
|
$soilData = <<<TEXT
|
|
$soilData = <<<TEXT
|
|
|
=====================================
|
|
=====================================
|
|
|
SOIL TEST DATA — COMPLETE ANALYSIS
|
|
SOIL TEST DATA — COMPLETE ANALYSIS
|
|
@@ -144,78 +221,78 @@ Lab No: {$r['lab_no']}
|
|
|
Date Sampled: {$r['date_sampled']}
|
|
Date Sampled: {$r['date_sampled']}
|
|
|
|
|
|
|
|
--- SOIL PHYSICAL / REACTION ---
|
|
--- SOIL PHYSICAL / REACTION ---
|
|
|
-pH (H2O): {fv($r['ph_h2o'], 1)} [target: 6.2–6.8] {rangeStatus($r['ph_h2o'], 6.2, 6.8)}
|
|
|
|
|
-pH (CaCl2): {fv($r['ph_cacl2'], 1)}
|
|
|
|
|
-EC (mS/cm): {fv($r['ec'], 2)}
|
|
|
|
|
-Colour: {$r['colour']}
|
|
|
|
|
-Texture: {$r['texture']}
|
|
|
|
|
-Gravel (%): {fv($r['gravel'], 1)}
|
|
|
|
|
|
|
+pH (H2O): $d_ph_h2o [target: 6.2-6.8] $d_ph_h2o_st
|
|
|
|
|
+pH (CaCl2): $d_ph_cacl2
|
|
|
|
|
+EC (mS/cm): $d_ec
|
|
|
|
|
+Colour: $d_colour
|
|
|
|
|
+Texture: $d_texture
|
|
|
|
|
+Gravel (%): $d_gravel
|
|
|
|
|
|
|
|
--- ORGANIC MATTER ---
|
|
--- ORGANIC MATTER ---
|
|
|
-Organic Carbon (%): {fv($r['ocarbon'], 1)}
|
|
|
|
|
-Organic Matter (%): {fv($r['omatter'], 1)}
|
|
|
|
|
|
|
+Organic Carbon (%): $d_ocarbon
|
|
|
|
|
+Organic Matter (%): $d_omatter
|
|
|
|
|
|
|
|
--- CATION EXCHANGE ---
|
|
--- CATION EXCHANGE ---
|
|
|
-CEC (meq/100g): {fv($r['cec'], 2)}
|
|
|
|
|
-TEC (meq/100g): {fv($r['tec'], 2)}
|
|
|
|
|
-Paramagnetic: {fv($r['paramag'], 0)}
|
|
|
|
|
|
|
+CEC (meq/100g): $d_cec
|
|
|
|
|
+TEC (meq/100g): $d_tec
|
|
|
|
|
+Paramagnetic: $d_paramag
|
|
|
|
|
|
|
|
--- NITROGEN ---
|
|
--- NITROGEN ---
|
|
|
-Nitrate-N (NO3-N ppm): {fv($r['NO3_N'], 0)} [target: 10–20 ppm] {rangeStatus($r['NO3_N'], 10, 20)}
|
|
|
|
|
-Ammonium-N (NH3-N ppm): {fv($r['NH3_N'], 0)}
|
|
|
|
|
-C:N ratio: {fv($r['c_n_ratio'], 1)}
|
|
|
|
|
|
|
+Nitrate-N (NO3-N ppm): $d_no3 [target: 10-20 ppm] $d_no3_st
|
|
|
|
|
+Ammonium-N (NH3-N ppm): $d_nh3
|
|
|
|
|
+C:N ratio: $d_cn_ratio
|
|
|
|
|
|
|
|
--- PHOSPHORUS ---
|
|
--- PHOSPHORUS ---
|
|
|
-P Colwell (ppm): {fv($r['p_colwell'], 0)}
|
|
|
|
|
-P Morgan (ppm): {fv($r['p_morgan'], 0)}
|
|
|
|
|
-P Mehlick (ppm): {fv($r['p_mehlick'], 0)}
|
|
|
|
|
-P Bray2 (ppm): {fv($r['p_bray2'], 0)}
|
|
|
|
|
|
|
+P Colwell (ppm): $d_p_colwell
|
|
|
|
|
+P Morgan (ppm): $d_p_morgan
|
|
|
|
|
+P Mehlick (ppm): $d_p_mehlick
|
|
|
|
|
+P Bray2 (ppm): $d_p_bray2
|
|
|
|
|
|
|
|
--- MAJOR CATIONS (ppm) ---
|
|
--- MAJOR CATIONS (ppm) ---
|
|
|
-Calcium Ca (ppm): {fv($r['BS_ca_ppm'], 0)} [min: {fv(sv($s,$r,'ca_ppm_min'),0)}, max: {fv(sv($s,$r,'ca_ppm_max'),0)}] {rangeStatus($r['BS_ca_ppm'], sv($s,$r,'ca_ppm_min'), sv($s,$r,'ca_ppm_max'))}
|
|
|
|
|
-Magnesium Mg (ppm): {fv($r['BS_mg_ppm'], 0)} [min: {fv(sv($s,$r,'mg_ppm_min'),0)}, max: {fv(sv($s,$r,'mg_ppm_max'),0)}] {rangeStatus($r['BS_mg_ppm'], sv($s,$r,'mg_ppm_min'), sv($s,$r,'mg_ppm_max'))}
|
|
|
|
|
-Potassium K (ppm): {fv($r['BS_k_ppm'], 0)} [min: {fv(sv($s,$r,'k_ppm_min'), 0)}, max: {fv(sv($s,$r,'k_ppm_max'), 0)}] {rangeStatus($r['BS_k_ppm'], sv($s,$r,'k_ppm_min'), sv($s,$r,'k_ppm_max'))}
|
|
|
|
|
-Sodium Na (ppm): {fv($r['BS_na_ppm'], 0)} [min: {fv(sv($s,$r,'na_ppm_min'),0)}, max: {fv(sv($s,$r,'na_ppm_max'),0)}] {rangeStatus($r['BS_na_ppm'], sv($s,$r,'na_ppm_min'), sv($s,$r,'na_ppm_max'))}
|
|
|
|
|
|
|
+Calcium Ca (ppm): $d_ca_ppm [min: $d_ca_min, max: $d_ca_max] $d_ca_st
|
|
|
|
|
+Magnesium Mg (ppm): $d_mg_ppm [min: $d_mg_min, max: $d_mg_max] $d_mg_st
|
|
|
|
|
+Potassium K (ppm): $d_k_ppm [min: $d_k_min, max: $d_k_max] $d_k_st
|
|
|
|
|
+Sodium Na (ppm): $d_na_ppm [min: $d_na_min, max: $d_na_max] $d_na_st
|
|
|
|
|
|
|
|
--- BASE SATURATIONS (%) ---
|
|
--- BASE SATURATIONS (%) ---
|
|
|
-Calcium Ca (%): {fv($r['BS_ca2'], 2)}% [min: {fv(sv($s,$r,'cabs_min'),1)}, max: {fv(sv($s,$r,'cabs_max'),1)}] {rangeStatus($r['BS_ca2'], sv($s,$r,'cabs_min'), sv($s,$r,'cabs_max'))}
|
|
|
|
|
-Magnesium Mg (%): {fv($r['BS_mg2'], 2)}% [min: {fv(sv($s,$r,'mgbs_min'),1)}, max: {fv(sv($s,$r,'mgbs_max'),1)}] {rangeStatus($r['BS_mg2'], sv($s,$r,'mgbs_min'), sv($s,$r,'mgbs_max'))}
|
|
|
|
|
-Potassium K (%): {fv($r['BS_k'], 2)}% [min: {fv(sv($s,$r,'kbs_min'), 1)}, max: {fv(sv($s,$r,'kbs_max'), 1)}] {rangeStatus($r['BS_k'], sv($s,$r,'kbs_min'), sv($s,$r,'kbs_max'))}
|
|
|
|
|
-Sodium Na (%): {fv($r['BS_na'], 2)}% [min: {fv(sv($s,$r,'nabs_min'),1)}, max: {fv(sv($s,$r,'nabs_max'),1)}] {rangeStatus($r['BS_na'], sv($s,$r,'nabs_min'), sv($s,$r,'nabs_max'))}
|
|
|
|
|
-Other Bases (%): {fv($r['BS_ob'], 2)}% [recommended: {fv(sv($s,$r,'ob_rec'),1)}]
|
|
|
|
|
-Hydrogen (%): {fv($r['BS_h'], 2)}% [recommended: {fv(sv($s,$r,'h_rec'), 1)}]
|
|
|
|
|
-Aluminium Al3 (%): {fv($r['BS_al3'], 2)}%
|
|
|
|
|
|
|
+Calcium Ca (%): $d_ca_bs% [min: $d_ca_bs_min, max: $d_ca_bs_max] $d_ca_bs_st
|
|
|
|
|
+Magnesium Mg (%): $d_mg_bs% [min: $d_mg_bs_min, max: $d_mg_bs_max] $d_mg_bs_st
|
|
|
|
|
+Potassium K (%): $d_k_bs% [min: $d_k_bs_min, max: $d_k_bs_max] $d_k_bs_st
|
|
|
|
|
+Sodium Na (%): $d_na_bs% [min: $d_na_bs_min, max: $d_na_bs_max] $d_na_bs_st
|
|
|
|
|
+Other Bases (%): $d_ob% [recommended: $d_ob_rec]
|
|
|
|
|
+Hydrogen (%): $d_h% [recommended: $d_h_rec]
|
|
|
|
|
+Aluminium Al3 (%): $d_al3%
|
|
|
|
|
|
|
|
--- MORGANS EXTRACT (ppm) ---
|
|
--- MORGANS EXTRACT (ppm) ---
|
|
|
-Ca Morgan: {fv($r['ca_morgan'], 2)}
|
|
|
|
|
-Mg Morgan: {fv($r['mg_morgan'], 2)}
|
|
|
|
|
-K Morgan: {fv($r['k_morgan'], 2)}
|
|
|
|
|
-Na Morgan: {fv($r['na_morgan'], 2)}
|
|
|
|
|
|
|
+Ca Morgan: $d_ca_m
|
|
|
|
|
+Mg Morgan: $d_mg_m
|
|
|
|
|
+K Morgan: $d_k_m
|
|
|
|
|
+Na Morgan: $d_na_m
|
|
|
|
|
|
|
|
--- MEHLICK-3 EXTRACT (ppm) ---
|
|
--- MEHLICK-3 EXTRACT (ppm) ---
|
|
|
-Ca Mehlick3: {fv($r['ca_mehlick3'], 2)}
|
|
|
|
|
-Mg Mehlick3: {fv($r['mg_mehlick3'], 2)}
|
|
|
|
|
-K Mehlick3: {fv($r['k_mehlick3'], 2)}
|
|
|
|
|
-Na Mehlick3: {fv($r['na_mehlick3'], 2)}
|
|
|
|
|
-Al Mehlick3: {fv($r['al_mehlick3'], 2)}
|
|
|
|
|
|
|
+Ca Mehlick3: $d_ca_me
|
|
|
|
|
+Mg Mehlick3: $d_mg_me
|
|
|
|
|
+K Mehlick3: $d_k_me
|
|
|
|
|
+Na Mehlick3: $d_na_me
|
|
|
|
|
+Al Mehlick3: $d_al_me
|
|
|
|
|
|
|
|
--- TRACE ELEMENTS (ppm) ---
|
|
--- TRACE ELEMENTS (ppm) ---
|
|
|
-Sulfur S (ppm): {fv($r['s_morgan'], 2)}
|
|
|
|
|
-Boron B (ppm): {fv($r['b_cacl2'], 2)}
|
|
|
|
|
-Manganese Mn (ppm): {fv($r['mn_dtpa'], 2)}
|
|
|
|
|
-Copper Cu (ppm): {fv($r['cu_dtpa'], 2)}
|
|
|
|
|
-Zinc Zn (ppm): {fv($r['zn_dtpa'], 2)}
|
|
|
|
|
-Iron Fe (ppm): {fv($r['fe_dtpa'], 2)}
|
|
|
|
|
-Iron Fe (total): {fv($r['fe'], 2)}
|
|
|
|
|
-Aluminium Al (ppm): {fv($r['al'], 2)}
|
|
|
|
|
-Silicon Si (ppm): {fv($r['sl_cacl2'], 2)}
|
|
|
|
|
-Cobalt Co (ppm): {fv($r['co_dtpa'], 2)}
|
|
|
|
|
-Molybdenum Mo (ppm): {fv($r['m_dtpa'], 2)}
|
|
|
|
|
-Selenium Se (ppm): {fv($r['se'], 2)}
|
|
|
|
|
|
|
+Sulfur S (ppm): $d_s
|
|
|
|
|
+Boron B (ppm): $d_b
|
|
|
|
|
+Manganese Mn (ppm): $d_mn
|
|
|
|
|
+Copper Cu (ppm): $d_cu
|
|
|
|
|
+Zinc Zn (ppm): $d_zn
|
|
|
|
|
+Iron Fe (ppm): $d_fe
|
|
|
|
|
+Iron Fe (total): $d_fe_tot
|
|
|
|
|
+Aluminium Al (ppm): $d_al
|
|
|
|
|
+Silicon Si (ppm): $d_si
|
|
|
|
|
+Cobalt Co (ppm): $d_co
|
|
|
|
|
+Molybdenum Mo (ppm): $d_mo
|
|
|
|
|
+Selenium Se (ppm): $d_se
|
|
|
|
|
|
|
|
--- RATIOS ---
|
|
--- RATIOS ---
|
|
|
-Ca:Mg ratio: {fv(is_numeric($r['ca_mehlick3']) && is_numeric($r['mg_mehlick3']) && (float)$r['mg_mehlick3'] != 0 ? round((float)$r['ca_mehlick3']/(float)$r['mg_mehlick3'],1) : null, 1)} [recommended: {fv(sv($s,$r,'ca_mg_ratio'),1)}]
|
|
|
|
|
-C:N ratio: {fv($r['c_n_ratio'], 1)}
|
|
|
|
|
|
|
+Ca:Mg ratio: $d_ca_mg_ratio [recommended: $d_ca_mg_ratio_rec]
|
|
|
|
|
+C:N ratio: $d_cn_ratio
|
|
|
|
|
|
|
|
TEXT;
|
|
TEXT;
|
|
|
|
|
|