bebeboutik/classes/PDF.php
Christophe LATOUR 039ec2b225 fix 500 :
[Thu Nov 16 14:44:30.387531 2017] [:error] [pid 1123] [client 82.229.2.146:56843] exception 'ErrorException' with message 'Undefined offset: 1' in /home/www/bebeboutik.com/www/classes/PDF.php:552
2017-11-16 16:55:03 +01:00

1553 lines
64 KiB
PHP
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* 2007-2011 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2011 PrestaShop SA
* @version Release: $Revision: 10339 $
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
include_once(_PS_FPDF_PATH_.'fpdf.php');
class PDF_PageGroupCore extends FPDF
{
var $NewPageGroup; // variable indicating whether a new group was requested
var $PageGroups; // variable containing the number of pages of the groups
var $CurrPageGroup; // variable containing the alias of the current page group
// create a new page group; call this before calling AddPage()
function StartPageGroup()
{
$this->NewPageGroup=true;
}
// current page in the group
function GroupPageNo()
{
return $this->PageGroups[$this->CurrPageGroup];
}
// alias of the current page group -- will be replaced by the total number of pages in this group
function PageGroupAlias()
{
return $this->CurrPageGroup;
}
function _beginpage($orientation, $arg2)
{
parent::_beginpage($orientation, $arg2);
if ($this->NewPageGroup)
{
// start a new group
$n = sizeof($this->PageGroups)+1;
$alias = "{nb$n}";
$this->PageGroups[$alias] = 1;
$this->CurrPageGroup = $alias;
$this->NewPageGroup=false;
}
elseif ($this->CurrPageGroup)
$this->PageGroups[$this->CurrPageGroup]++;
}
function _putpages()
{
$nb = $this->page;
if (!empty($this->PageGroups))
{
// do page number replacement
foreach ($this->PageGroups as $k => $v)
for ($n = 1; $n <= $nb; $n++)
$this->pages[$n]=str_replace($k, $v, $this->pages[$n]);
}
parent::_putpages();
}
}
class PDFCore extends PDF_PageGroupCore
{
protected static $order = NULL;
protected static $orderReturn = NULL;
protected static $orderSlip = NULL;
protected static $delivery = NULL;
protected static $_priceDisplayMethod;
/** @var object Order currency object */
protected static $currency = NULL;
protected static $_iso;
/** @var array Special PDF params such encoding and font */
protected static $_pdfparams = array();
protected static $_fpdf_core_fonts = array('courier', 'helvetica', 'helveticab', 'helveticabi', 'helveticai', 'symbol', 'times', 'timesb', 'timesbi', 'timesi', 'zapfdingbats');
/**
* Constructor
*/
public function __construct($orientation = 'P', $unit = 'mm', $format = 'A4')
{
global $cookie;
if (!isset($cookie) OR !is_object($cookie))
$cookie->id_lang = (int)(Configuration::get('PS_LANG_DEFAULT'));
self::$_iso = strtoupper(Language::getIsoById($cookie->id_lang));
FPDF::FPDF($orientation, $unit, $format);
$this->_initPDFFonts();
}
protected function _initPDFFonts()
{
if (!$languages = Language::getLanguages())
die(Tools::displayError());
foreach ($languages AS $language)
{
$isoCode = strtoupper($language['iso_code']);
$conf = Configuration::getMultiple(array('PS_PDF_ENCODING_'.$isoCode, 'PS_PDF_FONT_'.$isoCode));
self::$_pdfparams[$isoCode] = array(
'encoding' => (isset($conf['PS_PDF_ENCODING_'.$isoCode]) AND $conf['PS_PDF_ENCODING_'.$isoCode] == true) ? $conf['PS_PDF_ENCODING_'.$isoCode] : 'iso-8859-1',
'font' => (isset($conf['PS_PDF_FONT_'.$isoCode]) AND $conf['PS_PDF_FONT_'.$isoCode] == true) ? $conf['PS_PDF_FONT_'.$isoCode] : 'helvetica'
);
}
if ($font = self::embedfont())
{
$this->AddFont($font);
$this->AddFont($font, 'B');
}
/* If the user is using a ISO code no present in the languages, use the first language available instead */
if (!isset(self::$_pdfparams[self::$_iso]) && isset($languages[0]['iso_code']))
self::$_iso = strtoupper($languages[0]['iso_code']);
}
/**
* Invoice header
*/
public function Header()
{
global $cookie;
$conf = Configuration::getMultiple(array('PS_SHOP_NAME', 'PS_SHOP_ADDR1', 'PS_SHOP_CODE', 'PS_SHOP_CITY', 'PS_SHOP_COUNTRY', 'PS_SHOP_STATE'));
$conf['PS_SHOP_NAME'] = isset($conf['PS_SHOP_NAME']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_NAME']) : 'Your company';
$conf['PS_SHOP_ADDR1'] = isset($conf['PS_SHOP_ADDR1']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_ADDR1']) : 'Your company';
$conf['PS_SHOP_CODE'] = isset($conf['PS_SHOP_CODE']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_CODE']) : 'Postcode';
$conf['PS_SHOP_CITY'] = isset($conf['PS_SHOP_CITY']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_CITY']) : 'City';
$conf['PS_SHOP_COUNTRY'] = isset($conf['PS_SHOP_COUNTRY']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_COUNTRY']) : 'Country';
$conf['PS_SHOP_STATE'] = isset($conf['PS_SHOP_STATE']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_STATE']) : '';
if (file_exists(_PS_IMG_DIR_.'/logo_invoice_'.(int) $cookie->id_lang.'.jpg'))
{
if ($this->_isPngFile(_PS_IMG_DIR_.'/logo_invoice_'.(int) $cookie->id_lang.'.jpg'))
$this->Image(_PS_IMG_DIR_.'/logo_invoice_'.(int) $cookie->id_lang.'.jpg', 10, 8, 0, 15, 'PNG');
else
$this->Image(_PS_IMG_DIR_.'/logo_invoice_'.(int) $cookie->id_lang.'.jpg', 10, 8, 0, 15);
}
elseif (file_exists(_PS_IMG_DIR_.'/logo.jpg'))
{
if ($this->_isPngFile(_PS_IMG_DIR_.'/logo.jpg'))
$this->Image(_PS_IMG_DIR_.'/logo.jpg', 10, 8, 0, 15, 'PNG');
else
$this->Image(_PS_IMG_DIR_.'/logo.jpg', 10, 8, 0, 15);
}
$this->SetFont(self::fontname(), 'B', 15);
$this->Cell(115);
if (self::$orderReturn)
$this->Cell(77, 10, self::l('RETURN #').' '.sprintf('%06d', self::$orderReturn->id), 0, 1, 'R');
elseif (self::$orderSlip)
$this->Cell(77, 10, self::l('SLIP #').' '.sprintf('%06d', self::$orderSlip->id), 0, 1, 'R');
elseif (self::$delivery)
$this->Cell(77, 10, self::l('DELIVERY SLIP #').' '.Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_DELIVERY_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$delivery), 0, 1, 'R');
elseif (self::$order->invoice_number)
$this->Cell(77, 10, self::l('INVOICE #').' '.Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_INVOICE_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$order->invoice_number), 0, 1, 'R');
else
$this->Cell(77, 10, self::l('ORDER #').' '.sprintf('%06d', self::$order->id), 0, 1, 'R');
}
/*
* Detect if the file header match a PNG file
*
* @param string $file Filename to check (include full path)
* @return boolean True if the file is a PNG file
*/
private function _isPngFile($file)
{
$pngReferenceHeader = array(137, 80, 78, 71, 13, 10, 26, 10);
$fp = fopen($file, 'r');
if ($fp)
{
for ($n = 0; $n < 8; $n++)
if (ord(fread($fp, 1)) !== $pngReferenceHeader[$n])
{
fclose($fp);
return false;
}
}
else
return false;
return true;
}
/*
* Return the complete Address format
*/
private function _getCompleteUSAddressFormat($conf)
{
$shopCity = (isset($conf['PS_SHOP_CITY']) && !empty($conf['PS_SHOP_CITY'])) ? $conf['PS_SHOP_CITY'] : '';
$shopState = ((isset($conf['PS_SHOP_STATE']) && !empty($conf['PS_SHOP_STATE'])) ? $conf['PS_SHOP_STATE'] : '');
$shopZipcode = (isset($conf['PS_SHOP_CODE']) && !empty($conf['PS_SHOP_CODE'])) ? $conf['PS_SHOP_CODE'] : '';
// Build the complete address with good separators
$completeAddressShop = $shopCity.
((!empty($shopState) && !empty($shopCity)) ? ', '.$shopState.((!empty($shopZipcode)) ? ' ' : '') :
((!empty($shopState)) ? $shopState. ((!empty($shopZipcode)) ? ' ' : '') :
((!empty($shopCity) && !empty($shopZipcode)) ? ' ' : ''))).
$shopZipcode;
// Clean the string
return ($completeAddressShop = trim($completeAddressShop, ' '));
}
/*
* Build the the detailed footer of the merchant
*/
private function _builMerchantFooterDetail($conf)
{
$footerText;
// If the country is USA
if (Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT')) == 'US')
{
$completeAddressShop = $this->_getCompleteUSAddressFormat($conf);
$footerText = self::l('Headquarters:')."\n".
$conf['PS_SHOP_NAME_UPPER']."\n".
(isset($conf['PS_SHOP_ADDR1']) && !empty($conf['PS_SHOP_ADDR1']) ? $conf['PS_SHOP_ADDR1']."\n" : '').
(isset($conf['PS_SHOP_ADDR2']) && !empty($conf['PS_SHOP_ADDR2']) ? $conf['PS_SHOP_ADDR2']."\n" : '').
(!empty($completeAddressShop) ? $completeAddressShop."\n" : '').
(isset($conf['PS_SHOP_COUNTRY']) && !empty($conf['PS_SHOP_COUNTRY']) ? $conf['PS_SHOP_COUNTRY']."\n" : '').
((isset($conf['PS_SHOP_PHONE']) && !empty($conf['PS_SHOP_PHONE'])) ? self::l('PHONE:').' '.$conf['PS_SHOP_PHONE'] : '');
}
else
{
$footerText = $conf['PS_SHOP_NAME_UPPER'].(!empty($conf['PS_SHOP_ADDR1']) ? ' - '.self::l('Headquarters:').' '.$conf['PS_SHOP_ADDR1'].
(!empty($conf['PS_SHOP_ADDR2']) ? ' '.$conf['PS_SHOP_ADDR2'] : '').' '.$conf['PS_SHOP_CODE'].' '.$conf['PS_SHOP_CITY'].
((isset($conf['PS_SHOP_STATE']) AND !empty($conf['PS_SHOP_STATE'])) ? (', '.$conf['PS_SHOP_STATE']) : '').' '.$conf['PS_SHOP_COUNTRY'] : '').
"\n".(!empty($conf['PS_SHOP_DETAILS']) ? self::l('Details:').' '.$conf['PS_SHOP_DETAILS'].' - ' : '').
(!empty($conf['PS_SHOP_PHONE']) ? self::l('PHONE:').' '.$conf['PS_SHOP_PHONE'] : '');
}
return $footerText;
}
/**
* Invoice footer
*/
public function Footer()
{
$arrayConf = array(
'PS_SHOP_NAME',
'PS_SHOP_ADDR1',
'PS_SHOP_ADDR2',
'PS_SHOP_CODE',
'PS_SHOP_CITY',
'PS_SHOP_COUNTRY',
'PS_SHOP_COUNTRY_ID',
'PS_SHOP_DETAILS',
'PS_SHOP_PHONE',
'PS_SHOP_STATE');
$conf = Configuration::getMultiple($arrayConf);
$conf['PS_SHOP_NAME_UPPER'] = Tools::strtoupper($conf['PS_SHOP_NAME']);
$y_delta = array_key_exists('PS_SHOP_DETAILS', $conf) ? substr_count($conf['PS_SHOP_DETAILS'],"\n") : 0;
foreach($conf as $key => $value)
$conf[$key] = Tools::iconv('utf-8', self::encoding(), $value);
foreach ($arrayConf as $key)
if (!isset($conf[$key]))
$conf[$key] = '';
$merchantDetailFooter = $this->_builMerchantFooterDetail($conf);
$totalLineDetailFooter = count(explode("\n", $merchantDetailFooter));
// A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm).
// This is a very common unit in typography; font sizes are expressed in that unit.
// 8 point = 2.8mm and the cell height = 4mm
$this->SetY(-(21.0 + (4 * $totalLineDetailFooter)) - ($y_delta * 7.0));
$this->SetFont(self::fontname(), '', 7);
$this->Cell(190, 5, ' '."\n".Tools::iconv('utf-8', self::encoding(), 'P. ').$this->GroupPageNo().' / '.$this->PageGroupAlias(), 'T', 1, 'R');
global $cookie;
if (Configuration::get('PS_INVOICE_FREE_TEXT', $cookie->id_lang))
{
$this->Cell(0, 10, utf8_decode(Configuration::get('PS_INVOICE_FREE_TEXT', $cookie->id_lang)), 0, 0, 'C', 0);
$this->Ln(4);
}
/*
* Display a message for customer
*/
if (!self::$delivery)
{
$this->SetFont(self::fontname(), '', 8);
if (self::$orderSlip)
$textFooter = self::l('An electronic version of this invoice is available in your account. To access it, log in to the');
else
$textFooter = self::l('An electronic version of this invoice is available in your account. To access it, log in to the');
$this->Cell(0, 10, $textFooter, 0, 0, 'C', 0, (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].__PS_BASE_URI__.'history.php');
$this->Ln(4);
$this->Cell(0, 10, Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_SHOP_NAME')).' '.self::l('website using your e-mail address and password (which you created when placing your first order).'), 0, 0, 'C', 0, (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].__PS_BASE_URI__.'history.php');
}
else
$this->Ln(4);
$this->Ln(9);
$this->SetFillColor(240, 240, 240);
$this->SetTextColor(0, 0, 0);
$this->SetFont(self::fontname(), '', 8);
$this->MultiCell(0.0, 4.0, $merchantDetailFooter, 0, 'C', 1);
}
public static function multipleInvoices($invoices, $multi = false, $tri = false, $expe48 = false, $gift = false)
{
$pdf = new PDF('P', 'mm', 'A4');
foreach ($invoices AS $id_order)
{
$orderObj = new Order((int)$id_order);
if (Validate::isLoadedObject($orderObj))
PDF::invoice($orderObj, 'D', true, $pdf, false, false, $multi, $tri, $expe48, $gift);
}
return $pdf->Output('invoices.pdf', 'D');
}
public static function multipleInvoices2($invoices_single, $invoices_multi, $tri = false, $expe48 = false)
{
$pdf = new PDF('P', 'mm', 'A4');
// invoice for single sale orders
foreach ($invoices_single AS $id_order)
{
$orderObj = new Order((int)$id_order);
if (Validate::isLoadedObject($orderObj))
PDF::invoice($orderObj, 'D', true, $pdf, false, false, false, $tri, $expe48);
}
// invoice for multi sale orders
foreach ($invoices_multi AS $id_order)
{
$orderObj = new Order((int)$id_order);
if (Validate::isLoadedObject($orderObj))
PDF::invoice($orderObj, 'D', true, $pdf, false, false, true, $tri, $expe48);
}
return $pdf->Output('invoices.pdf', 'D');
}
public static function multipleOrderSlips($orderSlips)
{
$pdf = new PDF('P', 'mm', 'A4');
foreach ($orderSlips AS $id_order_slip)
{
$orderSlip = new OrderSlip((int)$id_order_slip);
$order = new Order((int)$orderSlip->id_order);
$order->products = OrderSlip::getOrdersSlipProducts($orderSlip->id, $order);
if (Validate::isLoadedObject($orderSlip) AND Validate::isLoadedObject($order))
PDF::invoice($order, 'D', true, $pdf, $orderSlip);
}
return $pdf->Output('order_slips.pdf', 'D');
}
public static function multipleDelivery($slips)
{
$pdf = new PDF('P', 'mm', 'A4');
foreach ($slips AS $id_order)
{
$orderObj = new Order((int)$id_order);
if (Validate::isLoadedObject($orderObj))
PDF::invoice($orderObj, 'D', true, $pdf, false, $orderObj->delivery_number);
}
return $pdf->Output('invoices.pdf', 'D');
}
public static function orderReturn($orderReturn, $mode = 'D', $multiple = false, &$pdf = NULL)
{
$pdf = new PDF('P', 'mm', 'A4');
self::$orderReturn = $orderReturn;
$order = new Order($orderReturn->id_order);
self::$order = $order;
$pdf->SetAutoPageBreak(true, 35);
$pdf->StartPageGroup();
$pdf->AliasNbPages();
$pdf->AddPage();
/* Display address information */
$arrayConf = array('PS_SHOP_NAME', 'PS_SHOP_ADDR1', 'PS_SHOP_ADDR2', 'PS_SHOP_CODE', 'PS_SHOP_CITY', 'PS_SHOP_COUNTRY', 'PS_SHOP_DETAILS', 'PS_SHOP_PHONE', 'PS_SHOP_STATE');
$conf = Configuration::getMultiple($arrayConf);
foreach ($conf as $key => $value)
$conf[$key] = Tools::iconv('utf-8', self::encoding(), $value);
foreach ($arrayConf as $key)
if (!isset($conf[$key]))
$conf[$key] = '';
$width = 100;
$pdf->SetX(10);
$pdf->SetY(25);
$pdf->SetFont(self::fontname(), '', 9);
$addressType = array(
'invoice' => array(),
'delivery' => array());
$patternRules = array(
'avoid' => array(
'address2',
'company',
'phone',
'phone_mobile'));
$addressType = self::generateHeaderAddresses($pdf, $order, $addressType, $patternRules, $width);
/*
* display order information
*/
$pdf->Ln(12);
$pdf->SetFillColor(240, 240, 240);
$pdf->SetTextColor(0, 0, 0);
$pdf->SetFont(self::fontname(), '', 9);
$pdf->Cell(0, 6, self::l('RETURN #').sprintf('%06d', self::$orderReturn->id).' '.self::l('from') . ' ' .Tools::displayDate(self::$orderReturn->date_upd, self::$order->id_lang), 1, 2, 'L');
$pdf->Cell(0, 6, self::l('We have logged your return request.'), 'TRL', 2, 'L');
$pdf->Cell(0, 6, self::l('Your package must be returned to us within').' '.Configuration::get('PS_ORDER_RETURN_NB_DAYS').' '.self::l('days of receiving your order.'), 'BRL', 2, 'L');
$pdf->Ln(5);
$pdf->Cell(0, 6, self::l('List of items marked as returned :'), 0, 2, 'L');
$pdf->Ln(5);
$pdf->ProdReturnTab();
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), 'B', 10);
$pdf->Cell(0, 6, self::l('Return reference:').' '.self::l('RET').sprintf('%06d', self::$order->id), 0, 2, 'C');
$pdf->Cell(0, 6, self::l('Please include this number on your return package.'), 0, 2, 'C');
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), 'B', 9);
$pdf->Cell(0, 6, self::l('REMINDER:'), 0, 2, 'L');
$pdf->SetFont(self::fontname(), '', 9);
$pdf->Cell(0, 6, self::l('- All products must be returned in their original packaging without damage or wear.'), 0, 2, 'L');
$pdf->Cell(0, 6, self::l('- Please print out this document and slip it into your package.'), 0, 2, 'L');
$pdf->Cell(0, 6, self::l('- The package should be sent to the following address:'), 0, 2, 'L');
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), 'B', 10);
$pdf->Cell(0, 5, Tools::strtoupper($conf['PS_SHOP_NAME']), 0, 1, 'C', 1);
$pdf->Cell(0, 5, (!empty($conf['PS_SHOP_ADDR1']) ? self::l('Headquarters:').' '.$conf['PS_SHOP_ADDR1'].(!empty($conf['PS_SHOP_ADDR2']) ? ' '.$conf['PS_SHOP_ADDR2'] : '').' '.$conf['PS_SHOP_CODE'].' '.$conf['PS_SHOP_CITY'].' '.$conf['PS_SHOP_COUNTRY'].((isset($conf['PS_SHOP_STATE']) AND !empty($conf['PS_SHOP_STATE'])) ? (', '.$conf['PS_SHOP_STATE']) : '') : ''), 0, 1, 'C', 1);
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), '', 9);
$pdf->Cell(0, 6, self::l('Upon receiving your package, we will notify you by e-mail. We will then begin processing the reimbursement of your order total.'), 0, 2, 'L');
$pdf->Cell(0, 6, self::l('Let us know if you have any questions.'), 0, 2, 'L');
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), 'B', 10);
$pdf->Cell(0, 6, self::l('If the conditions of return listed above are not respected,'), 'TRL', 2, 'C');
$pdf->Cell(0, 6, self::l('we reserve the right to refuse your package and/or reimbursement.'), 'BRL', 2, 'C');
return $pdf->Output(sprintf('%06d', self::$order->id).'.pdf', $mode);
}
/**
* Product table with references, quantities...
*/
public function ProdReturnTab()
{
$header = array(
array(self::l('Description'), 'L'),
array(self::l('Reference'), 'L'),
array(self::l('Qty'), 'C')
);
$w = array(110, 25, 20);
$this->SetFont(self::fontname(), 'B', 8);
$this->SetFillColor(240, 240, 240);
for ($i = 0; $i < sizeof($header); $i++)
$this->Cell($w[$i], 5, $header[$i][0], 'T', 0, $header[$i][1], 1);
$this->Ln();
$this->SetFont(self::fontname(), '', 7);
$products = OrderReturn::getOrdersReturnProducts(self::$orderReturn->id, self::$order);
foreach ($products AS $product)
{
$before = $this->GetY();
$this->MultiCell($w[0], 5, Tools::iconv('utf-8', self::encoding(), $product['product_name']), 'B');
$lineSize = $this->GetY() - $before;
$this->SetXY($this->GetX() + $w[0], $this->GetY() - $lineSize);
$this->Cell($w[1], $lineSize, ($product['product_reference'] != '' ? Tools::iconv('utf-8', self::encoding(), $product['product_reference']) : '---'), 'B');
$this->Cell($w[2], $lineSize, $product['product_quantity'], 'B', 0, 'C');
$this->Ln();
}
}
/*
* Generate the header addresses for pdf File
*/
public static function generateHeaderAddresses(&$pdf, $order, $addressType, $patternRules, $width)
{
$maxY = 0;
$pdf->setY($pdf->GetY() + 5);
foreach(array_keys($addressType) as $type)
{
$currentY = $pdf->GetY();
$attributeName = 'id_address_'.$type;
$addressType[$type]['displayed'] = '';
$addressType[$type]['addressObject'] = new Address((int)($order->$attributeName));
$addressType[$type]['addressFields'] = AddressFormat::getOrderedAddressFields($addressType[$type]['addressObject']->id_country);
$addressType[$type]['addressFormatedValues'] = AddressFormat::getFormattedAddressFieldsValues(
$addressType[$type]['addressObject'],
$addressType[$type]['addressFields']);
if($type == 'delivery') {
if((strpos(Db::getInstance()->getValue('
SELECT `name`
FROM `'._DB_PREFIX_.'carrier`
WHERE `id_carrier` = '.(int)$order->id_carrier
),'Mondial Relay') !== false) && ($mr_point = Db::getInstance()->getRow('
SELECT mr.*, c.`firstname`, c.`lastname`
FROM `'._DB_PREFIX_.'mr_selected` mr
LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = mr.`id_customer`)
WHERE mr.`id_cart` = '.(int)$order->id_cart.'
AND mr.`id_order` = '.(int)$order->id.'
'))) {
$address_lines = array();
if (!empty($mr_point['MR_Selected_LgAdr2'])){
$address_lines[] = $mr_point['MR_Selected_LgAdr2'].'';
}
if (!empty($mr_point['MR_Selected_LgAdr3'])){
$address_lines[] = $mr_point['MR_Selected_LgAdr3'].'';
}
if (!empty($mr_point['MR_Selected_LgAdr4'])){
$address_lines[] = $mr_point['MR_Selected_LgAdr4'].'';
}
$addressType[$type]['addressFormatedValues'] = array(
'firstname' => $mr_point['firstname'],
'lastname' => $mr_point['lastname'],
'company' => trim($mr_point['MR_Selected_LgAdr1']),
'vat_number' => '',
'address1' => trim($address_lines[0]),
'address2' => isset($address_lines[1]) ? trim($address_lines[1]) : '',
'postcode' => trim($mr_point['MR_Selected_CP']),
'city' => trim($mr_point['MR_Selected_Ville']),
'Country:name' => trim($mr_point['MR_Selected_Pays']),
'phone' => '',
'phone_mobile' => '',
);
}
}
foreach ($addressType[$type]['addressFields'] as $line)
if (($patternsList = explode(' ', $line)))
{
$tmp = '';
foreach($patternsList as $pattern)
if (!in_array($pattern, $patternRules['avoid']))
{
if ($pattern == 'State:name' &&
Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT')) == 'US')
{
$state_name = &$addressType[$type]['addressFormatedValues'][$pattern];
$state = new State((int)State::getIdByName($state_name));
if (Validate::isLoadedObject($state))
$state_name = $state->iso_code;
else
$state_name = strtoupper(substr($state_name, 0, 2));
}
$tmp .= ((isset($addressType[$type]['addressFormatedValues'][$pattern]) &&
!empty($addressType[$type]['addressFormatedValues'][$pattern])) ?
(Tools::iconv('utf-8', self::encoding(), $addressType[$type]['addressFormatedValues'][$pattern]).' ') : '');
}
$tmp = trim($tmp);
$addressType[$type]['displayed'] .= (!empty($tmp)) ? $tmp."\n" : '';
}
$pdf->MultiCell($width, 6.0, $addressType[$type]['displayed'], 0, 'L', 0);
if ($pdf->GetY() > $maxY)
$maxY = $pdf->GetY();
$pdf->SetY($currentY);
$pdf->SetX($width + 10);
}
$pdf->SetY($maxY);
if ($maxY)
$pdf->Ln(5);
return $addressType;
}
/**
* Main
*
* @param object $order Order
* @param string $mode Download or display (optional)
*/
public static function invoice($order, $mode = 'D', $multiple = false, &$pdf = NULL, $slip = false, $delivery = false, $multi = false, $tri = false, $expe48 = false, $gift = false)
{
global $cookie;
if (!Validate::isLoadedObject($order) OR (!$cookie->id_employee AND (!OrderState::invoiceAvailable($order->getCurrentState()) AND !$order->invoice_number)))
die('Invalid order or invalid order state');
/* @Override Antadis */
if($gift && $order->gift == 1) {
self::invoiceWithoutPrice($order, $mode = 'D', $multiple, $pdf, $slip, $delivery, $multi, $tri, $expe48);
} else {
self::$order = $order;
self::$orderSlip = $slip;
self::$delivery = $delivery;
self::$_iso = strtoupper(Language::getIsoById((int)(self::$order->id_lang)));
if ((self::$_priceDisplayMethod = $order->getTaxCalculationMethod()) === false)
die(self::l('No price display method defined for the customer group'));
if (!$multiple)
$pdf = new PDF('P', 'mm', 'A4');
$pdf->SetAutoPageBreak(true, 35);
$pdf->StartPageGroup();
self::$currency = Currency::getCurrencyInstance((int)(self::$order->id_currency));
$pdf->AliasNbPages();
$pdf->AddPage();
$width = 100;
$pdf->SetX(10);
$pdf->SetY(25);
$pdf->SetFont(self::fontname(), '', 12);
$pdf->Cell($width, 10, self::l('Delivery'), 0, 'L');
$pdf->Cell($width, 10, self::l('Invoicing'), 0, 'L');
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), '', 9);
$addressType = array(
'delivery' => array(),
'invoice' => array(),
);
$patternRules = array(
'optional' => array(
'address2',
'company'),
'avoid' => array(
'State:iso_code'));
$addressType = self::generateHeaderAddresses($pdf, $order, $addressType, $patternRules, $width);
if (Configuration::get('VATNUMBER_MANAGEMENT') AND !empty($addressType['invoice']['addressObject']->vat_number))
{
$vat_delivery = '';
if ($addressType['invoice']['addressObject']->id != $addressType['delivery']['addressObject']->id)
$vat_delivery = $addressType['delivery']['addressObject']->vat_number;
$pdf->Cell($width, 10, Tools::iconv('utf-8', self::encoding(), $vat_delivery), 0, 'L');
$pdf->Cell($width, 10, Tools::iconv('utf-8', self::encoding(), $addressType['invoice']['addressObject']->vat_number), 0, 'L');
$pdf->Ln(5);
}
if ($addressType['invoice']['addressObject']->dni != NULL)
$pdf->Cell($width, 10,
self::l('Tax ID number:').' '.Tools::iconv('utf-8', self::encoding(),
$addressType['invoice']['addressObject']->dni), 0, 'L');
/*
* display order information
*/
$carrier = new Carrier(self::$order->id_carrier);
if ($carrier->name == '0')
$carrier->name = Configuration::get('PS_SHOP_NAME');
$history = self::$order->getHistory(self::$order->id_lang);
foreach($history as $h)
if ($h['id_order_state'] == Configuration::get('PS_OS_SHIPPING'))
$shipping_date = $h['date_add'];
$pdf->Ln(12);
$pdf->SetFillColor(240, 240, 240);
$pdf->SetTextColor(0, 0, 0);
$pdf->SetFont(self::fontname(), '', 9);
if (self::$orderSlip)
$pdf->Cell(0, 6, self::l('SLIP #').' '.sprintf('%06d', self::$orderSlip->id).' '.self::l('from') . ' ' .Tools::displayDate(self::$orderSlip->date_upd, self::$order->id_lang), 1, 2, 'L', 1);
elseif (self::$delivery)
$pdf->Cell(0, 6, self::l('DELIVERY SLIP #').Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_DELIVERY_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$delivery).' '.self::l('from') . ' ' .Tools::displayDate(self::$order->delivery_date, self::$order->id_lang), 1, 2, 'L', 1);
elseif ((int)self::$order->invoice_date)
$pdf->Cell(0, 6, self::l('INVOICE #').' '.Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_INVOICE_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$order->invoice_number).' '.self::l('from') . ' ' .Tools::displayDate(self::$order->invoice_date, self::$order->id_lang), 1, 2, 'L', 1);
else
$pdf->Cell(0, 6, self::l('Invoice draft'), 1, 2, 'L', 1);
$pdf->Cell(55, 6, self::l('Order #').' '.sprintf('%06d', self::$order->id), 'L', 0);
$pdf->Cell(70, 6, self::l('Carrier:'), 'L');
$pdf->Cell(0, 6, self::l('Payment method:'), 'LR');
$pdf->Ln(5);
$pdf->Cell(55, 6, (isset($shipping_date) ? self::l('Shipping date:').' '.Tools::displayDate($shipping_date, self::$order->id_lang) : ' '), 'LB', 0);
$pdf->Cell(70, 6, Tools::iconv('utf-8', self::encoding(), $carrier->name), 'LRB');
$pdf->Cell(0, 6, Tools::iconv('utf-8', self::encoding(), $order->payment), 'LRB');
$pdf->Ln(15);
$pdf->ProdTab((self::$delivery ? true : ''), $tri);
/* Canada */
$taxable_address = new Address((int)self::$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')});
if (!self::$delivery && strtoupper(Country::getIsoById((int)$taxable_address->id_country)) == 'CA')
{
$pdf->Ln(15);
$taxToDisplay = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'order_tax WHERE id_order = '.(int)self::$order->id);
foreach ($taxToDisplay AS $t)
{
$pdf->Cell(0, 6, utf8_decode($t['tax_name']).' ('.number_format($t['tax_rate'], 2, '.', '').'%) '.self::convertSign(Tools::displayPrice($t['amount'], self::$currency, true)), 0, 0, 'R');
$pdf->Ln(5);
}
}
/* End */
/* Exit if delivery */
if (!self::$delivery)
{
if (!self::$orderSlip)
$pdf->DiscTab();
$priceBreakDown = array();
$pdf->priceBreakDownCalculation($priceBreakDown);
if (!self::$orderSlip OR (self::$orderSlip AND self::$orderSlip->shipping_cost))
{
$priceBreakDown['totalWithoutTax'] += Tools::ps_round($priceBreakDown['shippingCostWithoutTax'], 2) + Tools::ps_round($priceBreakDown['wrappingCostWithoutTax'], 2);
$priceBreakDown['totalWithTax'] += self::$order->total_shipping + self::$order->total_wrapping;
}
if (!self::$orderSlip)
{
$taxDiscount = self::$order->getTaxesAverageUsed();
if ($taxDiscount != 0)
$priceBreakDown['totalWithoutTax'] -= Tools::ps_round(self::$order->total_discounts / (1 + self::$order->getTaxesAverageUsed() * 0.01), 2);
else
$priceBreakDown['totalWithoutTax'] -= self::$order->total_discounts;
$priceBreakDown['totalWithTax'] -= self::$order->total_discounts;
}
/*
* Display price summation
*/
if (Configuration::get('PS_TAX') OR $order->total_products_wt != $order->total_products)
{
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), 'B', 8);
$width = 165;
$pdf->Cell($width, 0, self::l('Total products (tax excl.)').' : ', 0, 0, 'R');
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalProductsWithoutTax'], self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
$pdf->SetFont(self::fontname(), 'B', 8);
$width = 165;
$pdf->Cell($width, 0, self::l('Total products (tax incl.)').' : ', 0, 0, 'R');
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalProductsWithTax'], self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
}
else
{
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), 'B', 8);
$width = 165;
$pdf->Cell($width, 0, self::l('Total products ').' : ', 0, 0, 'R');
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalProductsWithoutTax'], self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
}
if (!self::$orderSlip AND self::$order->total_discounts != '0.00')
{
$pdf->Cell($width, 0, self::l('Total discounts (tax incl.)').' : ', 0, 0, 'R');
$pdf->Cell(0, 0, (!self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_discounts, self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
}
if (isset(self::$order->total_wrapping) and ((float)(self::$order->total_wrapping) > 0))
{
$pdf->Cell($width, 0, self::l('Total gift-wrapping').' : ', 0, 0, 'R');
if (self::$_priceDisplayMethod == PS_TAX_EXC)
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['wrappingCostWithoutTax'], self::$currency, true)), 0, 0, 'R');
else
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_wrapping, self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
}
if (self::$order->total_shipping != '0.00' AND (!self::$orderSlip OR (self::$orderSlip AND self::$orderSlip->shipping_cost)))
{
$pdf->Cell($width, 0, self::l('Total shipping').' : ', 0, 0, 'R');
if (self::$_priceDisplayMethod == PS_TAX_EXC)
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(Tools::ps_round($priceBreakDown['shippingCostWithoutTax'], 2), self::$currency, true)), 0, 0, 'R');
else
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_shipping, self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
}
if (Configuration::get('PS_TAX') OR $order->total_products_wt != $order->total_products)
{
$pdf->Cell($width, 0, self::l('Total').' '.(self::$_priceDisplayMethod == PS_TAX_EXC ? self::l(' (tax incl.)') : self::l(' (tax excl.)')).' : ', 0, 0, 'R');
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice((self::$_priceDisplayMethod == PS_TAX_EXC ? $priceBreakDown['totalWithTax'] : $priceBreakDown['totalWithoutTax']), self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
$pdf->Cell($width, 0, self::l('Total').' '.(self::$_priceDisplayMethod == PS_TAX_EXC ? self::l(' (tax excl.)') : self::l(' (tax incl.)')).' : ', 0, 0, 'R');
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice((self::$_priceDisplayMethod == PS_TAX_EXC ? $priceBreakDown['totalWithoutTax'] : $priceBreakDown['totalWithTax']), self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
}
else
{
$pdf->Cell($width, 0, self::l('Total').' : ', 0, 0, 'R');
$pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(($priceBreakDown['totalWithoutTax']), self::$currency, true)), 0, 0, 'R');
$pdf->Ln(4);
}
$pdf->TaxTab($priceBreakDown);
if($multi) {
$pdf->Ln(15);
$pdf->SetFont(self::fontname(), 'B', 10);
$pdf->Cell(190, 0, Tools::iconv('utf-8', self::encoding(), 'Commande expédiée partiellement') , 0, 0, 'C');
}
if ($expe48) {
$pdf->Ln(15);
$pdf->SetFont(self::fontname(), '', 7);
$pdf->Cell(190, 0, Tools::iconv('utf-8', self::encoding(), 'Produit expédié sous 48h, si la commande comprend dautres articles, ceux-ci arriveront dans les délais indiqués lors de lachat') , 0, 0, 'L');
}
}
Hook::PDFInvoice($pdf, self::$order->id);
if (!$multiple)
return $pdf->Output(sprintf('%06d', self::$order->id).'.pdf', $mode);
}
}
/**
* @Add Antadis
* invoiceWithoutPrice
*
* @param object $order Order
* @param string $mode Download or display (optional)
*/
public static function invoiceWithoutPrice($order, $mode = 'D', $multiple = false, &$pdf = NULL, $slip = false, $delivery = false, $multi = false, $tri = false, $expe48 = false)
{
global $cookie;
if (!Validate::isLoadedObject($order) OR (!$cookie->id_employee AND (!OrderState::invoiceAvailable($order->getCurrentState()) AND !$order->invoice_number)))
die('Invalid order or invalid order state');
self::$order = $order;
self::$orderSlip = $slip;
self::$delivery = $delivery;
self::$_iso = strtoupper(Language::getIsoById((int)(self::$order->id_lang)));
if ((self::$_priceDisplayMethod = $order->getTaxCalculationMethod()) === false)
die(self::l('No price display method defined for the customer group'));
if (!$multiple)
$pdf = new PDF('P', 'mm', 'A4');
$pdf->SetAutoPageBreak(true, 35);
$pdf->StartPageGroup();
self::$currency = Currency::getCurrencyInstance((int)(self::$order->id_currency));
$pdf->AliasNbPages();
$pdf->AddPage();
$width = 100;
$pdf->SetX(10);
$pdf->SetY(25);
$pdf->SetFont(self::fontname(), '', 12);
$pdf->Cell($width, 10, self::l('Delivery'), 0, 'L');
$pdf->Cell($width, 10, self::l('Invoicing'), 0, 'L');
$pdf->Ln(5);
$pdf->SetFont(self::fontname(), '', 9);
$addressType = array(
'delivery' => array(),
'invoice' => array(),
);
$patternRules = array(
'optional' => array(
'address2',
'company'),
'avoid' => array(
'State:iso_code'));
$addressType = self::generateHeaderAddresses($pdf, $order, $addressType, $patternRules, $width);
if (Configuration::get('VATNUMBER_MANAGEMENT') AND !empty($addressType['invoice']['addressObject']->vat_number))
{
$vat_delivery = '';
if ($addressType['invoice']['addressObject']->id != $addressType['delivery']['addressObject']->id)
$vat_delivery = $addressType['delivery']['addressObject']->vat_number;
$pdf->Cell($width, 10, Tools::iconv('utf-8', self::encoding(), $vat_delivery), 0, 'L');
$pdf->Cell($width, 10, Tools::iconv('utf-8', self::encoding(), $addressType['invoice']['addressObject']->vat_number), 0, 'L');
$pdf->Ln(5);
}
if ($addressType['invoice']['addressObject']->dni != NULL)
$pdf->Cell($width, 10,
self::l('Tax ID number:').' '.Tools::iconv('utf-8', self::encoding(),
$addressType['invoice']['addressObject']->dni), 0, 'L');
/*
* display order information
*/
$carrier = new Carrier(self::$order->id_carrier);
if ($carrier->name == '0')
$carrier->name = Configuration::get('PS_SHOP_NAME');
$history = self::$order->getHistory(self::$order->id_lang);
foreach($history as $h)
if ($h['id_order_state'] == Configuration::get('PS_OS_SHIPPING'))
$shipping_date = $h['date_add'];
$pdf->Ln(12);
$pdf->SetFillColor(240, 240, 240);
$pdf->SetTextColor(0, 0, 0);
$pdf->SetFont(self::fontname(), '', 9);
if (self::$orderSlip)
$pdf->Cell(0, 6, self::l('SLIP #').' '.sprintf('%06d', self::$orderSlip->id).' '.self::l('from') . ' ' .Tools::displayDate(self::$orderSlip->date_upd, self::$order->id_lang), 1, 2, 'L', 1);
elseif (self::$delivery)
$pdf->Cell(0, 6, self::l('DELIVERY SLIP #').Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_DELIVERY_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$delivery).' '.self::l('from') . ' ' .Tools::displayDate(self::$order->delivery_date, self::$order->id_lang), 1, 2, 'L', 1);
elseif ((int)self::$order->invoice_date)
$pdf->Cell(0, 6, self::l('INVOICE #').' '.Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_INVOICE_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$order->invoice_number).' '.self::l('from') . ' ' .Tools::displayDate(self::$order->invoice_date, self::$order->id_lang), 1, 2, 'L', 1);
else
$pdf->Cell(0, 6, self::l('Invoice draft'), 1, 2, 'L', 1);
$pdf->Cell(55, 6, self::l('Order #').' '.sprintf('%06d', self::$order->id), 'L', 0);
$pdf->Cell(70, 6, self::l('Carrier:'), 'L');
$pdf->Cell(0, 6, self::l('Payment method:'), 'LR');
$pdf->Ln(5);
$pdf->Cell(55, 6, (isset($shipping_date) ? self::l('Shipping date:').' '.Tools::displayDate($shipping_date, self::$order->id_lang) : ' '), 'LB', 0);
$pdf->Cell(70, 6, Tools::iconv('utf-8', self::encoding(), $carrier->name), 'LRB');
$pdf->Cell(0, 6, self::l('--'), 'LRB');
$pdf->Ln(15);
$pdf->ProdTab(true, $tri,true);
/* Canada */
$taxable_address = new Address((int)self::$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')});
if (!self::$delivery && strtoupper(Country::getIsoById((int)$taxable_address->id_country)) == 'CA')
{
$pdf->Ln(15);
$taxToDisplay = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'order_tax WHERE id_order = '.(int)self::$order->id);
foreach ($taxToDisplay AS $t)
{
$pdf->Cell(0, 6, utf8_decode($t['tax_name']).' ('.number_format($t['tax_rate'], 2, '.', '').'%) '.self::convertSign(Tools::displayPrice($t['amount'], self::$currency, true)), 0, 0, 'R');
$pdf->Ln(5);
}
}
/* End */
/* Exit if delivery */
if (!self::$delivery)
{
/* @Override Antadis */
if(!empty(self::$order->gift_message)) {
$pdf->Ln(15);
$pdf->SetFont(self::fontname(), 'B', 10);
$message = wordwrap(trim(self::$order->gift_message), 70, "\n", false);
$messages = explode("\n",$message);
foreach ($messages as $key => $mess) {
$pdf->Cell(190, 0, Tools::iconv('utf-8', self::encoding(), $mess) , 0, 0, 'C');
$pdf->Ln(5);
}
}
if($multi) {
$pdf->Ln(15);
$pdf->SetFont(self::fontname(), 'B', 10);
$pdf->Cell(190, 0, Tools::iconv('utf-8', self::encoding(), 'Commande expédiée partiellement') , 0, 0, 'C');
}
if ($expe48) {
$pdf->Ln(15);
$pdf->SetFont(self::fontname(), '', 7);
$pdf->Cell(190, 0, Tools::iconv('utf-8', self::encoding(), 'Produit expédié sous 48h, si la commande comprend dautres articles, ceux-ci arriveront dans les délais indiqués lors de lachat') , 0, 0, 'L');
}
}
Hook::PDFInvoice($pdf, self::$order->id);
if (!$multiple)
return $pdf->Output(sprintf('%06d', self::$order->id).'.pdf', $mode);
}
public function ProdTabHeader($delivery = false)
{
if (!$delivery)
{
$header = array(
array(self::l('Description'), 'L'),
array(self::l('Reference'), 'L'),
array(self::l('U. price'), 'R'),
array(self::l('Qty'), 'C'),
array(self::l('Total'), 'R')
);
$w = array(100, 15, 30, 15, 30);
}
else
{
$header = array(
array(self::l('Description'), 'L'),
array(self::l('Reference'), 'L'),
array(self::l('Qty'), 'C'),
);
$w = array(120, 30, 10);
}
$this->SetFont(self::fontname(), 'B', 8);
$this->SetFillColor(240, 240, 240);
if ($delivery)
$this->SetX(25);
for ($i = 0; $i < sizeof($header); $i++)
$this->Cell($w[$i], 5, $header[$i][0], 'T', 0, $header[$i][1], 1);
$this->Ln();
$this->SetFont(self::fontname(), '', 8);
}
/* @Override Antadis */
private function ProdTabHeaderWithEcotax($delivery = false)
{
// label, alignment (L: left, R: right, C: center)
if (!$delivery) {
$header = array(
array(self::l('Description'), 'L'),
array(self::l('Reference'), 'L'),
array(self::l('U. price'), 'R'),
array(self::l('Ecotax incl.'), 'R'),
array(self::l('Qty'), 'C'),
array(self::l('Total'), 'R')
);
$w = array(85, 15, 30, 30, 15, 15);
}
else {
$header = array(
array(self::l('Description'), 'L'),
array(self::l('Reference'), 'L'),
array(self::l('Qty'), 'C'),
);
$w = array(120, 30, 10);
}
$this->SetFont(self::fontname(), 'B', 8);
$this->SetFillColor(240, 240, 240);
if ($delivery)
$this->SetX(25);
for ($i = 0; $i < sizeof($header); $i++) {
$this->Cell($w[$i], 5, $header[$i][0], 'T', 0, $header[$i][1], 1);
}
$this->Ln();
$this->SetFont(self::fontname(), '', 8);
}
/**
* Product table with price, quantities...
*/
public function ProdTab($delivery = false, $tri=false, $gift=false)
{
if (!self::$orderSlip)
{
if (isset(self::$order->products) AND sizeof(self::$order->products))
$products = self::$order->products;
else
$products = self::$order->getProducts(false, false, false, $tri);
}
else
$products = self::$orderSlip->getOrdersSlipProducts(self::$orderSlip->id, self::$order);
/* @Override Antadis */
$hasEcotax = $this->hasProductWithEcotax($products);
if ($hasEcotax) {
$this->ProdTabHeaderWithEcotax($delivery);
}
else {
self::ProdTabHeader($delivery);
}
if (!$delivery) {
$w = $hasEcotax?array(85, 15, 30, 30, 15, 15):array(100, 15, 30, 15, 30);
}
else {
$w = array(120, 30, 10);
}
$customizedDatas = Product::getAllCustomizedDatas((int)(self::$order->id_cart));
Product::addCustomizationPrice($products, $customizedDatas);
$counter = 0;
$lines = 25;
$lineSize = 0;
$line = 0;
foreach($products AS $product)
if ((!$delivery || ($delivery && $gift)) || ((int)($product['product_quantity']) - (int)($product['product_quantity_refunded']) > 0))
{
if ($product['sended'] == 1) {
$product['product_name'] = '* '.$product['product_name'];
}
if ($counter >= $lines)
{
$this->AddPage();
$this->Ln();
self::ProdTabHeader($delivery);
$lineSize = 0;
$counter = 0;
$lines = 40;
$line++;
}
$counter = $counter + ($lineSize / 5) ;
$i = -1;
// Unit vars
$unit_without_tax = $product['product_price'] + $product['ecotax'];
$unit_with_tax = $product['product_price_wt'];
if (self::$_priceDisplayMethod == PS_TAX_EXC)
$unit_price = &$unit_without_tax;
else
$unit_price = &$unit_with_tax;
$productQuantity = $delivery ? ((int)($product['product_quantity']) - (int)($product['product_quantity_refunded'])) : (int)($product['product_quantity']);
if ($productQuantity <= 0)
continue ;
// Total prices
$total_with_tax = $unit_with_tax * $productQuantity;
$total_without_tax = $unit_without_tax * $productQuantity;
// Spec
if (self::$_priceDisplayMethod == PS_TAX_EXC)
$final_price = &$total_without_tax;
else
$final_price = &$total_with_tax;
// End Spec
if (isset($customizedDatas[$product['product_id']][$product['product_attribute_id']]))
{
$custoLabel = '';
foreach($customizedDatas[$product['product_id']][$product['product_attribute_id']] as $customizedData)
{
$customizationGroup = $customizedData['datas'];
$nb_images = 0;
if (array_key_exists(_CUSTOMIZE_FILE_, $customizationGroup))
$nb_images = sizeof($customizationGroup[_CUSTOMIZE_FILE_]);
if (array_key_exists(_CUSTOMIZE_TEXTFIELD_, $customizationGroup))
foreach($customizationGroup[_CUSTOMIZE_TEXTFIELD_] as $customization)
if (!empty($customization['name'])) $custoLabel .= '- '.$customization['name'].': '.$customization['value']."\n";
if ($nb_images > 0)
$custoLabel .= '- '.$nb_images. ' '. self::l('image(s)')."\n";
$custoLabel .= "---\n";
}
$custoLabel = rtrim($custoLabel, "---\n");
$productQuantity = (int)($product['product_quantity']) - (int)($product['customizationQuantityTotal']);
if ($delivery)
$this->SetX(25);
$before = $this->GetY();
$this->MultiCell($w[++$i], 5, Tools::iconv('utf-8', self::encoding(), $product['product_name']).' - '.self::l('Customized')." \n".Tools::iconv('utf-8', self::encoding(), $custoLabel), 'B');
$lineSize = $this->GetY() - $before;
$this->SetXY($this->GetX() + $w[0] + ($delivery ? 15 : 0), $this->GetY() - $lineSize);
$this->Cell($w[++$i], $lineSize, $product['product_reference'], 'B');
if (!$delivery) {
$this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price, self::$currency, true)), 'B', 0, 'R');
/* @Override Antadis */
if ($hasEcotax) {
if (!empty($product['ecotax']) && $product['ecotax']>0) {
$this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($product['ecotax'], self::$currency, true)), 'BT', 0, 'R');
}
else {
$this->Cell($w[++$i], $lineSize, '-', 'BT', 0, 'R');
}
}
}
$this->Cell($w[++$i], $lineSize, (int)($product['customizationQuantityTotal']), 'B', 0, 'C');
if (!$delivery && isset($w[++$i])) {
$this->Cell($w[$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price * (int)($product['customizationQuantityTotal']), self::$currency, true)), 'B', 0, 'R');
}
$this->Ln();
$i = -1;
$total_with_tax = $unit_with_tax * $productQuantity;
$total_without_tax = $unit_without_tax * $productQuantity;
}
if ($delivery)
$this->SetX(25);
if ($productQuantity)
{
$before = $this->GetY();
$fill = false;
if($productQuantity > 1) {
$this->SetFont(self::fontname(), 'B', 7);
$this->SetFillColor(240, 240, 240);
$fill = true;
} else {
$this->SetFont(self::fontname(), '', 7);
}
$this->MultiCell($w[++$i], 5, Tools::iconv('utf-8', self::encoding(), $product['product_name']), 'BT');
$lineSize = $this->GetY() - $before;
$this->SetXY($this->GetX() + $w[0] + ($delivery ? 15 : 0), $this->GetY() - $lineSize);
$this->Cell($w[++$i], $lineSize, ($product['product_reference'] ? Tools::iconv('utf-8', self::encoding(), $product['product_reference']) : '--'), 'BT');
if (!$delivery) {
$this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price, self::$currency, true)), 'BT', 0, 'R');
/* @Override Antadis */
if ($hasEcotax) {
if (!empty($product['ecotax']) && $product['ecotax']>0) {
$this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($product['ecotax'], self::$currency, true)), 'BT', 0, 'R');
}
else {
$this->Cell($w[++$i], $lineSize, '-', 'BT', 0, 'R');
}
}
}
/* @Override Antadis */
if(!$delivery && !$hasEcotax) {
global $cookie;
error_log("logt" . serialize($cookie));
if(method_exists($cookie, 'isLoggedBack') && $cookie->isLoggedBack()) {
$this->Cell($w[++$i], $lineSize, $productQuantity.(self::$orderSlip? '': ($product['product_quantity_return'] > 0? ' (-'.$product['product_quantity_return'].')': ($product['product_quantity_refunded'] > 0? ' (-'.$product['product_quantity_refunded'].')': '' ))), 'BT', 0, 'C', $fill);
} else {
$this->Cell($w[++$i], $lineSize, $productQuantity, 'BT', 0, 'C', $fill);
}
}
$this->Cell($w[++$i], $lineSize, $productQuantity, 'BT', 0, 'C');
if (!$delivery && isset($w[++$i])) {
$this->Cell($w[$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($final_price, self::$currency, true)), 'BT', 0, 'R');
}
$this->Ln();
}
}
if (!sizeof(self::$order->getDiscounts()) AND !$delivery)
$this->Cell(array_sum($w), 0, '');
}
/**
* Discount table with value, quantities...
*/
public function DiscTab()
{
$w = array(90, 25, 15, 10, 25, 25);
$this->SetFont(self::fontname(), 'B', 7);
$discounts = self::$order->getDiscounts();
foreach($discounts AS $discount)
{
$this->Cell($w[0], 6, self::l('Discount:').' '.$discount['name'], 'B');
$this->Cell($w[1], 6, '', 'B');
$this->Cell($w[2], 6, '', 'B');
$this->Cell($w[3], 6, '', 'B', 0, 'R');
$this->Cell($w[4], 6, '1', 'B', 0, 'C');
$this->Cell($w[5], 6, ((!self::$orderSlip AND $discount['value'] != 0.00) ? '-' : '').self::convertSign(Tools::displayPrice($discount['value'], self::$currency, true)), 'B', 0, 'R');
$this->Ln();
}
if (sizeof($discounts))
$this->Cell(array_sum($w), 0, '');
}
public function priceBreakDownCalculation(&$priceBreakDown)
{
$priceBreakDown['totalsWithoutTax'] = array();
$priceBreakDown['totalsWithTax'] = array();
$priceBreakDown['totalsEcotax'] = array();
$priceBreakDown['wrappingCostWithoutTax'] = 0;
$priceBreakDown['shippingCostWithoutTax'] = 0;
$priceBreakDown['totalWithoutTax'] = 0;
$priceBreakDown['totalWithTax'] = 0;
$priceBreakDown['totalProductsWithoutTax'] = 0;
$priceBreakDown['totalProductsWithTax'] = 0;
$priceBreakDown['hasEcotax'] = 0;
$priceBreakDown['totalsProductsWithTaxAndReduction'] = array();
if (self::$order->total_paid == '0.00' AND self::$order->total_discounts == 0)
return ;
// Setting products tax
if (isset(self::$order->products) AND sizeof(self::$order->products))
$products = self::$order->products;
else
$products = self::$order->getProducts();
$amountWithoutTax = 0;
$taxes = array();
/* Firstly calculate all prices */
foreach ($products AS &$product)
{
if (!isset($priceBreakDown['totalsWithTax'][$product['tax_rate']]))
$priceBreakDown['totalsWithTax'][$product['tax_rate']] = 0;
if (!isset($priceBreakDown['totalsEcotax'][$product['tax_rate']]))
$priceBreakDown['totalsEcotax'][$product['tax_rate']] = 0;
if (!isset($priceBreakDown['totalsEcotaxWithTax'][$product['tax_rate']]))
$priceBreakDown['totalsEcotaxWithTax'][$product['tax_rate']] = 0;
if (!isset($priceBreakDown['totalsWithoutTax'][$product['tax_rate']]))
$priceBreakDown['totalsWithoutTax'][$product['tax_rate']] = 0;
if (!isset($taxes[$product['tax_rate']]))
$taxes[$product['tax_rate']] = 0;
if (!isset($priceBreakDown['totalsProductsWithTaxAndReduction'][$product['tax_rate']]))
$priceBreakDown['totalsProductsWithTaxAndReduction'][$product['tax_rate']] = 0;
if (!isset($priceBreakDown['totalsProductsWithoutTaxAndReduction'][$product['tax_rate']]))
$priceBreakDown['totalsProductsWithoutTaxAndReduction'][$product['tax_rate']] = 0;
/* Without tax */
if (self::$_priceDisplayMethod == PS_TAX_EXC)
$product['priceWithoutTax'] = Tools::ps_round((float)($product['product_price']) + (float)$product['ecotax'], 2);
else
$product['priceWithoutTax'] = ($product['product_price_wt_but_ecotax'] / (1 + $product['tax_rate'] / 100)) + (float)$product['ecotax'];
$product['priceWithoutTax'] = $product['priceWithoutTax'] * (int)($product['product_quantity']);
$amountWithoutTax += $product['priceWithoutTax'];
/* With tax */
$product['priceWithTax'] = (float)($product['product_price_wt']) * (int)($product['product_quantity']);
$product['priceEcotax'] = $product['ecotax'] * (1 + $product['ecotax_tax_rate'] / 100);
}
$priceBreakDown['totalsProductsWithoutTax'] = $priceBreakDown['totalsWithoutTax'];
$priceBreakDown['totalsProductsWithTax'] = $priceBreakDown['totalsWithTax'];
$tmp = 0;
$product = &$tmp;
/* And secondly assign to each tax its own reduction part */
$discountAmount = 0;
if (!self::$orderSlip)
$discountAmount = (float)(self::$order->total_discounts);
foreach ($products as $product)
{
$ratio = $amountWithoutTax == 0 ? 0 : $product['priceWithoutTax'] / $amountWithoutTax;
$priceWithTaxAndReduction = $product['priceWithTax'] - $discountAmount * $ratio;
$discountAmountWithoutTax = Tools::ps_round(($discountAmount * $ratio) / (1 + ($product['tax_rate'] / 100)), 2);
if (self::$_priceDisplayMethod == PS_TAX_EXC)
{
$vat = $priceWithTaxAndReduction - Tools::ps_round($priceWithTaxAndReduction / $product['product_quantity'] / (((float)($product['tax_rate']) / 100) + 1), 2) * $product['product_quantity'];
$priceBreakDown['totalsWithoutTax'][$product['tax_rate']] += $product['priceWithoutTax'] ;
$priceBreakDown['totalsProductsWithoutTax'][$product['tax_rate']] += $product['priceWithoutTax'];
$priceBreakDown['totalsProductsWithoutTaxAndReduction'][$product['tax_rate']] += Tools::ps_round($product['priceWithoutTax'] - (float)$discountAmountWithoutTax, 2);
}
else
{
$vat = (float)($product['priceWithoutTax']) * ((float)($product['tax_rate']) / 100) * $product['product_quantity'];
$priceBreakDown['totalsWithTax'][$product['tax_rate']] += $product['priceWithTax'];
$priceBreakDown['totalsProductsWithTax'][$product['tax_rate']] += $product['priceWithTax'];
$priceBreakDown['totalsProductsWithoutTax'][$product['tax_rate']] += $product['priceWithoutTax'];
$priceBreakDown['totalsProductsWithTaxAndReduction'][$product['tax_rate']] += $priceWithTaxAndReduction;
}
$priceBreakDown['totalsEcotax'][$product['tax_rate']] += ($product['priceEcotax'] * $product['product_quantity']);
$priceBreakDown['totalsEcotaxWithTax'][$product['tax_rate']] += ($product['priceEcotax'] * (1 + ($product['ecotax_tax_rate'] / 100)) * $product['product_quantity']);
if ($priceBreakDown['totalsEcotax'][$product['tax_rate']])
$priceBreakDown['hasEcotax'] = 1;
$taxes[$product['tax_rate']] += $vat;
}
$carrier_tax_rate = (float)self::$order->carrier_tax_rate;
if (($priceBreakDown['totalsWithoutTax'] == $priceBreakDown['totalsWithTax']) AND (!$carrier_tax_rate OR $carrier_tax_rate == '0.00') AND (!self::$order->total_wrapping OR self::$order->total_wrapping == '0.00'))
return ;
foreach ($taxes AS $tax_rate => &$vat)
{
if (self::$_priceDisplayMethod == PS_TAX_EXC)
{
$priceBreakDown['totalsWithoutTax'][$tax_rate] = Tools::ps_round($priceBreakDown['totalsWithoutTax'][$tax_rate], 2);
$priceBreakDown['totalsProductsWithoutTax'][$tax_rate] = Tools::ps_round($priceBreakDown['totalsWithoutTax'][$tax_rate], 2);
$priceBreakDown['totalsWithTax'][$tax_rate] = Tools::ps_round(($priceBreakDown['totalsWithoutTax'][$tax_rate]- $priceBreakDown['totalsEcotax'][$tax_rate]) * (1 + $tax_rate / 100) + $priceBreakDown['totalsEcotaxWithTax'][$tax_rate], 2);
$priceBreakDown['totalsProductsWithTax'][$tax_rate] = Tools::ps_round(($priceBreakDown['totalsProductsWithoutTax'][$tax_rate] - $priceBreakDown['totalsEcotax'][$tax_rate]) * (1 + $tax_rate / 100) + $priceBreakDown['totalsEcotaxWithTax'][$tax_rate], 2);
$priceBreakDown['totalsProductsWithTaxAndReduction'][$tax_rate] += Tools::ps_round(($priceBreakDown['totalsProductsWithoutTaxAndReduction'][$tax_rate] - $priceBreakDown['totalsEcotax'][$tax_rate]) * (1 + $tax_rate / 100) + $priceBreakDown['totalsEcotaxWithTax'][$tax_rate], 2);
}
else
{
$priceBreakDown['totalsWithoutTax'][$tax_rate] = $priceBreakDown['totalsProductsWithoutTax'][$tax_rate];
$priceBreakDown['totalsProductsWithoutTax'][$tax_rate] = Tools::ps_round($priceBreakDown['totalsProductsWithoutTax'][$tax_rate], 2);
$priceBreakDown['totalsProductsWithoutTaxAndReduction'][$tax_rate] = $priceBreakDown['totalsProductsWithTaxAndReduction'][$tax_rate] / (1 + ($tax_rate / 100));
}
$priceBreakDown['totalWithTax'] += $priceBreakDown['totalsWithTax'][$tax_rate];
$priceBreakDown['totalWithoutTax'] += $priceBreakDown['totalsWithoutTax'][$tax_rate];
$priceBreakDown['totalProductsWithoutTax'] += $priceBreakDown['totalsProductsWithoutTax'][$tax_rate];
$priceBreakDown['totalProductsWithTax'] += $priceBreakDown['totalsProductsWithTax'][$tax_rate];
}
$priceBreakDown['taxes'] = $taxes;
$priceBreakDown['shippingCostWithoutTax'] = ($carrier_tax_rate AND $carrier_tax_rate != '0.00') ? (self::$order->total_shipping / (1 + ($carrier_tax_rate / 100))) : self::$order->total_shipping;
if (self::$order->total_wrapping AND self::$order->total_wrapping != '0.00')
{
$wrappingTax = new Tax(Configuration::get('PS_GIFT_WRAPPING_TAX'));
$priceBreakDown['wrappingCostWithoutTax'] = self::$order->total_wrapping / (1 + ((float)($wrappingTax->rate) / 100));
}
}
/**
* Tax table
*/
public function TaxTab(&$priceBreakDown)
{
$taxable_address = new Address((int)self::$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')});
if (strtoupper(Country::getIsoById((int)$taxable_address->id_country)) == 'CA')
return;
if (Configuration::get('VATNUMBER_MANAGEMENT') AND !empty($invoiceAddress->vat_number) AND $invoiceAddress->id_country != Configuration::get('VATNUMBER_COUNTRY'))
{
$this->Ln();
$this->Cell(30, 0, self::l('Exempt of VAT according section 259B of the General Tax Code.'), 0, 0, 'L');
return;
}
if (self::$order->total_paid == '0.00' OR (!(int)(Configuration::get('PS_TAX')) AND self::$order->total_products == self::$order->total_products_wt))
return ;
$carrier_tax_rate = (float)self::$order->carrier_tax_rate;
if (($priceBreakDown['totalsWithoutTax'] == $priceBreakDown['totalsWithTax']) AND (!$carrier_tax_rate OR $carrier_tax_rate == '0.00') AND (!self::$order->total_wrapping OR self::$order->total_wrapping == '0.00'))
return ;
// Displaying header tax
if ($priceBreakDown['hasEcotax'])
{
$header = array(self::l('Tax detail'), self::l('Tax'), self::l('Pre-Tax Total'), self::l('Total Tax'), self::l('Ecotax (Tax Incl.)'), self::l('Total with Tax'));
$w = array(60, 20, 40, 20, 30, 20);
}
else
{
$header = array(self::l('Tax detail'), self::l('Tax'), self::l('Pre-Tax Total'), self::l('Total Tax'), self::l('Total with Tax'));
$w = array(60, 30, 40, 30, 30);
}
$this->SetFont(self::fontname(), 'B', 8);
for ($i = 0; $i < sizeof($header); $i++)
$this->Cell($w[$i], 5, $header[$i], 0, 0, 'R');
$this->Ln();
$this->SetFont(self::fontname(), '', 7);
$nb_tax = 0;
// Display product tax
foreach (array_keys($priceBreakDown['taxes']) AS $tax_rate)
{
if ($tax_rate != '0.00' AND $priceBreakDown['totalsProductsWithTax'][$tax_rate] != '0.00')
{
$nb_tax++;
$before = $this->GetY();
$lineSize = $this->GetY() - $before;
$this->SetXY($this->GetX(), $this->GetY() - $lineSize + 3);
$this->Cell($w[0], $lineSize, self::l('Products'), 0, 0, 'R');
$this->Cell($w[1], $lineSize, number_format($tax_rate, 3, ',', ' ').' %', 0, 0, 'R');
$this->Cell($w[2], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalsProductsWithoutTaxAndReduction'][$tax_rate] - $priceBreakDown['totalsEcotax'][$tax_rate], self::$currency, true)), 0, 0, 'R');
$this->Cell($w[3], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalsProductsWithTaxAndReduction'][$tax_rate] - $priceBreakDown['totalsProductsWithoutTaxAndReduction'][$tax_rate], self::$currency, true)), 0, 0, 'R');
if ($priceBreakDown['hasEcotax'])
$this->Cell($w[4], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalsEcotax'][$tax_rate], self::$currency, true)), 0, 0, 'R');
$this->Cell($w[$priceBreakDown['hasEcotax'] ? 5 : 4], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalsProductsWithTaxAndReduction'][$tax_rate], self::$currency, true)), 0, 0, 'R');
$this->Ln();
}
}
// Display carrier tax
if ($carrier_tax_rate AND $carrier_tax_rate != '0.00' AND ((self::$order->total_shipping != '0.00' AND !self::$orderSlip) OR (self::$orderSlip AND self::$orderSlip->shipping_cost)))
{
$nb_tax++;
$before = $this->GetY();
$lineSize = $this->GetY() - $before;
$this->SetXY($this->GetX(), $this->GetY() - $lineSize + 3);
$this->Cell($w[0], $lineSize, self::l('Carrier'), 0, 0, 'R');
$this->Cell($w[1], $lineSize, number_format($carrier_tax_rate, 3, ',', ' ').' %', 0, 0, 'R');
$this->Cell($w[2], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['shippingCostWithoutTax'], self::$currency, true)), 0, 0, 'R');
$this->Cell($w[3], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_shipping - $priceBreakDown['shippingCostWithoutTax'], self::$currency, true)), 0, 0, 'R');
if ($priceBreakDown['hasEcotax'])
$this->Cell($w[4], $lineSize, (self::$orderSlip ? '-' : '').'', 0, 0, 'R');
$this->Cell($w[$priceBreakDown['hasEcotax'] ? 5 : 4], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_shipping, self::$currency, true)), 0, 0, 'R');
$this->Ln();
}
// Display wrapping tax
if (self::$order->total_wrapping AND self::$order->total_wrapping != '0.00')
{
$tax = new Tax((int)(Configuration::get('PS_GIFT_WRAPPING_TAX')));
$taxRate = $tax->rate;
$nb_tax++;
$before = $this->GetY();
$lineSize = $this->GetY() - $before;
$this->SetXY($this->GetX(), $this->GetY() - $lineSize + 3);
$this->Cell($w[0], $lineSize, self::l('Gift-wrapping'), 0, 0, 'R');
$this->Cell($w[1], $lineSize, number_format($taxRate, 3, ',', ' ').' %', 0, 0, 'R');
$this->Cell($w[2], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['wrappingCostWithoutTax'], self::$currency, true)), 0, 0, 'R');
$this->Cell($w[3], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_wrapping - $priceBreakDown['wrappingCostWithoutTax'], self::$currency, true)), 0, 0, 'R');
$this->Cell($w[4], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_wrapping, self::$currency, true)), 0, 0, 'R');
}
if (!$nb_tax)
$this->Cell(190, 10, self::l('No tax'), 0, 0, 'C');
}
static protected function convertSign($s)
{
$arr['before'] = array('€', '£', '¥');
$arr['after'] = array(chr(128), chr(163), chr(165));
return str_replace($arr['before'], $arr['after'], $s);
}
static protected function l($string)
{
global $cookie;
$iso = Language::getIsoById((isset($cookie->id_lang) AND Validate::isUnsignedId($cookie->id_lang)) ? $cookie->id_lang : Configuration::get('PS_LANG_DEFAULT'));
if (@!include(_PS_TRANSLATIONS_DIR_.$iso.'/pdf.php'))
die('Cannot include PDF translation language file : '._PS_TRANSLATIONS_DIR_.$iso.'/pdf.php');
if (!isset($_LANGPDF) OR !is_array($_LANGPDF))
return str_replace('"', '&quot;', $string);
$key = md5(str_replace('\'', '\\\'', $string));
$str = (key_exists('PDF_invoice'.$key, $_LANGPDF) ? $_LANGPDF['PDF_invoice'.$key] : $string);
return (Tools::iconv('utf-8', self::encoding(), $str));
}
public static function encoding()
{
return (isset(self::$_pdfparams[self::$_iso]) AND is_array(self::$_pdfparams[self::$_iso]) AND self::$_pdfparams[self::$_iso]['encoding']) ? self::$_pdfparams[self::$_iso]['encoding'] : 'iso-8859-1';
}
public static function embedfont()
{
return (((isset(self::$_pdfparams[self::$_iso]) AND is_array(self::$_pdfparams[self::$_iso]) AND self::$_pdfparams[self::$_iso]['font']) AND !in_array(self::$_pdfparams[self::$_iso]['font'], self::$_fpdf_core_fonts)) ? self::$_pdfparams[self::$_iso]['font'] : false);
}
public static function fontname()
{
$font = self::embedfont();
if (in_array(self::$_pdfparams[self::$_iso]['font'], self::$_fpdf_core_fonts))
$font = self::$_pdfparams[self::$_iso]['font'];
return $font ? $font : 'Arial';
}
private function hasProductWithEcotax($products)
{
foreach($products as $product) {
if (!empty($product['ecotax']) && $product['ecotax']>0) {
return true;
}
}
return false;
}
}