![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/Ecombricks/InventoryInventorySales/Plugin/Model/ |
<?php /** * Copyright © eComBricks. All rights reserved. * See LICENSE.txt for license details. */ declare(strict_types=1); namespace Ecombricks\InventoryInventorySales\Plugin\Model; /** * Get items to cancel from order item plugin */ class GetItemsToCancelFromOrderItem { /** * Get SKU from order item * * @var \Magento\InventorySalesApi\Model\GetSkuFromOrderItemInterface */ protected $getSkuFromOrderItem; /** * Items to sell factory * * @var \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory */ protected $itemsToSellFactory; /** * JSON serializer * * @var \Magento\Framework\Serialize\Serializer\Json */ protected $jsonSerializer; /** * Constructor * * @param \Magento\InventorySalesApi\Model\GetSkuFromOrderItemInterface $getSkuFromOrderItem * @param \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory $itemsToSellFactory * @param \Magento\Framework\Serialize\Serializer\Json $jsonSerializer * @return void */ public function __construct( \Magento\InventorySalesApi\Model\GetSkuFromOrderItemInterface $getSkuFromOrderItem, \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory $itemsToSellFactory, \Magento\Framework\Serialize\Serializer\Json $jsonSerializer ) { $this->getSkuFromOrderItem = $getSkuFromOrderItem; $this->itemsToSellFactory = $itemsToSellFactory; $this->jsonSerializer = $jsonSerializer; } /** * Get qty to cancel * * @param \Magento\Sales\Model\Order\Item $item * @return float */ protected function getQtyToCancel(\Magento\Sales\Model\Order\Item $item): float { return $item->getQtyOrdered() - max($item->getQtyShipped(), $item->getQtyInvoiced()) - $item->getQtyCanceled(); } /** * Process complex item * * @param \Magento\Sales\Model\Order\Item $orderItem * @return \Magento\InventorySalesApi\Api\Data\ItemToSellInterface[] */ protected function processComplexItem(\Magento\Sales\Model\Order\Item $orderItem): array { $itemsToCancel = []; foreach ($orderItem->getChildrenItems() as $childOrderItem) { $sourceCode = $childOrderItem->getSourceCode(); $productOptions = $childOrderItem->getProductOptions(); if (isset($productOptions['bundle_selection_attributes'])) { $bundleSelectionAttributes = $this->jsonSerializer->unserialize($productOptions['bundle_selection_attributes']); if (empty($bundleSelectionAttributes)) { continue; } $sku = $this->getSkuFromOrderItem->execute($childOrderItem); $shippedQty = $bundleSelectionAttributes['qty'] * $orderItem->getQtyShipped(); $qty = $childOrderItem->getQtyOrdered() - max($shippedQty, $childOrderItem->getQtyInvoiced()) - $childOrderItem->getQtyCanceled(); } else { $sku = $this->getSkuFromOrderItem->execute($orderItem); $qty = $this->getQtyToCancel($orderItem); } $item = $this->itemsToSellFactory->create(['sku' => $sku, 'qty' => $qty]); $item->getExtensionAttributes()->setSourceCode($sourceCode); $itemsToCancel[] = $item; } return $itemsToCancel; } /** * Group items by SKU and source code * * @param \Magento\InventorySalesApi\Api\Data\ItemToSellInterface[] $itemsToCancel * @return \Magento\InventorySalesApi\Api\Data\ItemToSellInterface[] */ protected function groupItemsBySkuAndSourceCode(array $itemsToCancel): array { $processingItems = $groupedItems = []; foreach ($itemsToCancel as $item) { $quantity = $item->getQuantity(); if ($quantity == 0) { continue; } $sku = $item->getSku(); $sourceCode = $item->getExtensionAttributes()->getSourceCode(); if (empty($processingItems[$sku][$sourceCode])) { $processingItems[$sku][$sourceCode] = $quantity; } else { $processingItems[$sku][$sourceCode] += $quantity; } } foreach ($processingItems as $sku => $sourceQtys) { foreach ($sourceQtys as $sourceCode => $qty) { $item = $this->itemsToSellFactory->create([ 'sku' => $sku, 'qty' => $qty, ]); $item->getExtensionAttributes()->setSourceCode($sourceCode); $groupedItems[] = $item; } } return $groupedItems; } /** * Execute * * @param \Magento\Sales\Model\Order\Item $orderItem * @return \Magento\InventorySalesApi\Api\Data\ItemToSellInterface[] */ protected function execute(\Magento\Sales\Model\Order\Item $orderItem): array { $itemsToCancel = []; if ($orderItem->isDummy(true)) { return $itemsToCancel; } if ($orderItem->getHasChildren()) { foreach ($this->processComplexItem($orderItem) as $item) { $itemsToCancel[] = $item; } } else { $sku = $this->getSkuFromOrderItem->execute($orderItem); $qty = $this->getQtyToCancel($orderItem); $sourceCode = $orderItem->getSourceCode(); $item = $this->itemsToSellFactory->create(['sku' => $sku, 'qty' => $qty]); $item->getExtensionAttributes()->setSourceCode($sourceCode); $itemsToCancel[] = $item; } return $this->groupItemsBySkuAndSourceCode($itemsToCancel); } /** * Around execute * * @param \Magento\InventorySales\Model\GetItemsToCancelFromOrderItem $subject * @param callable $proceed * @param \Magento\Sales\Model\Order\Item $orderItem * @return \Magento\InventorySalesApi\Api\Data\ItemToSellInterface[] */ public function aroundExecute( \Magento\InventorySales\Model\GetItemsToCancelFromOrderItem $subject, callable $proceed, \Magento\Sales\Model\Order\Item $orderItem ): array { return $this->execute($orderItem); } }