{"id":1852,"date":"2018-10-25T13:56:42","date_gmt":"2018-10-25T11:56:42","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=1852"},"modified":"2018-10-25T13:56:42","modified_gmt":"2018-10-25T11:56:42","slug":"magento-2-ajouter-une-colonne-dans-la-facture-pdf","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2018\/10\/25\/magento-2-ajouter-une-colonne-dans-la-facture-pdf\/","title":{"rendered":"Magento 2 : Ajouter une colonne dans la facture pdf"},"content":{"rendered":"<p>Voyons ensemble comment ajouter une colonne dans la facture sous Magento 2.<br \/>\nNous souhaitons ajouter une colonne \u00ab\u00a0Tax Rate\u00a0\u00bb qui affichera le taux de taxe appliqu\u00e9 \u00e0 chaque \u00e9l\u00e9ment de la facture.<\/p>\n<p>Le rendu final sera le suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1853\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/10\/facture.png\" alt=\"Invoice Magento 2\" width=\"733\" height=\"423\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/10\/facture.png 733w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/10\/facture-300x173.png 300w\" sizes=\"auto, (max-width: 733px) 100vw, 733px\" \/><\/p>\n<p>Pour faire cela nous allons cr\u00e9er un module <strong>Hhennes_Sales<\/strong><br \/>\n( je ne d\u00e9taille pas le processus de cr\u00e9ation basique du module )<\/p>\n<p>Celui-ci devra surcharger les classes suivantes :<\/p>\n<ul>\n<li>Magento\\Sales\\Model\\Order\\Pdf\\Invoice<\/li>\n<li>Magento\\Sales\\Model\\Order\\Pdf\\Items\\Invoice\\DefaultInvoice<\/li>\n<\/ul>\n<p>Pour cela il faudra mettre le contenu suivant dans le fichier etc\/di.xml du module :<\/p>\n<pre lang=\"xml\" escaped=\"true\">    \r\n   &lt;?xml version=\"1.0\"?&gt;\r\n&lt;config xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:ObjectManager\/etc\/config.xsd\"&gt;\r\n    &lt;preference for=\"Magento\\Sales\\Model\\Order\\Pdf\\Invoice\"\r\n                type=\"Hhennes\\Sales\\Model\\Sales\\Order\\Pdf\\Invoice\"&gt;&lt;\/preference&gt;\r\n    &lt;preference for=\"Magento\\Sales\\Model\\Order\\Pdf\\Items\\Invoice\\DefaultInvoice\"\r\n                type=\"Hhennes\\Sales\\Model\\Sales\\Order\\Pdf\\Items\\Invoice\\DefaultInvoice\"&gt;&lt;\/preference&gt;\r\n&lt;\/config&gt;\r\n\r\n<\/pre>\n<p>Concernant les surcharges :<\/p>\n<p>La notion importante est la valeur de \u00ab\u00a0<strong>feed<\/strong>\u00a0\u00bb , qui correspond \u00e0 la position en x du contenu dans le pdf<br \/>\nPour obtenir un ensemble visuellement harmonieux, il peut \u00eatre n\u00e9cessaire de jouer avec ces valeurs pour l&rsquo;ensemble des \u00e9l\u00e9ments.<\/p>\n<p>Pour la surcharge de classe <strong>Magento\\Sales\\Model\\Order\\Pdf\\Invoice<\/strong> : qui correspond \u00e0 la classe de la facture en g\u00e9n\u00e9ral, on ajoute une colonne dans la fonction _drawHeader<\/p>\n<pre lang=\"php\" escaped=\"true\">\r\n<?php\r\nnamespace Hhennes\\Sales\\Model\\Sales\\Order\\Pdf;\r\n\r\nclass Invoice extends \\Magento\\Sales\\Model\\Order\\Pdf\\Invoice\r\n{\r\n    \/**\r\n     * @param \\Zend_Pdf_Page $page\r\n     * @throws \\Magento\\Framework\\Exception\\LocalizedException\r\n     *\/\r\n    protected function _drawHeader(\\Zend_Pdf_Page $page)\r\n    {\r\n        \/* Add table head *\/\r\n        $this->_setFontRegular($page, 10);\r\n        $page->setFillColor(new \\Zend_Pdf_Color_RGB(0.93, 0.92, 0.92));\r\n        $page->setLineColor(new \\Zend_Pdf_Color_GrayScale(0.5));\r\n        $page->setLineWidth(0.5);\r\n        $page->drawRectangle(25, $this->y, 570, $this->y - 15);\r\n        $this->y -= 10;\r\n        $page->setFillColor(new \\Zend_Pdf_Color_RGB(0, 0, 0));\r\n\r\n        \/\/columns headers\r\n        $lines[0][] = ['text' => __('Products'), 'feed' => 35];\r\n\r\n        $lines[0][] = ['text' => __('SKU'), 'feed' => 250, 'align' => 'right'];\r\n\r\n        $lines[0][] = ['text' => __('Price'), 'feed' => 300, 'align' => 'left'];\r\n\r\n        $lines[0][] = ['text' => __('Qty'), 'feed' => 350, 'align' => 'left'];\r\n\r\n        \/\/ Tutoriel : Affichage du taux de taxe\r\n        $lines[0][] = ['text' => __('Tax Rate'), 'feed' => 450, 'align' => 'right'];\r\n        \/\/ Tutoriel : Affichage du taux de taxe\r\n\r\n        $lines[0][] = ['text' => __('Tax'), 'feed' => 495, 'align' => 'right'];\r\n\r\n        $lines[0][] = ['text' => __('Subtotal'), 'feed' => 565, 'align' => 'right'];\r\n\r\n        $lineBlock = ['lines' => $lines, 'height' => 5];\r\n\r\n\r\n        $this->drawLineBlocks($page, [$lineBlock], ['table_header' => true]);\r\n        $page->setFillColor(new \\Zend_Pdf_Color_GrayScale(0));\r\n        $this->y -= 20;\r\n    }\r\n}\r\n<\/pre>\n<p>Pour la classe Magento\\Sales\\Model\\Order\\Pdf\\Items\\Invoice\\DefaultInvoice qui correspond \u00e0 l&rsquo;affichage par d\u00e9faut d&rsquo;un \u00e9l\u00e9ment de la commande, nous allons \u00e9galement ajouter une colonne<\/p>\n<pre lang=\"php\" escaped=\"true\">\r\n<?php\r\nnamespace Hhennes\\Sales\\Model\\Sales\\Order\\Pdf\\Items\\Invoice;\r\n\r\n\r\nclass DefaultInvoice extends \\Magento\\Sales\\Model\\Order\\Pdf\\Items\\Invoice\\DefaultInvoice\r\n{\r\n\r\n    \/**\r\n     * Draw item line\r\n     *\r\n     * @return void\r\n     *\/\r\n    public function draw()\r\n    {\r\n        $order = $this->getOrder();\r\n        $item = $this->getItem();\r\n        $pdf = $this->getPdf();\r\n        $page = $this->getPage();\r\n        $lines = [];\r\n\r\n        \/\/ draw Product name\r\n        $lines[0] = [['text' => $this->string->split($item->getName(), 25, true, true), 'feed' => 35]];\r\n\r\n        \/\/ draw SKU\r\n        $lines[0][] = [\r\n            'text' => $this->string->split($this->getSku($item), 17),\r\n            'feed' => 250,\r\n            'align' => 'right',\r\n        ];\r\n\r\n        \/\/ draw QTY\r\n        $lines[0][] = ['text' => $item->getQty() * 1, 'feed' => 350, 'align' => 'left'];\r\n\r\n        \/\/ draw item Prices\r\n        $i = 0;\r\n        $prices = $this->getItemPricesForDisplay();\r\n        $feedPrice = 300;\r\n        $feedSubtotal = $feedPrice + 250;\r\n        foreach ($prices as $priceData) {\r\n            if (isset($priceData['label'])) {\r\n                \/\/ draw Price label\r\n                $lines[$i][] = ['text' => $priceData['label'], 'feed' => $feedPrice, 'align' => 'left'];\r\n                \/\/ draw Subtotal label\r\n                $lines[$i][] = ['text' => $priceData['label'], 'feed' => $feedSubtotal, 'align' => 'right'];\r\n                $i++;\r\n            }\r\n            \/\/ draw Price\r\n            $lines[$i][] = [\r\n                'text' => $priceData['price'],\r\n                'feed' => $feedPrice,\r\n                'font' => 'bold',\r\n                'align' => 'right',\r\n            ];\r\n            \/\/ draw Subtotal\r\n            $lines[$i][] = [\r\n                'text' => $priceData['subtotal'],\r\n                'feed' => $feedSubtotal,\r\n                'font' => 'bold',\r\n                'align' => 'right',\r\n            ];\r\n            $i++;\r\n        }\r\n\r\n        \/\/ Tutoriel : Affichage du taux du taxe\r\n        $lines[0][] = [\r\n            'text' => number_format($item->getOrderItem()->getTaxPercent(),2),\r\n            'feed' => 450, \/\/Attention \u00e0 la position  du feed\r\n            'font' => 'bold',\r\n            'align' => 'right',\r\n        ];\r\n        \/\/ Fin Tutoriel : Affichage du taux du taxe\r\n\r\n        \/\/ draw Tax\r\n        $lines[0][] = [\r\n            'text' => $order->formatPriceTxt($item->getTaxAmount()),\r\n            'feed' => 495,\r\n            'font' => 'bold',\r\n            'align' => 'right',\r\n        ];\r\n\r\n        \/\/ custom options\r\n        $options = $this->getItemOptions();\r\n        if ($options) {\r\n            foreach ($options as $option) {\r\n                \/\/ draw options label\r\n                $lines[][] = [\r\n                    'text' => $this->string->split($this->filterManager->stripTags($option['label']), 40, true, true),\r\n                    'font' => 'italic',\r\n                    'feed' => 35,\r\n                ];\r\n\r\n                if ($option['value']) {\r\n                    if (isset($option['print_value'])) {\r\n                        $printValue = $option['print_value'];\r\n                    } else {\r\n                        $printValue = $this->filterManager->stripTags($option['value']);\r\n                    }\r\n                    $values = explode(', ', $printValue);\r\n                    foreach ($values as $value) {\r\n                        $lines[][] = ['text' => $this->string->split($value, 30, true, true), 'feed' => 40];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        $lineBlock = ['lines' => $lines, 'height' => 20];\r\n\r\n        $page = $pdf->drawLineBlocks($page, [$lineBlock], ['table_header' => true]);\r\n        $this->setPage($page);\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voyons ensemble comment ajouter une colonne dans la facture sous Magento 2. Nous souhaitons ajouter une colonne \u00ab\u00a0Tax Rate\u00a0\u00bb qui affichera le taux de taxe appliqu\u00e9 \u00e0 chaque \u00e9l\u00e9ment de la facture. Le rendu final sera le suivant : Pour faire cela nous allons cr\u00e9er un module Hhennes_Sales ( je ne d\u00e9taille pas le processus [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[246],"tags":[535,533,534,482,536],"class_list":["post-1852","post","type-post","status-publish","format-standard","hentry","category-magento-2","tag-column","tag-facture","tag-invoice","tag-magento-2","tag-pdf"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=1852"}],"version-history":[{"count":3,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1852\/revisions"}],"predecessor-version":[{"id":1856,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1852\/revisions\/1856"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}