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/Model/ReturnProcessor/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

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

}

Spamworldpro Mini