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 Answer 1

2

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;
        } 
    }
4
  • What you have set in di.xml? Commented May 15, 2020 at 9:53
  • @ChiragPatel, please check it <preference for="Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice" type="Vendor\Module\Model\Order\Pdf\Items\Invoice\DefaultInvoice" /> Commented May 15, 2020 at 15:14
  • 1
    Thanks. there is one mistake in our preference you have store value in $giftWrap variable but you have not print this value. Commented May 20, 2020 at 10:22
  • @ChiragPatel How did you print this variable.
    – Arjun
    Commented Jun 18, 2020 at 10:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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