Merged with divide branch

Mon, 28 Oct 2019 19:55:42 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 28 Oct 2019 19:55:42 +0100
changeset 542
dabe1c854a0f
parent 541
df678aa03f4a (current diff)
parent 537
9dbce45f39b7 (diff)
child 543
c062eb0dd7ce

Merged with divide branch

www/js/prod_edit.js file | annotate | diff | comparison | revisions
www/prod_forum.php file | annotate | diff | comparison | revisions
www/prod_print.php file | annotate | diff | comparison | revisions
--- a/README.design	Mon Oct 28 13:44:12 2019 +0100
+++ b/README.design	Mon Oct 28 19:55:42 2019 +0100
@@ -45,29 +45,23 @@
 Add dry-hop toevoegen moment.
 
 Split batch:
- 1. After sparge, before boil.
- 2. After boil, before primary.
- 3. After primary
- 4. After secondary (several dry-hops)
- 5. After lagering (separated packaging)
 
 Split fields:
-divide_type	0:none 1:after mash 2:after boil 3:after primary 4:after secondary 5:after tertiary
+divide_type	0:none 1:after mash 2:after boil 3:after cooling 4:after primary 5:after secondary 6:after tertiary
 divide_size	amount in liters of this part.
-divide_percent	percentage of this part.
+divide_factor	factor size of this part or 1.0
 divide_parts	hoeveel afsplitsingen.
 divide_part	0=hoofdbatch.
-divide_from	uuid
-Via Export module dialoog  maken, keuze aantal afsplitsels en grootte per stuk. 10 stuks.
-Procedure: Genereer afsplitsels in db_product. Pas volumes aan na splitspunt.
-Afsplitsels naam aanpassen, code en -n volgnummer toevoegen.
-Daarna, markeer master en reduceer volume na splitspunt.
+
+Via Export module dialoog  maken, keuze aantal afsplitsels en grootte per stuk. 10 stuks.	Ok.
+Procedure: Genereer afsplitsels in db_product. Pas alle volumes aan.				Ok.
+Afsplitsels naam aanpassen, code en -n volgnummer toevoegen.					Ok.
+Daarna, markeer master en reduceer volume.							Ok.
+Tot zover werkt het. Probleem, wijzig iets aan ingredienten voor het splitspunt. Alle
+batches moeten dan ook bijgewerkt worden. Een trigger meegeven aan db_product tijdens save?
 View - master alleen wijzigen voor splitspunt.
      - splitsingen alleen wijzigen na splitspunt.
 
-NOTE: prod_duplicate alleen op master record, ingesplitst.
-      prod_export beerxml alleen op master.
-      prod_print, prod_forum, prod_checklist - toevoegen splitsels.
 
 
 
--- a/www/includes/constants.php	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/includes/constants.php	Mon Oct 28 19:55:42 2019 +0100
@@ -6,6 +6,7 @@
 $ibumethod = array( 'Tinseth', 'Rager', 'Daniels' );
 $coolingtype = array( '-', 'Dompelkoeler', 'Tegenstroomkoeler', 'Au bain marie', 'Laten afkoelen' );
 $aerationtype = array( 'Geen', 'Lucht', 'Zuurstof' );
+$splitat = array( 'Niet', 'Na maischen', 'Na koken', 'Na koelen', 'Na hoofdgisting', 'Na nagisting', 'Na lageren' );
 
 $added = array( 'Maischen', 'Koken', 'Vergisten', 'Nagisten/lageren', 'Bottelen', 'Fust' );
 $fermentabletype = array( 'Mout', 'Suiker', 'Vloeibaar extract', 'Droog extract', 'Ongemout graan' );
@@ -23,5 +24,7 @@
 $miscuse = array( 'Starter', 'Maischen', 'Koken', 'Hoofdvergisting', 'Nagisting/lagering', 'Bottelen' );
 
 $mashtype = array( 'Infusie', 'Verwarming', 'Decoctie' );
+$acidtype = array( 'Melkzuur', 'Zoutzuur', 'Fosforzuur', 'Zwavelzuur' );
+
 
 ?>
--- a/www/includes/db_divides.php	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/includes/db_divides.php	Mon Oct 28 19:55:42 2019 +0100
@@ -4,75 +4,388 @@
 require($_SERVER['DOCUMENT_ROOT']."/version.php");
 
 #Connect to the database
-$connect = mysqli_connect(DBASE_HOST, DBASE_USER, DBASE_PASS, DBASE_NAME);
-if (! $connect) {
+$link = mysqli_connect(DBASE_HOST, DBASE_USER, DBASE_PASS, DBASE_NAME);
+if (! $link) {
 	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
 }
-mysqli_set_charset($connect, "utf8" );
+mysqli_set_charset($link, "utf8" );
 
+$escapers = array("\\", "/", "\"", "\n", "\r", "\t", "\x08", "\x0c");
+$replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t", "\\f", "\\b");
+$rescapers = array("'");
+$rreplacements = array("\\'");
+$disallowed = array('visibleindex','uniqueid','boundindex','uid','h_weight','m_weight');
 
-if (isset($_POST['insert']) || isset($_POST['update'])) {
-	if (isset($_POST['insert'])) {
-		$sql  = "INSERT INTO `divides` SET ";
-	}
-	if (isset($_POST['update'])) {
-		$sql  = "UPDATE `divides` SET ";
+/*
+ * Server side split batch. Parameters:
+ * record = original record.
+ * divide_type = divide moment.
+ * divide parts = number of divisions
+ * divide_data = array with { size, factor, part, name, code } where index 0 is original
+ *
+ * generate the new records and modify the original record.
+ * rollback if something goes wrong.
+ * return ok or error
+ */
+
+if (isset($_POST['record']) && isset($_POST['divide_type']) && isset($_POST['divide_parts']) && isset($_POST['divide_data'])) {
+
+    $rc = 0;
+    $record = $_POST['record'];
+    $divide_parts = $_POST['divide_parts'];
+    $divide_type = $_POST['divide_type'];
+    $divide_data = array_reverse($_POST['divide_data'], true); // reverse the array so the master record is last.
+
+    syslog(LOG_NOTICE, "db_divide: record " . $record . "  divide_type " . $divide_type . "  parts " . $divide_parts);
+
+    foreach ($divide_data as $index => &$split) {
+	syslog(LOG_NOTICE, "db_divide: index " . $index);
+
+	foreach ($split as $key => &$value) {
+	    syslog(LOG_NOTICE, "db_divide: index " . $index . " key " . $key . " value " . $value);
 	}
 
-	$sql .= "divide_from='" . mysqli_real_escape_string($connect, $_POST['divide_from']);
-	$sql .= "', divide_type='" . $_POST['divide_type'];
-	$sql .= "', divide_size='" . $_POST['divide_size'];
-	$sql .= "', divide_part='" . $_POST['divide_part'];
-	$sql .= "', name='" . mysqli_real_escape_string($connect, $_POST['name']);
-	$sql .= "', code='" . mysqli_real_escape_string($connect, $_POST['code']);
-	if (isset($_POST['insert'])) {
-		$sql .= "';";
-	}
-	if (isset($_POST['update'])) {
-		$sql .= "' WHERE record='" . $_POST['record'] . "';";
+	$result = mysqli_query($link, "SELECT * FROM products WHERE record='" . $record . "'");
+	if (! $result) {
+            syslog(LOG_NOTICE, "db_divide: result: ".mysqli_error($link));
 	}
-	syslog(LOG_NOTICE, $sql);
+	$row = mysqli_fetch_array($result);
+	$factor = floatval($split['factor']);
 
-	$result = mysqli_query($connect, $sql);
-	if (! $result) {
-		syslog(LOG_NOTICE, "db_divides: ".$sql." result: ".mysqli_error($connect));
-	} else {
-		if (isset($_POST['update'])) {
-			syslog(LOG_NOTICE, "db_divides: updated record ".$_POST['record']);
-		} else {
-			$lastid = mysqli_insert_id($connect);
-			syslog(LOG_NOTICE, "db_divides: inserted record ".$lastid);
-		}
-	}
-	echo $result;
+	if ($index == 0) {
+	    /*
+	     * Update the main record
+	     */
+	    $sql = "UPDATE `products` SET ";
+            $sql .=    "brew_sparge_volume='" . sprintf("%.1f", $row['brew_sparge_volume'] * $factor);
+            $sql .= "', brew_sparge_est='" . sprintf("%.1f", $row['brew_sparge_est'] * $factor);
+            $sql .= "', brew_preboil_volume='" . sprintf("%.1f", $row['brew_preboil_volume'] * $factor);
+            $sql .= "', brew_aboil_volume='" . sprintf("%.1f", $row['brew_aboil_volume'] * $factor);
+            $sql .= "', brew_fermenter_volume='" . sprintf("%.1f", $row['brew_fermenter_volume'] * $factor);
+            $sql .= "', brew_fermenter_extrawater='" . sprintf("%.1f", $row['brew_fermenter_extrawater'] * $factor);
+            $sql .= "', brew_fermenter_tcloss='" . sprintf("%.1f", $row['brew_fermenter_tcloss'] * $factor);
+            $sql .= "', package_volume='" . sprintf("%.1f", $row['package_volume'] * $factor);
+            $sql .= "', package_infuse_amount='" . sprintf("%.1f", $row['package_infuse_amount'] * $factor);
+            $sql .= "', bottle_amount='" . sprintf("%.1f", $row['bottle_amount'] * $factor);
+            $sql .= "', bottle_priming_water='" . sprintf("%.3f", $row['bottle_priming_water'] * $factor);
+            $sql .= "', keg_amount='" . sprintf("%.1f", $row['keg_amount'] * $factor);
+            $sql .= "', keg_priming_water='" . sprintf("%.3f", $row['keg_priming_water'] * $factor);
+            $sql .= "', batch_size='" . sprintf("%.2f", $row['batch_size'] * $factor);
+            $sql .= "', boil_size='" . sprintf("%.2f", $row['boil_size'] * $factor);
+            $sql .= "', sparge_volume='" . sprintf("%.1f", $row['sparge_volume'] * $factor);
+            $sql .= "', sparge_acid_amount='" . sprintf("%.5f", $row['sparge_acid_amount'] * $factor);
+            $sql .= "', w1_amount='" . sprintf("%.2f", $row['w1_amount'] * $factor);
+            $sql .= "', w2_amount='" . sprintf("%.2f", $row['w2_amount'] * $factor);
+            $sql .= "', wg_amount='" . sprintf("%.2f", $row['wg_amount'] * $factor);
+            $sql .= "', prop1_volume='" . sprintf("%.3f", $row['prop1_volume'] * $factor);
+            $sql .= "', prop2_volume='" . sprintf("%.3f", $row['prop2_volume'] * $factor);
+            $sql .= "', prop3_volume='" . sprintf("%.3f", $row['prop3_volume'] * $factor);
+            $sql .= "', prop4_volume='" . sprintf("%.3f", $row['prop4_volume'] * $factor);
+            $sql .= "', divide_type='" . $divide_type;
+            $sql .= "', divide_parts='" . $divide_parts;
+            $sql .= "', divide_part='" . $index;
+            $sql .= "', divide_size='" . floatval($split['size']);
+            $sql .= "', divide_factor='". $factor;
+	    syslog(LOG_NOTICE, "db_divide: index " . $index . " " . $sql);
 
-} else if (isset($_POST['delete'])) {
-	// DELETE COMMAND
-	$sql = "DELETE FROM `divides` WHERE record='".$_POST['record']."';";
-	$result = mysqli_query($connect, $sql);
-	if (! $result) {
-		syslog(LOG_NOTICE, "db_divides: ".$sql." result: ".mysqli_error($connect));
 	} else {
-		syslog(LOG_NOTICE, "db_divides: deleted record ".$_POST['record']);
+	    /*
+	     * Insert splitted batches
+	     */
+	    $sql  = "INSERT INTO `products` SET ";
+	    $sql .= "name='" . mysqli_real_escape_string($link, $split['name']);
+	    $sql .= "', uuid='" . str_replace("\n", "", file_get_contents('/proc/sys/kernel/random/uuid'));
+	    $sql .= "', code='" . mysqli_real_escape_string($link, $split['code']);
+	    $sql .= "', birth='" . $row['birth'];
+	    $sql .= "', stage='" . $row['stage'];
+	    $sql .= "', notes='" . mysqli_real_escape_string($link, $row['notes']);
+	    $sql .= "', log_brew='" . $row['log_brew'];
+	    $sql .= "', log_fermentation='" . $row['log_fermentation'];
+	    $sql .= "', inventory_reduced='" . $row['inventory_reduced'];;
+	    $sql .= "', locked='" . $row['locked'];;
+	    // Equipment
+	    $sql .= "', eq_name='" . mysqli_real_escape_string($link, $row['eq_name']);
+	    $sql .= "', eq_boil_size='" . $row['eq_boil_size'];
+	    $sql .= "', eq_batch_size='" . $row['eq_batch_size'];
+	    $sql .= "', eq_tun_volume='" . $row['eq_tun_volume'];
+	    $sql .= "', eq_tun_weight='" . $row['eq_tun_weight'];
+	    $sql .= "', eq_tun_specific_heat='" . $row['eq_tun_specific_heat'];
+	    $sql .= "', eq_tun_material='" . $row['eq_tun_material'];
+	    $sql .= "', eq_tun_height='" . $row['eq_tun_height'];
+	    $sql .= "', eq_top_up_water='" . $row['eq_top_up_water'];
+	    $sql .= "', eq_trub_chiller_loss='" . $row['eq_trub_chiller_loss'];
+	    $sql .= "', eq_evap_rate='" . $row['eq_evap_rate'];
+	    $sql .= "', eq_boil_time='" . $row['eq_boil_time'];
+	    $sql .= "', eq_calc_boil_volume='" . $row['eq_calc_boil_volume'];
+	    $sql .= "', eq_top_up_kettle='" . $row['eq_top_up_kettle'];
+	    $sql .= "', eq_hop_utilization='" . $row['eq_hop_utilization'];
+	    $sql .= "', eq_notes='" . mysqli_real_escape_string($link, $row['eq_notes']);
+	    $sql .= "', eq_lauter_volume='" . $row['eq_lauter_volume'];
+	    $sql .= "', eq_lauter_height='" . $row['eq_lauter_height'];
+	    $sql .= "', eq_lauter_deadspace='" . $row['eq_lauter_deadspace'];
+	    $sql .= "', eq_kettle_volume='" . $row['eq_kettle_volume'];
+	    $sql .= "', eq_kettle_height='" . $row['eq_kettle_height'];
+	    $sql .= "', eq_mash_volume='" . $row['eq_mash_volume'];
+	    $sql .= "', eq_mash_max='" . $row['eq_mash_max'];
+	    $sql .= "', eq_efficiency='" . $row['eq_efficiency'];
+	    // brewdate
+	    if (strlen($row['brew_date_start']))
+	    	$sql .= "', brew_date_start='" . $row['brew_date_start'] . "'";
+	    else
+		$sql .= "', brew_date_start=NULL";
+            $sql .=  ", brew_mash_ph='" . $row['brew_mash_ph'];
+            $sql .= "', brew_mash_sg='" . $row['brew_mash_sg'];
+	    $sql .= "', brew_mash_efficiency='" . $row['brew_mash_efficiency'];
+	    $sql .= "', brew_sparge_temperature='" . $row['brew_sparge_temperature'];
+	    $sql .= "', brew_sparge_volume='" . sprintf("%.1f", $row['brew_sparge_volume'] * $factor);
+            $sql .= "', brew_sparge_est='" . sprintf("%.1f", $row['brew_sparge_est'] * $factor);
+            $sql .= "', brew_sparge_ph='" . $row['brew_sparge_ph'];
+            $sql .= "', brew_preboil_volume='" . sprintf("%.1f", $row['brew_preboil_volume'] * $factor);
+            $sql .= "', brew_preboil_sg='" . $row['brew_preboil_sg'];
+            $sql .= "', brew_preboil_ph='" . $row['brew_preboil_ph'];
+	    $sql .= "', brew_preboil_efficiency='" . $row['brew_preboil_efficiency'];
+            $sql .= "', brew_aboil_volume='" . sprintf("%.1f", $row['brew_aboil_volume'] * $factor);
+            $sql .= "', brew_aboil_sg='" . $row['brew_aboil_sg'];
+            $sql .= "', brew_aboil_ph='" . $row['brew_aboil_ph'];
+            $sql .= "', brew_aboil_efficiency='" . $row['brew_aboil_efficiency'];
+	    $sql .= "', brew_cooling_method='" . $row['brew_cooling_method'];
+            $sql .= "', brew_cooling_time='" . $row['brew_cooling_time'];
+	    $sql .= "', brew_cooling_to='" . $row['brew_cooling_to'];
+	    $sql .= "', brew_whirlpool9='" . $row['brew_whirlpool9'];
+	    $sql .= "', brew_whirlpool7='" . $row['brew_whirlpool7'];
+	    $sql .= "', brew_whirlpool6='" . $row['brew_whirlpool6'];
+	    $sql .= "', brew_whirlpool2='" . $row['brew_whirlpool2'];
+	    $sql .= "', brew_aeration_time='" . $row['brew_aeration_time'];
+	    $sql .= "', brew_aeration_speed='" . $row['brew_aeration_speed'];
+	    $sql .= "', brew_aeration_type='" . $row['brew_aeration_type'];
+	    $sql .= "', brew_fermenter_volume='" . sprintf("%.1f", $row['brew_fermenter_volume'] * $factor);
+	    $sql .= "', brew_fermenter_extrawater='" . sprintf("%.1f", $row['brew_fermenter_extrawater'] * $factor);
+	    $sql .= "', brew_fermenter_tcloss='" . sprintf("%.1f", $row['brew_fermenter_tcloss'] * $factor);
+            $sql .= "', brew_fermenter_sg='" . $row['brew_fermenter_sg'];
+	    $sql .= "', brew_fermenter_ibu='" . $row['brew_fermenter_ibu'];
+	    $sql .= "', brew_fermenter_color='" . $row['brew_fermenter_color'];
+	    if (strlen($row['brew_date_end']))
+		$sql .= "', brew_date_end='" . $row['brew_date_end'] . "'";
+	    else
+		$sql .= "', brew_date_end=NULL";
+	    $sql .=  ", og='" . $row['og'];
+	    $sql .= "', fg='" . $row['fg'];
+	    $sql .= "', primary_start_temp='" . $row['primary_start_temp'];
+	    $sql .= "', primary_max_temp='" . $row['primary_max_temp'];
+	    $sql .= "', primary_end_temp='" . $row['primary_end_temp'];
+	    if (strlen($row['primary_end_date']))
+		$sql .= "', primary_end_date='" . $row['primary_end_date'] . "'";
+	    else
+	    	$sql .= "', primary_end_date=NULL";
+	    $sql .=  ", primary_end_sg='" . $row['primary_end_sg'];
+	    $sql .= "', secondary_temp='" . $row['secondary_temp'];
+	    $sql .= "', secondary_end_sg='" . $row['secondary_end_sg'];
+	    if (strlen($row['secondary_end_date']))
+		$sql .= "', secondary_end_date='" . $row['secondary_end_date'] . "'";
+	    else
+	    	$sql .= "', secondary_end_date=NULL";
+	    $sql .=  ", tertiary_temp='" . $row['tertiary_temp'];
+	    if (strlen($row['package_date']))
+		$sql .= "', package_date='" . $row['package_date'] . "'";
+	    else
+		$sql .= "', package_date=NULL";
+	    $sql .=  ", package_volume='" . sprintf("%.1f", $row['package_volume'] * $factor);
+	    $sql .= "', package_infuse_amount='" . sprintf("%.1f", $row['package_infuse_amount'] * $factor);
+	    $sql .= "', package_infuse_abv='" . $row['package_infuse_abv'];
+	    $sql .= "', package_infuse_notes='" . mysqli_real_escape_string($link, $row['package_infuse_notes']);
+	    $sql .= "', package_abv='" . $row['package_abv'];
+	    $sql .= "', package_ph='" . $row['package_ph'];
+	    $sql .= "', bottle_amount='" . sprintf("%.1f", $row['bottle_amount'] * $factor);
+	    $sql .= "', bottle_carbonation='" . $row['bottle_carbonation'];
+	    $sql .= "', bottle_priming_sugar='" . $row['bottle_priming_sugar'];
+	    $sql .= "', bottle_priming_water='" . sprintf("%.3f", $row['bottle_priming_water'] * $factor);
+	    $sql .= "', bottle_priming_amount='" . $row['bottle_priming_amount'];
+	    $sql .= "', bottle_carbonation_temp='" . $row['bottle_carbonation_temp'];
+	    $sql .= "', keg_amount='" . sprintf("%.1f", $row['keg_amount'] * $factor);
+	    $sql .= "', keg_carbonation='" . $row['keg_carbonation'];
+	    $sql .= "', keg_priming_sugar='" . $row['keg_priming_sugar'];
+	    $sql .= "', keg_priming_water='" . sprintf("%.3f", $row['keg_priming_water'] * $factor);
+	    $sql .= "', keg_priming_amount='" . $row['keg_priming_amount'];
+	    $sql .= "', keg_carbonation_temp='" . $row['keg_carbonation_temp'];
+	    $sql .= "', keg_forced_carb='" . $row['keg_forced_carb'];
+	    $sql .= "', keg_pressure='" . $row['keg_pressure'];
+	    $sql .= "', taste_notes='";
+	    $sql .= "', taste_rate='0";
+	    $sql .= "', taste_date=NULL";
+	    $sql .=  ", taste_color='";
+	    $sql .= "', taste_transparency='";
+	    $sql .= "', taste_head='";
+	    $sql .= "', taste_aroma='";
+	    $sql .= "', taste_taste='";
+	    $sql .= "', taste_mouthfeel='";
+	    $sql .= "', taste_aftertaste='";
+	    // Style
+	    $sql .= "', st_name='" . mysqli_real_escape_string($link, $row['st_name']);
+	    $sql .= "', st_letter='" . mysqli_real_escape_string($link, $row['st_letter']);
+	    $sql .= "', st_guide='" . mysqli_real_escape_string($link, $row['st_guide']);
+	    $sql .= "', st_type='" . $row['st_type'];
+	    $sql .= "', st_category='" . mysqli_real_escape_string($link, $row['st_category']);
+	    $sql .= "', st_category_number='" . $row['st_category_number'];
+	    $sql .= "', st_og_min='" . $row['st_og_min'];
+	    $sql .= "', st_og_max='" . $row['st_og_max'];
+	    $sql .= "', st_fg_min='" . $row['st_fg_min'];
+	    $sql .= "', st_fg_max='" . $row['st_fg_max'];
+	    $sql .= "', st_ibu_min='" . $row['st_ibu_min'];
+	    $sql .= "', st_ibu_max='" . $row['st_ibu_max'];
+	    $sql .= "', st_color_min='" . $row['st_color_min'];
+	    $sql .= "', st_color_max='" . $row['st_color_max'];
+	    $sql .= "', st_carb_min='" . $row['st_carb_min'];
+	    $sql .= "', st_carb_max='" . $row['st_carb_max'];
+	    $sql .= "', st_abv_min='" . $row['st_abv_min'];
+	    $sql .= "', st_abv_max='" . $row['st_abv_max'];
+	    $sql .= "', type='" . $row['type'];
+            $sql .= "', batch_size='" . sprintf("%.2f", $row['batch_size'] * $factor);
+            $sql .= "', boil_size='" . sprintf("%.2f", $row['boil_size'] * $factor);
+	    $sql .= "', boil_time='" . $row['boil_time'];
+	    $sql .= "', efficiency='" . $row['efficiency'];
+	    $sql .= "', est_og='" . $row['est_og'];
+	    $sql .= "', est_fg='" . $row['est_fg'];
+	    $sql .= "', est_abv='" . $row['est_abv'];
+	    $sql .= "', est_carb='" . $row['est_carb'];
+	    $sql .= "', est_color='" . $row['est_color'];
+	    $sql .= "', color_method='" . $row['color_method'];
+	    $sql .= "', est_ibu='" . $row['est_ibu'];
+	    $sql .= "', ibu_method='" . $row['ibu_method'];
+            $sql .= "', sparge_volume='" . sprintf("%.1f", $row['sparge_volume'] * $factor);
+            $sql .= "', sparge_acid_amount='" . sprintf("%.5f", $row['sparge_acid_amount'] * $factor);
+	    $sql .= "', sparge_temp='" . $row['sparge_temp'];
+	    $sql .= "', sparge_ph='" . $row['sparge_ph'];
+	    $sql .= "', sparge_source='" . $row['sparge_source'];
+	    $sql .= "', sparge_acid_type='" . $row['sparge_acid_type'];
+	    $sql .= "', sparge_acid_perc='" . $row['sparge_acid_perc'];
+	    $sql .= "', mash_ph='" . $row['mash_ph'];
+	    $sql .= "', mash_name='" . $row['mash_name'];
+	    $sql .= "', calc_acid='" . $row['calc_acid'];
+	    $sql .= "', w1_name='" . mysqli_real_escape_string($link, $row['w1_name']);
+            $sql .= "', w1_amount='" . sprintf("%.2f", $row['w1_amount'] * $factor);
+	    $sql .= "', w1_calcium='" . $row['w1_calcium'];
+	    $sql .= "', w1_sulfate='" . $row['w1_sulfate'];
+	    $sql .= "', w1_chloride='" . $row['w1_chloride'];
+	    $sql .= "', w1_sodium='" . $row['w1_sodium'];
+	    $sql .= "', w1_magnesium='" . $row['w1_magnesium'];
+	    $sql .= "', w1_total_alkalinity='" . $row['w1_total_alkalinity'];
+	    $sql .= "', w1_ph='" . $row['w1_ph'];
+            $sql .= "', w1_cost='" . $row['w1_cost'];
+	    $sql .= "', w2_name='" . mysqli_real_escape_string($link, $row['w2_name']);
+            $sql .= "', w2_amount='" . sprintf("%.2f", $row['w2_amount'] * $factor);
+	    $sql .= "', w2_calcium='" . $row['w2_calcium'];
+	    $sql .= "', w2_sulfate='" . $row['w2_sulfate'];
+	    $sql .= "', w2_chloride='" . $row['w2_chloride'];
+	    $sql .= "', w2_sodium='" . $row['w2_sodium'];
+	    $sql .= "', w2_magnesium='" . $row['w2_magnesium'];
+	    $sql .= "', w2_total_alkalinity='" . $row['w2_total_alkalinity'];
+	    $sql .= "', w2_ph='" . $row['w2_ph'];
+	    $sql .= "', w2_cost='" . $row['w2_cost'];
+            $sql .= "', wg_amount='" . sprintf("%.2f", $row['wg_amount'] * $factor);
+            $sql .= "', wg_calcium='" . $row['wg_calcium'];
+            $sql .= "', wg_sulfate='" . $row['wg_sulfate'];
+            $sql .= "', wg_chloride='" . $row['wg_chloride'];
+            $sql .= "', wg_sodium='" . $row['wg_sodium'];
+            $sql .= "', wg_magnesium='" . $row['wg_magnesium'];
+            $sql .= "', wg_total_alkalinity='" . $row['wg_total_alkalinity'];
+            $sql .= "', wg_ph='" . $row['wg_ph'];
+            $sql .= "', wb_calcium='" . $row['wb_calcium'];
+            $sql .= "', wb_sulfate='" . $row['wb_sulfate'];
+            $sql .= "', wb_chloride='" . $row['wb_chloride'];
+            $sql .= "', wb_sodium='" . $row['wb_sodium'];
+            $sql .= "', wb_magnesium='" . $row['wb_magnesium'];
+            $sql .= "', wb_total_alkalinity='" . $row['wb_total_alkalinity'];
+            $sql .= "', wb_ph='" . $row['wb_ph'];
+	    $sql .= "', wa_acid_name='" . $row['wa_acid_name'];
+	    $sql .= "', wa_acid_perc='" . $row['wa_acid_perc'];
+	    $sql .= "', wa_base_name='" . $row['wa_base_name'];
+	    $sql .= "', starter_enable='" . $row['starter_enable'];
+	    $sql .= "', starter_type='" . $row['starter_type'];
+	    $sql .= "', starter_sg='" . $row['starter_sg'];
+	    $sql .= "', starter_viability='" . $row['starter_viability'];
+	    $sql .= "', prop1_type='" . $row['prop1_type'];
+	    $sql .= "', prop2_type='" . $row['prop2_type'];
+	    $sql .= "', prop3_type='" . $row['prop3_type'];
+	    $sql .= "', prop4_type='" . $row['prop4_type'];
+            $sql .= "', prop1_volume='" . sprintf("%.3f", $row['prop1_volume'] * $factor);
+            $sql .= "', prop2_volume='" . sprintf("%.3f", $row['prop2_volume'] * $factor);
+            $sql .= "', prop3_volume='" . sprintf("%.3f", $row['prop3_volume'] * $factor);
+            $sql .= "', prop4_volume='" . sprintf("%.3f", $row['prop4_volume'] * $factor);
+	    $sql .= "', divide_type='" . $divide_type;
+	    $sql .= "', divide_parts='" . $divide_parts;
+            $sql .= "', divide_part='" . $index;
+            $sql .= "', divide_size='" . floatval($split['size']);
+	    $sql .= "', divide_factor='". $factor;
+	    syslog(LOG_NOTICE, "db_divide: index " . $index . " " . $sql);
 	}
-	echo $result;
+    
+	$fermentables = json_decode($row['json_fermentables'], true);
+    	for ($i = 0; $i < count($fermentables); $i++) {
+	    $fermentables[$i]['f_amount'] = sprintf("%.5f", $fermentables[$i]['f_amount'] * $factor);
+    	}
+    	// syslog(LOG_NOTICE, "db_divide: " . str_replace($rescapers,$rreplacements,json_encode($fermentables, JSON_UNESCAPED_UNICODE)));
+    	$sql .= "', json_fermentables='" . str_replace($rescapers,$rreplacements,json_encode($fermentables, JSON_UNESCAPED_UNICODE));
+
+	$hops = json_decode($row['json_hops'], true);
+	for ($i = 0; $i < count($hops); $i++) {
+	    $hops[$i]['h_amount'] = sprintf("%.5f", $hops[$i]['h_amount'] * $factor);
+	}
+	// syslog(LOG_NOTICE, "db_divide: " . str_replace($rescapers,$rreplacements,json_encode($hops, JSON_UNESCAPED_UNICODE)));
+	$sql .= "', json_hops='" . str_replace($rescapers,$rreplacements,json_encode($hops, JSON_UNESCAPED_UNICODE));
+
+	$miscs = json_decode($row['json_miscs'], true);
+	for ($i = 0; $i < count($miscs); $i++) {
+            $miscs[$i]['m_amount'] = sprintf("%.5f", $miscs[$i]['m_amount'] * $factor);
+	}
+	// syslog(LOG_NOTICE, "db_divide: " . str_replace($rescapers,$rreplacements,json_encode($miscs, JSON_UNESCAPED_UNICODE)));
+	$sql .= "', json_miscs='" . str_replace($rescapers,$rreplacements,json_encode($miscs, JSON_UNESCAPED_UNICODE));
+
+	$yeasts = json_decode($row['json_yeasts'], true);
+	for ($i = 0; $i < count($yeasts); $i++) {
+	    $yeasts[$i]['y_amount'] = sprintf("%.5f", $yeasts[$i]['y_amount'] * $factor);
+	}
+	// syslog(LOG_NOTICE, "db_divide: " . str_replace($rescapers,$rreplacements,json_encode($yeasts, JSON_UNESCAPED_UNICODE)));
+	$sql .= "', json_yeasts='" . str_replace($rescapers,$rreplacements,json_encode($yeasts, JSON_UNESCAPED_UNICODE));
 
+	$mashs = json_decode($row['json_mashs'], true);
+	for ($i = 0; $i < count($mashs); $i++) {
+	    $mashs[$i]['step_infuse_amount'] = sprintf("%.5f", $mashs[$i]['step_infuse_amount'] * $factor);
+	}
+	syslog(LOG_NOTICE, "db_divide: " . str_replace($rescapers,$rreplacements,json_encode($mashs, JSON_UNESCAPED_UNICODE)));
+	$sql .= "', json_mashs='" . str_replace($rescapers,$rreplacements,json_encode($mashs, JSON_UNESCAPED_UNICODE));
+
+	if ($index == 0) {
+	    $sql .= "' WHERE record='" . $record . "';";
+	    $result2 = mysqli_query($link, $sql);
+            if (! $result2) {
+                syslog(LOG_NOTICE, "db_divide: result: ".mysqli_error($link));
+            	$rc = 1;
+		break;
+	    } else {
+                syslog(LOG_NOTICE, "db_divide: updated record ".$record." code ".$split['code']);
+            }
+	} else {
+	    $sql .= "';";
+	    $result2 = mysqli_query($link, $sql);
+	    if (! $result2) {
+             	syslog(LOG_NOTICE, "db_divide: result: ".mysqli_error($link));
+		$rc = 1;
+		break;
+            } else {
+	     	$lastid = mysqli_insert_id($link);
+                syslog(LOG_NOTICE, "db_divide: inserted record ".$lastid." code ".$split['code']);
+	    }
+	}
+
+    }
+    syslog(LOG_NOTICE, "db_divide: rc=".$rc);
+    echo $rc;
 } else {
-	// SELECT COMMAND
-	$query = "SELECT * FROM divides ORDER BY divide_from,divide_part";
-	$result = mysqli_query($connect, $query) or die("SQL Error 1: " . mysqli_error($connect));
-	while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
-		$divides[] = array(
-			'record' => $row['record'],
-			'divide_from' => $row['divide_from'],
-			'divide_type' => $row['divide_type'],
-			'divide_size' => $row['divide_size'],
-			'divide_part' => $row['divide_part'],
-			'name' => $row['name'],
-			'code' => $row['code']
-		);
-	}
-	header("Content-type: application/json");
-	echo json_encode($divides);
+    syslog(LOG_NOTICE, "db_divide: missing arguments");
+    echo 1;
 }
+
+
+
+
 ?>
--- a/www/includes/db_product.php	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/includes/db_product.php	Mon Oct 28 19:55:42 2019 +0100
@@ -263,8 +263,10 @@
 		$sql .= "', prop4_volume='" . $_POST['prop4_volume'];
 	}
 	$sql .= "', divide_type='" . $_POST['divide_type'];
-	$sql .= "', divide_size='" . $_POST['divide_size'];
+	$sql .= "', divide_size='" . floatval($_POST['divide_size']);
+	$sql .= "', divide_factor='" . floatval($_POST['divide_factor']);
 	$sql .= "', divide_parts='" . $_POST['divide_parts'];
+	$sql .= "', divide_part='" . $_POST['divide_part'];
 	//syslog(LOG_NOTICE, $sql);
 
 	$fermentables = '[';
@@ -865,7 +867,9 @@
 
 		$brew .= ',"divide_type":' . $row['divide_type'];
 		$brew .= ',"divide_size":' . floatval($row['divide_size']);
+		$brew .= ',"divide_factor":' . floatval($row['divide_factor']);
 		$brew .= ',"divide_parts":' . $row['divide_parts'];
+		$brew .= ',"divide_part":' . $row['divide_part'];
 
 		if (isset($_GET['record'])) {
 			// Append stock information.
--- a/www/js/prod_divide.js	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/js/prod_divide.js	Mon Oct 28 19:55:42 2019 +0100
@@ -40,10 +40,10 @@
     for (i = 0; i < rows.length; i++) {
      row = rows[i];
      leftover -= row.split_size;
-     //console.log('i:' + i + ' split_size:' + row.split_size);
+     console.log('i:' + i + ' split_size:' + row.split_size);
     }
     $('#leftover').val(leftover);
-    //console.log('calcLeftover():' + leftover);
+    console.log('calcLeftover():' + leftover);
  }
 
  // Calculate available volume but ignore the current row.
@@ -308,25 +308,6 @@
   }
  });
 
- durl = 'includes/db_divides.php',
-
- // Prepare the data
- dividerec = {
-  datatype: 'json',
-  cache: false,
-  datafields: [
-   // From prod_main
-   { name: 'record', type: 'number' },
-   { name: 'divide_from', type: 'string' },
-   { name: 'divide_type', type: 'int' },
-   { name: 'divide_size', type: 'float' },
-   { name: 'name', type: 'string' },
-   { name: 'code', type: 'string' }
-  ],
-  id: 'record',
-  url: durl + '?record=' + my_record
- };
-
  var editSplit = function(data) {
   var splitSource = {
    datatype: 'local',
@@ -479,77 +460,51 @@
   if (leftover != available) {
    console.log('Save and there are splits');
 
-   // Record 0, the master data
-   div = {};
-   div.divide_from = dataRecord.uuid;
-   div.divide_type = dataRecord.divide_type;
-   div.divide_size = leftover;
-   div.divide_part = 0;
-   div.name = dataRecord.name;
-   div.code = dataRecord.code;
-   data = 'insert=true&' + $.param(div);
-   $.ajax({
-     dataType: 'json',
-     url: durl,
-     cache: false,
-     data: data,
-     type: 'POST',
-     success: function(data, status, xhr) {
-      console.log('insert divides: 0');
-     },
-     error: function(jqXHR, textStatus, errorThrown) {
-      console.log('insert divides: ' + textStatus);
-     }
-   });
+   // Send all the info to the database. The server handles the splitting.
+   var divide_data = new Array();
+   row = {};
+   row.name = dataRecord.name;
+   row.code = dataRecord.code;
+   row.size = Round(leftover, 4);
+   row.factor = Round((leftover / available), 4);
+   row.part = 0;
+   divide_data.push(row);
 
    rows = $('#splitGrid').jqxGrid('getrows');
    for (i = 0; i < rows.length; i++) {
     row = rows[i];
     console.log('split ' + i);
     div = {};
-    div.divide_from = dataRecord.uuid;
-    div.divide_type = dataRecord.divide_type;
-    div.divide_size = row.split_size;
-    div.divide_part = i + 1;
+    div.size = Round(row.split_size, 4);
+    div.factor = Round((row.split_size / available), 4);
+    div.part = i + 1;
     div.name = row.split_name;
     div.code = row.split_code;
-    data = 'insert=true&' + $.param(div);
-    $.ajax({
+    divide_data.push(div);
+   }
+
+   // Send the data to the server
+   div = {};
+   div.record = dataRecord.record;
+   div.divide_type = dataRecord.divide_type;
+   div.divide_parts = i;
+   div.divide_data = divide_data;
+   data = $.param(div);
+   $.ajax({
      dataType: 'json',
-     url: durl,
+     url: 'includes/db_divides.php',
      cache: false,
      data: data,
      type: 'POST',
      success: function(data, status, xhr) {
-      console.log('insert divides: ' + i);
+      console.log('insert divides: success');
+      window.location.href = my_return;
      },
      error: function(jqXHR, textStatus, errorThrown) {
       console.log('insert divides: ' + textStatus);
      }
-    });
-   }
+   });
 
-   div = {};
-   div.record = dataRecord.record;
-   div.divide_type = dataRecord.divide_type;
-   div.divide_size = leftover;
-   div.divide_parts = i;
-   data = 'splitit=true&' + $.param(div);
-   $.ajax({
-     dataType: 'json',
-     url: url,
-     cache: false,
-     data: data,
-     type: 'POST',
-     success: function(data, status, xhr) {
-      console.log('updated products');
-     },
-     error: function(jqXHR, textStatus, errorThrown) {
-      console.log('updated products: ' + textStatus);
-     }
-   });
   }
-  window.location.href = my_return;
  });
-
 });
--- a/www/js/prod_edit.js	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/js/prod_edit.js	Mon Oct 28 19:55:42 2019 +0100
@@ -307,7 +307,9 @@
    { name: 'prop4_volume', type: 'float' },
    { name: 'divide_type', type: 'int' },
    { name: 'divide_size', type: 'float' },
+   { name: 'divide_factor', type: 'float' },
    { name: 'divide_parts', type: 'int' },
+   { name: 'divide_part', type: 'int' },
    { name: 'fermentables', type: 'array' },
    { name: 'hops', type: 'array' },
    { name: 'miscs', type: 'array' },
@@ -535,7 +537,9 @@
    $('#prop4_volume').val(dataRecord.prop4_volume);
    $('#divide_type').val(SplitData[dataRecord.divide_type].nl);
    // hidden divide_size
+   // hidden divide_factor
    $('#divide_parts').val(dataRecord.divide_parts);
+   // hidden divide_part
    editFermentable(dataRecord);
    editHop(dataRecord);
    editMisc(dataRecord);
@@ -4412,7 +4416,9 @@
    prop4_volume: parseFloat($('#prop4_volume').jqxNumberInput('decimal')),
    divide_type: dataRecord.divide_type,
    divide_size: dataRecord.divide_size,
+   divide_factor: dataRecord.divide_factor,
    divide_parts: dataRecord.divide_parts,
+   divide_part: dataRecord.divide_part,
    fermentables: $('#fermentableGrid').jqxGrid('getrows'),
    hops: $('#hopGrid').jqxGrid('getrows'),
    miscs: $('#miscGrid').jqxGrid('getrows'),
@@ -4469,7 +4475,7 @@
    calcStage();
   }
  });
- $('#divide_parts').jqxTooltip({ content: 'Het aantal gesplitste brouw producten.' });
+ $('#divide_parts').jqxTooltip({ content: 'Het aantal extra gesplitste brouw producten.' });
  $('#divide_parts').jqxNumberInput(Show0dec);
  $('#divide_type').jqxTooltip({ content: 'Het splitsing moment in het productie proces.' });
  $('#divide_type').jqxInput({ theme: theme, width: 120, height: 23 });
--- a/www/js/prod_new.js	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/js/prod_new.js	Mon Oct 28 19:55:42 2019 +0100
@@ -427,7 +427,9 @@
      starter_enable: 0,
      divide_type: 0,
      divide_size: 0,
-     divide_parts: 0
+     divide_factor: 1,
+     divide_parts: 0,
+     divide_part: 0
     };
     data = 'insert=true&return=' + my_return + '&' + $.param(newrow);
     $.ajax({
--- a/www/prod_checklist.php	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/prod_checklist.php	Mon Oct 28 19:55:42 2019 +0100
@@ -1,6 +1,7 @@
 <?php
 require_once($_SERVER['DOCUMENT_ROOT'].'/includes/global.inc.php');
 require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/includes/constants.php');
 require_once($_SERVER['DOCUMENT_ROOT'].'/fpdf/fpdf.php');
 
 
@@ -38,12 +39,27 @@
 		$this->Ln(1);
 	}
 
+	function Checksplit($moment, $row) {
+		global $splitat;
+		if ($row['divide_type'] && $row['divide_type'] == $moment) {
+			$this->Ln(2);
+			$this->SetFont('Helvetica','B',14);
+               		$this->Cell(0, 4,$splitat[$row['divide_type']]." splits de batch hier!",0,0,'C',true);
+               		$this->SetFont('Arial','',10);
+			$this->AddPage();
+			return true;
+		}
+		return false;
+	}
+
 	function Checklist($row) {
 
 		global $my_grain_absorbtion;
 		global $my_brix_correction;
+		global $acidtype;
 		$mashwater = 0;
 		$numsalts = 0;
+		$factor = 1 / $row['divide_factor'];
 
 		$this->AddPage();
 		$this->SetFillColor(255,255,255);
@@ -101,17 +117,17 @@
 
 		$this->Checkheader('Water en -behandeling');
 		if ($row['w1_name']) {
-			$this->Checkline(sprintf("%.1f",floatval($row['w1_amount'])).' liter water '.$row['w1_name']);
-			$mashwater += floatval($row['w1_amount']);
+			$this->Checkline(sprintf("%.1f",floatval($row['w1_amount'] * $factor)).' liter water '.$row['w1_name']);
+			$mashwater += floatval($row['w1_amount'] * $factor);
 		}
 		if ($row['w2_name']) {
-			$this->Checkline(sprintf("%.1f",floatval($row['w2_amount'])).' liter water '.$row['w2_name']);
-			$mashwater += floatval($row['w2_amount']);
+			$this->Checkline(sprintf("%.1f",floatval($row['w2_amount'] * $factor)).' liter water '.$row['w2_name']);
+			$mashwater += floatval($row['w2_amount'] * $factor);
 		}
 		foreach($miscs as $item) {
 			if ($item['m_type'] == 4) {	// Only the water agents
 				$unit = ($item['m_amount_is_weight']) ? " gr ":" ml ";
-				$this->Checkline(sprintf("%.1f",floatval($item['m_amount'] * 1000)).$unit.$item['m_name']);
+				$this->Checkline(sprintf("%.2f",floatval($item['m_amount'] * 1000 * $factor)).$unit.$item['m_name']);
 				$numsalts++;
 			}
 		}
@@ -120,7 +136,7 @@
 		$this->Checkheader('Mout afwegen en schroten');
 		foreach($ferms as $item) {
 			if ($item['f_added'] == 0) {	// to mash
-				$s = sprintf("%.3f",floatval($item['f_amount'])).' kg `';
+				$s = sprintf("%.3f",floatval($item['f_amount'] * $factor)).' kg `';
 				$s .= iconv('UTF-8','windows-1252',$item['f_name']);
 				$s .= '` ('.iconv('UTF-8','windows-1252',$item['f_supplier']).')';
 				$this->Checkline($s);
@@ -138,10 +154,10 @@
 			$loop = 0;
 			foreach($arr as $item) {
 				if ($item['step_type'] == 0)
-					$mvol += $item['step_infuse_amount'];	// We need this later.
+					$mvol += $item['step_infuse_amount'] * $factor;	// We need this later.
 				if ($loop == 0) {
 					if ($item['step_type'] == 0)
-						$l = $item['step_infuse_amount'];
+						$l = $item['step_infuse_amount'] * $factor;
 					else
 						$l = $mashwater;
 					$s = sprintf("%.1f",$l).' liter water opwarmen tot ';
@@ -154,7 +170,7 @@
 					$this->Checkline('mout storten en inmaischen');
 					foreach($hops as $item2) {
 						if ($item2['h_useat'] == 0) {
-							$s = sprintf("%.1f",$item2['h_amount']*1000).' gr `';
+							$s = sprintf("%.1f",$item2['h_amount']*1000 * $factor).' gr `';
 							$s .= iconv('UTF-8','windows-1252',$item2['h_name']).'` toevoegen';
 							$this->Checkline($s);
 						}
@@ -162,7 +178,7 @@
 					foreach($miscs as $item3) {
 						if ($item3['m_use_use'] == 1 && $item3['m_type'] != 4) {	// Only if not a water agent
 							$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
-							$s = sprintf("%.2f",$item3['m_amount']*1000).$unit.'`';
+							$s = sprintf("%.2f",$item3['m_amount']*1000 * $factor).$unit.'`';
 							$s .= iconv('UTF-8','windows-1252',$item3['m_name']).'` toevoegen';
 							$this->Checkline($s);
 						}
@@ -171,11 +187,11 @@
 					$this->Checkline('pH meten en bijstellen (doel pH beslag: '.sprintf("%.1f",$row['mash_ph']).' pH)');
 				} else {
 					if ($item['step_type'] == 0) {	// Infusion
-						$s = 'toevoegen '.$item['step_infuse_amount'].' liter water van xx '.DEG.'C';
+						$s = 'toevoegen '.($item['step_infuse_amount'] * $factor).' liter water van xx '.DEG.'C';
 					} else if ($item['step_type'] == 1) {	// Direct heat
 						$s = 'opwarmen tot '.$item['step_temp'].' '.DEG.'C';
 					} else {	// Decoction
-						$s = 'uitnemen, opwarmen, koken en terugstorten van '.$item['step_infuse_amount'].' liter deelbeslag';
+						$s = 'uitnemen, opwarmen, koken en terugstorten van '.($item['step_infuse_amount']*$factor).' liter deelbeslag';
 					}
 					$this->Checkline($s);
 					$this->Checkline($item['step_time'].' min. bij '.$item['step_temp'].' '.DEG.'C');
@@ -185,9 +201,9 @@
 			$est_mash_sg = 0;
 			foreach($ferms as $item) {
 				if ($item['f_added'] == 0) {
-					$d = $item['f_amount'] * ($item['f_yield'] / 100) * (1 - $item['f_moisture'] / 100);
-					$mvol += $item['f_amount'] * $item['f_moisture'] / 100;
-					$grainabsorbtion += $my_grain_absorbtion * $item['f_amount'];
+					$d = $item['f_amount'] * $factor * ($item['f_yield'] / 100) * (1 - $item['f_moisture'] / 100);
+					$mvol += $item['f_amount'] * $factor * $item['f_moisture'] / 100;
+					$grainabsorbtion += $my_grain_absorbtion * $item['f_amount'] * $factor;
 					$msugars += $d;
 				}
 			}
@@ -202,27 +218,28 @@
 		else
 			$this->Ln(5);
 
-		$acidtype = array( 'Melkzuur', 'Zoutzuur', 'Fosforzuur', 'Zwavelzuur' );
 		$this->Checkheader('Filteren en spoelen');
-		$s = sprintf("%.1f",$row['sparge_volume']).' liter spoelwater opwarmen tot '.sprintf("%.1f",$row['sparge_temp']).' '.DEG.'C';
+		$s = sprintf("%.1f",$row['sparge_volume'] * $factor).' liter spoelwater opwarmen tot '.sprintf("%.1f",$row['sparge_temp']).' '.DEG.'C';
 		$this->Checkline($s);
 		$s = 'spoelwater aanzuren tot pH <= '.sprintf("%.1f",$row['sparge_ph']).' met ';
-		$s .= sprintf("%.1f",$row['sparge_acid_amount']*1000).' ml. '.$acidtype[$row['sparge_acid_type']];
+		$s .= sprintf("%.2f",$row['sparge_acid_amount']*1000*$factor).' ml. '.$acidtype[$row['sparge_acid_type']];
 		$this->Checkline($s);
-		$spoelw = ($row['boil_size'] - $mashwater + $grainabsorbtion + $row['eq_lauter_deadspace']) * 1.03;	// A small heat correction
+		$spoelw = (($row['boil_size']*$factor) - $mashwater + $grainabsorbtion + $row['eq_lauter_deadspace']) * 1.03;	// A small heat correction
 		$this->Checkline('spoelen met ongeveer '.sprintf("%.1f",$spoelw).' liter spoelwater');
-		$s = 'doelvolume in kookketel: '.sprintf("%.1f",$row['boil_size'] * 1.04).' liter (';
-		$s .= sprintf("%.1f",kettle_cm($row['boil_size'] * 1.04,$row['eq_kettle_volume'],$row['eq_kettle_height'])).' cm onder de rand)';
+		$s = 'doelvolume in kookketel: '.sprintf("%.1f",$row['boil_size'] * $factor * 1.04).' liter (';
+		$s .= sprintf("%.1f",kettle_cm($row['boil_size'] * $factor * 1.04,$row['eq_kettle_volume'],$row['eq_kettle_height'])).' cm onder de rand)';
 		$this->Checkline($s);
-		$pre_sg = estimate_sg($msugars * floatval($row['efficiency']) / 100,floatval($row['boil_size']));
+		$pre_sg = estimate_sg($msugars * floatval($row['efficiency']) / 100,floatval($row['boil_size'] * $factor));
 		$this->Checkline('doel SG in kookketel: '.density_str($pre_sg));
 		foreach($hops as $item2) {
 			if ($item2['h_useat'] == 1) {
-				$s = sprintf("%.1f",$item2['h_amount']*1000).' gr `';
+				$s = sprintf("%.1f",$item2['h_amount']*1000*$factor).' gr `';
 				$s .= iconv('UTF-8','windows-1252',$item2['h_name']).'` toevoegen na het spoelen';
 				$this->Checkline($s);
 			}
 		}
+		if ($this->Checksplit(1, $row))
+			$factor = 1;
 		if ($this->GetY() > 200)
 			$this->AddPage();
 		else
@@ -234,7 +251,7 @@
 			if ($i == 10) {
 				foreach($ferms as $item1) {
 					if ($item1['f_added'] == 1) {
-						$s = sprintf("%.3f",$item1['f_amount']).' kg `';
+						$s = sprintf("%.3f",$item1['f_amount']*$factor).' kg `';
 						$s .= iconv('UTF-8','windows-1252',$item1['f_name']).'` bij 10 minuten voor einde koken';
 						$this->Checkline($s);
 					}
@@ -244,7 +261,7 @@
 			}
 			foreach($hops as $item2) {
 				if (($item2['h_useat'] == 2 || $item2['h_useat'] == 3) && ($item2['h_time'] == $i)) {
-					$s = sprintf("%.1f",$item2['h_amount']*1000).' gr `';
+					$s = sprintf("%.1f",$item2['h_amount']*1000*$factor).' gr `';
 					$s .= iconv('UTF-8','windows-1252',$item2['h_name']).'` bij ';
 					if ($i > 0)
 						$s .= $i.' minuten voor einde koken';
@@ -256,7 +273,7 @@
 			foreach($miscs as $item3) {
 				if ($item3['m_use_use'] == 2 && $item3['m_time'] == $i) {
 					$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
-					$s = sprintf("%.1f",$item3['m_amount']*1000).$unit.'`';
+					$s = sprintf("%.1f",$item3['m_amount']*1000*$factor).$unit.'`';
 					$s .= iconv('UTF-8','windows-1252',$item3['m_name']).'` bij ';
 					if ($i > 0)
 						$s .= $i.' minuten voor einde koken';
@@ -267,11 +284,13 @@
 			}
 
 		}
-		$s = 'doelvolume einde koken: '.sprintf("%.1f",$row['batch_size']*1.04).' liter (';
-		$s .= sprintf("%.1f",kettle_cm($row['batch_size']*1.04,$row['eq_kettle_volume'],$row['eq_kettle_height']));
+		$s = 'doelvolume einde koken: '.sprintf("%.1f",$row['batch_size']*$factor*1.04).' liter (';
+		$s .= sprintf("%.1f",kettle_cm($row['batch_size']*$factor*1.04,$row['eq_kettle_volume'],$row['eq_kettle_height']));
 		$s .= ' cm onder de rand)';
 		$this->Checkline($s);
 		$this->Checkline('doel SG einde koken: '.density_str($row['est_og']));
+		if ($this->Checksplit(2, $row))
+			$factor = 1;
 		if ($this->GetY() > 200)
 			$this->AddPage();
 		else
@@ -295,7 +314,7 @@
 			}
 			foreach($hops as $item2) {
 				if ($item2['h_useat'] == 4) {
-					$s = sprintf("%.1f",$item2['h_amount']*1000).' gr `';
+					$s = sprintf("%.1f",$item2['h_amount']*1000*$factor).' gr `';
 					$s .= iconv('UTF-8','windows-1252',$item2['h_name']).'` voor ';
 					$s .= $item2['h_time'].' minuten in de whirlpool';
 					$this->Checkline($s);
@@ -312,24 +331,26 @@
 		}
 		$this->Checkline('gistvat ontsmetten en evt. pomp en slangen ontsmetten');
 		$this->Checkline('wort naar gistvat overbrengen');
-
+		if ($this->Checksplit(3, $row))
+			$factor = 1;
 		if ($this->GetY() > 240)
 			$this->AddPage();
 		else
 			$this->Ln(5);
+
 		$this->Checkheader('Gist enten');
 		$dry = 0;
 		foreach ($yeasts as $item) {
 			if ($item['y_use'] == 0) { // primary
 				if ($item['y_form'] == 0) { // Liquid
-					$this->Checkline($item['y_amount'].' pak '.$item['y_product_id'].', '.$item['y_name'].' gist');
+					$this->Checkline(($item['y_amount']*$factor).' pak '.$item['y_product_id'].', '.$item['y_name'].' gist');
 				} else if ($item['y_form'] == 1 || $item['y_form'] == 6) { // Dry
-					$s = sprintf("%.1f",$item['y_amount']*1000).' gram '.$item['y_product_id'].', '.$item['y_name'];
+					$s = sprintf("%.1f",$item['y_amount']*$factor*1000).' gram '.$item['y_product_id'].', '.$item['y_name'];
 					$s .= ' gist';
-					$dry += $item['y_amount']*10000;
+					$dry += $item['y_amount']*$factor*10000;
 					$this->Checkline($s);
 				} else { // Slant/Culture/Frozen/Bottle
-					$s = sprintf("%.0f",$item['y_amount']*1000).' ml '.$item['y_product_id'].', '.$item['y_name'].' gist';
+					$s = sprintf("%.0f",$item['y_amount']*$factor*1000).' ml '.$item['y_product_id'].', '.$item['y_name'].' gist';
 					$this->Checkline($s);
 				}
 			}
@@ -348,7 +369,7 @@
 				$this->Checkline('gist toevoegen');
 		}
 		if ($row['brew_fermenter_extrawater'] > 0)
-			$this->Checkline(sprintf("%.1f", $row['brew_fermenter_extrawater']).' liter water toevoegen in gistvat');
+			$this->Checkline(sprintf("%.1f", $row['brew_fermenter_extrawater']*$factor).' liter water toevoegen in gistvat');
 		if ($row['brew_aeration_type'] > 0) {
 			$s = 'wort '.$row['brew_aeration_time'].' minuten beluchten met ';
 			$s .= ($row['brew_aeration_type'] == 1) ? "lucht":"zuurstof";
@@ -383,7 +404,7 @@
 		}
 		foreach($ferms as $item1) {
                         if ($item1['f_added'] == 2) {
-				$s = sprintf("%.3f",$item1['f_amount']).' kg `';
+				$s = sprintf("%.3f",$item1['f_amount']*$factor).' kg `';
                                 $s .= iconv('UTF-8','windows-1252',$item1['f_name']).'` op dag 3 of 4 toevoegen';
                                 $this->Checkline($s);
 			}
@@ -391,11 +412,13 @@
                 foreach($miscs as $item3) {
                         if ($item3['m_use_use'] == 3) {
 				$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
-				$s = sprintf("%.1f",$item3['m_amount']*1000).$unit.'`';
+				$s = sprintf("%.1f",$item3['m_amount']*$factor*1000).$unit.'`';
                                 $s .= iconv('UTF-8','windows-1252',$item3['m_name']).'` op dag 3 of 4 toevoegen';
                                 $this->Checkline($s);
 			}
                 }
+		if ($this->Checksplit(4, $row))
+			$factor = 1;
 
 		/*
 		 * During secondary fermentation: yeast
@@ -415,17 +438,19 @@
 		foreach ($yeasts as $item4) {
                         if ($item4['y_use'] == 1) {
 				if ($item4['y_form'] == 0) { // Liquid
-                                        $this->Checkline($item4['y_amount'].' pak '.$item4['y_product_id'].', '.$item4['y_name'].' gist (eventueel met starter)');
+                                        $this->Checkline(($item4['y_amount']*$factor).' pak '.$item4['y_product_id'].', '.$item4['y_name'].' gist (eventueel met starter)');
                                 } else if ($item['y_form'] == 1) { // Dry
-                                        $s = sprintf("%.1f",$item4['y_amount']*1000).' gram '.$item4['y_product_id'].', '.$item4['y_name'];
+                                        $s = sprintf("%.1f",$item4['y_amount']*$factor*1000).' gram '.$item4['y_product_id'].', '.$item4['y_name'];
                                         $s .= ' gist';
                                         $this->Checkline($s);
                                 } else { // Slant/Culture/Frozen/Bottle
-                                        $s = sprintf("%.0f",$item4['y_amount']*1000).' ml '.$item4['y_product_id'].', '.$item4['y_name'].' gist (eventueel met starter)';
+                                        $s = sprintf("%.0f",$item4['y_amount']*$factor*1000).' ml '.$item4['y_product_id'].', '.$item4['y_name'].' gist (eventueel met starter)';
                                         $this->Checkline($s);
                                 }
 			}
                 }
+		if ($this->Checksplit(5, $row))
+			$factor = 1;
 
 		/*
 		 * During tertiary fermentation: fermentables, hop, yeast, misc
@@ -456,14 +481,14 @@
                 }
 		foreach($ferms as $item1) {
                         if ($item1['f_added'] == 3) {
-                                $s = sprintf("%.3f",$item1['f_amount']).' kg `';
+                                $s = sprintf("%.3f",$item1['f_amount']*$factor).' kg `';
                                 $s .= iconv('UTF-8','windows-1252',$item1['f_name']).'` toevoegen';
                                 $this->Checkline($s);
                         }
                 }
 		foreach($hops as $item2) {
                         if ($item2['h_useat'] == 5) {
-                                $s = sprintf("%.1f",$item2['h_amount']*1000).' gr `';
+                                $s = sprintf("%.1f",$item2['h_amount']*$factor*1000).' gr `';
                                 $s .= iconv('UTF-8','windows-1252',$item2['h_name']).'` voor ';
 				$s .= sprintf("%.0f",$item2['h_time']/1440).' dagen toevoegen';
                                 $this->Checkline($s);
@@ -472,12 +497,12 @@
 		foreach ($yeasts as $item4) {
                         if ($item4['y_use'] == 2) {
                                 if ($item4['y_form'] == 0) { // Liquid
-                                        $s = $item4['y_amount'].' pak '.$item4['y_product_id'].', '.$item4['y_name'].' gist (eventueel met starter)';
+                                        $s = ($item4['y_amount']*$factor).' pak '.$item4['y_product_id'].', '.$item4['y_name'].' gist (eventueel met starter)';
                                 } else if ($item4['y_form'] == 1) { // Dry
-                                        $s = sprintf("%.1f",$item4['y_amount']*1000).' gram '.$item4['y_product_id'].', '.$item4['y_name'];
+                                        $s = sprintf("%.1f",$item4['y_amount']*$factor*1000).' gram '.$item4['y_product_id'].', '.$item4['y_name'];
                                         $s .= ' gist';
                                 } else { // Slant/Culture/Frozen/Bottle
-                                        $s = sprintf("%.0f",$item4['y_amount']*1000).' ml '.$item4['y_product_id'].', '.$item4['y_name'];
+                                        $s = sprintf("%.0f",$item4['y_amount']*$factor*1000).' ml '.$item4['y_product_id'].', '.$item4['y_name'];
 					$s .= ' gist (eventueel met starter)';
                                 }
 				$this->Checkline($s);
@@ -486,12 +511,14 @@
 		foreach($miscs as $item3) {
                         if ($item3['m_use_use'] == 4) {
 				$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
-                                $s = sprintf("%.1f",$item3['m_amount']*1000).$unit.'`';
+                                $s = sprintf("%.1f",$item3['m_amount']*$factor*1000).$unit.'`';
                                 $s .= iconv('UTF-8','windows-1252',$item3['m_name']).'` voor ';
 				$s .= sprintf("%.0f",$item3['m_time']/1440).' dagen toevoegen';
                                 $this->Checkline($s);
                         }
                 }
+		if ($this->Checksplit(6, $row))
+			$factor = 1;
 
 		/*
 		 * During packaging: fermentables, yeast, misc
@@ -520,18 +547,18 @@
                 }
 		foreach($ferms as $item1) {
                         if ($item1['f_added'] == 4) {
-                                $s = sprintf("%.3f",$item1['f_amount']).' kg `';
+                                $s = sprintf("%.3f",$item1['f_amount']*$factor).' kg `';
                                 $s .= iconv('UTF-8','windows-1252',$item1['f_name']).'`';
 				if ($row['bottle_priming_water'] > 0)
-					$s .= ' met '.sprintf("%.3f",$row['bottle_priming_water']).' liter water';
+					$s .= ' met '.sprintf("%.3f",$row['bottle_priming_water']*$factor).' liter water';
 				$s .= ' bij bottelen';
                                 $this->Checkline($s);
                         }
 			if ($item1['f_added'] == 5) {
-                                $s = sprintf("%.3f",$item1['f_amount']).' kg `';
+                                $s = sprintf("%.3f",$item1['f_amount']*$factor).' kg `';
                                 $s .= iconv('UTF-8','windows-1252',$item1['f_name']).'`';
 				if ($row['keg_priming_water'] > 0)
-					$s .= ' met '.sprintf("%.3f",$row['keg_priming_water']).' liter water';
+					$s .= ' met '.sprintf("%.3f",$row['keg_priming_water']*$factor).' liter water';
 				$s .= ' bij op fust zetten';
                                 $this->Checkline($s);
                         }
@@ -541,9 +568,9 @@
                                 if ($item4['y_form'] == 0) { // Liquid
                                         $s = '`'.$item4['y_product_id'].', '.$item4['y_name'];
                                 } else if ($item4['y_form'] == 1) { // Dry
-                                        $s = sprintf("%.1f",$item4['y_amount']*1000).' gram `'.$item4['y_product_id'].', '.$item4['y_name'];
+                                        $s = sprintf("%.1f",$item4['y_amount']*$factor*1000).' gram `'.$item4['y_product_id'].', '.$item4['y_name'];
                                 } else { // Slant/Culture/Frozen/Bottle
-                                        $s = sprintf("%.0f",$item4['y_amount']*1000).' ml `'.$item4['y_product_id'].', '.$item4['y_name'];
+                                        $s = sprintf("%.0f",$item4['y_amount']*$factor*1000).' ml `'.$item4['y_product_id'].', '.$item4['y_name'];
                                 }
 				$s .= '` als bottelgist';
 				$this->Checkline($s);
@@ -552,13 +579,12 @@
 		foreach($miscs as $item3) {
                         if ($item3['m_use_use'] == 5) {
 				$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
-                                $s = sprintf("%.1f",$item3['m_amount']*1000).$unit.'`';
+                                $s = sprintf("%.1f",$item3['m_amount']*$factor*1000).$unit.'`';
                                 $s .= iconv('UTF-8','windows-1252',$item3['m_name']).'` bij bottelen toevoegen';
                                 $this->Checkline($s);
                         }
                 }
 	}
-
 }
 
 
@@ -567,7 +593,7 @@
 	function Header() {
 		global $row;
 		global $prdate;
-		$stage = array( 'Plan', 'Wacht', 'Brouwen', 'Hoofdgisting', 'Nagisting', 'Lagering', 'Afvullen', 'Hergisten', 'Rijpen', 'Proeven', 'Gereed', 'Afgesloten' );
+		global $stage;
 		$this->Image('images/logo.png',10,10,30);
 		// Title
 		$this->SetFont('Helvetica','B',18);
@@ -584,7 +610,13 @@
 		$this->SetX(45);
 		$this->Cell(17,5,'Fase:',0,0,'L');
 		$this->Cell(0,5,$stage[$row['stage']],0,1,'L');
-		$this->Ln(6);
+		$this->SetX(45);
+                $this->Cell(17,5,'Batch:',0,0,'L');
+                if ($row['divide_parts'] == 0)
+                        $this->Cell(0,5,"Niet gespitst",0,1,'L');
+                else
+                        $this->Cell(0,5,"Split batch ".($row['divide_part'] + 1)." van ".($row['divide_parts'] + 1),0,1,'L');
+                $this->Ln(2);
 		// Ensure table header is printed
 		parent::Header();
 	}
--- a/www/prod_forum.php	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/prod_forum.php	Mon Oct 28 19:55:42 2019 +0100
@@ -94,6 +94,8 @@
 itemline("Geschat alcohol", sprintf("%.1f",$row['est_abv']).'% vol');
 itemline("Kleur (" . $colormethod[$row['color_method']] . ")", $row['est_color'] . ' EBC');
 itemline("Bitterheid (" . $ibumethod[$row['ibu_method']] . ")", $row['est_ibu'] . ' IBU');
+if ($row['divide_parts'])
+    itemline("Split batch (".$splitat[$row['divide_type']].")", ($row['divide_part'] + 1)." van ".($row['divide_parts'] + 1));
 echo PHP_EOL . PHP_EOL;
 
 $sugarsm = 0;
--- a/www/prod_print.php	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/prod_print.php	Mon Oct 28 19:55:42 2019 +0100
@@ -39,6 +39,9 @@
 $bottle_sugar_amount = 0;
 $keg_sugar_amount = 0;
 
+$divide_parts = $row['divide_parts'];
+$divide_part = $row['divide_part'];
+$divide_factor = floatval($row['divide_factor']);
 
 class PDF_MySQL_Table extends FPDF
 {
@@ -67,6 +70,10 @@
 
 	function TableGlobal($row) {
 		global $recipetype;
+                global $divide_parts;
+                global $divide_part;
+		global $divide_factor;
+		global $splitat;
 		/* 2 Columns */
 		$vul = $this->w - $this->rMargin - $this->lMargin - 160;
 		$cMargin=$this->cMargin;
@@ -82,11 +89,14 @@
 		$this->SetFillColor(210,245,255);
 
 		$this->SetX($this->TableX);
-		$this->Cell(35,5,'Type',0,0,'L',true);
+		$this->Cell(35,5,'Brouw type',0,0,'L',true);
 		$this->Cell(45,5,$recipetype[$row['type']],0,0,'L',true);
 		$this->Cell($vul,5,'',0,0,'L',false);
 		$this->Cell(35,5,'Batch grootte',0,0,'L',true);
-		$this->Cell(45,5,$row['batch_size'].' liter',0,0,'L',true);
+		if ($divide_parts == 0)
+			$this->Cell(45,5,$row['batch_size'].' liter',0,0,'L',true);
+		else
+			$this->Cell(45,5,$row['batch_size'].' van '.($row['batch_size'] * (1 / $divide_factor)).' liter',0,0,'L',true);
 		$this->Ln();
 
 		$this->SetX($this->TableX);
@@ -105,6 +115,13 @@
 		$this->Cell(45,5,$row['eq_name'],0,0,'L',true);
 		$this->Ln();
 
+		if ($divide_parts) {
+                	$this->SetX($this->TableX);
+                	$this->Cell(35,5,'Batch splits moment',0,0,'L',true);
+                	$this->Cell(45,5,$splitat[$row['divide_type']],0,0,'L',true);
+                	$this->Ln();
+		}
+
 		$this->cMargin=$cMargin;
 	}
 
@@ -155,7 +172,7 @@
 			$color    = floatval($item['f_color']);
 			$percent  = floatval($item['f_percentage']);
 
-			if ($item['f_type'] == 1)			// Sugar
+			if ($item['f_type'] == 1)		// Sugar
 				$pSugar += $percent;
 			if ($item['f_graintype'] == 2)		// Crystal
 				$pCara += $percent;
@@ -1095,6 +1112,8 @@
 		global $row;
 		global $prdate;
 		global $stage;
+		global $divide_parts;
+		global $divide_part;
 		$this->Image('images/logo.png',10,10,30);
 		// Title
 		$this->SetFont('Helvetica','B',18);
@@ -1111,7 +1130,13 @@
 		$this->SetX(45);
 		$this->Cell(17,5,'Fase:',0,0,'L');
 		$this->Cell(0,5,$stage[$row['stage']],0,1,'L');
-		$this->Ln(6);
+		$this->SetX(45);
+                $this->Cell(17,5,'Batch:',0,0,'L');
+		if ($divide_parts == 0)
+			$this->Cell(0,5,"Niet gespitst",0,1,'L');
+		else
+			$this->Cell(0,5,"Split batch ".($divide_part + 1)." van ".($divide_parts + 1),0,1,'L');
+		$this->Ln(2);
 		// Ensure table header is printed
 		parent::Header();
 	}
--- a/www/rec_toproduct.php	Mon Oct 28 13:44:12 2019 +0100
+++ b/www/rec_toproduct.php	Mon Oct 28 19:55:42 2019 +0100
@@ -46,8 +46,8 @@
 $sql .= "', eq_kettle_height='20', eq_mash_volume='18', eq_mash_max='6', eq_efficiency='75";
 // brewdate
 $sql .= "', brew_date_start=NULL, brew_mash_ph='0.0', brew_mash_sg='1.000";
-$sql .= "', brew_sparge_ph='0.0";
-$sql .= "', brew_preboil_volume='0', brew_preboil_sg='0', brew_preboil_ph='0.0";
+$sql .= "', brew_mash_efficiency='0.0', brew_sparge_ph='0.0', brew_sparge_temperature='85.0";
+$sql .= "', brew_preboil_volume='0', brew_preboil_sg='0', brew_preboil_ph='0.0', brew_preboil_efficiency='0";
 $sql .= "', brew_aboil_volume='0', brew_aboil_sg='0', brew_aboil_ph='0.0', brew_aboil_efficiency='0";
 $sql .= "', brew_cooling_method='0', brew_cooling_time='0', brew_cooling_to='20";
 $sql .= "', brew_whirlpool9='0', brew_whirlpool7='0', brew_whirlpool6='0', brew_whirlpool2='0";
@@ -134,12 +134,28 @@
 $sql .= "', w2_total_alkalinity='" . $row['w2_total_alkalinity'];
 $sql .= "', w2_ph='" . $row['w2_ph'];
 $sql .= "', w2_cost='" . $row['w2_cost'];
+$sql .= "', wg_amount='" . $row['wg_amount'];
+$sql .= "', wg_calcium='" . $row['wg_calcium'];
+$sql .= "', wg_sulfate='" . $row['wg_sulfate'];
+$sql .= "', wg_chloride='" . $row['wg_chloride'];
+$sql .= "', wg_sodium='" . $row['wg_sodium'];
+$sql .= "', wg_magnesium='" . $row['wg_magnesium'];
+$sql .= "', wg_total_alkalinity='" . $row['wg_total_alkalinity'];
+$sql .= "', wg_ph='" . $row['wg_ph'];
+$sql .= "', wb_calcium='" . $row['wb_calcium'];
+$sql .= "', wb_sulfate='" . $row['wb_sulfate'];
+$sql .= "', wb_chloride='" . $row['wb_chloride'];
+$sql .= "', wb_sodium='" . $row['wb_sodium'];
+$sql .= "', wb_magnesium='" . $row['wb_magnesium'];
+$sql .= "', wb_total_alkalinity='" . $row['wb_total_alkalinity'];
+$sql .= "', wb_ph='" . $row['wb_ph'];
 $sql .= "', wa_acid_name='" . $row['wa_acid_name'];
 $sql .= "', wa_acid_perc='" . $row['wa_acid_perc'];
 $sql .= "', wa_base_name='" . $row['wa_base_name'];
 $sql .= "', starter_enable='0', starter_type='0', starter_sg='1.037', starter_viability='97";
 $sql .= "', prop1_type='0', prop1_volume='0', prop2_type='0', prop2_volume='0";
 $sql .= "', prop3_type='0', prop3_volume='0', prop4_type='0', prop4_volume='0";
+$sql .= "', divide_type='0', divide_parts='0', divide_part='0', divide_size='0', divide_factor='1.0";
 $sql .= "', json_fermentables='" . str_replace($rescapers,$rreplacements,$row['json_fermentables']);
 $sql .= "', json_hops='" . str_replace($rescapers,$rreplacements,$row['json_hops']);
 $sql .= "', json_miscs='" . str_replace($rescapers,$rreplacements,$row['json_miscs']);

mercurial