dolibarr 22.0.5
pdf_eagle.modules.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
4 * Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2014-2015 Marcos García <marcosgdf@gmail.com>
7 * Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
9 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
10 * Copyright (C) 2024 Nick Fragoulis
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 * or see https://www.gnu.org/
25 */
26
33require_once DOL_DOCUMENT_ROOT.'/core/modules/stocktransfer/modules_stocktransfer.php';
34require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
38
39
44{
48 public $db;
49
53 public $name;
54
58 public $description;
59
63 public $type;
64
69 public $version = 'dolibarr';
70
74 public $posxlot;
75
79 public $posxweightvol;
80
84 public $posxwarehousesource;
85
89 public $posxwarehousedestination;
90
96 public $atLeastOneBatch;
97
103 public function __construct(DoliDB $db)
104 {
105 global $langs, $mysoc;
106
107 $this->db = $db;
108 $this->name = $langs->trans("StockTransferSheet");
109 $this->description = $langs->trans("DocumentModelStandardPDF");
110
111 $this->type = 'pdf';
112 $formatarray = pdf_getFormat();
113 $this->page_largeur = $formatarray['width'];
114 $this->page_hauteur = $formatarray['height'];
115 $this->format = array($this->page_largeur, $this->page_hauteur);
116 $this->marge_gauche = getDolGlobalInt('MAIN_PDF_MARGIN_LEFT', 10);
117 $this->marge_droite = getDolGlobalInt('MAIN_PDF_MARGIN_RIGHT', 10);
118 $this->marge_haute = getDolGlobalInt('MAIN_PDF_MARGIN_TOP', 10);
119 $this->marge_basse = getDolGlobalInt('MAIN_PDF_MARGIN_BOTTOM', 10);
120 $this->corner_radius = getDolGlobalInt('MAIN_PDF_FRAME_CORNER_RADIUS', 0);
121 $this->option_logo = 1; // Display logo
122
123 // Define position of columns
124 $this->posxdesc = $this->marge_gauche + 1;
125 $this->posxlot = $this->page_largeur - $this->marge_droite - 135;
126 $this->posxweightvol = $this->page_largeur - $this->marge_droite - 115;
127 $this->posxqty = $this->page_largeur - $this->marge_droite - 95;
128 $this->posxwarehousesource = $this->page_largeur - $this->marge_droite - 70;
129 $this->posxwarehousedestination = $this->page_largeur - $this->marge_droite - 35;
130 $this->posxpuht = $this->page_largeur - $this->marge_droite;
131
132 /*if (getDolGlobalString('STOCKTRANSFER_PDF_DISPLAY_AMOUNT_HT')) { // Show also the prices
133 $this->posxqty = $this->page_largeur - $this->marge_droite - 118;
134 $this->posxwarehousesource = $this->page_largeur - $this->marge_droite - 96;
135 $this->posxwarehousedestination = $this->page_largeur - $this->marge_droite - 68;
136 $this->posxpuht = $this->page_largeur - $this->marge_droite - 40;
137 $this->posxtotalht = $this->page_largeur - $this->marge_droite - 20;
138 }*/
139
140 if (getDolGlobalString('STOCKTRANSFER_PDF_HIDE_WEIGHT_AND_VOLUME')) {
141 $this->posxweightvol = $this->posxqty;
142 }
143
144 $this->posxpicture = $this->posxweightvol - getDolGlobalInt('MAIN_DOCUMENTS_WITH_PICTURE_WIDTH', 20); // width of images
145 //var_dump($this->posxpicture, $this->posxweightvol);exit;
146
147 // To work with US executive format
148 if ($this->page_largeur < 210) {
149 $this->posxqty -= 20;
150 $this->posxpicture -= 20;
151 $this->posxwarehousesource -= 20;
152 $this->posxwarehousedestination -= 20;
153 }
154
155 /*if (getDolGlobalString('STOCKTRANSFER_PDF_HIDE_ORDERED')) {
156 $this->posxqty += ($this->posxwarehousedestination - $this->posxwarehousesource);
157 $this->posxpicture += ($this->posxwarehousedestination - $this->posxwarehousesource);
158 $this->posxwarehousesource = $this->posxwarehousedestination;
159 }*/
160
161 if ($mysoc === null) {
162 dol_syslog(get_class($this).'::__construct() Global $mysoc should not be null.'. getCallerInfoString(), LOG_ERR);
163 return;
164 }
165
166 // Get source company
167 $this->emetteur = $mysoc;
168 if (empty($this->emetteur->country_code)) {
169 $this->emetteur->country_code = substr($langs->defaultlang, -2);
170 }
171 }
172
173
174 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
186 public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0)
187 {
188 // phpcs:enable
189 global $user, $conf, $langs, $hookmanager;
190
191 $object->fetch_thirdparty();
192
193 $this->atLeastOneBatch = $this->atLeastOneBatch($object);
194
195 if (!is_object($outputlangs)) {
196 $outputlangs = $langs;
197 }
198 // For backward compatibility with FPDF, force output charset to ISO, because FPDF expect text to be encoded in ISO
199 if (getDolGlobalString('MAIN_USE_FPDF')) {
200 $outputlangs->charset_output = 'ISO-8859-1';
201 }
202
203 // Load translation files required by page
204 $outputlangs->loadLangs(array("main", "bills", "products", "dict", "companies", "propal", "deliveries", "sendings", "productbatch", "stocks", "other", "stocktransfer@stocktransfer"));
205
206 global $outputlangsbis;
207 $outputlangsbis = null;
208 if (getDolGlobalString('PDF_USE_ALSO_LANGUAGE_CODE') && $outputlangs->defaultlang != getDolGlobalString('PDF_USE_ALSO_LANGUAGE_CODE')) {
209 $outputlangsbis = new Translate('', $conf);
210 $outputlangsbis->setDefaultLang(getDolGlobalString('PDF_USE_ALSO_LANGUAGE_CODE'));
211 $outputlangsbis->loadLangs(array("main", "bills", "orders", "products", "dict", "companies", "propal", "deliveries", "sendings", "productbatch"));
212 }
213
214 $nblines = is_array($object->lines) ? count($object->lines) : 0;
215
216 // Loop on each lines to detect if there is at least one image to show
217 $realpatharray = array();
218 $this->atleastonephoto = false;
219 if (getDolGlobalString('MAIN_GENERATE_STOCKTRANSFER_WITH_PICTURE')) {
220 $objphoto = new Product($this->db);
221
222 for ($i = 0; $i < $nblines; $i++) {
223 if (empty($object->lines[$i]->fk_product)) {
224 continue;
225 }
226
227 $objphoto = new Product($this->db);
228 $objphoto->fetch($object->lines[$i]->fk_product);
229 if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
230 $pdir = get_exdir($object->lines[$i]->fk_product, 2, 0, 0, $objphoto, 'product').$object->lines[$i]->fk_product."/photos/";
231 $dir = $conf->product->dir_output.'/'.$pdir;
232 } else {
233 $pdir = get_exdir(0, 2, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
234 $dir = $conf->product->dir_output.'/'.$pdir;
235 }
236
237 $realpath = '';
238
239 foreach ($objphoto->liste_photos($dir, 1) as $key => $obj) {
240 if (!getDolGlobalInt('CAT_HIGH_QUALITY_IMAGES')) {
241 // If CAT_HIGH_QUALITY_IMAGES not defined, we use thumb if defined and then original photo
242 if ($obj['photo_vignette']) {
243 $filename = $obj['photo_vignette'];
244 } else {
245 $filename = $obj['photo'];
246 }
247 } else {
248 $filename = $obj['photo'];
249 }
250
251 $realpath = $dir.$filename;
252 $this->atleastonephoto = true;
253 break;
254 }
255
256 if ($realpath) {
257 $realpatharray[$i] = $realpath;
258 }
259 }
260 }
261
262 if (count($realpatharray) == 0) {
263 $this->posxpicture = $this->posxweightvol;
264 }
265
266
267 if (!empty($this->atLeastOneBatch)) {
268 $this->posxpicture = $this->posxlot;
269 if (getDolGlobalString('MAIN_GENERATE_STOCKTRANSFER_WITH_PICTURE')) {
270 $this->posxpicture -= getDolGlobalInt('MAIN_DOCUMENTS_WITH_PICTURE_WIDTH', 20);
271 } // width of images
272 }
273
274 if ($conf->stocktransfer->dir_output) {
275 // Definition of $dir and $file
276 if ($object->specimen) {
277 $dir = $conf->stocktransfer->dir_output;
278 $file = $dir."/SPECIMEN.pdf";
279 } else {
280 $stocktransferref = dol_sanitizeFileName($object->ref);
281 $dir = $conf->stocktransfer->dir_output.'/'.$object->element."/".$stocktransferref;
282 $file = $dir."/".$stocktransferref.".pdf";
283 }
284
285 if (!file_exists($dir)) {
286 if (dol_mkdir($dir) < 0) {
287 $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
288 return 0;
289 }
290 }
291
292 if (file_exists($dir)) {
293 // Add pdfgeneration hook
294 if (!is_object($hookmanager)) {
295 include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
296 $hookmanager = new HookManager($this->db);
297 }
298 $hookmanager->initHooks(array('pdfgeneration'));
299 $parameters = array('file' => $file, 'object' => $object, 'outputlangs' => $outputlangs);
300 global $action;
301 $reshook = $hookmanager->executeHooks('beforePDFCreation', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
302
303 // Set nblines with the new facture lines content after hook
304 $nblines = is_array($object->lines) ? count($object->lines) : 0;
305
306 $pdf = pdf_getInstance($this->format);
307 $default_font_size = pdf_getPDFFontSize($outputlangs);
308 $heightforinfotot = 8; // Height reserved to output the info and total part
309 $heightforfreetext = getDolGlobalInt('MAIN_PDF_FREETEXT_HEIGHT', 5); // Height reserved to output the free text on last page
310 $heightforfooter = $this->marge_basse + 8; // Height reserved to output the footer (value include bottom margin)
311 if (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS')) {
312 $heightforfooter += 6;
313 }
314 $pdf->setAutoPageBreak(true, 0);
315
316 if (class_exists('TCPDF')) {
317 $pdf->setPrintHeader(false);
318 $pdf->setPrintFooter(false);
319 }
320 $pdf->SetFont(pdf_getPDFFont($outputlangs));
321 // Set path to the background PDF File
322 if (!getDolGlobalString('MAIN_DISABLE_FPDI') && getDolGlobalString('MAIN_ADD_PDF_BACKGROUND')) {
323 $pagecount = $pdf->setSourceFile($conf->mycompany->dir_output.'/' . getDolGlobalString('MAIN_ADD_PDF_BACKGROUND'));
324 $tplidx = $pdf->importPage(1);
325 }
326
327 $pdf->Open();
328 $pagenb = 0;
329 $pdf->SetDrawColor(128, 128, 128);
330
331 if (method_exists($pdf, 'AliasNbPages')) {
332 $pdf->AliasNbPages(); // @phan-suppress-current-line PhanUndeclaredMethod
333 }
334
335 $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref));
336 $pdf->SetSubject($outputlangs->transnoentities("StockTransfer"));
337 $pdf->SetCreator("Dolibarr ".DOL_VERSION);
338 $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
339 $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("StockTransfer"));
340 if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
341 $pdf->SetCompression(false);
342 }
343
344 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
345 $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right
346
347 // New page
348 $pdf->AddPage();
349 if (!empty($tplidx)) {
350 $pdf->useTemplate($tplidx);
351 }
352 $pagenb++;
353 $top_shift = $this->_pagehead($pdf, $object, 1, $outputlangs);
354 $pdf->SetFont('', '', $default_font_size - 1);
355 $pdf->MultiCell(0, 3, ''); // Set interline to 3
356 $pdf->SetTextColor(0, 0, 0);
357
358 $tab_top = 90; // position of top tab
359 $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
360
361 $tab_height = $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext;
362
363 $tab_height_newpage = 150;
364
365 // Incoterm
366 $height_incoterms = 0;
367 if (isModEnabled('incoterm')) {
368 $desc_incoterms = $object->getIncotermsForPDF();
369 if ($desc_incoterms) {
370 $tab_top -= 2;
371
372 $pdf->SetFont('', '', $default_font_size - 1);
373 $pdf->writeHTMLCell(190, 3, $this->posxdesc - 1, $tab_top - 1, dol_htmlentitiesbr($desc_incoterms), 0, 1);
374 $nexY = $pdf->GetY();
375 $height_incoterms = $nexY - $tab_top;
376
377 // Rect takes a length in 3rd parameter
378 $pdf->SetDrawColor(192, 192, 192);
379 $pdf->RoundedRect($this->marge_gauche, $tab_top - 1, $this->page_largeur - $this->marge_gauche - $this->marge_droite, $height_incoterms + 3, $this->corner_radius, '1234', 'D');
380
381 $tab_top = $nexY + 6;
382 $height_incoterms += 4;
383 }
384 }
385
386 // Public note and Tracking code
387 if (!empty($object->note_public) || !empty($object->tracking_number)) {
388 $tab_top_alt = $tab_top;
389
390 //$tab_top_alt += 1;
391
392 // Tracking number
393 if (!empty($object->tracking_number)) {
394 $height_trackingnumber = 4;
395
396 $pdf->SetFont('', 'B', $default_font_size - 2);
397 $pdf->writeHTMLCell(60, $height_trackingnumber, $this->posxdesc - 1, $tab_top - 1, $outputlangs->transnoentities("TrackingNumber")." : ".$object->tracking_number, 0, 1, false, true, 'L');
398 $tab_top_alt = $pdf->GetY();
399
400 $object->getUrlTrackingStatus($object->tracking_number);
401 if (!empty($object->tracking_url)) {
402 if ($object->shipping_method_id > 0) {
403 // Get code using getLabelFromKey
404 $code = $outputlangs->getLabelFromKey($this->db, (string) $object->shipping_method_id, 'c_shipment_mode', 'rowid', 'code');
405 $label = '';
406 if ($object->tracking_url != $object->tracking_number) {
407 $label .= $outputlangs->trans("LinkToTrackYourPackage")."<br>";
408 }
409 $label .= $outputlangs->trans("SendingMethod").": ".$outputlangs->trans("SendingMethod".strtoupper($code));
410 //var_dump($object->tracking_url != $object->tracking_number);exit;
411 if ($object->tracking_url != $object->tracking_number) {
412 $label .= " : ";
413 $label .= $object->tracking_url;
414 }
415
416 $height_trackingnumber += 4;
417 $pdf->SetFont('', 'B', $default_font_size - 2);
418 $pdf->writeHTMLCell(60, $height_trackingnumber, $this->posxdesc - 1, $tab_top_alt, $label, 0, 1, false, true, 'L');
419 }
420 }
421 $tab_top = $pdf->GetY();
422 }
423
424 // Notes
425 if (!empty($object->note_public)) {
426 $pdf->SetFont('', '', $default_font_size - 1); // Dans boucle pour gerer multi-page
427 $pdf->writeHTMLCell(190, 3, $this->posxdesc - 1, $tab_top_alt, dol_htmlentitiesbr($object->note_public), 0, 1);
428 }
429
430 $nexY = $pdf->GetY();
431 $height_note = $nexY - $tab_top;
432
433 // Rect takes a length in 3rd parameter
434 $pdf->SetDrawColor(192, 192, 192);
435 $pdf->RoundedRect($this->marge_gauche, $tab_top - 1, $this->page_largeur - $this->marge_gauche - $this->marge_droite, $height_note + 2, $this->corner_radius, '1234', 'D');
436
437 $tab_height -= $height_note;
438 $tab_top = $nexY + 6;
439 } else {
440 $height_note = 0;
441 }
442
443 // Show barcode
444 $height_barcode = 0;
445 //$pdf->Rect($this->marge_gauche, $this->marge_haute, $this->page_largeur-$this->marge_gauche-$this->marge_droite, 30);
446 if (isModEnabled('barcode') && getDolGlobalString('BARCODE_ON_STOCKTRANSFER_PDF')) {
447 require_once DOL_DOCUMENT_ROOT.'/core/modules/barcode/doc/tcpdfbarcode.modules.php';
448
449 $encoding = 'QRCODE';
450 $module = new modTcpdfbarcode();
451 $barcode_path = '';
452 $result = 0;
453 if ($module->encodingIsSupported($encoding)) {
454 $result = $module->writeBarCode($object->ref, $encoding);
455
456 // get path of qrcode image
457 $newcode = $object->ref;
458 if (!preg_match('/^\w+$/', $newcode) || dol_strlen($newcode) > 32) {
459 $newcode = dol_hash($newcode, 'md5');
460 }
461 $barcode_path = $conf->barcode->dir_temp . '/barcode_' . $newcode . '_' . $encoding . '.png';
462 }
463
464 if ($result > 0) {
465 $tab_top -= 2;
466
467 $pdf->Image($barcode_path, $this->marge_gauche, $tab_top, 20, 20);
468
469 $nexY = $pdf->GetY();
470 $height_barcode = 20;
471
472 $tab_top += 22;
473 } else {
474 $this->error = 'Failed to generate barcode';
475 }
476 }
477
478 $iniY = $tab_top + 7;
479 $curY = $tab_top + 7;
480 $nexY = $tab_top + 7;
481
482 $TCacheEntrepots = array();
483 // Loop on each lines
484 for ($i = 0; $i < $nblines; $i++) {
485 $curY = $nexY;
486 $pdf->SetFont('', '', $default_font_size - 1); // Into loop to work with multipage
487 $pdf->SetTextColor(0, 0, 0);
488
489 // Define size of image if we need it
490 $imglinesize = array();
491 if (!empty($realpatharray[$i])) {
492 $imglinesize = pdf_getSizeForImage($realpatharray[$i]);
493 }
494
495 $pdf->setTopMargin($tab_top_newpage);
496 $pdf->setPageOrientation('', true, $heightforfooter + $heightforfreetext + $heightforinfotot); // The only function to edit the bottom margin of current page to set it.
497 $pageposbefore = $pdf->getPage();
498
499 $showpricebeforepagebreak = 1;
500 $posYAfterImage = 0;
501 $posYAfterDescription = 0;
502 $heightforsignature = 0;
503
504 // We start with Photo of product line
505 if (isset($imglinesize['width']) && isset($imglinesize['height']) && ($curY + $imglinesize['height']) > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + $heightforinfotot))) { // If photo too high, we moved completely on new page
506 $pdf->AddPage('', '', true);
507 if (!empty($tplidx)) {
508 $pdf->useTemplate($tplidx);
509 }
510 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
511 $this->_pagehead($pdf, $object, 0, $outputlangs);
512 }
513 $pdf->setPage($pageposbefore + 1);
514
515 $curY = $tab_top_newpage;
516
517 // Allows data in the first page if description is long enough to break in multiples pages
518 if (getDolGlobalString('MAIN_PDF_DATA_ON_FIRST_PAGE')) {
519 $showpricebeforepagebreak = 1;
520 } else {
521 $showpricebeforepagebreak = 0;
522 }
523 }
524
525 if (isset($imglinesize['width']) && isset($imglinesize['height'])) {
526 $curX = $this->posxpicture - 1;
527 $pdf->Image($realpatharray[$i], $curX + (($this->posxqty - $this->posxweightvol - $imglinesize['width']
528 + (getDolGlobalString('STOCKTRANSFER_PDF_HIDE_WEIGHT_AND_VOLUME') ? getDolGlobalInt('MAIN_DOCUMENTS_WITH_PICTURE_WIDTH', 20) : 0)) / 2), $curY, $imglinesize['width'], $imglinesize['height'], '', '', '', 2, 300); // Use 300 dpi
529 // $pdf->Image does not increase value return by getY, so we save it manually
530 $posYAfterImage = $curY + $imglinesize['height'];
531 }
532
533 // Description of product line
534 $curX = $this->posxdesc - 1;
535
536 $pdf->startTransaction();
537 if (method_exists($object->lines[$i], 'fetch_product')) {
538 $object->lines[$i]->fetch_product();
539 $object->lines[$i]->label = $object->lines[$i]->product->label;
540 $object->lines[$i]->description = $object->lines[$i]->product->description;
541 $object->lines[$i]->weight = $object->lines[$i]->product->weight;
542 $object->lines[$i]->weight_units = $object->lines[$i]->product->weight_units;
543 $object->lines[$i]->length = $object->lines[$i]->product->length;
544 $object->lines[$i]->length_units = $object->lines[$i]->product->length_units;
545 $object->lines[$i]->surface = $object->lines[$i]->product->surface;
546 $object->lines[$i]->surface_units = $object->lines[$i]->product->surface_units;
547 $object->lines[$i]->volume = $object->lines[$i]->product->volume;
548 $object->lines[$i]->volume_units = $object->lines[$i]->product->volume_units;
549 $object->lines[$i]->fk_unit = $object->lines[$i]->product->fk_unit;
550 //var_dump($object->lines[$i]);exit;
551 }
552
553 pdf_writelinedesc($pdf, $object, $i, $outputlangs, $this->posxpicture - $curX, 3, $curX, $curY, $hideref, $hidedesc);
554
555 $pageposafter = $pdf->getPage();
556 if ($pageposafter > $pageposbefore) { // There is a pagebreak
557 $pdf->rollbackTransaction(true);
558 $pageposafter = $pageposbefore;
559 //print $pageposafter.'-'.$pageposbefore;exit;
560 $pdf->setPageOrientation('', true, $heightforfooter); // The only function to edit the bottom margin of current page to set it.
561 pdf_writelinedesc($pdf, $object, $i, $outputlangs, $this->posxpicture - $curX, 3, $curX, $curY, $hideref, $hidedesc);
562
563 $pageposafter = $pdf->getPage();
564 $posyafter = $pdf->GetY();
565 //var_dump($posyafter); var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit;
566 if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + $heightforinfotot))) { // There is no space left for total+free text
567 if ($i == ($nblines - 1)) { // No more lines, and no space left to show total, so we create a new page
568 $pdf->AddPage('', '', true);
569 if (!empty($tplidx)) {
570 $pdf->useTemplate($tplidx);
571 }
572 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
573 $this->_pagehead($pdf, $object, 0, $outputlangs);
574 }
575 $pdf->setPage($pageposafter + 1);
576 }
577 } else {
578 // We found a page break
579
580 // Allows data in the first page if description is long enough to break in multiples pages
581 if (getDolGlobalString('MAIN_PDF_DATA_ON_FIRST_PAGE')) {
582 $showpricebeforepagebreak = 1;
583 } else {
584 $showpricebeforepagebreak = 0;
585 }
586 }
587 } else { // No pagebreak
588 $pdf->commitTransaction();
589 }
590 $posYAfterDescription = $pdf->GetY();
591
592 $nexY = max($pdf->GetY(), $posYAfterImage);
593 $pageposafter = $pdf->getPage();
594
595 $pdf->setPage($pageposbefore);
596 $pdf->setTopMargin($this->marge_haute);
597 $pdf->setPageOrientation('', true, 0); // The only function to edit the bottom margin of current page to set it.
598
599 // We suppose that a too long description or photo were moved completely on next page
600 if ($pageposafter > $pageposbefore && empty($showpricebeforepagebreak)) {
601 $pdf->setPage($pageposafter);
602 $curY = $tab_top_newpage;
603 }
604
605 // We suppose that a too long description is moved completely on next page
606 if ($pageposafter > $pageposbefore) {
607 $pdf->setPage($pageposafter);
608 $curY = $tab_top_newpage;
609 }
610
611 $pdf->SetFont('', '', $default_font_size - 1); // We reposition the default font
612
613 // Bottom of the highest cell of the line (batch and warehouses may be written on several lines)
614 $posYAfterCells = $nexY;
615
616 // Lot / série
617 if (isModEnabled('productbatch')) {
618 $pdf->SetXY($this->posxlot, $curY);
619 $pdf->MultiCell(($this->posxweightvol - $this->posxlot), 3, $object->lines[$i]->batch, '', 'C');
620 $posYAfterCells = max($posYAfterCells, $pdf->GetY());
621 }
622
623 // weight
624
625 $pdf->SetXY($this->posxweightvol, $curY);
626 $weighttxt = '';
627 if (empty($object->lines[$i]->fk_product_type) && $object->lines[$i]->weight) {
628 $weighttxt = round($object->lines[$i]->weight * $object->lines[$i]->qty, 5).' '.measuringUnitString(0, "weight", $object->lines[$i]->weight_units, 1);
629 }
630 $voltxt = '';
631 if (empty($object->lines[$i]->fk_product_type) && $object->lines[$i]->volume) {
632 $voltxt = round($object->lines[$i]->volume * $object->lines[$i]->qty, 5).' '.measuringUnitString(0, "volume", $object->lines[$i]->volume_units ? $object->lines[$i]->volume_units : 0, 1);
633 }
634
635 // Weight
636 if (!getDolGlobalString('STOCKTRANSFER_PDF_HIDE_WEIGHT_AND_VOLUME')) {
637 $pdf->writeHTMLCell($this->posxqty - $this->posxweightvol + 2, 3, $this->posxweightvol - 1, $curY, $weighttxt.(($weighttxt && $voltxt) ? '<br>' : '').$voltxt, 0, 0, false, true, 'C');
638 //$pdf->MultiCell(($this->posxqtyordered - $this->posxweightvol), 3, $weighttxt.(($weighttxt && $voltxt)?'<br>':'').$voltxt,'','C');
639 }
640
641 // Qty
642 $pdf->SetXY($this->posxqty, $curY);
643 $pdf->writeHTMLCell($this->posxwarehousesource - $this->posxqty + 2, 3, $this->posxqty - 1, $curY, (string) $object->lines[$i]->qty, 0, 0, false, true, 'C');
644 //$pdf->MultiCell(($this->posxwarehousesource - $this->posxqty), 3, $weighttxt.(($weighttxt && $voltxt)?'<br>':'').$voltxt,'','C');
645
646 // Warehouse source
647 $wh_source = new Entrepot($this->db);
648 if (!empty($TCacheEntrepots[$object->lines[$i]->fk_warehouse_source])) {
649 $wh_source = $TCacheEntrepots[$object->lines[$i]->fk_warehouse_source];
650 } else {
651 $wh_source->fetch($object->lines[$i]->fk_warehouse_source);
652 $TCacheEntrepots[$object->lines[$i]->fk_warehouse_source] = $wh_source;
653 }
654 $pdf->SetXY($this->posxwarehousesource, $curY);
655 $pdf->MultiCell(($this->posxwarehousedestination - $this->posxwarehousesource), 3, $wh_source->ref.(!empty($wh_source->lieu) ? ' - '.$wh_source->lieu : ''), '', 'C');
656 $posYAfterCells = max($posYAfterCells, $pdf->GetY());
657
658 // Warehouse destination
659 $wh_destination = new Entrepot($this->db);
660 if (!empty($TCacheEntrepots[$object->lines[$i]->fk_warehouse_destination])) {
661 $wh_destination = $TCacheEntrepots[$object->lines[$i]->fk_warehouse_destination];
662 } else {
663 $wh_destination->fetch($object->lines[$i]->fk_warehouse_destination);
664 $TCacheEntrepots[$object->lines[$i]->fk_warehouse_destination] = $wh_destination;
665 }
666 $pdf->SetXY($this->posxwarehousedestination, $curY);
667 $pdf->MultiCell(($this->posxpuht - $this->posxwarehousedestination), 3, $wh_destination->ref.(!empty($wh_destination->lieu) ? ' - '.$wh_destination->lieu : ''), '', 'C');
668 $posYAfterCells = max($posYAfterCells, $pdf->GetY());
669
670 if (getDolGlobalString('STOCKTRANSFER_PDF_DISPLAY_AMOUNT_HT')) {
671 $pdf->SetXY($this->posxpuht, $curY);
672 $pdf->MultiCell(($this->posxtotalht - $this->posxpuht - 1), 3, price($object->lines[$i]->subprice, 0, $outputlangs), '', 'R');
673
674 $pdf->SetXY($this->posxtotalht, $curY);
675 $pdf->MultiCell(($this->page_largeur - $this->marge_droite - $this->posxtotalht), 3, price($object->lines[$i]->total_ht, 0, $outputlangs), '', 'R');
676 }
677
678 $nexY = max($nexY, $posYAfterCells);
679 $nexY += 3;
680 if ($weighttxt && $voltxt) {
681 $nexY += 2;
682 }
683
684 // Add line
685 if (getDolGlobalString('MAIN_PDF_DASH_BETWEEN_LINES') && $i < ($nblines - 1)) {
686 $pdf->setPage($pageposafter);
687 $pdf->SetLineStyle(array('dash' => '1,1', 'color' => array(80, 80, 80)));
688 //$pdf->SetDrawColor(190,190,200);
689 $pdf->line($this->marge_gauche, $nexY - 1, $this->page_largeur - $this->marge_droite, $nexY - 1);
690 $pdf->SetLineStyle(array('dash' => 0));
691 }
692
693 // Detect if some page were added automatically and output _tableau for past pages
694 while ($pagenb < $pageposafter) {
695 $pdf->setPage($pagenb);
696 if ($pagenb == 1) {
697 $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1);
698 } else {
699 $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1);
700 }
701 $this->_pagefoot($pdf, $object, $outputlangs, 1);
702 $pagenb++;
703 $pdf->setPage($pagenb);
704 $pdf->setPageOrientation('', true, 0); // The only function to edit the bottom margin of current page to set it.
705 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
706 $this->_pagehead($pdf, $object, 0, $outputlangs);
707 }
708 if (!empty($tplidx)) {
709 $pdf->useTemplate($tplidx);
710 }
711 }
712 if (isset($object->lines[$i + 1]->pagebreak) && $object->lines[$i + 1]->pagebreak) { // @phan-suppress-current-line PhanUndeclaredProperty
713 if ($pagenb == 1) {
714 $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1);
715 } else {
716 $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1);
717 }
718 $this->_pagefoot($pdf, $object, $outputlangs, 1);
719 // New page
720 $pdf->AddPage();
721 if (!empty($tplidx)) {
722 $pdf->useTemplate($tplidx);
723 }
724 $pagenb++;
725 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) {
726 $this->_pagehead($pdf, $object, 0, $outputlangs);
727 }
728 }
729 }
730
731 // Show square
732 if ($pagenb == 1) {
733 $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0);
734 $bottomlasttab = $this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1;
735 } else {
736 $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0);
737 $bottomlasttab = $this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1;
738 }
739
740 // Display total area
741 $posy = $this->_tableau_tot($pdf, $object, 0, $bottomlasttab, $outputlangs);
742
743 // Pagefoot
744 $this->_pagefoot($pdf, $object, $outputlangs);
745 if (method_exists($pdf, 'AliasNbPages')) {
746 $pdf->AliasNbPages(); // @phan-suppress-current-line PhanUndeclaredMethod
747 }
748
749 $pdf->Close();
750
751 $pdf->Output($file, 'F');
752
753 // Add pdfgeneration hook
754 $hookmanager->initHooks(array('pdfgeneration'));
755 $parameters = array('file' => $file, 'object' => $object, 'outputlangs' => $outputlangs);
756 global $action;
757 $reshook = $hookmanager->executeHooks('afterPDFCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
758 if ($reshook < 0) {
759 $this->error = $hookmanager->error;
760 $this->errors = $hookmanager->errors;
761 }
762
763 dolChmod($file);
764
765 $this->result = array('fullpath' => $file);
766
767 return 1; // No error
768 } else {
769 $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
770 return 0;
771 }
772 } else {
773 $this->error = $langs->transnoentities("ErrorConstantNotDefined", "STOCKTRANSFER_OUTPUTDIR");
774 return 0;
775 }
776 }
777
778 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
779 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
790 protected function _tableau_tot(&$pdf, $object, $already_paid, $posy, $outputlangs)
791 {
792 // phpcs:enable
793 $default_font_size = pdf_getPDFFontSize($outputlangs);
794
795 $tab2_top = $posy;
796 $tab2_hl = 4;
797 $pdf->SetFont('', 'B', $default_font_size - 1);
798
799 // Total table
800 $col1x = $this->posxqty - 50;
801 $col2x = $this->posxqty;
802 /*if ($this->page_largeur < 210) // To work with US executive format
803 {
804 $col2x-=20;
805 }*/
806 if (!getDolGlobalString('STOCKTRANSFER_PDF_HIDE_ORDERED')) {
807 $largcol2 = ($this->posxwarehousesource - $this->posxqty);
808 } else {
809 $largcol2 = ($this->posxwarehousedestination - $this->posxqty);
810 }
811
812 $useborder = 0;
813 $index = 0;
814
815 $totalWeight = '';
816 $totalVolume = '';
817 $totalWeighttoshow = '';
818 $totalVolumetoshow = '';
819
820 // Load dim data
821 $tmparray = $object->getTotalWeightVolume();
822 if (!empty($tmparray)) {
823 $totalWeight = $tmparray['weight'];
824 $totalVolume = $tmparray['volume'];
825 }
826 $totalQty = 0;
827 if (!empty($object->lines)) {
828 foreach ($object->lines as $line) {
829 $totalQty += $line->qty;
830 }
831 }
832 // Set trueVolume and volume_units not currently stored into database
833 if ($object->trueWidth && $object->trueHeight && $object->trueDepth) {
834 $object->trueVolume = price(($object->trueWidth * $object->trueHeight * $object->trueDepth), 0, $outputlangs, 0, 0);
835 $object->volume_units = $object->size_units * 3;
836 }
837
838 if (!empty($totalWeight)) {
839 $totalWeighttoshow = showDimensionInBestUnit($totalWeight, 0, "weight", $outputlangs);
840 }
841 if (!empty($totalVolume)) {
842 $totalVolumetoshow = showDimensionInBestUnit($totalVolume, 0, "volume", $outputlangs);
843 }
844 if (!empty($object->trueWeight)) {
845 $totalWeighttoshow = showDimensionInBestUnit($object->trueWeight, $object->weight_units, "weight", $outputlangs);
846 }
847 if (!empty($object->trueVolume)) {
848 $totalVolumetoshow = showDimensionInBestUnit($object->trueVolume, $object->volume_units, "volume", $outputlangs);
849 }
850
851 $pdf->SetFillColor(255, 255, 255);
852 $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
853 $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("Total"), 0, 'L', true);
854
855 if (!getDolGlobalString('STOCKTRANSFER_PDF_HIDE_ORDERED')) {
856 $pdf->SetXY($this->posxqty, $tab2_top + $tab2_hl * $index);
857 $pdf->MultiCell($this->posxwarehousesource - $this->posxqty, $tab2_hl, (string) $totalQty, 0, 'C', true);
858 }
859
860 if (getDolGlobalString('STOCKTRANSFER_PDF_DISPLAY_AMOUNT_HT')) {
861 $pdf->SetXY($this->posxpuht, $tab2_top + $tab2_hl * $index);
862 $pdf->MultiCell($this->posxtotalht - $this->posxpuht, $tab2_hl, '', 0, 'C', true);
863
864 $pdf->SetXY($this->posxtotalht, $tab2_top + $tab2_hl * $index);
865 $pdf->MultiCell($this->page_largeur - $this->marge_droite - $this->posxtotalht, $tab2_hl, price($object->total_ht, 0, $outputlangs), 0, 'C', true);
866 }
867
868 if (!getDolGlobalString('STOCKTRANSFER_PDF_HIDE_WEIGHT_AND_VOLUME')) {
869 // Total Weight
870 if ($totalWeighttoshow) {
871 $pdf->SetXY($this->posxweightvol, $tab2_top + $tab2_hl * $index);
872 $pdf->MultiCell(($this->posxqty - $this->posxweightvol), $tab2_hl, $totalWeighttoshow, 0, 'C', true);
873
874 $index++;
875 }
876 if ($totalVolumetoshow) {
877 $pdf->SetXY($this->posxweightvol, $tab2_top + $tab2_hl * $index);
878 $pdf->MultiCell(($this->posxqty - $this->posxweightvol), $tab2_hl, $totalVolumetoshow, 0, 'C', true);
879
880 $index++;
881 }
882 if (!$totalWeighttoshow && !$totalVolumetoshow) {
883 $index++;
884 }
885 }
886
887 $pdf->SetTextColor(0, 0, 0);
888
889 return ($tab2_top + ($tab2_hl * $index));
890 }
891
892 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
905 protected function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop = 0, $hidebottom = 0)
906 {
907 // phpcs:enable
908 global $conf;
909
910 // Force to disable hidetop and hidebottom
911 $hidebottom = 0;
912 if ($hidetop) {
913 $hidetop = -1;
914 }
915
916 $default_font_size = pdf_getPDFFontSize($outputlangs);
917
918 // Amount in (at tab_top - 1)
919 $pdf->SetTextColor(0, 0, 0);
920 $pdf->SetFont('', '', $default_font_size - 2);
921
922 // Output Rect
923 $this->printRoundedRect($pdf, $this->marge_gauche, $tab_top, $this->page_largeur - $this->marge_gauche - $this->marge_droite, $tab_height, $this->corner_radius, $hidetop, $hidebottom, 'D'); // Rect takes a length in 3rd parameter and 4th parameter
924
925 $pdf->SetDrawColor(128, 128, 128);
926 $pdf->SetFont('', '', $default_font_size - 1);
927
928 // Description
929 if (empty($hidetop)) {
930 $pdf->line($this->marge_gauche, $tab_top + 5, $this->page_largeur - $this->marge_droite, $tab_top + 5);
931
932 $pdf->SetXY($this->posxdesc - 1, $tab_top + 1);
933 $pdf->MultiCell($this->posxlot - $this->posxdesc, 2, $outputlangs->transnoentities("Description"), '', 'L');
934 }
935
936 if (isModEnabled('productbatch') && $this->atLeastOneBatch) {
937 $pdf->line($this->posxlot - 1, $tab_top, $this->posxlot - 1, $tab_top + $tab_height);
938 if (empty($hidetop)) {
939 $pdf->SetXY($this->posxlot, $tab_top + 1);
940 $pdf->MultiCell(($this->posxweightvol - $this->posxlot), 2, $outputlangs->transnoentities("Batch"), '', 'C');
941 }
942 }
943
944 if (!getDolGlobalString('STOCKTRANSFER_PDF_HIDE_WEIGHT_AND_VOLUME')) {
945 $pdf->line($this->posxweightvol - 1, $tab_top, $this->posxweightvol - 1, $tab_top + $tab_height);
946 if (empty($hidetop)) {
947 $pdf->SetXY($this->posxweightvol - 1, $tab_top + 1);
948 $pdf->MultiCell(($this->posxqty - $this->posxweightvol), 2, $outputlangs->transnoentities("WeightVolShort"), '', 'C');
949 }
950 }
951
952 $pdf->line($this->posxqty - 1, $tab_top, $this->posxqty - 1, $tab_top + $tab_height);
953 if (empty($hidetop)) {
954 $pdf->SetXY($this->posxqty - 1, $tab_top + 1);
955 $pdf->MultiCell(($this->posxwarehousesource - $this->posxqty), 2, $outputlangs->transnoentities("Qty"), '', 'C');
956 }
957
958 $pdf->line($this->posxwarehousesource - 1, $tab_top, $this->posxwarehousesource - 1, $tab_top + $tab_height);
959 if (empty($hidetop)) {
960 $pdf->SetXY($this->posxwarehousesource - 1, $tab_top + 1);
961 $pdf->MultiCell(($this->posxwarehousedestination - $this->posxwarehousesource), 2, $outputlangs->transnoentities("WarehouseSource"), '', 'C');
962 }
963
964
965 $pdf->line($this->posxwarehousedestination - 1, $tab_top, $this->posxwarehousedestination - 1, $tab_top + $tab_height);
966 if (empty($hidetop)) {
967 $pdf->SetXY($this->posxwarehousedestination - 2.5, $tab_top + 1);
968 $pdf->MultiCell(($this->posxpuht - $this->posxwarehousedestination + 4), 2, $outputlangs->transnoentities("WarehouseTarget"), '', 'C');
969 }
970
971 /*if (getDolGlobalString('STOCKTRANSFER_PDF_DISPLAY_AMOUNT_HT')) {
972 $pdf->line($this->posxpuht - 1, $tab_top, $this->posxpuht - 1, $tab_top + $tab_height);
973 if (empty($hidetop))
974 {
975 $pdf->SetXY($this->posxpuht - 1, $tab_top + 1);
976 $pdf->MultiCell(($this->posxtotalht - $this->posxpuht), 2, $outputlangs->transnoentities("PriceUHT"), '', 'C');
977 }
978
979 $pdf->line($this->posxtotalht - 1, $tab_top, $this->posxtotalht - 1, $tab_top + $tab_height);
980 if (empty($hidetop))
981 {
982 $pdf->SetXY($this->posxtotalht - 1, $tab_top + 1);
983 $pdf->MultiCell(($this->page_largeur - $this->marge_droite - $this->posxtotalht), 2, $outputlangs->transnoentities("TotalHT"), '', 'C');
984 }
985 }*/
986 }
987
994 public function atLeastOneBatch($object)
995 {
996 //$atLeastOneBatch = false;
997
998 if (!isModEnabled('productbatch')) {
999 return false;
1000 }
1001
1002 if (!empty($object->lines)) {
1003 foreach ($object->lines as $line) {
1004 if (!empty($line->batch)) {
1005 return true;
1006 }
1007 }
1008 }
1009
1010 return false;
1011 }
1012
1013 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
1023 protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs)
1024 {
1025 // phpcs:enable
1026 global $conf, $langs;
1027
1028 // Load traductions files required by page
1029 $outputlangs->loadLangs(array("main", "bills", "propal", "orders", "companies"));
1030
1031 $default_font_size = pdf_getPDFFontSize($outputlangs);
1032
1033 pdf_pagehead($pdf, $outputlangs, $this->page_hauteur);
1034
1035 // Show Draft Watermark
1036 if ($object->statut == 0 && (getDolGlobalString('STOCKTRANSFER_DRAFT_WATERMARK'))) {
1037 pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->SHIPPING_DRAFT_WATERMARK);
1038 }
1039
1040 //Prepare next
1041 $pdf->SetTextColor(0, 0, 60);
1042 $pdf->SetFont('', 'B', $default_font_size + 3);
1043
1044 $w = 110;
1045
1046 $posy = $this->marge_haute;
1047 $posx = $this->page_largeur - $this->marge_droite - $w;
1048
1049 $pdf->SetXY($this->marge_gauche, $posy);
1050
1051 // Logo
1052 $logo = $conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo;
1053 if ($this->emetteur->logo) {
1054 if (is_readable($logo)) {
1055 $height = pdf_getHeightForLogo($logo);
1056 $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
1057 } else {
1058 $pdf->SetTextColor(200, 0, 0);
1059 $pdf->SetFont('', 'B', $default_font_size - 2);
1060 $pdf->MultiCell($w, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
1061 $pdf->MultiCell($w, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
1062 }
1063 } else {
1064 $text = $this->emetteur->name;
1065 $pdf->MultiCell($w, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
1066 }
1067
1068 $pdf->SetDrawColor(128, 128, 128);
1069
1070 $posx = $this->page_largeur - $w - $this->marge_droite;
1071 $posy = $this->marge_haute;
1072
1073 $pdf->SetFont('', 'B', $default_font_size + 2);
1074 $pdf->SetXY($posx, $posy);
1075 $pdf->SetTextColor(0, 0, 60);
1076 $title = $outputlangs->transnoentities("StockTransferSheet").' '.$object->ref;
1077 $pdf->MultiCell($w, 4, $title, '', 'R');
1078
1079 $pdf->SetFont('', '', $default_font_size + 1);
1080
1081 // Date prévue depart
1082 if (!empty($object->date_prevue_depart)) {
1083 $posy += 4;
1084 $pdf->SetXY($posx, $posy);
1085 $pdf->SetTextColor(0, 0, 60);
1086 $pdf->MultiCell($w, 4, $outputlangs->transnoentities("DatePrevueDepart")." : ".dol_print_date($object->date_prevue_depart, "day", false, $outputlangs, true), '', 'R');
1087 }
1088
1089 // Date prévue arrivée
1090 if (!empty($object->date_prevue_arrivee)) {
1091 $posy += 4;
1092 $pdf->SetXY($posx, $posy);
1093 $pdf->SetTextColor(0, 0, 60);
1094 $pdf->MultiCell($w, 4, $outputlangs->transnoentities("DatePrevueArrivee")." : ".dol_print_date($object->date_prevue_arrivee, "day", false, $outputlangs, true), '', 'R');
1095 }
1096
1097 // Date reelle depart
1098 if (!empty($object->date_reelle_depart)) {
1099 $posy += 4;
1100 $pdf->SetXY($posx, $posy);
1101 $pdf->SetTextColor(0, 0, 60);
1102 $pdf->MultiCell($w, 4, $outputlangs->transnoentities("DateReelleDepart")." : ".dol_print_date($object->date_reelle_depart, "day", false, $outputlangs, true), '', 'R');
1103 }
1104
1105 // Date reelle arrivée
1106 if (!empty($object->date_reelle_arrivee)) {
1107 $posy += 4;
1108 $pdf->SetXY($posx, $posy);
1109 $pdf->SetTextColor(0, 0, 60);
1110 $pdf->MultiCell($w, 4, $outputlangs->transnoentities("DateReelleArrivee")." : ".dol_print_date($object->date_reelle_arrivee, "day", false, $outputlangs, true), '', 'R');
1111 }
1112
1113 if (!empty($object->thirdparty->code_client)) {
1114 $posy += 4;
1115 $pdf->SetXY($posx, $posy);
1116 $pdf->SetTextColor(0, 0, 60);
1117 $pdf->MultiCell($w, 3, $outputlangs->transnoentities("CustomerCode")." : ".$outputlangs->transnoentities($object->thirdparty->code_client), '', 'R');
1118 }
1119
1120
1121 $pdf->SetFont('', '', $default_font_size + 3);
1122 $Yoff = 25;
1123
1124 // Add list of linked orders
1125 $origin = $object->origin;
1126 $origin_id = $object->origin_id;
1127
1128 // TODO move to external function
1129 if (isModEnabled($origin)) { // commonly $origin='commande'
1130 $outputlangs->load('orders');
1131
1132 $classname = ucfirst($origin);
1133 $linkedobject = new $classname($this->db);
1134 '@phan-var-force CommonObject $linkedobject';
1135 $result = $linkedobject->fetch($origin_id);
1136 if ($result >= 0) {
1137 //$linkedobject->fetchObjectLinked() Get all linked object to the $linkedobject (commonly order) into $linkedobject->linkedObjects
1138
1139 $pdf->SetFont('', '', $default_font_size - 2);
1140 $text = $linkedobject->ref;
1141 if (isset($linkedobject->ref_client) && !empty($linkedobject->ref_client)) {
1142 $text .= ' ('.$linkedobject->ref_client.')';
1143 }
1144 $Yoff += 8;
1145 $pdf->SetXY($this->page_largeur - $this->marge_droite - $w, $Yoff);
1146 $pdf->MultiCell($w, 2, $outputlangs->transnoentities("RefOrder")." : ".$outputlangs->transnoentities($text), 0, 'R');
1147 $Yoff += 3;
1148 $pdf->SetXY($this->page_largeur - $this->marge_droite - $w, $Yoff);
1149 $pdf->MultiCell($w, 2, $outputlangs->transnoentities("OrderDate")." : ".dol_print_date($linkedobject->date, "day", false, $outputlangs, true), 0, 'R');
1150 }
1151 }
1152
1153 $top_shift = 0;
1154
1155 if ($showaddress) {
1156 // Sender properties
1157 $carac_emetteur = '';
1158 // Add internal contact of origin element if defined
1159 $arrayidcontact = array();
1160 $arrayidcontact = $object->getIdContact('external', 'STFROM');
1161
1162 $usecontact = false;
1163 if (count($arrayidcontact) > 0) {
1164 /*$object->fetch_user(reset($arrayidcontact));
1165 $carac_emetteur .= ($carac_emetteur ? "\n" : '').$outputlangs->transnoentities("Name").": ".$outputlangs->convToOutputCharset($object->user->getFullName($outputlangs))."\n";*/
1166 $usecontact = true;
1167 $result = $object->fetch_contact($arrayidcontact[0]);
1168 }
1169
1170 if ($usecontact) {
1171 $thirdparty = $object->contact;
1172 } else {
1173 $thirdparty = $this->emetteur;
1174 }
1175
1176 if (!empty($thirdparty)) {
1177 $carac_emetteur_name = pdfBuildThirdpartyName($thirdparty, $outputlangs);
1178 } else {
1179 $carac_emetteur_name = '';
1180 }
1181
1182 if ($usecontact) {
1183 $carac_emetteur .= pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, $object->contact, 1, 'targetwithdetails', $object);
1184 } else {
1185 $carac_emetteur .= pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, '', 0, 'source', $object);
1186 }
1187
1188 // Show sender
1189 $posy = getDolGlobalString('MAIN_PDF_USE_ISO_LOCATION') ? 40 : 42;
1190 $posx = $this->marge_gauche;
1191 if (getDolGlobalString('MAIN_INVERT_SENDER_RECIPIENT')) {
1192 $posx = $this->page_largeur - $this->marge_droite - 80;
1193 }
1194
1195 $hautcadre = getDolGlobalString('MAIN_PDF_USE_ISO_LOCATION') ? 38 : 40;
1196 $widthrecbox = getDolGlobalString('MAIN_PDF_USE_ISO_LOCATION') ? 92 : 82;
1197
1198 // Show sender frame
1199 $pdf->SetTextColor(0, 0, 0);
1200 $pdf->SetFont('', '', $default_font_size - 2);
1201 $pdf->SetXY($posx, $posy - 5);
1202 $pdf->MultiCell($widthrecbox, 5, $outputlangs->transnoentities("Sender").":", 0, 'L');
1203 $pdf->SetXY($posx, $posy);
1204 $pdf->SetFillColor(230, 230, 230);
1205 $pdf->RoundedRect($posx, $posy, $widthrecbox, $hautcadre, $this->corner_radius, '1234', 'F');
1206 $pdf->SetTextColor(0, 0, 60);
1207 $pdf->SetFillColor(255, 255, 255);
1208
1209 // Show sender name
1210 $pdf->SetXY($posx + 2, $posy + 3);
1211 $pdf->SetFont('', 'B', $default_font_size);
1212 $pdf->MultiCell($widthrecbox - 2, 4, $outputlangs->convToOutputCharset($carac_emetteur_name), 0, 'L');
1213 $posy = $pdf->getY();
1214
1215 // Show sender information
1216 $pdf->SetXY($posx + 2, $posy);
1217 $pdf->SetFont('', '', $default_font_size - 1);
1218 $pdf->MultiCell($widthrecbox - 2, 4, $carac_emetteur, 0, 'L');
1219
1220
1221 // If SHIPPING contact defined, we use it
1222 $usecontact = false;
1223 $arrayidcontact = $object->getIdContact('external', 'STDEST');
1224 if (count($arrayidcontact) > 0) {
1225 $usecontact = true;
1226 $result = $object->fetch_contact($arrayidcontact[0]);
1227 }
1228
1229 //Recipient name
1230 // On peut utiliser le nom de la societe du contact
1231 if ($usecontact/* && !empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT)*/) {
1232 $thirdparty = $object->contact;
1233 } else {
1234 $thirdparty = $object->thirdparty;
1235 }
1236
1237 $carac_client_name = '';
1238 if (!empty($thirdparty)) {
1239 $carac_client_name = pdfBuildThirdpartyName($thirdparty, $outputlangs);
1240 }
1241
1242 $carac_client = pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, (!empty($object->contact) ? $object->contact : null), ($usecontact ? 1 : 0), 'targetwithdetails', $object);
1243
1244 // Show recipient
1245 $widthrecbox = getDolGlobalString('MAIN_PDF_USE_ISO_LOCATION') ? 92 : 100;
1246 if ($this->page_largeur < 210) {
1247 $widthrecbox = 84; // To work with US executive format
1248 }
1249 $posy = getDolGlobalString('MAIN_PDF_USE_ISO_LOCATION') ? 40 : 42;
1250 $posx = $this->page_largeur - $this->marge_droite - $widthrecbox;
1251 if (getDolGlobalString('MAIN_INVERT_SENDER_RECIPIENT')) {
1252 $posx = $this->marge_gauche;
1253 }
1254
1255 // Show recipient frame
1256 $pdf->SetTextColor(0, 0, 0);
1257 $pdf->SetFont('', '', $default_font_size - 2);
1258 $pdf->SetXY($posx + 2, $posy - 5);
1259 $pdf->MultiCell($widthrecbox, 5, $outputlangs->transnoentities("Recipient").":", 0, 'L');
1260 $pdf->RoundedRect($posx, $posy, $widthrecbox, $hautcadre, $this->corner_radius, '1234', 'D');
1261
1262 // Show recipient name
1263 $pdf->SetXY($posx + 2, $posy + 3);
1264 $pdf->SetFont('', 'B', $default_font_size);
1265 $pdf->MultiCell($widthrecbox, 2, $carac_client_name, 0, 'L');
1266
1267 $posy = $pdf->getY();
1268
1269 // Show recipient information
1270 $pdf->SetXY($posx + 2, $posy);
1271 $pdf->SetFont('', '', $default_font_size - 1);
1272 $pdf->MultiCell($widthrecbox, 4, $carac_client, 0, 'L');
1273 }
1274
1275 $pdf->SetTextColor(0, 0, 0);
1276
1277 return $top_shift;
1278 }
1279
1280 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
1290 protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
1291 {
1292 // phpcs:enable
1293 $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
1294 return pdf_pagefoot($pdf, $outputlangs, 'STOCKTRANSFER_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
1295 }
1296}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:67
printRoundedRect($pdf, $x, $y, $w, $h, $r, $hidetop=0, $hidebottom=0, $style='D')
Print a rounded rectangle on the PDF.
Class to manage Dolibarr database access.
Class to manage warehouses.
Class to manage hooks.
Parent class for documents models.
Class to manage products or services.
Class to manage translations.
Class to generate barcode images using tcpdf barcode generator.
Class to build sending documents with model Eagle.
__construct(DoliDB $db)
Constructor.
write_file($object, $outputlangs, $srctemplatepath='', $hidedetails=0, $hidedesc=0, $hideref=0)
Function to build pdf onto disk.
_pagefoot(&$pdf, $object, $outputlangs, $hidefreetext=0)
Show footer of page.
_tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop=0, $hidebottom=0)
Show table for lines.
atLeastOneBatch($object)
Used to know if at least one line of Stock Transfer object has a batch set.
_tableau_tot(&$pdf, $object, $already_paid, $posy, $outputlangs)
Show total to pay.
_pagehead(&$pdf, $object, $showaddress, $outputlangs)
Show top header of page.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
getCallerInfoString()
Get caller info as a string that can be appended to a log message.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dolChmod($filepath, $newmask='')
Change mod of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
pdf_getSizeForImage($realpath)
Return dimensions to use for images onto PDF checking that width and height are not higher than maxim...
Definition pdf.lib.php:2731
pdf_writelinedesc(&$pdf, $object, $i, $outputlangs, $w, $h, $posx, $posy, $hideref=0, $hidedesc=0, $issupplierline=0, $align='J')
Output line description into PDF.
Definition pdf.lib.php:1463
pdf_getFormat($outputlangs=null, $mode='setup')
Return array with format properties of default PDF format.
Definition pdf.lib.php:87
pdf_getPDFFontSize($outputlangs)
Return font size to use for PDF generation.
Definition pdf.lib.php:289
pdf_getHeightForLogo($logo, $url=false)
Return height to use for Logo onto PDF.
Definition pdf.lib.php:314
pdf_pagefoot(&$pdf, $outputlangs, $paramfreetext, $fromcompany, $marge_basse, $marge_gauche, $page_hauteur, $object, $showdetails=0, $hidefreetext=0, $page_largeur=0, $watermark='')
Show footer of page for PDF generation.
Definition pdf.lib.php:1047
pdf_pagehead(&$pdf, $outputlangs, $page_height)
Show header of page for PDF generation.
Definition pdf.lib.php:742
pdf_getPDFFont($outputlangs)
Return font name to use for PDF generation.
Definition pdf.lib.php:266
pdf_build_address($outputlangs, $sourcecompany, $targetcompany='', $targetcontact='', $usecontact=0, $mode='source', $object=null)
Return a string with full address formatted for output on PDF documents.
Definition pdf.lib.php:439
pdf_getInstance($format='', $metric='mm', $pagetype='P')
Return a PDF instance object.
Definition pdf.lib.php:129
pdfBuildThirdpartyName($thirdparty, Translate $outputlangs, $includealias=0)
Returns the name of the thirdparty.
Definition pdf.lib.php:391
pdf_watermark(&$pdf, $outputlangs, $h, $w, $unit, $text)
Add a draft watermark on PDF files.
Definition pdf.lib.php:798
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:158
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition repair.php:161
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.