![]() 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/old/vendor/magento/module-inventory-shipping/Observer/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\InventoryShipping\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Event\Observer as EventObserver; use Magento\InventorySourceDeductionApi\Model\SourceDeductionServiceInterface; use Magento\InventoryCatalogApi\Api\DefaultSourceProviderInterface; use Magento\InventoryCatalogApi\Model\IsSingleSourceModeInterface; use Magento\InventoryShipping\Model\GetItemsToDeductFromShipment; use Magento\InventorySalesApi\Api\PlaceReservationsForSalesEventInterface; use Magento\InventoryShipping\Model\SourceDeductionRequestFromShipmentFactory; use Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestInterface; use Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory; /** * Class SourceDeductionProcessor */ class SourceDeductionProcessor implements ObserverInterface { /** * @var IsSingleSourceModeInterface */ private $isSingleSourceMode; /** * @var DefaultSourceProviderInterface */ private $defaultSourceProvider; /** * @var GetItemsToDeductFromShipment */ private $getItemsToDeductFromShipment; /** * @var SourceDeductionRequestFromShipmentFactory */ private $sourceDeductionRequestFromShipmentFactory; /** * @var SourceDeductionServiceInterface */ private $sourceDeductionService; /** * @var ItemToSellInterfaceFactory */ private $itemsToSellFactory; /** * @var PlaceReservationsForSalesEventInterface */ private $placeReservationsForSalesEvent; /** * @param IsSingleSourceModeInterface $isSingleSourceMode * @param DefaultSourceProviderInterface $defaultSourceProvider * @param GetItemsToDeductFromShipment $getItemsToDeductFromShipment * @param SourceDeductionRequestFromShipmentFactory $sourceDeductionRequestFromShipmentFactory * @param SourceDeductionServiceInterface $sourceDeductionService * @param ItemToSellInterfaceFactory $itemsToSellFactory * @param PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent */ public function __construct( IsSingleSourceModeInterface $isSingleSourceMode, DefaultSourceProviderInterface $defaultSourceProvider, GetItemsToDeductFromShipment $getItemsToDeductFromShipment, SourceDeductionRequestFromShipmentFactory $sourceDeductionRequestFromShipmentFactory, SourceDeductionServiceInterface $sourceDeductionService, ItemToSellInterfaceFactory $itemsToSellFactory, PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent ) { $this->isSingleSourceMode = $isSingleSourceMode; $this->defaultSourceProvider = $defaultSourceProvider; $this->getItemsToDeductFromShipment = $getItemsToDeductFromShipment; $this->sourceDeductionRequestFromShipmentFactory = $sourceDeductionRequestFromShipmentFactory; $this->sourceDeductionService = $sourceDeductionService; $this->itemsToSellFactory = $itemsToSellFactory; $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent; } /** * @param EventObserver $observer * @return void */ public function execute(EventObserver $observer) { /** @var \Magento\Sales\Model\Order\Shipment $shipment */ $shipment = $observer->getEvent()->getShipment(); if ($shipment->getOrigData('entity_id')) { return; } if (!empty($shipment->getExtensionAttributes()) && !empty($shipment->getExtensionAttributes()->getSourceCode())) { $sourceCode = $shipment->getExtensionAttributes()->getSourceCode(); } elseif ($this->isSingleSourceMode->execute()) { $sourceCode = $this->defaultSourceProvider->getCode(); } $shipmentItems = $this->getItemsToDeductFromShipment->execute($shipment); if (!empty($shipmentItems)) { $sourceDeductionRequest = $this->sourceDeductionRequestFromShipmentFactory->execute( $shipment, $sourceCode, $shipmentItems ); $this->sourceDeductionService->execute($sourceDeductionRequest); $this->placeCompensatingReservation($sourceDeductionRequest); } } /** * Place compensating reservation after source deduction * * @param SourceDeductionRequestInterface $sourceDeductionRequest */ private function placeCompensatingReservation(SourceDeductionRequestInterface $sourceDeductionRequest): void { $items = []; foreach ($sourceDeductionRequest->getItems() as $item) { $items[] = $this->itemsToSellFactory->create([ 'sku' => $item->getSku(), 'qty' => $item->getQty() ]); } $this->placeReservationsForSalesEvent->execute( $items, $sourceDeductionRequest->getSalesChannel(), $sourceDeductionRequest->getSalesEvent() ); } }