www/prod_checklist.php

Sun, 23 May 2021 16:41:35 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sun, 23 May 2021 16:41:35 +0200
changeset 752
f68e3bbc1ada
parent 740
04c0e444e48e
child 755
509510586665
permissions
-rw-r--r--

Fermentables, hops, miscs and yeast now have tests against the added moment with the brewing stage. Added to inventory edit rows, delete rows, and pick choices for the moment to add or edit. Some more popups to explain certain blocks.

<?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']) {
			$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