Problem in Crabe pdf

hello

I work for invoices crabe and the total ht i have problem.
The crabe total Ht is price all products without tax, i need two total Ht.
One with total ht 13% tax and two with total ht 24%.(this price, is total price products without tax but total all product to same tax)
Change to crabe and enter this code ,but return zero…

// Total HT 24%
		$pdf->SetFillColor(255,255,255);
		$pdf->SetXY($col1x, $tab2_top + 0);
		$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("Καθαρό 24% - "), 0, 'L', 1);
		$pdf->SetXY($col1x + 7, $tab2_top + 0);
		$pdf->MultiCell($largcol2, $tab2_hl, price($sign * ($object->total_vat_locale_24 + (! empty($object->remise)?$object->remise:0)), 0, $outputlangs), 0, 'R', 1);
		
// Total HT 13%
		$pdf->SetFillColor(255,255,255);
		$pdf->SetXY($col2x + -7, $tab2_top + 0);
		$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("Καθαρό 13% - "), 0, 'L', 1);
		$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
		$pdf->MultiCell($largcol2, $tab2_hl, price($sign * ($object->total_vat_locale_13 + (! empty($object->remise)?$object->remise:0)), 0, $outputlangs), 0, 'R', 1);

any help me.

Hello,

total_vat_locale_13 and total_vat_locale_24 doesn’t exist normaly

yes that’s it, and there is not find in table of database.
How to return this result?

Hello,

It is quiet difficult to reply to you… I don’t know your set-up

What are the settings in your company Sales Tax Management ?

Can you make a screen shot of the Invoice card and highlight the informations you want to display on the PDF ?

Hello

My country have 13% ,17% and 24% tax.

Now in invoice show total HT (Total HT is all product prices without TAX)
View in invoice 276,66 € this is Total HT.

Total HT remove and insert 3 line in:

Total HT 13%(Total prices to all products to same tax 13%)
Total HT 17%(Total prices to all products to same tax 17%)
Total HT 24%(Total prices to all products to same tax 24%)
Tax1
Tax2
Total TTC.

Hi,

In the php file, could you put var_dump($object);

You will have all the values inside the object to see if the total HT by taxes exist or not.

hello

All value have without taxes

This code in php ;


<?php
/* Copyright (C) 2004-2014	Laurent Destailleur	<eldy@users.sourceforge.net>
 * Copyright (C) 2005-2012	Regis Houssin		<regis.houssin@capnetworks.com>
 * Copyright (C) 2008		Raphael Bertrand	<raphael.bertrand@resultic.fr>
 * Copyright (C) 2010-2013	Juanjo Menent		<jmenent@2byte.es>
 * Copyright (C) 2012      	Christophe Battarel <christophe.battarel@altairis.fr>
 * Copyright (C) 2014-2017	Nikos Drosis Technicks ICT <info@technicks.eu>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 * or see http://www.gnu.org/
 */

/**
 *	\file       core/modules/facture/doc/pdf_moon_invoicegr.modules.php
 *	\ingroup    invoicegr
 *	\brief      File of class to generate customers invoices from moon model
 */

require_once DOL_DOCUMENT_ROOT.'/core/modules/facture/modules_facture.php';
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php';
dol_include_once('/invoicegr/lib/pdf.lib.php');
dol_include_once('/invoicegr/lib/invoicegr.lib.php');



/**
 *	Class to manage PDF invoice template Moon
 */
class pdf_moon_invoicegr extends ModelePDFFactures
{
    var $db;
    var $name;
    var $description;
    var $type;

    var $phpmin = array(4,3,0); // Minimum version of PHP required by module
    var $version = 'dolibarr';

    var $page_largeur;
    var $page_hauteur;
    var $format;
	var $marge_gauche;
	var	$marge_droite;
	var	$marge_haute;
	var	$marge_basse;

	var $emetteur;	// Objet societe qui emet

	/**
	 * @var bool Situation invoice type
	 */
	public $situationinvoice;

	/**
	 * @var float X position for the situation progress column
	 */
	public $posxprogress;


	/**
	 *	Constructor
	 *
	 *  @param		DoliDB		$db      Database handler
	 */
	function __construct($db)
	{
		global $conf,$langs,$mysoc;

		$langs->load("main");
		$langs->load("bills");
                $langs->load("invoicegr@invoicegr");

		$this->db = $db;
		$this->name = "ΤΙΜΟΛΟΓΙΟ-ΔΕΛΤΙΟ ΑΠΟΣΤΟΛΗΣ";
		$this->description = $langs->trans('InvoicemoonDescription');

		// Dimension page pour format A4
		$this->type = 'pdf';
		$formatarray=pdf_getFormatgr();
		$this->page_largeur = $formatarray['width'];
		$this->page_hauteur = $formatarray['height'];
		$this->format = array($this->page_largeur,$this->page_hauteur);
		$this->marge_gauche=isset($conf->global->MAIN_PDF_MARGIN_LEFT)?$conf->global->MAIN_PDF_MARGIN_LEFT:10;
		$this->marge_droite=isset($conf->global->MAIN_PDF_MARGIN_RIGHT)?$conf->global->MAIN_PDF_MARGIN_RIGHT:10;
		$this->marge_haute =isset($conf->global->MAIN_PDF_MARGIN_TOP)?$conf->global->MAIN_PDF_MARGIN_TOP:10;
		$this->marge_basse =isset($conf->global->MAIN_PDF_MARGIN_BOTTOM)?$conf->global->MAIN_PDF_MARGIN_BOTTOM:10;

		$this->option_logo = 1;                    // Affiche logo
		$this->option_tva = 1;                     // Gere option tva FACTURE_TVAOPTION
		$this->option_modereg = 1;                 // Affiche mode reglement
		$this->option_condreg = 1;                 // Affiche conditions reglement
		$this->option_codeproduitservice = 1;      // Affiche code produit-service
		$this->option_multilang = 1;               // Dispo en plusieurs langues
		$this->option_escompte = 1;                // Affiche si il y a eu escompte
		$this->option_credit_note = 1;             // Support credit notes
		$this->option_freetext = 1;				   // Support add of a personalised text
		$this->option_draft_watermark = 1;		   // Support add of a watermark on drafts

		$this->franchise=!$mysoc->tva_assuj;

		// Get source company
		$this->emetteur=$mysoc;
		if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang,-2);    // By default, if was not defined

		// Define position of columns
		$this->posxdesc=$this->marge_gauche+1;
		if($conf->global->PRODUCT_USE_UNITS)
		{
			$this->posxtva=99;
			$this->posxup=114;
			$this->posxqty=133;
			$this->posxunit=150;
		}
		else
		{
			$this->posxtva=112;
			$this->posxup=126;
			$this->posxqty=145;
		}
		$this->posxdiscount=162;
		$this->posxprogress=174; // Only displayed for situation invoices
		$this->postotalht=174;
		if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) $this->posxtva=$this->posxup;
		$this->posxpicture=$this->posxtva - (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?20:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH);	// width of images
		if ($this->page_largeur < 210) // To work with US executive format
		{
			$this->posxpicture-=20;
			$this->posxtva-=20;
			$this->posxup-=20;
			$this->posxqty-=20;
			$this->posxdiscount-=20;
			$this->postotalht-=20;
		}

		$this->tva=array();
		$this->localtax1=array();
		$this->localtax2=array();
		$this->atleastoneratenotnull=0;
		$this->atleastonediscount=0;
		$this->situationinvoice=False;
	}


	/**
     *  Function to build pdf onto disk
     *
     *  @param		Object		$object				Object to generate
     *  @param		Translate	$outputlangs		Lang output object
     *  @param		string		$srctemplatepath	Full path of source filename for generator using a template file
     *  @param		int			$hidedetails		Do not show line details
     *  @param		int			$hidedesc=1			Do not show desc
     *  @param		int			$hideref			Do not show ref
     *  @return     int         	    			1=OK, 0=KO
	 */
	function write_file($object,$outputlangs,$srctemplatepath='',$hidedetails=0,$hidedesc=1,$hideref=0)
	{
		global $user,$langs,$conf,$mysoc,$db,$hookmanager;

		if (! is_object($outputlangs)) $outputlangs=$langs;
		// For backward compatibility with FPDF, force output charset to ISO, because FPDF expect text to be encoded in ISO
		if (! empty($conf->global->MAIN_USE_FPDF)) $outputlangs->charset_output='ISO-8859-1';

		$outputlangs->load("main");
		$outputlangs->load("dict");
		$outputlangs->load("companies");
		$outputlangs->load("bills");
		$outputlangs->load("products");

		$nblignes = count($object->lines);

		// Loop on each lines to detect if there is at least one image to show
		$realpatharray=array();
		if (! empty($conf->global->MAIN_GENERATE_INVOICES_WITH_PICTURE))
		{
			for ($i = 0 ; $i < $nblignes ; $i++)
			{
				if (empty($object->lines[$i]->fk_product)) continue;

				$objphoto = new Product($this->db);
				$objphoto->fetch($object->lines[$i]->fk_product);

				$pdir = get_exdir($object->lines[$i]->fk_product,2,0,0,$objphoto,'product') . $object->lines[$i]->fk_product ."/photos/";
				$dir = $conf->product->dir_output.'/'.$pdir;

				$realpath='';
				foreach ($objphoto->liste_photos($dir,1) as $key => $obj)
				{
					$filename=$obj['photo'];
					//if ($obj['photo_vignette']) $filename='thumbs/'.$obj['photo_vignette'];
					$realpath = $dir.$filename;
					break;
				}

				if ($realpath) $realpatharray[$i]=$realpath;
			}
		}
		if (count($realpatharray) == 0) $this->posxpicture=$this->posxtva;

		if ($conf->facture->dir_output)
		{
			$object->fetch_thirdparty();

			$deja_regle = $object->getSommePaiement();
			$amount_credit_notes_included = $object->getSumCreditNotesUsed();
			$amount_deposits_included = $object->getSumDepositsUsed();

			// Definition of $dir and $file
			if ($object->specimen)
			{
				$dir = $conf->facture->dir_output;
				$file = $dir . "/SPECIMEN.pdf";
			}
			else
			{
				$objectref = dol_sanitizeFileName($object->ref);
				$dir = $conf->facture->dir_output . "/" . $objectref;
				$file = $dir . "/" . $objectref . ".pdf";
			}
			if (! file_exists($dir))
			{
				if (dol_mkdir($dir) < 0)
				{
					$this->error=$langs->transnoentities("ErrorCanNotCreateDir",$dir);
					return 0;
				}
			}

			if (file_exists($dir))
			{
				// Add pdfgeneration hook
				if (! is_object($hookmanager))
				{
					include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
					$hookmanager=new HookManager($this->db);
				}
				$hookmanager->initHooks(array('pdfgeneration'));
				$parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs);
				global $action;
				$reshook=$hookmanager->executeHooks('beforePDFCreation',$parameters,$object,$action);    // Note that $action and $object may have been modified by some hooks

				// Set nblignes with the new facture lines content after hook
				$nblignes = count($object->lines);

                $pdf=pdf_getInstancegr($this->format);
                $default_font_size = pdf_getPDFFontSizegr($outputlangs);	// Must be after pdf_getInstance
				$heightforinfotot = 50;	// Height reserved to output the info and total part
		        $heightforfreetext= (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT)?$conf->global->MAIN_PDF_FREETEXT_HEIGHT:5);	// Height reserved to output the free text on last page
	            $heightforfooter = $this->marge_basse + 8;	// Height reserved to output the footer (value include bottom margin)
                $pdf->SetAutoPageBreak(1,0);

                if (class_exists('TCPDF'))
                {
                    $pdf->setPrintHeader(false);
                    $pdf->setPrintFooter(false);
                }
                $pdf->SetFont(pdf_getPDFFontgr($outputlangs));

                // Set path to the background PDF File
                if (empty($conf->global->MAIN_DISABLE_FPDI) && ! empty($conf->global->MAIN_ADD_PDF_BACKGROUND))
                {
				    $pagecount = $pdf->setSourceFile($conf->mycompany->dir_output.'/'.$conf->global->MAIN_ADD_PDF_BACKGROUND);
				    $tplidx = $pdf->importPage(1);
                }

				$pdf->Open();
				$pagenb=0;
				$pdf->SetDrawColor(128,128,128);

				$pdf->SetTitle($outputlangs->convToOutputCharset($object->ref));
				$pdf->SetSubject($outputlangs->transnoentities("Invoice"));
				$pdf->SetCreator("Dolibarr ".DOL_VERSION);
				$pdf->SetAuthor($outputlangs->convToOutputCharset($user->getFullName($outputlangs)));
				$pdf->SetKeyWords($outputlangs->convToOutputCharset($object->ref)." ".$outputlangs->transnoentities("Invoice"));
				if (! empty($conf->global->MAIN_DISABLE_PDF_COMPRESSION)) $pdf->SetCompression(false);

				$pdf->SetMargins($this->marge_gauche, $this->marge_haute, $this->marge_droite);   // Left, Top, Right

				// Positionne $this->atleastonediscount si on a au moins une remise
				for ($i = 0 ; $i < $nblignes ; $i++)
				{
					if ($object->lines[$i]->remise_percent)
					{
						$this->atleastonediscount++;
					}
				}
				if (empty($this->atleastonediscount) && empty($conf->global->PRODUCT_USE_UNITS))
				{
					$this->posxpicture+=($this->postotalht - $this->posxdiscount);
					$this->posxtva+=($this->postotalht - $this->posxdiscount);
					$this->posxup+=($this->postotalht - $this->posxdiscount);
					$this->posxqty+=($this->postotalht - $this->posxdiscount);
					$this->posxdiscount+=($this->postotalht - $this->posxdiscount);
					//$this->postotalht;
				}

				// Situation invoice handling
				if ($object->situation_cycle_ref)
				{
					$this->situationinvoice = True;
					$progress_width = 14;
					$this->posxtva -= $progress_width;
					$this->posxup -= $progress_width;
					$this->posxqty -= $progress_width;
					$this->posxdiscount -= $progress_width;
					$this->posxprogress -= $progress_width;
				}

				// New page
				$pdf->AddPage();
				if (! empty($tplidx)) $pdf->useTemplate($tplidx);
				$pagenb++;

				$this->_pagehead($pdf, $object, 1, $outputlangs);
				$pdf->SetFont('','', $default_font_size - 1);
				$pdf->MultiCell(0, 3, '');		// Set interline to 3
				$pdf->SetTextColor(0,0,0);

				$tab_top = 90;
				$tab_top_newpage = (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)?42:10);
				$tab_height = 130;
				$tab_height_newpage = 150;

				// Incoterm
				$height_incoterms = 0;
				if ($conf->incoterm->enabled)
				{
					$desc_incoterms = $object->getIncotermsForPDF();
					if ($desc_incoterms)
					{
						$tab_top = 88;

						$pdf->SetFont('','', $default_font_size - 1);
						$pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($desc_incoterms), 0, 1);
						$nexY = $pdf->GetY();
						$height_incoterms=$nexY-$tab_top;

						// Rect prend une longueur en 3eme param
						$pdf->SetDrawColor(192,192,192);
						$pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_incoterms+1);

						$tab_top = $nexY+6;
						$height_incoterms += 4;
					}
				}

				// Affiche notes
				$notetoshow=empty($object->note_public)?'':$object->note_public;
				if (! empty($conf->global->MAIN_ADD_SALE_REP_SIGNATURE_IN_NOTE))
				{
					// Get first sale rep
					if (is_object($object->thirdparty))
					{
						$salereparray=$object->thirdparty->getSalesRepresentatives($user);
						$salerepobj=new User($this->db);
						$salerepobj->fetch($salereparray[0]['id']);
						if (! empty($salerepobj->signature)) $notetoshow=dol_concatdesc($notetoshow, $salerepobj->signature);
					}
				}
				if ($notetoshow)
				{
					$tab_top = 88 + $height_incoterms;

					$pdf->SetFont('','', $default_font_size - 1);
					$pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top, dol_htmlentitiesbr($notetoshow), 0, 1);
					$nexY = $pdf->GetY();
					$height_note=$nexY-$tab_top;

					// Rect prend une longueur en 3eme param
					$pdf->SetDrawColor(192,192,192);
					$pdf->Rect($this->marge_gauche, $tab_top-1, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $height_note+1);

					$tab_height = $tab_height - $height_note;
					$tab_top = $nexY+6;
				}
				else
				{
					$height_note=0;
				}

				$iniY = $tab_top + 7;
				$curY = $tab_top + 7;
				$nexY = $tab_top + 7;

				// Loop on each lines
				for ($i = 0; $i < $nblignes; $i++)
				{
					$curY = $nexY;
					$pdf->SetFont('','', $default_font_size - 1);   // Into loop to work with multipage
					$pdf->SetTextColor(0,0,0);

					// Define size of image if we need it
					$imglinesize=array();
					if (! empty($realpatharray[$i])) $imglinesize=pdf_getSizeForImage($realpatharray[$i]);

					$pdf->setTopMargin($tab_top_newpage);
					$pdf->setPageOrientation('', 1, $heightforfooter+$heightforfreetext+$heightforinfotot);	// The only function to edit the bottom margin of current page to set it.
					$pageposbefore=$pdf->getPage();

					$showpricebeforepagebreak=1;
					$posYAfterImage=0;
					$posYAfterDescription=0;

					// We start with Photo of product line
					if (isset($imglinesize['width']) && isset($imglinesize['height']) && ($curY + $imglinesize['height']) > ($this->page_hauteur-($heightforfooter+$heightforfreetext+$heightforinfotot)))	// If photo too high, we moved completely on new page
					{
						$pdf->AddPage('','',true);
						if (! empty($tplidx)) $pdf->useTemplate($tplidx);
						if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
						$pdf->setPage($pageposbefore+1);

						$curY = $tab_top_newpage;
						$showpricebeforepagebreak=0;
					}

					if (isset($imglinesize['width']) && isset($imglinesize['height']))
					{
						$curX = $this->posxpicture-1;
						$pdf->Image($realpatharray[$i], $curX + (($this->posxtva-$this->posxpicture-$imglinesize['width'])/2), $curY, $imglinesize['width'], $imglinesize['height'], '', '', '', 2, 300);	// Use 300 dpi
						// $pdf->Image does not increase value return by getY, so we save it manually
						$posYAfterImage=$curY+$imglinesize['height'];
					}

					// Description of product line
					$curX = $this->posxdesc-1;

					$showpricebeforepagebreak=1;

					$pdf->startTransaction();
					pdf_writelinedescgr($pdf,$object,$i,$outputlangs,$this->posxtva-$curX,3,$curX,$curY,$hideref,$hidedesc=1);
					$pageposafter=$pdf->getPage();
					if ($pageposafter > $pageposbefore)	// There is a pagebreak
					{
						$pdf->rollbackTransaction(true);
						$pageposafter=$pageposbefore;
						//print $pageposafter.'-'.$pageposbefore;exit;
						$pdf->setPageOrientation('', 1, $heightforfooter);	// The only function to edit the bottom margin of current page to set it.
						pdf_writelinedescgr($pdf,$object,$i,$outputlangs,$this->posxtva-$curX,4,$curX,$curY,$hideref,$hidedesc=1);
						$pageposafter=$pdf->getPage();
						$posyafter=$pdf->GetY();
						//var_dump($posyafter); var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit;
						if ($posyafter > ($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot)))	// There is no space left for total+free text
						{
							if ($i == ($nblignes-1))	// No more lines, and no space left to show total, so we create a new page
							{
								$pdf->AddPage('','',true);
								if (! empty($tplidx)) $pdf->useTemplate($tplidx);
								if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
								$pdf->setPage($pageposafter+1);
							}
						}
						else
						{
							// We found a page break
							$showpricebeforepagebreak=0;
						}
					}
					else	// No pagebreak
					{
						$pdf->commitTransaction();
					}
					$posYAfterDescription=$pdf->GetY();

					$nexY = $pdf->GetY();
					$pageposafter=$pdf->getPage();
					$pdf->setPage($pageposbefore);
					$pdf->setTopMargin($this->marge_haute);
					$pdf->setPageOrientation('', 1, 0);	// The only function to edit the bottom margin of current page to set it.

					// We suppose that a too long description or photo were moved completely on next page
					if ($pageposafter > $pageposbefore && empty($showpricebeforepagebreak)) {
						$pdf->setPage($pageposafter); $curY = $tab_top_newpage;
					}

					$pdf->SetFont('','', $default_font_size - 1);   // On repositionne la police par defaut

					// VAT Rate
					if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT))
					{
						$vat_rate = pdf_getlinevatrategr($object, $i, $outputlangs, $hidedetails);
						$pdf->SetXY($this->posxtva, $curY);
						$pdf->MultiCell($this->posxup-$this->posxtva-0.8, 3, $vat_rate, 0, 'R');
					}

					// Unit price before discount
					$up_excl_tax = pdf_getlineupexcltaxgr($object, $i, $outputlangs, $hidedetails);
					$pdf->SetXY($this->posxup, $curY);
					$pdf->MultiCell($this->posxqty-$this->posxup-0.8, 3, $up_excl_tax, 0, 'R', 0);
                                        
                                        // Pieces and units
                                        //$labelproductservice=pdf_getlinedescgr($object,$i,$outputlangs,$hideref,$hidedesc=1,$issupplierline,$qty1);
                                        //if (substr($labelproductservice, 0, 2)=="HR")
                                        //{
                                        //         $qty1=($outputlangs->transnoentities("PiecesHour"));
                                        //}
                                        //         else
                                        //{
                                        //         $qty1=($outputlangs->transnoentities("Pieces"));
                                        //}

                                        //$labelproductservice=pdf_getlinedescgr($object,$i,$outputlangs,$hideref,$hidedesc=1,$issupplierline,$qty1);
                                       // if (substr($labelproductservice, 0, 2)=="ME")
                                        //{
                                       //          $qty1=($outputlangs->transnoentities("PiecesMeter"));
                                       // }

					// Quantity
					$qty = pdf_getlineqtygr($object, $i, $outputlangs, $hidedetails);
					$pdf->SetXY($this->posxqty, $curY);
					// Enough for 6 chars
					if($conf->global->PRODUCT_USE_UNITS)
					{
						$pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R');
					}
					else
					{
						$pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R');
					}

					// Unit
					if($conf->global->PRODUCT_USE_UNITS)
					{
						$unit = pdf_getlineunit($object, $i, $outputlangs, $hidedetails, $hookmanager);
						$pdf->SetXY($this->posxunit, $curY);
						$pdf->MultiCell($this->posxdiscount-$this->posxunit-0.8, 4, $unit, 0, 'L');
					}

					// Discount on line
					if ($object->lines[$i]->remise_percent)
					{
                        $pdf->SetXY($this->posxdiscount-2, $curY);
					    $remise_percent = pdf_getlineremisepercentgr($object, $i, $outputlangs, $hidedetails);
						$pdf->MultiCell($this->posxprogress-$this->posxdiscount+2, 3, $remise_percent, 0, 'R');
					}

					if ($this->situationinvoice)
					{
						// Situation progress
						$progress = pdf_getlineprogressgr($object, $i, $outputlangs, $hidedetails);
						$pdf->SetXY($this->posxprogress, $curY);
						$pdf->MultiCell($this->postotalht-$this->posxprogress, 3, $progress, 0, 'R');
					}

					// Total HT line
					$total_excl_tax = pdf_getlinetotalexcltaxgr($object, $i, $outputlangs, $hidedetails);
					$pdf->SetXY($this->postotalht, $curY);
					$pdf->MultiCell($this->page_largeur-$this->marge_droite-$this->postotalht, 3, $total_excl_tax, 0, 'R', 0);

					// Collecte des totaux par valeur de tva dans $this->tva["taux"]=total_tva
					$prev_progress = $object->lines[$i]->get_prev_progress($object->id);
					if ($prev_progress > 0) // Compute progress from previous situation
					{
						$tvaligne = $object->lines[$i]->total_tva * ($object->lines[$i]->situation_percent - $prev_progress) / $object->lines[$i]->situation_percent;
					} else {
						$tvaligne = $object->lines[$i]->total_tva;
					}
					
					$localtax1ligne=$object->lines[$i]->total_localtax1;
					$localtax2ligne=$object->lines[$i]->total_localtax2;
					$localtax1_rate=$object->lines[$i]->localtax1_tx;
					$localtax2_rate=$object->lines[$i]->localtax2_tx;
					$localtax1_type=$object->lines[$i]->localtax1_type;
					$localtax2_type=$object->lines[$i]->localtax2_type;

					if ($object->remise_percent) $tvaligne-=($tvaligne*$object->remise_percent)/100;
					if ($object->remise_percent) $localtax1ligne-=($localtax1ligne*$object->remise_percent)/100;
					if ($object->remise_percent) $localtax2ligne-=($localtax2ligne*$object->remise_percent)/100;

					$vatrate=(string) $object->lines[$i]->tva_tx;

					// Retrieve type from database for backward compatibility with old records
					if ((! isset($localtax1_type) || $localtax1_type=='' || ! isset($localtax2_type) || $localtax2_type=='') // if tax type not defined
					&& (! empty($localtax1_rate) || ! empty($localtax2_rate))) // and there is local tax
					{
						$localtaxtmp_array=getLocalTaxesFromRate($vatrate,0, $object->thirdparty, $mysoc);
						$localtax1_type = $localtaxtmp_array[0];
						$localtax2_type = $localtaxtmp_array[2];
					}

				    // retrieve global local tax
					if ($localtax1_type && $localtax1ligne != 0)
						$this->localtax1[$localtax1_type][$localtax1_rate]+=$localtax1ligne;
					if ($localtax2_type && $localtax2ligne != 0)
						$this->localtax2[$localtax2_type][$localtax2_rate]+=$localtax2ligne;

					if (($object->lines[$i]->info_bits & 0x01) == 0x01) $vatrate.='*';
					if (! isset($this->tva[$vatrate])) 				$this->tva[$vatrate]='';
					$this->tva[$vatrate] += $tvaligne;

					if ($posYAfterImage > $posYAfterDescription) $nexY=$posYAfterImage;

					// Add line
					if ($conf->global->MAIN_PDF_DASH_BETWEEN_LINES && $i < ($nblignes - 1))
					{
						$pdf->setPage($pageposafter);
						$pdf->SetLineStyle(array('dash'=>'1,1','color'=>array(210,210,210)));
						//$pdf->SetDrawColor(190,190,200);
						$pdf->line($this->marge_gauche, $nexY+1, $this->page_largeur - $this->marge_droite, $nexY+1);
						$pdf->SetLineStyle(array('dash'=>0));
					}

					$nexY+=2;    // Passe espace entre les lignes

					// Detect if some page were added automatically and output _tableau for past pages
					while ($pagenb < $pageposafter)
					{
						$pdf->setPage($pagenb);
						if ($pagenb == 1)
						{
							$this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1);
						}
						else
						{
							$this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1);
						}
						$this->_pagefoot($pdf,$object,$outputlangs,1);
						$pagenb++;
						$pdf->setPage($pagenb);
						$pdf->setPageOrientation('', 1, 0);	// The only function to edit the bottom margin of current page to set it.
						if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
					}
					if (isset($object->lines[$i+1]->pagebreak) && $object->lines[$i+1]->pagebreak)
					{
						if ($pagenb == 1)
						{
							$this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1);
						}
						else
						{
							$this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1);
						}
						$this->_pagefoot($pdf,$object,$outputlangs,1);
						// New page
						$pdf->AddPage();
						if (! empty($tplidx)) $pdf->useTemplate($tplidx);
						$pagenb++;
						if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs);
					}
				}

				// Show square
				if ($pagenb == 1)
				{
					$this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0);
					$bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1;
				}
				else
				{
					$this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0);
					$bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1;
				}

				// Affiche zone infos
				$posy=$this->_tableau_info($pdf, $object, $bottomlasttab, $outputlangs);

				// Affiche zone totaux
				$posy=$this->_tableau_tot($pdf, $object, $deja_regle, $bottomlasttab, $outputlangs);

				// Affiche zone versements
				if ($deja_regle || $amount_credit_notes_included || $amount_deposits_included)
				{
					$posy=$this->_tableau_versements($pdf, $object, $posy, $outputlangs);
				}

				// Pied de page
				$this->_pagefoot($pdf,$object,$outputlangs);
				if (method_exists($pdf,'AliasNbPages')) $pdf->AliasNbPages();

				$pdf->Close();

				$pdf->Output($file,'F');

				// Add pdfgeneration hook
				if (! is_object($hookmanager))
				{
					include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
					$hookmanager=new HookManager($this->db);
				}
				$hookmanager->initHooks(array('pdfgeneration'));
				$parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs);
				global $action;
				$reshook=$hookmanager->executeHooks('afterPDFCreation',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks

				if (! empty($conf->global->MAIN_UMASK))
				@chmod($file, octdec($conf->global->MAIN_UMASK));

				return 1;   // Pas d'erreur
			}
			else
			{
				$this->error=$langs->trans("ErrorCanNotCreateDir",$dir);
				return 0;
			}
		}
		else
		{
			$this->error=$langs->trans("ErrorConstantNotDefined","FAC_OUTPUTDIR");
			return 0;
		}
		$this->error=$langs->trans("ErrorUnknown");
		return 0;   // Erreur par defaut
	}


	/**
	 *  Show payments table
	 *
     *  @param	PDF			$pdf           Object PDF
     *  @param  Object		$object         Object invoice
     *  @param  int			$posy           Position y in PDF
     *  @param  Translate	$outputlangs    Object langs for output
     *  @return int             			<0 if KO, >0 if OK
	 */
	function _tableau_versements(&$pdf, $object, $posy, $outputlangs)
	{
		global $conf;

        $sign=1;
        if ($object->type == 2 && ! empty($conf->global->INVOICE_POSITIVE_CREDIT_NOTE)) $sign=-1;

        $tab3_posx = 120;
		$tab3_top = $posy + 8;
		$tab3_width = 80;
		$tab3_height = 4;
		if ($this->page_largeur < 210) // To work with US executive format
		{
			$tab3_posx -= 20;
		}

		$default_font_size = pdf_getPDFFontSizegr($outputlangs);

		$title=$outputlangs->transnoentities("PaymentsAlreadyDone");
		if ($object->type == 2) $title=$outputlangs->transnoentities("PaymentsBackAlreadyDone");

		$pdf->SetFont('','', $default_font_size - 3);
		$pdf->SetXY($tab3_posx, $tab3_top - 4);
		$pdf->MultiCell(60, 3, $title, 0, 'L', 0);

		$pdf->line($tab3_posx, $tab3_top, $tab3_posx+$tab3_width, $tab3_top);

		$pdf->SetFont('','', $default_font_size - 4);
		$pdf->SetXY($tab3_posx, $tab3_top);
		$pdf->MultiCell(20, 3, $outputlangs->transnoentities("Payment"), 0, 'L', 0);
		$pdf->SetXY($tab3_posx+21, $tab3_top);
		$pdf->MultiCell(20, 3, $outputlangs->transnoentities("Amount"), 0, 'L', 0);
		$pdf->SetXY($tab3_posx+40, $tab3_top);
		$pdf->MultiCell(20, 3, $outputlangs->transnoentities("Type"), 0, 'L', 0);
		$pdf->SetXY($tab3_posx+58, $tab3_top);
		$pdf->MultiCell(20, 3, $outputlangs->transnoentities("Num"), 0, 'L', 0);

		$pdf->line($tab3_posx, $tab3_top-1+$tab3_height, $tab3_posx+$tab3_width, $tab3_top-1+$tab3_height);

		$y=0;

		$pdf->SetFont('','', $default_font_size - 4);

		// Loop on each deposits and credit notes included
		$sql = "SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc,";
		$sql.= " re.description, re.fk_facture_source,";
		$sql.= " f.type, f.datef";
		$sql.= " FROM ".MAIN_DB_PREFIX ."societe_remise_except as re, ".MAIN_DB_PREFIX ."facture as f";
		$sql.= " WHERE re.fk_facture_source = f.rowid AND re.fk_facture = ".$object->id;
		$resql=$this->db->query($sql);
		if ($resql)
		{
			$num = $this->db->num_rows($resql);
			$i=0;
			$invoice=new Facture($this->db);
			while ($i < $num)
			{
				$y+=3;
				$obj = $this->db->fetch_object($resql);

				if ($obj->type == 2) $text=$outputlangs->trans("CreditNote");
				elseif ($obj->type == 3) $text=$outputlangs->trans("Deposit");
				else $text=$outputlangs->trans("UnknownType");

				$invoice->fetch($obj->fk_facture_source);

				$pdf->SetXY($tab3_posx, $tab3_top+$y);
				$pdf->MultiCell(20, 3, dol_print_date($obj->datef,'day',false,$outputlangs,true), 0, 'L', 0);
				$pdf->SetXY($tab3_posx+21, $tab3_top+$y);
				$pdf->MultiCell(20, 3, price($obj->amount_ttc, 0, $outputlangs), 0, 'L', 0);
				$pdf->SetXY($tab3_posx+40, $tab3_top+$y);
				$pdf->MultiCell(20, 3, $text, 0, 'L', 0);
				$pdf->SetXY($tab3_posx+58, $tab3_top+$y);
				$pdf->MultiCell(20, 3, $invoice->ref, 0, 'L', 0);

				$pdf->line($tab3_posx, $tab3_top+$y+3, $tab3_posx+$tab3_width, $tab3_top+$y+3);

				$i++;
			}
		}
		else
		{
			$this->error=$this->db->lasterror();
			dol_syslog($this->db,$this->error, LOG_ERR);
			return -1;
		}

		// Loop on each payment
		$sql = "SELECT p.datep as date, p.fk_paiement as type, p.num_paiement as num, pf.amount as amount,";
		$sql.= " cp.code";
		$sql.= " FROM ".MAIN_DB_PREFIX."paiement_facture as pf, ".MAIN_DB_PREFIX."paiement as p";
		$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as cp ON p.fk_paiement = cp.id";
		$sql.= " WHERE pf.fk_paiement = p.rowid AND pf.fk_facture = ".$object->id;
		$sql.= " ORDER BY p.datep";
		$resql=$this->db->query($sql);
		if ($resql)
		{
			$num = $this->db->num_rows($resql);
			$i=0;
			while ($i < $num) {
				$y+=3;
				$row = $this->db->fetch_object($resql);

				$pdf->SetXY($tab3_posx, $tab3_top+$y);
				$pdf->MultiCell(20, 3, dol_print_date($this->db->jdate($row->date),'day',false,$outputlangs,true), 0, 'L', 0);
				$pdf->SetXY($tab3_posx+21, $tab3_top+$y);
				$pdf->MultiCell(20, 3, price($sign * $row->amount, 0, $outputlangs), 0, 'L', 0);
				$pdf->SetXY($tab3_posx+40, $tab3_top+$y);
				$oper = $outputlangs->transnoentitiesnoconv("PaymentTypeShort" . $row->code);

				$pdf->MultiCell(20, 3, $oper, 0, 'L', 0);
				$pdf->SetXY($tab3_posx+58, $tab3_top+$y);
				$pdf->MultiCell(30, 3, $row->num, 0, 'L', 0);

				$pdf->line($tab3_posx, $tab3_top+$y+3, $tab3_posx+$tab3_width, $tab3_top+$y+3);

				$i++;
			}
		}
		else
		{
			$this->error=$this->db->lasterror();
			dol_syslog($this->db,$this->error, LOG_ERR);
			return -1;
		}

	}


	/**
	 *   Show miscellaneous information (payment mode, payment term, ...)
	 *
	 *   @param		PDF			$pdf     		Object PDF
	 *   @param		Object		$object			Object to show
	 *   @param		int			$posy			Y
	 *   @param		Translate	$outputlangs	Langs object
	 *   @return	void
	 */
	function _tableau_info(&$pdf, $object, $posy, $outputlangs)
	{
		global $conf;

		$default_font_size = pdf_getPDFFontSizegr($outputlangs);

		$pdf->SetFont('','', $default_font_size - 1);

		// If France, show VAT mention if not applicable
		if ($this->emetteur->country_code == 'FR' && $this->franchise == 1)
		{
			$pdf->SetFont('','B', $default_font_size - 2);
			$pdf->SetXY($this->marge_gauche, $posy);
			$pdf->MultiCell(100, 3, $outputlangs->transnoentities("VATIsNotUsedForInvoice"), 0, 'L', 0);

			$posy=$pdf->GetY()+4;
		}

		$posxval=52;

		// Show payments conditions
		if ($object->type != 2 && ($object->cond_reglement_code || $object->cond_reglement))
		{
			$pdf->SetFont('','B', $default_font_size - 2);
			$pdf->SetXY($this->marge_gauche, $posy);
			$titre = $outputlangs->transnoentities("PaymentConditions").':';
			$pdf->MultiCell(80, 4, $titre, 0, 'L');

			$pdf->SetFont('','', $default_font_size - 2);
			$pdf->SetXY($posxval, $posy);
			$lib_condition_paiement=$outputlangs->transnoentities("PaymentCondition".$object->cond_reglement_code)!=('PaymentCondition'.$object->cond_reglement_code)?$outputlangs->transnoentities("PaymentCondition".$object->cond_reglement_code):$outputlangs->convToOutputCharset($object->cond_reglement_doc);
			$lib_condition_paiement=str_replace('\n',"\n",$lib_condition_paiement);
			$pdf->MultiCell(80, 4, $lib_condition_paiement,0,'L');

			$posy=$pdf->GetY()+3;
		}

		if ($object->type != 2)
		{
			// Check a payment mode is defined
			if (empty($object->mode_reglement_code)
			&& empty($conf->global->FACTURE_CHQ_NUMBER)
			&& empty($conf->global->FACTURE_RIB_NUMBER))
			{
				$this->error = $outputlangs->transnoentities("ErrorNoPaiementModeConfigured");
			}
			// Avoid having any valid PDF with setup that is not complete
			elseif (($object->mode_reglement_code == 'CHQ' && empty($conf->global->FACTURE_CHQ_NUMBER) && empty($object->fk_account) && empty($object->fk_bank))
				|| ($object->mode_reglement_code == 'VIR' && empty($conf->global->FACTURE_RIB_NUMBER) && empty($object->fk_account) && empty($object->fk_bank)))
			{
				$outputlangs->load("errors");

				$pdf->SetXY($this->marge_gauche, $posy);
				$pdf->SetTextColor(200,0,0);
				$pdf->SetFont('','B', $default_font_size - 2);
				$this->error = $outputlangs->transnoentities("ErrorPaymentModeDefinedToWithoutSetup",$object->mode_reglement_code);
				$pdf->MultiCell(80, 3, $this->error,0,'L',0);
				$pdf->SetTextColor(0,0,0);

				$posy=$pdf->GetY()+1;
			}

			// Show payment mode
			if ($object->mode_reglement_code
			&& $object->mode_reglement_code != 'CHQ'
			&& $object->mode_reglement_code != 'VIR')
			{
				$pdf->SetFont('','B', $default_font_size - 2);
				$pdf->SetXY($this->marge_gauche, $posy);
				$titre = $outputlangs->transnoentities("PaymentMode").':';
				$pdf->MultiCell(80, 5, $titre, 0, 'L');

				$pdf->SetFont('','', $default_font_size - 2);
				$pdf->SetXY($posxval, $posy);
				$lib_mode_reg=$outputlangs->transnoentities("PaymentType".$object->mode_reglement_code)!=('PaymentType'.$object->mode_reglement_code)?$outputlangs->transnoentities("PaymentType".$object->mode_reglement_code):$outputlangs->convToOutputCharset($object->mode_reglement);
				$pdf->MultiCell(80, 5, $lib_mode_reg,0,'L');

				$posy=$pdf->GetY()+2;
			}

			// Show payment mode CHQ
			if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'CHQ')
			{
				// Si mode reglement non force ou si force a CHQ
				if (! empty($conf->global->FACTURE_CHQ_NUMBER))
				{
					$diffsizetitle=(empty($conf->global->PDF_DIFFSIZE_TITLE)?3:$conf->global->PDF_DIFFSIZE_TITLE);

					if ($conf->global->FACTURE_CHQ_NUMBER > 0)
					{
						$account = new Account($this->db);
						$account->fetch($conf->global->FACTURE_CHQ_NUMBER);

						$pdf->SetXY($this->marge_gauche, $posy);
						$pdf->SetFont('','B', $default_font_size - $diffsizetitle);
						$pdf->MultiCell(100, 3, $outputlangs->transnoentities('PaymentByChequeOrderedTo',$account->proprio),0,'L',0);
						$posy=$pdf->GetY()+1;

			            if (empty($conf->global->MAIN_PDF_HIDE_CHQ_ADDRESS))
			            {
							$pdf->SetXY($this->marge_gauche, $posy);
							$pdf->SetFont('','', $default_font_size - $diffsizetitle);
							$pdf->MultiCell(100, 3, $outputlangs->convToOutputCharset($account->owner_address), 0, 'L', 0);
							$posy=$pdf->GetY()+2;
			            }
					}
					if ($conf->global->FACTURE_CHQ_NUMBER == -1)
					{
						$pdf->SetXY($this->marge_gauche, $posy);
						$pdf->SetFont('','B', $default_font_size - $diffsizetitle);
						$pdf->MultiCell(100, 3, $outputlangs->transnoentities('PaymentByChequeOrderedTo',$this->emetteur->name),0,'L',0);
						$posy=$pdf->GetY()+1;

			            if (empty($conf->global->MAIN_PDF_HIDE_CHQ_ADDRESS))
			            {
							$pdf->SetXY($this->marge_gauche, $posy);
							$pdf->SetFont('','', $default_font_size - $diffsizetitle);
							$pdf->MultiCell(100, 3, $outputlangs->convToOutputCharset($this->emetteur->getFullAddress()), 0, 'L', 0);
							$posy=$pdf->GetY()+2;
			            }
					}
				}
			}

			// If payment mode not forced or forced to VIR, show payment with BAN
			if (empty($object->mode_reglement_code) || $object->mode_reglement_code == 'VIR')
			{
				if (! empty($object->fk_account) || ! empty($object->fk_bank) || ! empty($conf->global->FACTURE_RIB_NUMBER))
				{
					$bankid=(empty($object->fk_account)?$conf->global->FACTURE_RIB_NUMBER:$object->fk_account);
					if (! empty($object->fk_bank)) $bankid=$object->fk_bank;   // For backward compatibility when object->fk_account is forced with object->fk_bank
					$account = new Account($this->db);
					$account->fetch($bankid);

					$curx=$this->marge_gauche;
					$cury=$posy;

					$posy=pdf_bankgr($pdf,$outputlangs,$curx,$cury,$account,0,$default_font_size);

					$posy+=2;
				}
			}
		}

		return $posy;
	}


	/**
	 *	Show total to pay
	 *
	 *	@param	PDF			$pdf           Object PDF
	 *	@param  Facture		$object         Object invoice
	 *	@param  int			$deja_regle     Montant deja regle
	 *	@param	int			$posy			Position depart
	 *	@param	Translate	$outputlangs	Objet langs
	 *	@return int							Position pour suite
	 */
	function _tableau_tot(&$pdf, $object, $deja_regle, $posy, $outputlangs)
	{
		global $conf,$mysoc;

        $sign=1;
        if ($object->type == 2 && ! empty($conf->global->INVOICE_POSITIVE_CREDIT_NOTE)) $sign=-1;

        $default_font_size = pdf_getPDFFontSizegr($outputlangs);

		$tab2_top = $posy;
		$tab2_hl = 4;
		$pdf->SetFont('','', $default_font_size - 1);

		// Tableau total
		$col1x = 120; $col2x = 170;
		if ($this->page_largeur < 210) // To work with US executive format
		{
			$col2x-=20;
		}
		$largcol2 = ($this->page_largeur - $this->marge_droite - $col2x);

		$useborder=0;
		$index = 0;

		// Total HT
		$pdf->SetFillColor(255,255,255);
		$pdf->SetXY($col1x, $tab2_top + 0);
		$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalHT"), 0, 'L', 1);
		$pdf->SetXY($col2x, $tab2_top + 0);
		$pdf->MultiCell($largcol2, $tab2_hl, price($sign * ($object->total_ht + (! empty($object->remise)?$object->remise:0)), 0, $outputlangs), 0, 'R', 1);

		// Show VAT by rates and total
		$pdf->SetFillColor(248,248,248);

		$this->atleastoneratenotnull=0;
		if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT))
		{
			$tvaisnull=((! empty($this->tva) && count($this->tva) == 1 && isset($this->tva['0.000']) && is_float($this->tva['0.000'])) ? true : false);
			if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_ISNULL) && $tvaisnull)
			{
				// Nothing to do
			}
			else
			{
				//Local tax 1 before VAT
				//if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on')
				//{
					foreach( $this->localtax1 as $localtax_type => $localtax_rate )
					{
						if (in_array((string) $localtax_type, array('1','3','5','7'))) continue;

						foreach( $localtax_rate as $tvakey => $tvaval )
						{
							if ($tvakey!=0)    // On affiche pas taux 0
							{
								//$this->atleastoneratenotnull++;

								$index++;
								$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);

								$tvacompl='';
								if (preg_match('/\*/',$tvakey))
								{
									$tvakey=str_replace('*','',$tvakey);
									$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
								}

								$totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' ';
								$totalvat.=vatrate(abs($tvakey),1).$tvacompl;
								$pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1);

								$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
								$pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1);
							}
						}
					}
	      		//}
				//Local tax 2 before VAT
				//if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on')
				//{
					foreach( $this->localtax2 as $localtax_type => $localtax_rate )
					{
						if (in_array((string) $localtax_type, array('1','3','5','7'))) continue;

						foreach( $localtax_rate as $tvakey => $tvaval )
						{
							if ($tvakey!=0)    // On affiche pas taux 0
							{
								//$this->atleastoneratenotnull++;



								$index++;
								$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);

								$tvacompl='';
								if (preg_match('/\*/',$tvakey))
								{
									$tvakey=str_replace('*','',$tvakey);
									$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
								}
								$totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' ';
								$totalvat.=vatrate(abs($tvakey),1).$tvacompl;
								$pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1);

								$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
								$pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1);

							}
						}
					}
				//}
				// VAT
				foreach($this->tva as $tvakey => $tvaval)
				{
					if ($tvakey > 0)    // On affiche pas taux 0
					{
						$this->atleastoneratenotnull++;

						$index++;
						$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);

						$tvacompl='';
						if (preg_match('/\*/',$tvakey))
						{
							$tvakey=str_replace('*','',$tvakey);
							$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
						}
						$totalvat =$outputlangs->transnoentities("TotalVAT").' ';
						$totalvat.=vatrate($tvakey,1).$tvacompl;
						$pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1);

						$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
						$pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1);
					}
				}

				//Local tax 1 after VAT
				//if (! empty($conf->global->FACTURE_LOCAL_TAX1_OPTION) && $conf->global->FACTURE_LOCAL_TAX1_OPTION=='localtax1on')
				//{
					foreach( $this->localtax1 as $localtax_type => $localtax_rate )
					{
						if (in_array((string) $localtax_type, array('2','4','6'))) continue;

						foreach( $localtax_rate as $tvakey => $tvaval )
						{
							if ($tvakey != 0)    // On affiche pas taux 0
							{
								//$this->atleastoneratenotnull++;

								$index++;
								$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);

								$tvacompl='';
								if (preg_match('/\*/',$tvakey))
								{
									$tvakey=str_replace('*','',$tvakey);
									$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
								}
								$totalvat = $outputlangs->transcountrynoentities("TotalLT1",$mysoc->country_code).' ';
								$totalvat.=vatrate(abs($tvakey),1).$tvacompl;

								$pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1);
								$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
								$pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1);
							}
						}
					}
	      		//}
				//Local tax 2 after VAT
				//if (! empty($conf->global->FACTURE_LOCAL_TAX2_OPTION) && $conf->global->FACTURE_LOCAL_TAX2_OPTION=='localtax2on')
				//{
					foreach( $this->localtax2 as $localtax_type => $localtax_rate )
					{
						if (in_array((string) $localtax_type, array('2','4','6'))) continue;

						foreach( $localtax_rate as $tvakey => $tvaval )
						{
						    // retrieve global local tax
							if ($tvakey != 0)    // On affiche pas taux 0
							{
								//$this->atleastoneratenotnull++;

								$index++;
								$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);

								$tvacompl='';
								if (preg_match('/\*/',$tvakey))
								{
									$tvakey=str_replace('*','',$tvakey);
									$tvacompl = " (".$outputlangs->transnoentities("NonPercuRecuperable").")";
								}
								$totalvat = $outputlangs->transcountrynoentities("TotalLT2",$mysoc->country_code).' ';

								$totalvat.=vatrate(abs($tvakey),1).$tvacompl;
								$pdf->MultiCell($col2x-$col1x, $tab2_hl, $totalvat, 0, 'L', 1);

								$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
								$pdf->MultiCell($largcol2, $tab2_hl, price($tvaval, 0, $outputlangs), 0, 'R', 1);
							}
						}
					//}
				}

				// Revenue stamp
				if (price2num($object->revenuestamp) != 0)
				{
					$index++;
					$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
					$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("RevenueStamp"), $useborder, 'L', 1);

					$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
					$pdf->MultiCell($largcol2, $tab2_hl, price($sign * $object->revenuestamp), $useborder, 'R', 1);
				}

				// Total TTC
				$index++;
				$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
				$pdf->SetTextColor(0,0,60);
				$pdf->SetFillColor(224,224,224);
				$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("TotalTTC"), $useborder, 'L', 1);

				$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
				$pdf->MultiCell($largcol2, $tab2_hl, price($sign * $object->total_ttc, 0, $outputlangs), $useborder, 'R', 1);
			}
		}

		$pdf->SetTextColor(0,0,0);

		$creditnoteamount=$object->getSumCreditNotesUsed();
		$depositsamount=$object->getSumDepositsUsed();
		//print "x".$creditnoteamount."-".$depositsamount;exit;
		$resteapayer = price2num($object->total_ttc - $deja_regle - $creditnoteamount - $depositsamount, 'MT');
		if ($object->paye) $resteapayer=0;

		if ($deja_regle > 0 || $creditnoteamount > 0 || $depositsamount > 0)
		{
			// Already paid + Deposits
			$index++;
			$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
			$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("Paid"), 0, 'L', 0);
			$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
			$pdf->MultiCell($largcol2, $tab2_hl, price($deja_regle + $depositsamount, 0, $outputlangs), 0, 'R', 0);

			// Credit note
			if ($creditnoteamount)
			{
				$index++;
				$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
				$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("CreditNotes"), 0, 'L', 0);
				$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
				$pdf->MultiCell($largcol2, $tab2_hl, price($creditnoteamount, 0, $outputlangs), 0, 'R', 0);
			}

			// Escompte
			if ($object->close_code == Facture::CLOSECODE_DISCOUNTVAT)
			{
				$index++;
				$pdf->SetFillColor(255,255,255);

				$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
				$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("EscompteOfferedShort"), $useborder, 'L', 1);
				$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
				$pdf->MultiCell($largcol2, $tab2_hl, price($object->total_ttc - $deja_regle - $creditnoteamount - $depositsamount, 0, $outputlangs), $useborder, 'R', 1);

				$resteapayer=0;
			}

			$index++;
			$pdf->SetTextColor(0,0,60);
			$pdf->SetFillColor(224,224,224);
			$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
			$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("RemainderToPay"), $useborder, 'L', 1);
			$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
			$pdf->MultiCell($largcol2, $tab2_hl, price($resteapayer, 0, $outputlangs), $useborder, 'R', 1);

			// Fin
			$pdf->SetFont('','', $default_font_size - 1);
			$pdf->SetTextColor(0,0,0);
		}

		$index++;
		return ($tab2_top + ($tab2_hl * $index));
	}

	/**
	 *   Show table for lines
	 *
	 *   @param		PDF			$pdf     		Object PDF
	 *   @param		string		$tab_top		Top position of table
	 *   @param		string		$tab_height		Height of table (rectangle)
	 *   @param		int			$nexY			Y (not used)
	 *   @param		Translate	$outputlangs	Langs object
	 *   @param		int			$hidetop		1=Hide top bar of array and title, 0=Hide nothing, -1=Hide only title
	 *   @param		int			$hidebottom		Hide bottom bar of array
	 *   @return	void
	 */
	function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop=0, $hidebottom=0)
	{
		global $conf;

		// Force to disable hidetop and hidebottom
		$hidebottom=0;
		if ($hidetop) $hidetop=-1;

		$default_font_size = pdf_getPDFFontSizegr($outputlangs);

		// Amount in (at tab_top - 1)
		$pdf->SetTextColor(0,0,0);
		$pdf->SetFont('','', $default_font_size - 2);

		if (empty($hidetop))
		{
			$titre = $outputlangs->transnoentities("AmountInCurrency",$outputlangs->transnoentitiesnoconv("Currency".$conf->currency));
			$pdf->SetXY($this->page_largeur - $this->marge_droite - ($pdf->GetStringWidth($titre) + 3), $tab_top-4);
			$pdf->MultiCell(($pdf->GetStringWidth($titre) + 3), 2, $titre);

			$conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR='230,230,230';
			if (! empty($conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR)) $pdf->Rect($this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_droite-$this->marge_gauche, 5, 'F', null, explode(',',$conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR));
		}

		$pdf->SetDrawColor(128,128,128);
		$pdf->SetFont('','', $default_font_size - 1);

		// Output Rect
		$this->printRect($pdf,$this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $tab_height, $hidetop, $hidebottom);	// Rect prend une longueur en 3eme param et 4eme param

		if (empty($hidetop))
		{
			$pdf->line($this->marge_gauche, $tab_top+5, $this->page_largeur-$this->marge_droite, $tab_top+5);	// line prend une position y en 2eme param et 4eme param

			$pdf->SetXY($this->posxdesc-1, $tab_top+1);
			$pdf->MultiCell(108,2, $outputlangs->transnoentities("RefPrgr"),'','L');

                        $pdf->SetXY($this->posxdesc-1, $tab_top+1);
			$pdf->MultiCell(108,2, $outputlangs->transnoentities("Designation"),'','C');
		}

		if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT))
		{
			$pdf->line($this->posxtva-1, $tab_top, $this->posxtva-1, $tab_top + $tab_height);
			if (empty($hidetop))
			{
				$pdf->SetXY($this->posxtva-3, $tab_top+1);
				$pdf->MultiCell($this->posxup-$this->posxtva+3,2, $outputlangs->transnoentities("VAT"),'','C');
			}
		}

		$pdf->line($this->posxup-1, $tab_top, $this->posxup-1, $tab_top + $tab_height);
		if (empty($hidetop))
		{
			$pdf->SetXY($this->posxup-1, $tab_top+1);
			$pdf->MultiCell($this->posxqty-$this->posxup-1,2, $outputlangs->transnoentities("PriceUHT"),'','C');
		}

		$pdf->line($this->posxqty-1, $tab_top, $this->posxqty-1, $tab_top + $tab_height);
		if (empty($hidetop))
		{
			$pdf->SetXY($this->posxqty-1, $tab_top+1);
			if($conf->global->PRODUCT_USE_UNITS)
			{
				$pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C');
			}
			else
			{
				$pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C');
			}
		}

		if($conf->global->PRODUCT_USE_UNITS) {
			$pdf->line($this->posxunit - 1, $tab_top, $this->posxunit - 1, $tab_top + $tab_height);
			if (empty($hidetop)) {
				$pdf->SetXY($this->posxunit - 1, $tab_top + 1);
				$pdf->MultiCell($this->posxdiscount - $this->posxunit - 1, 2, $outputlangs->transnoentities("Unitgr"), '',
					'C');
			}
		}

		$pdf->line($this->posxdiscount-1, $tab_top, $this->posxdiscount-1, $tab_top + $tab_height);
		if (empty($hidetop))
		{
			if ($this->atleastonediscount)
			{
				$pdf->SetXY($this->posxdiscount-1, $tab_top+1);
				$pdf->MultiCell($this->postotalht-$this->posxdiscount+1,2, $outputlangs->transnoentities("ReductionShort"),'','C');
			}
		}
		if ($this->atleastonediscount)
		{
			$pdf->line($this->postotalht, $tab_top, $this->postotalht, $tab_top + $tab_height);
		}
		if (empty($hidetop))
		{
                        $pdf->SetFont('','',$default_font_size - 2);
			$pdf->SetXY($this->postotalht-1, $tab_top+1);
			$pdf->MultiCell(27,2, $outputlangs->transnoentities("TotalHT"),'','R');
		}
	}


	/**
	 *  Show top header of page.
	 *
	 *  @param	PDF			$pdf     		Object PDF
	 *  @param  Object		$object     	Object to show
	 *  @param  int	    	$showaddress    0=no, 1=yes
	 *  @param  Translate	$outputlangs	Object lang for output
	 *  @return	void
	 */
	function _pagehead(&$pdf, $object, $showaddress, $outputlangs)
	{
		global $conf,$langs;

		$outputlangs->load("main");
		$outputlangs->load("bills");
		$outputlangs->load("propal");
		$outputlangs->load("companies");
                $outputlangs->load("invoicegr@invoicegr");

		$default_font_size = pdf_getPDFFontSizegr($outputlangs);

		pdf_pageheadgr($pdf,$outputlangs,$this->page_hauteur);

		// Show Draft Watermark
		if($object->statut==0 && (! empty($conf->global->FACTURE_DRAFT_WATERMARK)) )
        {
		      pdf_watermarkgr($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',$conf->global->FACTURE_DRAFT_WATERMARK);
        }

		$pdf->SetTextColor(0,0,60);
		$pdf->SetFont('','B', $default_font_size + 3);

		$w = 110;

		$posy=$this->marge_haute;
        $posx=$this->page_largeur-$this->marge_droite-100;

		$pdf->SetXY($this->marge_gauche,$posy);

		// Logo
		$logo=$conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo;
		if ($this->emetteur->logo)
		{
			if (is_readable($logo))
			{
			    $height=pdf_getHeightForLogogr($logo);
				$pdf->Image($logo, $this->marge_gauche, $posy, 0, $height=16);	// width=0 (auto)
			}
			else
			{
				$pdf->SetTextColor(200,0,0);
				$pdf->SetFont('','B',$default_font_size - 2);
				$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound",$logo), 0, 'L');
				$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
			}
		}
		else
		{
			$text=$this->emetteur->name;
			$pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
		}

		
               // $pdf->SetFont('','', $default_font_size - 2);
		//$pdf->SetXY($posx,$posy-5);
		//$pdf->SetXY($posx,$posy);
		//$pdf->SetTextColor(0,0,0);
		//$pdf->MultiCell(100, 4, $outputlangs->transnoentities("Elementsinv").":", 0, 'L');


			//$pdf->SetFont('','', $default_font_size - 2);
			//$pdf->SetXY($posx,$posy-5);
			//$pdf->MultiCell(66,5, $outputlangs->transnoentities("BillFrom").":", 0, 'L');
			//$pdf->SetXY($posx,$posy);
			//$pdf->SetFillColor(230,230,230);
			//$pdf->MultiCell(82, $hautcadre, "", 0, 'R', 1);
			//$pdf->SetTextColor(0,0,60);

                $pdf->SetFont('','B', $default_font_size + 0);
                $posy+=35; 
		$pdf->SetXY($posx,$posy);
		$pdf->SetTextColor(0,0,0);
		$title=$outputlangs->transnoentities("Invoicegr");
		if ($object->type == 1) $title=$outputlangs->transnoentities("InvoiceReplacement");
		if ($object->type == 2) $title=$outputlangs->transnoentities("InvoiceAvoir");
		if ($object->type == 3) $title=$outputlangs->transnoentities("InvoiceDeposit");
		if ($object->type == 4) $title=$outputlangs->transnoentities("InvoiceProFormat");
		$pdf->MultiCell(100, 3, $title, '', 'L');
                $pdf->SetFont('','', $default_font_size - 2);
                $pdf->SetXY($posx,$posy-8);
                $pdf->MultiCell(66, 5, $outputlangs->transnoentities("Elementsinv").":", 0, 'L');

                $pdf->RoundedRect(98, 42, 102, 40, 6.50,  '');

		$pdf->SetFont('','',$default_font_size);

		$posy+=5;
		$pdf->SetXY($posx,$posy);
		$pdf->SetTextColor(0,0,0);
		$pdf->MultiCell(100, 4, $outputlangs->transnoentities("Refgr").": " . $outputlangs->convToOutputCharset($object->ref), '', 'L');

                           
		$posy+=1;
		$pdf->SetFont('','', $default_font_size - 0);


		if ($object->ref_client)
		{
			$posy+=4;
			$pdf->SetXY($posx,$posy);
			$pdf->SetTextColor(0,0,0);
			$pdf->MultiCell(100, 3, $outputlangs->transnoentities("RefCustomer").": " . $outputlangs->convToOutputCharset($object->ref_client), '', 'L');
		}

		$objectidnext=$object->getIdReplacingInvoice('validated');
		if ($object->type == 0 && $objectidnext)
		{
			$objectreplacing=new Facture($this->db);
			$objectreplacing->fetch($objectidnext);

			$posy+=3;
			$pdf->SetXY($posx,$posy);
			$pdf->SetTextColor(0,0,0);
			$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ReplacementByInvoice").': '.$outputlangs->convToOutputCharset($objectreplacing->ref), '', 'L');
		}
		if ($object->type == 1)
		{
			$objectreplaced=new Facture($this->db);
			$objectreplaced->fetch($object->fk_facture_source);

			$posy+=4;
			$pdf->SetXY($posx,$posy);
			$pdf->SetTextColor(0,0,0);
			$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ReplacementInvoice").': '.$outputlangs->convToOutputCharset($objectreplaced->ref), '', 'L');
		}
		if ($object->type == 2)
		{
			$objectreplaced=new Facture($this->db);
			$objectreplaced->fetch($object->fk_facture_source);

			$posy+=3;
			$pdf->SetXY($posx,$posy);
			$pdf->SetTextColor(0,0,0);
			$pdf->MultiCell(100, 3, $outputlangs->transnoentities("CorrectionInvoice").': '.$outputlangs->convToOutputCharset($objectreplaced->ref), '', 'L');
		}


                        $posy+=4;
			$pdf->SetXY($posx,$posy-1);
			$pdf->SetTextColor(0,0,0);
                        $pdf->MultiCell(100, 3, $outputlangs->transnoentities("Timegr").": " . $outputlangs->convToOutputCharset(! empty($object->date_creation)?dol_print_date($object->date_creation,'hour'):''), '', 'L');

		        $posy+=3;
		        $pdf->SetXY($posx,$posy);
		        $pdf->SetTextColor(0,0,0);
		        $pdf->MultiCell(100, 3, $outputlangs->transnoentities("DateInvoicegr").": " . dol_print_date($object->date,"day",false,$outputlangs), '', 'L');


		

		if ($object->thirdparty->code_client)
		{
			$posy+=4;
			$pdf->SetXY($posx,$posy);
			$pdf->SetTextColor(0,0,0);
			$pdf->MultiCell(100, 3, $outputlangs->transnoentities("CustomerCode").": " . $outputlangs->transnoentities($object->thirdparty->code_client), '', 'L');
		}

		$posy+=1;

		// Show list of linked objects
		$posy = pdf_writeLinkedObjectsgr($pdf, $object, $outputlangs, $posx, $posy, 100, 3, 'L', $default_font_size);

		if ($showaddress)
		{
			// Sender properties
			$carac_emetteur = pdf_build_addressgr($outputlangs,$this->emetteur);

			// Show sender
			$posy=5;
			//$posx=$this->marge_gauche;
                        $posx=118;
			if (! empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx=$this->page_largeur-$this->marge_droite-80;
			$hautcadre=32;

			// Show sender frame
			$pdf->SetTextColor(0,0,0);
			$pdf->SetFont('','', $default_font_size - 1);
			$pdf->SetXY($posx-22,$posy);
			//$pdf->MultiCell(66,5, $outputlangs->transnoentities("BillFrom").":", 0, 'L');
			//$pdf->SetXY($posx,$posy);
			$pdf->SetFillColor(255,255,255);
			$pdf->MultiCell(182, $hautcadre, "", 0, 'R', 1);
			$pdf->SetTextColor(0,0,60);

			// Show sender name
			$pdf->SetXY($posx-20,$posy+4);
			$pdf->SetFont('','B', $default_font_size - 1);
			$pdf->MultiCell(80, 4, $outputlangs->convToOutputCharset($this->emetteur->name), 0, 'L');
			$posy=$pdf->getY();

			// Show sender information
			$pdf->SetXY($posx-20,$posy);
			$pdf->SetFont('','', $default_font_size - 1);
			$pdf->MultiCell(95, 4, $carac_emetteur, 0, 'L');
			



			// If BILLING contact defined on invoice, we use it
			$usecontact=false;
			$arrayidcontact=$object->getIdContact('external','BILLING');
			if (count($arrayidcontact) > 0)
			{
				$usecontact=true;
				$result=$object->fetch_contact($arrayidcontact[0]);
			}

			//Recipient name
			// On peut utiliser le nom de la societe du contact
			if ($usecontact && !empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT)) {
				$thirdparty = $object->contact;
			} else {
				$thirdparty = $object->thirdparty;
			}

			$carac_client_name= pdfBuildThirdpartyName($thirdparty, $outputlangs);

			$carac_client=pdf_build_address($outputlangs,$this->emetteur,$object->thirdparty,($usecontact?$object->contact:''),$usecontact,'target',$object);

			// Show recipient
			$widthrecbox=80;
			//if ($this->page_largeur < 210) $widthrecbox=84;	// To work with US executive format
			$posy=42;
			//$posx=$this->page_largeur-$this->marge_droite-$widthrecbox;
                        $posx=10;
                        $hautcadrec=40;
			if (! empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx=$this->marge_gauche;

			// Show recipient frame
			$pdf->SetTextColor(0,0,0);
			$pdf->SetFont('','', $default_font_size - 2);
			$pdf->SetXY($posx+2,$posy-5);
			$pdf->MultiCell($widthrecbox, 5, $outputlangs->transnoentities("BillTo").":",0,'L');
			$pdf->Rect($posx, $posy, $widthrecbox, $hautcadrec);

			// Show recipient name
			$pdf->SetXY($posx+2,$posy+3);
			$pdf->SetFont('','B', $default_font_size);
			$pdf->MultiCell($widthrecbox, 4, $carac_client_name, 0, 'L');

			// Show recipient information
			$pdf->SetFont('','', $default_font_size - 1);
			$pdf->SetXY($posx+2,$posy+10+(dol_nboflines_bis($carac_client_name,50)*4));
			$pdf->MultiCell($widthrecbox, 4, $carac_client, 0, 'L');

$pdf->SetFont('','', $default_font_size - 2);
$posx=105;
                $pdf->SetXY($posx,$posy+218);
                $pdf->MultiCell(66, 5, $outputlangs->transnoentities("Thetrad"), 0, 'C');

                $pdf->RoundedRect(118, 265, 40, 20, 3.50, '1111', '');

$pdf->SetFont('','', $default_font_size - 2);
$posx=147;
                $pdf->SetXY($posx,$posy+218);
                $pdf->MultiCell(66, 5, $outputlangs->transnoentities("Thereceipts"), 0, 'C');

                $pdf->RoundedRect(160, 265, 40, 20, 3.50, '1111', '');
		}

		$pdf->SetTextColor(0,0,0);
	}

	/**
	 *   	Show footer of page. Need this->emetteur object
     *
	 *   	@param	PDF			$pdf     			PDF
	 * 		@param	Object		$object				Object to show
	 *      @param	Translate	$outputlangs		Object lang for output
	 *      @param	int			$hidefreetext		1=Hide free text
	 *      @return	int								Return height of bottom margin including footer text
	 */
	function _pagefoot(&$pdf,$object,$outputlangs,$hidefreetext=0)
	{
		$showdetails=0;
		return pdf_pagefootgr($pdf,$outputlangs,'INVOICE_FREE_TEXT',$this->emetteur,$this->marge_basse,$this->marge_gauche,$this->page_hauteur,$object,$showdetails,$hidefreetext);
	}

}

at this point will I put this code?

any help??

This value how to put in code?

any help for this result.

Find total tva is total all tax.
How to find total tax 1 and total tax 2 result?

Hi

Insert this line for php, extract to manu values,but not find this.
Totaltax1 and totaltax2 .
you could help me with that?

Hi,

Can you post the result of var_dump($object); ?

object(Facture)#136 (106) { ["element"]=> string(7) "facture" ["table_element"]=> string(7) "facture" ["table_element_line"]=> string(10) "facturedet" ["fk_element"]=> string(10) "fk_facture" ["ismultientitymanaged":protected]=> int(1) ["picto"]=> string(4) "bill" ["table_ref_field":protected]=> string(9) "facnumber" ["socid"]=> string(4) "1101" ["author"]=> NULL ["fk_user_author"]=> NULL ["fk_user_valid"]=> NULL ["date"]=> int(1574640000) ["date_creation"]=> int(1574674607) ["date_validation"]=> int(1574640000) ["datem"]=> int(1574681815) ["ref_client"]=> string(12) "1411736/4579" ["ref_int"]=> NULL ["type"]=> string(1) "0" ["remise_absolue"]=> NULL ["remise_percent"]=> NULL ["total_ht"]=> string(11) "19.28000000" ["total_tva"]=> string(10) "2.98000000" ["total_ttc"]=> string(11) "22.26000000" ["revenuestamp"]=> string(10) "0.00000000" ["close_code"]=> NULL ["close_note"]=> NULL ["paye"]=> string(1) "0" ["fk_facture_source"]=> NULL ["linked_objects"]=> array(0) { } ["date_lim_reglement"]=> int(1574726400) ["cond_reglement_code"]=> string(5) "RECEP" ["mode_reglement_code"]=> string(4) "P144" ["fk_bank"]=> string(1) "1" ["products"]=> array(0) { } ["lines"]=> array(5) { [0]=> object(FactureLigne)#144 (103) { ["element"]=> string(10) "facturedet" ["table_element"]=> string(10) "facturedet" ["oldline"]=> NULL ["fk_facture"]=> string(3) "817" ["fk_parent_line"]=> NULL ["label"]=> string(58) "SugarCraft Μίνι Άστρο Κίτρινο 2cm 40τεμ" ["desc"]=> string(58) "SugarCraft Μίνι Άστρο Κίτρινο 2cm 40τεμ" ["localtax1_type"]=> string(1) "0" ["localtax2_type"]=> string(1) "0" ["fk_remise_except"]=> NULL ["rang"]=> string(1) "0" ["fk_fournprice"]=> NULL ["pa_ht"]=> string(10) "0.00000000" ["marge_tx"]=> string(0) "" ["marque_tx"]=> float(100) ["special_code"]=> string(1) "0" ["origin"]=> NULL ["origin_id"]=> NULL ["fk_code_ventilation"]=> int(0) ["date_start"]=> string(0) "" ["date_end"]=> string(0) "" ["ref"]=> string(10) "SC-E896068" ["product_ref"]=> string(10) "SC-E896068" ["libelle"]=> string(120) "SugarCraft Μίνι Άστρο Κίτρινο 2cm 40τεμ" ["product_label"]=> string(120) "SugarCraft Μίνι Άστρο Κίτρινο 2cm 40τεμ" ["product_desc"]=> string(231) "Άστρο Κίτρινο 3d 2cm. Τέλεια για τα Χριστουγεννιάτικα γλυκά σας, τουρτες, cupcakes και οτι αλλο φανταστείτε. Συσκευασία αφαλείας 40τμχ" ["skip_update_total"]=> NULL ["situation_percent"]=> string(3) "100" ["fk_prev_id"]=> NULL ["fk_multicurrency"]=> string(1) "0" ["multicurrency_code"]=> string(3) "EUR" ["multicurrency_subprice"]=> string(10) "1.45600000" ["multicurrency_total_ht"]=> string(10) "2.91000000" ["multicurrency_total_tva"]=> string(10) "0.38000000" ["multicurrency_total_ttc"]=> string(10) "3.29000000" ["qty"]=> string(1) "2" ["subprice"]=> string(10) "1.45600000" ["product_type"]=> string(1) "0" ["fk_product"]=> string(4) "1031" ["tva_tx"]=> string(6) "13.000" ["localtax1_tx"]=> string(5) "0.000" ["localtax2_tx"]=> string(5) "0.000" ["remise_percent"]=> string(1) "0" ["total_ht"]=> string(10) "2.91000000" ["total_tva"]=> string(10) "0.38000000" ["total_localtax1"]=> string(10) "0.00000000" ["total_localtax2"]=> string(10) "0.00000000" ["total_ttc"]=> string(10) "3.29000000" ["info_bits"]=> string(1) "0" ["id"]=> string(4) "3332" ["rowid"]=> string(4) "3332" ["fk_unit"]=> NULL ["db"]=> object(DoliDBMysqli)#27 (19) { ["db"]=> object(mysqli)#28 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(11) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(14) "5.5.62-cll-lve" ["server_version"]=> int(50562) ["stat"]=> string(153) "Uptime: 267923 Threads: 8 Questions: 154905929 Slow queries: 2162 Opens: 94596331 Flush tables: 1 Open tables: 600 Queries per second avg: 578.173" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(2792194) ["warning_count"]=> int(0) } ["type"]=> string(6) "mysqli" ["_results":"DoliDBMysqli":private]=> object(mysqli_result)#141 (5) { ["current_field"]=> int(0) ["field_count"]=> int(11) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } ["forcecharset"]=> string(4) "utf8" ["forcecollate"]=> string(15) "utf8_general_ci" ["connected"]=> bool(true) ["database_selected"]=> bool(true) ["database_name"]=> string(13) "siteview_doli" ["database_user"]=> string(13) "siteview_doli" ["database_host"]=> string(9) "localhost" ["database_port"]=> string(4) "3306" ["transaction_opened"]=> int(0) ["lastquery"]=> string(265) "SELECT price, price_ttc, price_min, price_min_ttc, price_base_type, tva_tx, default_vat_code, tosell, price_by_qty, rowid, recuperableonly FROM llx_product_price WHERE entity IN (1) AND price_level=3 AND fk_product = '1' ORDER BY date_price DESC, rowid DESC LIMIT 1" ["lastqueryerror"]=> NULL ["lasterror"]=> NULL ["lasterrno"]=> NULL ["ok"]=> bool(true) ["error"]=> NULL ["_results":"DoliDB":private]=> NULL } ["error"]=> NULL ["errors"]=> array(0) { } ["import_key"]=> NULL ["array_options"]=> array(0) { } ["linkedObjectsIds"]=> NULL ["linkedObjects"]=> NULL ["table_ref_field":protected]=> string(0) "" ["context"]=> array(0) { } ["canvas"]=> NULL ["project"]=> NULL ["fk_project"]=> NULL ["projet"]=> NULL ["contact"]=> NULL ["contact_id"]=> NULL ["thirdparty"]=> NULL ["user"]=> NULL ["ref_previous"]=> NULL ["ref_next"]=> NULL ["ref_ext"]=> NULL ["table_element_line"]=> NULL ["statut"]=> NULL ["country"]=> NULL ["country_id"]=> NULL ["country_code"]=> NULL ["barcode_type"]=> NULL ["barcode_type_code"]=> NULL ["barcode_type_label"]=> NULL ["barcode_type_coder"]=> NULL ["mode_reglement_id"]=> NULL ["cond_reglement_id"]=> NULL ["cond_reglement"]=> NULL ["fk_delivery_address"]=> NULL ["shipping_method_id"]=> NULL ["modelpdf"]=> NULL ["fk_account"]=> NULL ["note_public"]=> NULL ["note_private"]=> NULL ["note"]=> NULL ["lines"]=> NULL ["fk_incoterms"]=> NULL ["libelle_incoterms"]=> NULL ["location_incoterms"]=> NULL ["name"]=> NULL ["lastname"]=> NULL ["firstname"]=> NULL ["civility_id"]=> NULL ["description"]=> string(58) "SugarCraft Μίνι Άστρο Κίτρινο 2cm 40τεμ" ["fk_product_type"]=> string(1) "0" ["vat_src_code"]=> string(0) "" ["code_ventilation"]=> string(1) "0" } [1]=> object(FactureLigne)#137 (103) { ["element"]=> string(10) "facturedet" ["table_element"]=> string(10) "facturedet" ["oldline"]=> NULL ["fk_facture"]=> string(3) "817" ["fk_parent_line"]=> NULL ["label"]=> string(60) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο 65g" ["desc"]=> string(60) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο 65g" ["localtax1_type"]=> string(1) "0" ["localtax2_type"]=> string(1) "0" ["fk_remise_except"]=> NULL ["rang"]=> string(1) "0" ["fk_fournprice"]=> NULL ["pa_ht"]=> string(10) "0.00000000" ["marge_tx"]=> string(0) "" ["marque_tx"]=> float(100) ["special_code"]=> string(1) "0" ["origin"]=> NULL ["origin_id"]=> NULL ["fk_code_ventilation"]=> int(0) ["date_start"]=> string(0) "" ["date_end"]=> string(0) "" ["ref"]=> string(8) "SC-E3417" ["product_ref"]=> string(8) "SC-E3417" ["libelle"]=> string(120) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο 65g" ["product_label"]=> string(120) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο 65g" ["product_desc"]=> string(263) "Δεντράκι χριστουγεννιάτικο πράσινο. Τέλεια για τα Χριστουγεννιάτικα γλυκά σας, τουρτες, cupcakes και οτι αλλο φανταστείτε. Συσκευασία αφαλείας 65γρ" ["skip_update_total"]=> NULL ["situation_percent"]=> string(3) "100" ["fk_prev_id"]=> NULL ["fk_multicurrency"]=> string(1) "0" ["multicurrency_code"]=> string(3) "EUR" ["multicurrency_subprice"]=> string(10) "1.88800000" ["multicurrency_total_ht"]=> string(10) "1.89000000" ["multicurrency_total_tva"]=> string(10) "0.24000000" ["multicurrency_total_ttc"]=> string(10) "2.13000000" ["qty"]=> string(1) "1" ["subprice"]=> string(10) "1.88800000" ["product_type"]=> string(1) "0" ["fk_product"]=> string(4) "1240" ["tva_tx"]=> string(6) "13.000" ["localtax1_tx"]=> string(5) "0.000" ["localtax2_tx"]=> string(5) "0.000" ["remise_percent"]=> string(1) "0" ["total_ht"]=> string(10) "1.89000000" ["total_tva"]=> string(10) "0.24000000" ["total_localtax1"]=> string(10) "0.00000000" ["total_localtax2"]=> string(10) "0.00000000" ["total_ttc"]=> string(10) "2.13000000" ["info_bits"]=> string(1) "0" ["id"]=> string(4) "3333" ["rowid"]=> string(4) "3333" ["fk_unit"]=> NULL ["db"]=> object(DoliDBMysqli)#27 (19) { ["db"]=> object(mysqli)#28 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(11) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(14) "5.5.62-cll-lve" ["server_version"]=> int(50562) ["stat"]=> string(153) "Uptime: 267923 Threads: 8 Questions: 154905930 Slow queries: 2162 Opens: 94596334 Flush tables: 1 Open tables: 600 Queries per second avg: 578.173" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(2792194) ["warning_count"]=> int(0) } ["type"]=> string(6) "mysqli" ["_results":"DoliDBMysqli":private]=> object(mysqli_result)#141 (5) { ["current_field"]=> int(0) ["field_count"]=> int(11) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } ["forcecharset"]=> string(4) "utf8" ["forcecollate"]=> string(15) "utf8_general_ci" ["connected"]=> bool(true) ["database_selected"]=> bool(true) ["database_name"]=> string(13) "siteview_doli" ["database_user"]=> string(13) "siteview_doli" ["database_host"]=> string(9) "localhost" ["database_port"]=> string(4) "3306" ["transaction_opened"]=> int(0) ["lastquery"]=> string(265) "SELECT price, price_ttc, price_min, price_min_ttc, price_base_type, tva_tx, default_vat_code, tosell, price_by_qty, rowid, recuperableonly FROM llx_product_price WHERE entity IN (1) AND price_level=3 AND fk_product = '1' ORDER BY date_price DESC, rowid DESC LIMIT 1" ["lastqueryerror"]=> NULL ["lasterror"]=> NULL ["lasterrno"]=> NULL ["ok"]=> bool(true) ["error"]=> NULL ["_results":"DoliDB":private]=> NULL } ["error"]=> NULL ["errors"]=> array(0) { } ["import_key"]=> NULL ["array_options"]=> array(0) { } ["linkedObjectsIds"]=> NULL ["linkedObjects"]=> NULL ["table_ref_field":protected]=> string(0) "" ["context"]=> array(0) { } ["canvas"]=> NULL ["project"]=> NULL ["fk_project"]=> NULL ["projet"]=> NULL ["contact"]=> NULL ["contact_id"]=> NULL ["thirdparty"]=> NULL ["user"]=> NULL ["ref_previous"]=> NULL ["ref_next"]=> NULL ["ref_ext"]=> NULL ["table_element_line"]=> NULL ["statut"]=> NULL ["country"]=> NULL ["country_id"]=> NULL ["country_code"]=> NULL ["barcode_type"]=> NULL ["barcode_type_code"]=> NULL ["barcode_type_label"]=> NULL ["barcode_type_coder"]=> NULL ["mode_reglement_id"]=> NULL ["cond_reglement_id"]=> NULL ["cond_reglement"]=> NULL ["fk_delivery_address"]=> NULL ["shipping_method_id"]=> NULL ["modelpdf"]=> NULL ["fk_account"]=> NULL ["note_public"]=> NULL ["note_private"]=> NULL ["note"]=> NULL ["lines"]=> NULL ["fk_incoterms"]=> NULL ["libelle_incoterms"]=> NULL ["location_incoterms"]=> NULL ["name"]=> NULL ["lastname"]=> NULL ["firstname"]=> NULL ["civility_id"]=> NULL ["description"]=> string(60) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο 65g" ["fk_product_type"]=> string(1) "0" ["vat_src_code"]=> string(0) "" ["code_ventilation"]=> string(1) "0" } [2]=> object(FactureLigne)#143 (103) { ["element"]=> string(10) "facturedet" ["table_element"]=> string(10) "facturedet" ["oldline"]=> NULL ["fk_facture"]=> string(3) "817" ["fk_parent_line"]=> NULL ["label"]=> string(77) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο - Κοκκινό 60g" ["desc"]=> string(77) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο - Κοκκινό 60g" ["localtax1_type"]=> string(1) "0" ["localtax2_type"]=> string(1) "0" ["fk_remise_except"]=> NULL ["rang"]=> string(1) "0" ["fk_fournprice"]=> NULL ["pa_ht"]=> string(10) "0.00000000" ["marge_tx"]=> string(0) "" ["marque_tx"]=> float(100) ["special_code"]=> string(1) "0" ["origin"]=> NULL ["origin_id"]=> NULL ["fk_code_ventilation"]=> int(0) ["date_start"]=> string(0) "" ["date_end"]=> string(0) "" ["ref"]=> string(6) "SC-P13" ["product_ref"]=> string(6) "SC-P13" ["libelle"]=> string(165) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο - Κοκκινό 60g" ["product_label"]=> string(165) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο - Κοκκινό 60g" ["product_desc"]=> string(280) "Δεντράκι χριστουγεννιάτικο Πράσινο - Κόκκινο. Τέλεια για τα Χριστουγεννιάτικα γλυκά σας, τουρτες, cupcakes και οτι αλλο φανταστείτε. Συσκευασία αφαλείας 60γρ" ["skip_update_total"]=> NULL ["situation_percent"]=> string(3) "100" ["fk_prev_id"]=> NULL ["fk_multicurrency"]=> string(1) "0" ["multicurrency_code"]=> string(3) "EUR" ["multicurrency_subprice"]=> string(10) "2.00000000" ["multicurrency_total_ht"]=> string(10) "6.00000000" ["multicurrency_total_tva"]=> string(10) "0.78000000" ["multicurrency_total_ttc"]=> string(10) "6.78000000" ["qty"]=> string(1) "3" ["subprice"]=> string(10) "2.00000000" ["product_type"]=> string(1) "0" ["fk_product"]=> string(4) "1239" ["tva_tx"]=> string(6) "13.000" ["localtax1_tx"]=> string(5) "0.000" ["localtax2_tx"]=> string(5) "0.000" ["remise_percent"]=> string(1) "0" ["total_ht"]=> string(10) "6.00000000" ["total_tva"]=> string(10) "0.78000000" ["total_localtax1"]=> string(10) "0.00000000" ["total_localtax2"]=> string(10) "0.00000000" ["total_ttc"]=> string(10) "6.78000000" ["info_bits"]=> string(1) "0" ["id"]=> string(4) "3334" ["rowid"]=> string(4) "3334" ["fk_unit"]=> NULL ["db"]=> object(DoliDBMysqli)#27 (19) { ["db"]=> object(mysqli)#28 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(11) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(14) "5.5.62-cll-lve" ["server_version"]=> int(50562) ["stat"]=> string(153) "Uptime: 267923 Threads: 8 Questions: 154905931 Slow queries: 2162 Opens: 94596340 Flush tables: 1 Open tables: 600 Queries per second avg: 578.173" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(2792194) ["warning_count"]=> int(0) } ["type"]=> string(6) "mysqli" ["_results":"DoliDBMysqli":private]=> object(mysqli_result)#141 (5) { ["current_field"]=> int(0) ["field_count"]=> int(11) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } ["forcecharset"]=> string(4) "utf8" ["forcecollate"]=> string(15) "utf8_general_ci" ["connected"]=> bool(true) ["database_selected"]=> bool(true) ["database_name"]=> string(13) "siteview_doli" ["database_user"]=> string(13) "siteview_doli" ["database_host"]=> string(9) "localhost" ["database_port"]=> string(4) "3306" ["transaction_opened"]=> int(0) ["lastquery"]=> string(265) "SELECT price, price_ttc, price_min, price_min_ttc, price_base_type, tva_tx, default_vat_code, tosell, price_by_qty, rowid, recuperableonly FROM llx_product_price WHERE entity IN (1) AND price_level=3 AND fk_product = '1' ORDER BY date_price DESC, rowid DESC LIMIT 1" ["lastqueryerror"]=> NULL ["lasterror"]=> NULL ["lasterrno"]=> NULL ["ok"]=> bool(true) ["error"]=> NULL ["_results":"DoliDB":private]=> NULL } ["error"]=> NULL ["errors"]=> array(0) { } ["import_key"]=> NULL ["array_options"]=> array(0) { } ["linkedObjectsIds"]=> NULL ["linkedObjects"]=> NULL ["table_ref_field":protected]=> string(0) "" ["context"]=> array(0) { } ["canvas"]=> NULL ["project"]=> NULL ["fk_project"]=> NULL ["projet"]=> NULL ["contact"]=> NULL ["contact_id"]=> NULL ["thirdparty"]=> NULL ["user"]=> NULL ["ref_previous"]=> NULL ["ref_next"]=> NULL ["ref_ext"]=> NULL ["table_element_line"]=> NULL ["statut"]=> NULL ["country"]=> NULL ["country_id"]=> NULL ["country_code"]=> NULL ["barcode_type"]=> NULL ["barcode_type_code"]=> NULL ["barcode_type_label"]=> NULL ["barcode_type_coder"]=> NULL ["mode_reglement_id"]=> NULL ["cond_reglement_id"]=> NULL ["cond_reglement"]=> NULL ["fk_delivery_address"]=> NULL ["shipping_method_id"]=> NULL ["modelpdf"]=> NULL ["fk_account"]=> NULL ["note_public"]=> NULL ["note_private"]=> NULL ["note"]=> NULL ["lines"]=> NULL ["fk_incoterms"]=> NULL ["libelle_incoterms"]=> NULL ["location_incoterms"]=> NULL ["name"]=> NULL ["lastname"]=> NULL ["firstname"]=> NULL ["civility_id"]=> NULL ["description"]=> string(77) "SugarCraft Μίνι XMAS Δεντράκι Πράσινο - Κοκκινό 60g" ["fk_product_type"]=> string(1) "0" ["vat_src_code"]=> string(0) "" ["code_ventilation"]=> string(1) "0" } [3]=> object(FactureLigne)#139 (103) { ["element"]=> string(10) "facturedet" ["table_element"]=> string(10) "facturedet" ["oldline"]=> NULL ["fk_facture"]=> string(3) "817" ["fk_parent_line"]=> NULL ["label"]=> string(67) "SugarCraft Μίνι XMAS Νιφάδα χιονιού Ασημί 60g" ["desc"]=> string(67) "SugarCraft Μίνι XMAS Νιφάδα χιονιού Ασημί 60g" ["localtax1_type"]=> string(1) "0" ["localtax2_type"]=> string(1) "0" ["fk_remise_except"]=> NULL ["rang"]=> string(1) "0" ["fk_fournprice"]=> NULL ["pa_ht"]=> string(10) "0.00000000" ["marge_tx"]=> string(0) "" ["marque_tx"]=> float(100) ["special_code"]=> string(1) "0" ["origin"]=> NULL ["origin_id"]=> NULL ["fk_code_ventilation"]=> int(0) ["date_start"]=> string(0) "" ["date_end"]=> string(0) "" ["ref"]=> string(8) "SC-E3418" ["product_ref"]=> string(8) "SC-E3418" ["libelle"]=> string(136) "SugarCraft Μίνι XMAS Νιφάδα χιονιού Ασημί 60g" ["product_label"]=> string(136) "SugarCraft Μίνι XMAS Νιφάδα χιονιού Ασημί 60g" ["product_desc"]=> string(243) "Νιφάδα χιονιού ασημί 8χιλ. Τέλεια για τα Χριστουγεννιάτικα γλυκά σας, τουρτες, cupcakes και οτι αλλο φανταστείτε. Συσκευασία αφαλείας 60γρ" ["skip_update_total"]=> NULL ["situation_percent"]=> string(3) "100" ["fk_prev_id"]=> NULL ["fk_multicurrency"]=> string(1) "0" ["multicurrency_code"]=> string(3) "EUR" ["multicurrency_subprice"]=> string(10) "2.06400000" ["multicurrency_total_ht"]=> string(10) "4.13000000" ["multicurrency_total_tva"]=> string(10) "0.53000000" ["multicurrency_total_ttc"]=> string(10) "4.66000000" ["qty"]=> string(1) "2" ["subprice"]=> string(10) "2.06400000" ["product_type"]=> string(1) "0" ["fk_product"]=> string(4) "1243" ["tva_tx"]=> string(6) "13.000" ["localtax1_tx"]=> string(5) "0.000" ["localtax2_tx"]=> string(5) "0.000" ["remise_percent"]=> string(1) "0" ["total_ht"]=> string(10) "4.13000000" ["total_tva"]=> string(10) "0.53000000" ["total_localtax1"]=> string(10) "0.00000000" ["total_localtax2"]=> string(10) "0.00000000" ["total_ttc"]=> string(10) "4.66000000" ["info_bits"]=> string(1) "0" ["id"]=> string(4) "3335" ["rowid"]=> string(4) "3335" ["fk_unit"]=> NULL ["db"]=> object(DoliDBMysqli)#27 (19) { ["db"]=> object(mysqli)#28 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(11) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(14) "5.5.62-cll-lve" ["server_version"]=> int(50562) ["stat"]=> string(153) "Uptime: 267923 Threads: 8 Questions: 154905932 Slow queries: 2162 Opens: 94596342 Flush tables: 1 Open tables: 601 Queries per second avg: 578.173" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(2792194) ["warning_count"]=> int(0) } ["type"]=> string(6) "mysqli" ["_results":"DoliDBMysqli":private]=> object(mysqli_result)#141 (5) { ["current_field"]=> int(0) ["field_count"]=> int(11) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } ["forcecharset"]=> string(4) "utf8" ["forcecollate"]=> string(15) "utf8_general_ci" ["connected"]=> bool(true) ["database_selected"]=> bool(true) ["database_name"]=> string(13) "siteview_doli" ["database_user"]=> string(13) "siteview_doli" ["database_host"]=> string(9) "localhost" ["database_port"]=> string(4) "3306" ["transaction_opened"]=> int(0) ["lastquery"]=> string(265) "SELECT price, price_ttc, price_min, price_min_ttc, price_base_type, tva_tx, default_vat_code, tosell, price_by_qty, rowid, recuperableonly FROM llx_product_price WHERE entity IN (1) AND price_level=3 AND fk_product = '1' ORDER BY date_price DESC, rowid DESC LIMIT 1" ["lastqueryerror"]=> NULL ["lasterror"]=> NULL ["lasterrno"]=> NULL ["ok"]=> bool(true) ["error"]=> NULL ["_results":"DoliDB":private]=> NULL } ["error"]=> NULL ["errors"]=> array(0) { } ["import_key"]=> NULL ["array_options"]=> array(0) { } ["linkedObjectsIds"]=> NULL ["linkedObjects"]=> NULL ["table_ref_field":protected]=> string(0) "" ["context"]=> array(0) { } ["canvas"]=> NULL ["project"]=> NULL ["fk_project"]=> NULL ["projet"]=> NULL ["contact"]=> NULL ["contact_id"]=> NULL ["thirdparty"]=> NULL ["user"]=> NULL ["ref_previous"]=> NULL ["ref_next"]=> NULL ["ref_ext"]=> NULL ["table_element_line"]=> NULL ["statut"]=> NULL ["country"]=> NULL ["country_id"]=> NULL ["country_code"]=> NULL ["barcode_type"]=> NULL ["barcode_type_code"]=> NULL ["barcode_type_label"]=> NULL ["barcode_type_coder"]=> NULL ["mode_reglement_id"]=> NULL ["cond_reglement_id"]=> NULL ["cond_reglement"]=> NULL ["fk_delivery_address"]=> NULL ["shipping_method_id"]=> NULL ["modelpdf"]=> NULL ["fk_account"]=> NULL ["note_public"]=> NULL ["note_private"]=> NULL ["note"]=> NULL ["lines"]=> NULL ["fk_incoterms"]=> NULL ["libelle_incoterms"]=> NULL ["location_incoterms"]=> NULL ["name"]=> NULL ["lastname"]=> NULL ["firstname"]=> NULL ["civility_id"]=> NULL ["description"]=> string(67) "SugarCraft Μίνι XMAS Νιφάδα χιονιού Ασημί 60g" ["fk_product_type"]=> string(1) "0" ["vat_src_code"]=> string(0) "" ["code_ventilation"]=> string(1) "0" } [4]=> object(FactureLigne)#142 (103) { ["element"]=> string(10) "facturedet" ["table_element"]=> string(10) "facturedet" ["oldline"]=> NULL ["fk_facture"]=> string(3) "817" ["fk_parent_line"]=> NULL ["label"]=> string(16) "ΜΕΤΑΦΟΡΑ" ["desc"]=> string(16) "ΜΕΤΑΦΟΡΑ" ["localtax1_type"]=> string(1) "0" ["localtax2_type"]=> string(1) "0" ["fk_remise_except"]=> NULL ["rang"]=> string(1) "0" ["fk_fournprice"]=> NULL ["pa_ht"]=> string(10) "0.00000000" ["marge_tx"]=> string(0) "" ["marque_tx"]=> float(100) ["special_code"]=> string(1) "0" ["origin"]=> NULL ["origin_id"]=> NULL ["fk_code_ventilation"]=> int(0) ["date_start"]=> string(0) "" ["date_end"]=> string(0) "" ["ref"]=> string(3) "SIP" ["product_ref"]=> string(3) "SIP" ["libelle"]=> string(16) "ΜΕΤΑΦΟΡΑ" ["product_label"]=> string(16) "ΜΕΤΑΦΟΡΑ" ["product_desc"]=> string(0) "" ["skip_update_total"]=> NULL ["situation_percent"]=> string(3) "100" ["fk_prev_id"]=> NULL ["fk_multicurrency"]=> string(1) "0" ["multicurrency_code"]=> string(3) "EUR" ["multicurrency_subprice"]=> string(10) "4.35471000" ["multicurrency_total_ht"]=> string(10) "4.35000000" ["multicurrency_total_tva"]=> string(10) "1.05000000" ["multicurrency_total_ttc"]=> string(10) "5.40000000" ["qty"]=> string(1) "1" ["subprice"]=> string(10) "4.35471000" ["product_type"]=> string(1) "1" ["fk_product"]=> string(1) "1" ["tva_tx"]=> string(6) "24.000" ["localtax1_tx"]=> string(5) "0.000" ["localtax2_tx"]=> string(5) "0.000" ["remise_percent"]=> string(1) "0" ["total_ht"]=> string(10) "4.35000000" ["total_tva"]=> string(10) "1.05000000" ["total_localtax1"]=> string(10) "0.00000000" ["total_localtax2"]=> string(10) "0.00000000" ["total_ttc"]=> string(10) "5.40000000" ["info_bits"]=> string(1) "0" ["id"]=> string(4) "3336" ["rowid"]=> string(4) "3336" ["fk_unit"]=> NULL ["db"]=> object(DoliDBMysqli)#27 (19) { ["db"]=> object(mysqli)#28 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(11) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(14) "5.5.62-cll-lve" ["server_version"]=> int(50562) ["stat"]=> string(153) "Uptime: 267923 Threads: 8 Questions: 154905933 Slow queries: 2162 Opens: 94596346 Flush tables: 1 Open tables: 600 Queries per second avg: 578.173" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(2792194) ["warning_count"]=> int(0) } ["type"]=> string(6) "mysqli" ["_results":"DoliDBMysqli":private]=> object(mysqli_result)#141 (5) { ["current_field"]=> int(0) ["field_count"]=> int(11) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } ["forcecharset"]=> string(4) "utf8" ["forcecollate"]=> string(15) "utf8_general_ci" ["connected"]=> bool(true) ["database_selected"]=> bool(true) ["database_name"]=> string(13) "siteview_doli" ["database_user"]=> string(13) "siteview_doli" ["database_host"]=> string(9) "localhost" ["database_port"]=> string(4) "3306" ["transaction_opened"]=> int(0) ["lastquery"]=> string(265) "SELECT price, price_ttc, price_min, price_min_ttc, price_base_type, tva_tx, default_vat_code, tosell, price_by_qty, rowid, recuperableonly FROM llx_product_price WHERE entity IN (1) AND price_level=3 AND fk_product = '1' ORDER BY date_price DESC, rowid DESC LIMIT 1" ["lastqueryerror"]=> NULL

Ok then, you don’t have the total, but you have the informations line by line.

On each line you have :
[“tva_tx”]=> string(6) “13.000”

[“total_tva”]=> string(10) “0.24000000”

So you can make the sum

Hi
Ender this code

$pdf->MultiCell($largcol2, $tab2_hl, price($sign * ($object->tva_tx => string(6) 13.000 + (! empty($object->remise)?$object->remise:0)), 0, $outputlangs), 0, 'R', 1);

and not work, show error 500

Hi,

Sorry but your php expression is wrong.
You need to learn php first or ask someone to do the modification for you : https://wiki.dolibarr.org/index.php/List_of_Dolibarr_partners_and_providers

Hi
Local partnes
We have sent an email, we have received too many phones and no one has responded.
They have asked the same question in the local forum, but we got no answer