2

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?

  • have you seen my answer? – LucScu Aug 1 '18 at 10:04
1

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.