Question

I am trying to display Gift Message for individual Item on Invoice PDF Admin Backend Sales Order Grid.

Below same code is working for me if you open an order from Sales Order Grid for Individual Items but not working in Invoice print PDF class.

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\Items\Invoice\DefaultInvoice" type="Vendor\Module\Model\Order\Pdf\Items\Invoice\DefaultInvoice" />

</config>

Vendor\Module\Model\Order\Pdf\Items\Invoice\DefaultInvoice.php

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Vendor\Module\Model\Order\Pdf\Items\Invoice;
use Magento\GiftMessage\Api\OrderItemRepositoryInterface;
/**
 * Sales Order Invoice Pdf default items renderer
 */
class DefaultInvoice extends \Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice
{
    /**
     * Core string
     *
     * @var \Magento\Framework\Stdlib\StringUtils
     */
    protected $string;
    protected $orderItemGiftRepo;
    private $logger;

    /**
     * @param \Magento\Framework\Model\Context $context
     * @param \Magento\Framework\Registry $registry
     * @param \Magento\Tax\Helper\Data $taxData
     * @param \Magento\Framework\Filesystem $filesystem
     * @param \Magento\Framework\Filter\FilterManager $filterManager
     * @param \Magento\Framework\Stdlib\StringUtils $string
     * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
     * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
     * @param array $data
     */
    public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Tax\Helper\Data $taxData,
        \Magento\Framework\Filesystem $filesystem,
        \Magento\Framework\Filter\FilterManager $filterManager,
        \Magento\Framework\Stdlib\StringUtils $string,
        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        OrderItemRepositoryInterface $orderItemGiftRepo,
        \Psr\Log\LoggerInterface $logger,
        array $data = []
    ) {
        $this->string = $string;
        $this->orderItemGiftRepo = $orderItemGiftRepo;
        $this->logger = $logger;
        parent::__construct(
            $context,
            $registry,
            $taxData,
            $filesystem,
            $filterManager,
            $string,
            $resource,
            $resourceCollection,
            $data
        );
    }

    /**
     * Draw item line
     *
     * @return void
     */
    public function draw()
    {
        $order = $this->getOrder();
        $item = $this->getItem();
        $pdf = $this->getPdf();
        $page = $this->getPage();

        $giftWrap = $this->getGiftMessages($order->getId(),$item->getId());
        $this->logger->info("GiftData".json_encode($giftWrap));
        $lines = [];
        $giftItem = "<br/>"."<b style='color:red;'>Test Products</b>";
        // draw Product name
        $lines[0] = [['text' => $this->string->split($item->getName().$giftItem, 35, true, true), 'feed' => 35]];
         // draw GiftWrap Message 
        //$lines[0] = [['text' => $this->string->split("TestProduct", 20, true, true), 'feed' => 20]];

        // 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 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,
                ];

                // Checking whether option value is not null
                if ($option['value'] !== null) {
                    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);
    }


    public function getGiftMessages($order_id,$itemId) {
        $this->logger->info("order_id".$order_id);
        $this->logger->info("itemId".$itemId);
        $order_id =  $order_id;
        $giftMessage = array();
        try{
                    $giftItems = !empty($this->orderItemGiftRepo->get($order_id, $itemId)) ? $this->orderItemGiftRepo->get($order_id, $itemId) : null;
                    if($giftItems):

                        $giftMessage['message'] = $giftItems->getMessage();
                        $giftMessage['recipient'] = $giftItems->getRecipient();
                        $giftMessage['sender'] = $giftItems->getSender();

                    endif; 


        } catch (\Exception $e) {
                return null;
            } 

        return $giftMessage;
    } 
}

If any idea, please suggest me. Thanks in Advance..!!

Was it helpful?

Solution

Below Code Worked for me.

If you check sales_invoice_item table here order_item_id column contains your Order items id.

Vendor\Module\Model\Order\Pdf\Items\Invoice\DefaultInvoice.php

 <?php
    /**
     * Copyright © Magento, Inc. All rights reserved.
     * See COPYING.txt for license details.
     */
    namespace Vendor\Module\Model\Order\Pdf\Items\Invoice;
    use Magento\GiftMessage\Api\OrderItemRepositoryInterface;
    /**
     * Sales Order Invoice Pdf default items renderer
     */
    class DefaultInvoice extends \Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice
    {
        /**
         * Core string
         *
         * @var \Magento\Framework\Stdlib\StringUtils
         */
        protected $string;
        protected $orderItemGiftRepo;
        private $logger;

        /**
         * @param \Magento\Framework\Model\Context $context
         * @param \Magento\Framework\Registry $registry
         * @param \Magento\Tax\Helper\Data $taxData
         * @param \Magento\Framework\Filesystem $filesystem
         * @param \Magento\Framework\Filter\FilterManager $filterManager
         * @param \Magento\Framework\Stdlib\StringUtils $string
         * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
         * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
         * @param array $data
         */
        public function __construct(
            \Magento\Framework\Model\Context $context,
            \Magento\Framework\Registry $registry,
            \Magento\Tax\Helper\Data $taxData,
            \Magento\Framework\Filesystem $filesystem,
            \Magento\Framework\Filter\FilterManager $filterManager,
            \Magento\Framework\Stdlib\StringUtils $string,
            \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
            \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
            OrderItemRepositoryInterface $orderItemGiftRepo,
            \Psr\Log\LoggerInterface $logger,
            array $data = []
        ) {
            $this->string = $string;
            $this->orderItemGiftRepo = $orderItemGiftRepo;
            $this->logger = $logger;
            parent::__construct(
                $context,
                $registry,
                $taxData,
                $filesystem,
                $filterManager,
                $string,
                $resource,
                $resourceCollection,
                $data
            );
        }

        /**
         * Draw item line
         *
         * @return void
         */
        public function draw()
        {
            $order = $this->getOrder();
            $item = $this->getItem();
            $pdf = $this->getPdf();
            $page = $this->getPage();

            $oriderId = $order->getEntityId();
            $itemId = $item->getOrderItemId();

            $giftWrap = $this->getGiftMessages($oriderId,$itemId);
            $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 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,
                    ];

                    // Checking whether option value is not null
                    if ($option['value'] !== null) {
                        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);
        }


        public function getGiftMessages($order_id,$itemId) {
            $this->logger->info("order_id".$order_id);
            $this->logger->info("itemId".$itemId);
            $order_id =  $order_id;
            $giftMessage = array();
            try{
                        $giftItems = !empty($this->orderItemGiftRepo->get($order_id, $itemId)) ? $this->orderItemGiftRepo->get($order_id, $itemId) : null;
                        if($giftItems):

                            $giftMessage['message'] = $giftItems->getMessage();
                            $giftMessage['recipient'] = $giftItems->getRecipient();
                            $giftMessage['sender'] = $giftItems->getSender();

                        endif; 


            } catch (\Exception $e) {
                    return null;
                } 

            return $giftMessage;
        } 
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top