www/prod_print.php

changeset 165
5970c8377b89
child 240
a85c1d4c4d12
equal deleted inserted replaced
164:0a5abea575a9 165:5970c8377b89
1 <?php
2 require_once($_SERVER['DOCUMENT_ROOT'].'/includes/global.inc.php');
3 require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php');
4 require_once($_SERVER['DOCUMENT_ROOT'].'/fpdf/fpdf.php');
5
6
7 $link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
8 if (! $link) {
9 die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
10 }
11 if (! mysqli_set_charset($link, "utf8" )) {
12 echo "error";
13 return 1;
14 }
15
16 setlocale ( LC_ALL, 'nl_NL.UTF-8');
17 $record = $_GET["record"];
18 $result = mysqli_query($link, "SELECT * FROM products WHERE record='".$record."'");
19 $row = mysqli_fetch_array($result);
20
21 $total_fermentables = 0.0;
22 $cost_fermentables = 0.0;
23 $total_hops = 0.0;
24 $cost_hops = 0.0;
25 $cost_yeasts = 0.0;
26 $cost_miscs = 0.0;
27 $pSugar = 0;
28 $pCara = 0;
29 $svg = 77;
30 $colorw = 0;
31 $total_ibus = 0;
32 $preboil_sg = 0;
33
34 class PDF_MySQL_Table extends FPDF
35 {
36 protected $ProcessingTable=false;
37 protected $aCols=array();
38 protected $TableX;
39
40 function Header() {
41 // Print the table header if necessary
42 if ($this->ProcessingTable)
43 $this->TableHeader();
44 }
45
46 function TableHeader() {
47 $this->SetFont('Helvetica','B',9);
48 $this->SetX($this->TableX);
49 $this->SetFillColor(255,150,100);
50 foreach($this->aCols as $col)
51 $this->Cell($col['w'],5,$col['c'],0,0,$col['a'],true);
52 $this->Ln();
53 }
54
55 function AddCol($width=-1, $caption='', $align='L') {
56 $this->aCols[]=array('c'=>$caption,'w'=>$width,'a'=>$align);
57 }
58
59 function TableGlobal($row) {
60 /* 2 Columns */
61 $vul = $this->w - $this->rMargin - $this->lMargin - 160;
62 $cMargin=$this->cMargin;
63 $this->cMargin=2;
64 $this->TableX=$this->lMargin;
65 $this->SetFont('Helvetica','B',9);
66 $this->SetX($this->TableX);
67 $this->SetFillColor(255,150,100);
68 $this->Cell(0, 5, 'Recept overzicht',0,0,'C',true);
69 $this->Ln();
70
71 $this->SetFont('Helvetica','',9);
72 $this->SetFillColor(210,245,255);
73
74 $this->SetX($this->TableX);
75 $this->Cell(35,5,'Type',0,0,'L',true);
76 $this->Cell(45,5,$row['type'],0,0,'L',true);
77 $this->Cell($vul,5,'',0,0,'L',false);
78 $this->Cell(35,5,'Batch grootte',0,0,'L',true);
79 $this->Cell(45,5,$row['batch_size'].' liter',0,0,'L',true);
80 $this->Ln();
81
82 $this->SetX($this->TableX);
83 $this->Cell(35,5,'Kooktijd',0,0,'L',true);
84 $this->Cell(45,5,$row['boil_time'].' minuten',0,0,'L',true);
85 $this->Cell($vul,5,'',0,0,'L',false);
86 $this->Cell(35,5,'Brouwzaal rendement',0,0,'L',true);
87 $this->Cell(45,5,$row['efficiency'].' %',0,0,'L',true);
88 $this->Ln();
89
90 $this->SetX($this->TableX);
91 $this->Cell(35,5,'Bierstijl',0,0,'L',true);
92 $this->Cell(45,5,$row['st_name'],0,0,'L',true);
93 $this->Cell($vul,5,'',0,0,'L',false);
94 $this->Cell(35,5,'Installatie',0,0,'L',true);
95 $this->Cell(45,5,$row['eq_name'],0,0,'L',true);
96 $this->Ln(10);
97
98 $this->cMargin=$cMargin;
99 }
100
101 function TableFermentables($row) {
102 global $cost_fermentables;
103 global $total_fermentables;
104 global $pSugar;
105 global $pCara;
106 global $colorw;
107 global $preboil_sg;
108 $vul = $this->w - $this->rMargin - $this->lMargin - 132;
109 $this->AddCol($vul,'Grondstof','L');
110 $this->AddCol(30,'Leverancier','L');
111 $this->AddCol(15,'EBC','R');
112 $this->AddCol(17,'Moment','L');
113 $this->AddCol(20,'Kg','R');
114 $this->AddCol(15,'Procent','R');
115 $this->AddCol(15,'Opbr.','R');
116 $this->AddCol(20,'Prijs','R');
117
118 $cMargin=$this->cMargin;
119 $this->cMargin=2;
120 $this->TableX=$this->lMargin;
121 $this->TableHeader();
122 $this->ProcessingTable=true;
123
124 $sugarsf = 0;
125 $sugarsm = 0;
126 $this->SetFont('Helvetica','',9);
127 $this->SetFillColor(250, 195, 65);
128 $arr = json_decode($row['json_fermentables'], true);
129 foreach($arr as $item) { //foreach element in $arr
130 $name = iconv('UTF-8','windows-1252',$item['f_name']);
131 $supplier = iconv('UTF-8','windows-1252',$item['f_supplier']);
132 $added = iconv('UTF-8','windows-1252',$item['f_added']);
133 $type = iconv('UTF-8','windows-1252',$item['f_type']);
134 $graintype = iconv('UTF-8','windows-1252',$item['f_graintype']);
135 $amount = floatval($item['f_amount']);
136 $costkg = floatval($item['f_cost']);
137 $yield = floatval($item['f_yield']);
138 $moisture = floatval($item['f_moisture']);
139 $color = floatval($item['f_color']);
140 $percent = floatval($item['f_percentage']);
141
142 if ($type == "Sugar")
143 $pSugar += $percent;
144 if ($graintype == "Crystal")
145 $pCara += $percent;
146
147 $cost = $amount * $costkg;
148 $cost_fermentables += $cost;
149 $total_fermentables += $amount;
150 /* Calculate the amount of sugars */
151 $d = $amount * ($yield / 100) * (1 - $moisture / 100);
152 if ($added == "Mash") {
153 $d = floatval($row['efficiency']) / 100 * $d;
154 $sugarsm += $d;
155 }
156 $sugarsf += $d;
157 $colorw += ($amount * ebc_to_srm($color) / $row['batch_size']) * 8.34436;
158
159 $this->Cell($vul,5,$name,0,0,'L',true);
160 $this->Cell(30,5,$supplier,0,0,'L',true);
161 $this->Cell(15,5,sprintf("%.0f",$color),0,0,'R',true);
162 $this->Cell(17,5,added_type_names($added),0,0,'L',true);
163 $this->Cell(20,5,sprintf("%8.3f",$amount),0,0,'R',true);
164 $this->Cell(15,5,sprintf("%.1f%%",$percent),0,0,'R',true);
165 $this->Cell(15,5,sprintf("%.1f%%",$yield),0,0,'R',true);
166 $this->Cell(20,5,sprintf("%8.3f",$cost).EURO,0,0,'R',true);
167 $this->Ln();
168 }
169
170 $row['est_og'] = estimate_sg($sugarsf, floatval($row['batch_size']));
171 $preboil_sg = estimate_sg($sugarsm, floatval($row['boil_size']));
172 $this->SetFillColor(210,245,255);
173 $this->Cell($vul+62,5,'',0,0,'L',false);
174 $this->Cell(20,5,sprintf("%8.3f",$total_fermentables),0,0,'R',true);
175 $this->Cell(30,5,'',0,0,'L',false);
176 $this->Cell(20,5,sprintf("%8.3f",$cost_fermentables).EURO,0,0,'R',true);
177 $this->Ln(10);
178 $this->ProcessingTable=false;
179 $this->cMargin=$cMargin;
180 $this->aCols=array();
181 }
182
183 function TableHops($row) {
184 global $total_hops;
185 global $total_ibus;
186 global $cost_hops;
187 global $preboil_sg;
188 $vul = $this->w - $this->rMargin - $this->lMargin - 135;
189 $this->AddCol($vul,'Hop','L');
190 $this->AddCol(35,'Land','L');
191 $this->AddCol(15,'Soort','L');
192 $this->AddCol(20,'Moment','L');
193 $this->AddCol(15,'Alpha','R');
194 $this->AddCol(12,'IBU','R');
195 $this->AddCol(18,'Gram','R');
196 $this->AddCol(20,'Prijs','R');
197
198 $cMargin=$this->cMargin;
199 $this->cMargin=2;
200 $this->TableX=$this->lMargin;
201 $this->TableHeader();
202 $this->ProcessingTable=true;
203
204 $this->SetFont('Helvetica','',9);
205 $this->SetFillColor(100, 250, 65);
206
207 $arr = json_decode($row['json_hops'], true);
208 foreach($arr as $item) { //foreach element in $arr
209 $name = iconv('UTF-8','windows-1252',$item['h_name']);
210 $origin = iconv('UTF-8','windows-1252',$item['h_origin']);
211 $useat = iconv('UTF-8','windows-1252',$item['h_useat']);
212 $form = iconv('UTF-8','windows-1252',$item['h_form']);
213 $amount = floatval($item['h_amount']) * 1000;
214 $mass = $amount;
215 $costkg = floatval($item['h_cost']);
216 $time = floatval($item['h_time']);
217 $alpha = floatval($item['h_alpha']);
218
219 $cost = ($amount * $costkg) / 1000;
220 $cost_hops += $cost;
221 $total_hops += $amount;
222
223 $moment = hop_useat_names($useat);
224 if ($useat == "Boil") {
225 $moment = "Kook@".$time;
226 }
227 $ibu = calc_IBU($useat, $form, /*floatval($row['est_og'])*/ $preboil_sg, floatval($row['batch_size']), $mass, $time, $alpha, $row['ibu_method']);
228 $total_ibus += $ibu;
229
230 $this->Cell($vul,5,$name,0,0,'L',true);
231 $this->Cell(35,5,$origin,0,0,'L',true);
232 $this->Cell(15,5,hop_form_names($form),0,0,'L',true);
233 $this->Cell(20,5,$moment,0,0,'L',true);
234 $this->Cell(15,5,sprintf("%.1f%%",$alpha),0,0,'R',true);
235 $this->Cell(12,5,sprintf("%.1f",$ibu),0,0,'R',true);
236 $this->Cell(18,5,sprintf("%.1f",$amount),0,0,'R',true);
237 $this->Cell(20,5,sprintf("%8.3f",$cost).EURO,0,0,'R',true);
238 $this->Ln();
239 }
240
241 $this->SetFillColor(210,245,255);
242 $this->Cell($vul+85,5,'',0,0,'L',false);
243 $this->Cell(12,5,sprintf("%.1f",$total_ibus),0,0,'R',true);
244 $this->Cell(18,5,sprintf("%.1f",$total_hops),0,0,'R',true);
245 $this->Cell(20,5,sprintf("%8.3f",$cost_hops).EURO,0,0,'R',true);
246 $this->Ln(10);
247 $this->ProcessingTable=false;
248 $this->cMargin=$cMargin;
249 $this->aCols=array();
250 }
251
252 function TableYeasts($row) {
253 global $cost_yeasts;
254 global $svg;
255 $vul = $this->w - $this->rMargin - $this->lMargin - 140;
256 $this->AddCol(27,'Laboratorium','L');
257 $this->AddCol(18,'Product','L');
258 $this->AddCol($vul,'Gist','L');
259 $this->AddCol(20,'Gebruik','L');
260 $this->AddCol(15,'Attn','R');
261 $this->AddCol(22,'Vorm','L');
262 $this->AddCol(18,'Gram','R');
263 $this->AddCol(20,'Prijs','R');
264
265 $cMargin=$this->cMargin;
266 $this->cMargin=2;
267 $this->TableX=$this->lMargin;
268 $this->TableHeader();
269 $this->ProcessingTable=true;
270
271 $this->SetFont('Helvetica','',9);
272 $this->SetFillColor(175, 175, 255);
273
274 $arr = json_decode($row['json_yeasts'], true);
275 foreach($arr as $item) { //foreach element in $arr
276 $name = iconv('UTF-8','windows-1252',$item['y_name']);
277 $laboratory = iconv('UTF-8','windows-1252',$item['y_laboratory']);
278 $product_id = iconv('UTF-8','windows-1252',$item['y_product_id']);
279 $form = iconv('UTF-8','windows-1252',$item['y_form']);
280 $use = iconv('UTF-8','windows-1252',$item['y_use']);
281 $amount = floatval($item['y_amount']) * 1000;
282 $costg = floatval($item['y_cost']);
283 $attenuation = floatval($item['y_attenuation']);
284 $cost = $amount * $costg;
285 $cost_yeasts += $cost;
286
287 if ($use == "Primary")
288 $svg = $attenuation;
289
290 $this->Cell(27,5,$laboratory,0,0,'L',true);
291 $this->Cell(18,5,$product_id,0,0,'L',true);
292 $this->Cell($vul,5,$name,0,0,'L',true);
293 $this->Cell(20,5,yeast_use_names($use),0,0,'L',true);
294 $this->Cell(15,5,sprintf("%.1f%%",$attenuation),0,0,'R',true);
295 $this->Cell(22,5,yeast_form_names($form),0,0,'L',true);
296 $this->Cell(18,5,sprintf("%.1f",$amount),0,0,'R',true);
297 $this->Cell(20,5,sprintf("%8.3f",$cost).EURO,0,0,'R',true);
298 $this->Ln();
299 }
300
301 $this->SetFillColor(210,245,255);
302 $this->Cell($vul+120,5,'',0,0,'L',false);
303 $this->Cell(20,5,sprintf("%8.3f",$cost_yeasts).EURO,0,0,'R',true);
304 $this->Ln(10);
305 $this->ProcessingTable=false;
306 $this->cMargin=$cMargin;
307 $this->aCols=array();
308 }
309
310 function TableMiscs($row) {
311 global $cost_miscs;
312 $vul = $this->w - $this->rMargin - $this->lMargin - 95;
313 $this->AddCol($vul,'Naam','L');
314 $this->AddCol(30,'Soort','L');
315 $this->AddCol(25,'Gebruik','L');
316 $this->AddCol(20,'Hoeveel','R');
317 $this->AddCol(20,'Prijs','R');
318
319 $cMargin=$this->cMargin;
320 $this->cMargin=2;
321 $this->TableX=$this->lMargin;
322 $this->TableHeader();
323 $this->ProcessingTable=true;
324
325 $this->SetFont('Helvetica','',9);
326 $this->SetFillColor(175, 175, 255);
327
328 $arr = json_decode($row['json_miscs'], true);
329 foreach($arr as $item) {
330 $name = iconv('UTF-8','windows-1252',$item['m_name']);
331 $type = iconv('UTF-8','windows-1252',$item['m_type']);
332 $use_use = iconv('UTF-8','windows-1252',$item['m_use_use']);
333 $amount = floatval($item['m_amount']) * 1000;
334 $costg = floatval($item['m_cost']) / 1000;
335 $time = floatval($item['m_time']);
336 $aiw = $item['m_amount_is_weight'];
337 $cost = $amount * $costg;
338 $cost_miscs += $cost;
339
340 if ($type == "Water agent")
341 $this->SetFillColor(240,140,130);
342 else if ($type == "Fining")
343 $this->SetFillColor(95,180,25);
344 else if (($type == "Spice") || ($type == "Herb") || ($type == "Flavor") || ($type == "Yeast nutrient"))
345 $this->SetFillColor(240,250,65);
346 else
347 $this->SetFillColor(210,245,255);
348
349 if ($use_use == "Boil")
350 $gebruik = sprintf("%s %d min",misc_use_names($use_use),$time);
351 else
352 $gebruik = misc_use_names($use_use);
353
354 $hoeveel = sprintf("%.1f %s",$amount,$aiw ? "gr":"ml");
355 $this->Cell($vul,5,$name,0,0,'L',true);
356 $this->Cell(30,5,misc_type_names($type),0,0,'L',true);
357 $this->Cell(25,5,$gebruik,0,0,'L',true);
358 $this->Cell(20,5,$hoeveel,0,0,'R',true);
359 $this->Cell(20,5,sprintf("%8.3f",$cost).EURO,0,0,'R',true);
360 $this->Ln();
361 }
362
363 $this->SetFillColor(210,245,255);
364 $this->Cell($vul+75,5,'',0,0,'L',false);
365 $this->Cell(20,5,sprintf("%8.3f",$cost_miscs).EURO,0,0,'R',true);
366 $this->Ln(10);
367
368 $this->ProcessingTable=false;
369 $this->cMargin=$cMargin;
370 $this->aCols=array();
371 }
372
373 // Watercolor $this->SetFillColor(120,255,250);
374
375 function TableSummary($row) {
376 global $pSugar;
377 global $pCara;
378 global $svg;
379 global $colorw;
380 global $cost_fermentables;
381 global $cost_hops;
382 global $cost_miscs;
383 global $cost_yeasts;
384 /* 2 Columns */
385 $vul = $this->w - $this->rMargin - $this->lMargin - 170;
386 $cMargin=$this->cMargin;
387 $this->cMargin=2;
388 $this->TableX=$this->lMargin;
389 $this->SetFont('Helvetica','B',9);
390 $this->SetX($this->TableX);
391 $this->SetFillColor(255,150,100);
392 $this->Cell(0, 5, 'Recept samenvatting',0,0,'C',true);
393 $this->Ln();
394
395 $this->SetFont('Helvetica','',9);
396 $this->SetFillColor(210,245,255);
397
398 $row['est_fg'] = estimate_fg($pSugar, $pCara, 0, 0, 0, $svg, $row['est_og']);
399
400 $this->SetX($this->TableX);
401 $this->Cell(35,5,'Start SG',0,0,'L',true);
402 $this->Cell(25,5,sprintf("%.3f",$row['est_og']),0,0,'L',true);
403 $this->Cell(25,5,'('.sprintf("%.3f",$row['st_og_min']).' - '.sprintf("%.3f",$row['st_og_max']).')',0,0,'L',true);
404 $this->Cell($vul,5,'',0,0,'L',false);
405 $this->Cell(35,5,'Eind SG',0,0,'L',true);
406 $this->Cell(25,5,sprintf("%.3f",$row['est_fg']),0,0,'L',true);
407 $this->Cell(25,5,'('.sprintf("%.3f",$row['st_fg_min']).' - '.sprintf("%.3f",$row['st_fg_max']).')',0,0,'L',true);
408 $this->Ln();
409
410 $row['est_abv'] = abvol($row['est_og'], $row['est_fg']);
411 $this->SetX($this->TableX);
412 $this->Cell(35,5,'Geschat alcohol',0,0,'L',true);
413 $this->Cell(25,5,sprintf("%.1f",$row['est_abv']).'%',0,0,'L',true);
414 $this->Cell(25,5,'('.sprintf("%.1f",$row['st_abv_min']).' - '.sprintf("%.1f",$row['st_abv_max']).'%)',0,0,'L',true);
415 $this->Cell($vul,5,'',0,0,'L',false);
416 $this->Cell(35,5,'CO2',0,0,'L',true);
417 $this->Cell(25,5,sprintf("%.1f",$row['est_carb']).'%',0,0,'L',true);
418 $this->Cell(25,5,'('.sprintf("%.1f",$row['st_carb_min']).' - '.sprintf("%.1f",$row['st_carb_max']).'%)',0,0,'L',true);
419 $this->Ln();
420
421 $row['est_color'] = kw_to_ebc($row['color_method'], $colorw);
422 $this->SetX($this->TableX);
423 $this->Cell(35,5,'Kleur ('.$row['color_method'].')',0,0,'L',true);
424 $beercolor = ebc_to_color($row['est_color']);
425 if ($row['est_color'] > 30)
426 $this->SetTextColor(250);
427 $this->SetFillColor($beercolor[0],$beercolor[1],$beercolor[2]);
428 $this->Cell(25,5,$row['est_color'].' EBC',0,0,'L',true);
429 $this->Cell(25,5,'('.$row['st_color_min'].' - '.$row['st_color_max'].' EBC)',0,0,'L',true);
430 $this->SetTextColor(0);
431 $this->SetFillColor(210,245,255);
432 $this->Cell($vul,5,'',0,0,'L',false);
433 $this->Cell(35,5,'Bitterheid ('.$row['ibu_method'].')',0,0,'L',true);
434 $this->Cell(25,5,sprintf("%.0f",$row['est_ibu']).' IBU',0,0,'L',true);
435 $this->Cell(25,5,'('.$row['st_ibu_min'].' - '.$row['st_ibu_max'].' IBU)',0,0,'L',true);
436 $this->Ln();
437
438 $this->SetX($this->TableX);
439 $cost_total = $cost_fermentables + $cost_hops + $cost_miscs + $cost_yeasts;
440 $this->Cell(35,5,'Kosten',0,0,'L',true);
441 $this->Cell(25,5,sprintf("%.2f",$cost_total).EURO,0,0,'L',true);
442 $this->Cell(25,5,sprintf("%.2f",$cost_total/$row['batch_size']).EURO.' / liter',0,0,'L',true);
443 $this->Ln(10);
444
445
446 // Kostprijs per liter, calorieren
447 $this->cMargin=$cMargin;
448 }
449 }
450
451
452
453 class PDF extends PDF_MySQL_Table {
454 function Header() {
455 global $row;
456 $this->Image('images/logo.png',10,6,30);
457 // Title
458 $this->SetFont('Helvetica','B',18);
459 $this->SetX(45);
460 $this->Cell(0,8,$row['name'],1,1,'L');
461 $this->Ln(20);
462 // Ensure table header is printed
463 parent::Header();
464 }
465 }
466
467
468 /*
469 * Generate PDF from recipe data
470 */
471 $pdf = new PDF();
472 $pdf->AddPage();
473 $pdf->TableGlobal($row);
474 $pdf->TableFermentables($row);
475 $pdf->TableHops($row);
476 $pdf->TableYeasts($row);
477 $pdf->TableMiscs($row);
478 $pdf->TableSummary($row);
479 if (strlen($row['notes'])) {
480 $pdf->SetFillColor(255,150,100);
481 $pdf->Cell(0, 5, 'Recept opmerkingen',0,0,'C',true);
482 $pdf->Ln();
483 $pdf->SetFillColor(210,245,255);
484 $pdf->MultiCell(0,4,$row['notes'],0,'L',true);
485 }
486 // Disclaimer toevoegen dat dit alleen recept ontwikkeling is. Uitkomsten zoals IBU zijn een berekende schatting.
487 // Footer sectie met berekende/geschatte uitkomsten zoals ABV, kostprijs per liter enz.
488 $pdf->Output();

mercurial