www/js/prod_edit.js

changeset 358
3be8c2278fd7
parent 356
36c72e368948
child 372
1365b5e47130
--- 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 });

mercurial