Spamworldpro Mini Shell
Spamworldpro


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/Ecombricks/InventoryInventorySales/Plugin/Model/GetItemsToCancelFromOrderItem.php
<?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);
    }

}

Spamworldpro Mini