Magento – How to display tax details at item lines in invoice

magento-2.1magento2order-itemsorderstax

I browsed the tables and discovered that tax rates, codes, etc are saved at order level. How can I display tax summary having tax code, rate, etc at each item line in invoices generated from backend?

Best Answer

I did it in this way. In the code below i just added the column DISCOUNT, but you could add what you want following the same logic. Also for creditmemo pdf.

Create a custom module and override Magento\Sales\Model\ResourceModel\Order\Invoice and Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice with your class in di.xml.

<?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="Vendor\Module\Override\Sales\Model\Order\Pdf\Invoice"/>
    <preference for="Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice" type="Vendor\Module\Override\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice"/>
</config>

Then in Vendor\Module\Override\Sales\Model\Order\Pdf\Invoice rewrite _drawHeader() method.

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' => 290, 'align' => 'right'];

    $lines[0][] = ['text' => __('Qty'), 'feed' => 435, 'align' => 'right'];

    $lines[0][] = ['text' => __('Price'), 'feed' => 360, 'align' => 'right'];

    // custom column DISCOUNT
    $lines[0][] = ['text' => __('Discount'), 'feed' => 400, 'align' => 'right'];

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

And in Vendor\Module\Override\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice rewrite draw() method.

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(), 35, true, true), 'feed' => 35]];

    // draw SKU
    $lines[0][] = [
        'text' => $this->string->split($this->getSku($item), 17),
        'feed' => 290,
        'align' => 'right',
    ];

    // draw QTY
    $lines[0][] = ['text' => $item->getQty() * 1, 'feed' => 435, 'align' => 'right'];

    // draw item Prices
    $i = 0;
    $prices = $this->getItemPricesForDisplay();
    $feedPrice = 395;
    $feedSubtotal = $feedPrice + 170;
    foreach ($prices as $priceData) {
        if (isset($priceData['label'])) {
            // draw Price label
            $lines[$i][] = ['text' => $priceData['label'], 'feed' => $feedPrice, 'align' => 'right'];
            // 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++;
    }

    // draw custom column DISCOUNT
    $sconto = $item->getData('discount_amount');
    $lines[0][] = [
        'text' => $sconto ? $order->formatPriceTxt($sconto) : "-", 
        'feed' => 400
    ];

    // 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);
}
Related Topic