InvoiceGiftwrapProcessor.php 3.7 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
<?php
/**
 * @copyright  Vertex. All rights reserved.  https://www.vertexinc.com/
 * @author     Mediotype                     https://www.mediotype.com/
 */

namespace Vertex\Tax\Model\Api\Data\InvoiceRequestBuilder;

use Magento\Sales\Api\Data\InvoiceInterface;
use Magento\Sales\Api\Data\InvoiceItemInterface;
use Vertex\Data\LineItemInterface;
use Vertex\Services\Invoice\RequestInterface;
use Vertex\Tax\Model\ModuleManager;

/**
 * Processes Giftwrapping and printed cards on an Invoice and converts them to a LineItemInterface
 */
class InvoiceGiftwrapProcessor implements InvoiceProcessorInterface
{
    /** @var GiftWrapProcessor */
    private $giftWrapProcessor;

    /** @var ModuleManager */
    private $moduleManager;

    /**
     * @param ModuleManager $moduleManager
     * @param GiftWrapProcessor $giftWrapProcessor
     */
    public function __construct(
        ModuleManager $moduleManager,
        GiftWrapProcessor $giftWrapProcessor
    ) {
        $this->moduleManager = $moduleManager;
        $this->giftWrapProcessor = $giftWrapProcessor;
    }

    /**
     * @inheritdoc
     */
    public function process(RequestInterface $request, InvoiceInterface $invoice)
    {
        $lineItems = $request->getLineItems();
        $extensionAttributes = $invoice->getExtensionAttributes();

        if (!$this->moduleManager->isEnabled('Magento_GiftWrapping')) {
            return $request;
        }

        if ($extensionAttributes !== null) {
            // Order-level Gift Wrapping
            $orderGiftWrap = $this->giftWrapProcessor->processOrderGiftWrap(
                $extensionAttributes->getGwBasePrice(),
                $invoice->getStoreId()
            );
            if ($orderGiftWrap) {
                $lineItems[] = $orderGiftWrap;
            }

            // Order-level Printed Card
            $orderGiftcard = $this->giftWrapProcessor->processOrderGiftCard(
                $extensionAttributes->getGwCardBasePrice(),
                $invoice->getStoreId()
            );
            if ($orderGiftcard) {
                $lineItems[] = $orderGiftcard;
            }
        }

        // Item-level Gift Wrapping
        $lineItems = array_merge($lineItems, $this->processItems($invoice));

        $request->setLineItems($lineItems);
        return $request;
    }

    /**
     * Create LineItems for each individual item-level gift wrap
     *
     * @param InvoiceInterface $invoice
     * @return LineItemInterface[]
     */
    private function processItems(InvoiceInterface $invoice)
    {
        /** @var LineItemInterface[] $lineItems */
        $lineItems = [];

        if ($invoice->getExtensionAttributes() === null) {
            return $lineItems;
        }

        /** @var InvoiceItemInterface[] $invoiceItems Indexed by Order Item ID */
        $invoiceItems = [];

        /** @var int[] $orderItemIds */
        $orderItemIds = [];

        foreach ($invoice->getItems() as $item) {
            if ($item->getQty() < 1) {
                continue;
            }
            $orderItemIds[] = $item->getOrderItemId();
            $invoiceItems[$item->getOrderItemId()] = $item;
        }

        /** @var float[] $giftWrapAmounts Indexed by Order Item ID */
        $giftWrapAmounts = $this->giftWrapProcessor->getGiftWrapAmounts(
            $invoice->getOrderId(),
            $orderItemIds,
            (float)$invoice->getExtensionAttributes()->getGwItemsBasePrice()
        );

        foreach ($giftWrapAmounts as $orderItemId => $giftWrapAmount) {
            $lineItems[] = $this->giftWrapProcessor->buildItem(
                $giftWrapAmount,
                $invoiceItems[$orderItemId]->getSku(),
                $invoice->getStoreId()
            );
        }

        return $lineItems;
    }
}