<?php
require_once(__DIR__ . '/PDF_MemImage.php');
define('EURO', chr(128));
define('EURO_VAL', 6.55957);

// Xavier Nicolay 2004
// Version 1.01
// NB:
// les fonctions dont la 1ère lettre est majuscule se réfèrent
//    à la classe FPDF
// les fonctions dont la 1ère lettre est minuscule se réfèrent
//    à la classe locale (i.e. invoice)
//
// RAF (Reste A Faire):
// + multipage (gestion automatique sur plusieurs pages)
// + Ajout de logo
// 

//////////////////////////////////////
// fonctions à utiliser (publiques) //
//////////////////////////////////////
//  function sizeOfText( $texte, $larg )
//  function addSociete( $nom, $adresse )
//  function fact_dev( $libelle, $num )
//  function addDevis( $numdev )
//  function addFacture( $numfact )
//  function addDate( $date )
//  function addClient( $ref )
//  function addPageNumber( $page )
//  function addClientAdresse( $adresse )
//  function addVehicule( $donnee )
//  function addReglement( $mode )
//  function addEcheance( $date )
//  function addNumTVA($tva)
//  function addReference($ref)
//  function addCols( $tab )
//  function addLineFormat( $tab )
//  function lineVert( $tab )
//  function addLine( $ligne, $tab )
//  function addRemarque($remarque)
//  function addCadreTVAs()
//  function addCadreEurosFrancs()
//  function addTVAs( $params, $tab_tva, $invoice )
//  function temporaire( $texte )

class INVOICE extends PDF_MemImage
{
	// variables privées
	var $colonnes;
	var $format;
	var $angle = 0;

	function Logo($path)
	{
		$args = explode(';', $path);
		if (count($args) == 5) {
			$realPath = realpath($args[0]);
			if ($realPath == false) {
				throw new Exception('Cannot find logo file:' . $args[0]);
			}
			$this->Image($realPath, $args[1], $args[2], $args[3], $args[4]);
		}
	}

	// fonctions privées
	function RoundedRect($x, $y, $w, $h, $r, $style = '')
	{
		$k = $this->k;
		$hp = $this->h;
		if ($style == 'F')
			$op = 'f';
		elseif ($style == 'FD' or $style == 'DF')
			$op = 'B';
		else
			$op = 'S';
		$MyArc = 4 / 3 * (sqrt(2) - 1);
		$this->_out(sprintf('%.2f %.2f m', ($x + $r) * $k, ($hp - $y) * $k));
		$xc = $x + $w - $r;
		$yc = $y + $r;
		$this->_out(sprintf('%.2f %.2f l', $xc * $k, ($hp - $y) * $k));

		$this->_Arc($xc + $r * $MyArc, $yc - $r, $xc + $r, $yc - $r * $MyArc, $xc + $r, $yc);
		$xc = $x + $w - $r;
		$yc = $y + $h - $r;
		$this->_out(sprintf('%.2f %.2f l', ($x + $w) * $k, ($hp - $yc) * $k));
		$this->_Arc($xc + $r, $yc + $r * $MyArc, $xc + $r * $MyArc, $yc + $r, $xc, $yc + $r);
		$xc = $x + $r;
		$yc = $y + $h - $r;
		$this->_out(sprintf('%.2f %.2f l', $xc * $k, ($hp - ($y + $h)) * $k));
		$this->_Arc($xc - $r * $MyArc, $yc + $r, $xc - $r, $yc + $r * $MyArc, $xc - $r, $yc);
		$xc = $x + $r;
		$yc = $y + $r;
		$this->_out(sprintf('%.2f %.2f l', ($x) * $k, ($hp - $yc) * $k));
		$this->_Arc($xc - $r, $yc - $r * $MyArc, $xc - $r * $MyArc, $yc - $r, $xc, $yc - $r);
		$this->_out($op);
	}

	function _Arc($x1, $y1, $x2, $y2, $x3, $y3)
	{
		$h = $this->h;
		$this->_out(sprintf(
			'%.2f %.2f %.2f %.2f %.2f %.2f c ',
			$x1 * $this->k,
			($h - $y1) * $this->k,
			$x2 * $this->k,
			($h - $y2) * $this->k,
			$x3 * $this->k,
			($h - $y3) * $this->k
		));
	}

	function Rotate($angle, $x = -1, $y = -1)
	{
		if ($x == -1)
			$x = $this->x;
		if ($y == -1)
			$y = $this->y;
		if ($this->angle != 0)
			$this->_out('Q');
		$this->angle = $angle;
		if ($angle != 0) {
			$angle *= M_PI / 180;
			$c = cos($angle);
			$s = sin($angle);
			$cx = $x * $this->k;
			$cy = ($this->h - $y) * $this->k;
			$this->_out(sprintf('q %.5f %.5f %.5f %.5f %.2f %.2f cm 1 0 0 1 %.2f %.2f cm', $c, $s, -$s, $c, $cx, $cy, -$cx, -$cy));
		}
	}

	function _endpage()
	{
		if ($this->angle != 0) {
			$this->angle = 0;
			$this->_out('Q');
		}
		parent::_endpage();
	}

	// fonctions publiques
	function sizeOfText($texte, $largeur)
	{
		$index    = 0;
		$nb_lines = 0;
		$loop     = TRUE;
		while ($loop) {
			$pos = strpos($texte, "\n");
			if (!$pos) {
				$loop  = FALSE;
				$ligne = $texte;
			} else {
				$ligne  = substr($texte, $index, $pos);
				$texte = substr($texte, $pos + 1);
			}
			$length = floor($this->GetStringWidth($ligne));
			if ($largeur != 0)
				$res = 1 + floor($length / $largeur);
			else
				$res = 1;
			$nb_lines += $res;
		}
		return $nb_lines;
	}

	// Cette fonction affiche en haut, a gauche,
	// le nom de la societe dans la police Arial-12-Bold
	// les coordonnees de la societe dans la police Arial-10
	function addSociete($nom, $adresse)
	{
		$x1 = 10;
		$y1 = 8;
		//Positionnement en bas
		$this->SetXY($x1, $y1);
		$this->SetFont('Arial', '', 10);
		$nom = iconv('UTF-8', 'windows-1252', $nom);
		$adresse = iconv('UTF-8', 'windows-1252', $adresse);
		$length = $this->GetStringWidth($nom . "\n" . $adresse);
		//Coordonnées de la société
		$lignes = $this->sizeOfText($nom . "\n" . $adresse, $length);
		$this->MultiCell($length, 4, $nom . "\n" . $adresse);
	}
	function addSociete2($adresse, $tel, $fax, $email, $web)
	{
		$x1 = 0;
		$y1 = $this->h - 22;

		$adresse = iconv('UTF-8', 'windows-1252', $adresse);
		$tel = iconv('UTF-8', 'windows-1252', $tel);
		$fax = iconv('UTF-8', 'windows-1252', $fax);
		$web = iconv('UTF-8', 'windows-1252', $web);
		//Positionnement en bas
		$this->SetXY($x1, $y1);
		$this->SetFont('Arial', '', 14);
		$this->Cell($this->w, 4, $adresse, 0, 0, 'C');
		$this->SetXY($this->w / 2 - 60, $y1 + 6);
		$this->SetFont('Arial', 'B', 14);
		$this->Cell(10, 4, iconv('UTF-8', 'windows-1252', "Tél."));
		$this->SetXY($this->w / 2, $y1 + 6);
		$this->Cell(10, 4, "Fax.");
		$this->SetXY($this->w / 2 - 50, $y1 + 6);
		$this->SetFont('Arial', '', 14);
		$this->Cell(10, 4, $tel);
		$this->SetXY($this->w / 2 + 10, $y1 + 6);
		$this->Cell(10, 4, $fax);
		$this->SetXY($x1, $y1 + 12);
		$this->SetFont('Arial', 'B', 14);
		$this->Cell($this->w, 4, $web, 0, 0, "C");
	}
	function addSociete3($adresse, $tel, $fax, $email, $banque, $web)
	{
		$x1 = 0;
		$y1 = $this->h - 24;

		$adresse = iconv('UTF-8', 'windows-1252', $adresse);
		$tel = iconv('UTF-8', 'windows-1252', $tel);
		$fax = iconv('UTF-8', 'windows-1252', $fax);
		$banque = iconv('UTF-8', 'windows-1252', $banque);
		$web = iconv('UTF-8', 'windows-1252', $web);
		//Positionnement en bas
		$this->SetXY($x1, $y1);
		$this->SetFont('Arial', '', 14);
		$this->Cell($this->w, 4, $adresse, 0, 0, 'C');
		$this->SetXY($this->w / 2 - 60, $y1 + 5);
		$this->SetFont('Arial', 'B', 14);
		$this->Cell(10, 4, iconv('UTF-8', 'windows-1252', "Tél."));
		$this->SetXY($this->w / 2, $y1 + 5);
		if ($fax == "") {
			$this->Cell(10, 4, "Email");
		} else {
			$this->Cell(10, 4, "Fax.");
		}
		$this->SetXY($this->w / 2 - 50, $y1 + 5);
		$this->SetFont('Arial', '', 14);
		$this->Cell(10, 4, $tel);
		$this->SetXY($this->w / 2 + 15, $y1 + 5);
		if ($fax == "") {
			$this->Cell(10, 4, $email);
		} else {
			$this->Cell(10, 4, $fax);
		}
		$this->SetXY($x1, $y1 + 10);
		$this->SetFont('Arial', '', 10);
		$this->Cell($this->w, 3, $banque, 0, 0, "C");
		$this->SetXY($x1, $y1 + 14);
		$this->SetFont('Arial', 'B', 14);
		$this->SetTextColor(255, 0, 0);
		$this->Cell($this->w, 4, $web, 0, 0, "C");
		$this->SetTextColor(0, 0, 0);
	}

	// Affiche en haut, a droite le libelle
	// (FACTURE, DEVIS, Bon de commande, etc...)
	// et son numero
	// La taille de la fonte est auto-adaptee au cadre
	function fact_dev($libelle, $num)
	{
		$r1  = ($this->w / 2) - 34;
		$r2  = $r1 + 68;
		$y1  = 75;
		$y2  = 8;
		$mid = ($r1 + $r2) / 2;

		$texte  = $libelle . " N° : " . $num;
		$texte = iconv('UTF-8', 'windows-1252', $texte);

		$szfont = 12;
		$loop   = 0;

		while ($loop == 0) {
			$this->SetFont("Helvetica", "B", $szfont);
			$sz = $this->GetStringWidth($texte);
			if (($r1 + $sz) > $r2)
				$szfont--;
			else
				$loop++;
		}

		$this->SetLineWidth(0.1);
		$this->SetFillColor(192);
		$this->RoundedRect($r1, $y1, ($r2 - $r1), $y2, 2.5, 'DF');
		$this->SetXY($r1 + 1, $y1 + 2);
		$this->Cell($r2 - $r1 - 1, 5, $texte, 0, 0, "C");
	}

	function addConditions()
	{
		$mx1 = ($this->w / 2);
		$x1  = $mx1 - 20;
		$y1  = 25;

		$texte  = "DISPOSITIONS GENERALES";
		$texte = iconv('UTF-8', 'windows-1252', $texte);

		$szfont = 24;
		$loop   = 0;

		$this->SetFont("Helvetica", "B", 24);
		$this->SetXY($x1, $y1);
		$this->Cell(40, 5, $texte, 0, 0, "C");


		$y1 += 10;
		$y2 = $y1;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Caractéristiques du véhicule :"), 0, 0, "L");
		$y1 += 4;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Sont applicables les données techniques relatives au véhicule spécifié par le présent contrat, sous réserve des modifications de construction décidée, le cas échéant, par le fabricant. Les indications figurant dans ce contrat, dans des prospectus, offres ou confirmations de commandes sont uniquement approximatives, notamment en ce qui concerne poids, dimensions, consommation, frais d’entretien, vitesses, etc. Le fabricant s’est réservé le droit, envers le vendeur, de modifier le châssis, le véhicule, etc., sans devoir modifier aussi les véhicules déjà commandés. La même réserve s’applique à l’acheteur. En tout état de cause, le vendeur est en droit de livrer le modèle le plus récent."), 0, 'J', false);

		$y1 += 32;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Modifications du prix d’achat :"), 0, 0, "L");
		$y1 += 4;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Le prix d’achat du véhicule neuf est établi selon le prix catalogue valable lors de la conclusion du contrat. Si le prix de catalogue augmente avant la livraison de l’objet, le prix de vente de ce dernier est augmenté en conséquence. Il va de même en cas de baisse du prix catalogue, à la condition que le vendeur reçoive de son fournisseur une garantie de baisse sur l’objet du présent contrat."), 0, 'J', false);

		$y1 += 20;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Véhicule de reprise :"), 0, 0, "L");
		$y1 += 4;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "L’acheteur déclare expressément que le véhicule donné en paiement partiel est libre de tout engagement ou de réserve de propriété ; il est responsable de la destruction, des dommages ou autres diminutions de valeur que ce véhicule pourrait subir jusqu’au moment de sa remise au vendeur."), 0, 'J', false);

		$y1 += 17;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Livraison tardive :"), 0, 0, "L");
		$y1 += 4;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Toutes modification ultérieure de la commande est considérée comme un supplément pouvant prolonger le délai de livraison. Si la livraison n’est pas effectuée à temps, l’acheteur doit, après un rappel écrit, fixer par écrit un délai supplémentaire de 60 jours. Si ce délai n’est pas respecté, il peut résilier le présent contrat, à la condition de le notifier par lettre recommandée. L’acheteur renonce expressément à faire valoir toute prétention fondée sur une livraison tardive de l’objet d’achat si le retard résulte de circonstances qui ne sont pas imputables au vendeur. Il renonce également à toute prétention lorsqu’à la suite de sa résiliation le véhicule n’est pas livré."), 0, 'J', false);

		$y1 += 31;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Acceptation tardive :"), 0, 0, "L");
		$y1 += 4;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Si, malgré un rappel écrit, l’acheteur tarde à prendre possession de l’objet acheté, le vendeur peut, après un délai de 8 jours notifié par écrit,"), 0, 'J', false);
		$y1 += 6;
		$this->SetXY(10, $y1);
		$this->Cell(40, 3, iconv('UTF-8', 'windows-1252', "a)"), 0, 0, "L");
		$this->SetXY(15, $y1);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(88, 3, iconv('UTF-8', 'windows-1252', "exiger l’exécution du contrat et réclamer des dommages – intérêts pour acceptation tardive ou"), 0, 'J', false);
		$y1 += 6;
		$this->SetXY(10, $y1);
		$this->Cell(40, 3, iconv('UTF-8', 'windows-1252', "b)"), 0, 0, "L");
		$this->SetXY(15, $y1);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(88, 3, iconv('UTF-8', 'windows-1252', "se départir immédiatement du contrat et réclamer 15 % du prix devente, à titre de peine conventionnelle, le vendeur est en droit deréclamer la différence, même si l’acheteur n’est pas responsable deson retard."), 0, 'J', false);

		$y1 += 13;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Réserve de propriété :"), 0, 0, "L");
		$y1 += 4;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Jusqu’au paiement complet du prix de vente, intérêts moratoires et frais éventuel inclus, le véhicule ainsi que toutes ses pièces et accessoires font l’objet d’une réserve de propriété en faveur du vendeur, conformément à l’art. 715 du Code civil suisse ; en conséquence, l’acheteur ne pourra ni se dessaisir du véhicule, ni le donner en gage ou le prêter. La location est subordonnée à l’assentiment exprès du vendeur. En cas de saisie ou de séquestre, ou si un tiers entend exercer in droit de rétention sur le véhicule, l’acheteur est tenu d’informer les intéressés de l’existence de la réserve de propriété et, au surplus, de porter les faits à la connaissance du vendeur. L’acheteur autorise expressément le vendeur à faire inscrire le présent contrat au registre des pactes de ventes avec réserve de propriété. L’acheteur s’engage à communiquer tous ses changements de domicile au vendeur pendant la durée de la réserve de propriété, avant chaque changement. L’acheteur accorde au vendeur le droit d’informer de l’existence de la réserve de propriété tant le propriétaire éventuel de son garage que celui de son appartement."), 0, 'J', false);

		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Résiliation du contrat :"), 0, 0, "L");
		$y2 += 4;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Après un délai de 8 jours, un forfait de Fr. 350. — sera dû pour les frais administratifs. Si un solde du prix d’achat reste impayé, contrairement aux dispositions contractuelles, le vendeur, après un délai de 8 jours notifié par écrit, peut résilier le contrat par écrit en faisant valoir sa réserve de propriété. L’acheteur s’engage à payer un montant approprié de loyer et d’indemnité pour l’usure du véhicule. Sous réserve d’autres dispositions, l’indemnité est calculée comme suit :"), 0, 'J', false);
		$y2 += 22;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "15% du prix d’achat pour la dépréciation d’un véhicule neuf à la suite de sa mise en circulation ;"), 0, 'J', false);
		$y2 += 7;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "10% du prix d’achat pour la dépréciation d’un véhicule d’occasion à la suite de sa mise en circulation ;"), 0, 'J', false);
		$y2 += 7;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "plus 1% du prix d’achat par mois, à partir de la date de livraison du véhicule."), 0, 'J', false);
		$y2 += 7;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "5 à 10 centimes par kilomètre parcouru par le véhicule depuis sa livraison, selon sa catégorie de prix ;"), 0, 'J', false);

		$y2 += 8;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Assurances de l’objet acheté à crédit :"), 0, 0, "L");
		$y2 += 4;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "A défaut d’une assurance casco conclue par le vendeur, l’acheteur doit couvrir complètement auprès d’une compagnie d’assurance concessionnaire les risques d’accident, d’endommagement, d’incendie et de vol de l’objet acheté, cela jusqu'à ce que le prix d’achat soit entièrement payé. En cas de sinistre, l’acheteur cède au vendeur ses droits envers l’assurance jusqu'à concurrence de la somme qu’il reste lui devoir à ce moment aux termes du présent contrat."), 0, 'J', false);
		$y2 += 21;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Si la police d’assurance prévoit une franchise, l’acheteur en doit l’équivalent au vendeur. Il reste néanmoins directement et solidairement responsable du prix d’achat non encore versé. L’acheteur s’engage à prouver en tout temps, en présentant la police, l’existence de l’assurance susmentionnée. Il s’engage, en outre, à annoncer dans les 48 heures au vendeur tout dommage subi par l’objet du présent contrat et à lui céder tous les droits à des dommages-intérêts qu’il peut faire valoir, cela jusqu'à concurrence de la part du prix d’achat restant due. En ce cas également, l’acheteur demeure directement et solidairement responsable du prix d’achat encore dû."), 0, 'J', false);

		$y2 += 31;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Désistement du vendeur :"), 0, 0, "L");
		$y2 += 4;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Si le présent contrat n’est pas signé par une ou plusieurs personnes autorisées à engager le vendeur par leur signatures, ce dernier peut déclarer par écrit, pendant 8 jours, qu’il n’est pas lié par le contrat ; aucune indemnité n’est due dans ce cas."), 0, 'J', false);

		$y2 += 13;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Forme écrite :"), 0, 0, "L");
		$y2 += 4;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Les parties conviennent que, pour être valable, le présent contrat ainsi que ses avenants et compléments éventuels doivent revêtir la forme écrite."), 0, 'J', false);

		$y2 += 12;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Entretien de l’objet en leasing :"), 0, 0, "L");
		$y2 += 4;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "L’acheteur est tenu d’utiliser l’objet vendu avec les précautions dues selon les instructions du fabricant. Il est responsable de son bon entretien et s’engage à le tenir en parfait état et à faire procéder immédiatement aux réparations nécessaires."), 0, 'J', false);
		$y2 += 12;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Le garage est autorisé à examiner et à contrôler en tout temps l’objet du contrat et, à cet effet, à pénétrer dans l’immeuble ou le lieu où le bien se trouve."), 0, 'J', false);
		$y2 += 9;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Il répond en outre, pendant la durée de la réserve de propriété, de tous les dégâts pouvant survenir, même sans sa faute, par cas fortuit ou de force majeure. Le Garage a en tout temps le droit irrévocable de disposer de l'objet décrit ci-dessus en vue de sauvegarder son intégrité et les droits découlant de la réserve de propriété."), 0, 'J', false);

		$y2 += 16;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "B", 8);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "For judiciaire :"), 0, 0, "L");
		$y2 += 4;
		$this->SetXY($mx1, $y2);
		$this->SetFont("Helvetica", "", 8);
		$this->MultiCell(93, 3, iconv('UTF-8', 'windows-1252', "Pour tout litige découlant du présent contrat, le for judiciaire se trouve au domicile du vendeur."), 0, 'J', false);

		$y1 += 55;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "L’acheteur déclare qu’il a lu et qu’il approuve toutes les dispositions de ce contrat."), 0, 0, "L");
		$y1 += 5;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Vernier, le " . date("d.m.Y")), 0, 0, "L");
		$y1 += 7;
		$this->SetXY(10, $y1);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Le vendeur :"), 0, 0, "L");
		$this->SetXY($mx1, $y1);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "L’acheteur :"), 0, 0, "L");

		$this->Image("../config/tampon.jpg", 35, $y1, 50, 20);
	}

	function formatTelephone($valeur)
	{
		$tel = str_replace("/", "", $valeur);
		$tel = str_replace(".", "", $tel);
		$tel = str_replace(" ", "", $tel);
		if (substr($tel, 0, 2) == "00") {
			if (substr($tel, 2, 2) == "33") {
				$out = "+" . substr($tel, 2, 2) . " " . substr($tel, 4, 3) . " " . substr($tel, 7, 2) . " " . substr($tel, 9, 2) . " " . substr($tel, 11);
			} else if (substr($tel, 2, 2) == "41") {
				$out = "0" . substr($tel, 4, 2) . " " . substr($tel, 6, 3) . " " . substr($tel, 9, 2) . " " . substr($tel, 11);
			} else {
				$out = "+" . substr($tel, 2, 2) . " " . substr($tel, 4, 2) . " " . substr($tel, 6, 3) . " " . substr($tel, 9, 2) . " " . substr($tel, 11);
			}
		} else if (substr($tel, 0, 1) == "0") {
			$out = substr($tel, 0, 3) . " " . substr($tel, 3, 3) . " " . substr($tel, 6, 2) . " " . substr($tel, 8);
		} else {
			$out = htmlspecialchars($tel);
		}
		return $out;
	}

	function formatDate($valeur)
	{
		if (strlen($valeur) == 0) {
			return "";
		} else {
			return substr($valeur, 8, 2) . "." . substr($valeur, 5, 2) . "." . substr($valeur, 0, 4);
		}
	}

	function addContratDeVente($noClient)
	{
		$ligne_client = Client::getClientByNoClient($noClient);

		$mx1 = ($this->w / 2);
		$x1  = $mx1 - 20;
		$y1  = 30;

		$texte  = "CONTRAT DE VENTE";
		$texte = iconv('UTF-8', 'windows-1252', $texte);

		$szfont = 24;
		$loop   = 0;

		$this->SetFont("Helvetica", "B", 24);
		$this->SetXY($x1, $y1);
		$this->Cell(40, 5, $texte, 0, 0, "C");

		$y1 += 10;
		$this->SetFont("Helvetica", "B", 12);
		$this->SetXY(10, $y1);
		$this->Cell(40, 5, "Acheteur :", 0, 0, "L");

		$this->SetFont("Helvetica", "", 10);

		$y1 += 7;
		$this->SetXY(10, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Nom : " . $ligne_client["Nom"]), 0, 0, "L");
		$this->SetXY($mx1, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Prénom : " . $ligne_client["Prenom"]), 0, 0, "L");

		$y1 += 5;
		$this->SetXY(10, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Adresse : " . $ligne_client["Adresse"]), 0, 0, "L");
		$this->SetXY($mx1, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Code postal : " . $ligne_client["NPA"]), 0, 0, "L");

		$y1 += 5;
		$this->SetXY(10, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Localité : " . $ligne_client["Localite"]), 0, 0, "L");
		$this->SetXY($mx1, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Pays : " . $ligne_client["Pays"]), 0, 0, "L");

		$y1 += 5;
		$this->SetXY(10, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Date de naissance : " . $this->formatDate($ligne_client["DateNaissance"])), 0, 0, "L");
		$this->SetXY($mx1, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Pays ou canton d'origine : " . $ligne_client["Origine"]), 0, 0, "L");

		$y1 += 5;
		$this->SetXY(10, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Lieu d'origine : " . $ligne_client["LieuOrigine"]), 0, 0, "L");
		$this->SetXY($mx1, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Téléphone (mobile) : " . $this->formatTelephone($ligne_client["Natel"])), 0, 0, "L");

		if (strlen($ligne_client["TelPriv"]) == 0) {
			$telfix = $this->formatTelephone($ligne_client["TelProf"]);
		} else {
			$telfix = $this->formatTelephone($ligne_client["TelPriv"]);
		}

		$y1 += 5;
		$this->SetXY(10, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Téléphone (fixe) : " . $telfix), 0, 0, "L");
		$this->SetXY($mx1, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Adresse E-mail : " . $ligne_client["Email"]), 0, 0, "L");

		$y1 += 5;
		$this->SetXY(10, $y1);
		$this->Cell(40, 5, iconv('UTF-8', 'windows-1252', "Assurances : " . $ligne_client["Assurance"]), 0, 0, "L");
	}

	// Genere automatiquement un numero de devis
	function addDevis($numdev)
	{
		$string = sprintf("DEV%04d", $numdev);
		$this->fact_dev("Devis", $string);
	}

	// Genere automatiquement un numero de facture
	function addFacture($numfact)
	{
		$string = sprintf("FA%04d", $numfact);
		$this->fact_dev("Facture", $string);
	}

	// Affiche un cadre avec la date de la facture / devis
	// (en haut, a droite)
	function addDate($date)
	{
		//	$r1  = $this->w - 61;
		$r1  = 10;
		$r2  = $r1 + 30;
		$y1  = 75;
		$y2  = 12;
		$mid = $y1 + ($y2 / 2);
		$this->RoundedRect($r1, $y1, ($r2 - $r1), $y2, 3.5, 'D');
		$this->Line($r1, $mid, $r2, $mid);
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 1);
		$this->SetFont("Helvetica", "B", 10);
		$this->Cell(10, 5, "DATE", 0, 0, "C");
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 7);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(10, 5, $date, 0, 0, "C");
	}

	// Affiche un cadre avec les references du client
	// (en haut, a droite)
	function addClient($ref)
	{
		$ref = iconv('UTF-8', 'windows-1252', $ref);
		$r1  = $this->w - 40;
		$r2  = $r1 + 30;
		$y1  = 75;
		$y2  = 12;
		$mid = $y1 + ($y2 / 2);
		$this->RoundedRect($r1, $y1, ($r2 - $r1), $y2, 3.5, 'D');
		$this->Line($r1, $mid, $r2, $mid);
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 1);
		$this->SetFont("Helvetica", "B", 10);
		$this->Cell(10, 5, "CLIENT", 0, 0, "C");
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 7);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(10, 5, $ref, 0, 0, "C");
	}

	// Affiche un cadre avec un numero de page
	// (en haut, a droite)
	function addPageNumber($page)
	{
		$r1  = $this->w - 30;
		$r2  = $r1 + 20;
		$y1  = 10;
		$y2  = 12;
		$mid = $y1 + ($y2 / 2);
		$this->RoundedRect($r1, $y1, ($r2 - $r1), $y2, 3.5, 'D');
		$this->Line($r1, $mid, $r2, $mid);
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 1);
		$this->SetFont("Helvetica", "B", 10);
		$this->Cell(10, 5, "PAGE", 0, 0, "C");
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 7);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(10, 5, $page, 0, 0, "C");
	}

	// Affiche l'adresse du client
	// (en haut, a droite)
	function addClientAdresse($adresse)
	{
		$r1     = $this->w - 80;
		$r2     = $r1 + 68;
		$y1     = 45;
		$this->SetXY($r1, $y1);
		$adresse = iconv('UTF-8', 'windows-1252', $adresse);
		$this->MultiCell(60, 4, $adresse, 0, 'L');
	}
	function addClient2Adresse($adresse)
	{
		$r1     = 12;
		$r2     = $r1 + 68;
		$y1     = 70;
		$this->SetXY($r1, $y1);
		$adresse = iconv('UTF-8', 'windows-1252', $adresse);
		$this->MultiCell(300, 4, $adresse);
	}

	// Affiche les donnee du vehicule
	// (en haut, a gauche)
	function addVehicule($donnee)
	{
		//$r1     = 12;
		$r1     = 50;
		$r2     = $r1 + 68;
		$y1     = 45;
		$this->SetXY($r1, $y1);
		$donnee = iconv('UTF-8', 'windows-1252', $donnee);
		$this->MultiCell(60, 4, $donnee);
	}

	// Affiche un cadre avec le règlement (chèque, etc...)
	// (en haut, a gauche)
	function addReglement($mode)
	{
		$mode = iconv('UTF-8', 'windows-1252', $mode);
		$r1  = 10;
		$r2  = $r1 + 60;
		$y1  = 80;
		$y2  = $y1 + 10;
		$mid = $y1 + (($y2 - $y1) / 2);
		$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2 - $y1), 2.5, 'D');
		$this->Line($r1, $mid, $r2, $mid);
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 1);
		$this->SetFont("Helvetica", "B", 10);
		$this->Cell(10, 4, "MODE DE REGLEMENT", 0, 0, "C");
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 5);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(10, 5, $mode, 0, 0, "C");
	}

	// Affiche un cadre avec la date d'echeance
	// (en haut, au centre)
	function addEcheance($date)
	{
		$r1  = 80;
		$r2  = $r1 + 40;
		$y1  = 80;
		$y2  = $y1 + 10;
		$mid = $y1 + (($y2 - $y1) / 2);
		$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2 - $y1), 2.5, 'D');
		$this->Line($r1, $mid, $r2, $mid);
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 1);
		$this->SetFont("Helvetica", "B", 10);
		$this->Cell(10, 4, "DATE D'ECHEANCE", 0, 0, "C");
		$this->SetXY($r1 + ($r2 - $r1) / 2 - 5, $y1 + 5);
		$this->SetFont("Helvetica", "", 10);
		$this->Cell(10, 5, $date, 0, 0, "C");
	}

	// Affiche un cadre avec le numero de la TVA
	// (en haut, au droite)
	function addNumTVA($tva)
	{
		$this->SetFont("Helvetica", "B", 10);
		$r1  = $this->w - 80;
		$r2  = $r1 + 70;
		$y1  = 80;
		$y2  = $y1 + 10;
		$mid = $y1 + (($y2 - $y1) / 2);
		$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2 - $y1), 2.5, 'D');
		$this->Line($r1, $mid, $r2, $mid);
		$this->SetXY($r1 + 16, $y1 + 1);
		$this->Cell(40, 4, "TVA Intracommunautaire", '', '', "C");
		$this->SetFont("Helvetica", "", 10);
		$this->SetXY($r1 + 16, $y1 + 5);
		$this->Cell(40, 5, $tva, '', '', "C");
	}

	// Affiche une ligne avec des reference
	// (en haut, a gauche)
	function addReference($ref)
	{
		$texte = iconv('UTF-8', 'windows-1252', "Références : " . $ref);
		$this->SetFont("Helvetica", "", 10);
		$length = $this->GetStringWidth($texte);
		$r1  = 10;
		$r2  = $r1 + $length;
		$y1  = 92;
		$y2  = $y1 + 5;
		$this->SetXY($r1, $y1);
		$this->Cell($length, 4, $texte);
	}

	// trace le cadre des colonnes du devis/facture
	function addCols($tab, $cadre = 'O', $firstPage = true)
	{
		global $colonnes;

		$r1  = 10;
		$r2  = $this->w - ($r1 * 2);
		if ($firstPage) {
			$y1  = 90;
		} else {
			$y1 = 30;
		}
		$y2  = $this->h - 50 - $y1;
		if ($cadre == 'O') {
			$this->SetXY($r1, $y1);
			$this->Rect($r1, $y1, $r2, $y2, "D");
			$this->Line($r1, $y1 + 6, $r1 + $r2, $y1 + 6);
		}
		$colX = $r1;
		$colonnes = $tab;
		foreach ($tab as $lib => $pos) {
			$this->SetXY($colX, $y1 + 2);
			$this->SetFont("Helvetica", "B", 10);
			$this->Cell($pos, 1, $lib, 0, 0, "C");
			$colX += $pos;
			if ($cadre == 'O')
				$this->Line($colX, $y1, $colX, $y1 + $y2);
		}
	}

	// mémorise le format (gauche, centre, droite) d'une colonne
	function addLineFormat($tab)
	{
		global $format, $colonnes;

		foreach ($colonnes as $lib => $pos) {
			if (isset($tab["$lib"]))
				$format[$lib] = $tab["$lib"];
		}
	}

	function lineVert($tab)
	{
		global $colonnes;

		//reset( $colonnes );
		$maxSize = 0;
		foreach ($colonnes as $lib => $pos) {
			$texte = $tab[$lib];
			$longCell  = $pos - 2;
			$size = $this->sizeOfText($texte, $longCell);
			if ($size > $maxSize)
				$maxSize = $size;
		}
		return $maxSize;
	}

	// Affiche chaque "ligne" d'un devis / facture
	/*    $ligne = array( "REFERENCE"    => $prod["ref"],
                      "DESIGNATION"  => $libelle,
                      "QUANTITE"     => sprintf( "%.2f", $prod["qte"]) ,
                      "P.U. HT"      => sprintf( "%.2f", $prod["px_unit"]),
                      "MONTANT H.T." => sprintf ( "%.2f", $prod["qte"] * $prod["px_unit"]) ,
                      "TVA"          => $prod["tva"] );
*/
	function addLine($ligne, $tab, $style = '', $size = 10)
	{
		global $colonnes, $format;

		$ordonnee     = 10;
		$maxSize      = $ligne;

		//reset( $colonnes );
		foreach ($colonnes as $lib => $pos) {
			$longCell  = $pos - 2;
			$texte     = $tab[$lib];
			$length    = $this->GetStringWidth($texte);
			$tailleTexte = $this->sizeOfText($texte, $length);
			$formText = '';
			if (isset($format[$lib])) {
				$formText  = $format[$lib];
			}
			$this->SetXY($ordonnee, $ligne - 1);
			$this->SetFont("Helvetica", $style, $size);
			$texte = iconv('UTF-8', 'windows-1252', $texte);
			$this->Cell($longCell, 4, $texte, 0, 1, $formText, 0, '');
			//$this->MultiCell( $longCell, 4 , $texte, 0, $formText);
			if ($maxSize < ($this->GetY()))
				$maxSize = $this->GetY();
			$ordonnee += $pos;
		}
		return ($maxSize - $ligne);
	}

	// Affiche chaque "ligne texte" d'un devis / facture
	function addTexte($ligne, $texte, $style = '')
	{
		$ordonnee     = 10;
		$maxSize      = $ligne;
		$this->SetXY($ordonnee, $ligne - 1);
		$this->SetFont("Helvetica", $style, 10);
		$texte = iconv('UTF-8', 'windows-1252', $texte);
		$this->MultiCell(190, 4, $texte, 0, 'L');
		if ($maxSize < ($this->GetY()))
			$maxSize = $this->GetY();
		return ($maxSize - $ligne);
	}

	// Ajoute une remarque (en bas, a gauche)
	function addRemarque($remarque)
	{
		$this->SetFont("Helvetica", "", 10);
		$length = $this->GetStringWidth("Remarque : " . iconv('UTF-8', 'windows-1252', $remarque));
		$r1  = 10;
		$r2  = $r1 + $length;
		$y1  = $this->h - 45.5;
		$y2  = $y1 + 5;
		$this->SetXY($r1, $y1);
		$this->Cell($length, 4, "Remarque : " . $remarque);
	}
	function Arrondi_5_ct($str)
	{
		if (empty($str)) {
			$tmp = "0.00";
		} else {
			$tmp = (round($str * 20)) / 20;
			$taille = strlen($tmp);
			$pos = strpos($tmp, '.');
			if ($pos === false) {
				$tmp .= ".00";
			} else {
				if ($taille != $pos + 3)
					$tmp .= "0";
			}
		}
		return $tmp;
	}
	function Arrondi_1_ct($str)
	{
		$tmp = (round($str * 100)) / 100;
		$taille = strlen($tmp);
		$pos = strpos($tmp, '.');
		if ($pos === false) {
			$tmp .= ".00";
		} else {
			if ($taille != $pos + 3)
				$tmp .= "0";
		}
		return $tmp;
	}

	function addCadreTVAnew($tab, $no_tva, $y1 = 0)
	{
		$r1  = 10;
		$r2  = $r1 + 70;
		if ($y1 == 0)
			$y1  = $this->h - 42;
		else
			$y1 += 5;
		$y2  = $y1 + 8;
		$pos2 = $y1 + 4;
		$this->SetFont("Arial", "", 8);
		$this->SetXY($r1, $y1 - 5);
		$this->Cell(20, 4, iconv('UTF-8', 'windows-1252', "N° TVA " . $no_tva), 0, 0, 'L');
		$this->SetFont("Arial", "B", 8);
		$this->SetXY($r1, $y1);
		$this->Cell(20, 4, "Total HT", 0, 0, 'C');
		$this->SetXY($r1 + 20, $y1);
		$this->Cell(10, 4, "%", 0, 0, 'C');
		$this->SetXY($r1 + 30, $y1);
		$this->Cell(20, 4, "Tax", 0, 0, 'C');
		$this->SetXY($r1 + 50, $y1);
		$this->Cell(20, 4, "Total TTC", 0, 0, 'C');
		$tot_ht = 0;
		$tot_tax = 0;
		$tot_ttc = 0;
		$this->SetFont("Arial", "", 8);
		foreach ($tab as $lib => $pos) {
			$ht = round($pos / ((100 + $lib) / 100), 2);
			$tax = $pos - $ht;
			$tot_ht += $ht;
			$tot_tax += $tax;
			$tot_ttc += $pos;
			$this->SetXY($r1, $pos2);
			$this->Cell(20, 4, Arrondi_1_ct($ht), 0, 0, 'C');
			$this->SetXY($r1 + 20, $pos2);
			$this->Cell(10, 4, Arrondi_1_ct($lib), 0, 0, 'C');
			$this->SetXY($r1 + 30, $pos2);
			$this->Cell(20, 4, Arrondi_1_ct($tax), 0, 0, 'C');
			$this->SetXY($r1 + 50, $pos2);
			$this->Cell(20, 4, Arrondi_5_ct($pos), 0, 0, 'C');
			$pos2 += 4;
		}
		$this->SetFont("Arial", "B", 8);
		$this->SetXY($r1, $pos2);
		$this->Cell(20, 4, Arrondi_1_ct($tot_ht), 0, 0, 'C');
		$this->SetXY($r1 + 30, $pos2);
		$this->Cell(20, 4, Arrondi_1_ct($tot_tax), 0, 0, 'C');
		$this->SetXY($r1 + 50, $pos2);
		$this->Cell(20, 4, Arrondi_5_ct($tot_ttc), 0, 0, 'C');
		$pos2 += 4;
		$y2 = $pos2;
		$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2 - $y1), 2.5, 'D');
		$this->Line($r1, $y1 + 4, $r2, $y1 + 4);
		$this->Line($r1, $y2 - 4, $r2, $y2 - 4);
		$this->Line($r1 + 20, $y1, $r1 + 20, $y2);
		$this->Line($r1 + 30, $y1, $r1 + 30, $y2);
		$this->Line($r1 + 50, $y1, $r1 + 50, $y2);
	}

	function addCadreTVAdesMarges($no_tva, $y1 = 0)
	{
		$r1  = 10;
		$r2  = $r1 + 70;
		if ($y1 == 0)
			$y1  = $this->h - 42;
		else
			$y1 += 5;
		$y2  = $y1 + 8;
		$pos2 = $y1 + 4;
		$this->SetFont("Arial", "", 8);
		$this->SetXY($r1, $y1 - 5);
		$this->Cell(20, 4, iconv('UTF-8', 'windows-1252', "n° TVA " . $no_tva), 0, 0, 'L');
		$this->SetFont("Arial", "B", 8);
		$this->SetXY($r1, $y1);
		$this->Cell(20, 4, "TVA des marges", 0, 0, 'L');
		/*	$this->SetXY( $r1+20 , $y1 );
	$this->Cell(10,4,"%",0,0,'C');
	$this->SetXY( $r1+30 , $y1 );
	$this->Cell(20,4,"Tax",0,0,'C');
	$this->SetXY( $r1+50 , $y1 );
	$this->Cell(20,4,"Total TTC",0,0,'C');
	$tot_ht=0;
	$tot_tax=0;
	$tot_ttc=0;
	$this->SetFont( "Arial", "", 8);
	while ( list( $lib, $pos ) = each ($tab) )
	{
	    $ht = round($pos / ((100 + $lib)/100),2);
	    $tax = $pos - $ht;
		$tot_ht+=$ht;
		$tot_tax+=$tax;
		$tot_ttc+=$pos;
	    $this->SetXY( $r1 , $pos2 );
		$this->Cell(20,4,Arrondi_1_ct($ht),0,0,'C');
	    $this->SetXY( $r1+20 , $pos2 );
		$this->Cell(10,4,Arrondi_1_ct($lib),0,0,'C');
	    $this->SetXY( $r1+30 , $pos2 );
		$this->Cell(20,4,Arrondi_1_ct($tax),0,0,'C');
	    $this->SetXY( $r1+50 , $pos2 );
		$this->Cell(20,4,Arrondi_5_ct($pos),0,0,'C');
		$pos2+=4;
	}
	$this->SetFont( "Arial", "B", 8);
	$this->SetXY( $r1 , $pos2 );
	$this->Cell(20,4,Arrondi_1_ct($tot_ht),0,0,'C');
	$this->SetXY( $r1+30 , $pos2 );
	$this->Cell(20,4,Arrondi_1_ct($tot_tax),0,0,'C');
	$this->SetXY( $r1+50 , $pos2 );
	$this->Cell(20,4,Arrondi_5_ct($tot_ttc),0,0,'C');
	$pos2+=4;
	$y2=$pos2;
	$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2-$y1), 2.5, 'D');
	$this->Line( $r1, $y1+4, $r2, $y1+4);
	$this->Line( $r1, $y2-4, $r2, $y2-4);
	$this->Line( $r1+20, $y1, $r1+20, $y2);
	$this->Line( $r1+30, $y1, $r1+30, $y2);
	$this->Line( $r1+50, $y1, $r1+50, $y2);*/
	}

	function addTotal($val, $y1 = 0)
	{
		if ($y1 == 0)
			$y1  = $this->h - 42;
		$this->SetXY(170, $y1);
		$this->SetFont("Helvetica", "BU", 12);
		if ($this->PageNo() > 0) {
			$this->Cell(30, 4, "Total " . $val, 0, 0, 'R');
		}
	}

	// trace le cadre des TVAs
	function addCadreTVAs()
	{
		$this->SetFont("Arial", "B", 8);
		$r1  = 10;
		$r2  = $r1 + 120;
		$y1  = $this->h - 40;
		$y2  = $y1 + 20;
		$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2 - $y1), 2.5, 'D');
		$this->Line($r1, $y1 + 4, $r2, $y1 + 4);
		$this->Line($r1 + 5,  $y1 + 4, $r1 + 5, $y2); // avant BASES HT
		$this->Line($r1 + 27, $y1, $r1 + 27, $y2);  // avant REMISE
		$this->Line($r1 + 43, $y1, $r1 + 43, $y2);  // avant MT TVA
		$this->Line($r1 + 63, $y1, $r1 + 63, $y2);  // avant % TVA
		$this->Line($r1 + 75, $y1, $r1 + 75, $y2);  // avant PORT
		$this->Line($r1 + 91, $y1, $r1 + 91, $y2);  // avant TOTAUX
		$this->SetXY($r1 + 9, $y1);
		$this->Cell(10, 4, "BASES HT");
		$this->SetX($r1 + 29);
		$this->Cell(10, 4, "REMISE");
		$this->SetX($r1 + 48);
		$this->Cell(10, 4, "MT TVA");
		$this->SetX($r1 + 63);
		$this->Cell(10, 4, "% TVA");
		$this->SetX($r1 + 78);
		$this->Cell(10, 4, "PORT");
		$this->SetX($r1 + 100);
		$this->Cell(10, 4, "TOTAUX");
		$this->SetFont("Arial", "B", 6);
		$this->SetXY($r1 + 93, $y2 - 8);
		$this->Cell(6, 0, "H.T.   :");
		$this->SetXY($r1 + 93, $y2 - 3);
		$this->Cell(6, 0, "T.V.A. :");
	}

	// trace le cadre des totaux
	function addCadreEurosFrancs()
	{
		$r1  = $this->w - 70;
		$r2  = $r1 + 60;
		$y1  = $this->h - 40;
		$y2  = $y1 + 20;
		$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2 - $y1), 2.5, 'D');
		$this->Line($r1 + 20,  $y1, $r1 + 20, $y2); // avant EUROS
		$this->Line($r1 + 20, $y1 + 4, $r2, $y1 + 4); // Sous Euros & Francs
		$this->Line($r1 + 38,  $y1, $r1 + 38, $y2); // Entre Euros & Francs
		$this->SetFont("Arial", "B", 8);
		$this->SetXY($r1 + 22, $y1);
		$this->Cell(15, 4, "EUROS", 0, 0, "C");
		$this->SetFont("Arial", "", 8);
		$this->SetXY($r1 + 42, $y1);
		$this->Cell(15, 4, "FRANCS", 0, 0, "C");
		$this->SetFont("Arial", "B", 6);
		$this->SetXY($r1, $y1 + 5);
		$this->Cell(20, 4, "TOTAL TTC", 0, 0, "C");
		$this->SetXY($r1, $y1 + 10);
		$this->Cell(20, 4, "ACOMPTE", 0, 0, "C");
		$this->SetXY($r1, $y1 + 15);
		$this->Cell(20, 4, "NET A PAYER", 0, 0, "C");
	}

	// remplit les cadres TVA / Totaux et la remarque
	// params  = array( "RemiseGlobale" => [0|1],
	//                      "remise_tva"     => [1|2...],  // {la remise s'applique sur ce code TVA}
	//                      "remise"         => value,     // {montant de la remise}
	//                      "remise_percent" => percent,   // {pourcentage de remise sur ce montant de TVA}
	//                  "FraisPort"     => [0|1],
	//                      "portTTC"        => value,     // montant des frais de ports TTC
	//                                                     // par defaut la TVA = 19.6 %
	//                      "portHT"         => value,     // montant des frais de ports HT
	//                      "portTVA"        => tva_value, // valeur de la TVA a appliquer sur le montant HT
	//                  "AccompteExige" => [0|1],
	//                      "accompte"         => value    // montant de l'acompte (TTC)
	//                      "accompte_percent" => percent  // pourcentage d'acompte (TTC)
	//                  "Remarque" => "texte"              // texte
	// tab_tva = array( "1"       => 19.6,
	//                  "2"       => 5.5, ... );
	// invoice = array( "px_unit" => value,
	//                  "qte"     => qte,
	//                  "tva"     => code_tva );
	function addTVAs($params, $tab_tva, $invoice)
	{
		$this->SetFont('Arial', '', 8);

		reset($invoice);
		$px = array();
		foreach ($invoice as $k => $prod) {
			$tva = $prod["tva"];
			@$px[$tva] += $prod["qte"] * $prod["px_unit"];
		}

		$prix     = array();
		$totalHT  = 0;
		$totalTTC = 0;
		$totalTVA = 0;
		$y = 261;
		reset($px);
		natsort($px);
		foreach ($px as $code_tva => $articleHT) {
			$tva = $tab_tva[$code_tva];
			$this->SetXY(17, $y);
			$this->Cell(19, 4, sprintf("%0.2f", $articleHT), '', '', 'R');
			if ($params["RemiseGlobale"] == 1) {
				if ($params["remise_tva"] == $code_tva) {
					$this->SetXY(37.5, $y);
					if ($params["remise"] > 0) {
						if (is_int($params["remise"]))
							$l_remise = $params["remise"];
						else
							$l_remise = sprintf("%.02f", $params["remise"]);
						$this->Cell(14.5, 4, $l_remise, '', '', 'R');
						$articleHT -= $params["remise"];
					} else if ($params["remise_percent"] > 0) {
						$rp = $params["remise_percent"];
						if ($rp > 1)
							$rp /= 100;
						$rabais = $articleHT * $rp;
						$articleHT -= $rabais;
						if (is_int($rabais))
							$l_remise = $rabais;
						else
							$l_remise = sprintf("%.02f", $rabais);
						$this->Cell(14.5, 4, $l_remise, '', '', 'R');
					} else
						$this->Cell(14.5, 4, "ErrorRem", '', '', 'R');
				}
			}
			$totalHT += $articleHT;
			$totalTTC += $articleHT * (1 + $tva / 100);
			$tmp_tva = $articleHT * $tva / 100;
			$a_tva[$code_tva] = $tmp_tva;
			$totalTVA += $tmp_tva;
			$this->SetXY(11, $y);
			$this->Cell(5, 4, $code_tva);
			$this->SetXY(53, $y);
			$this->Cell(19, 4, sprintf("%0.2f", $tmp_tva), '', '', 'R');
			$this->SetXY(74, $y);
			$this->Cell(10, 4, sprintf("%0.2f", $tva), '', '', 'R');
			$y += 4;
		}

		if ($params["FraisPort"] == 1) {
			if ($params["portTTC"] > 0) {
				$pTTC = sprintf("%0.2f", $params["portTTC"]);
				$pHT  = sprintf("%0.2f", $pTTC / 1.196);
				$pTVA = sprintf("%0.2f", $pHT * 0.196);
				$this->SetFont('Arial', '', 6);
				$this->SetXY(85, 261);
				$this->Cell(6, 4, "HT : ", '', '', '');
				$this->SetXY(92, 261);
				$this->Cell(9, 4, $pHT, '', '', 'R');
				$this->SetXY(85, 265);
				$this->Cell(6, 4, "TVA : ", '', '', '');
				$this->SetXY(92, 265);
				$this->Cell(9, 4, $pTVA, '', '', 'R');
				$this->SetXY(85, 269);
				$this->Cell(6, 4, "TTC : ", '', '', '');
				$this->SetXY(92, 269);
				$this->Cell(9, 4, $pTTC, '', '', 'R');
				$this->SetFont('Arial', '', 8);
				$totalHT += $pHT;
				$totalTVA += $pTVA;
				$totalTTC += $pTTC;
			} else if ($params["portHT"] > 0) {
				$pHT  = sprintf("%0.2f", $params["portHT"]);
				$pTVA = sprintf("%0.2f", $params["portTVA"] * $pHT / 100);
				$pTTC = sprintf("%0.2f", $pHT + $pTVA);
				$this->SetFont('Arial', '', 6);
				$this->SetXY(85, 261);
				$this->Cell(6, 4, "HT : ", '', '', '');
				$this->SetXY(92, 261);
				$this->Cell(9, 4, $pHT, '', '', 'R');
				$this->SetXY(85, 265);
				$this->Cell(6, 4, "TVA : ", '', '', '');
				$this->SetXY(92, 265);
				$this->Cell(9, 4, $pTVA, '', '', 'R');
				$this->SetXY(85, 269);
				$this->Cell(6, 4, "TTC : ", '', '', '');
				$this->SetXY(92, 269);
				$this->Cell(9, 4, $pTTC, '', '', 'R');
				$this->SetFont('Arial', '', 8);
				$totalHT += $pHT;
				$totalTVA += $pTVA;
				$totalTTC += $pTTC;
			}
		}

		$this->SetXY(114, 266.4);
		$this->Cell(15, 4, sprintf("%0.2f", $totalHT), '', '', 'R');
		$this->SetXY(114, 271.4);
		$this->Cell(15, 4, sprintf("%0.2f", $totalTVA), '', '', 'R');

		$params["totalHT"] = $totalHT;
		$params["TVA"] = $totalTVA;
		$accompteTTC = 0;
		if ($params["AccompteExige"] == 1) {
			if ($params["accompte"] > 0) {
				$accompteTTC = sprintf("%.2f", $params["accompte"]);
				if (strlen($params["Remarque"]) == 0)
					$this->addRemarque("Accompte de $accompteTTC Euros exigé à la commande.");
				else
					$this->addRemarque($params["Remarque"]);
			} else if ($params["accompte_percent"] > 0) {
				$percent = $params["accompte_percent"];
				if ($percent > 1)
					$percent /= 100;
				$accompteTTC = sprintf("%.2f", $totalTTC * $percent);
				$percent100 = $percent * 100;
				if (strlen($params["Remarque"]) == 0)
					$this->addRemarque("Accompte de $percent100 % (soit $accompteTTC Euros) exigé à la commande.");
				else
					$this->addRemarque($params["Remarque"]);
			} else
				$this->addRemarque("Drôle d'acompte !!! " . $params["Remarque"]);
		} else {
			if (strlen($params["Remarque"]) > 0)
				$this->addRemarque($params["Remarque"]);
		}
		$re  = $this->w - 50;
		$rf  = $this->w - 29;
		$y1  = $this->h - 40;
		$this->SetFont("Arial", "", 8);
		$this->SetXY($re, $y1 + 5);
		$this->Cell(17, 4, sprintf("%0.2f", $totalTTC), '', '', 'R');
		$this->SetXY($re, $y1 + 10);
		$this->Cell(17, 4, sprintf("%0.2f", $accompteTTC), '', '', 'R');
		$this->SetXY($re, $y1 + 14.8);
		$this->Cell(17, 4, sprintf("%0.2f", $totalTTC - $accompteTTC), '', '', 'R');
		$this->SetXY($rf, $y1 + 5);
		$this->Cell(17, 4, sprintf("%0.2f", $totalTTC * EURO_VAL), '', '', 'R');
		$this->SetXY($rf, $y1 + 10);
		$this->Cell(17, 4, sprintf("%0.2f", $accompteTTC * EURO_VAL), '', '', 'R');
		$this->SetXY($rf, $y1 + 14.8);
		$this->Cell(17, 4, sprintf("%0.2f", ($totalTTC - $accompteTTC) * EURO_VAL), '', '', 'R');
	}

	// Permet de rajouter un commentaire (Devis temporaire, REGLE, DUPLICATA, ...)
	// en sous-impression
	// ATTENTION: APPELER CETTE FONCTION EN PREMIER
	function temporaire($texte)
	{
		$this->SetFont('Arial', 'B', 50);
		$this->SetTextColor(203, 203, 203);
		$this->Rotate(45, 55, 190);
		$this->Text(55, 190, $texte);
		$this->Rotate(0);
		$this->SetTextColor(0, 0, 0);
	}
}
