039ec2b225
[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
1553 lines
64 KiB
PHP
Executable File
1553 lines
64 KiB
PHP
Executable File
<?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 d’autres articles, ceux-ci arriveront dans les délais indiqués lors de l’achat') , 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 d’autres articles, ceux-ci arriveront dans les délais indiqués lors de l’achat') , 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('"', '"', $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;
|
||
}
|
||
|
||
}
|
||
|