Clean code for PDF invoices

This commit is contained in:
ldestailleur
2025-09-20 02:48:27 +02:00
parent 57157db2b7
commit 5ac469634e
4 changed files with 283 additions and 164 deletions

View File

@@ -1576,7 +1576,7 @@ class pdf_crabe extends ModelePDFFactures
}
}
if ($total_discount_on_lines > 0) {
if ($total_discount_on_lines > 0 && !$object->isSituationInvoice()) { // This is false on situation invoice
// Show total NET before discount
$pdf->SetFillColor(255, 255, 255);
$pdf->SetXY($col1x, $tab2_top);

View File

@@ -32,7 +32,7 @@
/**
* \file htdocs/core/modules/facture/doc/pdf_octopus.modules.php
* \ingroup facture
* \ingroup invoice
* \brief File of class to generate customers invoices from octopus model
*/
@@ -101,16 +101,10 @@ class pdf_octopus extends ModelePDFFactures
public $tab_top;
/**
* @var int tab_top_newpage
* @var int|float tab_top_newpage
*/
public $tab_top_newpage;
/**
* Issuer
* @var Societe Object that emits
*/
public $emetteur;
/**
* @var bool Situation invoice type
*/
@@ -159,11 +153,6 @@ class pdf_octopus extends ModelePDFFactures
*/
public $is_rg;
/**
* @var bool franchise
*/
public $franchise;
/**
* @var int
*/
@@ -209,6 +198,7 @@ class pdf_octopus extends ModelePDFFactures
$this->marge_haute = getDolGlobalInt('MAIN_PDF_MARGIN_TOP', 10);
$this->marge_basse = getDolGlobalInt('MAIN_PDF_MARGIN_BOTTOM', 10);
$this->corner_radius = getDolGlobalInt('MAIN_PDF_FRAME_CORNER_RADIUS', 0);
$this->posx_cumul_anterieur = 94;
$this->posx_new_cumul = 130;
$this->posx_current = 166;
@@ -223,7 +213,17 @@ class pdf_octopus extends ModelePDFFactures
$this->option_freetext = 1; // Support add of a personalised text
$this->option_draft_watermark = 1; // Support add of a watermark on drafts
$this->watermark = '';
$this->franchise = !$mysoc->tva_assuj; // not used ?
if ($mysoc === null) {
dol_syslog(get_class($this).'::__construct() Global $mysoc should not be null.'. getCallerInfoString(), LOG_ERR);
return;
}
// Get source company
$this->emetteur = $mysoc;
if (empty($this->emetteur->country_code)) {
$this->emetteur->country_code = substr($langs->defaultlang, -2); // By default if not defined
}
// Define position of columns
$this->posxdesc = $this->marge_gauche + 1; // used for notes and other stuff
@@ -240,22 +240,11 @@ class pdf_octopus extends ModelePDFFactures
$this->atleastoneratenotnull = 0;
$this->atleastonediscount = 0;
$this->situationinvoice = true;
if (!empty($object)) {
'@phan-var-force Facture $object'; // Supposing $object is Facture;
if ($object instanceof Facture) {
$this->TDataSituation = $this->getDataSituation($object);
} else {
dol_syslog("object is empty, do not call getDataSituation...");
}
if ($mysoc === null) {
dol_syslog(get_class($this).'::__construct() Global $mysoc should not be null.'. getCallerInfoString(), LOG_ERR);
return;
}
// Get source company
$this->emetteur = $mysoc;
if (empty($this->emetteur->country_code)) {
$this->emetteur->country_code = substr($langs->defaultlang, -2); // By default, if was not defined
dol_syslog("object is not qualified, do not call getDataSituation...");
}
}
@@ -275,7 +264,7 @@ class pdf_octopus extends ModelePDFFactures
public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0)
{
// phpcs:enable
global $user, $langs, $conf, $mysoc, $db, $hookmanager, $nblines;
global $user, $langs, $conf, $mysoc, $hookmanager, $nblines;
dol_syslog("write_file outputlangs->defaultlang=".(is_object($outputlangs) ? $outputlangs->defaultlang : 'null'));
@@ -413,21 +402,28 @@ class pdf_octopus extends ModelePDFFactures
// Create pdf instance
$pdf = pdf_getInstance($this->format);
//$default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance
$default_font_size = 9;
$default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance
$pdf->setAutoPageBreak(true, 0);
// compute height for situation invoices
$this->heightforinfotot = 45; // Height reserved to output the info and total part and payment part
// Compute height for total, free text and footer
$this->heightforinfotot = 50; // Height reserved to output the info and total part and payment part
if (!getDolGlobalString('INVOICE_NO_PAYMENT_DETAILS') && $nbpayments > 0) {
$this->heightforinfotot += 4 * ($nbpayments + 3);
$this->heightforinfotot += (4 * ($nbpayments + 3));
}
if ($nbprevsituation > 0) {
$this->heightforinfotot += 4 * ($nbprevsituation + 3);
$this->heightforinfotot += (4 * ($nbprevsituation + 3));
}
$this->heightforfreetext = (getDolGlobalInt('MAIN_PDF_FREETEXT_HEIGHT', 5)); // Height reserved to output the free text on last page
$this->heightforfreetext = getDolGlobalInt('MAIN_PDF_FREETEXT_HEIGHT', 5); // Height reserved to output the free text on last page
$this->heightforfooter = $this->marge_basse + (!getDolGlobalString('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS') ? 12 : 22); // Height reserved to output the footer (value include bottom margin)
$heightforqrinvoice = 0;
if (getDolGlobalString('INVOICE_ADD_SWISS_QR_CODE') == 'bottom') {
if ($this->getHeightForQRInvoice(1, $object, $langs) > 0) {
// Shrink infotot to a base 30
$this->heightforinfotot = 30 + (4 * $nbpayments); // Height reserved to output the info and total part and payment part
}
}
if (class_exists('TCPDF')) {
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
@@ -462,10 +458,10 @@ class pdf_octopus extends ModelePDFFactures
$certprivate = empty($user->conf->CERTIFICATE_CRT_PRIVATE) ? '' : $user->conf->CERTIFICATE_CRT_PRIVATE;
// If user has no certificate, we try to take the company one
if (!$cert) {
$cert = getDolGlobalString('CERTIFICATE_CRT', '');
$cert = getDolGlobalString('CERTIFICATE_CRT');
}
if (!$certprivate) {
$certprivate = getDolGlobalString('CERTIFICATE_CRT_PRIVATE', '');
$certprivate = getDolGlobalString('CERTIFICATE_CRT_PRIVATE');
}
// If a certificate is found
if ($cert) {
@@ -514,6 +510,11 @@ class pdf_octopus extends ModelePDFFactures
}
$this->categoryOfOperation = $categoryOfOperation;
// Situation invoice handling
if ($object->situation_cycle_ref) {
$this->situationinvoice = true;
}
// New page
$pdf->AddPage();
if (!empty($this->tplidx)) {
@@ -540,9 +541,16 @@ class pdf_octopus extends ModelePDFFactures
$qrcodestring = '';
if (getDolGlobalString('INVOICE_ADD_ZATCA_QR_CODE')) {
$qrcodestring = $object->buildZATCAQRString();
} elseif (getDolGlobalString('INVOICE_ADD_SWISS_QR_CODE') == '1') {
$qrcodestring = $object->buildSwitzerlandQRString();
} elseif (getDolGlobalString('INVOICE_ADD_SWISS_QR_CODE') == '1' && (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR')) {
if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$qrcodestring = $object->buildSwitzerlandQRString();
}
} elseif (getDolGlobalString('INVOICE_ADD_EPC_QR_CODE') == '1' && (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR')) {
if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$qrcodestring = $object->buildEPCQrCodeString();
}
}
if ($qrcodestring) {
$qrcodecolor = array('25', '25', '25');
// set style for QR-code
@@ -555,6 +563,15 @@ class pdf_octopus extends ModelePDFFactures
'module_height' => 1 // height of a single module in points
);
$pdf->write2DBarcode($qrcodestring, 'QRCODE,M', $this->marge_gauche, $this->tab_top - 5, 25, 25, $styleQr, 'N');
if (getDolGlobalString('INVOICE_ADD_EPC_QR_CODE') == '1' && (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR')) {
if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$pdf->SetXY($this->marge_gauche + 30, $pdf->GetY() - 15);
$pdf->SetFont('', '', $default_font_size - 4);
$pdf->MultiCell(40, 3, $langs->transnoentitiesnoconv("INVOICE_ADD_EPC_QR_CODEPay"), 0, 'L', false);
}
}
$extra_under_address_shift += 25;
}
@@ -707,15 +724,15 @@ class pdf_octopus extends ModelePDFFactures
// Draw note frame
if ($i > $pageposbeforenote) {
$height_note = $this->page_hauteur - ($this->tab_top_newpage + $this->heightforfooter);
$pdf->RoundedRect($this->marge_gauche, $this->tab_top_newpage - 1, $tab_width, $height_note + 2, $this->corner_radius, '1234', 'D');
$pdf->RoundedRect($this->marge_gauche, $this->tab_top_newpage - 1, $tab_width, $height_note + 1, $this->corner_radius, '1234', 'D');
} else {
$height_note = $this->page_hauteur - ($this->tab_top + $this->heightforfooter);
$pdf->RoundedRect($this->marge_gauche, $this->tab_top - 1, $tab_width, $height_note + 2, $this->corner_radius, '1234', 'D');
$pdf->RoundedRect($this->marge_gauche, $this->tab_top - 1, $tab_width, $height_note + 1, $this->corner_radius, '1234', 'D');
}
// Add footer
$pdf->setPageOrientation('', true, 0); // The only function to edit the bottom margin of current page to set it.
$this->_pagefoot($pdf, $object, $outputlangs, 1);
$this->_pagefoot($pdf, $object, $outputlangs, 1, $this->getHeightForQRInvoice($i, $object, $outputlangs));
$i++;
}
@@ -729,13 +746,13 @@ class pdf_octopus extends ModelePDFFactures
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
}
$height_note = $posyafter - $this->tab_top_newpage;
$pdf->RoundedRect($this->marge_gauche, $this->tab_top_newpage - 1, $tab_width, $height_note + 2, $this->corner_radius, '1234', 'D');
$pdf->RoundedRect($this->marge_gauche, $this->tab_top_newpage - 1, $tab_width, $height_note + 1, $this->corner_radius, '1234', 'D');
} else {
// No pagebreak
$pdf->commitTransaction();
$posyafter = $pdf->GetY();
$height_note = $posyafter - $this->tab_top;
$pdf->RoundedRect($this->marge_gauche, $this->tab_top - 1, $tab_width, $height_note + 2, $this->corner_radius, '1234', 'D');
$pdf->RoundedRect($this->marge_gauche, $this->tab_top - 1, $tab_width, $height_note + 1, $this->corner_radius, '1234', 'D');
if ($posyafter > ($this->page_hauteur - ($this->heightforfooter + $this->heightforfreetext + 20))) {
@@ -766,16 +783,22 @@ class pdf_octopus extends ModelePDFFactures
// Table simulation to know the height of the title line (this set this->tableTitleHeight)
// don't need it in situation invoices
// $pdf->startTransaction();
// $this->pdfTabTitles($pdf, $this->tab_top_newpage + ($this->tabTitleHeight/2), $tab_height, $outputlangs, $hidetop);
// $pdf->rollbackTransaction(true);
//$pdf->startTransaction();
//$this->pdfTabTitles($pdf, $this->tab_top, $tab_height, $outputlangs, $hidetop);
//$pdf->rollbackTransaction(true);
// We start the top of first line at tab_top_newpage and not tab_top because
// we are already on second page with this template.
$nexY = $this->tab_top_newpage + $this->tabTitleHeight;
// Loop on each lines
$pageposbeforeprintlines = $pdf->getPage();
$pagenb = $pageposbeforeprintlines;
for ($i = 0; $i < $nblines; $i++) {
$linePosition = $i + 1;
$curY = $nexY;
$posy = $nexY;
$pdf->SetFont('', '', $default_font_size - 1); // Into loop to work with multipage
$pdf->SetTextColor(0, 0, 0);
@@ -790,37 +813,39 @@ class pdf_octopus extends ModelePDFFactures
$pdf->setPageOrientation('', true, $this->heightforfooter + $this->heightforfreetext + $this->heightforinfotot); // The only function to edit the bottom margin of current page to set it.
$pageposbefore = $pdf->getPage();
$showpricebeforepagebreak = 1;
// Allows data in the first page if description is long enough to break in multiples pages
$showpricebeforepagebreak = getDolGlobalInt('MAIN_PDF_DATA_ON_FIRST_PAGE');
$posYAfterImage = 0;
$posYAfterDescription = 0;
if ($this->getColumnStatus('photo')) {
// We start with Photo of product line
$imageTopMargin = 1;
if (isset($imglinesize['width']) && isset($imglinesize['height']) && ($posy + $imglinesize['height']) > ($this->page_hauteur - ($this->heightforfooter + $this->heightforfreetext + $this->heightforinfotot))) { // If photo too high, we moved completely on new page
$pdf->AddPage('', '', true);
if (!empty($this->tplidx)) {
$pdf->useTemplate($this->tplidx);
}
$pdf->setPage($pageposbefore + 1);
$pdf->setPageOrientation('', true, $this->heightforfooter); // The only function to edit the bottom margin of current page to set it.
$posy = $this->tab_top_newpage;
// Allows data in the first page if description is long enough to break in multiples pages
if (getDolGlobalString('MAIN_PDF_DATA_ON_FIRST_PAGE')) {
$showpricebeforepagebreak = 1;
} else {
$showpricebeforepagebreak = 0;
}
$showpricebeforepagebreak = 0;
}
/** @phan-suppress-next-line PhanTypeMismatchProperty */
// @phan-suppress-next-line PhanTypeMismatchProperty
if (!empty($this->cols['photo']) && isset($imglinesize['width']) && isset($imglinesize['height'])) {
$pdf->Image($realpatharray[$i], $this->getColumnContentXStart('photo'), $posy + 1, $imglinesize['width'], $imglinesize['height'], '', '', '', 2, 300); // Use 300 dpi
// $pdf->Image does not increase value return by getY, so we save it manually
$posYAfterImage = $posy + $imglinesize['height'];
$this->setAfterColsLinePositionsData('photo', $posYAfterImage, $pdf->getPage());
}
}
// restore Page orientation for text
$pdf->setPageOrientation('', true, $this->heightforfooter); // The only function to edit the bottom margin of current page to set it.
// Description of product line
if ($this->getColumnStatus('desc')) {
$pdf->startTransaction();
@@ -876,6 +901,11 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetFont('', '', $default_font_size - 1); // We reposition the default font
// Line position
if ($this->getColumnStatus('position')) {
$this->printStdColumnContent($pdf, $curY, 'position', strval($linePosition));
}
// VAT Rate
if ($this->getColumnStatus('vat')) {
$vat_rate = pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails);
@@ -959,12 +989,13 @@ class pdf_octopus extends ModelePDFFactures
$nexY = max($pdf->GetY(), $nexY);
}
$afterPosData = $this->getMaxAfterColsLinePositionsData();
$parameters = array(
'object' => $object,
'i' => $i,
'pdf' => & $pdf,
'curY' => & $posy,
'nexY' => & $nexY,
'nexY' => & $afterPosData['y'], // for backward module hook compatibility Y will be accessible by $object->getMaxAfterColsLinePositionsData()
'outputlangs' => $outputlangs,
'hidedetails' => $hidedetails
);
@@ -1034,22 +1065,24 @@ class pdf_octopus extends ModelePDFFactures
}
$this->tva[$vatrate] += $tvaligne; // ->tva is abandoned, we use now ->tva_array that is more complete
$vatcode = $object->lines[$i]->vat_src_code;
if (empty($this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')]['amount'])) {
$this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')]['amount'] = 0;
}
if (getDolGlobalInt('PDF_INVOICE_SHOW_VAT_ANALYSIS')) {
if (empty($this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')]['tot_ht'])) {
$this->tva_array[$vatrate . ($vatcode ? ' (' . $vatcode . ')' : '')]['tot_ht'] = 0;
}
$this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')] = array('vatrate' => $vatrate, 'vatcode' => $vatcode, 'amount' => $this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')]['amount'] + $tvaligne, 'tot_ht' => $this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')]['tot_ht'] + $object->lines[$i]->total_ht);
} else {
if (empty($this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')]['amount'])) {
$this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')]['amount'] = 0;
}
$this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')] = array('vatrate' => $vatrate, 'vatcode' => $vatcode, 'amount' => $this->tva_array[$vatrate.($vatcode ? ' ('.$vatcode.')' : '')]['amount'] + $tvaligne);
}
$afterPosData = $this->getMaxAfterColsLinePositionsData();
$pdf->setPage($afterPosData['page']);
$nexY = max($nexY, $posYAfterImage);
// Add line
if (getDolGlobalString('MAIN_PDF_DASH_BETWEEN_LINES') && $i < ($nblines - 1)) {
if (getDolGlobalString('MAIN_PDF_DASH_BETWEEN_LINES') && $i < ($nblines - 1) && $afterPosData['y'] < $this->page_hauteur - $this->heightforfooter - 5) {
$pdf->setPage($pageposafter);
$pdf->SetLineStyle(array('dash' => '1,1', 'color' => array(80, 80, 80)));
//$pdf->SetDrawColor(190,190,200);
@@ -1111,7 +1144,13 @@ class pdf_octopus extends ModelePDFFactures
$tabTitleHeight = 0;
$this->_tableau($pdf, $tabtop, $tabhauteur, 0, $outputlangs, $hidetop, 1, $object->multicurrency_code, $outputlangsbis);
// reset text color before print footers
$pdf->SetTextColor(0, 0, 0);
$pdf->setPage($pdf->getNumPages());
$bottomlasttab = $tabtop + $tabhauteur + $tabTitleHeight + 10;
//$bottomlasttab = $this->page_hauteur - $this->heightforinfotot - $this->heightforfreetext - $this->heightforfooter - $heightforqrinvoice + 1;
// Display infos area
$posy = $this->drawInfoTable($pdf, $object, $bottomlasttab, $outputlangs, $outputlangsbis);
@@ -1125,16 +1164,41 @@ class pdf_octopus extends ModelePDFFactures
$posy = $this->drawPaymentsTable($pdf, $object, $posy, $outputlangs);
}
// Pagefoot
$this->_pagefoot($pdf, $object, $outputlangs);
// Add number of pages in footer
if (method_exists($pdf, 'AliasNbPages')) {
$pdf->AliasNbPages(); // @phan-suppress-current-line PhanUndeclaredMethod
}
// Add terms to sale
if (!empty($mysoc->termsofsale) && getDolGlobalInt('MAIN_PDF_ADD_TERMSOFSALE_INVOICE')) {
$termsofsale = $conf->mycompany->dir_output.'/'.$mysoc->termsofsale;
if (!empty($conf->mycompany->multidir_output[$object->entity ?? $conf->entity])) {
$termsofsale = $conf->mycompany->multidir_output[$object->entity ?? $conf->entity].'/'.$mysoc->termsofsale;
}
if (file_exists($termsofsale) && is_readable($termsofsale)) {
$pagecount = $pdf->setSourceFile($termsofsale);
for ($i = 1; $i <= $pagecount; $i++) {
$tplIdx = $pdf->importPage($i);
if ($tplIdx !== false) {
$s = $pdf->getTemplatesize($tplIdx);
$pdf->AddPage($s['h'] > $s['w'] ? 'P' : 'L');
$pdf->useTemplate($tplIdx);
} else {
setEventMessages(null, array($termsofsale.' cannot be added, probably protected PDF'), 'warnings');
}
}
}
}
$this->resumeLastPage($pdf, $object, 0, $tab_top, $outputlangs, $outputlangsbis);
$bottomlasttab = $this->page_hauteur - $this->heightforinfotot - $this->heightforfreetext - $this->heightforfooter + 1;
$this->_pagefoot($pdf, $object, $outputlangs, 1);
if (getDolGlobalString('INVOICE_ADD_SWISS_QR_CODE') == 'bottom') {
$this->addBottomQRInvoice($pdf, $object, $outputlangs);
}
$pdf->Close();
$pdf->Output($file, 'F');
@@ -1178,8 +1242,6 @@ class pdf_octopus extends ModelePDFFactures
*/
public function drawPaymentsTable(&$pdf, $object, $posy, $outputlangs)
{
global $conf;
$sign = 1;
if ($object->type == 2 && getDolGlobalString('INVOICE_POSITIVE_CREDIT_NOTE')) {
$sign = -1;
@@ -1323,7 +1385,7 @@ class pdf_octopus extends ModelePDFFactures
*/
protected function drawInfoTable(&$pdf, $object, $posy, $outputlangs, $outputlangsbis)
{
global $mysoc, $hookmanager;
global $conf, $mysoc, $hookmanager;
$default_font_size = pdf_getPDFFontSize($outputlangs);
@@ -1493,7 +1555,7 @@ class pdf_octopus extends ModelePDFFactures
// Show payments conditions
if ($object->type != 2 && ($object->cond_reglement_code || $object->cond_reglement)) {
$pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->SetFont('', '', $default_font_size - 2);
$pdf->SetXY($this->marge_gauche, $posy);
$titre = $outputlangs->transnoentities("PaymentConditions").':';
$pdf->MultiCell($posxval - $this->marge_gauche, 4, $titre, 0, 'L');
@@ -1509,7 +1571,7 @@ class pdf_octopus extends ModelePDFFactures
// Show category of operations
if (getDolGlobalInt('INVOICE_CATEGORY_OF_OPERATION') == 2 && $this->categoryOfOperation >= 0) {
$pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->SetFont('', '', $default_font_size - 2);
$pdf->SetXY($this->marge_gauche, $posy);
$categoryOfOperationTitle = $outputlangs->transnoentities("MentionCategoryOfOperations").' : ';
$pdf->MultiCell($posxval - $this->marge_gauche, 4, $categoryOfOperationTitle, 0, 'L');
@@ -1535,7 +1597,7 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetXY($this->marge_gauche, $posy);
$pdf->SetTextColor(200, 0, 0);
$pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->SetFont('', '', $default_font_size - 2);
$this->error = $outputlangs->transnoentities("ErrorPaymentModeDefinedToWithoutSetup", $object->mode_reglement_code);
$pdf->MultiCell($posxend - $this->marge_gauche, 3, $this->error, 0, 'L', false);
$pdf->SetTextColor(0, 0, 0);
@@ -1547,7 +1609,7 @@ class pdf_octopus extends ModelePDFFactures
if (!empty($object->mode_reglement_code)
&& $object->mode_reglement_code != 'CHQ'
&& $object->mode_reglement_code != 'VIR') {
$pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->SetFont('', '', $default_font_size - 2);
$pdf->SetXY($this->marge_gauche, $posy);
$titre = $outputlangs->transnoentities("PaymentMode").':';
$pdf->MultiCell($posxend - $this->marge_gauche, 5, $titre, 0, 'L');
@@ -1561,7 +1623,7 @@ class pdf_octopus extends ModelePDFFactures
require_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
$bac = new CompanyBankAccount($this->db);
// @phan-suppress-next-line PhanPluginSuspiciousParamPosition
$bac->fetch(0, (string) $object->thirdparty->id);
$bac->fetch(0, '', $object->thirdparty->id);
$iban = $bac->iban.(($bac->iban && $bac->bic) ? ' / ' : '').$bac->bic;
$lib_mode_reg .= ' '.$outputlangs->trans("PaymentTypePREdetails", dol_trunc($iban, 6, 'right', 'UTF-8', 1));
}
@@ -1587,23 +1649,11 @@ class pdf_octopus extends ModelePDFFactures
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'CB' || $object->mode_reglement_code == 'VAD') {
$useonlinepayment = 0;
if (getDolGlobalString('PDF_SHOW_LINK_TO_ONLINE_PAYMENT')) {
if (isModEnabled('paypal')) {
$useonlinepayment++;
}
if (isModEnabled('stripe')) {
$useonlinepayment++;
}
if (isModEnabled('paybox')) {
$useonlinepayment++;
}
$parameters = array();
$action = '';
$reshook = $hookmanager->executeHooks('doShowOnlinePaymentUrl', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
if ($reshook > 0) {
if (isset($hookmanager->resArray['showonlinepaymenturl'])) {
$useonlinepayment += $hookmanager->resArray['showonlinepaymenturl'];
}
}
// Show online payment link
// The list can be complete by the hook 'doValidatePayment' executed inside getValidOnlinePaymentMethods()
include_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
$validpaymentmethod = getValidOnlinePaymentMethods('');
$useonlinepayment = count($validpaymentmethod);
}
@@ -1645,7 +1695,7 @@ class pdf_octopus extends ModelePDFFactures
$posy = $pdf->GetY() + 2;
}
}
if (getDolGlobalString('FACTURE_CHQ_NUMBER') == -1) {
if (getDolGlobalInt('FACTURE_CHQ_NUMBER') == -1) {
$pdf->SetXY($this->marge_gauche, $posy);
$pdf->SetFont('', 'B', $default_font_size - $diffsizetitle);
$pdf->MultiCell($posxend - $this->marge_gauche, 3, $outputlangs->transnoentities('PaymentByChequeOrderedTo', $this->emetteur->name), 0, 'L', false);
@@ -1664,12 +1714,12 @@ class pdf_octopus extends ModelePDFFactures
// If payment mode not forced or forced to VIR, show payment with BAN
if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR') {
if ($object->fk_account > 0 || $object->fk_bank > 0 || getDolGlobalInt('FACTURE_RIB_NUMBER')) {
$bankid = ($object->fk_account <= 0 ? getDolGlobalInt('FACTURE_RIB_NUMBER') : $object->fk_account);
$bankid = ($object->fk_account <= 0 ? getDolGlobalInt('FACTURE_RIB_NUMBER') : (int) $object->fk_account);
if ($object->fk_bank > 0) {
$bankid = $object->fk_bank; // For backward compatibility when object->fk_account is forced with object->fk_bank
}
$account = new Account($this->db);
$account->fetch((int) $bankid);
$account->fetch($bankid);
$curx = $this->marge_gauche;
$cury = $posy;
@@ -1678,6 +1728,29 @@ class pdf_octopus extends ModelePDFFactures
$posy += 2;
// SHOW EPC QR CODE
if (getDolGlobalString('INVOICE_ADD_EPC_QR_CODE') == 'bottom') {
$qrPosX = 120;
$qrPosY = $posy;
$qrCodeColor = array('25', '25', '25');
$styleQr = array(
'border' => false,
'padding' => 0,
'fgcolor' => $qrCodeColor,
'bgcolor' => false, //array(255,255,255)
'module_width' => 1, // width of a single module in points
'module_height' => 1 // height of a single module in points
);
$EPCQrCodeString = $object->buildEPCQrCodeString();
$pdf->write2DBarcode($EPCQrCodeString, 'QRCODE,M', $qrPosX, $qrPosY, 25, 25, $styleQr, 'N');
$pdf->SetXY($qrPosX + 30, $posy + 5);
$pdf->SetFont('', '', $default_font_size - 5);
$pdf->MultiCell(30, 3, $outputlangs->transnoentitiesnoconv("INVOICE_ADD_EPC_QR_CODEPay"), 0, 'L', false);
$posy = $pdf->GetY() + 2;
}
// Show structured communication
if (getDolGlobalString('INVOICE_PAYMENT_ENABLE_STRUCTURED_COMMUNICATION')) {
include_once DOL_DOCUMENT_ROOT.'/core/lib/functions_be.lib.php';
@@ -1724,13 +1797,18 @@ class pdf_octopus extends ModelePDFFactures
$tab2_top = $posy - 4;
$tab2_hl = 4;
$pdf->SetFont('', '', $default_font_size - 1);
if (is_object($outputlangsbis)) { // When we show 2 languages we need more room for text, so we use a smaller font.
$pdf->SetFont('', '', $default_font_size - 2);
} else {
$pdf->SetFont('', '', $default_font_size - 1);
}
// Total table
$col1x = 120;
$col2x = 170;
if ($this->page_largeur < 210) { // To work with US executive format
$col2x -= 20;
$col1x -= 15;
$col2x -= 10;
}
$largcol2 = ($this->page_largeur - $this->marge_droite - $col2x);
@@ -1760,6 +1838,7 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetFillColor(248, 248, 248);
$total_ttc = (isModEnabled("multicurrency") && $object->multicurrency_tx != 1) ? $object->multicurrency_total_ttc : $object->total_ttc;
$total_ttc_origin = $object->total_ttc;
$this->atleastoneratenotnull = 0;
if (!getDolGlobalString('MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT')) {
@@ -1781,8 +1860,8 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
$tvacompl = '';
if (preg_match('/\*/', $tvakey)) {
$tvakey = str_replace('*', '', $tvakey);
if (preg_match('/\*/', (string) $tvakey)) {
$tvakey = str_replace('*', '', (string) $tvakey);
$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
}
@@ -1819,8 +1898,8 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
$tvacompl = '';
if (preg_match('/\*/', $tvakey)) {
$tvakey = str_replace('*', '', $tvakey);
if (preg_match('/\*/', (string) $tvakey)) {
$tvakey = str_replace('*', '', (string) $tvakey);
$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
}
$totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : '');
@@ -1875,13 +1954,13 @@ class pdf_octopus extends ModelePDFFactures
$totalvat = $outputlangs->transcountrynoentities("TotalVAT", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalVAT", $mysoc->country_code) : '');
$totalvat .= ' ';
if (getDolGlobalString('PDF_VAT_LABEL_IS_CODE_OR_RATE') == 'rateonly') {
$totalvat .= vatrate($tvaval['vatrate'], true).$tvacompl;
$totalvat .= vatrate((string) $tvaval['vatrate'], true).$tvacompl;
} elseif (getDolGlobalString('PDF_VAT_LABEL_IS_CODE_OR_RATE') == 'codeonly') {
$totalvat .= $tvaval['vatcode'].$tvacompl;
} elseif (getDolGlobalString('PDF_VAT_LABEL_IS_CODE_OR_RATE') == 'nocodenorate') {
$totalvat .= $tvacompl;
} else {
$totalvat .= vatrate($tvaval['vatrate'], true).($tvaval['vatcode'] ? ' ('.$tvaval['vatcode'].')' : '').$tvacompl;
$totalvat .= vatrate((string) $tvaval['vatrate'], true).($tvaval['vatcode'] ? ' ('.$tvaval['vatcode'].')' : '').$tvacompl;
}
$pdf->MultiCell($col2x - $col1x, $tab2_hl, $totalvat, 0, 'L', true);
@@ -1905,8 +1984,8 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
$tvacompl = '';
if (preg_match('/\*/', $tvakey)) {
$tvakey = str_replace('*', '', $tvakey);
if (preg_match('/\*/', (string) $tvakey)) {
$tvakey = str_replace('*', '', (string) $tvakey);
$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
}
$totalvat = $outputlangs->transcountrynoentities("TotalLT1", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT1", $mysoc->country_code) : '');
@@ -1943,8 +2022,8 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
$tvacompl = '';
if (preg_match('/\*/', $tvakey)) {
$tvakey = str_replace('*', '', $tvakey);
if (preg_match('/\*/', (string) $tvakey)) {
$tvakey = str_replace('*', '', (string) $tvakey);
$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
}
$totalvat = $outputlangs->transcountrynoentities("TotalLT2", $mysoc->country_code).(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transcountrynoentities("TotalLT2", $mysoc->country_code) : '');
@@ -1958,7 +2037,7 @@ class pdf_octopus extends ModelePDFFactures
$pdf->MultiCell($col2x - $col1x, $tab2_hl, $totalvat, 0, 'L', true);
$total_localtax = ((isModEnabled("multicurrency") && isset($object->multicurrency_tx) && $object->multicurrency_tx != 1) ? price2num($tvaval * $object->multicurrency_tx, 'MT') : $tvaval);
$total_localtax = ((isModEnabled("multicurrency") && $object->multicurrency_tx != 1) ? price2num($tvaval * $object->multicurrency_tx, 'MT') : $tvaval);
$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($total_localtax, 0, $outputlangs), 0, 'R', true);
@@ -1985,7 +2064,21 @@ class pdf_octopus extends ModelePDFFactures
$pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalTTC") : ''), $useborder, 'L', true);
$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($sign * $total_ttc, 0, $outputlangs), $useborder, 'R', true);
if (!isModEnabled("multicurrency") || $object->multicurrency_tx == 1 || getDolGlobalInt('MULTICURRENCY_SHOW_ALSO_MAIN_CURRENCY_ON_PDF') == 0) {
$pdf->MultiCell($largcol2, $tab2_hl, price($sign * $total_ttc, 0, $outputlangs), $useborder, 'R', true);
} else {
$pdf->MultiCell($largcol2, $tab2_hl, price($sign * $total_ttc, 0, $outputlangs), $useborder, 'R', true);
//$pdf->writeHTMLCell($largcol2, $tab2_hl, null, null, '<font size="-2">('.price($sign * $object->total_ttc, 0, $outputlangs, 1, -1, 'MT', $mysoc->currency_code).')</font> &nbsp; '.price($sign * $total_ttc, 0, $outputlangs), $useborder, 1, true, true, 'R');
$index++;
$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
$pdf->SetTextColor(0, 0, 60);
$pdf->SetFillColor(224, 224, 224);
$pdf->MultiCell($col2x - $col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC").(is_object($outputlangsbis) ? ' / '.$outputlangsbis->transnoentities("TotalTTC") : '').' ('.$outputlangs->getCurrencySymbol($mysoc->currency_code).')', $useborder, 'L', true);
$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2, $tab2_hl, price($sign * $total_ttc_origin, 0, $outputlangs, 1, -1, -1, $mysoc->currency_code), $useborder, 'L', true);
}
// Retained warranty
@@ -2270,6 +2363,7 @@ class pdf_octopus extends ModelePDFFactures
$title = $outputlangs->transnoentities("InvoiceProForma");
}
if ($this->situationinvoice) {
$outputlangs->loadLangs(array("other"));
$title = $outputlangs->transnoentities("PDFInvoiceSituation");
$subtitle = $outputlangs->transnoentities("PDFSituationTitle", (string) $object->situation_counter);
}
@@ -2291,10 +2385,10 @@ class pdf_octopus extends ModelePDFFactures
}
}
$title .= ' '.$outputlangs->convToOutputCharset($object->ref);
// if ($object->status == $object::STATUS_DRAFT) {
// $pdf->SetTextColor(128, 0, 0);
// $title .= ' - '.$outputlangs->transnoentities("NotValidated");
// }
if ($object->status == $object::STATUS_DRAFT) {
$pdf->SetTextColor(128, 0, 0);
$title .= ' - '.$outputlangs->transnoentities("NotValidated");
}
$pdf->MultiCell($w, 3, $title, '', 'R');
if (!empty($subtitle)) {
@@ -2500,7 +2594,7 @@ class pdf_octopus extends ModelePDFFactures
$thirdparty = $object->thirdparty;
}
$carac_client_name = is_object($thirdparty) ? pdfBuildThirdpartyName($thirdparty, $outputlangs) : 0;
$carac_client_name = is_object($thirdparty) ? pdfBuildThirdpartyName($thirdparty, $outputlangs) : '';
$mode = 'target';
$carac_client = pdf_build_address($outputlangs, $this->emetteur, $object->thirdparty, ($usecontact ? $object->contact : ''), ($usecontact ? 1 : 0), $mode, $object);
@@ -2545,7 +2639,7 @@ class pdf_octopus extends ModelePDFFactures
$idaddressshipping = $object->getIdContact('external', 'SHIPPING');
if (!empty($idaddressshipping)) {
$contactshipping = $object->fetch_Contact($idaddressshipping[0]);
$object->fetch_contact($idaddressshipping[0]); // Load $object->contact
$companystatic = new Societe($this->db);
$companystatic->fetch($object->contact->fk_soc);
$carac_client_name_shipping = pdfBuildThirdpartyName($object->contact, $outputlangs);
@@ -2557,6 +2651,8 @@ class pdf_octopus extends ModelePDFFactures
if (!empty($carac_client_shipping)) {
$posy += $hautcadre;
$hautcadre -= 10; // Height for the shipping address does not need to be as high as main box
// Show shipping frame
$pdf->SetXY($posx + 2, $posy - 5);
$pdf->SetFont('', '', $default_font_size - 2);
@@ -2574,6 +2670,7 @@ class pdf_octopus extends ModelePDFFactures
$pdf->SetXY($posx + 2, $posy);
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->MultiCell($widthrecbox - 2, 2, $carac_client_shipping, '', 'L');
$shipp_shift += $hautcadre;
}
}
@@ -2689,7 +2786,7 @@ class pdf_octopus extends ModelePDFFactures
$this->cols['vat'] = array(
'rank' => $rank,
'status' => false,
'width' => 10, // in mm
'width' => 14, // in mm
'title' => array(
'textkey' => 'VAT'
),
@@ -3425,9 +3522,7 @@ class pdf_octopus extends ModelePDFFactures
*/
public function btpGetInvoiceAmounts($id, $forceReadFromDB = false)
{
global $user, $langs, $mysoc, $db, $hookmanager, $nblignes;
$object = new Facture($db);
$object = new Facture($this->db);
$object->fetch($id);
/* from dolibarr core
@@ -3497,7 +3592,7 @@ class pdf_octopus extends ModelePDFFactures
/**
* Show last page with a resume of all invoices
* Show last page with a resume of all invoices, proposals and orders
*
* @param TCPDI|TCPDF $pdf Object PDF
* @param Facture $object Object invoice
@@ -3509,7 +3604,8 @@ class pdf_octopus extends ModelePDFFactures
*/
public function resumeLastPage(&$pdf, $object, $deja_regle, $posy, $outputlangs, $outputlangsbis)
{
global $conf, $mysoc, $hookmanager;
global $mysoc;
$default_font_size = pdf_getPDFFontSize($outputlangs);
$sign = 1;
@@ -3550,7 +3646,8 @@ class pdf_octopus extends ModelePDFFactures
$previousinvoices = count($object->tab_previous_situation_invoice) ? $object->tab_previous_situation_invoice : array();
$remain_to_pay = 0;
$remain_to_pay_in_proposals_or_orders = 0;
$remain_to_pay_in_invoice = 0;
// Proposal total
$propals = array();
@@ -3574,34 +3671,39 @@ class pdf_octopus extends ModelePDFFactures
}
}
if (count($propals)) {
$propal = array_pop($propals);
// If invoice was linked to propals or orders
// TODO This part is bugged because the same proposals may be split in different invoices also several proposals may have been merged into the same invoice,
// so a hidden constant is added to show it
if (getDolGlobalString('MAIN_SHOW_INFO_ON_LINKED_ELEMENTS_OF_SITUATION_INVOICE')) {
if (count($propals)) {
$propal = array_pop($propals);
$total_ht = (isModEnabled('multicurrency') && $propal->multicurrency_tx != 1) ? $propal->multicurrency_total_ht : $propal->total_ht;
$remain_to_pay = $total_ht;
$total_ht = (isModEnabled('multicurrency') && $propal->multicurrency_tx != 1) ? $propal->multicurrency_total_ht : $propal->total_ht;
$remain_to_pay_in_proposals_or_orders = $total_ht;
$pdf->SetTextColor(0, 0, 60);
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->SetTextColor(0, 0, 60);
$pdf->SetFont('', '', $default_font_size - 1);
$label = $outputlangs->transnoentities("SituationInvoiceTotalProposal");
$pdf->MultiCell($this->page_largeur - ($this->marge_droite + $this->marge_gauche), 3, $label, 0, 'L', false, 1, $posx, $posy + 1);
$label = $outputlangs->transnoentities("SituationInvoiceTotalProposal");
$pdf->MultiCell($this->page_largeur - ($this->marge_droite + $this->marge_gauche), 3, $label, 0, 'L', false, 1, $posx, $posy + 1);
$amount = price($sign * ($total_ht + (! empty($propal->remise) ? $propal->remise : 0)));
$pdf->MultiCell($width2, 3, $amount, 0, 'R', false, 1, $posx + $width, $posy + 1);
$amount = price($sign * ($total_ht + (! empty($propal->remise) ? $propal->remise : 0)));
$pdf->MultiCell($width2, 3, $amount, 0, 'R', false, 1, $posx + $width, $posy + 1);
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->SetFont('', '', $default_font_size - 1);
// Output Rect
$pdf->SetDrawColor(128, 128, 128);
//$this->printRect($pdf, $posx, $posy, $this->page_largeur - $this->marge_gauche - $this->marge_droite, 6); // Rect prend une longueur en 3eme param et 4eme param
$this->printRoundedRect($pdf, $posx, $posy, $this->page_largeur - $this->marge_gauche - $this->marge_droite, 6, $this->corner_radius, 0, 0, 'D'); // Rect takes a length in 3rd parameter and 4th parameter
// Output Rect
$pdf->SetDrawColor(128, 128, 128);
//$this->printRect($pdf, $posx, $posy, $this->page_largeur - $this->marge_gauche - $this->marge_droite, 6); // Rect prend une longueur en 3eme param et 4eme param
$this->printRoundedRect($pdf, $posx, $posy, $this->page_largeur - $this->marge_gauche - $this->marge_droite, 6, $this->corner_radius, 0, 0, 'D'); // Rect takes a length in 3rd parameter and 4th parameter
$posy += 4;
} elseif (count($orders)) {
$order = array_pop($orders);
$posy += 4;
} elseif (count($orders)) {
$order = array_pop($orders);
$total_ht = (isModEnabled('multicurrency') && $order->multicurrency_tx != 1 ? $order->multicurrency_total_ht : $order->total_ht);
$remain_to_pay = $total_ht;
$total_ht = (isModEnabled('multicurrency') && $order->multicurrency_tx != 1 ? $order->multicurrency_total_ht : $order->total_ht);
$remain_to_pay_in_proposals_or_orders = $total_ht;
}
}
$useborder = 0;
@@ -3896,7 +3998,7 @@ class pdf_octopus extends ModelePDFFactures
$posy = $this->tab_top_newpage + 1;
} else {
$idinv++;
$remain_to_pay -= ($sign * ($total_ht + (!empty($invoice->remise) ? $invoice->remise : 0)));
$remain_to_pay_in_invoice = ($sign * $total_ht);
$rem = 0;
if (count($invoice->lines)) {
@@ -3905,37 +4007,44 @@ class pdf_octopus extends ModelePDFFactures
$discount = new DiscountAbsolute($this->db);
$result = $discount->fetch($l->fk_remise_except);
if ($result > 0) {
$rem += $discount->amount_ht;
$rem += $discount->total_ht;
}
}
}
}
$remain_to_pay -= $rem;
$remain_to_pay_in_invoice -= $rem;
$pdf->commitTransaction();
}
}
if ($force_to_zero) {
$remain_to_pay = 0;
$remain_to_pay_in_invoice = 0;
}
$posy += 10;
$pdf->setPageOrientation('', true, 0); // The only function to edit the bottom margin of current page to set it.
$pdf->SetTextColor(0, 0, 60);
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->SetXY($this->marge_gauche, $posy + 1);
$label = $outputlangs->transnoentities("SituationTotalRayToRest");
$pdf->MultiCell($this->page_largeur - ($this->marge_droite + $this->marge_gauche), 3, $label, 0, 'L', false);
// If invoice was linked to propals or orders
// TODO This part is bugged because the same proposals may be split in different invoices also several proposals may have been merged into the same invoice,
// so a hidden constant is added to show it
if (getDolGlobalString('MAIN_SHOW_INFO_ON_LINKED_ELEMENTS_OF_SITUATION_INVOICE')) {
if (count($propals) || count($orders)) {
$pdf->SetTextColor(0, 0, 60);
$pdf->SetFont('', '', $default_font_size - 1);
$pdf->SetXY($this->marge_gauche, $posy + 1);
$label = $outputlangs->transnoentities("SituationTotalRayToRest");
$pdf->MultiCell($this->page_largeur - ($this->marge_droite + $this->marge_gauche), 3, $label, 0, 'L', false);
$amount = price($remain_to_pay);
$pdf->MultiCell($width2, 3, $amount, 0, 'R', false, 1, $posx + $width, $posy + 1);
$amount = price($remain_to_pay_in_proposals_or_orders);
$pdf->MultiCell($width2, 3, $amount, 0, 'R', false, 1, $posx + $width, $posy + 1);
$pdf->SetDrawColor(128, 128, 128);
//$this->printRect($pdf, $this->marge_gauche, $posy, $this->page_largeur - $this->marge_gauche - $this->marge_droite, 7);
$this->printRoundedRect($pdf, $this->marge_gauche, $posy, $this->page_largeur - $this->marge_gauche - $this->marge_droite, 7, $this->corner_radius, 0, 0, 'D');
$pdf->SetDrawColor(128, 128, 128);
//$this->printRect($pdf, $this->marge_gauche, $posy, $this->page_largeur - $this->marge_gauche - $this->marge_droite, 7);
$this->printRoundedRect($pdf, $this->marge_gauche, $posy, $this->page_largeur - $this->marge_gauche - $this->marge_droite, 7, $this->corner_radius, 0, 0, 'D');
}
}
}
}

View File

@@ -79,7 +79,7 @@ class pdf_sponge extends ModelePDFFactures
public $version = 'dolibarr';
/**
* @var int heightforinfotot
* @var int height for info total
*/
public $heightforinfotot;
@@ -99,7 +99,7 @@ class pdf_sponge extends ModelePDFFactures
public $tab_top;
/**
* @var float tab_top_newpage
* @var int|float tab_top_newpage
*/
public $tab_top_newpage;
@@ -203,7 +203,7 @@ class pdf_sponge extends ModelePDFFactures
public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0)
{
// phpcs:enable
global $user, $langs, $conf, $mysoc, $db, $hookmanager, $nblines;
global $user, $langs, $conf, $mysoc, $hookmanager, $nblines;
dol_syslog("write_file outputlangs->defaultlang=".(is_object($outputlangs) ? $outputlangs->defaultlang : 'null'));
@@ -339,8 +339,12 @@ class pdf_sponge extends ModelePDFFactures
$default_font_size = pdf_getPDFFontSize($outputlangs); // Must be after pdf_getInstance
$pdf->setAutoPageBreak(true, 0);
$this->heightforinfotot = 50 + (4 * $nbpayments); // Height reserved to output the info and total part and payment part
$this->heightforfreetext = getDolGlobalInt('MAIN_PDF_FREETEXT_HEIGHT', 5); // Height reserved to output the free text on last page
// Compute height for total, free text and footer
$this->heightforinfotot = 50; // Height reserved to output the info and total part and payment part
if (!getDolGlobalString('INVOICE_NO_PAYMENT_DETAILS') && $nbpayments > 0) {
$this->heightforinfotot += (4 * $nbpayments);
}
$this->heightforfreetext = getDolGlobalInt('MAIN_PDF_FREETEXT_HEIGHT', 5); // Height reserved to output the free text on last page
$this->heightforfooter = $this->marge_basse + (!getDolGlobalString('MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS') ? 12 : 22); // Height reserved to output the footer (value include bottom margin)
$heightforqrinvoice = 0;
@@ -1316,7 +1320,7 @@ class pdf_sponge extends ModelePDFFactures
*/
protected function drawInfoTable(&$pdf, $object, $posy, $outputlangs, $outputlangsbis)
{
global $conf, $mysoc, $hookmanager;
global $mysoc;
$default_font_size = pdf_getPDFFontSize($outputlangs);
@@ -1894,7 +1898,7 @@ class pdf_sponge extends ModelePDFFactures
}
}
if ($total_discount_on_lines > 0) {
if ($total_discount_on_lines > 0 && !$object->isSituationInvoice()) {
// Show total NET before discount
$pdf->SetFillColor(255, 255, 255);
$pdf->SetXY($col1x, $tab2_top);
@@ -2474,6 +2478,7 @@ class pdf_sponge extends ModelePDFFactures
$pdf->SetFont('', 'B', $default_font_size + 3);
$pdf->SetXY($posx, $posy);
$pdf->SetTextColor(0, 0, 60);
$subtitle = "";
$title = $outputlangs->transnoentities("PdfInvoiceTitle");
if ($object->type == 1) {
$title = $outputlangs->transnoentities("InvoiceReplacement");
@@ -2490,6 +2495,7 @@ class pdf_sponge extends ModelePDFFactures
if ($this->situationinvoice) {
$outputlangs->loadLangs(array("other"));
$title = $outputlangs->transnoentities("PDFInvoiceSituation") . " " . $outputlangs->transnoentities("NumberingShort") . $object->situation_counter . " -";
$subtitle = $outputlangs->transnoentities("PDFSituationTitle", (string) $object->situation_counter);
}
if (getDolGlobalString('PDF_USE_ALSO_LANGUAGE_CODE') && is_object($outputlangsbis)) {
$title .= ' - ';
@@ -2515,6 +2521,12 @@ class pdf_sponge extends ModelePDFFactures
}
$pdf->MultiCell($w, 3, $title, '', 'R');
if (!empty($subtitle)) {
$pdf->SetFont('', 'B', $default_font_size);
$pdf->SetXY($posx, $posy + 5);
$pdf->MultiCell($w, 6, $subtitle, '', 'R');
$posy += 2;
}
$pdf->SetFont('', 'B', $default_font_size);
@@ -2767,7 +2779,7 @@ class pdf_sponge extends ModelePDFFactures
$idaddressshipping = $object->getIdContact('external', 'SHIPPING');
if (!empty($idaddressshipping)) {
$contactshipping = $object->fetch_Contact($idaddressshipping[0]);
$object->fetch_contact($idaddressshipping[0]); // Load $object->contact
$companystatic = new Societe($this->db);
$companystatic->fetch($object->contact->fk_soc);
$carac_client_name_shipping = pdfBuildThirdpartyName($object->contact, $outputlangs);