Jump to content

[OVERRIDE] [CLASS] Facture PDF améliorée pour PS1.4.x


Mellow

Recommended Posts

Bonjour,

 

Je partage avec vous cette surcharge de la classe PDF.php qui permet d'avoir des factures et des bons de livraison avec une présentation un peu plus soignée que les originaux générés par Prestashop 1.4

 

Les modifications ont été faites à partir du fichier PDF.php de PS 1.4.9.0, ça devrait aussi fonctionner avec la plupart des versions 1.4.x, MAIS PAS AVEC PS1.5

 

Les changements sont les suivants :

  • Gain de place
  • Agrandissement du logo (passage de 18mm à 24mm de hauteur)
  • Déplacement de la date et du n° de commande en haut à droite (sous le n° de facture)
  • Mise en forme des adresses, et ajout d'un cadre autour de l'adresse de facturation
  • Affichage d'une seule adresse de facturation et de livraison (si identique)
  • Replacement des infos Transporteur, Méthode de paiement, Date d'expédition, Emballage cadeau
  • Ajout d'un quadrillage sur la liste des produits
  • Petites modifications dans le pied de page (ponctuation, infos vendeur en gras)
Nouvelles modifs :
  • Ajout d'une couleur sur le total TTC pour qu'il soit plus visible
  • Relookage et centrage du tableau des taxes (c'était un peu confus...)
  • Un peu plus d'espace entre en-tête et adresses, et entre adresse et liste de produit
  • Possibilité d'afficher l'écotaxe (si présent) sous le prix unitaire de chaque produit
  • Possibilité d'afficher le prix total HT pour chaque ligne produit
  • Possibilité d'afficher une colonne TVA dans la liste des produits
  • Possibilité d'afficher le total des taxes de la commande (entre total HT et total TTC)
Les options ci dessus sont configurable dans la fonction InitCustomValues() au début du fichier
  • Recadrage du tableau produit des bons de livraison au même format que celui des factures
  • Correction d'un bug d'affichage des adresses sur les bons de retour
  • [Edit 18/01/2013]
  • Ajout de la possibilité d'afficher ou non la colonne référence (et d'en régler la taille)
Il s'agit d'une surcharge, donc à placer dans "votre-boutique/override/classes/"

override-classes-PDF.php.zip 10.5KB 257 downloads

override-classes-PDF.php.zip (MAJ 13/12/2013)

 

Pour ceux qui ont des difficultés avec l'override (notamment PS 1.4.4, 1.4.3) voici aussi une version de remplacement de la classe pdf, avec les mêmes modifs. A copier donc dans "votre-boutique/classes/" en prenant soin d'effectuer d'abord une sauvegarde du fichier original. (et sans utiliser le fichier override)

remplacement-classes-PDF.php.zip 13.23KB 140 downloads

remplacement-classes-PDF.php.zip (MAJ 13/12/2013)

 

(MAJ 13/12/2013)

Correction d'erreurs d'affichage avec les produits personnalisés et avec les clients en affichage hors taxe.

 

Une fois le fichier mis en place, il faudra également vous rendre dans votre back office (Outils => Traductions => Traduction des fichiers PDF) et traduire les chaines suivantes :

Date: -> Date :

Delivery address -> Adresse de livraison

Invoicing address -> Adresse de facturation

Invoicing and delivery address -> Adresse de facturation et de livraison

Gift-wrapped order: -> Emballage cadeau :

YES -> OUI

NO -> NON

include -> dont

for ecotax -> d'écotaxe

VAT -> TVA

 

Et pendant que vous y êtes vous pouvez aussi (si ce n'est pas déjà fait) corriger une petite coquille :

"Numéro d'identification fiscale :" au lieu de "Numéro d'indentification fiscale:"

 

Voila, ce n'est pas une révolution mais je trouve que le résultat est un peu plus "pro" que l'original...

 

Voici en exemple une facture "full options" <_<

Facture_améliorée_PS1.4.pdf

 

Si vous voulez ajouter vos CGV à la suite de vos factures, vous pouvez utiliser les versions présentées ici : http://www.prestasho...ost__p__1057704

Edited by Mellow (see edit history)
  • Like 7
Link to comment
Share on other sites

Par contre comment faire pour avoir le trait du cadre adresse plus fin ?

Pour le cadre adresse, ligne 303

 $pdf->SetLineWidth(0.3);  // passer à 0.2 au lieu de 0.3 (on ne peut pas faire plus fin)

 

J'ai mis quelques commentaires dans le fichier pour repérer d'autres détails qui peuvent être facilement modifiés, comme par exemple la taille du logo ou encore la couleur du texte "Facture n° FAXXXXXX" pour coller à votre charte graphique.

Link to comment
Share on other sites

Et pour l'espacement entre la date et le cadre adresse facturation et livraison ? puis entre le cadre adresse et mode de livraison ?

 

Ligne 234

 $pdf->SetY(30);  // 30mm position des adresses. tous ce qui est en dessous bougera avec

 

 

Ligne 318, juste avant

 return $addressType;

insérer

 $pdf->Ln(X);	  // Saut de ligne de Xmm

La logique juste avant est un peu bizarre, mais elle existait déjà, j'ai pas vraiment cherché à comprendre

 

Dans cet espace il y a aussi le n° d'identification fiscale qui apparait s'il est présent. Il sera décalé avec le reste des infos (transporteur etc...)

Link to comment
Share on other sites

Nouvelles modifs :

  • Ajout d'une couleur sur le total TTC pour qu'il soit plus visible
  • Relookage et centrage du tableau des taxes (c'était un peu confus...)
  • Un peu plus d'espace entre en-tête et adresses, et entre adresse et liste de produit (merci du retour Le-cathare, c'est mieux comme ça)

Le tableau des taxes peut être modifié à la ligne 860

La couleur du total TTC est fixé en ligne 607 et 615

 

J'ai mis à jour le message initial

 

Bon week-end :)

Link to comment
Share on other sites

Autre idée,

 

Je sais pas si c'est dans ton fichier qui faut faire la modif.

 

Comment rajouter l'éco taxe sous chaque ligne produit (dont éco-taxe : xx €), car la réglementation impose que jusque en février 2013 l'éco taxe soit distincte a chaque produit.

 

sa fait deux an que j'utilise prestashop et sur le forum j'ai poster plusieurs post sans réponse

 

Sur mon logiciel (Batigest) de facturation magasin je peut le faire

 

Aussi j'ai fait une petite modif sur la couleur des ligne du cadre adresse et produit. a la ligne 304 ajouter

$pdf->SetDrawColor(150, 150, 150); // Couleur de bordure du tableau . Après pour la couleur c'est a vous de jouer

 

Bon WE

Edited by Le-cathare (see edit history)
Link to comment
Share on other sites

Autre idée, Je sais pas si c'est dans ton fichier qui faut faire la modif. Comment rajouter l'éco taxe sous chaque ligne produit (dont éco-taxe : xx €),

 

Je viens de mettre une version avec l'écotaxe individuel sous le prix unitaire.

Il faudra traduire en plus :

include => dont

for ecotax => d'écotaxe

 

Dans les jours qui viennent je rajouterais une variable pour choisir d'afficher ou pas l'écotaxe individuel

Edited by Mellow (see edit history)
Link to comment
Share on other sites

Croyez vous qu'il serait possible d'avoir dans la description produit le tarif en HT Mais aussi, entre le total HT et le total TTC : le total TVA ? Merci

 

Ok, je regarderais ça aussi

 

Peut-être plutôt mettre le total HT en petit en dessous tu total TTC ? (pour chaque produit)

Avec le choix de l'afficher ou pas

Qu'en pense-tu ?

Edited by Mellow (see edit history)
Link to comment
Share on other sites

Je viens de mettre une version avec l'écotaxe individuel sous le prix unitaire.

Il faudra traduire en plus :

include => dont

for ecotax => d'écotaxe

 

Dans les jours qui viennent je rajouterais une variable pour choisir d'afficher ou pas l'écotaxe individuel

 

Cool

 

Un grand merci Mellow . I happy :)

Link to comment
Share on other sites

Hé bien voila, version finale (je pense) :

- Possibilité d'afficher ou pas l'écotaxe

- Possibilité d'afficher le prix total HT pour chaque ligne produit

- Possibilité d'afficher une colonne TVA dans la liste des produits

- Possibilité d'afficher le total des taxes de la commande (entre total HT et total TTC)

 

Tout est dans le premier message

Link to comment
Share on other sites

Je rencontre une petit soucis avec mes traductions impossible de traduire certains item qui n'apparaissent pas dans le fichier traduction....pourquoi? une idée?

 

Non, je ne vois pas... mais je ne connais pas trop PS 1.4.4, peut-être qu'il y a des petites différences de fonctionnement

 

Pourrais-tu préciser quelles expressions n'apparaissent pas dans la page traduction ?

Je regarderais déjà dans quelles fonctions elles sont appelées, ça donnera peut-être une idée...

Link to comment
Share on other sites

Je rencontre le même soucis que lennynero.

Je n'arrive pas à trouver comment traduire certains chaines.

Invoicing and delivery address, Total products (tax excl.), Total products (tax incl.), Total discounts (tax incl.)

 

Ma boutique est en version 1.4.3

Link to comment
Share on other sites

Bon ben j'ai téléchargé PS 1.4.3 et 1.4.4 pour comparer, et le PDF.php de PS1.4.9 que j'ai utilisé a subit pas mal de modifications depuis ces versions, c'est pourquoi ça ne colle pas parfaitement. (même entre 1.4.3 et 1.4.4 la classe pdf est différente...)

 

Je ne vous le promet pas pour tout de suite, mais j'installerais ces versions pour voir si ça peut se gérer dans un même fichier.

Link to comment
Share on other sites

Merci pour ton implication à résoudre nos problèmes ;)

 

Pas de décalage du tableau Description-Référence-Prix-Quantité... dans mon cas.

Merci de ta réponse,

 

voici une copie d'écranpost-22676-0-09943900-1355519538_thumb.jpg

 

Vois tu aussi le décallage à gauche?

 

merci de ton aide

Link to comment
Share on other sites

Aucune idée car je ne réalise pas de devis.

Je ne connais pas cette fonctionnalité de Prestashop :unsure:

Est-ce un module additionnel?

 

Bonjour Nutrinat,

 

Je me suis mal exprimé tu as le même décalage que moi à gauchecar la largeur du tableau du devis et plus petite que celle de la facture.

 

A+

Link to comment
Share on other sites

Oui effectivement, le fichier d'origine ne gère pas de devis

Ce ne serait pas plutôt le tableau produit des bons de livraison ?

 

Si c'est sur les bons de livraison, je recadrerais le tableau au même format que celui des factures

Link to comment
Share on other sites

Bonjour,

 

Tout à fait, c'est la solution. Mais il faut carrément remplacer la classe ET effectuer les modifs directement dessus, sans passer par l'override. Car le problème vient du fait que certaines versions ne semblent pas gérer les traductions des chaines se trouvant dans les fichiers override.

 

J'ai fait un autre fichier, qui cette fois ci n'est pas un override mais un remplacement de la classe pdf, avec les mêmes modifs.

A copier donc dans /classes/ en prenant soin d'effectuer d'abord une sauvegarde du fichier original (pensez aussi à supprimer le précédent override)

Voir message original http://www.prestasho...ost__p__1031228

 

La base c'est toujours la version de PS1.4.9, mais j'ai testé sur PS 1.4.4 et 1.4.3 et tout à l'air de bien fonctionner, les chaines à traduire sont présentes en BO (plus 1 ou 2 autres qui n'existaient pas sur ces versions), et les factures sont générés correctement.

 

Mais on ne peut pas toujours tester tous les cas particuliers alors vous me direz ce que ça donne chez vous...

 

[Édit] Au passage j'ai aussi recadrer le tableau des bons de livraison, et corrigé un pb d'affichage des adresses sur les bons de retour.

Edited by Mellow (see edit history)
Link to comment
Share on other sites

Pas de soucis, voici les infos :

 

lignes 971 et 997

$w = array(120, 30, 10);  // Le tableau faisait 160mm (trois cellules 120+30+10)

a été remplacé par

$w = array(150, 30, 10);

 

ensuite lignes 975, 1085, 1102

if ($delivery)
$this->SetX(25);  // et avait une marge de gauche de 15mm (début à 25mm)

remplacé par

if ($delivery)
$this->SetX(10);

 

et enfin lignes 1090, et 1109

($delivery ? 15 : 0) // c'était une compensation pour les 15mm de marge

remplacé par

($delivery ? 0 : 0)

Link to comment
Share on other sites

Oui.

La taille du logo est définit par sa hauteur en millimètres.

Dans la fonction "header" il y a 4 lignes de ce type

$this->Image(_PS_IMG_DIR_.'/logo_invoice.jpg', 10, 8, 0, 24);	// <= 24mm Hauteur du logo

 

Et si nécessaire on peut faire débuter le texte plus bas (à partir des adresses)

Au début de la fonction "generateHeaderAddresses"

$pdf->SetY(40);	// <= 40mm position verticale des adresses

Link to comment
Share on other sites

Cherche le commentaire "Couleur texte Total TTC"

et juste en dessous, remplace

   $pdf->Cell($width, 0, self::l('Total').' '.(self::$_priceDisplayMethod == PS_TAX_EXC ? self::l(' (tax excl.)') : self::l(' (tax incl.)')).' : ', 0, 0, 'R');
   $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice((self::$_priceDisplayMethod == PS_TAX_EXC ? $priceBreakDown['totalWithoutTax'] : $priceBreakDown['totalWithTax']), self::$currency, true)), 0, 0, 'R');

par

   $pdf->SetFontSize(12);	/* nouvelle taille de police */
   $pdf->Cell($width, 0, self::l('Total').' '.(self::$_priceDisplayMethod == PS_TAX_EXC ? self::l(' (tax excl.)') : self::l(' (tax incl.)')).' : ', 0, 0, 'R');
   $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice((self::$_priceDisplayMethod == PS_TAX_EXC ? $priceBreakDown['totalWithoutTax'] : $priceBreakDown['totalWithTax']), self::$currency, true)), 0, 0, 'R');
   $pdf->SetFontSize(8);	/* retour à la taille initiale */

 

Toute la documentation de fpdf est ici : http://www.fpdf.org/fr/

Link to comment
Share on other sites

Je voulais savoir si c'était possible d'envisager l'intégration de l'override PDF.php de cette discussion http://www.prestasho...on-de-commande/ à savoir les CGV à la suite de la facture ?

 

Je savais que ces deux discussions se rejoindraient d'une façon ou d'une autre.

 

Alors oui, c'est possible, il faut récupérer le fichier de l'autre discussion, en extraire le code concernant les CGV, et intégrer ce code au(x) fichier(s) de ce sujet.

 

De mémoire, il devrait y avoir deux modifications à faire, une sur la fonction invoice() ou il faudra rajouter une ligne vers la fin, et l'autre sur les fonctions header() et footer() qu'il faudra adapter.

Si quelqu'un veut se lancer...

 

Mais sinon je rajouterais ça à la rentrée :)

Edited by Mellow (see edit history)
Link to comment
Share on other sites

Cette contribution marche t'elle sur la v 1.5.2 ? Merci

C'est précisé dans le premier post, ces modifs ne sont pas du tout compatible avec PS 1.5.x

 

La génération des pdf est totalement différente, par contre PS1.5 possède un système de templates pour personnaliser les documents générés.

Link to comment
Share on other sites

Bonsoir à tous,

 

j'ai "joué" avec cette modification qui est géniale.

Je cherche à mettre un texte comme l'éco-taxe mais sous le texte de la description. (product_name)

Voici le code que je souhaite intégrer

 

 $this->SetFont(self::fontname(), 'B', 6);
 for($i=1;$i<$product['product_quantity']+1;$i++){
  $sql="SELECT `numero` FROM `"._DB_PREFIX_."numero_de_serie` where `id_product`='".$product['product_id']."' and `id_order`='".self::$order->id."' and `quantite`='".$i."';";
  if($result=Db::getInstance()->ExecuteS($sql) and $result[0]['numero']!=''){
   $num=array("KL22FFF","KL55555","KL8685","KL96584");
   if($delivery)
    $this->SetX(10);
   else
    $this->SetX(10);
   $this->Cell(50, 4, self::l('Numero de serie').' '.$i." : ".$result[0]['numero'], 'N');
   $this->Ln();
  }
 }
 $this->SetFont(self::fontname(), '', 8);

 

Je pense que je dois insérer ma modification avant ce code (ligne 906)

 $before = $this->GetY();
 $this->MultiCell($w[++$i],6, Tools::iconv('utf-8', self::encoding(), $product['product_name']), 'LRB');

 

je pense que je dois reprendre ce code mais, quelque chose m'échappe ...

 

 if (!$delivery) {

  // Mellow : Gestion de l'affichage de l'ecotaxe si present
  if (self::$_priceDisplayMethod != PS_TAX_EXC AND $product['ecotax'] != 0 AND $Show_Value_Ecotax == 1) {

   // Calcul de l'ecotaxe reelle a partir de $product['ecotax'] et $product['ecotax_tax_rate']
   $unit_ecotax = $product['ecotax'] * (1 + $product['ecotax_tax_rate'] / 100);

   // On ecrit d'abord une case vide pour dessiner les bordures et conserver la structure du tableau
   $beforeX = $this->GetX();
   $beforeY = $this->GetY();
   $this->Cell($w[++$i], $lineSize, ' ', 'LRB', 0, 'R');
   $afterX = $this->GetX();
   $afterY = $this->GetY();

   // Retour dans la case vide pour ecrire le prix unitaire (legerement plus haut)
   $this->SetXY($beforeX, $beforeY -0.9);
   $this->SetFont(self::fontname(), '', 8);			   // <= Taille du texte
   $this->Cell($w[$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price, self::$currency, true)), 0, 0, 'R');

   // Puis ecriture de l'ecotaxe juste en dessous
   $this->SetXY($beforeX, $beforeY +1.7);
   $this->SetFont(self::fontname(), '', 5.5);			  // <= Taille du texte
   $this->SetTextColor(0,150,0);						   // <= Couleur du texte
   $this->Cell($w[$i], $lineSize, '('.self::l('include').' '.self::convertSign(Tools::displayPrice($unit_ecotax, self::$currency, true)).' '.self::l('for ecotax').')', 0, 0, 'R');

   // Et retour en fin de case pour continuer le tableau
   $this->SetFont(self::fontname(), '', 8);
   $this->SetTextColor(0,0,0);
   $this->SetXY($afterX, $afterY);

  } else
   $this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price, self::$currency, true)), 'LRB', 0, 'R');

 }

 

Merci par avance de l'aide possible

Edited by aPlancon69 (see edit history)
Link to comment
Share on other sites

Bonjour,

 

Tu ne pourra pas faire la même manip sur les cellules description car elle ne sont pas du même type que les autres (MultiCell au lieu de Cell)

 

La description étant susceptible d'être longue, on utilise MultiCell parce qu'il autorise les retours à la ligne. Seulement, on ne sait pas à l'avance quel sera la hauteur du MultiCell, ça dépendra de la taille de la description.

D'ailleurs c'est à partir de cette cellule qu'on va fixer la hauteur des autres cellules pour continuer à tracer le tableau :

$before = $this->GetY();   // position avant MultiCell
$this->MultiCell(...............................);
$lineSize = $this->GetY() - $before;   // calcul de la hauteur après MultiCell

 

Donc le plus simple à mon avis, c'est de mettre en forme ton(tes) n° de série dans une chaine, puis de forcer un retour à la ligne supplémentaire à la fin de la description pour afficher cette chaine (si nécessaire) :

if (il-y-a-des-numeros-de-serie) {
$numeros_de_serie = self::l('Numeros de serie : ');
foreach (.........) {
	$numeros_de_serie .= // <- concaténation des n° dans une chaine
}
}
else
$numeros_de_serie = null;

// ensuite on ajoute dans le MultiCell si necessaire
$before = $this->GetY();
$this->MultiCell($w[++$i],6, Tools::iconv('utf-8', self::encoding(), $product['product_name'])
.($numeros_de_serie ? "\n".$numeros_de_serie : ''), 'LRB');
$lineSize = $this->GetY() - $before;

Seulement là tu n'aura pas de mise en forme particulière pour le n° de série, il sera au même format que la description.

 

Note l'utilisation des doubles quotes pour "\n" c'est nécessaire car fpdf (ou php, je ne sais pas trop...) n’interprète pas le '\n' avec simples quotes comme un retour à la ligne

Link to comment
Share on other sites

Hé bien c'est pas fini ;) voici les mêmes fichiers avec l'ajout des CGV en fin de facture

 

En plus des modifications de mise en forme des factures, ces versions vont aussi récupérer le contenu de la page cms CGV (dans la langue de l'utilisateur) et l'insérer à la suite de la facture. Ainsi le client recevra un exemplaire des CGV avec sa facture dans le mail de confirmation de commande. Ceci pour coller le plus possible aux nouvelles dispositions européennes.

cf. http://www.prestasho...on-de-commande/

 

Le script permet également de proposer les CGV en téléchargement au format pdf, par l'intermédiaire du fichier pdf-cgv.php à placer dans le répertoire racine du site.

Il suffira alors de créer un lien de téléchargement en insérant le code suivant à l'endroit souhaité

<a href="http://nom-du-site/pdf-cgv.php">Telechargez nos CGV</a>
ou
<a href="pdf-cgv.php">Telechargez nos CGV</a>
Les CGV sont générés en texte brut, sans aucune mise en forme. Seul le titre pourra être formaté, à condition qu'il soit placé dans une balise <h2></h2> (comme le texte CGV par défaut de prestashop)

 

Par défaut le texte des CGV est en taille 6 sur deux colonnes, ça reste très lisible et la plupart des CGV devrait tenir sur 1 ou 2 pages. Mais la taille de police peut être changé dans la fonction InitCustomValues() ainsi que le nombre de colonnes (1 ou 2)

 

Merci à Prestaspirit qui est l'auteur initial de la modif permettant d'insérer les CGV à la suite de la facture.

 

La version override, pour PS 1.4.7.x -> 1.4.9.0 (peut-être 1.4.5.x et 1.4.6.x ?)

pdf-cgv.php+override-classes-PDF.php.zip 12.38KB 68 downloads

pdf-cgv.php+override-classes-PDF.php.zip (MAJ 13/12/2013)

 

La version remplacement, pour PS 1.4.3.x, 1.4.4.x (peut-être 1.4.x ?)

pdf-cgv.php+remplacement-classes-PDF.php.zip 15.19KB 27 downloads

pdf-cgv.php+remplacement-classes-PDF.php.zip (MAJ 13/12/2013)

 

Fichier exemple :

Facture+CGV.pdf

 

[MAJ] 06/01/2013 Correction d'une petite erreur de code et ajout de la sélection du nombre de colonnes cgv

[MAJ] 18/01/2013 Correction d'une erreur sur l'édition des factures multiples (chaque facture était suivi des CGV)

(MAJ 13/12/2013) Correction d'erreurs d'affichage avec les produits personnalisés et avec les clients en affichage hors taxe.

Edited by Mellow (see edit history)
Link to comment
Share on other sites

Bonsoir à tous,

 

j'ai "joué" avec cette modification qui est géniale.

Je cherche à mettre un texte comme l'éco-taxe mais sous le texte de la description. (product_name)

Voici le code que je souhaite intégrer

 

 $this->SetFont(self::fontname(), 'B', 6);
 for($i=1;$i<$product['product_quantity']+1;$i++){
  $sql="SELECT `numero` FROM `"._DB_PREFIX_."numero_de_serie` where `id_product`='".$product['product_id']."' and `id_order`='".self::$order->id."' and `quantite`='".$i."';";
  if($result=Db::getInstance()->ExecuteS($sql) and $result[0]['numero']!=''){
   $num=array("KL22FFF","KL55555","KL8685","KL96584");
   if($delivery)
	$this->SetX(10);
   else
	$this->SetX(10);
   $this->Cell(50, 4, self::l('Numero de serie').' '.$i." : ".$result[0]['numero'], 'N');
   $this->Ln();
  }
 }
 $this->SetFont(self::fontname(), '', 8);

 

Je pense que je dois insérer ma modification avant ce code (ligne 906)

 $before = $this->GetY();
 $this->MultiCell($w[++$i],6, Tools::iconv('utf-8', self::encoding(), $product['product_name']), 'LRB');

 

je pense que je dois reprendre ce code mais, quelque chose m'échappe ...

 

 if (!$delivery) {

  // Mellow : Gestion de l'affichage de l'ecotaxe si present
  if (self::$_priceDisplayMethod != PS_TAX_EXC AND $product['ecotax'] != 0 AND $Show_Value_Ecotax == 1) {

   // Calcul de l'ecotaxe reelle a partir de $product['ecotax'] et $product['ecotax_tax_rate']
   $unit_ecotax = $product['ecotax'] * (1 + $product['ecotax_tax_rate'] / 100);

   // On ecrit d'abord une case vide pour dessiner les bordures et conserver la structure du tableau
   $beforeX = $this->GetX();
   $beforeY = $this->GetY();
   $this->Cell($w[++$i], $lineSize, ' ', 'LRB', 0, 'R');
   $afterX = $this->GetX();
   $afterY = $this->GetY();

   // Retour dans la case vide pour ecrire le prix unitaire (legerement plus haut)
   $this->SetXY($beforeX, $beforeY -0.9);
   $this->SetFont(self::fontname(), '', 8);			   // <= Taille du texte
   $this->Cell($w[$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price, self::$currency, true)), 0, 0, 'R');

   // Puis ecriture de l'ecotaxe juste en dessous
   $this->SetXY($beforeX, $beforeY +1.7);
   $this->SetFont(self::fontname(), '', 5.5);			  // <= Taille du texte
   $this->SetTextColor(0,150,0);						   // <= Couleur du texte
   $this->Cell($w[$i], $lineSize, '('.self::l('include').' '.self::convertSign(Tools::displayPrice($unit_ecotax, self::$currency, true)).' '.self::l('for ecotax').')', 0, 0, 'R');

   // Et retour en fin de case pour continuer le tableau
   $this->SetFont(self::fontname(), '', 8);
   $this->SetTextColor(0,0,0);
   $this->SetXY($afterX, $afterY);

  } else
   $this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price, self::$currency, true)), 'LRB', 0, 'R');

 }

 

Merci par avance de l'aide possible

 

Bonjour,

 

j'ai découvert cette modification & j'en suis fan !

Nous avons je pense, le module pour les numéro de série mais, personnellement, je souhaite le mettre sous la référence avec le même style que le "Total". Je suis totalement novice en la matière mais, je pense qu'il faut reprendre le code utilisé pour afficher le total + le Total HT ?

 

En pièce jointe, j'ai mis mon idée

 

post-454911-0-25366300-1357377413_thumb.png

Link to comment
Share on other sites

Je cherche à mettre un texte comme l'éco-taxe mais sous le texte de la description. (product_name)

je pense que je dois reprendre ce code mais, quelque chose m'échappe ...

Nous avons je pense, le module pour les numéro de série mais, personnellement, je souhaite le mettre sous la référence avec le même style que le "Total". Je suis totalement novice en la matière mais, je pense qu'il faut reprendre le code utilisé pour afficher le total + le Total HT ?

 

Bonjour,

Dans les deux cas il faut refaire une logique. ça peut sembler simple comme ça, mais avec le mode de fonctionnement de fpdf, toute nouvelle mise en forme dans un tableau peut vite devenir un casse tête (en fait, on ne dessine pas vraiment de tableau, on trace des cellules successives qu'on dispose de manière à former un tableau)

 

Mais il se trouve que j'adore ce genre de casse tête :blink: alors voici un bout de code qui devrait vous convenir à tous les deux :

 

A insérer dans la fonction ProdTab() à la place de :

$before = $this->GetY();
$this->MultiCell($w[++$i],6, Tools::iconv('utf-8', self::encoding(), $product['product_name']), 'LRB');
$lineSize = $this->GetY() - $before;
$this->SetXY($this->GetX() + $w[0] + ($delivery ? 0 : 0), $this->GetY() - $lineSize);
$this->Cell($w[++$i], $lineSize, ($product['product_reference'] ? Tools::iconv('utf-8', self::encoding(), $product['product_reference']) : '--'), 'LRB');

 

Nouveau code :

/* >>>>>> DEBUT TRAITEMENT NUMERO DE SERIE <<<<<< */

/* Ici il faudra extraire vos numeros de serie */

/* On considere qu'ils sont dans le tableau $results */
$results = array('XXX', 'YYY', 'ZZZ');	// Valeur de test qui sera a supprimer au final !

$Aff = 'desc';	// Emplacement des numeros de serie ('desc' ou 'ref')

if (count($results)) {
	// pour la cellule description on fabriquera une chaine en ligne "Serials : XXX - YYY - ZZZ"
	if ($Aff == 'desc') {	
		$serials = (count($results) > 1 ? 'Serials : ' : 'Serial : ');
		$separateur = ' - ';
	}
	// pour la cellule reference ce sera une chaine avec des retours a la ligne "XXX\nYYY\nZZZ"
	else {				
		$serials = '';
		$separateur = chr(13).chr(10);	// retour a la ligne "\n"
	}	
	foreach ($results as $key => $result)
		if ($key == 0) $serials .= $result;	// premier numero
		else $serials .= $separateur.$result;	// numeros suivants
}	
else
	$serials = null;	// si il n'y a pas de numero de serie

$before = $this->GetY();

/* Ici, dans tous les cas on ecrira la description (sans tracer la ligne du bas de la colonne) */
$this->MultiCell($w[++$i],4, Tools::iconv('utf-8', self::encoding(), $product['product_name']), 'LR');

/* si on affiche les serials sous la description */				
if ($serials AND $Aff == 'desc') {
	$this->SetFont(self::fontname(), '', 6);
	$this->SetTextColor(140);
	$this->MultiCell($w[$i],3, $serials, 'LRB');	// serials + ligne du bas
	$this->SetFont(self::fontname(), '', 8);
	$this->SetTextColor(0);
}
/* si il n'y a pas de serials ou pas d'emplacement definit */
elseif (!$serials OR $Aff != 'ref') {
	// on va tracer la ligne du bas en s'arrangeant pour obtenir un $LineSize de 6 minimum !
	// (reserve de hauteur pour ecotaxe et prix HT)
	$this->MultiCell($w[$i], ($this->GetY() - $before < 6 ? 6 - ($this->GetY() - $before) : 0), '', 'LRB');	
}

/* hauteur de ligne de la cellue description */
$lineSize = $this->GetY() - $before;
$this->SetXY($this->GetX() + $w[0], $before);	// on se positionne dans la colonne reference

/* Ici, dans tous les cas on va ecrire la reference (sans tracer la ligne du bas de la colonne) */
$this->Cell($w[++$i], 4, ($product['product_reference'] ? Tools::iconv('utf-8', self::encoding(), $product['product_reference']) : '--'), 'LR', 2);

/* si on affiche les serials sous la reference */
if ($serials AND $Aff == 'ref') {
	$this->SetFont(self::fontname(), '', 6);
	$this->SetTextColor(140);
	$this->MultiCell($w[$i],3, $serials, 'LR');	// on ecrit les numeros de serie, sans ligne du bas !
	$this->SetFont(self::fontname(), '', 8);
	$this->SetTextColor(0);

	// si la cellule reference est plus haute que la cellule description on definit le nouveau $lineSize
	if ($this->GetY() > ($before + $lineSize)) $lineSize = $this->GetY() - $before;	

	// et on trace a la suite les lignes du bas des cellules description et reference
	$this->SetXY($this->GetX(), $before);		// on se repositionne au debut de la cellule description
	$this->Cell($w[$i-1], $lineSize, '', 'LRB', 0);	// bas de cellule desc et on reste sur a meme ligne !
	$this->Cell($w[$i], $lineSize, '', 'LRB', 0);	// bas cellule ref et on reste sur a meme ligne  !

}
/* dans tous les autres cas, c'est le $lineSize de la cellule description qui compte */
else {
	// on l'utilise donc pour tracer le bas de la cellule reference
	$this->Cell($w[$i], $before + $lineSize - $this->GetY(), '', 'LRB', 0);	// ligne du bas
}
$this->SetXY($this->GetX(), $before); // on se positionne dans la colonne suivante

/* >>>>>> FIN NUMERO DE SERIE <<<<<< */

 

Il y a peut-être plus simple, mais j'en doute quand même.

 

A vous maintenant d'extraire vos numéros de série...

 

Résultats :

post-344943-0-48448700-1357430378_thumb.png post-344943-0-90090300-1357430394_thumb.png

Edited by Mellow (see edit history)
Link to comment
Share on other sites

Bonjour Mellow, dans les cms j'ai bien mes cgv mais la page texte ou faut il la mettre

 

j'ai creer un dossier cgv a la racine avec les cgv au format texte , mais ça n'a pas l'air d'être ça , désolé de mon incompétence

 

dans les préférences les cgv sont cochés OUI avec la page des conditions d'utilisation

Edited by laurens (see edit history)
Link to comment
Share on other sites

Non non, on s'est mal compris, il n'y a pas de fichier texte ou dossier supplémentaire à ajouter.

 

Je voulais dire que la page cms cgv doit effectivement contenir du texte, et être configurée dans les préférences du site :

Back office => Préférences => activer l'option "Conditions générales de vente", et sélectionner la page cms correspondante.

Link to comment
Share on other sites

Ah... effectivement il y a un problème !

 

Donc tu me dis que la facture s'affiche bien, avec la nouvelle mise en forme, mais avec une deuxième page blanche !

ça veux dire que les deux parties du script s'exécutent bien, puisque la deuxième page est générée, mais pour une raison inconnue il n'arrive pas a trouver la page des cgv (ou il n'arrive pas à en extraire le texte)

 

Tu pourrais essayer de sélectionner une autre page pour les cgv dans tes préférences. Idéalement une nouvelle page avec juste un texte simple sans mise en forme.

Si cette page s'affiche dans la facture ça voudra dire qu'il y a quelque chose qui bloque dans le code html de la page cgv.

Sinon, c'est que le script ne trouve vraiment pas la bonne page.

 

de mon coté j'essaye également de reproduire ça

Link to comment
Share on other sites

ok, donc c'est bien le code de la page qui pose problème.

 

Alors la première piste qui me viens à l'esprit c'est le copié/collé depuis Word.

 

On utilise souvent Word pour taper nos textes et les mettre en forme, mais le problème c'est que Word (et d'autres éditeurs aussi) insère un tas de code supplémentaire dans le texte, et lorsqu'on fait un copié/collé tout ce code est reproduit dans la page.

La plus part du temps c'est totalement transparent parce que ce code n'est pas interprété par les navigateurs, mais lorsqu'un script essaye de charger ce code ça pose parfois des problèmes...

 

Le mieux pour supprimer ce code parasite, c'est de copier et coller le texte complet dans un éditeur de texte simple (notepad par exemple)

Ensuite refaire un copié/collé depuis notepad vers l'éditeur de page cms

Et enfin refaire la mise en page directement dans l'éditeur (notepad aura supprimer toute la mise en page)

 

Bien sur c'est moins pratique de travailler trois pages avec l'éditeur de prestashop qu'avec un "vrai" logiciel, mais comme ça tu sera sur d'avoir un code "propre".

 

PS: en parlant d'apostrophe, je me souvient avoir déjà rencontré des pb avec un texte ou les apostrophes normaux ' étaient remplacé par des ` à voir...

Si tu as un lien, je pourrais aller jeter un oeil au code de la page...

Edited by Mellow (see edit history)
Link to comment
Share on other sites

Pas de problème, content que ça marche finalement.

 

Alors pour passer sur une colonne il faut rechercher les 4 endroits dans le code ou il y a :

MultiCell(93 et les remplacer par MultiCell(190

et ensuite remplacer aussi if($this->col<1) par if($this->col<0)

 

C'est vrai que cette option pourrait être rajouté, mais j'ai fait des essais et la ou je gagne le plus de place c'est sur 2 colonnes.

 

Comme j'ai remarqué une petite erreur dans le code je vais mettre à jour les fichiers et j'en profiterais pour rajouter cette option.

Link to comment
Share on other sites

Hello mellow,

 

Thanks for this great override pdf , looks really great ;)

Just one question, what part to comment out the cms ?

I do not want the cms part shown on invoice, i try to comment out in de override file the last part but then it shows a empty page.

Hope you can point me in de right direction.

 

Thanks for sharing.

 

Best regards,

 

ysco..

Link to comment
Share on other sites

Hi ysco

 

Just find and comment out this line (at the end of invoice() function)

  	 if (!self::$delivery) $pdf->addCgv(); // Ajout CGV a la suite de la facture

you will still be able to use the pdf-cgv.php to make a download link for your terms and conditions of use

 

Regards

Edited by Mellow (see edit history)
Link to comment
Share on other sites

Hello Mellow,

 

Thanks for your quick reply, will try your suggestion.

About pdf.cgv.php , where to put this file ( is this going in de root ? )

I have now only added the override file in classes, i could not find where to put the other file and do not know if it needs to be anywhere

Is there a readme how to ?

 

Thanks.

 

Best regards,

 

ysco..

Link to comment
Share on other sites

Hello Mellow,

 

Well i comment out with your suggestion and cms is not loaded anymore ( Great ) ;)

I already have translated the first topic with google but could not find where to place the pdf.cgv.php ( i thought that i was going to root but wasn't sure )

So i can add in the pdf.cgv.php for example the cms link and can be called by the url ?

And if you do not use this the file is not needed in the root then.

How should the link be added in that file, is there a example off it ?

Sorry for all the trouble ;)

 

Edit:

Just added the file in root and when the url is clicked it loads the CMS with terms and conditions automatically. (Cool )

 

 

Regards,

 

ysco..

Edited by ysco (see edit history)
Link to comment
Share on other sites

Ok, I see that you managed to make it work ;)

 

pdf-cgv.php is to use in case you want to place somewhere a link to give your customers the ability of downloading your terms and conditions.

But if you don't need this feature you can just take the files in the first post.

Link to comment
Share on other sites

Thanks Mellow,

 

Outstanding Override ;)

Any plans for 1.5.x , i m still on 1.4.8.2 and will go to 1.5.x when my template and modules are all compatible with PS 1.5.x and would be nice when your override is also working on the latest version.

 

Thanks again for all,

 

Regards,

 

ysco..

Link to comment
Share on other sites

Bonjour, comment forcer les majuscules dans l'adresse du client car si le client écrit en minuscules le nom apparait en minuscules ainsi que la ville ça fait pas très net

Merci

 

Je pense qu'il faudrait mettre que la 1ere lettre en majuscules pour le nom et le prénom car j'ai des client(e)s qui ont inversé les 2 lors de l'inscription

Edited by laurens (see edit history)
Link to comment
Share on other sites

Bonjour, j'ai fait des recherche pour mon problème de majuscules et j'ai trouver ceci

mais quand je vais sur le site , page blanche et en back office la liste des clients à disparus

quelqu'un a une idée

Merci

 

 

Autant pour moi , j'ai fait une erreur de frappe mais il y a quand même un souci car je me suis inscrit avec un prénom avec un accent ( et oui on est jamais trop prudent) et la , le prénom éric devient Ric :unsure:

 

Résolu:

remplacé $fields['firstname'] = pSQL(Tools::ucfirst(strtolower($this->firstname)));

par $fields['firstname'] = pSQL(Tools::ucfirst($this->firstname));

Edited by laurens (see edit history)
Link to comment
Share on other sites

Résolu:

remplacé $fields['firstname'] = pSQL(Tools::ucfirst(strtolower($this->firstname)));

par $fields['firstname'] = pSQL(Tools::ucfirst($this->firstname));

 

Bonjour,

Je vois que tu as avancé, en effet c'est mieux de faire ça directement sur les classes Customer et Address plutôt que sur la facture.

 

Mais il reste un petit souci. Comme tu as enlevé le strtolower (qui en effet "bouffe" les caractères spéciaux) maintenant si le client à entré son prénom en majuscule il n'y aura aucun changement...

 

Pour que ça soit 100% efficace il faut utiliser la fonction strtolower de la classe Tools de prestashop (qui elle, respecte les caractères spéciaux)

Ce qui donne

$fields['firstname'] = pSQL(Tools::ucfirst(Tools::strtolower($this->firstname)));

Link to comment
Share on other sites

Bonjour,

 

Merci pour ce super module ! Du beau travail, c'est vraiment appréciable..

 

Petite question : mes références sont assez longues, ce qui les fais dépasser de la colonne "Référence" sur la facture. Comment puis-je faire en sorte que celles-ci ne s'affichent pas du tout ou n'afficent qu'un "-" ?!

 

Merci d'avance.

Link to comment
Share on other sites

Bonjour,

 

@presta'luv

Pour le moment tu peux rechercher cette ligne

$this->Cell($w[++$i], $lineSize, ($product['product_reference'] ? Tools::iconv('utf-8', self::encoding(), $product['product_reference']) : '--'), 'LRB');

 

et la remplacer par

$this->Cell($w[++$i], $lineSize, '-', 'LRB');

 

Des que j'aurais le temps, j'ajouterais une option pour afficher ou non la colonne référence (et pourquoi pas même en choisir la taille...)

Link to comment
Share on other sites

Hé bien voila, les fichiers ont été mis à jour avec maintenant la possibilité de régler la taille de la colonne Référence (ou de ne pas l'afficher du tout)

 

Pour les versions avec CGV il y avait un problème lors de l'édition de factures multiples, chaque factures était suivi des CGV. C'est maintenant corrigé, les cgv n'apparaissent que sur les factures individuelles.

  • Like 1
Link to comment
Share on other sites

Bonjour Mellow

 

Petite question je me suis aperçu que c'était la référence du produit qui s'afficher, pourrait on avoir la référence du produit avec la déclinaisons, je m'explique, un produit à une référence par exp: H5476 mais la référence avec déclinaisons peut être H5476 01 ou H5476 02 dans mon exp le 01 ou 02 correspond à une déclinaison

 

2eme question je ne vois plus ou paramétrer le nb de colonne et la taille de la police pour les cgv et surtout je n'ai plus les cgv à la suite de la facture

 

Merci

Link to comment
Share on other sites

Après vérification, pour la référence c'est normal.

On peut attribuer une référence à chaque déclinaisons, et elle est alors affichée sur la facture.

Mais si la déclinaison n'a pas sa propre référence, c'est la référence du produit de base qui est affichée

 

Voila :)

Link to comment
Share on other sites

Je te remercie pour toutes tes explications et pour ta patiente à répondre à toutes nos questions

 

 

edit

encore moi :wub: tu m'ait dans le post 54 ....Les CGV sont générés en texte brut, sans aucune mise en forme. Seul le titre pourra être formaté, à condition qu'il soit placé dans une balise <h2></h2> (comme le texte CGV par défaut de prestashop) peut tu m'expliquer comment placé les balises :(

Edited by laurens (see edit history)
Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

Je souhaiterais inverser l'affichage des coordonnées de facturation et de livraison dans l'entête de facture.

J'utilise des enveloppes à fenêtre pour envoyer mes factures et à l'emplacement de la fenêtre (à droite) apparaît l'adresse de facturation, qui n'est pas toujours la bonne adresse pour la livraison !

 

Et aussi, je souhaiterais supprimer l'impression du n° de téléphone dans l'adresse de livraison. Ce n'est pas terrible en matière de sécurité d'avoir un n° de tél qui apparaît aux yeux de tous les intervenants de la livraison !

 

Merci par avance si vous pouvez m'éclairer car j'ai beaucoup de mal à tout comprendre, bien que je me soigne, mais lentement !

Link to comment
Share on other sites

@Fink

Pour inverser les adresses et supprimer les n° de tel :

 

Dans la fonction invoice()

remplacer

       $addressType = array(
           'delivery' => array(),
           'invoice' => array(),
       );

       $patternRules = array(
           'optional' => array(
               'address2',
               'company'),
           'avoid' => array(
               'State:iso_code'));

par

       $addressType = array(
           'invoice' => array(),        //<=
           'delivery' => array(),        //<=
       );

       $patternRules = array(
           'optional' => array(
               'address2',
               'company'),
           'avoid' => array(
               'phone',                //<=
               'phone_mobile',            //<=
               'State:iso_code'));

 

Dans la fonction generateHeaderAddresses()

remplacer

       if ($addressType['invoice']['addressObject']->id != $addressType['delivery']['addressObject']->id) {
           $pdf->SetXY($pdf->GetX(), $pdf->GetY() +6);
           $pdf->SetFontSize(8);
           $pdf->Cell($width -2.4, 10, self::l('Delivery address'), 0, 'L');

           $pdf->SetXY($pdf->GetX(), $pdf->GetY() -6);
           $pdf->SetFontSize(10);
           $pdf->Cell($width, 10, self::l('Invoicing address'), 0, 'L');

par

       if ($addressType['invoice']['addressObject']->id != $addressType['delivery']['addressObject']->id) {
           $pdf->SetXY($pdf->GetX(), $pdf->GetY() +6);
           $pdf->SetFontSize(8);
           $pdf->Cell($width -2.4, 10, self::l('Invoicing address'), 0, 'L');    //<=

           $pdf->SetXY($pdf->GetX(), $pdf->GetY() -6);
           $pdf->SetFontSize(10);
           $pdf->Cell($width, 10, self::l('Delivery address'), 0, 'L');        //<=

 

et

               if ($type == 'delivery') {
                   if ($addressType['invoice']['addressObject']->id != $addressType['delivery']['addressObject']->id) {

par

               if ($type == 'invoice') {        //<=
                   if ($addressType['invoice']['addressObject']->id != $addressType['delivery']['addressObject']->id) {

 

Ensuite si tu veux augmenter un peu la taille de police de l'adresse de livraison

remplacer

               } else {
                   $pdf->SetFontSize(10);
                   $pdf->MultiCell(94, 4, $addressType[$type]['displayed'], 0, 'L', 0);

par

               } else {
                   $pdf->SetFontSize(12);
                   $pdf->MultiCell(94, 5, $addressType[$type]['displayed'], 0, 'L', 0);

Link to comment
Share on other sites

Un petit détail, Mellow...histoire d'être perfectionniste :

Sur l'édition des adresses d'une facture apparaît les titres suivants :

Invoicing address + Delivery address

ou

Invoicing and delivery address

 

Je ne trouve pas ou je peux traduire ces titres.

 

Si tu as encore quelques temps à me consacrer...je t'en remercie par avance !

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...