![]() 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/InventoryInventoryShipping/Plugin/Observer/ |
<?php /** * Copyright © eComBricks. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Ecombricks\InventoryInventoryShipping\Plugin\Observer; /** * Source deduction processor observer plugin */ class SourceDeductionProcessor { /** * Is single source mode * * @var \Magento\InventoryCatalogApi\Model\IsSingleSourceModeInterface */ protected $isSingleSourceMode; /** * Default source provider * * @var \Magento\InventoryCatalogApi\Api\DefaultSourceProviderInterface */ protected $defaultSourceProvider; /** * Get items to deduct from shipment * * @var \Magento\InventoryShipping\Model\GetItemsToDeductFromShipment */ protected $getItemsToDeductFromShipment; /** * Source deduction request from shipment factory * * @var \Magento\InventoryShipping\Model\SourceDeductionRequestFromShipmentFactory */ protected $sourceDeductionRequestFromShipmentFactory; /** * Source deduction service * * @var \Magento\InventorySourceDeductionApi\Model\SourceDeductionServiceInterface */ protected $sourceDeductionService; /** * Items to sell factory * * @var \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory */ protected $itemsToSellFactory; /** * Place reservations for sales event * * @var \Magento\InventorySalesApi\Api\PlaceReservationsForSalesEventInterface */ protected $placeReservationsForSalesEvent; /** * Constructor * * @param \Magento\InventoryCatalogApi\Model\IsSingleSourceModeInterface $isSingleSourceMode * @param \Magento\InventoryCatalogApi\Api\DefaultSourceProviderInterface $defaultSourceProvider * @param \Magento\InventoryShipping\Model\GetItemsToDeductFromShipment $getItemsToDeductFromShipment * @param \Magento\InventoryShipping\Model\SourceDeductionRequestFromShipmentFactory $sourceDeductionRequestFromShipmentFactory * @param \Magento\InventorySourceDeductionApi\Model\SourceDeductionServiceInterface $sourceDeductionService * @param \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory $itemsToSellFactory * @param \Magento\InventorySalesApi\Api\PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent * @return void */ public function __construct( \Magento\InventoryCatalogApi\Model\IsSingleSourceModeInterface $isSingleSourceMode, \Magento\InventoryCatalogApi\Api\DefaultSourceProviderInterface $defaultSourceProvider, \Magento\InventoryShipping\Model\GetItemsToDeductFromShipment $getItemsToDeductFromShipment, \Magento\InventoryShipping\Model\SourceDeductionRequestFromShipmentFactory $sourceDeductionRequestFromShipmentFactory, \Magento\InventorySourceDeductionApi\Model\SourceDeductionServiceInterface $sourceDeductionService, \Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory $itemsToSellFactory, \Magento\InventorySalesApi\Api\PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent ) { $this->isSingleSourceMode = $isSingleSourceMode; $this->defaultSourceProvider = $defaultSourceProvider; $this->getItemsToDeductFromShipment = $getItemsToDeductFromShipment; $this->sourceDeductionRequestFromShipmentFactory = $sourceDeductionRequestFromShipmentFactory; $this->sourceDeductionService = $sourceDeductionService; $this->itemsToSellFactory = $itemsToSellFactory; $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent; } /** * Place compensating reservation * * @param \Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestInterface $sourceDeductionRequest * @return void */ protected function placeCompensatingReservation(\Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestInterface $sourceDeductionRequest): void { $itemsToSell = []; $sourceCode = $sourceDeductionRequest->getSourceCode(); foreach ($sourceDeductionRequest->getItems() as $item) { $itemToSell = $this->itemsToSellFactory->create(['sku' => $item->getSku(), 'qty' => $item->getQty()]); $itemToSell->getExtensionAttributes()->setSourceCode($sourceCode); $itemsToSell[] = $itemToSell; } $this->placeReservationsForSalesEvent->execute( $itemsToSell, $sourceDeductionRequest->getSalesChannel(), $sourceDeductionRequest->getSalesEvent() ); } /** * Execute * * @param \Magento\Framework\Event\Observer $observer * @return void */ protected function execute(\Magento\Framework\Event\Observer $observer) { $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); } } /** * Around execute * * @param \Magento\InventoryShipping\Observer\SourceDeductionProcessor $subject * @param \Closure $proceed * @param \Magento\Framework\Event\Observer $observer * @return void */ public function aroundExecute( \Magento\InventoryShipping\Observer\SourceDeductionProcessor $subject, \Closure $proceed, \Magento\Framework\Event\Observer $observer ) { return $this->execute($observer); } }