dolibarr 18.0.6
pdf_eagle_proforma.modules.php
1<?php
2/* Copyright (C) 2004-2014 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
4 * Copyright (C) 2008 Raphael Bertrand <raphael.bertrand@resultic.fr>
5 * Copyright (C) 2010-2013 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2012 Christophe Battarel <christophe.battarel@altairis.fr>
7 * Copyright (C) 2012 Cedric Salvador <csalvador@gpcsolutions.fr>
8 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
9 * Copyright (C) 2017 Ferran Marcet <fmarcet@2byte.es>
10 * Copyright (C) 2018-2019 Frédéric France <frederic.france@netlogic.fr>
11 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <https://www.gnu.org/licenses/>.
25 * or see https://www.gnu.org/
26 */
27
34require_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
35require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
36require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php';
39
40
45{
49 public $db;
50
54 public $name;
55
59 public $description;
60
64 public $update_main_doc_field;
65
69 public $type;
70
75 public $version = 'dolibarr';
76
80 public $page_largeur;
81
85 public $page_hauteur;
86
90 public $format;
91
95 public $marge_gauche;
96
100 public $marge_droite;
101
105 public $marge_haute;
106
110 public $marge_basse;
111
116 public $emetteur;
117
118
124 public function __construct($db)
125 {
126 global $conf, $langs, $mysoc;
127
128 // Translations
129 $langs->loadLangs(array("main", "bills", "products"));
130
131 $this->db = $db;
132 $this->name = $langs->trans("StockTransferSheetProforma");
133 $this->description = $langs->trans('StockTransferSheetProforma');
134 $this->update_main_doc_field = 1; // Save the name of generated file as the main doc when generating a doc with this template
135
136 // Dimension page
137 $this->type = 'pdf';
138 $formatarray = pdf_getFormat();
139 $this->page_largeur = $formatarray['width'];
140 $this->page_hauteur = $formatarray['height'];
141 $this->format = array($this->page_largeur, $this->page_hauteur);
142 $this->marge_gauche = getDolGlobalInt('MAIN_PDF_MARGIN_LEFT', 10);
143 $this->marge_droite = getDolGlobalInt('MAIN_PDF_MARGIN_RIGHT', 10);
144 $this->marge_haute = getDolGlobalInt('MAIN_PDF_MARGIN_TOP', 10);
145 $this->marge_basse = getDolGlobalInt('MAIN_PDF_MARGIN_BOTTOM', 10);
146
147 $this->option_logo = 1; // Display logo
148 $this->option_tva = 1; // Manage the vat option FACTURE_TVAOPTION
149 $this->option_modereg = 1; // Display payment mode
150 $this->option_condreg = 1; // Display payment terms
151 $this->option_codeproduitservice = 1; // Display product-service code
152 $this->option_multilang = 1; // Available in several languages
153 $this->option_escompte = 0; // Displays if there has been a discount
154 $this->option_credit_note = 0; // Support credit notes
155 $this->option_freetext = 1; // Support add of a personalised text
156 $this->option_draft_watermark = 1; // Support add of a watermark on drafts
157
158 // Get source company
159 $this->emetteur = $mysoc;
160 if (empty($this->emetteur->country_code)) $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default, if was not defined
161
162 // Define position of columns
163 $this->posxdesc = $this->marge_gauche + 1;
164
165
166 $this->tabTitleHeight = 5; // default height
167
168 $this->tva = array();
169 $this->localtax1 = array();
170 $this->localtax2 = array();
171 $this->atleastoneratenotnull = 0;
172 $this->atleastonediscount = 0;
173 }
174
175 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
187 public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0)
188 {
189 // phpcs:enable
190 global $user, $langs, $conf, $mysoc, $db, $hookmanager, $nblines;
191
192 if (!is_object($outputlangs)) $outputlangs = $langs;
193 // For backward compatibility with FPDF, force output charset to ISO, because FPDF expect text to be encoded in ISO
194 if (!empty($conf->global->MAIN_USE_FPDF)) $outputlangs->charset_output = 'ISO-8859-1';
195
196 // Load translation files required by the page
197 $outputlangs->loadLangs(array("main", "dict", "companies", "bills", "products", "orders", "deliveries"));
198
199 if (!empty($conf->global->PDF_USE_ALSO_LANGUAGE_CODE) && $outputlangs->defaultlang != $conf->global->PDF_USE_ALSO_LANGUAGE_CODE) {
200 global $outputlangsbis;
201 $outputlangsbis = new Translate('', $conf);
202 $outputlangsbis->setDefaultLang($conf->global->PDF_USE_ALSO_LANGUAGE_CODE);
203 $outputlangsbis->loadLangs(array("main", "dict", "companies", "bills", "products", "orders", "deliveries"));
204 }
205
206 $nblines = is_array($object->lines) ? count($object->lines) : 0;
207
208 $hidetop = 0;
209 if (!empty($conf->global->MAIN_PDF_DISABLE_COL_HEAD_TITLE)) {
210 $hidetop = $conf->global->MAIN_PDF_DISABLE_COL_HEAD_TITLE;
211 }
212
213 // Loop on each lines to detect if there is at least one image to show
214 $realpatharray = array();
215 $this->atleastonephoto = false;
216 if (!empty($conf->global->MAIN_GENERATE_ORDERS_WITH_PICTURE)) {
217 $objphoto = new Product($this->db);
218
219 for ($i = 0; $i < $nblines; $i++) {
220 if (empty($object->lines[$i]->fk_product)) continue;
221
222 $objphoto->fetch($object->lines[$i]->fk_product);
223 //var_dump($objphoto->ref);exit;
224 if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
225 $pdir[0] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/";
226 $pdir[1] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/';
227 } else {
228 $pdir[0] = get_exdir(0, 0, 0, 0, $objphoto, 'product').dol_sanitizeFileName($objphoto->ref).'/'; // default
229 $pdir[1] = get_exdir($objphoto->id, 2, 0, 0, $objphoto, 'product').$objphoto->id."/photos/"; // alternative
230 }
231
232 $arephoto = false;
233 foreach ($pdir as $midir) {
234 if (!$arephoto) {
235 $dir = $conf->product->dir_output.'/'.$midir;
236
237 foreach ($objphoto->liste_photos($dir, 1) as $key => $obj) {
238 if (!getDolGlobalInt('CAT_HIGH_QUALITY_IMAGES')) { // If CAT_HIGH_QUALITY_IMAGES not defined, we use thumb if defined and then original photo
239 if ($obj['photo_vignette']) {
240 $filename = $obj['photo_vignette'];
241 } else {
242 $filename = $obj['photo'];
243 }
244 } else {
245 $filename = $obj['photo'];
246 }
247
248 $realpath = $dir.$filename;
249 $arephoto = true;
250 $this->atleastonephoto = true;
251 }
252 }
253 }
254
255 if ($realpath && $arephoto) $realpatharray[$i] = $realpath;
256 }
257 }
258
259
260
261 if ($conf->stocktransfer->dir_output) {
262 $object->fetch_thirdparty();
263
264 $deja_regle = 0;
265
266 // Definition of $dir and $file
267 if ($object->specimen) {
268 $dir = $conf->stocktransfer->multidir_output[$conf->entity];
269 $file = $dir."/SPECIMEN.pdf";
270 } else {
271 $objectref = dol_sanitizeFileName($object->ref);
272 $dir = $conf->stocktransfer->multidir_output[$conf->entity]."/".$object->element."/".$objectref;
273 $file = $dir."/".$objectref."-proforma.pdf";
274 }
275
276 if (!file_exists($dir)) {
277 if (dol_mkdir($dir) < 0) {
278 $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
279 return 0;
280 }
281 }
282
283 if (file_exists($dir)) {
284 // Add pdfgeneration hook
285 if (!is_object($hookmanager)) {
286 include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
287 $hookmanager = new HookManager($this->db);
288 }
289 $hookmanager->initHooks(array('pdfgeneration'));
290 $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs);
291 global $action;
292 $reshook = $hookmanager->executeHooks('beforePDFCreation', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
293
294 // Create pdf instance
295 $pdf = pdf_getInstance($this->format);
296 $default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance
297 $pdf->SetAutoPageBreak(1, 0);
298
299 $heightforinfotot = 40; // Height reserved to output the info and total part
300 $heightforfreetext = (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT) ? $conf->global->MAIN_PDF_FREETEXT_HEIGHT : 5); // Height reserved to output the free text on last page
301 $heightforfooter = $this->marge_basse + (empty($conf->global->MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS) ? 12 : 22); // Height reserved to output the footer (value include bottom margin)
302
303 if (class_exists('TCPDF')) {
304 $pdf->setPrintHeader(false);
305 $pdf->setPrintFooter(false);
306 }
307 $pdf->SetFont(pdf_getPDFFont($outputlangs));
308 // Set path to the background PDF File
309 if (!empty($conf->global->MAIN_ADD_PDF_BACKGROUND)) {
310 $pagecount = $pdf->setSourceFile($conf->mycompany->multidir_output[$object->entity].'/'.$conf->global->MAIN_ADD_PDF_BACKGROUND);
311 $tplidx = $pdf->importPage(1);
312 }
313
314 $pdf->Open();
315 $pagenb = 0;
316 $pdf->SetDrawColor(128, 128, 128);
317
318 $pdf->SetTitle($outputlangs->convToOutputCharset($object->ref));
319 $pdf->SetSubject($outputlangs->transnoentities("PdfOrderTitle"));
320 $pdf->SetCreator("Dolibarr ".DOL_VERSION);
321 $pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
322 $pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("PdfOrderTitle")." ".$outputlangs->convToOutputCharset($object->thirdparty->name));
323 if (getDolGlobalString('MAIN_DISABLE_PDF_COMPRESSION')) {
324 $pdf->SetCompression(false);
325 }
326
327 $pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite); // Left, Top, Right
328
330 foreach ($object->lines as $line) {
331 if ($line->remise_percent) {
332 $this->atleastonediscount = true;
333 break;
334 }
335 }
336
337
338 // New page
339 $pdf->AddPage();
340 if (!empty($tplidx)) $pdf->useTemplate($tplidx);
341 $pagenb++;
342 $top_shift = $this->_pagehead($pdf, $object, 1, $outputlangs);
343 $pdf->SetFont('', '', $default_font_size - 1);
344 $pdf->MultiCell(0, 3, ''); // Set interline to 3
345 $pdf->SetTextColor(0, 0, 0);
346
347
348 $tab_top = 90 + $top_shift;
349 $tab_top_newpage = (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD') ? 42 + $top_shift : 10);
350
351 // Incoterm
352 if ($conf->incoterm->enabled) {
353 $desc_incoterms = $object->getIncotermsForPDF();
354 if ($desc_incoterms) {
355 $tab_top -= 2;
356
357 $pdf->SetFont('', '', $default_font_size - 1);
358 $pdf->writeHTMLCell(190, 3, $this->posxdesc - 1, $tab_top - 1, dol_htmlentitiesbr($desc_incoterms), 0, 1);
359 $nexY = $pdf->GetY();
360 $height_incoterms = $nexY - $tab_top;
361
362 // Rect takes a length in 3rd parameter
363 $pdf->SetDrawColor(192, 192, 192);
364 $pdf->Rect($this->marge_gauche, $tab_top - 1, $this->page_largeur - $this->marge_gauche - $this->marge_droite, $height_incoterms + 1);
365
366 $tab_top = $nexY + 6;
367 }
368 }
369
370 // Displays notes
371 $notetoshow = empty($object->note_public) ? '' : $object->note_public;
372 if (!empty($conf->global->MAIN_ADD_SALE_REP_SIGNATURE_IN_NOTE)) {
373 // Get first sale rep
374 if (is_object($object->thirdparty)) {
375 $salereparray = $object->thirdparty->getSalesRepresentatives($user);
376 $salerepobj = new User($this->db);
377 $salerepobj->fetch($salereparray[0]['id']);
378 if (!empty($salerepobj->signature)) $notetoshow = dol_concatdesc($notetoshow, $salerepobj->signature);
379 }
380 }
381
382 // Extrafields in note
383 $extranote = $this->getExtrafieldsInHtml($object, $outputlangs);
384 if (!empty($extranote)) {
385 $notetoshow = dol_concatdesc($notetoshow, $extranote);
386 }
387
388 $pagenb = $pdf->getPage();
389 if ($notetoshow) {
390 $tab_width = $this->page_largeur - $this->marge_gauche - $this->marge_droite;
391 $pageposbeforenote = $pagenb;
392
393 $substitutionarray = pdf_getSubstitutionArray($outputlangs, null, $object);
394 complete_substitutions_array($substitutionarray, $outputlangs, $object);
395 $notetoshow = make_substitutions($notetoshow, $substitutionarray, $outputlangs);
396 $notetoshow = convertBackOfficeMediasLinksToPublicLinks($notetoshow);
397
398 $tab_top -= 2;
399
400 $pdf->startTransaction();
401
402 $pdf->SetFont('', '', $default_font_size - 1);
403 $pdf->writeHTMLCell(190, 3, $this->posxdesc - 1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1);
404 // Description
405 $pageposafternote = $pdf->getPage();
406 $posyafter = $pdf->GetY();
407
408 if ($pageposafternote > $pageposbeforenote) {
409 $pdf->rollbackTransaction(true);
410
411 // prepare pages to receive notes
412 while ($pagenb < $pageposafternote) {
413 $pdf->AddPage();
414 $pagenb++;
415 if (!empty($tplidx)) $pdf->useTemplate($tplidx);
416 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
417 // $this->_pagefoot($pdf,$object,$outputlangs,1);
418 $pdf->setTopMargin($tab_top_newpage);
419 // The only function to edit the bottom margin of current page to set it.
420 $pdf->setPageOrientation('', 1, $heightforfooter + $heightforfreetext);
421 }
422
423 // back to start
424 $pdf->setPage($pageposbeforenote);
425 $pdf->setPageOrientation('', 1, $heightforfooter + $heightforfreetext);
426 $pdf->SetFont('', '', $default_font_size - 1);
427 $pdf->writeHTMLCell(190, 3, $this->posxdesc - 1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1);
428 $pageposafternote = $pdf->getPage();
429
430 $posyafter = $pdf->GetY();
431
432 if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + 20))) { // There is no space left for total+free text
433 $pdf->AddPage('', '', true);
434 $pagenb++;
435 $pageposafternote++;
436 $pdf->setPage($pageposafternote);
437 $pdf->setTopMargin($tab_top_newpage);
438 // The only function to edit the bottom margin of current page to set it.
439 $pdf->setPageOrientation('', 1, $heightforfooter + $heightforfreetext);
440 //$posyafter = $tab_top_newpage;
441 }
442
443
444 // apply note frame to previous pages
445 $i = $pageposbeforenote;
446 while ($i < $pageposafternote) {
447 $pdf->setPage($i);
448
449
450 $pdf->SetDrawColor(128, 128, 128);
451 // Draw note frame
452 if ($i > $pageposbeforenote) {
453 $height_note = $this->page_hauteur - ($tab_top_newpage + $heightforfooter);
454 $pdf->Rect($this->marge_gauche, $tab_top_newpage - 1, $tab_width, $height_note + 1);
455 } else {
456 $height_note = $this->page_hauteur - ($tab_top + $heightforfooter);
457 $pdf->Rect($this->marge_gauche, $tab_top - 1, $tab_width, $height_note + 1);
458 }
459
460 // Add footer
461 $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
462 $this->_pagefoot($pdf, $object, $outputlangs, 1);
463
464 $i++;
465 }
466
467 // apply note frame to last page
468 $pdf->setPage($pageposafternote);
469 if (!empty($tplidx)) $pdf->useTemplate($tplidx);
470 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
471 $height_note = $posyafter - $tab_top_newpage;
472 $pdf->Rect($this->marge_gauche, $tab_top_newpage - 1, $tab_width, $height_note + 1);
473 } else // No pagebreak
474 {
475 $pdf->commitTransaction();
476 $posyafter = $pdf->GetY();
477 $height_note = $posyafter - $tab_top;
478 $pdf->Rect($this->marge_gauche, $tab_top - 1, $tab_width, $height_note + 1);
479
480
481 if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + 20))) {
482 // not enough space, need to add page
483 $pdf->AddPage('', '', true);
484 $pagenb++;
485 $pageposafternote++;
486 $pdf->setPage($pageposafternote);
487 if (!empty($tplidx)) $pdf->useTemplate($tplidx);
488 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
489
490 $posyafter = $tab_top_newpage;
491 }
492 }
493
494 $tab_height = $tab_height - $height_note;
495 $tab_top = $posyafter + 6;
496 } else {
497 $height_note = 0;
498 }
499
500
501 // Use new auto column system
502 $this->prepareArrayColumnField($object, $outputlangs, $hidedetails, $hidedesc, $hideref);
503
504 // tab simulation to know line height
505 $pdf->startTransaction();
506 $this->pdfTabTitles($pdf, $tab_top, $tab_height, $outputlangs, $hidetop);
507 $pdf->rollbackTransaction(true);
508
509 $nexY = $tab_top + $this->tabTitleHeight;
510
511 // Loop on each lines
512 $pageposbeforeprintlines = $pdf->getPage();
513 $pagenb = $pageposbeforeprintlines;
514 for ($i = 0; $i < $nblines; $i++) {
515 $curY = $nexY;
516 $pdf->SetFont('', '', $default_font_size - 1); // Into loop to work with multipage
517 $pdf->SetTextColor(0, 0, 0);
518
519 // Define size of image if we need it
520 $imglinesize = array();
521 if (!empty($realpatharray[$i])) $imglinesize = pdf_getSizeForImage($realpatharray[$i]);
522
523 $pdf->setTopMargin($tab_top_newpage);
524 $pdf->setPageOrientation('', 1, $heightforfooter + $heightforfreetext + $heightforinfotot); // The only function to edit the bottom margin of current page to set it.
525 $pageposbefore = $pdf->getPage();
526
527
528 $showpricebeforepagebreak = 1;
529 $posYAfterImage = 0;
530
531 if ($this->getColumnStatus('photo')) {
532 // We start with Photo of product line
533 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
534 $pdf->AddPage('', '', true);
535 if (!empty($tplidx)) $pdf->useTemplate($tplidx);
536 $pdf->setPage($pageposbefore + 1);
537
538 $curY = $tab_top_newpage;
539
540 // Allows data in the first page if description is long enough to break in multiples pages
541 if (!empty($conf->global->MAIN_PDF_DATA_ON_FIRST_PAGE))
542 $showpricebeforepagebreak = 1;
543 else $showpricebeforepagebreak = 0;
544 }
545
546 if (!empty($this->cols['photo']) && isset($imglinesize['width']) && isset($imglinesize['height'])) {
547 $pdf->Image($realpatharray[$i], $this->getColumnContentXStart('photo'), $curY, $imglinesize['width'], $imglinesize['height'], '', '', '', 2, 300); // Use 300 dpi
548 // $pdf->Image does not increase value return by getY, so we save it manually
549 $posYAfterImage = $curY + $imglinesize['height'];
550 }
551 }
552
553 if ($this->getColumnStatus('desc')) {
554 $pdf->startTransaction();
555
556 if (method_exists($object->lines[$i], 'fetch_product')) {
557 $object->lines[$i]->fetch_product();
558 $object->lines[$i]->label = $object->lines[$i]->product->label;
559 $object->lines[$i]->description = $object->lines[$i]->product->description;
560 $object->lines[$i]->fk_unit = $object->lines[$i]->product->fk_unit;
561 }
562
563 $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc);
564
565 $pageposafter = $pdf->getPage();
566 if ($pageposafter > $pageposbefore) { // There is a pagebreak
567 $pdf->rollbackTransaction(true);
568 $pageposafter = $pageposbefore;
569 //print $pageposafter.'-'.$pageposbefore;exit;
570 $pdf->setPageOrientation('', 1, $heightforfooter); // The only function to edit the bottom margin of current page to set it.
571
572 $this->printColDescContent($pdf, $curY, 'desc', $object, $i, $outputlangs, $hideref, $hidedesc);
573 $pageposafter = $pdf->getPage();
574 $posyafter = $pdf->GetY();
575 if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + $heightforinfotot))) { // There is no space left for total+free text
576 if ($i == ($nblines - 1)) { // No more lines, and no space left to show total, so we create a new page
577 $pdf->AddPage('', '', true);
578 if (!empty($tplidx)) $pdf->useTemplate($tplidx);
579 //if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
580 $pdf->setPage($pageposafter + 1);
581 }
582 } else {
583 // We found a page break
584 // Allows data in the first page if description is long enough to break in multiples pages
585 if (!empty($conf->global->MAIN_PDF_DATA_ON_FIRST_PAGE))
586 $showpricebeforepagebreak = 1;
587 else $showpricebeforepagebreak = 0;
588 }
589 } else // No pagebreak
590 {
591 $pdf->commitTransaction();
592 }
593 }
594
595
596
597 $nexY = max($pdf->GetY(), $posYAfterImage);
598
599
600 $pageposafter = $pdf->getPage();
601
602 $pdf->setPage($pageposbefore);
603 $pdf->setTopMargin($this->marge_haute);
604 $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
605
606 // We suppose that a too long description is moved completely on next page
607 if ($pageposafter > $pageposbefore && empty($showpricebeforepagebreak)) {
608 $pdf->setPage($pageposafter); $curY = $tab_top_newpage;
609 }
610
611 $pdf->SetFont('', '', $default_font_size - 1); // We reposition the default font
612
613 // VAT Rate
614 if ($this->getColumnStatus('vat')) {
615 $vat_rate = pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails);
616 $this->printStdColumnContent($pdf, $curY, 'vat', $vat_rate);
617 $nexY = max($pdf->GetY(), $nexY);
618 }
619
620 // Unit price before discount
621 if ($this->getColumnStatus('subprice')) {
622 $pmp = $object->lines[$i]->pmp;
623 $this->printStdColumnContent($pdf, $curY, 'subprice', price($pmp));
624 $nexY = max($pdf->GetY(), $nexY);
625 }
626
627 // Quantity
628 // Enough for 6 chars
629 if ($this->getColumnStatus('qty')) {
630 $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails);
631 $this->printStdColumnContent($pdf, $curY, 'qty', $qty);
632 $nexY = max($pdf->GetY(), $nexY);
633 }
634
635
636 // Unit
637 if ($this->getColumnStatus('unit')) {
638 $unit = pdf_getlineunit($object, $i, $outputlangs, $hidedetails, $hookmanager);
639 $this->printStdColumnContent($pdf, $curY, 'unit', $unit);
640 $nexY = max($pdf->GetY(), $nexY);
641 }
642
643 // Discount on line
644 if ($this->getColumnStatus('discount') && $object->lines[$i]->remise_percent) {
645 $remise_percent = pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails);
646 $this->printStdColumnContent($pdf, $curY, 'discount', $remise_percent);
647 $nexY = max($pdf->GetY(), $nexY);
648 }
649
650 // Total HT line
651 if ($this->getColumnStatus('totalexcltax')) {
652 $pmp_qty = $pmp * $object->lines[$i]->qty;
653 $this->printStdColumnContent($pdf, $curY, 'totalexcltax', price($pmp_qty));
654 $nexY = max($pdf->GetY(), $nexY);
655 }
656
657 // Extrafields
658 if (!empty($object->lines[$i]->array_options)) {
659 foreach ($object->lines[$i]->array_options as $extrafieldColKey => $extrafieldValue) {
660 if ($this->getColumnStatus($extrafieldColKey)) {
661 $extrafieldValue = $this->getExtrafieldContent($object->lines[$i], $extrafieldColKey);
662 $this->printStdColumnContent($pdf, $curY, $extrafieldColKey, $extrafieldValue);
663 $nexY = max($pdf->GetY(), $nexY);
664 }
665 }
666 }
667
668 $parameters = array(
669 'object' => $object,
670 'i' => $i,
671 'pdf' =>& $pdf,
672 'curY' =>& $curY,
673 'nexY' =>& $nexY,
674 'outputlangs' => $outputlangs,
675 'hidedetails' => $hidedetails
676 );
677 $reshook = $hookmanager->executeHooks('printPDFline', $parameters, $this); // Note that $object may have been modified by hook
678
679
680 // Collection of totals by value of vat in $this->tva["rate"] = total_tva
681 if (isModEnabled("multicurrency") && $object->multicurrency_tx != 1) $tvaligne = $object->lines[$i]->multicurrency_total_tva;
682 else $tvaligne = $object->lines[$i]->total_tva;
683
684 $localtax1ligne = $object->lines[$i]->total_localtax1;
685 $localtax2ligne = $object->lines[$i]->total_localtax2;
686 $localtax1_rate = $object->lines[$i]->localtax1_tx;
687 $localtax2_rate = $object->lines[$i]->localtax2_tx;
688 $localtax1_type = $object->lines[$i]->localtax1_type;
689 $localtax2_type = $object->lines[$i]->localtax2_type;
690
691 // TODO remise_percent is an obsolete field for object parent
692 /*if ($object->remise_percent) $tvaligne -= ($tvaligne * $object->remise_percent) / 100;
693 if ($object->remise_percent) $localtax1ligne -= ($localtax1ligne * $object->remise_percent) / 100;
694 if ($object->remise_percent) $localtax2ligne -= ($localtax2ligne * $object->remise_percent) / 100;*/
695
696 $vatrate = (string) $object->lines[$i]->tva_tx;
697
698 // Retrieve type from database for backward compatibility with old records
699 if ((!isset($localtax1_type) || $localtax1_type == '' || !isset($localtax2_type) || $localtax2_type == '') // if tax type not defined
700 && (!empty($localtax1_rate) || !empty($localtax2_rate))) { // and there is local tax
701 $localtaxtmp_array = getLocalTaxesFromRate($vatrate, 0, $object->thirdparty, $mysoc);
702 $localtax1_type = $localtaxtmp_array[0];
703 $localtax2_type = $localtaxtmp_array[2];
704 }
705
706 // retrieve global local tax
707 if ($localtax1_type && $localtax1ligne != 0) {
708 if (empty($this->localtax1[$localtax1_type][$localtax1_rate])) {
709 $this->localtax1[$localtax1_type][$localtax1_rate] = $localtax1ligne;
710 } else {
711 $this->localtax1[$localtax1_type][$localtax1_rate] += $localtax1ligne;
712 }
713 }
714 if ($localtax2_type && $localtax2ligne != 0) {
715 if (empty($this->localtax2[$localtax2_type][$localtax2_rate])) {
716 $this->localtax2[$localtax2_type][$localtax2_rate] = $localtax2ligne;
717 } else {
718 $this->localtax2[$localtax2_type][$localtax2_rate] += $localtax2ligne;
719 }
720 }
721
722 if (($object->lines[$i]->info_bits & 0x01) == 0x01) $vatrate .= '*';
723 if (!isset($this->tva[$vatrate])) $this->tva[$vatrate] = 0;
724 $this->tva[$vatrate] += $tvaligne;
725
726 // Add line
727 if (!empty($conf->global->MAIN_PDF_DASH_BETWEEN_LINES) && $i < ($nblines - 1)) {
728 $pdf->setPage($pageposafter);
729 $pdf->SetLineStyle(array('dash'=>'1,1', 'color'=>array(80, 80, 80)));
730 //$pdf->SetDrawColor(190,190,200);
731 $pdf->line($this->marge_gauche, $nexY, $this->page_largeur - $this->marge_droite, $nexY);
732 $pdf->SetLineStyle(array('dash'=>0));
733 }
734
735
736 // Detect if some page were added automatically and output _tableau for past pages
737 while ($pagenb < $pageposafter) {
738 $pdf->setPage($pagenb);
739 if ($pagenb == $pageposbeforeprintlines) {
740 $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, $hidetop, 1, $object->multicurrency_code);
741 } else {
742 $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1, $object->multicurrency_code);
743 }
744 $this->_pagefoot($pdf, $object, $outputlangs, 1);
745 $pagenb++;
746 $pdf->setPage($pagenb);
747 $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it.
748 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
749 }
750 if (isset($object->lines[$i + 1]->pagebreak) && $object->lines[$i + 1]->pagebreak) {
751 if ($pagenb == $pageposafter) {
752 $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, $hidetop, 1, $object->multicurrency_code);
753 } else {
754 $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1, $object->multicurrency_code);
755 }
756 $this->_pagefoot($pdf, $object, $outputlangs, 1);
757 // New page
758 $pdf->AddPage();
759 if (!empty($tplidx)) $pdf->useTemplate($tplidx);
760 $pagenb++;
761 if (!getDolGlobalInt('MAIN_PDF_DONOTREPEAT_HEAD')) $this->_pagehead($pdf, $object, 0, $outputlangs);
762 }
763 }
764
765 // Show square
766 if ($pagenb == $pageposbeforeprintlines)
767 $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, $hidetop, 0, $object->multicurrency_code);
768 else $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0, $object->multicurrency_code);
769 $bottomlasttab = $this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1;
770
771 // Affiche zone infos
772 // ! No paiement information for this model !
773 //$posy = $this->drawInfoTable($pdf, $object, $bottomlasttab, $outputlangs);
774
775 // Affiche zone totaux
776 $posy = $this->drawTotalTable($pdf, $object, $deja_regle, $bottomlasttab, $outputlangs);
777
778 // Affiche zone versements
779 /*
780 if ($deja_regle)
781 {
782 $posy=$this->drawPaymentsTable($pdf, $object, $posy, $outputlangs);
783 }
784 */
785
786 // Pied de page
787 $this->_pagefoot($pdf, $object, $outputlangs);
788 if (method_exists($pdf, 'AliasNbPages')) $pdf->AliasNbPages();
789
790 $pdf->Close();
791
792 $pdf->Output($file, 'F');
793
794 // Add pdfgeneration hook
795 $hookmanager->initHooks(array('pdfgeneration'));
796 $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs);
797 global $action;
798 $reshook = $hookmanager->executeHooks('afterPDFCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
799 if ($reshook < 0) {
800 $this->error = $hookmanager->error;
801 $this->errors = $hookmanager->errors;
802 }
803
804 dolChmod($file);
805
806 $this->result = array('fullpath'=>$file);
807
808 return 1; // No error
809 } else {
810 $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
811 return 0;
812 }
813 } else {
814 $this->error = $langs->transnoentities("ErrorConstantNotDefined", "STOCKTRANSFER_OUTPUTDIR");
815 return 0;
816 }
817 }
818
828 protected function drawPaymentsTable(&$pdf, $object, $posy, $outputlangs)
829 {
830 }
831
841 protected function drawInfoTable(&$pdf, $object, $posy, $outputlangs)
842 {
843 global $conf, $mysoc;
844 $default_font_size = pdf_getPDFFontSize($outputlangs);
845
846 $pdf->SetFont('', '', $default_font_size - 1);
847
848 // If France, show VAT mention if not applicable
849 if ($this->emetteur->country_code == 'FR' && empty($mysoc->tva_assuj)) {
850 $pdf->SetFont('', 'B', $default_font_size - 2);
851 $pdf->SetXY($this->marge_gauche, $posy);
852 $pdf->MultiCell(100, 3, $outputlangs->transnoentities("VATIsNotUsedForInvoice"), 0, 'L', 0);
853
854 $posy = $pdf->GetY() + 4;
855 }
856
857 $posxval = 52;
858
859 // Show payments conditions
860 if ($object->cond_reglement_code || $object->cond_reglement) {
861 $pdf->SetFont('', 'B', $default_font_size - 2);
862 $pdf->SetXY($this->marge_gauche, $posy);
863 $titre = $outputlangs->transnoentities("PaymentConditions").':';
864 $pdf->MultiCell(43, 4, $titre, 0, 'L');
865
866 $pdf->SetFont('', '', $default_font_size - 2);
867 $pdf->SetXY($posxval, $posy);
868 $lib_condition_paiement = $outputlangs->transnoentities("PaymentCondition".$object->cond_reglement_code) != ('PaymentCondition'.$object->cond_reglement_code) ? $outputlangs->transnoentities("PaymentCondition".$object->cond_reglement_code) : $outputlangs->convToOutputCharset($object->cond_reglement_doc);
869 $lib_condition_paiement = str_replace('\n', "\n", $lib_condition_paiement);
870 $pdf->MultiCell(67, 4, $lib_condition_paiement, 0, 'L');
871
872 $posy = $pdf->GetY() + 3;
873 }
874
875 // Check a payment mode is defined
876 /* Not used with orders
877 if (empty($object->mode_reglement_code)
878 && ! $conf->global->FACTURE_CHQ_NUMBER
879 && ! $conf->global->FACTURE_RIB_NUMBER)
880 {
881 $pdf->SetXY($this->marge_gauche, $posy);
882 $pdf->SetTextColor(200,0,0);
883 $pdf->SetFont('','B', $default_font_size - 2);
884 $pdf->MultiCell(80, 3, $outputlangs->transnoentities("ErrorNoPaiementModeConfigured"),0,'L',0);
885 $pdf->SetTextColor(0,0,0);
886
887 $posy=$pdf->GetY()+1;
888 }
889 */
890 /* TODO
891 else if (!empty($object->availability_code))
892 {
893 $pdf->SetXY($this->marge_gauche, $posy);
894 $pdf->SetTextColor(200,0,0);
895 $pdf->SetFont('','B', $default_font_size - 2);
896 $pdf->MultiCell(80, 3, $outputlangs->transnoentities("AvailabilityPeriod").': '.,0,'L',0);
897 $pdf->SetTextColor(0,0,0);
898
899 $posy=$pdf->GetY()+1;
900 }*/
901
902 // Show planed date of delivery
903 if (!empty($object->date_livraison)) {
904 $outputlangs->load("sendings");
905 $pdf->SetFont('', 'B', $default_font_size - 2);
906 $pdf->SetXY($this->marge_gauche, $posy);
907 $titre = $outputlangs->transnoentities("DateDeliveryPlanned").':';
908 $pdf->MultiCell(80, 4, $titre, 0, 'L');
909 $pdf->SetFont('', '', $default_font_size - 2);
910 $pdf->SetXY($posxval, $posy);
911 $dlp = dol_print_date($object->date_livraison, "daytext", false, $outputlangs, true);
912 $pdf->MultiCell(80, 4, $dlp, 0, 'L');
913
914 $posy = $pdf->GetY() + 1;
915 } elseif ($object->availability_code || $object->availability) { // Show availability conditions
916 $pdf->SetFont('', 'B', $default_font_size - 2);
917 $pdf->SetXY($this->marge_gauche, $posy);
918 $titre = $outputlangs->transnoentities("AvailabilityPeriod").':';
919 $pdf->MultiCell(80, 4, $titre, 0, 'L');
920 $pdf->SetTextColor(0, 0, 0);
921 $pdf->SetFont('', '', $default_font_size - 2);
922 $pdf->SetXY($posxval, $posy);
923 $lib_availability = $outputlangs->transnoentities("AvailabilityType".$object->availability_code) != ('AvailabilityType'.$object->availability_code) ? $outputlangs->transnoentities("AvailabilityType".$object->availability_code) : $outputlangs->convToOutputCharset(isset($object->availability) ? $object->availability : '');
924 $lib_availability = str_replace('\n', "\n", $lib_availability);
925 $pdf->MultiCell(80, 4, $lib_availability, 0, 'L');
926
927 $posy = $pdf->GetY() + 1;
928 }
929
930 // Show payment mode
931 if ($object->mode_reglement_code
932 && $object->mode_reglement_code != 'CHQ'
933 && $object->mode_reglement_code != 'VIR') {
934 $pdf->SetFont('', 'B', $default_font_size - 2);
935 $pdf->SetXY($this->marge_gauche, $posy);
936 $titre = $outputlangs->transnoentities("PaymentMode").':';
937 $pdf->MultiCell(80, 5, $titre, 0, 'L');
938
939 $pdf->SetFont('', '', $default_font_size - 2);
940 $pdf->SetXY($posxval, $posy);
941 $lib_mode_reg = $outputlangs->transnoentities("PaymentType".$object->mode_reglement_code) != ('PaymentType'.$object->mode_reglement_code) ? $outputlangs->transnoentities("PaymentType".$object->mode_reglement_code) : $outputlangs->convToOutputCharset($object->mode_reglement);
942 $pdf->MultiCell(80, 5, $lib_mode_reg, 0, 'L');
943
944 $posy = $pdf->GetY() + 2;
945 }
946
947 // Show payment mode CHQ
948 if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'CHQ') {
949 // Si mode reglement non force ou si force a CHQ
950 if (getDolGlobalInt('FACTURE_CHQ_NUMBER')) {
951 if ($conf->global->FACTURE_CHQ_NUMBER > 0) {
952 $account = new Account($this->db);
953 $account->fetch(getDolGlobalInt('FACTURE_CHQ_NUMBER'));
954
955 $pdf->SetXY($this->marge_gauche, $posy);
956 $pdf->SetFont('', 'B', $default_font_size - 3);
957 $pdf->MultiCell(100, 3, $outputlangs->transnoentities('PaymentByChequeOrderedTo', $account->proprio), 0, 'L', 0);
958 $posy = $pdf->GetY() + 1;
959
960 if (empty($conf->global->MAIN_PDF_HIDE_CHQ_ADDRESS)) {
961 $pdf->SetXY($this->marge_gauche, $posy);
962 $pdf->SetFont('', '', $default_font_size - 3);
963 $pdf->MultiCell(100, 3, $outputlangs->convToOutputCharset($account->owner_address), 0, 'L', 0);
964 $posy = $pdf->GetY() + 2;
965 }
966 }
967 if (getDolGlobalInt('FACTURE_CHQ_NUMBER') == -1) {
968 $pdf->SetXY($this->marge_gauche, $posy);
969 $pdf->SetFont('', 'B', $default_font_size - 3);
970 $pdf->MultiCell(100, 3, $outputlangs->transnoentities('PaymentByChequeOrderedTo', $this->emetteur->name), 0, 'L', 0);
971 $posy = $pdf->GetY() + 1;
972
973 if (empty($conf->global->MAIN_PDF_HIDE_CHQ_ADDRESS)) {
974 $pdf->SetXY($this->marge_gauche, $posy);
975 $pdf->SetFont('', '', $default_font_size - 3);
976 $pdf->MultiCell(100, 3, $outputlangs->convToOutputCharset($this->emetteur->getFullAddress()), 0, 'L', 0);
977 $posy = $pdf->GetY() + 2;
978 }
979 }
980 }
981 }
982
983 // If payment mode not forced or forced to VIR, show payment with BAN
984 if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') {
985 if (!empty($object->fk_account) || !empty($object->fk_bank) || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
986 $bankid = (empty($object->fk_account) ? $conf->global->FACTURE_RIB_NUMBER : $object->fk_account);
987 if (!empty($object->fk_bank)) $bankid = $object->fk_bank; // For backward compatibility when object->fk_account is forced with object->fk_bank
988 $account = new Account($this->db);
989 $account->fetch($bankid);
990
991 $curx = $this->marge_gauche;
992 $cury = $posy;
993
994 $posy = pdf_bank($pdf, $outputlangs, $curx, $cury, $account, 0, $default_font_size);
995
996 $posy += 2;
997 }
998 }
999
1000 return $posy;
1001 }
1002
1003
1014 protected function drawTotalTable(&$pdf, $object, $deja_regle, $posy, $outputlangs)
1015 {
1016 global $conf, $mysoc;
1017
1018 $default_font_size = pdf_getPDFFontSize($outputlangs);
1019
1020 $tab2_top = $posy;
1021 $tab2_hl = 4;
1022 $pdf->SetFont('', '', $default_font_size - 1);
1023
1024 // Tableau total
1025 $col1x = 120; $col2x = 170;
1026 if ($this->page_largeur < 210) { // To work with US executive format
1027 $col2x -= 20;
1028 }
1029 $largcol2 = ($this->page_largeur - $this->marge_droite - $col2x);
1030 $useborder = 0;
1031 $index = 0;
1032
1033 $outputlangsbis = null;
1034 if (!empty($conf->global->PDF_USE_ALSO_LANGUAGE_CODE) && $outputlangs->defaultlang != $conf->global->PDF_USE_ALSO_LANGUAGE_CODE) {
1035 $outputlangsbis = new Translate('', $conf);
1036 $outputlangsbis->setDefaultLang($conf->global->PDF_USE_ALSO_LANGUAGE_CODE);
1037 $outputlangsbis->loadLangs(array("main", "dict", "companies", "bills", "products", "propal"));
1038 }
1039
1040 // Total HT
1041 /*$pdf->SetFillColor(255, 255, 255);
1042 $pdf->SetXY($col1x, $tab2_top);
1043 $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalHT") : ''), 0, 'L', 1);
1044 $total_ht = ((isModEnabled("multicurrency") && isset($object->multicurrency_tx) && $object->multicurrency_tx != 1) ? $object->multicurrency_total_ht : $object->total_ht);
1045 $pdf->SetXY($col2x, $tab2_top);
1046 $pdf->MultiCell($largcol2, $tab2_hl, price($total_ht + (!empty($object->remise) ? $object->remise : 0), 0, $outputlangs), 0, 'R', 1);*/
1047
1048 // Show VAT by rates and total
1049 $pdf->SetFillColor(248, 248, 248);
1050
1051 $total_ttc = $object->getValorisationTotale();
1052
1053 $this->atleastoneratenotnull = 0;
1054
1055 // Total TTC
1056 $index++;
1057 $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
1058 $pdf->SetTextColor(0, 0, 60);
1059 $pdf->SetFillColor(224, 224, 224);
1060 $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("Total").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("Total", $mysoc->country_code) : ''), $useborder, 'L', 1);
1061
1062 $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
1063 $pdf->MultiCell($largcol2, $tab2_hl, price($total_ttc, 0, $outputlangs), $useborder, 'R', 1);
1064
1065 $pdf->SetTextColor(0, 0, 0);
1066
1067 $creditnoteamount = 0;
1068 $depositsamount = 0;
1069 //$creditnoteamount=$object->getSumCreditNotesUsed();
1070 //$depositsamount=$object->getSumDepositsUsed();
1071 //print "x".$creditnoteamount."-".$depositsamount;exit;
1072 $resteapayer = price2num($total_ttc - $deja_regle - $creditnoteamount - $depositsamount, 'MT');
1073 if (!empty($object->paye)) $resteapayer = 0;
1074
1075 if ($deja_regle > 0) {
1076 // Already paid + Deposits
1077 $index++;
1078
1079 $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
1080 $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("AlreadyPaid").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("AlreadyPaid") : ''), 0, 'L', 0);
1081 $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
1082 $pdf->MultiCell($largcol2, $tab2_hl, price($deja_regle, 0, $outputlangs), 0, 'R', 0);
1083
1084 $index++;
1085 $pdf->SetTextColor(0, 0, 60);
1086 $pdf->SetFillColor(224, 224, 224);
1087 $pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
1088 $pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("AlreadyPaid") : ''), $useborder, 'L', 1);
1089
1090 $pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
1091 $pdf->MultiCell($largcol2, $tab2_hl, price($resteapayer, 0, $outputlangs), $useborder, 'R', 1);
1092
1093 $pdf->SetFont('', '', $default_font_size - 1);
1094 $pdf->SetTextColor(0, 0, 0);
1095 }
1096
1097 $index++;
1098 return ($tab2_top + ($tab2_hl * $index));
1099 }
1100
1101 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
1115 protected function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop = 0, $hidebottom = 0, $currency = '')
1116 {
1117 global $conf;
1118
1119 // Force to disable hidetop and hidebottom
1120 $hidebottom = 0;
1121 if ($hidetop) $hidetop = -1;
1122
1123 $currency = !empty($currency) ? $currency : $conf->currency;
1124 $default_font_size = pdf_getPDFFontSize($outputlangs);
1125
1126 // Amount in (at tab_top - 1)
1127 $pdf->SetTextColor(0, 0, 0);
1128 $pdf->SetFont('', '', $default_font_size - 2);
1129
1130 if (empty($hidetop)) {
1131 $titre = $outputlangs->transnoentities("AmountInCurrency", $outputlangs->transnoentitiesnoconv("Currency".$currency));
1132 $pdf->SetXY($this->page_largeur - $this->marge_droite - ($pdf->GetStringWidth($titre) + 3), $tab_top - 4);
1133 $pdf->MultiCell(($pdf->GetStringWidth($titre) + 3), 2, $titre);
1134
1135 //$conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR='230,230,230';
1136 if (!empty($conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR)) {
1137 $pdf->Rect($this->marge_gauche, $tab_top, $this->page_largeur - $this->marge_droite - $this->marge_gauche, $this->tabTitleHeight, 'F', null, explode(',', $conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR));
1138 }
1139 }
1140
1141 $pdf->SetDrawColor(128, 128, 128);
1142 $pdf->SetFont('', '', $default_font_size - 1);
1143
1144 // Output Rect
1145 $this->printRect($pdf, $this->marge_gauche, $tab_top, $this->page_largeur - $this->marge_gauche - $this->marge_droite, $tab_height, $hidetop, $hidebottom); // Rect takes a length in 3rd parameter and 4th parameter
1146
1147
1148 $this->pdfTabTitles($pdf, $tab_top, $tab_height, $outputlangs, $hidetop);
1149
1150 if (empty($hidetop)) {
1151 $pdf->line($this->marge_gauche, $tab_top + $this->tabTitleHeight, $this->page_largeur - $this->marge_droite, $tab_top + $this->tabTitleHeight); // line takes a position y in 2nd parameter and 4th parameter
1152 }
1153 }
1154
1155 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1156 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
1167 protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs, $titlekey = "StockTransferSheetProforma")
1168 {
1169 // phpcs:enable
1170 global $conf, $langs, $hookmanager;
1171
1172 // Load traductions files required by page
1173 $outputlangs->loadLangs(array("main", "bills", "propal", "orders", "companies"));
1174
1175 $default_font_size = pdf_getPDFFontSize($outputlangs);
1176
1177 pdf_pagehead($pdf, $outputlangs, $this->page_hauteur);
1178
1179 // Show Draft Watermark
1180 if ($object->statut == 0 && getDolGlobalString('COMMANDE_DRAFT_WATERMARK')) {
1181 pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', getDolGlobalString('COMMANDE_DRAFT_WATERMARK'));
1182 }
1183
1184 $pdf->SetTextColor(0, 0, 60);
1185 $pdf->SetFont('', 'B', $default_font_size + 3);
1186
1187 $posy = $this->marge_haute;
1188 $posx = $this->page_largeur - $this->marge_droite - 100;
1189
1190 $pdf->SetXY($this->marge_gauche, $posy);
1191
1192 // Logo
1193 if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) {
1194 if ($this->emetteur->logo) {
1195 $logodir = $conf->mycompany->dir_output;
1196 if (!empty($conf->mycompany->multidir_output[$object->entity])) $logodir = $conf->mycompany->multidir_output[$object->entity];
1197 if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) {
1198 $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small;
1199 } else {
1200 $logo = $logodir.'/logos/'.$this->emetteur->logo;
1201 }
1202 if (is_readable($logo)) {
1203 $height = pdf_getHeightForLogo($logo);
1204 $pdf->Image($logo, $this->marge_gauche, $posy, 0, $height); // width=0 (auto)
1205 } else {
1206 $pdf->SetTextColor(200, 0, 0);
1207 $pdf->SetFont('', 'B', $default_font_size - 2);
1208 $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound", $logo), 0, 'L');
1209 $pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
1210 }
1211 } else {
1212 $text = $this->emetteur->name;
1213 $pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
1214 }
1215 }
1216
1217 $pdf->SetFont('', 'B', $default_font_size + 3);
1218 $pdf->SetXY($posx, $posy);
1219 $pdf->SetTextColor(0, 0, 60);
1220 $title = $outputlangs->transnoentities($titlekey);
1221 $pdf->MultiCell(100, 3, $title, '', 'R');
1222
1223 $pdf->SetFont('', 'B', $default_font_size);
1224
1225 $posy += 5;
1226 $pdf->SetXY($posx, $posy);
1227 $pdf->SetTextColor(0, 0, 60);
1228 $pdf->MultiCell(100, 4, $outputlangs->transnoentities("Ref")." : ".$outputlangs->convToOutputCharset($object->ref), '', 'R');
1229
1230 $posy += 1;
1231 $pdf->SetFont('', '', $default_font_size - 1);
1232
1233 // Date prévue depart
1234 if (!empty($object->date_prevue_depart)) {
1235 $posy += 4;
1236 $pdf->SetXY($posx, $posy);
1237 $pdf->SetTextColor(0, 0, 60);
1238 $pdf->MultiCell($w, 4, $outputlangs->transnoentities("DatePrevueDepart")." : ".dol_print_date($object->date_prevue_depart, "day", false, $outputlangs, true), '', 'R');
1239 }
1240
1241 // Date prévue arrivée
1242 if (!empty($object->date_prevue_arrivee)) {
1243 $posy += 4;
1244 $pdf->SetXY($posx, $posy);
1245 $pdf->SetTextColor(0, 0, 60);
1246 $pdf->MultiCell($w, 4, $outputlangs->transnoentities("DatePrevueArrivee")." : ".dol_print_date($object->date_prevue_arrivee, "day", false, $outputlangs, true), '', 'R');
1247 }
1248
1249 // Date reelle depart
1250 if (!empty($object->date_reelle_depart)) {
1251 $posy += 4;
1252 $pdf->SetXY($posx, $posy);
1253 $pdf->SetTextColor(0, 0, 60);
1254 $pdf->MultiCell($w, 4, $outputlangs->transnoentities("DateReelleDepart")." : ".dol_print_date($object->date_reelle_depart, "day", false, $outputlangs, true), '', 'R');
1255 }
1256
1257 // Date reelle arrivée
1258 if (!empty($object->date_reelle_arrivee)) {
1259 $posy += 4;
1260 $pdf->SetXY($posx, $posy);
1261 $pdf->SetTextColor(0, 0, 60);
1262 $pdf->MultiCell($w, 4, $outputlangs->transnoentities("DateReelleArrivee")." : ".dol_print_date($object->date_reelle_arrivee, "day", false, $outputlangs, true), '', 'R');
1263 }
1264
1265 if ($object->ref_client) {
1266 $posy += 5;
1267 $pdf->SetXY($posx, $posy);
1268 $pdf->SetTextColor(0, 0, 60);
1269 $pdf->MultiCell(100, 3, $outputlangs->transnoentities("RefCustomer")." : ".$outputlangs->convToOutputCharset($object->ref_client), '', 'R');
1270 }
1271
1272 if (!empty($conf->global->PDF_SHOW_PROJECT_TITLE)) {
1273 $object->fetch_projet();
1274 if (!empty($object->project->ref)) {
1275 $posy += 3;
1276 $pdf->SetXY($posx, $posy);
1277 $pdf->SetTextColor(0, 0, 60);
1278 $pdf->MultiCell($w, 3, $outputlangs->transnoentities("Project")." : ".(empty($object->project->title) ? '' : $object->projet->title), '', 'R');
1279 }
1280 }
1281
1282 if (!empty($conf->global->PDF_SHOW_PROJECT)) {
1283 $object->fetch_projet();
1284 if (!empty($object->project->ref)) {
1285 $posy += 3;
1286 $pdf->SetXY($posx, $posy);
1287 $pdf->SetTextColor(0, 0, 60);
1288 $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefProject")." : ".(empty($object->project->ref) ? '' : $object->projet->ref), '', 'R');
1289 }
1290 }
1291
1292 if (!empty($conf->global->DOC_SHOW_CUSTOMER_CODE) && !empty($object->thirdparty->code_client)) {
1293 $posy += 4;
1294 $pdf->SetXY($posx, $posy);
1295 $pdf->SetTextColor(0, 0, 60);
1296 $pdf->MultiCell(100, 3, $outputlangs->transnoentities("CustomerCode")." : ".$outputlangs->transnoentities($object->thirdparty->code_client), '', 'R');
1297 }
1298
1299 // Get contact
1300 if (!empty($conf->global->DOC_SHOW_FIRST_SALES_REP)) {
1301 $arrayidcontact = $object->getIdContact('internal', 'SALESREPFOLL');
1302 if (count($arrayidcontact) > 0) {
1303 $usertmp = new User($this->db);
1304 $usertmp->fetch($arrayidcontact[0]);
1305 $posy += 4;
1306 $pdf->SetXY($posx, $posy);
1307 $pdf->SetTextColor(0, 0, 60);
1308 $pdf->MultiCell(100, 3, $outputlangs->trans("SalesRepresentative")." : ".$usertmp->getFullName($langs), '', 'R');
1309 }
1310 }
1311
1312 $posy += 2;
1313
1314 $top_shift = 0;
1315 // Show list of linked objects
1316 $current_y = $pdf->getY();
1317 $posy = pdf_writeLinkedObjects($pdf, $object, $outputlangs, $posx, $posy, 100, 3, 'R', $default_font_size);
1318 if ($current_y < $pdf->getY()) {
1319 $top_shift = $pdf->getY() - $current_y;
1320 }
1321
1322 if ($showaddress) {
1323 // Sender properties
1324 $carac_emetteur = '';
1325 // Add internal contact of origin element if defined
1326 $arrayidcontact = array();
1327 $arrayidcontact = $object->getIdContact('external', 'STFROM');
1328
1329 $usecontact = false;
1330 if (count($arrayidcontact) > 0) {
1331 /*$object->fetch_user(reset($arrayidcontact));
1332 $carac_emetteur .= ($carac_emetteur ? "\n" : '').$outputlangs->transnoentities("Name").": ".$outputlangs->convToOutputCharset($object->user->getFullName($outputlangs))."\n";*/
1333 $usecontact = true;
1334 $result = $object->fetch_contact($arrayidcontact[0]);
1335 }
1336
1337 if ($usecontact) $thirdparty = $object->contact;
1338 else $thirdparty = $this->emetteur;
1339
1340 if (!empty($thirdparty)) $carac_emetteur_name = pdfBuildThirdpartyName($thirdparty, $outputlangs);
1341
1342 if ($usecontact) $carac_emetteur .= pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, $object->contact, 1, 'targetwithdetails', $object);
1343 else $carac_emetteur .= pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, '', 0, 'source', $object);
1344
1345 // Show sender
1346 $posy = !empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 40 : 42;
1347 $posx = $this->marge_gauche;
1348 if (!empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx = $this->page_largeur - $this->marge_droite - 80;
1349
1350 $hautcadre = !empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 38 : 40;
1351 $widthrecbox = !empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 92 : 82;
1352
1353 // Show sender frame
1354 $pdf->SetTextColor(0, 0, 0);
1355 $pdf->SetFont('', '', $default_font_size - 2);
1356 $pdf->SetXY($posx, $posy - 5);
1357 $pdf->MultiCell(66, 5, $outputlangs->transnoentities("Sender").":", 0, 'L');
1358 $pdf->SetXY($posx, $posy);
1359 $pdf->SetFillColor(230, 230, 230);
1360 $pdf->MultiCell($widthrecbox, $hautcadre, "", 0, 'R', 1);
1361 $pdf->SetTextColor(0, 0, 60);
1362 $pdf->SetFillColor(255, 255, 255);
1363
1364 // Show sender name
1365 $pdf->SetXY($posx + 2, $posy + 3);
1366 $pdf->SetFont('', 'B', $default_font_size);
1367 $pdf->MultiCell($widthrecbox - 2, 4, $outputlangs->convToOutputCharset($carac_emetteur_name), 0, 'L');
1368 $posy = $pdf->getY();
1369
1370 // Show sender information
1371 $pdf->SetXY($posx + 2, $posy);
1372 $pdf->SetFont('', '', $default_font_size - 1);
1373 $pdf->MultiCell($widthrecbox - 2, 4, $carac_emetteur, 0, 'L');
1374
1375
1376 // If SHIPPING contact defined, we use it
1377 $usecontact = false;
1378 $arrayidcontact = $object->getIdContact('external', 'STDEST');
1379 if (count($arrayidcontact) > 0) {
1380 $usecontact = true;
1381 $result = $object->fetch_contact($arrayidcontact[0]);
1382 }
1383
1384 //Recipient name
1385 // On peut utiliser le nom de la societe du contact
1386 if ($usecontact/* && !empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT)*/) {
1387 $thirdparty = $object->contact;
1388 } else {
1389 $thirdparty = $object->thirdparty;
1390 }
1391
1392 if (!empty($thirdparty)) $carac_client_name = pdfBuildThirdpartyName($thirdparty, $outputlangs);
1393
1394 $carac_client = pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, (!empty($object->contact) ? $object->contact : null), $usecontact, 'targetwithdetails', $object);
1395
1396 // Show recipient
1397 $widthrecbox = !empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 92 : 100;
1398 if ($this->page_largeur < 210) $widthrecbox = 84; // To work with US executive format
1399 $posy = !empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 40 : 42;
1400 $posx = $this->page_largeur - $this->marge_droite - $widthrecbox;
1401 if (!empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx = $this->marge_gauche;
1402
1403 // Show recipient frame
1404 $pdf->SetTextColor(0, 0, 0);
1405 $pdf->SetFont('', '', $default_font_size - 2);
1406 $pdf->SetXY($posx + 2, $posy - 5);
1407 $pdf->MultiCell($widthrecbox, 5, $outputlangs->transnoentities("Recipient").":", 0, 'L');
1408 $pdf->Rect($posx, $posy, $widthrecbox, $hautcadre);
1409
1410 // Show recipient name
1411 $pdf->SetXY($posx + 2, $posy + 3);
1412 $pdf->SetFont('', 'B', $default_font_size);
1413 $pdf->MultiCell($widthrecbox, 2, $carac_client_name, 0, 'L');
1414
1415 $posy = $pdf->getY();
1416
1417 // Show recipient information
1418 $pdf->SetFont('', '', $default_font_size - 1);
1419 $pdf->SetXY($posx + 2, $posy);
1420 $pdf->MultiCell($widthrecbox, 4, $carac_client, 0, 'L');
1421 }
1422
1423 $pdf->SetTextColor(0, 0, 0);
1424 return $top_shift;
1425 }
1426
1427 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1428 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
1438 protected function _pagefoot(&$pdf, $object, $outputlangs, $hidefreetext = 0)
1439 {
1440 // phpcs:enable
1441 $showdetails = getDolGlobalInt('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS', 0);
1442 return pdf_pagefoot($pdf, $outputlangs, 'ORDER_FREE_TEXT', $this->emetteur, $this->marge_basse, $this->marge_gauche, $this->page_hauteur, $object, $showdetails, $hidefreetext);
1443 }
1444
1445
1446
1457 public function defineColumnField($object, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0)
1458 {
1459 global $conf, $hookmanager;
1460
1461 // Default field style for content
1462 $this->defaultContentsFieldsStyle = array(
1463 'align' => 'R', // R,C,L
1464 'padding' => array(1, 0.5, 1, 0.5), // Like css 0 => top , 1 => right, 2 => bottom, 3 => left
1465 );
1466
1467 // Default field style for content
1468 $this->defaultTitlesFieldsStyle = array(
1469 'align' => 'C', // R,C,L
1470 'padding' => array(0.5, 0, 0.5, 0), // Like css 0 => top , 1 => right, 2 => bottom, 3 => left
1471 );
1472
1473 /*
1474 * For exemple
1475 $this->cols['theColKey'] = array(
1476 'rank' => $rank, // int : use for ordering columns
1477 'width' => 20, // the column width in mm
1478 'title' => array(
1479 'textkey' => 'yourLangKey', // if there is no label, yourLangKey will be translated to replace label
1480 'label' => ' ', // the final label : used fore final generated text
1481 'align' => 'L', // text alignement : R,C,L
1482 'padding' => array(0.5,0.5,0.5,0.5), // Like css 0 => top , 1 => right, 2 => bottom, 3 => left
1483 ),
1484 'content' => array(
1485 'align' => 'L', // text alignement : R,C,L
1486 'padding' => array(0.5,0.5,0.5,0.5), // Like css 0 => top , 1 => right, 2 => bottom, 3 => left
1487 ),
1488 );
1489 */
1490
1491 $rank = 0; // do not use negative rank
1492 $this->cols['desc'] = array(
1493 'rank' => $rank,
1494 'width' => false, // only for desc
1495 'status' => true,
1496 'title' => array(
1497 'textkey' => 'Designation', // use lang key is usefull in somme case with module
1498 'align' => 'L',
1499 // 'textkey' => 'yourLangKey', // if there is no label, yourLangKey will be translated to replace label
1500 // 'label' => ' ', // the final label
1501 'padding' => array(0.5, 1, 0.5, 1.5), // Like css 0 => top , 1 => right, 2 => bottom, 3 => left
1502 ),
1503 'content' => array(
1504 'align' => 'L',
1505 'padding' => array(1, 0.5, 1, 1.5), // Like css 0 => top , 1 => right, 2 => bottom, 3 => left
1506 ),
1507 );
1508
1509 $rank = $rank + 10;
1510 $this->cols['photo'] = array(
1511 'rank' => $rank,
1512 'width' => (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH) ? 20 : $conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH), // in mm
1513 'status' => false,
1514 'title' => array(
1515 'textkey' => 'Photo',
1516 'label' => ' '
1517 ),
1518 'content' => array(
1519 'padding' => array(0, 0, 0, 0), // Like css 0 => top , 1 => right, 2 => bottom, 3 => left
1520 ),
1521 'border-left' => false, // remove left line separator
1522 );
1523
1524 if (!empty($conf->global->MAIN_GENERATE_ORDERS_WITH_PICTURE)) {
1525 $this->cols['photo']['status'] = true;
1526 }
1527
1528
1529 $rank = $rank + 10;
1530 $this->cols['vat'] = array(
1531 'rank' => $rank,
1532 'status' => false,
1533 'width' => 16, // in mm
1534 'title' => array(
1535 'textkey' => 'VAT'
1536 ),
1537 'border-left' => true, // add left line separator
1538 );
1539
1540 /*if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT) && empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_COLUMN))
1541 {
1542 $this->cols['vat']['status'] = true;
1543 }*/
1544
1545 $rank = $rank + 10;
1546 $this->cols['subprice'] = array(
1547 'rank' => $rank,
1548 'width' => 19, // in mm
1549 'status' => true,
1550 'title' => array(
1551 'textkey' => 'PMPValueShort'
1552 ),
1553 'border-left' => true, // add left line separator
1554 );
1555
1556 // Adapt dynamically the width of subprice, if text is too long.
1557 $tmpwidth = 0;
1558 $nblines = is_array($object->lines) ? count($object->lines) : 0;
1559 for ($i = 0; $i < $nblines; $i++) {
1560 $tmpwidth2 = dol_strlen(dol_string_nohtmltag(pdf_getlineupexcltax($object, $i, $outputlangs, $hidedetails)));
1561 $tmpwidth = max($tmpwidth, $tmpwidth2);
1562 }
1563 if ($tmpwidth > 10) {
1564 $this->cols['subprice']['width'] += (2 * ($tmpwidth - 10));
1565 }
1566
1567 $rank = $rank + 10;
1568 $this->cols['qty'] = array(
1569 'rank' => $rank,
1570 'width' => 16, // in mm
1571 'status' => true,
1572 'title' => array(
1573 'textkey' => 'Qty'
1574 ),
1575 'border-left' => true, // add left line separator
1576 );
1577
1578 $rank = $rank + 10;
1579 $this->cols['unit'] = array(
1580 'rank' => $rank,
1581 'width' => 11, // in mm
1582 'status' => false,
1583 'title' => array(
1584 'textkey' => 'Unit'
1585 ),
1586 'border-left' => true, // add left line separator
1587 );
1588 if ($conf->global->PRODUCT_USE_UNITS) {
1589 $this->cols['unit']['status'] = true;
1590 }
1591
1592 $rank = $rank + 10;
1593 $this->cols['discount'] = array(
1594 'rank' => $rank,
1595 'width' => 13, // in mm
1596 'status' => false,
1597 'title' => array(
1598 'textkey' => 'ReductionShort'
1599 ),
1600 'border-left' => true, // add left line separator
1601 );
1602 if ($this->atleastonediscount) {
1603 $this->cols['discount']['status'] = true;
1604 }
1605
1606 $rank = $rank + 1000; // add a big offset to be sure is the last col because default extrafield rank is 100
1607 $this->cols['totalexcltax'] = array(
1608 'rank' => $rank,
1609 'width' => 26, // in mm
1610 'status' => true,
1611 'title' => array(
1612 'textkey' => 'PMPValue'
1613 ),
1614 'border-left' => true, // add left line separator
1615 );
1616
1617 // Add extrafields cols
1618 if (!empty($object->lines)) {
1619 $line = reset($object->lines);
1620 $this->defineColumnExtrafield($line, $outputlangs, $hidedetails);
1621 }
1622
1623 $parameters = array(
1624 'object' => $object,
1625 'outputlangs' => $outputlangs,
1626 'hidedetails' => $hidedetails,
1627 'hidedesc' => $hidedesc,
1628 'hideref' => $hideref
1629 );
1630
1631 $reshook = $hookmanager->executeHooks('defineColumnField', $parameters, $this); // Note that $object may have been modified by hook
1632 if ($reshook < 0) {
1633 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1634 } elseif (empty($reshook)) {
1635 $this->cols = array_replace($this->cols, $hookmanager->resArray); // array_replace is used to preserve keys
1636 } else {
1637 $this->cols = $hookmanager->resArray;
1638 }
1639 }
1640}
Class to manage bank accounts.
prepareArrayColumnField($object, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0)
Prepare Array Column Field.
getColumnStatus($colKey)
get column status from column key
printStdColumnContent($pdf, &$curY, $colKey, $columnText='')
print standard column content
pdfTabTitles(&$pdf, $tab_top, $tab_height, $outputlangs, $hidetop=0)
Print standard column content.
printColDescContent($pdf, &$curY, $colKey, $object, $i, $outputlangs, $hideref=0, $hidedesc=0, $issupplierline=0)
print description column content
getColumnContentXStart($colKey)
get column content X (abscissa) left position from column key
printRect($pdf, $x, $y, $l, $h, $hidetop=0, $hidebottom=0)
Rect pdf.
getExtrafieldContent($object, $extrafieldKey, $outputlangs=null)
get extrafield content for pdf writeHtmlCell compatibility usage for PDF line columns and object note...
defineColumnExtrafield($object, $outputlangs, $hidedetails=0)
Define Array Column Field for extrafields.
Class to manage hooks.
Parent class for orders models.
Class to manage products or services.
Class to manage translations.
Class to manage Dolibarr users.
Class to generate PDF orders with template Eagle.
drawTotalTable(&$pdf, $object, $deja_regle, $posy, $outputlangs)
Show total to pay.
drawInfoTable(&$pdf, $object, $posy, $outputlangs)
Show miscellaneous information (payment mode, payment term, ...)
_tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop=0, $hidebottom=0, $currency='')
Show table for lines.
_pagehead(&$pdf, $object, $showaddress, $outputlangs, $titlekey="StockTransferSheetProforma")
Show top header of page.
_pagefoot(&$pdf, $object, $outputlangs, $hidefreetext=0)
Show footer of page.
write_file($object, $outputlangs, $srctemplatepath='', $hidedetails=0, $hidedesc=0, $hideref=0)
Function to build pdf onto disk.
drawPaymentsTable(&$pdf, $object, $posy, $outputlangs)
Show payments table.
defineColumnField($object, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0)
Define Array Column Field.
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.
if(!function_exists( 'dolEscapeXML')) convertBackOfficeMediasLinksToPublicLinks($notetoshow)
Convert links to local wrapper to medias files into a string into a public external URL readable on i...
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dolChmod($filepath, $newmask='')
Change mod of a file.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
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...
getDolGlobalString($key, $default='')
Return 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_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
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:2529
pdf_getPDFFontSize($outputlangs)
Return font size to use for PDF generation.
Definition pdf.lib.php:289
pdf_getFormat(Translate $outputlangs=null, $mode='setup')
Return array with format properties of default PDF format.
Definition pdf.lib.php:85
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:1010
pdf_getlineupexcltax($object, $i, $outputlangs, $hidedetails=0)
Return line unit price excluding tax.
Definition pdf.lib.php:1901
pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails=0)
Return line vat rate.
Definition pdf.lib.php:1839
pdf_getlineunit($object, $i, $outputlangs, $hidedetails=0, $hookmanager=false)
Return line unit.
Definition pdf.lib.php:2147
pdf_pagehead(&$pdf, $outputlangs, $page_height)
Show header of page for PDF generation.
Definition pdf.lib.php:726
pdf_writeLinkedObjects(&$pdf, $object, $outputlangs, $posx, $posy, $w, $h, $align, $default_font_size)
Show linked objects for PDF generation.
Definition pdf.lib.php:1338
pdf_bank(&$pdf, $outputlangs, $curx, $cury, $account, $onlynumber=0, $default_font_size=10)
Show bank informations for PDF generation.
Definition pdf.lib.php:833
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 formated for output on documents.
Definition pdf.lib.php:435
pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails=0)
Return line remise percent.
Definition pdf.lib.php:2190
pdf_getlineqty($object, $i, $outputlangs, $hidedetails=0)
Return line quantity.
Definition pdf.lib.php:1986
pdf_getSubstitutionArray($outputlangs, $exclude=null, $object=null, $onlykey=0, $include=null)
Return array of possible substitutions for PDF content (without external module substitutions).
Definition pdf.lib.php:758
pdf_getInstance($format='', $metric='mm', $pagetype='P')
Return a PDF instance object.
Definition pdf.lib.php:127
pdfBuildThirdpartyName($thirdparty, Translate $outputlangs, $includealias=0)
Returns the name of the thirdparty.
Definition pdf.lib.php:387
pdf_watermark(&$pdf, $outputlangs, $h, $w, $unit, $text)
Add a draft watermark on PDF files.
Definition pdf.lib.php:778
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:120
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition repair.php:123