Sat, 11 May 2019 23:13:40 +0200
Added flags for each ingredient group for the supplies state. On the main screen show the state of the supplies if the product stage is not yet packaged. Calculate the state of the supplies for fermentables, hops, yeasts and miscs. In the grids don't show the inventory values after they are used and reduced. On the fermentables tab show the weight of the grains to mash.
www/js/prod_edit.js | file | annotate | diff | comparison | revisions | |
www/prod_edit.php | file | annotate | diff | comparison | revisions |
--- a/www/js/prod_edit.js Sat May 11 17:25:58 2019 +0200 +++ b/www/js/prod_edit.js Sat May 11 23:13:40 2019 +0200 @@ -57,6 +57,12 @@ var pitchrate = 0.75; // Yeast pitch rate default var initcells = 0; // Initial yeast cell count + var ok_fermentables = 1; // Fermentables are in stock + var ok_hops = 1; // Hops are in stock + var ok_miscs = 1; // Miscs are in stock + var ok_yeasts = 1; // Yeasts are in stock + var ok_waters = 1; // Waters are in stock + var hop_flavour = 0; var hop_aroma = 0; var mash_infuse = 0; @@ -104,18 +110,31 @@ theme: theme }); + function calcSupplies() { + + if (dataRecord.inventory_reduced > 6) { + $("#ok_pmpt").hide(); + return; + } + if (ok_fermentables && ok_hops && ok_miscs && ok_yeasts && ok_waters) + $("#ok_supplies").html("<img src='images/dialog-ok-apply.png'>"); + else + $("#ok_supplies").html("<img src='images/dialog-error.png'>"); + } + /* * All calculations that depend on changes in the fermentables, * volumes and equipments. */ function calcFermentables() { - console.log("calcFermentables()"); var sugarsf = 0; // fermentable sugars mash + boil var sugarsm = 0; // fermentable sugars in mash psugar = 0; pcara = 0; mashkg = 0; + ok_fermentables = 1; // All is in stock. + ok_yeasts = 1; var vol = 0; // Volume sugars after boil var addedS = 0; // Added sugars after boil var addedmass = 0; // Added mass after boil @@ -170,7 +189,16 @@ vol += (x * sugardensity + (1 - x) * 1) * row.f_amount; } colort += row.f_amount * ebc_to_srm(row.f_color); + // Check supplies. + if ((((dataRecord.inventory_reduced <= 2) && (row.f_added <= 1)) || // Mash or boil + ((dataRecord.inventory_reduced <= 3) && (row.f_added == 2)) || // Primary + ((dataRecord.inventory_reduced <= 5) && (row.f_added == 3)) || // Secondary or Tertiary + ((dataRecord.inventory_reduced <= 6) && (row.f_added == 4))) && row.f_inventory < row.f_amount) { + ok_fermentables = 0; + } } + $("#mash_kg").val(mashkg); + console.log("calcFermentables() supplies:"+ok_fermentables); to_100 = my_100; if (to_100) { $("#wf_amount").jqxNumberInput({ width: 90, readOnly: true, spinButtons: false }); @@ -221,7 +249,6 @@ if (dataRecord.brew_fermenter_volume > 0) { var sug = sg_to_plato(ogx) * dataRecord.brew_fermenter_volume * ogx / 100; //kg of sugar in sug += addedS; //kg - //console.log("Contents ferm_vol:"+dataRecord.brew_fermenter_volume+" top:"+top+" vol:"+vol+" addedS:"+addedS+" addedmass:"+addedmass); if ((dataRecord.brew_fermenter_volume * ogx + addedmass) > 0) { var pt = 100 * sug / (dataRecord.brew_fermenter_volume * ogx + addedmass + top); @@ -234,7 +261,6 @@ var scolor = ebc_to_color(dataRecord.brew_fermenter_color); $("#bcolorf").show(); document.getElementById("bcolorf").style.background= scolor; - //console.log("OG in fermenter:"+dataRecord.brew_fermenter_sg+" color:"+dataRecord.brew_fermenter_color); } } else { // Negative volume @@ -256,7 +282,6 @@ // Progress bars pmalts = mashkg / dataRecord.eq_mash_max * 100; - //console.log("mash kg: "+mashkg+" max: "+dataRecord.eq_mash_max+" perc: "+pmalts); $("#perc_malts").jqxProgressBar('val', pmalts); $("#perc_sugars").jqxProgressBar('val', psugar); $("#perc_cara").jqxProgressBar('val', pcara); @@ -277,7 +302,15 @@ initcells += (parseFloat(row.y_cells) / 1000000) * parseFloat(row.y_amount); } // TODO: brett in secondary ?? + if ((((dataRecord.inventory_reduced <= 3) && (row.y_use == 0)) || // Primary + ((dataRecord.inventory_reduced <= 4) && (row.y_use == 1)) || // Secondary + ((dataRecord.inventory_reduced <= 5) && (row.y_use == 2)) || // Tertiary + ((dataRecord.inventory_reduced <= 6) && (row.y_use == 3))) && // Bottle + (row.y_inventory < row.y_amount)) { + ok_yeasts = 0; + } } + calcSupplies(); if (svg == 0) svg = 77; @@ -297,7 +330,6 @@ // Calculate the final svg if available use the real value. if ((dataRecord.stage >= 6) && (dataRecord.fg > 0.990) && (dataRecord.fg < dataRecord.brew_fermenter_sg)) { svg = 100 * (dataRecord.brew_fermenter_sg - dataRecord.fg) / (dataRecord.brew_fermenter_sg - 1); - //console.log("real svg:"+svg); } $("#yeast_cells").val(initcells); @@ -364,9 +396,7 @@ if (volume <= 0) volume = dataRecord.batch_size - dataRecord.eq_trub_chiller_loss; - //console.log("getNeededYeastCells f:"+f+" volume:"+volume+" plato:"+plato+" sg:"+sg); var result = pitchrate * volume * plato; - //console.log("getNeededYeastCells("+pitchrate+"): "+result+" billion cells"); return result; } @@ -412,6 +442,7 @@ if (!(rows = $('#hopGrid').jqxGrid('getrows'))) { return; } + ok_hops = 1; for (var i = 0; i < rows.length; i++) { var row = rows[i]; total_ibus += toIBU(row.h_useat, row.h_form, preboil_sg, parseFloat(dataRecord.batch_size), @@ -423,6 +454,10 @@ row.h_useat, parseFloat(row.h_amount)); hop_aroma += hopAromaContribution(parseFloat(row.h_time), parseFloat(dataRecord.batch_size), row.h_useat, parseFloat(row.h_amount)); + if ((((dataRecord.inventory_reduced <= 2) && (row.h_useat <= 4)) || // Mash, FW, Boil, Aroma, Whirlpool + ((dataRecord.inventory_reduced <= 6) && (row.h_useat == 5))) && // Dry-hop + (row.h_inventory < row.h_amount)) + ok_hops = 0; } total_ibus = Math.round(total_ibus * 10) / 10; ferm_ibus = Math.round(ferm_ibus * 10) / 10; @@ -432,7 +467,7 @@ hop_flavour = 100; if (hop_aroma > 100) hop_aroma = 100; - console.log("calcIBUs(): " + total_ibus + " flavour: " + hop_flavour + " aroma: " + hop_aroma+" fermenter:"+ferm_ibus); + console.log("calcIBUs(): " + total_ibus + " flavour: " + hop_flavour + " aroma: " + hop_aroma+" fermenter:"+ferm_ibus+" supplies:"+ok_hops); dataRecord.est_ibu = total_ibus; $('#est_ibu').val(total_ibus); $('#est_ibu2').val(total_ibus); @@ -440,6 +475,7 @@ $("#hop_aroma").jqxProgressBar('val', hop_aroma); $("#brew_fermenter_ibu").val(ferm_ibus); calcStage(); + calcSupplies(); }; /* @@ -728,7 +764,6 @@ var needed = getNeededYeastCells(); console.log("calcYeast() pitchrate:"+pitchrate+" start:"+initcells+" needed:"+needed); calcSteps(dataRecord.starter_type, initcells, needed); - //console.log("calcYeast() pitchrate:"+pitchrate+" needed:"+needed); $("#need_cells").val(needed); $("#r1_irate").html(""); @@ -814,6 +849,27 @@ } }; + function calcMiscs() { + + ok_miscs = 1; + var rowscount = $("#miscGrid").jqxGrid('getdatainformation').rowscount; + + if (rowscount == 0) + return; + + for (var i = 0; i < rowscount; i++) { + var row = $("#miscGrid").jqxGrid('getrowdata', i); + if ((((dataRecord.inventory_reduced <= 2) && (row.m_use_use <= 2)) || // Starter, Mash, Boil + ((dataRecord.inventory_reduced <= 3) && (row.m_use_use == 3)) || // Primary + ((dataRecord.inventory_reduced <= 5) && (row.m_use_use == 4)) || // Secondary, Teriary + ((dataRecord.inventory_reduced <= 6) && (row.m_use_use == 5))) && // Bottle + (row.m_inventory < row.m_amount)) { + ok_miscs = 0; + } + } + calcSupplies(); + }; + function adjustMiscs(factor) { console.log("adjustMiscs("+factor+")"); @@ -904,7 +960,6 @@ return; var c = sg_to_plato(est_mash_sg); var m = sg_to_plato(parseFloat($("#brew_mash_sg").jqxNumberInput('decimal'))); - //console.log("calcMashEfficiency() c "+ c + " m " + m + " in " + parseFloat($("#brew_mash_sg").jqxNumberInput('decimal'))); if (c > 0.5) $("#brew_mash_efficiency").val(100 * m / c); else @@ -929,7 +984,6 @@ result = Math.round((tot / m * 100) * 10) / 10; if (result < 0) result = 0; - //console.log("calcEfficiencyBeforeBoil(): "+result); $("#brew_preboil_efficiency").val(result); } @@ -955,7 +1009,6 @@ result = Math.round((tot / m * 100) * 10) / 10; if (result < 0) result = 0; - //console.log("calcEfficiencyAfterBoil(): "+result); dataRecord.brew_aboil_efficiency = result; $("#brew_aboil_efficiency").val(result); @@ -975,7 +1028,6 @@ } function setWaterAgent(name, amount) { - //console.log("setWaterAgent(" + name + ", " + amount + ")"); var rows = $('#miscGrid').jqxGrid('getrows'); if (amount == 0) { for (var i = 0; i < rows.length; i++) { @@ -1259,7 +1311,6 @@ // Einde noot. if ($("#wa_acid_name").val() < 0 || $("#wa_acid_name").val() > 3) { - console.log("fix wa_acid_name"); $("#wa_acid_name").val(0); dataRecord.wa_acid_name = 0; } @@ -1267,7 +1318,6 @@ last_acid = AcidTypeData[$("#wa_acid_name").val()].nl; if ($("#wa_base_name").val() < 0 || $("#wa_base_name").val() > 3) { - console.log("fix wa_base_name"); $("#wa_base_name").val(0); dataRecord.wa_base_name = 0; } @@ -1529,7 +1579,6 @@ else if (RA > piCLSO4_high) Res = 'hoog'; setRangeIndicator('cl_so4', Res); -// console.log("low: "+piCLSO4_low+" val: "+RA+" high: "+piCLSO4_high); $('#wb_calcium').val(Math.round(calcium * 10) / 10); $('#wb_magnesium').val(Math.round(magnesium * 10) / 10); @@ -1579,6 +1628,8 @@ setRangeIndicator("ph", "normaal"); } calcSparge(); + calcMiscs(); + calcSupplies(); } function calcSparge() { @@ -1605,7 +1656,6 @@ $("#sparge_source").val(0); } } - //console.log("calcSparge() target pH: "+TargetpH+" Source: "+Source_pH+" alkalinity: "+Source_alkalinity); // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH var r1 = Math.pow(10, Source_pH - 6.38); @@ -1784,7 +1834,6 @@ // This is the calculated difference in seconds var timeDifference = date1_unixtime - date2_unixtime; var timeDifferenceInDays = timeDifference / 60 / 60 / 24; - //console.log(date1+' '+date2+' days: '+timeDifferenceInDays); if (timeDifferenceInDays > 0) { // At least one day if (timeDifferenceInDays >= 42) // 6 weeks newstage = 9; // Ready to taste @@ -3237,10 +3286,17 @@ { text: 'Voorraad Kg', datafield: 'f_inventory', width: 120, align: 'right', cellsrenderer: function (row, columnfield, value, defaulthtml, columnproperties, rowdata) { var color = '#ffffff'; - if (value < rowdata.f_amount) - color = '#ff4040'; - return '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + - color + ';">' +fermentableAdapter.formatNumber(value, "f3") + '</span>'; + if (((dataRecord.inventory_reduced <= 2) && (rowdata.f_added <= 1)) || // Mash or boil + ((dataRecord.inventory_reduced <= 3) && (rowdata.f_added == 2)) || // Primary + ((dataRecord.inventory_reduced <= 5) && (rowdata.f_added == 3)) || // Secondary or Tertiary + ((dataRecord.inventory_reduced <= 6) && (rowdata.f_added == 4))) { // Bottle + if (value < rowdata.f_amount) + color = '#ff4040'; + return '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + + color + ';">' +fermentableAdapter.formatNumber(value, "f3") + '</span>'; + } else { + return '<span></span>'; + } } }, { text: 'Procent', datafield: 'f_percentage', width: 90, align: 'right', @@ -3441,13 +3497,18 @@ }, { text: 'Voorraad', datafield: 'h_inventory', width: 110, align: 'right', cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { - var color = '#ffffff'; - if (value < rowdata.h_amount) - color = '#ff4040'; - var amount = dataAdapter.formatNumber(value, "f1") + ' kg'; - if (value < 1) - amount = dataAdapter.formatNumber(value * 1000, "f1") + ' gr'; - return '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>'; + if (((dataRecord.inventory_reduced <= 2) && (rowdata.h_useat <= 4)) || // Mash, FW, Boil, Aroma, Whirlpool + ((dataRecord.inventory_reduced <= 6) && (rowdata.h_useat == 5))) { // Dry hop + var color = '#ffffff'; + if (value < rowdata.h_amount) + color = '#ff4040'; + var amount = dataAdapter.formatNumber(value, "f1") + ' kg'; + if (value < 1) + amount = dataAdapter.formatNumber(value * 1000, "f1") + ' gr'; + return '<span style="margin: 4px; margin-top: 6px; float: right; color: '+color+';">'+amount+'</span>'; + } else { + return '<span></span>'; + } } }, { text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { @@ -3625,6 +3686,7 @@ }); }, ready: function() { + calcMiscs(); $('#jqxTabs').jqxTabs('next'); }, columns: [ @@ -3658,12 +3720,19 @@ }, { text: 'Voorraad', datafield: 'm_inventory', width: 110, align: 'right', cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { - var vstr = rowdata.m_amount_is_weight ? "gr":"ml"; - var color = '#ffffff'; - if (value < rowdata.m_amount) - color = '#ff4040'; - var amount = dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr; - return '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>'; + if (((dataRecord.inventory_reduced <= 2) && (rowdata.m_use_use <= 2)) || // Starter, Mash, Boil + ((dataRecord.inventory_reduced <= 3) && (rowdata.m_use_use == 3)) || // Primary + ((dataRecord.inventory_reduced <= 5) && (rowdata.m_use_use == 4)) || // Secondary, Teriary + ((dataRecord.inventory_reduced <= 6) && (rowdata.m_use_use == 5))) { // Bottle + var vstr = rowdata.m_amount_is_weight ? "gr":"ml"; + var color = '#ffffff'; + if (value < rowdata.m_amount) + color = '#ff4040'; + var amount = dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr; + return '<span style="margin: 4px; margin-top: 6px; float: right; color: '+color+';">'+amount+'</span>'; + } else { + return '<span></span>'; + } } }, { text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { @@ -3847,15 +3916,22 @@ }, { text: 'Voorraad', datafield: 'y_inventory', width: 90, align: 'right', cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { - var color = '#ffffff'; - if (value < rowdata.y_amount) - color = '#ff4040'; - var amount = dataAdapter.formatNumber(value*1000, "f0")+" ml"; - if (rowdata.y_form == 0) // Liquid - amount = dataAdapter.formatNumber(value, "f0")+" pk"; - else if (rowdata.y_form == 1) // Dry - amount = dataAdapter.formatNumber(value*1000, "f1")+" gr"; - return '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>'; + if (((dataRecord.inventory_reduced <= 3) && (rowdata.y_use == 0)) || // Primary + ((dataRecord.inventory_reduced <= 4) && (rowdata.y_use == 1)) || // Secondary + ((dataRecord.inventory_reduced <= 5) && (rowdata.y_use == 2)) || // Tertiary + ((dataRecord.inventory_reduced <= 6) && (rowdata.y_use == 3))) { // Bottle + var color = '#ffffff'; + if (value < rowdata.y_amount) + color = '#ff4040'; + var amount = dataAdapter.formatNumber(value*1000, "f0")+" ml"; + if (rowdata.y_form == 0) // Liquid + amount = dataAdapter.formatNumber(value, "f0")+" pk"; + else if (rowdata.y_form == 1) // Dry + amount = dataAdapter.formatNumber(value*1000, "f1")+" gr"; + return '<span style="margin: 4px; margin-top: 6px; float: right; color: '+color+';">'+amount+'</span>'; + } else { + return '<span></span>'; + } } }, { text: '', datafield: 'Edit', columntype: 'button', width: 90, align: 'center', cellsrenderer: function () { @@ -4180,6 +4256,8 @@ $("#est_color2").jqxNumberInput( Show0dec ); $("#est_og2").jqxTooltip({ content: 'Het geschatte begin SG van dit product.' }); $("#est_og2").jqxNumberInput( Show3dec ); + $("#mash_kg").jqxTooltip({ content: 'Het gewicht van alle mouten in de maisch.' }); + $("#mash_kg").jqxNumberInput( Show3dec ); $("#perc_malts").jqxProgressBar({ width: 300, height: 23, @@ -4594,6 +4672,7 @@ $("#MiscReady").jqxButton({ template: "success", width: '90px', theme: theme }); $("#MiscReady").click(function () { $("#miscGrid").jqxGrid('sortby', 'm_use_use', 'asc'); + calcMiscs(); }); $("#wm_name").jqxInput({ theme: theme, width: 320, height: 23 }); $("#wm_instock").jqxCheckBox({ theme: theme, height: 23 });
--- a/www/prod_edit.php Sat May 11 17:25:58 2019 +0200 +++ b/www/prod_edit.php Sat May 11 23:13:40 2019 +0200 @@ -45,7 +45,8 @@ <td align="left" style="padding: 3px;"><div id="type"></div></td> <td style="vertical-align: top; float: right; padding: 3px;">Brouwzaal rendement:</td> <td style="padding: 3px;"><div id="efficiency"></div></td> - <td colspan="2"> </td> + <td style="vertical-align: top; float: right; padding: 3px;" id="ok_pmpt">Ingredienten aanwezig:</td> + <td align="left"><div id="ok_supplies"></div></td> </tr> <tr> <td style="vertical-align: top; float: right; padding: 3px;">Brouw volume:</td> @@ -202,7 +203,8 @@ <td style="padding: 3px;"><div style="float: left;" id="perc_sugars"></div></td> </tr> <tr> - <td colspan="2"></td> + <td style="vertical-align: top; float: right; padding: 3px;">Maisch KG:</td> + <td style="padding: 3px;"><div style="float: left;" id="mash_kg"></div></td> <td style="vertical-align: top; float: right; padding: 3px;">Percentage cara:</td> <td style="padding: 3px;"><div style="float: left;" id="perc_cara"></div></td> </tr>