www/prod_beerxml.php

changeset 604
9e791905157a
parent 603
c0f638bcec9f
child 605
538627a5555c
--- a/www/prod_beerxml.php	Wed Jan 29 16:58:04 2020 +0100
+++ b/www/prod_beerxml.php	Thu Jan 30 15:18:11 2020 +0100
@@ -22,7 +22,6 @@
 $result = mysqli_query($link, "SELECT * FROM products WHERE record='".$record."'");
 $row = mysqli_fetch_array($result);
 
-
 $recipetype = array( 'Extract', 'Partial Mash', 'All Grain' );
 $styletype = array( 'Lager', 'Ale', 'Mead', 'Wheat', 'Mixed', 'Cider' );
 $hoptype = array( 'Bittering', 'Aroma', 'Both' );
@@ -40,6 +39,13 @@
 $ibumethod = array( 'Tinseth', 'Rager', 'Daniels', 'Garetz', 'Mosher', 'Noonan' );
 
 
+function field($x, $field, $value) {
+	xmlwriter_start_element($x, $field);
+	xmlwriter_text($x, $value);
+	xmlwriter_end_element($x);
+}
+
+
 /*
  * Create beerxml output
  */
@@ -53,273 +59,125 @@
 xmlwriter_start_element($xw, 'RECIPE');
 
 // Recipe basics
-xmlwriter_start_element($xw, 'VERSION');
-xmlwriter_text($xw, '1');
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'NAME');
-xmlwriter_text($xw, $row['name']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'NOTES');
-xmlwriter_text($xw, $row['notes']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'TYPE');
-xmlwriter_text($xw, $recipetype[$row['type']]);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'BREWER');
-xmlwriter_text($xw, 'Anonymous');
-xmlwriter_end_element($xw);
+field($xw, 'VERSION', '1');
+field($xw, 'NAME', $row['name']);
+field($xw, 'NOTES', $row['notes']);
+field($xw, 'TYPE', $recipetype[$row['type']]);
+field($xw, 'BREWER', 'Anonymous');
+field($xw, 'BATCH_SIZE', sprintf("%.4f",floatval($row['batch_size'])));
+field($xw, 'BOIL_SIZE', sprintf("%.4f",floatval($row['boil_size'])));
+field($xw, 'BOIL_TIME', sprintf("%.3f",floatval($row['boil_time'])));
+field($xw, 'EFFICIENCY', sprintf("%.4f",floatval($row['efficiency'])));
+field($xw, 'OG', sprintf("%.3f",floatval($row['og'])));
+field($xw, 'FG', sprintf("%.3f",floatval($row['fg'])));
 
-xmlwriter_start_element($xw, 'BATCH_SIZE');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['batch_size'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'BOIL_SIZE');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['boil_size'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'BOIL_TIME');
-xmlwriter_text($xw, sprintf("%.0f",floatval($row['boil_time'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'EFFICIENCY');
-xmlwriter_text($xw, sprintf("%.1f",floatval($row['efficiency'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'OG');
-xmlwriter_text($xw, sprintf("%.3f",floatval($row['og'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'FG');
-xmlwriter_text($xw, sprintf("%.3f",floatval($row['fg'])));
-xmlwriter_end_element($xw);
 
 if (floatval($row['est_og']) > 0) {
-        xmlwriter_start_element($xw, 'EST_OG');
-        xmlwriter_text($xw, sprintf("%.3f",floatval($row['est_og'])));
-        xmlwriter_end_element($xw);
+	field($xw, 'EST_OG', sprintf("%.3f",floatval($row['est_og'])));
 }
 
 if (floatval($row['est_fg']) > 0) {
-        xmlwriter_start_element($xw, 'EST_FG');
-        xmlwriter_text($xw, sprintf("%.3f",floatval($row['est_fg'])));
-        xmlwriter_end_element($xw);
+	field($xw, 'EST_FG', sprintf("%.3f",floatval($row['est_fg'])));
 }
 
 if (floatval($row['est_abv']) > 0) {
-        xmlwriter_start_element($xw, 'EST_ABV');
-        xmlwriter_text($xw, sprintf("%.1f",floatval($row['est_abv'])));
-        xmlwriter_end_element($xw);
+	field($xw, 'EST_ABV', sprintf("%.1f",floatval($row['est_abv'])));
 }
 
 if (floatval($row['est_color']) > 0) {
-        xmlwriter_start_element($xw, 'EST_COLOR');
-        xmlwriter_text($xw, sprintf("%.1f",floatval($row['est_color'])));
-        xmlwriter_end_element($xw);
-	xmlwriter_start_element($xw, 'COLOR_METHOD');
-	xmlwriter_text($xw, $colormethod[$row['color_method']]);
-	xmlwriter_end_element($xw);
+	field($xw, 'EST_COLOR', sprintf("%.6f", ebc_to_srm(floatval($row['est_color']))));
+	field($xw, 'COLOR_METHOD', $colormethod[$row['color_method']]);
 }
 
 if (floatval($row['est_ibu']) > 0) {
-        xmlwriter_start_element($xw, 'EST_IBU');
-        xmlwriter_text($xw, sprintf("%.1f",floatval($row['est_ibu'])));
-        xmlwriter_end_element($xw);
-	xmlwriter_start_element($xw, 'IBU_METHOD');
-	xmlwriter_text($xw, $ibumethod[$row['ibu_method']]);
-	xmlwriter_end_element($xw);
-}
-
-if ($row['brew_cooling_to'] > 0) {
-	xmlwriter_start_element($xw, 'BMS_COOLING_TO');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($row['brew_cooling_to'])));
-	xmlwriter_end_element($xw);
+	field($xw, 'EST_IBU', sprintf("%.1f",floatval($row['est_ibu'])));
+	field($xw, 'IBU_METHOD', $ibumethod[$row['ibu_method']]);
 }
 
-if ($row['brew_whirlpool9'] > 0) {
-	xmlwriter_start_element($xw, 'BMS_WHIRLPOOL9');
-	xmlwriter_text($xw, sprintf("%.0f",floatval($row['brew_whirlpool9'])));
-	xmlwriter_end_element($xw);
-}
-if ($row['brew_whirlpool7'] > 0) {
-        xmlwriter_start_element($xw, 'BMS_WHIRLPOOL7');
-        xmlwriter_text($xw, sprintf("%.0f",floatval($row['brew_whirlpool7'])));
-        xmlwriter_end_element($xw);
+/* If product is packaged and carbonated, add fermentation data. */
+if ($row['stage'] >= 8) {
+	$d1 = new DateTime($row['brew_date_end']);
+        $d2 = new DateTime($row['primary_end_date']);
+        $d3 = new DateTime($row['secondary_end_date']);
+        $d4 = new DateTime($row['package_date']);
+	$diff = $d2->diff($d1);
+        $primary_days = $diff->days;
+        $diff = $d3->diff($d2);
+        $secondary_days = $diff->days;
+        $diff = $d4->diff($d3);
+        $tertiary_days = $diff->days;
+	field($xw, 'FERMENTATION_STAGES', '3');
+	field($xw, 'PRIMARY_AGE', sprintf("%.1f", $primary_days));
+	field($xw, 'PRIMARY_TEMP', sprintf("%.1f", $row['primary_max_temp']));
+	field($xw, 'SECONDARY_AGE', sprintf("%.1f", $secondary_days));
+	field($xw, 'SECONDARY_TEMP', sprintf("%.1f", $row['secondary_temp']));
+	field($xw, 'TERTIARY_AGE', sprintf("%.1f", $tertiary_days));
+	field($xw, 'TERTIARY_TEMP', sprintf("%.1f", $row['tertiary_temp']));
+	field($xw, 'CARBONATION', sprintf("%.1f", $row['bottle_carbonation']));
+	field($xw, 'FORCED_CARBONATION', 'FALSE');
+	field($xw, 'CARBONATION_TEMP', sprintf("%.1f", $row['bottle_carbonation_temp']));
 }
-if ($row['brew_whirlpool6'] > 0) {
-        xmlwriter_start_element($xw, 'BMS_WHIRLPOOL6');
-        xmlwriter_text($xw, sprintf("%.0f",floatval($row['brew_whirlpool6'])));
-        xmlwriter_end_element($xw);
-}
-if ($row['brew_whirlpool2'] > 0) {
-        xmlwriter_start_element($xw, 'BMS_WHIRLPOOL2');
-        xmlwriter_text($xw, sprintf("%.0f",floatval($row['brew_whirlpool2'])));
-        xmlwriter_end_element($xw);
-}
+
+if ($row['brew_cooling_to'] > 0)
+	field($xw, 'BMS_COOLING_TO', sprintf("%.1f",floatval($row['brew_cooling_to'])));
+
+if ($row['brew_whirlpool9'] > 0)
+	field($xw, 'BMS_WHIRLPOOL9', sprintf("%.0f",floatval($row['brew_whirlpool9'])));
+if ($row['brew_whirlpool7'] > 0)
+	field($xw, 'BMS_WHIRLPOOL7', sprintf("%.0f",floatval($row['brew_whirlpool7'])));
+if ($row['brew_whirlpool6'] > 0)
+	field($xw, 'BMS_WHIRLPOOL6', sprintf("%.0f",floatval($row['brew_whirlpool6'])));
+if ($row['brew_whirlpool2'] > 0)
+	field($xw, 'BMS_WHIRLPOOL2', sprintf("%.0f",floatval($row['brew_whirlpool2'])));
 
 
 // Style
 xmlwriter_start_element($xw, 'STYLE');
-
-xmlwriter_start_element($xw, 'VERSION');
-xmlwriter_text($xw, '1');
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'NAME');
-xmlwriter_text($xw, $row['st_name']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'CATEGORY');
-xmlwriter_text($xw, $row['st_category']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'CATEGORY_NUMBER');
-xmlwriter_text($xw, $row['st_category_number']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'STYLE_LETTER');
-xmlwriter_text($xw, $row['st_letter']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'STYLE_GUIDE');
-xmlwriter_text($xw, $row['st_guide']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'TYPE');
-xmlwriter_text($xw, $styletype[$row['st_type']]);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'OG_MIN');
-xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_min'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'OG_MAX');
-xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_max'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'FG_MIN');
-xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_min'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'FG_MAX');
-xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_max'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'IBU_MIN');
-xmlwriter_text($xw, sprintf("%.0f",floatval($row['st_ibu_min'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'IBU_MAX');
-xmlwriter_text($xw, sprintf("%.0f",floatval($row['st_ibu_max'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'COLOR_MIN');
-xmlwriter_text($xw, sprintf("%.2f",ebc_to_srm(floatval($row['st_color_min']))));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'COLOR_MAX');
-xmlwriter_text($xw, sprintf("%.2f",ebc_to_srm(floatval($row['st_color_max']))));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'CARB_MIN');
-xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_carb_min'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'CARB_MAX');
-xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_carb_max'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'ABV_MIN');
-xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_abv_min'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'ABV_MAX');
-xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_abv_max'])));
-xmlwriter_end_element($xw);
-
+field($xw, 'VERSION', '1');
+field($xw, 'NAME', $row['st_name']);
+field($xw, 'CATEGORY', $row['st_category']);
+field($xw, 'CATEGORY_NUMBER', $row['st_category_number']);
+field($xw, 'STYLE_LETTER', $row['st_letter']);
+field($xw, 'STYLE_GUIDE', $row['st_guide']);
+field($xw, 'TYPE', $styletype[$row['st_type']]);
+field($xw, 'OG_MIN', sprintf("%.3f",floatval($row['st_og_min'])));
+field($xw, 'OG_MAX', sprintf("%.3f",floatval($row['st_og_max'])));
+field($xw, 'FG_MIN', sprintf("%.3f",floatval($row['st_fg_min'])));
+field($xw, 'FG_MAX', sprintf("%.3f",floatval($row['st_fg_max'])));
+field($xw, 'IBU_MIN', sprintf("%.0f",floatval($row['st_ibu_min'])));
+field($xw, 'IBU_MAX', sprintf("%.0f",floatval($row['st_ibu_max'])));
+field($xw, 'COLOR_MIN', sprintf("%.2f",ebc_to_srm(floatval($row['st_color_min']))));
+field($xw, 'COLOR_MAX', sprintf("%.2f",ebc_to_srm(floatval($row['st_color_max']))));
+field($xw, 'CARB_MIN', sprintf("%.1f",floatval($row['st_carb_min'])));
+field($xw, 'CARB_MAX', sprintf("%.1f",floatval($row['st_carb_max'])));
+field($xw, 'ABV_MIN', sprintf("%.1f",floatval($row['st_abv_min'])));
+field($xw, 'ABV_MAX', sprintf("%.1f",floatval($row['st_abv_max'])));
 xmlwriter_end_element($xw);	// STYLE
 
 xmlwriter_start_element($xw, 'EQUIPMENT');
-
-xmlwriter_start_element($xw, 'VERSION');
-xmlwriter_text($xw, '1');
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'NAME');
-xmlwriter_text($xw, $row['eq_name']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'NOTES');
-xmlwriter_text($xw, $row['eq_notes']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'BATCH_SIZE');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['eq_batch_size'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'BOIL_SIZE');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['eq_boil_size'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'BOIL_TIME');
-xmlwriter_text($xw, sprintf("%.0f",floatval($row['eq_boil_time'])));
-xmlwriter_end_element($xw);
-
+field($xw, 'VERSION', '1');
+field($xw, 'NAME', $row['eq_name']);
+field($xw, 'NOTES', $row['eq_notes']);
+field($xw, 'BATCH_SIZE', sprintf("%.2f",floatval($row['eq_batch_size'])));
+field($xw, 'BOIL_SIZE', sprintf("%.2f",floatval($row['eq_boil_size'])));
+field($xw, 'BOIL_TIME', sprintf("%.0f",floatval($row['eq_boil_time'])));
 xmlwriter_end_element($xw);	// EQUIPMENT
 
 xmlwriter_start_element($xw, 'HOPS');
 $arr = json_decode($row['json_hops'], true);
 foreach($arr as $item) { //foreach element in $arr
-
 	xmlwriter_start_element($xw, 'HOP');
-
-	xmlwriter_start_element($xw, 'VERSION');
-	xmlwriter_text($xw, '1');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'NAME');
-	xmlwriter_text($xw, $item['h_name']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'ALPHA');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_alpha'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'AMOUNT');
-	xmlwriter_text($xw, sprintf("%.4f",floatval($item['h_amount'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'USE');
-	xmlwriter_text($xw, $hopuse[$item['h_useat']]);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'TIME');
-	xmlwriter_text($xw, $item['h_time']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'TYPE');
-	xmlwriter_text($xw, $hoptype[$item['h_type']]);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'FORM');
-	xmlwriter_text($xw, $hopform[$item['h_form']]);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'BETA');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_beta'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'HSI');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_hsi'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'ORIGIN');
-	xmlwriter_text($xw, $item['h_origin']);
-	xmlwriter_end_element($xw);
-
+	field($xw, 'VERSION', '1');
+	field($xw, 'NAME', $item['h_name']);
+	field($xw, 'ALPHA', sprintf("%.1f",floatval($item['h_alpha'])));
+	field($xw, 'AMOUNT', sprintf("%.4f",floatval($item['h_amount'])));
+	field($xw, 'USE', $hopuse[$item['h_useat']]);
+	field($xw, 'TIME', $item['h_time']);
+	field($xw, 'TYPE', $hoptype[$item['h_type']]);
+	field($xw, 'FORM', $hopform[$item['h_form']]);
+	field($xw, 'BETA', sprintf("%.1f",floatval($item['h_beta'])));
+	field($xw, 'HSI', sprintf("%.1f",floatval($item['h_hsi'])));
+	field($xw, 'ORIGIN', $item['h_origin']);
 	xmlwriter_end_element($xw);	// HOP
 }
 xmlwriter_end_element($xw);	// HOPS
@@ -328,81 +186,27 @@
 $arr = json_decode($row['json_fermentables'], true);
 foreach($arr as $item) { //foreach element in $arr
 	xmlwriter_start_element($xw, 'FERMENTABLE');
-
-	xmlwriter_start_element($xw, 'VERSION');
-	xmlwriter_text($xw, '1');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'NAME');
-	xmlwriter_text($xw, $item['f_name']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'TYPE');
-	xmlwriter_text($xw, $fermentabletype[$item['f_type']]);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'AMOUNT');
-	xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_amount'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'YIELD');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['f_yield'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'COLOR');
-	xmlwriter_text($xw, sprintf("%.1f",ebc_to_srm(floatval($item['f_color']))));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'ADD_AFTER_BOIL');
-	($item['f_added'] > 1) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'ORIGIN');
-	xmlwriter_text($xw, $item['f_origin']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'SUPPLIER');
-	xmlwriter_text($xw, $item['f_supplier']);
-	xmlwriter_end_element($xw);
-
-	if (floatval($item['f_coarse_fine_diff'])) {
-		xmlwriter_start_element($xw, 'COARSE_FINE_DIFF');
-		xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_coarse_fine_diff'])));
-		xmlwriter_end_element($xw);
-	}
-
-	if (floatval($item['f_moisture'])) {
-		xmlwriter_start_element($xw, 'MOISTURE');
-		xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_moisture'])));
-		xmlwriter_end_element($xw);
-	}
-
-	if (floatval($item['f_diastatic_power'])) {
-		xmlwriter_start_element($xw, 'DIASTATIC_POWER');
-		xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_diastatic_power'])));
-		xmlwriter_end_element($xw);
-	}
-
-	if (floatval($item['f_protein'])) {
-		xmlwriter_start_element($xw, 'PROTEIN');
-		xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_protein'])));
-		xmlwriter_end_element($xw);
-	}
-
-	if (floatval($item['f_max_in_batch'])) {
-		xmlwriter_start_element($xw, 'MAX_IN_BATCH');
-		xmlwriter_text($xw, sprintf("%.1f",floatval($item['f_max_in_batch'])));
-		xmlwriter_end_element($xw);
-	}
-
-	xmlwriter_start_element($xw, 'RECOMMEND_MASH');
-	($item['f_recommend_mash']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'GRAINTYPE');
-	xmlwriter_text($xw, $graintype[$item['f_graintype']]);
-	xmlwriter_end_element($xw);
-
+	field($xw, 'VERSION', '1');
+	field($xw, 'NAME', $item['f_name']);
+	field($xw, 'TYPE', $fermentabletype[$item['f_type']]);
+	field($xw, 'AMOUNT', sprintf("%.4f",floatval($item['f_amount'])));
+	field($xw, 'YIELD', sprintf("%.1f",floatval($item['f_yield'])));
+	field($xw, 'COLOR', sprintf("%.1f",ebc_to_srm(floatval($item['f_color']))));
+	field($xw, 'ADD_AFTER_BOIL', ($item['f_added'] > 1) ? 'TRUE':'FALSE');
+	field($xw, 'ORIGIN', $item['f_origin']);
+	field($xw, 'SUPPLIER', $item['f_supplier']);
+	if (floatval($item['f_coarse_fine_diff']))
+		field($xw, 'COARSE_FINE_DIFF', sprintf("%.4f",floatval($item['f_coarse_fine_diff'])));
+	if (floatval($item['f_moisture']))
+		field($xw, 'MOISTURE', sprintf("%.4f",floatval($item['f_moisture'])));
+	if (floatval($item['f_diastatic_power']))
+		field($xw, 'DIASTATIC_POWER', sprintf("%.4f",floatval($item['f_diastatic_power'])));
+	if (floatval($item['f_protein']))
+		field($xw, 'PROTEIN', sprintf("%.4f",floatval($item['f_protein'])));
+	if (floatval($item['f_max_in_batch']))
+		field($xw, 'MAX_IN_BATCH', sprintf("%.1f",floatval($item['f_max_in_batch'])));
+	field($xw, 'RECOMMEND_MASH', ($item['f_recommend_mash']) ? 'TRUE':'FALSE');
+	field($xw, 'GRAINTYPE', $graintype[$item['f_graintype']]);
 	xmlwriter_end_element($xw);	// FERMENTABLE
 }
 xmlwriter_end_element($xw);	// FERMENTABLES
@@ -410,37 +214,14 @@
 xmlwriter_start_element($xw, 'MISCS');
 $arr = json_decode($row['json_miscs'], true);
 foreach($arr as $item) {
-
 	xmlwriter_start_element($xw, 'MISC');
-
-	xmlwriter_start_element($xw, 'VERSION');
-	xmlwriter_text($xw, '1');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'NAME');
-	xmlwriter_text($xw, $item['m_name']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'TYPE');
-	xmlwriter_text($xw, $misctype[$item['m_type']]);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'AMOUNT');
-	xmlwriter_text($xw, sprintf("%.5f",floatval($item['m_amount'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'AMOUNT_IS_WEIGHT');
-	($item['m_amount_is_weight']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'USE');
-	xmlwriter_text($xw, $miscuse[$item['m_use_use']]);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'TIME');
-	xmlwriter_text($xw, sprintf("%.0f",floatval($item['m_time'])));
-	xmlwriter_end_element($xw);
-
+	field($xw, 'VERSION', '1');
+	field($xw, 'NAME', $item['m_name']);
+	field($xw, 'TYPE', $misctype[$item['m_type']]);
+	field($xw, 'AMOUNT', sprintf("%.5f",floatval($item['m_amount'])));
+	field($xw, 'AMOUNT_IS_WEIGHT', ($item['m_amount_is_weight']) ? 'TRUE':'FALSE');
+	field($xw, 'USE', $miscuse[$item['m_use_use']]);
+	field($xw, 'TIME', sprintf("%.0f",floatval($item['m_time'])));
 	xmlwriter_end_element($xw);	// MISC
 }
 xmlwriter_end_element($xw);	// MISCS
@@ -448,226 +229,75 @@
 xmlwriter_start_element($xw, 'YEASTS');
 $arr = json_decode($row['json_yeasts'], true);
 foreach($arr as $item) { //foreach element in $arr
-
 	xmlwriter_start_element($xw, 'YEAST');
-
-	xmlwriter_start_element($xw, 'VERSION');
-	xmlwriter_text($xw, '1');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'NAME');
-	xmlwriter_text($xw, $item['y_name']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'TYPE');
-	xmlwriter_text($xw, $yeasttype[$item['y_type']]);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'FORM');
-	xmlwriter_text($xw, $yeastform[$item['y_form']]);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'AMOUNT');
-	xmlwriter_text($xw, sprintf("%.5f",floatval($item['y_amount'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'AMOUNT_IS_WEIGHT');
-	($item['y_form'] == 1) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'LABORATORY');
-	xmlwriter_text($xw, $item['y_laboratory']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'PRODUCT_ID');
-	xmlwriter_text($xw, $item['y_product_id']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'MIN_TEMPERATURE');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_min_temperature'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'MAX_TEMPERATURE');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_max_temperature'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'ATTENUATION');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_attenuation'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'ADD_TO_SECONDARY');
-	($item['y_use'] == 0) ? xmlwriter_text($xw, 'FALSE') : xmlwriter_text($xw, 'TRUE');
-	xmlwriter_end_element($xw);
-
+	field($xw, 'VERSION', '1');
+	field($xw, 'NAME', $item['y_name']);
+	field($xw, 'TYPE', $yeasttype[$item['y_type']]);
+	field($xw, 'FORM', $yeastform[$item['y_form']]);
+	field($xw, 'AMOUNT', sprintf("%.5f",floatval($item['y_amount'])));
+	field($xw, 'AMOUNT_IS_WEIGHT', ($item['y_form'] == 1) ? 'TRUE':'FALSE');
+	field($xw, 'LABORATORY', $item['y_laboratory']);
+	field($xw, 'PRODUCT_ID', $item['y_product_id']);
+	field($xw, 'MIN_TEMPERATURE', sprintf("%.1f",floatval($item['y_min_temperature'])));
+	field($xw, 'MAX_TEMPERATURE', sprintf("%.1f",floatval($item['y_max_temperature'])));
+	field($xw, 'ATTENUATION', sprintf("%.1f",floatval($item['y_attenuation'])));
+	field($xw, 'ADD_TO_SECONDARY', ($item['y_use'] == 0) ? 'FALSE':'TRUE');
 	xmlwriter_end_element($xw);	// YEAST
 }
 xmlwriter_end_element($xw);	// YEASTS
 
 xmlwriter_start_element($xw, 'WATERS');
 xmlwriter_start_element($xw, 'WATER');	// Source 1
-
-xmlwriter_start_element($xw, 'VERSION');
-xmlwriter_text($xw, '1');
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'NAME');
-xmlwriter_text($xw, $row['w1_name']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'AMOUNT');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_amount'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'CALCIUM');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_calcium'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'MAGNESIUM');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_magnesium'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'BICARBONATE');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_total_alkalinity']) * 1.22));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'SULFATE');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_sulfate'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'CHLORIDE');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_chloride'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'SODIUM');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_sodium'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'PH');
-xmlwriter_text($xw, sprintf("%.1f",floatval($row['w1_ph'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'TOTAL_ALKALINITY');
-xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_total_alkalinity'])));
-xmlwriter_end_element($xw);
-
+field($xw, 'VERSION', '1');
+field($xw, 'NAME', $item['w1_name']);
+field($xw, 'AMOUNT', sprintf("%.2f",floatval($row['w1_amount'])));
+field($xw, 'CALCIUM', sprintf("%.2f",floatval($row['w1_calcium'])));
+field($xw, 'MAGNESIUM', sprintf("%.2f",floatval($row['w1_magnesium'])));
+field($xw, 'BICARBONATE', sprintf("%.2f",floatval($row['w1_total_alkalinity']) * 1.22));
+field($xw, 'SULFATE', sprintf("%.2f",floatval($row['w1_sulfate'])));
+field($xw, 'CHLORIDE', sprintf("%.2f",floatval($row['w1_chloride'])));
+field($xw, 'SODIUM', sprintf("%.2f",floatval($row['w1_sodium'])));
+field($xw, 'PH', sprintf("%.1f",floatval($row['w1_ph'])));
+field($xw, 'TOTAL_ALKALINITY', sprintf("%.2f",floatval($row['w1_total_alkalinity'])));
 xmlwriter_end_element($xw);	// WATER
 
 if (strlen($row['w2_name'])) {
 	xmlwriter_start_element($xw, 'WATER');	// Source 2
-
-	xmlwriter_start_element($xw, 'VERSION');
-	xmlwriter_text($xw, '1');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'NAME');
-	xmlwriter_text($xw, $row['w2_name']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'AMOUNT');
-	xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_amount'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'CALCIUM');
-	xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_calcium'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'MAGNESIUM');
-        xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_magnesium'])));
-        xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'BICARBONATE');
-	xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_total_alkalinity']) * 1.22));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'SULFATE');
-	xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_sulfate'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'CHLORIDE');
-	xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_chloride'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'SODIUM');
-	xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_sodium'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'PH');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($row['w2_ph'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'TOTAL_ALKALINITY');
-	xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_total_alkalinity'])));
-	xmlwriter_end_element($xw);
-
+	field($xw, 'VERSION', '1');
+	field($xw, 'NAME', $item['w2_name']);
+	field($xw, 'AMOUNT', sprintf("%.2f",floatval($row['w2_amount'])));
+	field($xw, 'CALCIUM', sprintf("%.2f",floatval($row['w2_calcium'])));
+	field($xw, 'MAGNESIUM', sprintf("%.2f",floatval($row['w2_magnesium'])));
+	field($xw, 'BICARBONATE', sprintf("%.2f",floatval($row['w2_total_alkalinity']) * 1.22));
+	field($xw, 'SULFATE', sprintf("%.2f",floatval($row['w2_sulfate'])));
+	field($xw, 'CHLORIDE', sprintf("%.2f",floatval($row['w2_chloride'])));
+	field($xw, 'SODIUM', sprintf("%.2f",floatval($row['w2_sodium'])));
+	field($xw, 'PH', sprintf("%.1f",floatval($row['w2_ph'])));
+	field($xw, 'TOTAL_ALKALINITY', sprintf("%.2f",floatval($row['w2_total_alkalinity'])));
 	xmlwriter_end_element($xw);	// WATER
 }
 xmlwriter_end_element($xw);	// WATERS
 
 xmlwriter_start_element($xw, 'MASH');
-
-xmlwriter_start_element($xw, 'VERSION');
-xmlwriter_text($xw, '1');
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'NAME');
-xmlwriter_text($xw, $row['mash_name']);
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'GRAIN_TEMP');
-xmlwriter_text($xw, '10.0');
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'PH');
-xmlwriter_text($xw, sprintf("%.1f",floatval($row['sparge_ph'])));
-xmlwriter_end_element($xw);
-
-xmlwriter_start_element($xw, 'SPARGE_TEMP');
-xmlwriter_text($xw, sprintf("%.1f",floatval($row['sparge_temp'])));
-xmlwriter_end_element($xw);
-
+field($xw, 'VERSION', '1');
+field($xw, 'NAME', $item['mash_name']);
+field($xw, 'GRAIN_TEMP', '10.0');
+field($xw, 'PH', sprintf("%.1f",floatval($row['sparge_ph'])));
+field($xw, 'SPARGE_TEMP', sprintf("%.1f",floatval($row['sparge_temp'])));
 xmlwriter_start_element($xw, 'MASH_STEPS');
 $arr = json_decode($row['json_mashs'], true);
 foreach($arr as $item) { //foreach element in $arr
 	xmlwriter_start_element($xw, 'MASH_STEP');
-
-	xmlwriter_start_element($xw, 'VERSION');
-	xmlwriter_text($xw, '1');
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'NAME');
-	xmlwriter_text($xw, $item['step_name']);
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'TYPE');
-	xmlwriter_text($xw, $mashsteptype[$item['step_type']]);
-	xmlwriter_end_element($xw);
-
-	if ($item['step_type'] == 0) {
-		xmlwriter_start_element($xw, 'INFUSE_AMOUNT');
-		xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_infuse_amount'])));
-		xmlwriter_end_element($xw);
-	}
-
-	xmlwriter_start_element($xw, 'STEP_TEMP');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_temp'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'STEP_TIME');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_time'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'RAMP_TIME');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['ramp_time'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'END_TEMP');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($item['end_temp'])));
-	xmlwriter_end_element($xw);
-
-	xmlwriter_start_element($xw, 'PH');
-	xmlwriter_text($xw, sprintf("%.1f",floatval($row['mash_ph'])));
-	xmlwriter_end_element($xw);
-
+	field($xw, 'VERSION', '1');
+	field($xw, 'NAME', $item['step_name']);
+	field($xw, 'TYPE', $mashsteptype[$item['step_type']]);
+	if ($item['step_type'] == 0)
+		field($xw, 'INFUSE_AMOUNT', sprintf("%.1f",floatval($item['step_infuse_amount'])));
+	field($xw, 'STEP_TEMP', sprintf("%.1f",floatval($item['step_temp'])));
+	field($xw, 'STEP_TIME', sprintf("%.1f",floatval($item['step_time'])));
+	field($xw, 'RAMP_TIME', sprintf("%.1f",floatval($item['ramp_time'])));
+	field($xw, 'END_TEMP', sprintf("%.1f",floatval($item['end_temp'])));
+	field($xw, 'PH', sprintf("%.1f",floatval($row['mash_ph'])));
 	xmlwriter_end_element($xw);	// MASH_STEP
 }
 xmlwriter_end_element($xw);	// MASH_STEPS

mercurial