# HG changeset patch # User Michiel Broek # Date 1572288942 -3600 # Node ID dabe1c854a0fe20c802084e80edf08d0c7e722e2 # Parent df678aa03f4a6491bd6f7ef833f11cc57f25a661# Parent 9dbce45f39b739b307001ca9653a8f2377b517da Merged with divide branch diff -r df678aa03f4a -r dabe1c854a0f README.design --- 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. diff -r df678aa03f4a -r dabe1c854a0f www/includes/constants.php --- 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' ); + ?> diff -r df678aa03f4a -r dabe1c854a0f www/includes/db_divides.php --- 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; } + + + + ?> diff -r df678aa03f4a -r dabe1c854a0f www/includes/db_product.php --- 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. diff -r df678aa03f4a -r dabe1c854a0f www/js/prod_divide.js --- 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; }); - }); diff -r df678aa03f4a -r dabe1c854a0f www/js/prod_edit.js --- 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 }); diff -r df678aa03f4a -r dabe1c854a0f www/js/prod_new.js --- 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({ diff -r df678aa03f4a -r dabe1c854a0f www/prod_checklist.php --- 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 @@ 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(); } diff -r df678aa03f4a -r dabe1c854a0f www/prod_forum.php --- 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; diff -r df678aa03f4a -r dabe1c854a0f www/prod_print.php --- 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(); } diff -r df678aa03f4a -r dabe1c854a0f www/rec_toproduct.php --- 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']);