N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
Voyons ensemble comment ajouter une colonne dans la facture sous Magento 2.
Nous souhaitons ajouter une colonne « Tax Rate » qui affichera le taux de taxe appliqué à chaque élément de la facture.
Le rendu final sera le suivant :
Pour faire cela nous allons créer un module Hhennes_Sales
( je ne détaille pas le processus de création basique du module )
Celui-ci devra surcharger les classes suivantes :
- Magento\Sales\Model\Order\Pdf\Invoice
- Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice
Pour cela il faudra mettre le contenu suivant dans le fichier etc/di.xml du module :
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Sales\Model\Order\Pdf\Invoice" type="Hhennes\Sales\Model\Sales\Order\Pdf\Invoice"></preference> <preference for="Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice" type="Hhennes\Sales\Model\Sales\Order\Pdf\Items\Invoice\DefaultInvoice"></preference> </config> |
Concernant les surcharges :
La notion importante est la valeur de « feed » , qui correspond à la position en x du contenu dans le pdf
Pour obtenir un ensemble visuellement harmonieux, il peut être nécessaire de jouer avec ces valeurs pour l’ensemble des éléments.
Pour la surcharge de classe Magento\Sales\Model\Order\Pdf\Invoice : qui correspond à la classe de la facture en général, on ajoute une colonne dans la fonction _drawHeader
<?php namespace Hhennes\Sales\Model\Sales\Order\Pdf; class Invoice extends \Magento\Sales\Model\Order\Pdf\Invoice { /** * @param \Zend_Pdf_Page $page * @throws \Magento\Framework\Exception\LocalizedException */ protected function _drawHeader(\Zend_Pdf_Page $page) { /* Add table head */ $this->_setFontRegular($page, 10); $page->setFillColor(new \Zend_Pdf_Color_RGB(0.93, 0.92, 0.92)); $page->setLineColor(new \Zend_Pdf_Color_GrayScale(0.5)); $page->setLineWidth(0.5); $page->drawRectangle(25, $this->y, 570, $this->y - 15); $this->y -= 10; $page->setFillColor(new \Zend_Pdf_Color_RGB(0, 0, 0)); //columns headers $lines[0][] = ['text' => __('Products'), 'feed' => 35]; $lines[0][] = ['text' => __('SKU'), 'feed' => 250, 'align' => 'right']; $lines[0][] = ['text' => __('Price'), 'feed' => 300, 'align' => 'left']; $lines[0][] = ['text' => __('Qty'), 'feed' => 350, 'align' => 'left']; // Tutoriel : Affichage du taux de taxe $lines[0][] = ['text' => __('Tax Rate'), 'feed' => 450, 'align' => 'right']; // Tutoriel : Affichage du taux de taxe $lines[0][] = ['text' => __('Tax'), 'feed' => 495, 'align' => 'right']; $lines[0][] = ['text' => __('Subtotal'), 'feed' => 565, 'align' => 'right']; $lineBlock = ['lines' => $lines, 'height' => 5]; $this->drawLineBlocks($page, [$lineBlock], ['table_header' => true]); $page->setFillColor(new \Zend_Pdf_Color_GrayScale(0)); $this->y -= 20; } } |
Pour la classe Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice qui correspond à l’affichage par défaut d’un élément de la commande, nous allons également ajouter une colonne
<?php namespace Hhennes\Sales\Model\Sales\Order\Pdf\Items\Invoice; class DefaultInvoice extends \Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice { /** * Draw item line * * @return void */ public function draw() { $order = $this->getOrder(); $item = $this->getItem(); $pdf = $this->getPdf(); $page = $this->getPage(); $lines = []; // draw Product name $lines[0] = [['text' => $this->string->split($item->getName(), 25, true, true), 'feed' => 35]]; // draw SKU $lines[0][] = [ 'text' => $this->string->split($this->getSku($item), 17), 'feed' => 250, 'align' => 'right', ]; // draw QTY $lines[0][] = ['text' => $item->getQty() * 1, 'feed' => 350, 'align' => 'left']; // draw item Prices $i = 0; $prices = $this->getItemPricesForDisplay(); $feedPrice = 300; $feedSubtotal = $feedPrice + 250; foreach ($prices as $priceData) { if (isset($priceData['label'])) { // draw Price label $lines[$i][] = ['text' => $priceData['label'], 'feed' => $feedPrice, 'align' => 'left']; // draw Subtotal label $lines[$i][] = ['text' => $priceData['label'], 'feed' => $feedSubtotal, 'align' => 'right']; $i++; } // draw Price $lines[$i][] = [ 'text' => $priceData['price'], 'feed' => $feedPrice, 'font' => 'bold', 'align' => 'right', ]; // draw Subtotal $lines[$i][] = [ 'text' => $priceData['subtotal'], 'feed' => $feedSubtotal, 'font' => 'bold', 'align' => 'right', ]; $i++; } // Tutoriel : Affichage du taux du taxe $lines[0][] = [ 'text' => number_format($item->getOrderItem()->getTaxPercent(),2), 'feed' => 450, //Attention à la position du feed 'font' => 'bold', 'align' => 'right', ]; // Fin Tutoriel : Affichage du taux du taxe // draw Tax $lines[0][] = [ 'text' => $order->formatPriceTxt($item->getTaxAmount()), 'feed' => 495, 'font' => 'bold', 'align' => 'right', ]; // custom options $options = $this->getItemOptions(); if ($options) { foreach ($options as $option) { // draw options label $lines[][] = [ 'text' => $this->string->split($this->filterManager->stripTags($option['label']), 40, true, true), 'font' => 'italic', 'feed' => 35, ]; if ($option['value']) { if (isset($option['print_value'])) { $printValue = $option['print_value']; } else { $printValue = $this->filterManager->stripTags($option['value']); } $values = explode(', ', $printValue); foreach ($values as $value) { $lines[][] = ['text' => $this->string->split($value, 30, true, true), 'feed' => 40]; } } } } $lineBlock = ['lines' => $lines, 'height' => 20]; $page = $pdf->drawLineBlocks($page, [$lineBlock], ['table_header' => true]); $this->setPage($page); } } |
Je viens de tomber sur cet article, l’astuce fonctionne parfaitement. Par contre j’ai fait la modification dans magento/module-sales/Model/Order/Pdf et il vaut mieux éviter !
Avez-vous un tuto à me conseiller pour créer le module et faire la surcharge dans les règles de l’art ?
Merci
Bonjour Thomas,
Pour créer facilement un module vous pouvez utiliser l’outil magerun 2 : https://github.com/netz98/n98-magerun2
Et la commande dev:module:create.
La surcharge sera gérée ensuite via la création du fichier di.xml expliquée dans l’article.
Cordialement,
Hervé
Merci, je ne connaissais pas cet outil. Je vais garder votre site en favoris et si un jour je suis vraiment bloqué je ferais appel à vos services (moyennant rémunération bien sûr).
bonjour herve, j’ai un question à propos order dans magento 2.
Comment masquer champs « comment » aprés choix status= »confirmed » ?
Merci
Bonjour,
Est-ce que votre question est liée à la génération de la facture ?
Je n’arrive pas à comprendre le lien et votre demande.
Cordialement,