0

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..!!

1

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

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.