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 :

Invoice Magento 2

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);
    }
 
}