26 Sep 2019

Ajouter l’email client dans les factures PDF de Prestashop 1.7

Mise à jour de l’article le 24/11/2020 : Mon article est maintenant adapté au version 1.7.6.8 et plus. Descendez un peu dans la page pour trouver l’information.

Un tutoriel et des fichiers pour permettre l’affichage de l’adresse mail client sur les factures de votre Prestashop 1.7.

Vous utilisez peut-être les factures clients PDF pour préparer les commandes ou encore pour la comptabilité. Si vous avez besoin de contacter votre client par mail, vous êtes obligé d’aller dans le compte client. Grâce à ce tutoriel Prestashop très simple vous allez pouvoir afficher l’e-mail du client sur vos factures PDF.

Créer un Override sur votre Prestashop

Vous allez devoir faire une surcouche du fichier HTMLTemplate.php sur votre serveur.
Il faut créer ce fichier dans : override -> classes -> PDF

Ensuite collez ceci dans votre fichier :

<?php

/*
Override add telephone on PDF Invoice
https://www.matthieu-jalbert.fr/
*/

abstract class HTMLTemplate extends HTMLTemplateCore {

public function assignCommonHeaderData()
{
$this->setShopId();
$id_shop = (int)$this->shop->id;
$shop_name = Configuration::get('PS_SHOP_NAME', null, null, $id_shop);
$path_logo = $this->getLogo();
$customer = new Customer((int)$this->order->id_customer);

$this->smarty->assign(array(
'logo_path' => $path_logo,

'img_update_time' => Configuration::get('PS_IMG_UPDATE_TIME'),
'date' => $this->date,
'title' => $this->title,
'shop_name' => $shop_name,
'shop_details' => Configuration::get('PS_SHOP_DETAILS', null, null, (int)$id_shop),
'width_logo' => $width,
'height_logo' => $height,
'customer_id' => sprintf("%04d", $customer->id),
'customer_email' => $customer->email
));
}
}

Je joins le fichier tout prêt : Override mail facture PDF PS (663 téléchargements)

Ensuite il faut afficher la variable {$customer_email} créé, dans la facture. Il faut aller à la racine de votre site, dans le dossier PDF. Cherchez ensuite le invoice.tpl.

Pour ma part je mets l’adresse mail sous l’adresse par exemple à la ligne 35 :

<!-- Invoicing -->
<tr>
<td colspan="12">
{$addresses_tab}
{$customer_email}
</td>
</tr>

Vous pouvez maintenant aller dans l’onglet commande et vérifier cela sur une facture.
Si cela ne s’affiche pas, pensez à vider le cache de votre Prestashop.

Mon logo disparaît sur la facture de mon Prestashop 1.7.6.8

Au vu des commentaires et des mails de la communauté, j’ai effectuait des recherches concernant ce problème, suite à mon tutoriel plus haut.

Lors des dernières mises à jour du CMS, l’appel des factures a changé et du coup, l’override au dessus n’est plus bon à partir de cette version.

Si vous êtes au minimum sur 1.7.6.8, ne vous préoccupez pas de mon explication au-dessus. Par contre cette astuce ci-dessous, fonctionne avec toutes les versions de Prestashop !

Rendez-vous dans classes/pdf/HTMLTemplateInvoice.php et à la ligne 346 rajoutez l’adresse client. Vous devez avoir cela :

$data = array(
'order' => $this->order,
'order_invoice' => $this->order_invoice,
'order_details' => $order_details,
'carrier' => $carrier,
'cart_rules' => $cart_rules,
'delivery_address' => $formatted_delivery_address,
'invoice_address' => $formatted_invoice_address,
'addresses' => array('invoice' => $invoice_address, 'delivery' => $delivery_address),
'tax_excluded_display' => $tax_excluded_display,
'display_product_images' => $display_product_images,
'layout' => $layout,
'tax_tab' => $this->getTaxTabContent(),
'customer' => $customer,
'footer' => $footer,
'ps_price_compute_precision' => _PS_PRICE_COMPUTE_PRECISION_,
'round_type' => $round_type,
'legal_free_text' => $legal_free_text,
'customer_email' => $customer->email,
);

Ensuite, modifiez l’adresse client dans /pdf/invoice.addresses-tab.tpl et ajoutez l’email :

<table id="addresses-tab" cellspacing="0" cellpadding="0">
<tr>
<td width="50%">{if $delivery_address}<span class="bold">{l s='Delivery Address' d='Shop.Pdf' pdf='true'}</span><br/><br/>
{$delivery_address}<br />{$customer_email}
{/if}
</td>
<td width="50%"><span class="bold">{l s='Billing Address' d='Shop.Pdf' pdf='true'}</span><br/><br/>
{$invoice_address}<br />{$customer_email}
</td>
</tr>
</table>

Nous avons la même variable que dans ma 1er explication au début de l’article : {$customer_email}.
On l’ajoute tout simplement à la ligne de chaque adresse avec un retour à la ligne en HTML.

J’ai trouvé cette astuce sur le forum de Prestashop, j’ai juste ajusté certaine chose.

N’oubliez surtout pas de vider le cache de votre Prestashop.

Tenir une bonne comptabilité sur votre Prestashop

Vous savez maintenant comment rajouter cette option sur les factures dans Prestashop. Cependant il faut savoir qu’un site e-commerce doit suivre des “règles” de comptabilité. Une entreprise physique ou virtuelle est soumise aux mêmes lois. J’ai publié une vidéo pour parler de comptabilité. Tenez-vous informé pour ne rien oublier dans votre compta.

28 commentaires sur “Ajouter l’email client dans les factures PDF de Prestashop 1.7
  1. bonjour,

    novice en prestashop, j’ai suivi votre article (très bien expliqué), mais je dois faire une erreur.
    J’ai téléchargé votre fichier que j’ai inséré dans override -> classes -> PDF
    Ensuite, j’ai modifié comme indiqué le fichier invoice.tpl (->pdf) mais sur ma facture l’email n’apparait pas. emrci de votre aide. bonne journée

    1. Bonjour,

      Quelle est la version de votre Prestashop ?
      Cet article date d’un moment et il se peut que cela ne soit pas compatible avec Prestashop 1.7.6.X

      Avez-vous vidé le cache dans les performances du site ? Vu que c’est une fichier de “surcouche” il peut y avoir du cache.
      Générer une nouvelle commande test pour voir.

    2. Bonjour

      Auparavant l’adaptation de ce systeme était possible pour les Bons de livraison (delivery slip) mais impossible depuis les versions 1.7.8, un idée si jamais ?
      merci

      1. L’article porte sur la facture et donc ce n’est pas adapté au bon de livraison.
        Il faudrait faire un override du même type exprès mais je n’ai jamais eu le cas à ce jour

  2. Bonjour, comme l’intervenant précédent,
    J’ai bien suivi votre explication mais malheureusement cela ne fonctionne pas malgré le fait d’avoir vidé le cache à plusieurs reprises.
    Prestashop 1.7.5.2

    Merci de vos conseils

  3. Bonjour ,

    Si je veux rajouter le nom du vendeur dans la facture ? J’ai tenté plein d’essais mais rien n’y fait. Si quelqu’un peut m’aider svp !

        1. Il nous faut des détails 😉

          Vous parlez de vendeur, c’est un site sous forme de marketplace avec plusieurs vendeurs ?
          Ou bien vous voulez juste mettre le ‘vendeur’, le propriétaire du site Prestashop ?

          1. Vous utilisez donc un module particulier ?
            Le problème c’est qu’il faut faire un développement particulier pour pouvoir récupérer la variable vendeur.
            Une fois que cela est fait, il faut l’intégrer de la même façon que l’email sur la facture

  4. Nous utilisons le module jmarketplace, les données vendeurs je les récupère avec la variable $seller (qui me renvoie un objet “Seller”). Pour le nom des vendeurs il faut utiliser {$seller->name}. Forcément cela ne s’affiche pas sur le pdf des factures. J’ai essayé plein de manière de la récupérer et de l’intégrer comme vous ,mais cela ne fonctionne pas (sachant que votre démo fonctionne chez moi ,donc le problême vient de moi).

    Si vous pouvez m’aider, ça serait top !

  5. Bonjour,

    Je suis sous Prestashop 1.7.6.8, et lorsque je modifie le code comme vous faites, mon logo en haut à gauche de ma facture disparait, et l’adresse mail s’affiche bien.
    J’ai bien vidé mon cache.
    En vous remerciant.

    1. Bonjour Baptiste,

      Le système sur cette version de Prestashop est identique aux autres.
      Vider le cache ne fera rien étant donné que nous sommes sur des PDF et non un impact en front sur le site.
      Si le logo disparaît, une balise doit être mal fermée, ce qui “casse” le PDF

  6. Rendez-vous dans classes/HTMLTemplateInvoice.php et à la ligne 346 rajoutez l’adresse client. Vous devez avoir cela :

    –> vous avez fait une erreur, c’est dans classes/pdf/HTMLTemplateInvoice.php

    sinon, merci pour le tuto

  7. Bonjour,
    Sur 1.7.8, le code fonctionne mais fait sauter le logo.
    Cet override fonctionne :

    setShopId();
    $id_shop = (int) $this->shop->id;
    $shop_name = Configuration::get('PS_SHOP_NAME', null, null, $id_shop);

    $logo = $this->getLogo();

    $width = 0;
    $height = 0;
    if (!empty($logo)) {
    list($width, $height) = getimagesize(_PS_IMG_DIR_ . $logo);
    $customer = new Customer((int)$this->order->id_customer);
    }

    // Limit the height of the logo for the PDF render
    $maximum_height = 100;
    if ($height > $maximum_height) {
    $ratio = $maximum_height / $height;
    $height *= $ratio;
    $width *= $ratio;
    }

    $this->smarty->assign([
    'logo_path' => Tools::getShopProtocol() . Tools::getMediaServer(_PS_IMG_) . _PS_IMG_ . $logo,
    'img_ps_dir' => Tools::getShopProtocol() . Tools::getMediaServer(_PS_IMG_) . _PS_IMG_,
    'img_update_time' => Configuration::get('PS_IMG_UPDATE_TIME'),
    'date' => $this->date,
    'title' => $this->title,
    'shop_name' => $shop_name,
    'shop_details' => Configuration::get('PS_SHOP_DETAILS', null, null, (int) $id_shop),
    'width_logo' => $width,
    'height_logo' => $height,
    'customer_id' => sprintf("%04d", $customer->id),
    'customer_email' => $customer->email,
    ]);
    }
    }

    1. Après test sur 1.7.8.3, ma solution fonctionne sans que le logo saute.
      Je laisse à disposition votre override pour les lecteurs

      Merci en tout cas

      1. Merci pour ce commentaire.

        Mon code est plutôt là pour permettre que tout fonctionne avec un override et non en devant modifier le core.

        Si cela peut aider.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *