Thu, 20 Jun 2019 13:55:12 +0200
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>