![]() 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/Model/ReturnProcessor/ |
<?php /** * Copyright © eComBricks. All rights reserved. * See LICENSE.txt for license details. */ declare(strict_types=1); namespace Ecombricks\InventoryInventorySales\Model\ReturnProcessor; /** * Process refund items */ class ProcessRefundItems implements \Ecombricks\InventoryInventorySales\Model\ReturnProcessor\ProcessRefundItemsInterface { /** * Sales channel factory * * @var \Ecombricks\InventoryInventorySales\Api\Data\WebsiteSalesChannelInterfaceFactory */ protected $salesChannelFactory; /** * Sales event factory * * @var \Magento\InventorySalesApi\Api\Data\SalesEventInterfaceFactory */ protected $salesEventFactory; /** * Sales event extension factory * * @var \Magento\InventorySalesApi\Api\Data\SalesEventExtensionFactory */ protected $salesEventExtensionFactory; /** * Items to sell factory * * @var \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory */ protected $itemsToSellFactory; /** * Place reservations for sales event * * @var \Magento\InventorySalesApi\Api\PlaceReservationsForSalesEventInterface */ protected $placeReservationsForSalesEvent; /** * Get source deducted order items * * @var \Magento\InventorySalesApi\Model\ReturnProcessor\GetSourceDeductedOrderItemsInterface */ protected $getSourceDeductedOrderItems; /** * Item to deduct factory * * @var \Magento\InventorySourceDeductionApi\Model\ItemToDeductFactory */ protected $itemToDeductFactory; /** * Source deduction request factory * * @var \Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestFactory */ protected $sourceDeductionRequestFactory; /** * Source deduction service * * @var \Magento\InventorySourceDeductionApi\Model\SourceDeductionService */ protected $sourceDeductionService; /** * Constructor * * @param \Ecombricks\InventoryInventorySales\Api\Data\WebsiteSalesChannelInterfaceFactory $salesChannelFactory * @param \Magento\InventorySalesApi\Api\Data\SalesEventInterfaceFactory $salesEventFactory * @param \Magento\InventorySalesApi\Api\Data\SalesEventExtensionFactory $salesEventExtensionFactory * @param \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory $itemsToSellFactory * @param \Magento\InventorySalesApi\Api\PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent * @param \Magento\InventorySalesApi\Model\ReturnProcessor\GetSourceDeductedOrderItemsInterface $getSourceDeductedOrderItems * @param \Magento\InventorySourceDeductionApi\Model\ItemToDeductFactory $itemToDeductFactory * @param \Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestFactory $sourceDeductionRequestFactory * @param \Magento\InventorySourceDeductionApi\Model\SourceDeductionService $sourceDeductionService * @return void */ public function __construct( \Ecombricks\InventoryInventorySales\Api\Data\WebsiteSalesChannelInterfaceFactory $salesChannelFactory, \Magento\InventorySalesApi\Api\Data\SalesEventInterfaceFactory $salesEventFactory, \Magento\InventorySalesApi\Api\Data\SalesEventExtensionFactory $salesEventExtensionFactory, \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory $itemsToSellFactory, \Magento\InventorySalesApi\Api\PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent, \Magento\InventorySalesApi\Model\ReturnProcessor\GetSourceDeductedOrderItemsInterface $getSourceDeductedOrderItems, \Magento\InventorySourceDeductionApi\Model\ItemToDeductFactory $itemToDeductFactory, \Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestFactory $sourceDeductionRequestFactory, \Magento\InventorySourceDeductionApi\Model\SourceDeductionService $sourceDeductionService ) { $this->salesChannelFactory = $salesChannelFactory; $this->salesEventFactory = $salesEventFactory; $this->salesEventExtensionFactory = $salesEventExtensionFactory; $this->itemsToSellFactory = $itemsToSellFactory; $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent; $this->getSourceDeductedOrderItems = $getSourceDeductedOrderItems; $this->itemToDeductFactory = $itemToDeductFactory; $this->sourceDeductionRequestFactory = $sourceDeductionRequestFactory; $this->sourceDeductionService = $sourceDeductionService; } /** * Compare float number with some epsilon * * @param float $floatNumber * * @return bool */ protected function isZero(float $floatNumber): bool { return $floatNumber < 0.0000001; } /** * Get total deducted qty * * @param $item * @param array $deductedItems * @return float */ protected function getTotalDeductedQty($item, array $deductedItems): float { $result = 0; foreach ($deductedItems as $deductedItemResult) { foreach ($deductedItemResult->getItems() as $deductedItem) { if ( $item->getSku() != $deductedItem->getSku() || $item->getSourceCode() != $deductedItemResult->getSourceCode() ) { continue; } $result += $deductedItem->getQuantity(); } } return $result; } /** * Execute * * @param \Magento\Sales\Api\Data\OrderInterface $order * @param \Ecombricks\InventoryInventorySales\Model\ReturnProcessor\Request\ItemsToRefundInterface[] $itemsToRefund * @param array $returnToStockItems * @return void */ public function execute( \Magento\Sales\Api\Data\OrderInterface $order, array $itemsToRefund, array $returnToStockItems ) { $deductedItems = $this->getSourceDeductedOrderItems->execute($order, $returnToStockItems); $itemsToSell = $backItemsPerSource = []; foreach ($itemsToRefund as $item) { $sku = $item->getSku(); $sourceCode = $item->getSourceCode(); $qty = $item->getQuantity(); $processedQty = $item->getProcessedQuantity() - $this->getTotalDeductedQty($item, $deductedItems); $qtyBackToSource = ($processedQty > 0) ? $qty - $processedQty : $qty; $qtyBackToStock = ($qtyBackToSource > 0) ? $qty - $qtyBackToSource : $qty; if ($qtyBackToStock > 0) { $itemToSell = $this->itemsToSellFactory->create([ 'sku' => $sku, 'qty' => (float) $qtyBackToStock, ]); $itemToSell->getExtensionAttributes()->setSourceCode($sourceCode); $itemsToSell[] = $itemToSell; } foreach ($deductedItems as $deductedItemResult) { foreach ($deductedItemResult->getItems() as $deductedItem) { if ( $sku != $deductedItem->getSku() || $sourceCode != $deductedItemResult->getSourceCode() || $this->isZero((float) $qtyBackToSource) ) { continue; } $backQty = min($deductedItem->getQuantity(), $qtyBackToSource); $backItemsPerSource[$sourceCode][] = $this->itemToDeductFactory->create([ 'sku' => $deductedItem->getSku(), 'qty' => -$backQty, ]); $qtyBackToSource -= $backQty; } } } $salesChannel = $this->salesChannelFactory->create($order->getStore()->getWebsiteId()); $salesEventExtension = $this->salesEventExtensionFactory->create(['data' => ['objectIncrementId' => (string) $order->getIncrementId()]]); $salesEvent = $this->salesEventFactory->create([ 'type' => \Magento\InventorySalesApi\Api\Data\SalesEventInterface::EVENT_CREDITMEMO_CREATED, 'objectType' => \Magento\InventorySalesApi\Api\Data\SalesEventInterface::OBJECT_TYPE_ORDER, 'objectId' => (string) $order->getEntityId(), ]); $salesEvent->setExtensionAttributes($salesEventExtension); foreach ($backItemsPerSource as $sourceCode => $items) { $sourceDeductionRequest = $this->sourceDeductionRequestFactory->create([ 'sourceCode' => $sourceCode, 'items' => $items, 'salesChannel' => $salesChannel, 'salesEvent' => $salesEvent, ]); $this->sourceDeductionService->execute($sourceDeductionRequest); } $this->placeReservationsForSalesEvent->execute($itemsToSell, $salesChannel, $salesEvent); } }