Added export inventory and profiles in beerxml format. Small fixes in beerxml recipe and product export.

Thu, 05 Dec 2019 22:47:40 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 05 Dec 2019 22:47:40 +0100
changeset 563
acdd54144838
parent 562
ee28b3303da2
child 564
d5fad7d80899

Added export inventory and profiles in beerxml format. Small fixes in beerxml recipe and product export.

README.design file | annotate | diff | comparison | revisions
www/Makefile file | annotate | diff | comparison | revisions
www/export_equipments.php file | annotate | diff | comparison | revisions
www/export_fermentables.php file | annotate | diff | comparison | revisions
www/export_hops.php file | annotate | diff | comparison | revisions
www/export_mashs.php file | annotate | diff | comparison | revisions
www/export_miscs.php file | annotate | diff | comparison | revisions
www/export_styles.php file | annotate | diff | comparison | revisions
www/export_suppliers.php file | annotate | diff | comparison | revisions
www/export_waters.php file | annotate | diff | comparison | revisions
www/export_yeasts.php file | annotate | diff | comparison | revisions
www/js/inv_equipments.js file | annotate | diff | comparison | revisions
www/js/inv_fermentables.js file | annotate | diff | comparison | revisions
www/js/inv_hops.js file | annotate | diff | comparison | revisions
www/js/inv_miscs.js file | annotate | diff | comparison | revisions
www/js/inv_suppliers.js file | annotate | diff | comparison | revisions
www/js/inv_waters.js file | annotate | diff | comparison | revisions
www/js/inv_yeasts.js file | annotate | diff | comparison | revisions
www/js/profile_mash.js file | annotate | diff | comparison | revisions
www/js/profile_styles.js file | annotate | diff | comparison | revisions
www/prod_beerxml.php file | annotate | diff | comparison | revisions
www/rec_beerxml.php file | annotate | diff | comparison | revisions
--- a/README.design	Thu Dec 05 13:25:54 2019 +0100
+++ b/README.design	Thu Dec 05 22:47:40 2019 +0100
@@ -7,10 +7,6 @@
 
 -----------------------------------------------------------------------------
 
-TODO:
-
-Export ingredienten naar xml.
-
 Bug:
   Metingen en berekeningen met afgelezen Brix waardes kloppen niet op het eind
   van de vergisting. Gaat vooral fout met de Saison.
--- a/www/Makefile	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/Makefile	Thu Dec 05 22:47:40 2019 +0100
@@ -3,8 +3,10 @@
 
 include ../Makefile.global
 
-SRC		= cmd_fermenter.php cmd_co2meter.php \
-		  config.php.dist crontasks.php favicon.ico gen_about.php \
+SRC		= cmd_fermenter.php cmd_co2meter.php config.php.dist crontasks.php \
+		  export_equipments.php export_fermentables.php export_hops.php export_mashs.php \
+		  export_miscs.php export_styles.php export_suppliers.php export_waters.php \
+		  export_yeasts.php favicon.ico gen_about.php \
 		  getbrewlog.php getco2meter.php getco2pressurelog.php getfermentablesources.php \
 		  getfermenter.php getfermentlog.php gethopsources.php getmiscsources.php getnode.php \
 		  getwatersources.php getyeastsources.php import_ingredients.php index.php \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_equipments.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,134 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM inventory_equipments ORDER BY name");
+$row = mysqli_fetch_array($result);
+
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'EQUIPMENTS');
+while ($row = mysqli_fetch_array($result)) {
+
+	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['name']);
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'NOTES');
+        xmlwriter_text($xw, $row['notes']);
+        xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'BOIL_SIZE');
+        xmlwriter_text($xw, sprintf("%.4f", floatval($row['boil_size'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'BATCH_SIZE');
+        xmlwriter_text($xw, sprintf("%.4f", floatval($row['batch_size'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TUN_VOLUME');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['tun_volume'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TUN_WEIGHT');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['tun_weight'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TUN_SPECIFIC_HEAT');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['tun_specific_heat'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TUN_HEIGHT');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['tun_height'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TRUB_CHILLER_LOSS');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['trub_chiller_loss'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'EVAP_RATE');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['evap_rate'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'BOIL_TIME');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['boil_time'])));
+        xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'CALC_BOIL_VOLUME');
+        ($row['calc_boil_volume'] > 1) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TOP_UP_KETTLE');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['top_up_kettle'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'HOP_UTILIZATION');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['hop_utilization'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'LAUTER_VOLUME');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['lauter_volume'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'LAUTER_HEIGHT');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['lauter_height'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'LAUTER_DEADSPACE');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['lauter_deadspace'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'KETTLE_VOLUME');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['kettle_volume'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'KETTLE_HEIGHT');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['kettle_height'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'MASH_VOLUME');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['mash_volume'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'EFFICIENCY');
+        xmlwriter_text($xw, sprintf("%.5f", floatval($row['efficiency'])));
+        xmlwriter_end_element($xw);
+
+	xmlwriter_end_element($xw);	// EQUIPMENT
+}
+xmlwriter_end_element($xw);	// EQUIPMENTS
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="equipments.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_fermentables.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,144 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM inventory_fermentables ORDER BY supplier,name");
+$row = mysqli_fetch_array($result);
+
+
+$fermentabletype = array( 'Grain', 'Sugar', 'Extract', 'Dry extract', 'Adjunct' );
+$graintype = array( 'Base', 'Roast', 'Crystal', 'Kilned', 'Sour malt', 'Special', 'No malt' );
+$addedtype = array( 'Mash', 'Boil', 'Fermentation', 'Lagering', 'Bottle', 'Kegs' );
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'FERMENTABLES');
+while ($row = mysqli_fetch_array($result)) {
+
+	xmlwriter_start_element($xw, 'FERMENTABLES');
+
+	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, $fermentabletype[$row['type']]);
+	xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'YIELD');
+        xmlwriter_text($xw, sprintf("%.5f",floatval($row['yield'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'COLOR');
+        xmlwriter_text($xw, sprintf("%.3f",ebc_to_srm(floatval($row['color']))));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'ADD_AFTER_BOIL');
+        ($row['added'] > 1) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'ORIGIN');
+        xmlwriter_text($xw, $row['origin']);
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'SUPPLIER');
+        xmlwriter_text($xw, $row['supplier']);
+        xmlwriter_end_element($xw);
+
+        if (floatval($row['coarse_fine_diff'])) {
+                xmlwriter_start_element($xw, 'COARSE_FINE_DIFF');
+                xmlwriter_text($xw, sprintf("%.4f",floatval($row['coarse_fine_diff'])));
+                xmlwriter_end_element($xw);
+        }
+
+        if (floatval($row['moisture'])) {
+                xmlwriter_start_element($xw, 'MOISTURE');
+                xmlwriter_text($xw, sprintf("%.4f",floatval($row['moisture'])));
+                xmlwriter_end_element($xw);
+        }
+
+        if (floatval($row['diastatic_power'])) {
+                xmlwriter_start_element($xw, 'DIASTATIC_POWER');
+                xmlwriter_text($xw, sprintf("%.4f",floatval($row['diastatic_power'])));
+                xmlwriter_end_element($xw);
+        }
+
+        if (floatval($row['protein'])) {
+                xmlwriter_start_element($xw, 'PROTEIN');
+                xmlwriter_text($xw, sprintf("%.4f",floatval($row['protein'])));
+                xmlwriter_end_element($xw);
+        }
+
+        if (floatval($row['max_in_batch'])) {
+                xmlwriter_start_element($xw, 'MAX_IN_BATCH');
+                xmlwriter_text($xw, sprintf("%.3f",floatval($row['max_in_batch'])));
+                xmlwriter_end_element($xw);
+        }
+
+        xmlwriter_start_element($xw, 'RECOMMEND_MASH');
+        ($row['recommend_mash']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
+        xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'DISPLAY_COLOR');
+        xmlwriter_text($xw, sprintf("%.0f EBC",floatval($row['color'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'GRAINTYPE');
+        xmlwriter_text($xw, $graintype[$row['graintype']]);
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'ADDED');
+        xmlwriter_text($xw, $addedtype[$row['added']]);
+        xmlwriter_end_element($xw);
+
+	if (floatval($row['di_ph'])) {
+                xmlwriter_start_element($xw, 'DI_pH');
+                xmlwriter_text($xw, sprintf("%.5f",floatval($row['di_ph'])));
+                xmlwriter_end_element($xw);
+        }
+
+	if (floatval($row['acid_to_ph_57'])) {
+                xmlwriter_start_element($xw, 'ACID_TO_pH_5.7');
+                xmlwriter_text($xw, sprintf("%.5f",floatval($row['acid_to_ph_57'])));
+                xmlwriter_end_element($xw);
+        }
+
+	xmlwriter_end_element($xw);	// FERMENTABLE
+}
+xmlwriter_end_element($xw);	// FERMENTABLES
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="fermentables.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_hops.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,125 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM inventory_hops ORDER BY origin,name");
+$row = mysqli_fetch_array($result);
+
+
+$hoptype = array( 'Bittering', 'Aroma', 'Both' );
+$hopform = array( 'Pellet', 'Plug', 'Leaf', 'Leaf', 'Leaf' );
+
+
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'HOPS');
+while ($row = mysqli_fetch_array($result)) {
+
+	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, $row['name']);
+	xmlwriter_end_element($xw);
+
+	if (strlen($row['notes'])) {
+        	xmlwriter_start_element($xw, 'NOTES');
+        	xmlwriter_text($xw, $row['notes']);
+        	xmlwriter_end_element($xw);
+	}
+
+	xmlwriter_start_element($xw, 'ALWAYS_ON_STOCK');
+        ($row['always_on_stock']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'ALPHA');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['alpha'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'BETA');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['beta'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'HUMULENE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['humulene'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'CAROPHYLLENE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['caryophyllene'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'COHUMULONE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['cohumulone'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'MYRCENE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['myrcene'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TOTAL_OIL');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['total_oil'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'HSI');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['hsi'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TYPE');
+        xmlwriter_text($xw, $hoptype[$row['type']]);
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'FORM');
+        xmlwriter_text($xw, $hopform[$row['form']]);
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'ORIGIN');
+        xmlwriter_text($xw, $row['origin']);
+        xmlwriter_end_element($xw);
+
+	if (strlen($row['substitutes'])) {
+        	xmlwriter_start_element($xw, 'SUBSTITUTES');
+        	xmlwriter_text($xw, $row['substitutes']);
+        	xmlwriter_end_element($xw);
+	}
+
+	if (floatval($row['cost']) > 0) {
+        	xmlwriter_start_element($xw, 'COST');
+        	xmlwriter_text($xw, sprintf("%.4f",floatval($row['cost'])));
+        	xmlwriter_end_element($xw);
+	}
+
+	xmlwriter_end_element($xw);	// HOP
+}
+xmlwriter_end_element($xw);	// HOPS
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="hops.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_mashs.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,100 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM profile_mash ORDER BY name");
+$row = mysqli_fetch_array($result);
+
+
+$mashsteptype = array( 'Infusion', 'Temperature', 'Decoction' );
+
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'MASHS');
+while ($row = mysqli_fetch_array($result)) {
+
+	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['name']);
+	xmlwriter_end_element($xw);
+
+	if (strlen($row['notes'])) {
+        	xmlwriter_start_element($xw, 'NOTES');
+        	xmlwriter_text($xw, $row['notes']);
+        	xmlwriter_end_element($xw);
+	}
+
+	xmlwriter_start_element($xw, 'MASH_STEPS');
+	$arr = json_decode($row['steps'], 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);
+
+        	xmlwriter_start_element($xw, 'STEP_TEMP');
+        	xmlwriter_text($xw, sprintf("%.4f",floatval($item['step_temp'])));
+        	xmlwriter_end_element($xw);
+
+        	xmlwriter_start_element($xw, 'STEP_TIME');
+        	xmlwriter_text($xw, sprintf("%.3f",floatval($item['step_time'])));
+        	xmlwriter_end_element($xw);
+
+        	xmlwriter_start_element($xw, 'RAMP_TIME');
+        	xmlwriter_text($xw, sprintf("%.3f",floatval($item['ramp_time'])));
+        	xmlwriter_end_element($xw);
+
+        	xmlwriter_start_element($xw, 'END_TEMP');
+        	xmlwriter_text($xw, sprintf("%.4f",floatval($item['end_temp'])));
+        	xmlwriter_end_element($xw);
+
+        	xmlwriter_end_element($xw);     // MASH_STEP
+	}
+
+	xmlwriter_end_element($xw);     // MASH_STEPS
+	xmlwriter_end_element($xw);	// MASH
+}
+xmlwriter_end_element($xw);	// MASHS
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="mashs.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_miscs.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,99 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM inventory_miscs ORDER BY name");
+$row = mysqli_fetch_array($result);
+
+
+$misctype = array( 'Spice', 'Herb', 'Flavor', 'Fining', 'Water agent', 'Yeast nutrient', 'Other' );
+$miscuse = array( 'Starter', 'Mash', 'Boil', 'Primary', 'Secondary', 'Bottling' );
+
+
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'MISCS');
+while ($row = mysqli_fetch_array($result)) {
+
+	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, $row['name']);
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'TYPE');
+	xmlwriter_text($xw, $misctype[$row['type']]);
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'AMOUNT_IS_WEIGHT');
+	($row['amount_is_weight']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'USE');
+	xmlwriter_text($xw, $miscuse[$row['use_use']]);
+	xmlwriter_end_element($xw);
+
+	if (floatval($row['time']) > 0) {
+		xmlwriter_start_element($xw, 'TIME');
+		xmlwriter_text($xw, sprintf("%.3f",floatval($row['time'])));
+		xmlwriter_end_element($xw);
+	}
+
+	if (floatval($row['cost']) > 0) {
+		xmlwriter_start_element($xw, 'COST');
+		xmlwriter_text($xw, sprintf("%.5f",floatval($row['cost'])));
+		xmlwriter_end_element($xw);
+	}
+
+	xmlwriter_start_element($xw, 'ALWAYS_ON_STOCK');
+	($row['always_on_stock']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
+	xmlwriter_end_element($xw);
+
+	if (strlen($row['notes'])) {
+		xmlwriter_start_element($xw, 'NOTES');
+		xmlwriter_text($xw, $row['notes']);
+		xmlwriter_end_element($xw);
+	}
+
+	if (strlen($row['use_for'])) {
+		xmlwriter_start_element($xw, 'USE_FOR');
+		xmlwriter_text($xw, $row['use_for']);
+		xmlwriter_end_element($xw);
+	}
+
+	xmlwriter_end_element($xw);	// MISC
+}
+xmlwriter_end_element($xw);	// MISCS
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="miscs.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_styles.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,151 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM profile_styles ORDER BY style_guide,style_letter,name");
+$row = mysqli_fetch_array($result);
+
+
+$styletype = array( 'Lager', 'Ale', 'Mead', 'Wheat', 'Mixed', 'Cider' );
+
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'STYLES');
+while ($row = mysqli_fetch_array($result)) {
+
+	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['name']);
+	xmlwriter_end_element($xw);
+
+	if (strlen($row['category'])) {
+		xmlwriter_start_element($xw, 'CATEGORY');
+		xmlwriter_text($xw, $row['category']);
+		xmlwriter_end_element($xw);
+
+		xmlwriter_start_element($xw, 'CATEGORY_NUMBER');
+		xmlwriter_text($xw, $row['category_number']);
+		xmlwriter_end_element($xw);
+	}
+
+	xmlwriter_start_element($xw, 'STYLE_LETTER');
+	xmlwriter_text($xw, $row['style_letter']);
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'STYLE_GUIDE');
+	xmlwriter_text($xw, $row['style_guide']);
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'TYPE');
+	xmlwriter_text($xw, $styletype[$row['type']]);
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'OG_MIN');
+	xmlwriter_text($xw, sprintf("%.6f",floatval($row['og_min'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'OG_MAX');
+	xmlwriter_text($xw, sprintf("%.6f",floatval($row['og_max'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'FG_MIN');
+	xmlwriter_text($xw, sprintf("%.6f",floatval($row['fg_min'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'FG_MAX');
+	xmlwriter_text($xw, sprintf("%.6f",floatval($row['fg_max'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'IBU_MIN');
+	xmlwriter_text($xw, sprintf("%.3f",floatval($row['ibu_min'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'IBU_MAX');
+	xmlwriter_text($xw, sprintf("%.3f",floatval($row['ibu_max'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'COLOR_MIN');
+	xmlwriter_text($xw, sprintf("%.3f",ebc_to_srm(floatval($row['color_min']))));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'COLOR_MAX');
+	xmlwriter_text($xw, sprintf("%.3f",ebc_to_srm(floatval($row['color_max']))));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'CARB_MIN');
+	xmlwriter_text($xw, sprintf("%.4f",floatval($row['carb_min'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'CARB_MAX');
+	xmlwriter_text($xw, sprintf("%.4f",floatval($row['carb_max'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'ABV_MIN');
+	xmlwriter_text($xw, sprintf("%.4f",floatval($row['abv_min'])));
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'ABV_MAX');
+	xmlwriter_text($xw, sprintf("%.4f",floatval($row['abv_max'])));
+	xmlwriter_end_element($xw);
+
+	if (strlen($row['notes'])) {
+		xmlwriter_start_element($xw, 'NOTES');
+        	xmlwriter_text($xw, $row['notes']);
+        	xmlwriter_end_element($xw);
+	}
+
+        if (strlen($row['profile'])) {
+                xmlwriter_start_element($xw, 'PROFILE');
+                xmlwriter_text($xw, $row['profile']);
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['ingredients'])) {
+                xmlwriter_start_element($xw, 'INGREDIENTS');
+                xmlwriter_text($xw, $row['ingredients']);
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['examples'])) {
+                xmlwriter_start_element($xw, 'EXAMPLES');
+                xmlwriter_text($xw, $row['examples']);
+                xmlwriter_end_element($xw);
+        }
+
+	xmlwriter_end_element($xw);	// STYLE
+}
+xmlwriter_end_element($xw);	// STYLES
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="styles.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_suppliers.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,103 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM inventory_suppliers ORDER BY name");
+$row = mysqli_fetch_array($result);
+
+
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'SUPPLIERS');
+while ($row = mysqli_fetch_array($result)) {
+
+	xmlwriter_start_element($xw, 'SUPPLIER');
+
+	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);
+
+	if (strlen($row['notes'])) {
+		xmlwriter_start_element($xw, 'NOTES');
+		xmlwriter_text($xw, $row['notes']);
+		xmlwriter_end_element($xw);
+	}
+
+        if (strlen($row['address'])) {
+                xmlwriter_start_element($xw, 'ADDRESS');
+                xmlwriter_text($xw, $row['address']);
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['city'])) {
+                xmlwriter_start_element($xw, 'CITY');
+                xmlwriter_text($xw, $row['city']);
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['zip'])) {
+                xmlwriter_start_element($xw, 'ZIP');
+                xmlwriter_text($xw, $row['zip']);
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['country'])) {
+                xmlwriter_start_element($xw, 'COUNTRY');
+                xmlwriter_text($xw, $row['country']);
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['website'])) {
+                xmlwriter_start_element($xw, 'WEBSITE');
+                xmlwriter_text($xw, $row['website']);
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['email'])) {
+                xmlwriter_start_element($xw, 'EMAIL');
+                xmlwriter_text($xw, $row['email']);
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['phone'])) {
+                xmlwriter_start_element($xw, 'PHONE');
+                xmlwriter_text($xw, $row['phone']);
+                xmlwriter_end_element($xw);
+        }
+
+	xmlwriter_end_element($xw);	// SUPPLIER
+}
+xmlwriter_end_element($xw);	// SUPPLIERS
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="suppliers.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_waters.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,99 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM inventory_waters ORDER BY name");
+$row = mysqli_fetch_array($result);
+
+
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'WATERS');
+while ($row = mysqli_fetch_array($result)) {
+
+	xmlwriter_start_element($xw, 'WATER');
+
+	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);
+
+	if (floatval($row['cost']) > 0) {
+                xmlwriter_start_element($xw, 'COST');
+                xmlwriter_text($xw, sprintf("%.5f",floatval($row['cost'])));
+                xmlwriter_end_element($xw);
+        }
+
+        if (strlen($row['notes'])) {
+                xmlwriter_start_element($xw, 'NOTES');
+                xmlwriter_text($xw, $row['notes']);
+                xmlwriter_end_element($xw);
+        }
+
+	xmlwriter_start_element($xw, 'CALCIUM');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['calcium'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'BICARBONATE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['bicarbonate'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'SULFATE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['sulfate'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'CHLORIDE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['chloride'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'SODIUM');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['sodium'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'MAGNESIUM');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['magnesium'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'TOTAL_ALKALINITY');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['total_alkalinity'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'PH');
+        xmlwriter_text($xw, sprintf("%.5f",floatval($row['ph'])));
+        xmlwriter_end_element($xw);
+
+	xmlwriter_end_element($xw);	// WATER
+}
+xmlwriter_end_element($xw);	// WATERS
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="waters.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/www/export_yeasts.php	Thu Dec 05 22:47:40 2019 +0100
@@ -0,0 +1,118 @@
+<?php
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+
+
+$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
+if (! $link) {
+	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
+}
+if (! mysqli_set_charset($link, "utf8" )) {
+	echo "error";
+	return 1;
+}
+
+$result = mysqli_query($link, "SELECT * FROM inventory_yeasts ORDER BY laboratory,product_id,name");
+$row = mysqli_fetch_array($result);
+
+
+$yeasttype = array( 'Lager', 'Ale', 'Wheat', 'Wine', 'Champagne', 'Other', 'Other', 'Other', 'Other', 'Other' );
+$yeastform = array( 'Liquid', 'Dry', 'Slant', 'Culture', 'Frozen', 'Bottle', 'Dry' );
+$yeastflocculation = array( 'Low', 'Medium', 'High', 'Very high' );
+
+
+/*
+ * Create beerxml output
+ */
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+
+xmlwriter_start_element($xw, 'YEASTS');
+while ($row = mysqli_fetch_array($result)) {
+
+	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, $row['name']);
+	xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'TYPE');
+	xmlwriter_text($xw, $yeasttype[$row['type']]);
+	xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'FORM');
+        xmlwriter_text($xw, $yeastform[$row['form']]);
+        xmlwriter_end_element($xw);
+
+	xmlwriter_start_element($xw, 'AMOUNT_IS_WEIGHT');
+	($row['amount_is_weight']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE');
+	xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'LABORATORY');
+        xmlwriter_text($xw, $row['laboratory']);
+        xmlwriter_end_element($xw);
+
+	if (strlen($row['product_id'])) {
+        	xmlwriter_start_element($xw, 'PRODUCT_ID');
+        	xmlwriter_text($xw, $row['product_id']);
+        	xmlwriter_end_element($xw);
+	}
+
+        xmlwriter_start_element($xw, 'MIN_TEMPERATURE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['min_temperature'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'MAX_TEMPERATURE');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['max_temperature'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'ATTENUATION');
+        xmlwriter_text($xw, sprintf("%.4f",floatval($row['attenuation'])));
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'ADD_TO_SECONDARY');
+        ($row['use'] == 0) ? xmlwriter_text($xw, 'FALSE') : xmlwriter_text($xw, 'TRUE');
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'FLOCCULATION');
+        xmlwriter_text($xw, $yeastflocculation[$row['flocculation']]);
+        xmlwriter_end_element($xw);
+
+        xmlwriter_start_element($xw, 'MAX_REUSE');
+        xmlwriter_text($xw, $row['max_reuse']);
+        xmlwriter_end_element($xw);
+
+	if (floatval($row['cost']) > 0) {
+		xmlwriter_start_element($xw, 'COST');
+		xmlwriter_text($xw, sprintf("%.5f",floatval($row['cost'])));
+		xmlwriter_end_element($xw);
+	}
+
+	if (strlen($row['notes'])) {
+		xmlwriter_start_element($xw, 'NOTES');
+		xmlwriter_text($xw, $row['notes']);
+		xmlwriter_end_element($xw);
+	}
+
+
+	xmlwriter_end_element($xw);	// MISC
+}
+xmlwriter_end_element($xw);	// MISCS
+
+$beerxml = xmlwriter_output_memory($xw);
+
+Header('Content-type: text/xml');
+header('Content-Disposition: attachment; filename="yeasts.xml"');
+header('Content-Transfer-Encoding: binary');
+header('Expires: 0');
+header('Pragma: no-cache');
+header('Content-Length: '.strlen($beerxml));
+exit($beerxml);
--- a/www/js/inv_equipments.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/inv_equipments.js	Thu Dec 05 22:47:40 2019 +0100
@@ -226,9 +226,13 @@
    var addButton, container = $('<div style="overflow: hidden; position: relative; margin: 5px;"></div>');
    addButton = $('<div style="float: right; margin-right: 15px;"><img style="position: relative; margin-top: 2px;" ' +
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Nieuw</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -259,6 +263,9 @@
     $('#efficiency').val(75);
     $('#popupWindow').jqxWindow('open');
    });
+   expButton.click(function(event) {
+    window.open('export_equipments.php');
+   });
   },
   filterable: false,
   ready: function() {
--- a/www/js/inv_fermentables.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/inv_fermentables.js	Thu Dec 05 22:47:40 2019 +0100
@@ -202,11 +202,15 @@
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Nieuw</span></div>');
    impButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Import</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
    container.append(impButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
    impButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -240,6 +244,9 @@
    impButton.click(function(event) {
     window.location.href = 'import_ingredients.php?select=fermentables';
    });
+   expButton.click(function(event) {
+    window.open('export_fermentables.php');
+   });
   },
   filterable: true,
   filtermode: 'excel',
--- a/www/js/inv_hops.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/inv_hops.js	Thu Dec 05 22:47:40 2019 +0100
@@ -185,11 +185,15 @@
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Nieuw</span></div>');
    impButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Import</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
    container.append(impButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
    impButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -218,6 +222,9 @@
    impButton.click(function(event) {
     window.location.href = 'import_ingredients.php?select=hops';
    });
+   expButton.click(function(event) {
+    window.open('export_hops.php');
+   });
   },
   filterable: true,
   filtermode: 'excel',
--- a/www/js/inv_miscs.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/inv_miscs.js	Thu Dec 05 22:47:40 2019 +0100
@@ -183,11 +183,15 @@
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Nieuw</span></div>');
    impButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Import</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
    container.append(impButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
    impButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -209,6 +213,9 @@
    impButton.click(function(event) {
     window.location.href = 'import_ingredients.php?select=miscs';
    });
+   expButton.click(function(event) {
+    window.open('export_miscs.php');
+   });
   },
   filterable: true,
   filtermode: 'excel',
--- a/www/js/inv_suppliers.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/inv_suppliers.js	Thu Dec 05 22:47:40 2019 +0100
@@ -153,9 +153,13 @@
    var addButton, container = $('<div style="overflow: hidden; position: relative; margin: 5px;"></div>');
    addButton = $('<div style="float: right; margin-right: 15px;"><img style="position: relative; margin-top: 2px;" ' +
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Nieuw</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -171,6 +175,9 @@
     $('#notes').val('');
     $('#popupWindow').jqxWindow('open');
    });
+   expButton.click(function(event) {
+    window.open('export_suppliers.php');
+   });
   },
   filterable: false,
   columns: [
--- a/www/js/inv_waters.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/inv_waters.js	Thu Dec 05 22:47:40 2019 +0100
@@ -165,9 +165,13 @@
    var addButton, container = $('<div style="overflow: hidden; position: relative; margin: 5px;"></div>');
    addButton = $('<div style="float: right; margin-right: 15px;"><img style="position: relative; margin-top: 2px;" ' +
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Nieuw</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -187,6 +191,9 @@
     $('#cost').val(0);
     $('#popupWindow').jqxWindow('open');
    });
+   expButton.click(function(event) {
+    window.open('export_waters.php');
+   });
   },
   filterable: false,
   columns: [
--- a/www/js/inv_yeasts.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/inv_yeasts.js	Thu Dec 05 22:47:40 2019 +0100
@@ -240,11 +240,15 @@
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Nieuw</span></div>');
    impButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Import</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
    container.append(impButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
    impButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -279,6 +283,9 @@
    impButton.click(function(event) {
     window.location.href = 'import_ingredients.php?select=yeasts';
    });
+   expButton.click(function(event) {
+    window.open('export_yeasts.php');
+   });
   },
   filterable: true,
   filtermode: 'excel',
--- a/www/js/profile_mash.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/profile_mash.js	Thu Dec 05 22:47:40 2019 +0100
@@ -250,9 +250,13 @@
    var addButton, container = $('<div style="overflow: hidden; position: relative; margin: 5px;"></div>');
    addButton = $('<div style="float: right; margin-right: 15px;"><img style="position: relative; margin-top: 2px;" ' +
      'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Add</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -261,6 +265,9 @@
     editsteps('');
     $('#popupWindow').jqxWindow('open');
    });
+   expButton.click(function(event) {
+    window.open('export_mashs.php');
+   });
   },
   filterable: true,
   filtermode: 'excel',
--- a/www/js/profile_styles.js	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/js/profile_styles.js	Thu Dec 05 22:47:40 2019 +0100
@@ -186,11 +186,15 @@
        'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Nieuw</span></div>');
    impButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
        'src="images/add.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Import</span></div>');
+   expButton = $('<div style="float: right; margin-right: 50px;"><img style="position: relative; margin-top: 2px;" ' +
+     'src="images/database.png"/><span style="margin-left: 4px; position: relative; top: -3px;">Export</span></div>');
    container.append(addButton);
    container.append(impButton);
+   container.append(expButton);
    statusbar.append(container);
    addButton.jqxButton({ theme: theme, width: 90, height: 20 });
    impButton.jqxButton({ theme: theme, width: 90, height: 20 });
+   expButton.jqxButton({ theme: theme, width: 90, height: 20 });
    // add new row.
    addButton.click(function(event) {
     editrow = -1;
@@ -221,6 +225,9 @@
    impButton.click(function(event) {
     window.location.href = 'import_ingredients.php?select=styles';
    });
+   expButton.click(function(event) {
+    window.open('export_styles.php');
+   });
   },
   filterable: true,
   filtermode: 'excel',
--- a/www/prod_beerxml.php	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/prod_beerxml.php	Thu Dec 05 22:47:40 2019 +0100
@@ -1,8 +1,8 @@
 <?php
-require_once('config.php');
-require_once('includes/formulas.php');
-//require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
-//require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+//require_once('config.php');
+//require_once('includes/formulas.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
 
 
 $link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
@@ -164,10 +164,10 @@
 xmlwriter_end_element($xw);
 
 xmlwriter_start_element($xw, 'FG_MIN');
-xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_min'])));
+xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_min'])));
 xmlwriter_end_element($xw);
 
-xmlwriter_start_element($xw, 'OG_MAX');
+xmlwriter_start_element($xw, 'FG_MAX');
 xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_max'])));
 xmlwriter_end_element($xw);
 
--- a/www/rec_beerxml.php	Thu Dec 05 13:25:54 2019 +0100
+++ b/www/rec_beerxml.php	Thu Dec 05 22:47:40 2019 +0100
@@ -128,10 +128,10 @@
 xmlwriter_end_element($xw);
 
 xmlwriter_start_element($xw, 'FG_MIN');
-xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_min'])));
+xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_min'])));
 xmlwriter_end_element($xw);
 
-xmlwriter_start_element($xw, 'OG_MAX');
+xmlwriter_start_element($xw, 'FG_MAX');
 xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_max'])));
 xmlwriter_end_element($xw);
 

mercurial