Added packaging volume and add water or liquer to the beer after fermentation. Auto divide changing volumes between bottles and fusts. Upgrade the database in the crontask. Added these fields to the packaging tab screen.

Thu, 20 Jun 2019 13:55:12 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 20 Jun 2019 13:55:12 +0200
changeset 419
99a7f2a6976e
parent 416
0c719ea7e680
child 420
3df93a77cd1d

Added packaging volume and add water or liquer to the beer after fermentation. Auto divide changing volumes between bottles and fusts. Upgrade the database in the crontask. Added these fields to the packaging tab screen.

README.design file | annotate | diff | comparison | revisions
www/crontasks.php file | annotate | diff | comparison | revisions
www/includes/db_product.php file | annotate | diff | comparison | revisions
www/js/prod_edit.js file | annotate | diff | comparison | revisions
www/prod_edit.php file | annotate | diff | comparison | revisions
--- a/README.design	Sat Jun 15 19:41:44 2019 +0200
+++ b/README.design	Thu Jun 20 13:55:12 2019 +0200
@@ -18,3 +18,13 @@
 
 Popups in de editors met rekenhulpjes.
 
+Packaging: water dilutition and liquer infusion.
+  Calculate final SG, EBC and IBU.
+    package_volume,
+    package_infuse_amount, package_infuse_abv,
+    package_infuse_notes.
+    package_abv
+  Calculate water for priming sugare effect. 1 SG point?
+    bottle_priming_water (to sugar mix)
+    keg_priming_water
+
--- a/www/crontasks.php	Sat Jun 15 19:41:44 2019 +0200
+++ b/www/crontasks.php	Thu Jun 20 13:55:12 2019 +0200
@@ -15,6 +15,17 @@
 
 
 /*
+ * Upgrade package values.
+ */
+$query = "UPDATE products SET package_volume = bottle_amount + keg_amount WHERE package_volume='0';";
+$result = mysqli_query($connect, $query);
+$changed = mysqli_affected_rows($connect);
+if ($changed > 0) {
+        syslog(LOG_NOTICE, "Updated ".$changed." products to new package_volume value");
+}
+
+
+/*
  * Upgrade inventory_reduced value from old boolean to tiny integer value.
  */
 $query = "UPDATE products SET inventory_reduced=stage WHERE inventory_reduced = 1";
--- a/www/includes/db_product.php	Sat Jun 15 19:41:44 2019 +0200
+++ b/www/includes/db_product.php	Thu Jun 20 13:55:12 2019 +0200
@@ -127,14 +127,19 @@
 		$sql .= "', package_date=NULL";
 	else
 		$sql .= "', package_date='" . $_POST['package_date'] ."'";
-	$sql .=  ", bottle_amount='" . $_POST['bottle_amount'];
+	$sql .=  ", package_volume='" . $_POST['package_volume'];
+	$sql .= "', package_infuse_amount='" . $_POST['package_infuse_amount'];
+	$sql .= "', package_infuse_abv='" . $_POST['package_infuse_abv'];
+	$sql .= "', package_infuse_notes='" . mysqli_real_escape_string($connect, $_POST['package_infuse_notes']);
+	$sql .= "', package_abv='" . $_POST['package_abv'];
+	$sql .= "', bottle_amount='" . $_POST['bottle_amount'];
 	$sql .= "', bottle_carbonation='" . $_POST['bottle_carbonation'];
-	//$sql .= "', bottle_priming_sugar='" . $_POST['bottle_priming_sugar'];
+	$sql .= "', bottle_priming_water='" . $_POST['bottle_priming_water'];
 	$sql .= "', bottle_priming_amount='" . $_POST['bottle_priming_amount'];
 	$sql .= "', bottle_carbonation_temp='" . $_POST['bottle_carbonation_temp'];
 	$sql .= "', keg_amount='" . $_POST['keg_amount'];
 	$sql .= "', keg_carbonation='" . $_POST['keg_carbonation'];
-	//$sql .= "', keg_priming_sugar='" . $_POST['keg_priming_sugar'];
+	$sql .= "', keg_priming_water='" . $_POST['keg_priming_water'];
 	$sql .= "', keg_priming_amount='" . $_POST['keg_priming_amount'];
 	$sql .= "', keg_carbonation_temp='" . $_POST['keg_carbonation_temp'];
 	$sql .= "', keg_forced_carb='" . $_POST['keg_forced_carb'];
@@ -711,14 +716,19 @@
 		$brew .= ',"secondary_end_date":"' . $row['secondary_end_date'];
 		$brew .= '","tertiary_temp":' . floatval($row['tertiary_temp']);
 		$brew .= ',"package_date":"' . $row['package_date'];
-		$brew .= '","bottle_amount":' . floatval($row['bottle_amount']);
+		$brew .= '","package_volume":' . floatval($row['package_volume']);
+		$brew .= ',"package_infuse_amount":' . floatval($row['package_infuse_amount']);
+		$brew .= ',"package_infuse_abv":' . floatval($row['package_infuse_abv']);
+		$brew .= ',"package_infuse_notes":"' . $row['package_infuse_notes'];
+		$brew .= '","package_abv":' . floatval($row['package_abv']);
+		$brew .= ',"bottle_amount":' . floatval($row['bottle_amount']);
 		$brew .= ',"bottle_carbonation":' . floatval($row['bottle_carbonation']);
-		//$brew .= ',"bottle_priming_sugar":' . $row['bottle_priming_sugar'];
+		$brew .= ',"bottle_priming_water":' . $row['bottle_priming_water'];
 		$brew .= ',"bottle_priming_amount":' . floatval($row['bottle_priming_amount']);
 		$brew .= ',"bottle_carbonation_temp":' . floatval($row['bottle_carbonation_temp']);
 		$brew .= ',"keg_amount":' . floatval($row['keg_amount']);
 		$brew .= ',"keg_carbonation":' . floatval($row['keg_carbonation']);
-		//$brew .= ',"keg_priming_sugar":' . $row['keg_priming_sugar'];
+		$brew .= ',"keg_priming_water":' . $row['keg_priming_water'];
 		$brew .= ',"keg_priming_amount":' . floatval($row['keg_priming_amount']);
 		$brew .= ',"keg_carbonation_temp":' . floatval($row['keg_carbonation_temp']);
 		$brew .= ',"keg_forced_carb":' . floatval($row['keg_forced_carb']);
--- a/www/js/prod_edit.js	Sat Jun 15 19:41:44 2019 +0200
+++ b/www/js/prod_edit.js	Thu Jun 20 13:55:12 2019 +0200
@@ -1836,7 +1836,20 @@
 			var ABV = abvol(dataRecord.brew_fermenter_sg, parseFloat($("#est_fg").jqxNumberInput('decimal')));
 		else
 			var ABV = abvol(dataRecord.brew_fermenter_sg, dataRecord.fg);
-		ABV = Math.round(ABV * 100) / 100;
+
+		/*
+		 * Calculate new volume and alcohol.
+		 */
+		var bvol = dataRecord.package_volume - (ABV * dataRecord.package_volume) / 100;
+		var balc = dataRecord.package_volume - bvol;
+		var mvol = dataRecord.package_infuse_amount - (dataRecord.package_infuse_abv * dataRecord.package_infuse_amount) / 100;
+		var malc = dataRecord.package_infuse_amount - mvol;
+		var talc = balc + malc;
+		var tvol = bvol + mvol;
+		ABV = Math.round(talc / (tvol + talc) * 10000) / 100;
+		//console.log("bvol:"+bvol+" balc:"+balc+" mvol:"+mvol+" malc:"+malc+" tvol:"+tvol+" talc:"+talc+" abv:"+ABV+" vol:"+(tvol + talc));
+		dataRecord.package_abv = ABV;
+		$("#package_abv").val(ABV);
 
 		console.log("calcCarbonation() TSec:"+TSec+"  ABV:"+ABV);
 		if (!(rows = $('#fermentableGrid').jqxGrid('getrows'))) {
@@ -2374,12 +2387,70 @@
 
 		calcFermentation();
 		calcCarbonation();
+		$('#package_volume').on('change', function (event) {
+			var told = dataRecord.package_volume + dataRecord.package_infuse_amount;
+			dataRecord.package_volume = parseFloat(event.args.value);
+			if (dataRecord.package_volume > dataRecord.brew_fermenter_volume) {
+				dataRecord.package_volume = dataRecord.brew_fermenter_volume;
+				$('#package_volume').val(dataRecord.package_volume);
+			}
+			var tnew = dataRecord.package_volume + dataRecord.package_infuse_amount;
+			var diff = tnew - told;
+			if (told > 0) {
+				dataRecord.bottle_amount += (dataRecord.bottle_amount / told) * diff;
+				dataRecord.keg_amount += (dataRecord.keg_amount / told) * diff;
+			} else {
+				dataRecord.bottle_amount = tnew;
+				dataRecord.keg_amount = 0;
+			}
+			console.log("diff:"+diff+" old:"+told+" bottle:"+dataRecord.bottle_amount+" keg:"+dataRecord.keg_amount);
+			$('#bottle_amount').val(parseFloat(dataRecord.bottle_amount * 1000) / 1000);
+			$('#keg_amount').val(parseFloat(dataRecord.keg_amount * 1000) / 1000);
+			calcCarbonation();
+		});
+		$('#package_infuse_amount').on('change', function (event) {
+			var told = dataRecord.package_volume + dataRecord.package_infuse_amount;
+                        dataRecord.package_infuse_amount = parseFloat(event.args.value);
+			var tnew = dataRecord.package_volume + dataRecord.package_infuse_amount;
+                        var diff = tnew - told;
+			if (told > 0) {
+                        	dataRecord.bottle_amount += (dataRecord.bottle_amount / told) * diff;
+                        	dataRecord.keg_amount += (dataRecord.keg_amount / told) * diff;
+			} else {
+				dataRecord.bottle_amount = tnew;
+				dataRecord.keg_amount = 0;
+			}
+                        console.log("diff:"+diff+" old:"+told+" bottle:"+dataRecord.bottle_amount+" keg:"+dataRecord.keg_amount);
+                        $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount * 1000) / 1000);
+                        $('#keg_amount').val(parseFloat(dataRecord.keg_amount * 1000) / 1000);
+                        calcCarbonation();
+                });
+		$('#package_infuse_abv').on('change', function (event) {
+                        dataRecord.package_infuse_abv = parseFloat(event.args.value);
+                        calcCarbonation();
+                });
 		$('#bottle_amount').on('change', function (event) {
-			dataRecord.bottle_amount = parseFloat(event.args.value);
+			var vnew = parseFloat(event.args.value);
+			var vtot = dataRecord.package_volume + dataRecord.package_infuse_amount;
+			if (vnew > vtot)
+				vnew = vtot;
+			diff = dataRecord.bottle_amount - vnew;
+			dataRecord.bottle_amount = Math.round((dataRecord.bottle_amount - diff) * 1000) / 1000;
+			dataRecord.keg_amount = Math.round((dataRecord.keg_amount + diff) * 1000) / 1000;
+			$('#bottle_amount').val(parseFloat(dataRecord.bottle_amount));
+			$('#keg_amount').val(parseFloat(dataRecord.keg_amount));
 			calcCarbonation();
 		});
 		$('#keg_amount').on('change', function (event) {
-			dataRecord.keg_amount = parseFloat(event.args.value);
+			var vnew = parseFloat(event.args.value);
+			var vtot = dataRecord.package_volume + dataRecord.package_infuse_amount;
+			if (vnew > vtot)
+				vnew = vtot;
+			diff = dataRecord.keg_amount - vnew;
+			dataRecord.bottle_amount = Math.round((dataRecord.bottle_amount + diff) * 1000) / 1000;
+                        dataRecord.keg_amount = Math.round((dataRecord.keg_amount - diff) * 1000) / 1000;
+			$('#bottle_amount').val(parseFloat(dataRecord.bottle_amount));
+			$('#keg_amount').val(parseFloat(dataRecord.keg_amount));
 			calcCarbonation();
 		});
 		$('#bottle_carbonation').on('change', function (event) {
@@ -2664,14 +2735,19 @@
 			secondary_end_date: $("#secondary_end_date").val(),
 			tertiary_temp: parseFloat($("#tertiary_temp").jqxNumberInput('decimal')),
 			package_date: $("#package_date").val(),
+			package_volume: parseFloat($("#package_volume").jqxNumberInput('decimal')),
+			package_infuse_amount: parseFloat($("#package_infuse_amount").jqxNumberInput('decimal')),
+			package_infuse_abv: parseFloat($("#package_infuse_abv").jqxNumberInput('decimal')),
+			package_infuse_notes: $("#package_infuse_notes").val(),
+			package_abv: parseFloat($("#package_abv").jqxNumberInput('decimal')),
 			bottle_amount: parseFloat($("#bottle_amount").jqxNumberInput('decimal')),
 			bottle_carbonation: parseFloat($("#bottle_carbonation").jqxNumberInput('decimal')),
-			//bottle_priming_sugar: $("#bottle_priming_sugar").val(),
+			bottle_priming_water: $("#bottle_priming_water").val(),
 			bottle_priming_amount: parseFloat($("#bottle_priming_amount").jqxNumberInput('decimal')),
 			bottle_carbonation_temp: parseFloat($("#bottle_carbonation_temp").jqxNumberInput('decimal')),
 			keg_amount: parseFloat($("#keg_amount").jqxNumberInput('decimal')),
 			keg_carbonation: parseFloat($("#keg_carbonation").jqxNumberInput('decimal')),
-			//keg_priming_sugar: $("#keg_priming_sugar").val(),
+			keg_priming_water: $("#keg_priming_water").val(),
 			keg_priming_amount: parseFloat($("#keg_priming_amount").jqxNumberInput('decimal')),
 			keg_carbonation_temp: parseFloat($("#keg_carbonation_temp").jqxNumberInput('decimal')),
 			keg_forced_carb: dataRecord.keg_forced_carb,
@@ -2887,14 +2963,19 @@
 			{ name: 'secondary_end_date', type: 'string' },
 			{ name: 'tertiary_temp', type: 'float' },
 			{ name: 'package_date', type: 'string' },
+			{ name: 'package_volume', type: 'float' },
+			{ name: 'package_infuse_amount', type: 'float' },
+			{ name: 'package_infuse_abv', type: 'float' },
+			{ name: 'package_infuse_notes', type: 'string' },
+			{ name: 'package_abv', type: 'float' },
 			{ name: 'bottle_amount', type: 'float' },
 			{ name: 'bottle_carbonation', type: 'float' },
-			//{ name: 'bottle_priming_sugar', type: 'int' },
+			{ name: 'bottle_priming_water', type: 'int' },
 			{ name: 'bottle_priming_amount', type: 'float' },
 			{ name: 'bottle_carbonation_temp', type: 'float' },
 			{ name: 'keg_amount', type: 'float' },
 			{ name: 'keg_carbonation', type: 'float' },
-			//{ name: 'keg_priming_sugar', type: 'int' },
+			{ name: 'keg_priming_water', type: 'int' },
 			{ name: 'keg_priming_amount', type: 'float' },
 			{ name: 'keg_carbonation_temp', type: 'float' },
 			{ name: 'keg_forced_carb', type: 'int' },
@@ -3091,14 +3172,19 @@
 			$("#secondary_end_date").val(dataRecord.secondary_end_date);
 			$("#tertiary_temp").val(dataRecord.tertiary_temp);
 			$("#package_date").val(dataRecord.package_date);
+			$("#package_volume").val(dataRecord.package_volume);
+			$("#package_infuse_amount").val(dataRecord.package_infuse_amount);
+			$("#package_infuse_abv").val(dataRecord.package_infuse_abv);
+			$("#package_infuse_notes").val(dataRecord.package_infuse_notes);
+			$("#package_abv").val(dataRecord.package_abv);
 			$("#bottle_amount").val(dataRecord.bottle_amount);
 			$("#bottle_carbonation").val(dataRecord.bottle_carbonation);
-			//$("#bottle_priming_sugar").val(dataRecord.bottle_priming_sugar);
+			$("#bottle_priming_water").val(dataRecord.bottle_priming_water);
 			$("#bottle_priming_amount").val(dataRecord.bottle_priming_amount);
 			$("#bottle_carbonation_temp").val(dataRecord.bottle_carbonation_temp);
 			$("#keg_amount").val(dataRecord.keg_amount);
 			$("#keg_carbonation").val(dataRecord.keg_carbonation);
-			//$("#keg_priming_sugar").val(dataRecord.keg_priming_sugar);
+			$("#keg_priming_water").val(dataRecord.keg_priming_water);
 			$("#keg_priming_amount").val(dataRecord.keg_priming_amount);
 			$("#keg_carbonation_temp").val(dataRecord.keg_carbonation_temp);
 			$("#keg_forced_carb").val(dataRecord.keg_forced_carb);
@@ -5697,6 +5783,16 @@
 	$("#package_date").jqxTooltip({ content: 'De verpakkings datum van dit bier.' });
 	$("#package_date").jqxDateTimeInput( Dateopts );
 	$('#package_date').on('close', function (event) { calcStage(); });
+	$('#package_volume').jqxTooltip({ content: 'Het beschikbare volume om te bottelen of op fust te zetten.' });
+	$('#package_volume').jqxNumberInput( Spin1dec );
+	$('#package_infuse_amount').jqxTooltip({ content: 'De hoeveelheid water of drank extra toe te voegen.' });
+	$('#package_infuse_amount').jqxNumberInput( Spin3dec );
+	$('#package_infuse_abv').jqxTooltip({ content: 'De hoeveelheid alcohol in de drank, of 0.0 als het water is.' });
+	$('#package_infuse_abv').jqxNumberInput( Spin1dec );
+	$('#package_infuse_notes').jqxTooltip({ content: 'Omschrijving van de extra toevoeging.' });
+	$('#package_infuse_notes').jqxInput({ theme: theme, width: 640, height: 23 });
+	$('#package_abv').jqxTooltip({ content: 'De uiteindelijke hoeveelheid alcohol volume %.' });
+	$('#package_abv').jqxNumberInput( Show1dec );
 	$("#st_carb_min2").jqxTooltip({ content: 'Het minimum aanbevolen koolzuur volume voor deze bierstijl.'});
 	$("#st_carb_min2").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 1, readOnly: true });
 	$("#st_carb_max2").jqxTooltip({ content: 'Het maximum aamnevolen koolzuur volume voor deze bierstijl.'});
@@ -5820,9 +5916,13 @@
                 }
         });
 	$("#bottle_priming_amount").jqxNumberInput( Show1dec );
+	$("#bottle_priming_water").jqxTooltip({ content: 'De hoeveelheid water om de suiker op te lossen.' });
+	$("#bottle_priming_water").jqxNumberInput( Spin3dec );
 	$("#keg_priming_amount").jqxNumberInput( Show1dec );
+	$("#keg_priming_water").jqxTooltip({ content: 'De hoeveelheid water om de suiker op te lossen.' });
+	$("#keg_priming_water").jqxNumberInput( Spin3dec );
 	$("#bottle_priming_total").jqxNumberInput( Show1dec );
-	$("#bottle_pressure").jqxTooltip({ content: 'De maximal te verwachten druk tijdens het hergisten.' });
+	$("#bottle_pressure").jqxTooltip({ content: 'De maximaal te verwachten druk tijdens het hergisten.' });
 	$("#bottle_pressure").jqxNumberInput( Show1dec );
 	$("#keg_priming_total").jqxNumberInput( Show1dec );
 	$("#keg_forced_carb").jqxCheckBox({ theme: theme, width: 120, height: 23 });
--- a/www/prod_edit.php	Sat Jun 15 19:41:44 2019 +0200
+++ b/www/prod_edit.php	Thu Jun 20 13:55:12 2019 +0200
@@ -733,8 +733,32 @@
         <td colspan="4"><hr></td>
        </tr>
        <tr>
+        <th style="text-align: center;" colspan="4">Verdunnen of infusie</th>
+       </tr>
+       <tr>
+        <td style="vertical-align: top; float: right; padding: 3px;">Volume na vergisting l:</td>
+        <td align="left" colspan="3" style="vertical-align: top;"><div id="package_volume"></div></td>
+       </tr>
+       <tr>
+        <td style="vertical-align: top; float: right; padding: 3px;">Toevoeging liter:</td>
+        <td align="left" style="vertical-align: top;"><div id="package_infuse_amount"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Toevoeging ABV %:</td>
+        <td align="left" style="vertical-align: top;"><div id="package_infuse_abv"></div></td>
+       </tr>
+       <tr>
+        <td style="vertical-align: top; float: right; padding: 3px;">Toevoeging omschrijving:</td>
+        <td align="left" colspan="3" style="vertical-align: top; padding: 3px;"><input id="package_infuse_notes" /></td>
+       </tr>
+       <tr>
+        <td style="vertical-align: top; float: right; padding: 3px;">Finaal alcohol %:</td>
+        <td align="left" colspan="3" style="vertical-align: top;"><div id="package_abv"></div></td>
+       </tr>
+       <tr>
+        <td colspan="4"><hr></td>
+       </tr>
+       <tr>
         <th style="text-align: center;" colspan="2">Flessen</th>
-        <th style="text-align: center;" colspan="2">Kegs</th>
+        <th style="text-align: center;" colspan="2">Fusten</th>
        </tr>
        <tr>
         <td style="vertical-align: top; float: right; padding: 3px;">Hoeveelheid liter:</td>
@@ -767,6 +791,12 @@
         <td align="left" style="vertical-align: top;"><div id="keg_priming_total"></div></td>
        </tr>
        <tr>
+        <td style="vertical-align: top; float: right; padding: 3px;">Suikeroplossing water l:</td>
+        <td align="left" style="vertical-align: top;"><div id="bottle_priming_water"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Suikeroplossing water l:</td>
+        <td align="left" style="vertical-align: top;"><div id="keg_priming_water"></div></td>
+       </tr>
+       <tr>
         <td colspan="2"></td>
         <td style="vertical-align: top; float: right; padding: 3px;">Op druk brengen met CO2:</td>
         <td align="left" style="vertical-align: top;"><div id="keg_forced_carb"></div></td>

mercurial