www/prod_checklist.php

Tue, 31 Aug 2021 20:48:37 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Tue, 31 Aug 2021 20:48:37 +0200
changeset 774
92e1e8f175a2
parent 755
509510586665
child 782
622e31e000c6
permissions
-rw-r--r--

Split batch, adjust mash step volume. In the duplicated log_brew handle the missing values. In save product, round the mash step sg to 4 decimals. In prod_edit, ingredients are stored as strings, not arrays. This triggered a memory corruption that only happened in rare circumstances. Don't fix mash step fields in the javascript, it is already done during load from the database. Calculation of the mash volume is rounded to 6 decimals. Enter mash step Brix/Plato value, the SG result is rounded to 4 decimals.

<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/global.inc.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/constants.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/fpdf/fpdf.php');


$link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
if (! $link) {
	die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
}
if (! mysqli_set_charset($link, "utf8" )) {
	echo "error";
	return 1;
}

setlocale ( LC_ALL, 'nl_NL.UTF-8');
$record = $_GET["record"];
$result = mysqli_query($link, "SELECT * FROM products WHERE record='".$record."'");
$row = mysqli_fetch_array($result);

date_default_timezone_set('Europe/Amsterdam');
$prdate = date(DATE_RFC2822);


class PDF_MySQL_Table extends FPDF
{
	function Checkheader($text) {
		$this->SetFont('Arial','B',10);
		$this->Cell(0, 4,$text,0,0,'L',true);
		$this->SetFont('Arial','',10);
		$this->Ln(6);
	}

	function Checkline($text) {
		$this->Cell(2, 4,' ',0,0,'L',true);
		$this->Cell(4, 4,' ',1,0,'L',true);
		$this->Cell(0, 4,' '.$text,0,1,'L',true);
		$this->Ln(1);
	}

	function CheckInput($text, $prompt) {
		$this->Cell(2, 4,' ',0,0,'L',true);
		$this->Cell(4, 4,' ',1,0,'L',true);
		$this->Cell(130, 4,' '.$text,0,0,'L',true);
		$this->Cell(0, 4, 'Gemeten: _________ '.$prompt,0,1,'L',true);
		$this->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);

		$ferms = json_decode($row['json_fermentables'], true);
		$hops = json_decode($row['json_hops'], true);
		$miscs = json_decode($row['json_miscs'], true);
		$yeasts = json_decode($row['json_yeasts'], true);

		if ($row['starter_enable'] && $row['prop1_volume']) {
			$this->Checkheader('Giststarter maken');
			$days = 0;
			$last = 0;
			for ($i = 1; $i < 5; $i++) {
				$pt = "prop".$i."_type";
				$pv = "prop".$i."_volume";
				if (floatval($row[$pv])) {
					$last = $i;
					if ($row[$pt] == 0)
						$days += 2;
					else if ($row[$pt] == 1)
						$days += 4;
					else
						$days += 6;
				}
			}
			$this->Checkline("begin ongeveer ".$days." dagen voor de brouwdag met de giststarter");
			for ($i = 1; $i < 5; $i++) {
				$pt = "prop".$i."_type";
				$pv = "prop".$i."_volume";
				if (floatval($row[$pv])) {
					$s  = "Starter stap ".$i.", van ".sprintf("%.3f",floatval($row[$pv]));
					$s .= " liter maken met SG ".sprintf("%.3f",floatval($row['starter_sg']));
					$this->Checkline($s);
					if ($row[$pt] == 0) {
						$s = "ongeveer 24 uur op een magneetroerder";
					} else if ($row[$pt] == 1) {
						$s = "enkele dagen regelmatig schudden";
					} else {
						$s = "bijna een week rustig laten staan";
					}
					$s .= " tot er voldoende gist is";
					$this->Checkline($s);
					if ($i < $last) {
						$this->Checkline("starter minstens 24 uur in de koeling laten uitzakken");
						$this->Checkline("starter uit de koelkast halen en afgieten");
					} else {
						$this->Checkline("starter in de koeling zetten tot de brouwdag");
						$this->Checkline("starter op de brouwdag uit de koelkast halen en afgieten");
					}
				}
			}
			$this->Ln(5);
		}

		$this->Checkheader('Water en -behandeling');
		if ($row['w1_name']) {
			$this->Checkline(sprintf("%.1f",floatval($row['w1_amount'] * $factor)).' liter water '.$row['w1_name']);
			$mashwater += floatval($row['w1_amount'] * $factor);
		}
		if ($row['w2_name'] && 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("%.2f",floatval($item['m_amount'] * 1000 * $factor)).$unit.$item['m_name']);
				$numsalts++;
			}
		}
		$this->Ln(5);

		$this->Checkheader('Mout afwegen en schroten');
		foreach($ferms as $item) {
			if ($item['f_added'] == 0) {	// to mash
				$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);
			}
		}
		$this->Checkline('mout schroten');
		$this->Ln(5);

		$this->Checkheader('Maischen');
		$mvol = 0;
		$msugars = 0;	// mash sugars
		$grainabsorbtion = 0;
		$arr = json_decode($row['json_mashs'], true);
		if (count($arr) > 0) {
			$loop = 0;
			foreach($arr as $item) {
				if ($item['step_type'] == 0)
					$mvol += $item['step_infuse_amount'] * $factor;	// We need this later.
				if ($loop == 0) {
					if ($item['step_type'] == 0)
						$l = $item['step_infuse_amount'] * $factor;
					else
						$l = $mashwater;
					$s = sprintf("%.1f",$l).' liter water opwarmen tot ';
					$s .= sprintf("%.1f",$item['step_infuse_temp']).' '.DEG.'C (';
					$s .= sprintf("%.1f",kettle_cm($l,$row['eq_tun_volume'],$row['eq_tun_height']));
					$s .= ' cm onder de rand)';
					$this->Checkline($s);
					if ($numsalts > 0)
						$this->Checkline('brouwzouten en -zuren toevoegen');
					$this->Checkline('mout storten en inmaischen');
					foreach($hops as $item2) {
						if ($item2['h_useat'] == 0) {
							$s = sprintf("%.1f",$item2['h_amount']*1000 * $factor).' gr `';
							$s .= iconv('UTF-8','windows-1252',$item2['h_name']).'` toevoegen';
							$this->Checkline($s);
						}
					}
					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 * $factor).$unit.'`';
							$s .= iconv('UTF-8','windows-1252',$item3['m_name']).'` toevoegen';
							$this->Checkline($s);
						}
					}
					$this->CheckInput($item['step_time'].' min. bij '.$item['step_temp'].' '.DEG.'C', 'Brix');
					$this->CheckInput('pH meten en bijstellen (doel pH beslag: '.sprintf("%.1f",$row['mash_ph']).' pH)', 'pH');
				} else {
					if ($item['step_type'] == 0) {	// Infusion
						$s = 'toevoegen '.sprintf("%.1f",$item['step_infuse_amount'] * $factor).' liter water van ';
						$s .= $item['step_infuse_temp'].' '.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 '.sprintf("%.1f",$item['step_infuse_amount']*$factor);
						$s .= ' liter deelbeslag';
					}
					$this->Checkline($s);
					$this->CheckInput($item['step_time'].' min. bij '.$item['step_temp'].' '.DEG.'C', 'Brix');
				}
				$loop++;
			}
			$est_mash_sg = 0;
			foreach($ferms as $item) {
				if ($item['f_added'] == 0) {
					$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;
				}
			}
			$sugardensity = 1.611;
			$v = $msugars / $sugardensity + $mvol;
			$plato = 1000 * $msugars / ($v * 10);	// deg. Plato
			$mash_sg = plato_to_sg($plato);
			$this->CheckInput('doel SG eind maischen: '.density_str($mash_sg), 'Brix');
		}
		if ($this->GetY() > 200)
			$this->AddPage();
		else
			$this->Ln(5);

		$this->Checkheader('Filteren en spoelen');
		$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("%.2f",$row['sparge_acid_amount']*1000*$factor).' ml. '.$acidtype[$row['sparge_acid_type']];
		$this->CheckInput($s, 'pH');
		$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'] * $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->CheckInput($s, 'cm');
		$pre_sg = estimate_sg($msugars * floatval($row['efficiency']) / 100,floatval($row['boil_size'] * $factor));
		$this->CheckInput('doel SG in kookketel: '.density_str($pre_sg), 'Brix');
		foreach($hops as $item2) {
			if ($item2['h_useat'] == 1) {
				$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 && $row['boil_time'] > 0)
			$this->AddPage();
		else if ($this->GetY() > 270 && $row['boil_time'] == 0)
			$this->AddPage();
		else
			$this->Ln(5);

		$this->Checkheader('Koken');
		if ($row['boil_time'] > 0) {
			$this->Checkline('totale kooktijd: '.$row['boil_time'].' min.');
			for ($i = $row['boil_time']; $i >= 0; $i--) {
				if ($i == 10) {
					foreach($ferms as $item1) {
						if ($item1['f_added'] == 1) {
							$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);
						}
					}
					if ($row['brew_cooling_method'] == 1)
						$this->Checkline('Plaats dompelkoeler bij 10 minuten voor einde koken');
				}
				foreach($hops as $item2) {
					if (($item2['h_useat'] == 2 || $item2['h_useat'] == 3) && ($item2['h_time'] == $i)) {
						$s = sprintf("%.2f",$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';
						else
							$s .= 'vlamuit';
						$this->Checkline($s);
					}
				}
				foreach($miscs as $item3) {
					if ($item3['m_use_use'] == 2 && $item3['m_time'] == $i) {
						$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
						$s = sprintf("%.2f",$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';
						else
							$s .= 'vlamuit';
						$this->Checkline($s);
					}
				}

			}
			$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->CheckInput($s, 'cm');
			$this->CheckInput('doel SG einde koken: '.density_str($row['est_og3']), 'Brix');
			if ($this->Checksplit(2, $row))
				$factor = 1;
		} else {
			$this->Checkline('Dit is een `no-boil\' recept');
		}
		if ($this->GetY() > 200)
			$this->AddPage();
		else
			$this->Ln(5);

		if (($row['brew_whirlpool9'] + $row['brew_whirlpool7'] + $row['brew_whirlpool6'] + $row['brew_whirlpool2']) > 0) {
			$this->Checkheader('Whirlpool en koelen');
			if ($row['brew_whirlpool9'] > 0) {
				$s = 'Whirlpool voor '.$row['brew_whirlpool9'].' min. Temperatuur boven 85 '.DEG.'C houden';
				$this->Checkline($s);
			}
			if ($row['brew_whirlpool7'] > 0) {
				$this->Checkline('koelen tot 79 '.DEG.'C');
				$s = 'Whirlpool voor '.$row['brew_whirlpool7'].' min. Temperatuur tussen 72 en 79 '.DEG.'C houden';
				$this->Checkline($s);
			}
			if ($row['brew_whirlpool6'] > 0) {
				$this->Checkline('koelen tot 66 '.DEG.'C');
				$s = 'Whirlpool voor '.$row['brew_whirlpool6'].' min. Temperatuur tussen 60 en 66 '.DEG.'C houden';
				$this->Checkline($s);
			}
			foreach($hops as $item2) {
				if ($item2['h_useat'] == 4) {
					$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);
				}
			}
			$this->Checkline('koelen tot '.sprintf("%.1f",$row['brew_cooling_to']).' '.DEG.'C');
			if ($row['brew_whirlpool2'] > 0) {
				$s = 'Whirlpool voor '.$row['brew_whirlpool2'].' min.';
				$this->Checkline($s);
			}
		} else {
			$this->Checkheader('Koelen');
			$this->Checkline('koelen tot '.sprintf("%.1f",$row['brew_cooling_to']).' '.DEG.'C');
		}
		$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);

		$climate = $row['brew_cooling_to'];
		$this->Checkheader('Gist enten');
		$dry = 0;
		foreach ($yeasts as $item) {
			$name       = iconv('UTF-8','windows-1252',$item['y_name']);
                        $product_id = iconv('UTF-8','windows-1252',$item['y_product_id']);
			if ($item['y_use'] == 0) { // primary
				if ($item['y_form'] == 0) { // Liquid
					$this->Checkline(($item['y_amount']*$factor).' pak '.$product_id.', '.$name.' gist');
				} else if ($item['y_form'] == 1 || $item['y_form'] == 6) { // Dry or dried Kveik
					$s = sprintf("%.1f",$item['y_amount']*$factor*1000).' gram '.$product_id.', '.$name;
					$s .= ' gist';
					if ($item['y_form'] == 1)
						$dry += $item['y_amount']*$factor*10000;
					$this->Checkline($s);
				} else { // Slant/Culture/Frozen/Bottle
					$s = sprintf("%.0f",$item['y_amount']*$factor*1000).' ml '.$product_id.', '.$name.' gist';
					$this->Checkline($s);
				}
				if ($item['y_type'] == 6 && floatval($item['y_pitch_temperature']) > 0) {
					$s = 'Gist enten bij ' . sprintf("%.1f",floatval($item['y_pitch_temperature'])) . DEG . 'C';
					$this->Checkline($s);
					$climate = $item['y_pitch_temperature'];
				}
			}
		}
		if ($dry > 0) {
			$this->Checkline('Gist rechtstreeks over het wort strooien');
		} else {
			if ($row['starter_enable'] && $row['prop1_volume'])
				$this->Checkline('giststarter toevoegen');
			else
				$this->Checkline('gist toevoegen');
		}
		if ($row['brew_fermenter_extrawater'] > 0)
			$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";
			$this->Checkline($s);
		}
		if ($this->GetY() > 200)
			$this->AddPage();
		else
			$this->Ln(5);

		$this->Checkheader('Vergisting starten');
		$this->Checkline('klimaatkast instellen op '.sprintf("%.1f",$climate).' '.DEG.'C');

		/*
		 * During primary fermentation: fermentables, misc
		 */
		$lines = 0;
                foreach($ferms as $item1) {
                        if ($item1['f_added'] == 2)
				$lines++;
		}
                foreach($miscs as $item3) {
                	if ($item3['m_use_use'] == 3)
				$lines++;
		}
		if ($lines) {
			if ($this->GetY() > (270 - (5 * $lines)))
                        	$this->AddPage();
                	else
                        	$this->Ln(5);
			$this->Checkheader('Hoofdgisting');
		}
		foreach($ferms as $item1) {
                        if ($item1['f_added'] == 2) {
				$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);
			}
                }
                foreach($miscs as $item3) {
                        if ($item3['m_use_use'] == 3) {
				$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
				$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
		 */
		$lines = 0;
                foreach ($yeasts as $item4) {
                        if ($item4['y_use'] == 1)
				$lines++;
			if ($item4['y_harvest_time'] > 0)
				$lines++;
		}
		if ($lines) {
			if ($this->GetY() > (270 - (5 * $lines)))
                        	$this->AddPage();
                	else
                        	$this->Ln(5);
                        $this->Checkheader('Nagisting');
                }
		foreach ($yeasts as $item4) {
                        if ($item4['y_use'] == 1) {
				$name       = iconv('UTF-8','windows-1252',$item4['y_name']);
                                $product_id = iconv('UTF-8','windows-1252',$item4['y_product_id']);
				if ($item4['y_form'] == 0) { // Liquid
                                        $this->Checkline(($item4['y_amount']*$factor).' pak '.$product_id.', '.$name.' gist (eventueel met starter)');
                                } else if ($item['y_form'] == 1) { // Dry
                                        $s = sprintf("%.1f",$item4['y_amount']*$factor*1000).' gram '.$product_id.', '.$name;
                                        $s .= ' gist';
                                        $this->Checkline($s);
                                } else { // Slant/Culture/Frozen/Bottle
                                        $s = sprintf("%.0f",$item4['y_amount']*$factor*1000).' ml '.$product_id.', '.$name.' gist (eventueel met starter)';
                                        $this->Checkline($s);
                                }
			}
			if ($item4['y_harvest_time'] > 0) {
				$s = 'Na ' . $item4['y_harvest_time'] . ' uur gist oogsten vanaf de ';
				if ($item4['y_harvest_top'] > 0)
					$s .= 'bovenzijde';
				else
					$s .= 'bodem';
				$this->Checkline($s);
			}
                }
		if ($this->Checksplit(5, $row))
			$factor = 1;

		/*
		 * During tertiary fermentation: fermentables, hop, yeast, misc
		 */
		$lines = 0;
		foreach($ferms as $item1) {
                        if ($item1['f_added'] == 3)
                                $lines++;
                }
                foreach($hops as $item2) {
                        if ($item2['h_useat'] == 5)
				$lines++;
		}
                foreach ($yeasts as $item4) {
                        if ($item4['y_use'] == 2)
                                $lines++;
                }
                foreach($miscs as $item3) {
                        if ($item3['m_use_use'] == 4)
                                $lines++;
                }
		if ($lines) {
			if ($this->GetY() > (270 - (5 * $lines)))
                                $this->AddPage();
                        else
                                $this->Ln(5);
                        $this->Checkheader('Lagering');
                }
		foreach($ferms as $item1) {
                        if ($item1['f_added'] == 3) {
                                $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']*$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);
                        }
                }
		foreach ($yeasts as $item4) {
                        if ($item4['y_use'] == 2) {
				$name       = iconv('UTF-8','windows-1252',$item4['y_name']);
                                $product_id = iconv('UTF-8','windows-1252',$item4['y_product_id']);
                                if ($item4['y_form'] == 0) { // Liquid
                                        $s = ($item4['y_amount']*$factor).' pak '.$product_id.', '.$name.' gist (eventueel met starter)';
                                } else if ($item4['y_form'] == 1) { // Dry
                                        $s = sprintf("%.1f",$item4['y_amount']*$factor*1000).' gram '.$product_id.', '.$name;
                                        $s .= ' gist';
                                } else { // Slant/Culture/Frozen/Bottle
                                        $s = sprintf("%.0f",$item4['y_amount']*$factor*1000).' ml '.$product_id.', '.$name;
					$s .= ' gist (eventueel met starter)';
                                }
				$this->Checkline($s);
                        }
                }
		foreach($miscs as $item3) {
                        if ($item3['m_use_use'] == 4) {
				$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
                                $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
		 */
		$lines = 0;
		foreach($ferms as $item1) {
                        if ($item1['f_added'] >= 4)
                                $lines++;
                }
		$yeasts = json_decode($row['json_yeasts'], true);
                foreach ($yeasts as $item4) {
                        if ($item4['y_use'] == 3)
                                $lines++;
                }
		$miscs = json_decode($row['json_miscs'], true);
                foreach($miscs as $item3) {
                        if ($item3['m_use_use'] == 5)
                                $lines++;
                }
		if ($lines) {
			if ($this->GetY() > (270 - (5 * $lines)))
                                $this->AddPage();
                        else
                                $this->Ln(5);
                        $this->Checkheader('Verpakken');
                }
		foreach($ferms as $item1) {
                        if ($item1['f_added'] == 4) {
                                $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']*$factor).' liter water';
				$s .= ' bij bottelen';
                                $this->Checkline($s);
                        }
			if ($item1['f_added'] == 5) {
                                $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']*$factor).' liter water';
				$s .= ' bij op fust zetten';
                                $this->Checkline($s);
                        }
                }
		foreach ($yeasts as $item4) {
                        if ($item4['y_use'] == 3) {
				$name       = iconv('UTF-8','windows-1252',$item4['y_name']);
                        	$product_id = iconv('UTF-8','windows-1252',$item4['y_product_id']);
                                if ($item4['y_form'] == 0) { // Liquid
                                        $s = '`'.$product_id.', '.$name;
                                } else if ($item4['y_form'] == 1) { // Dry
                                        $s = sprintf("%.1f",$item4['y_amount']*$factor*1000).' gram `'.$product_id.', '.$name;
                                } else { // Slant/Culture/Frozen/Bottle
                                        $s = sprintf("%.0f",$item4['y_amount']*$factor*1000).' ml `'.$product_id.', '.$name;
                                }
				$s .= '` als bottelgist';
				$this->Checkline($s);
                        }
                }
		foreach($miscs as $item3) {
                        if ($item3['m_use_use'] == 5) {
				$unit = ($item3['m_amount_is_weight']) ? " gr ":" ml ";
                                $s = sprintf("%.1f",$item3['m_amount']*$factor*1000).$unit.'`';
                                $s .= iconv('UTF-8','windows-1252',$item3['m_name']).'` bij bottelen toevoegen';
                                $this->Checkline($s);
                        }
                }
	}
}



class PDF extends PDF_MySQL_Table {
	function Header() {
		global $row;
		global $prdate;
		global $stage;
		$this->Image('images/logo.png',10,10,30);
		// Title
		$this->SetFont('Helvetica','B',18);
		$this->SetX(45);
		$this->Cell(0,8,$row['code'].' '.$row['name'],0,1,'L');
		$this->Ln(1);
		$this->SetFont('Helvetica','',10);
		$this->SetX(45);
		$this->Cell(17,5,'Datum:',0,0,'L');
		$this->Cell(0,5,$prdate,0,1,'L');
		$this->SetX(45);
		$this->Cell(17,5,'Stijl:',0,0,'L');
		$st_name = iconv('UTF-8','windows-1252',$row['st_name']);
		$this->Cell(0,5,$st_name,0,1,'L');
		$this->SetX(45);
		$this->Cell(17,5,'Fase:',0,0,'L');
		$this->Cell(0,5,$stage[$row['stage']],0,1,'L');
		$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();
	}
}


/*
 * Generate checklist PDF from recipe data
 */
$pdf = new PDF();
$pdf->Checklist($row);
$pdf->Output();

mercurial