diff --git a/app/code/Magento/InventoryShipping/Model/SourceDeduction/Request/SourceDeductionRequest.php b/app/code/Magento/InventoryShipping/Model/SourceDeduction/Request/SourceDeductionRequest.php index 9ddb55c2d3feb..b2160b9877bf7 100644 --- a/app/code/Magento/InventoryShipping/Model/SourceDeduction/Request/SourceDeductionRequest.php +++ b/app/code/Magento/InventoryShipping/Model/SourceDeduction/Request/SourceDeductionRequest.php @@ -8,17 +8,13 @@ namespace Magento\InventoryShipping\Model\SourceDeduction\Request; use Magento\InventorySalesApi\Api\Data\SalesEventInterface; +use Magento\InventorySalesApi\Api\Data\SalesChannelInterface; /** * @inheritdoc */ class SourceDeductionRequest implements SourceDeductionRequestInterface { - /** - * @var int - */ - private $websiteId; - /** * @var string */ @@ -29,47 +25,56 @@ class SourceDeductionRequest implements SourceDeductionRequestInterface */ private $items; + /** + * @var SalesChannelInterface + */ + private $salesChannel; + /** * @var SalesEventInterface */ private $salesEvent; /** - * @param int $websiteId * @param string $sourceCode * @param array $items + * @param SalesChannelInterface $salesChannel * @param SalesEventInterface $salesEvent */ - public function __construct(int $websiteId, string $sourceCode, array $items, SalesEventInterface $salesEvent) - { - $this->websiteId = $websiteId; + public function __construct( + string $sourceCode, + array $items, + SalesChannelInterface $salesChannel, + SalesEventInterface $salesEvent + ) { $this->sourceCode = $sourceCode; $this->items = $items; + $this->salesChannel = $salesChannel; $this->salesEvent = $salesEvent; } /** * @inheritdoc */ - public function getWebsiteId(): int + public function getSourceCode(): string { - return $this->websiteId; + return $this->sourceCode; } /** * @inheritdoc */ - public function getSourceCode(): string + public function getItems(): array { - return $this->sourceCode; + return $this->items; } /** * @inheritdoc */ - public function getItems(): array + public function getSalesChannel(): SalesChannelInterface { - return $this->items; + return $this->salesChannel; } /** diff --git a/app/code/Magento/InventoryShipping/Model/SourceDeduction/Request/SourceDeductionRequestInterface.php b/app/code/Magento/InventoryShipping/Model/SourceDeduction/Request/SourceDeductionRequestInterface.php index f318088804945..fc97aac0dc20d 100644 --- a/app/code/Magento/InventoryShipping/Model/SourceDeduction/Request/SourceDeductionRequestInterface.php +++ b/app/code/Magento/InventoryShipping/Model/SourceDeduction/Request/SourceDeductionRequestInterface.php @@ -8,6 +8,7 @@ namespace Magento\InventoryShipping\Model\SourceDeduction\Request; use Magento\InventorySalesApi\Api\Data\SalesEventInterface; +use Magento\InventorySalesApi\Api\Data\SalesChannelInterface; /** * Request products in a given Qty, sourceCode and StockId @@ -16,11 +17,6 @@ */ interface SourceDeductionRequestInterface { - /** - * @return int - */ - public function getWebsiteId(): int; - /** * @return string */ @@ -31,6 +27,11 @@ public function getSourceCode(): string; */ public function getItems(): array; + /** + * @return SalesChannelInterface + */ + public function getSalesChannel(): SalesChannelInterface; + /** * @return SalesEventInterface */ diff --git a/app/code/Magento/InventoryShipping/Model/SourceDeduction/SourceDeductionService.php b/app/code/Magento/InventoryShipping/Model/SourceDeduction/SourceDeductionService.php index 8b6f1a9dfe8ca..6b31a1a2342d2 100644 --- a/app/code/Magento/InventoryShipping/Model/SourceDeduction/SourceDeductionService.php +++ b/app/code/Magento/InventoryShipping/Model/SourceDeduction/SourceDeductionService.php @@ -11,12 +11,9 @@ use Magento\InventoryConfigurationApi\Api\GetStockItemConfigurationInterface; use Magento\InventoryShipping\Model\GetSourceItemBySourceCodeAndSku; use Magento\InventoryShipping\Model\SourceDeduction\Request\SourceDeductionRequestInterface; -use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory; -use Magento\InventorySalesApi\Api\Data\SalesChannelInterface; use Magento\InventorySalesApi\Api\PlaceReservationsForSalesEventInterface; use Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory; -use Magento\Store\Api\WebsiteRepositoryInterface; -use Magento\InventorySalesApi\Model\StockByWebsiteIdResolverInterface; +use Magento\InventorySalesApi\Api\StockResolverInterface; use Magento\Framework\Exception\LocalizedException; /** @@ -40,25 +37,15 @@ class SourceDeductionService implements SourceDeductionServiceInterface private $getStockItemConfiguration; /** - * @var StockByWebsiteIdResolverInterface + * @var StockResolverInterface */ - private $stockByWebsiteIdResolver; - - /** - * @var SalesChannelInterfaceFactory - */ - private $salesChannelFactory; + private $stockResolver; /** * @var ItemToSellInterfaceFactory */ private $itemsToSellFactory; - /** - * @var WebsiteRepositoryInterface - */ - private $websiteRepository; - /** * @var PlaceReservationsForSalesEventInterface */ @@ -68,29 +55,24 @@ class SourceDeductionService implements SourceDeductionServiceInterface * @param SourceItemsSaveInterface $sourceItemsSave * @param GetSourceItemBySourceCodeAndSku $getSourceItemBySourceCodeAndSku * @param GetStockItemConfigurationInterface $getStockItemConfiguration - * @param StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver - * @param SalesChannelInterfaceFactory $salesChannelFactory + * @param StockResolverInterface $stockResolver * @param ItemToSellInterfaceFactory $itemsToSellFactory - * @param WebsiteRepositoryInterface $websiteRepository * @param PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent + * @internal param StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver */ public function __construct( SourceItemsSaveInterface $sourceItemsSave, GetSourceItemBySourceCodeAndSku $getSourceItemBySourceCodeAndSku, GetStockItemConfigurationInterface $getStockItemConfiguration, - StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver, - SalesChannelInterfaceFactory $salesChannelFactory, + StockResolverInterface $stockResolver, ItemToSellInterfaceFactory $itemsToSellFactory, - WebsiteRepositoryInterface $websiteRepository, PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent ) { $this->sourceItemsSave = $sourceItemsSave; $this->getSourceItemBySourceCodeAndSku = $getSourceItemBySourceCodeAndSku; $this->getStockItemConfiguration = $getStockItemConfiguration; - $this->salesChannelFactory = $salesChannelFactory; + $this->stockResolver = $stockResolver; $this->itemsToSellFactory = $itemsToSellFactory; - $this->websiteRepository = $websiteRepository; - $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver; $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent; } @@ -101,9 +83,12 @@ public function execute(SourceDeductionRequestInterface $sourceDeductionRequest) { $sourceItemToSave = []; $sourceCode = $sourceDeductionRequest->getSourceCode(); - $websiteId = $sourceDeductionRequest->getWebsiteId(); + $salesChannel = $sourceDeductionRequest->getSalesChannel(); - $stockId = (int)$this->stockByWebsiteIdResolver->execute((int)$websiteId)->getStockId(); + $stockId = (int)$this->stockResolver->get( + $salesChannel->getType(), + $salesChannel->getCode() + )->getStockId(); $itemsToSell = []; foreach ($sourceDeductionRequest->getItems() as $item) { $itemSku = $item->getSku(); @@ -135,13 +120,6 @@ public function execute(SourceDeductionRequestInterface $sourceDeductionRequest) $salesEvent = $sourceDeductionRequest->getSalesEvent(); - $websiteCode = $this->websiteRepository->getById($websiteId)->getCode(); - $salesChannel = $this->salesChannelFactory->create([ - 'data' => [ - 'type' => SalesChannelInterface::TYPE_WEBSITE, - 'code' => $websiteCode - ] - ]); $this->placeReservationsForSalesEvent->execute($itemsToSell, $salesChannel, $salesEvent); } } diff --git a/app/code/Magento/InventoryShipping/Model/SourceDeductionRequestsFromSourceSelectionFactory.php b/app/code/Magento/InventoryShipping/Model/SourceDeductionRequestsFromSourceSelectionFactory.php index e7c6e80c77934..9d54a71ef8690 100644 --- a/app/code/Magento/InventoryShipping/Model/SourceDeductionRequestsFromSourceSelectionFactory.php +++ b/app/code/Magento/InventoryShipping/Model/SourceDeductionRequestsFromSourceSelectionFactory.php @@ -14,6 +14,9 @@ use Magento\InventoryShipping\Model\SourceDeduction\Request\SourceDeductionRequestInterfaceFactory; use Magento\InventorySourceSelectionApi\Api\Data\SourceSelectionItemInterface; use Magento\InventorySourceSelectionApi\Api\Data\SourceSelectionResultInterface; +use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory; +use Magento\InventorySalesApi\Api\Data\SalesChannelInterface; +use Magento\Store\Api\WebsiteRepositoryInterface; class SourceDeductionRequestsFromSourceSelectionFactory { @@ -27,16 +30,32 @@ class SourceDeductionRequestsFromSourceSelectionFactory */ private $itemToDeductFactory; + /** + * @var SalesChannelInterfaceFactory + */ + private $salesChannelFactory; + + /** + * @var WebsiteRepositoryInterface + */ + private $websiteRepository; + /** * @param SourceDeductionRequestInterfaceFactory $sourceDeductionRequestFactory * @param ItemToDeductInterfaceFactory $itemToDeductFactory + * @param SalesChannelInterfaceFactory $salesChannelFactory + * @param WebsiteRepositoryInterface $websiteRepository */ public function __construct( SourceDeductionRequestInterfaceFactory $sourceDeductionRequestFactory, - ItemToDeductInterfaceFactory $itemToDeductFactory + ItemToDeductInterfaceFactory $itemToDeductFactory, + SalesChannelInterfaceFactory $salesChannelFactory, + WebsiteRepositoryInterface $websiteRepository ) { $this->sourceDeductionRequestFactory = $sourceDeductionRequestFactory; $this->itemToDeductFactory = $itemToDeductFactory; + $this->salesChannelFactory = $salesChannelFactory; + $this->websiteRepository = $websiteRepository; } /** @@ -51,12 +70,20 @@ public function create( int $websiteId ): array { $sourceDeductionRequests = []; + $websiteCode = $this->websiteRepository->getById($websiteId)->getCode(); + $salesChannel = $this->salesChannelFactory->create([ + 'data' => [ + 'type' => SalesChannelInterface::TYPE_WEBSITE, + 'code' => $websiteCode + ] + ]); + foreach ($this->getItemsPerSource($sourceSelectionResult->getSourceSelectionItems()) as $sourceCode => $items) { /** @var SourceDeductionRequestInterface[] $sourceDeductionRequests */ $sourceDeductionRequests[] = $this->sourceDeductionRequestFactory->create([ - 'websiteId' => $websiteId, 'sourceCode' => $sourceCode, 'items' => $items, + 'salesChannel' => $salesChannel, 'salesEvent' => $salesEvent ]); } diff --git a/app/code/Magento/InventoryShipping/Observer/SourceDeductionProcessor.php b/app/code/Magento/InventoryShipping/Observer/SourceDeductionProcessor.php index 728748d9a9273..e6124da5b0f59 100644 --- a/app/code/Magento/InventoryShipping/Observer/SourceDeductionProcessor.php +++ b/app/code/Magento/InventoryShipping/Observer/SourceDeductionProcessor.php @@ -10,12 +10,15 @@ use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Event\Observer as EventObserver; use Magento\InventorySalesApi\Api\Data\SalesEventInterfaceFactory; +use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory; +use Magento\InventorySalesApi\Api\Data\SalesChannelInterface; use Magento\InventoryShipping\Model\SourceDeduction\SourceDeductionServiceInterface; use Magento\InventoryShipping\Model\SourceDeduction\Request\SourceDeductionRequestInterfaceFactory; use Magento\InventoryCatalogApi\Api\DefaultSourceProviderInterface; use Magento\InventoryCatalogApi\Model\IsSingleSourceModeInterface; use Magento\InventorySalesApi\Api\Data\SalesEventInterface; use Magento\InventoryShipping\Model\GetItemsToDeduct; +use Magento\Store\Api\WebsiteRepositoryInterface; /** * Class SourceDeductionProcessor @@ -37,11 +40,21 @@ class SourceDeductionProcessor implements ObserverInterface */ private $defaultSourceProvider; + /** + * @var SalesChannelInterfaceFactory + */ + private $salesChannelFactory; + /** * @var SalesEventInterfaceFactory */ private $salesEventFactory; + /** + * @var WebsiteRepositoryInterface + */ + private $websiteRepository; + /** * @var IsSingleSourceModeInterface */ @@ -56,7 +69,9 @@ class SourceDeductionProcessor implements ObserverInterface * @param SourceDeductionRequestInterfaceFactory $sourceDeductionRequestFactory * @param SourceDeductionServiceInterface $sourceDeductionService * @param DefaultSourceProviderInterface $defaultSourceProvider + * @param SalesChannelInterfaceFactory $salesChannelFactory * @param SalesEventInterfaceFactory $salesEventFactory + * @param WebsiteRepositoryInterface $websiteRepository * @param IsSingleSourceModeInterface $isSingleSourceMode * @param GetItemsToDeduct $getItemsToDeduct */ @@ -64,14 +79,18 @@ public function __construct( SourceDeductionRequestInterfaceFactory $sourceDeductionRequestFactory, SourceDeductionServiceInterface $sourceDeductionService, DefaultSourceProviderInterface $defaultSourceProvider, + SalesChannelInterfaceFactory $salesChannelFactory, SalesEventInterfaceFactory $salesEventFactory, + WebsiteRepositoryInterface $websiteRepository, IsSingleSourceModeInterface $isSingleSourceMode, GetItemsToDeduct $getItemsToDeduct ) { $this->sourceDeductionRequestFactory = $sourceDeductionRequestFactory; $this->sourceDeductionService = $sourceDeductionService; $this->defaultSourceProvider = $defaultSourceProvider; + $this->salesChannelFactory = $salesChannelFactory; $this->salesEventFactory = $salesEventFactory; + $this->websiteRepository = $websiteRepository; $this->isSingleSourceMode = $isSingleSourceMode; $this->getItemsToDeduct = $getItemsToDeduct; } @@ -98,14 +117,6 @@ public function execute(EventObserver $observer) $sourceCode = $this->defaultSourceProvider->getCode(); } - $websiteId = $shipment->getOrder()->getStore()->getWebsiteId(); - - $salesEvent = $this->salesEventFactory->create([ - 'type' => SalesEventInterface::EVENT_SHIPMENT_CREATED, - 'objectType' => SalesEventInterface::OBJECT_TYPE_ORDER, - 'objectId' => $shipment->getOrderId() - ]); - /** @var \Magento\Sales\Model\Order\Shipment\Item $shipmentItem */ foreach ($shipment->getAllItems() as $shipmentItem) { foreach ($this->getItemsToDeduct->execute($shipmentItem) as $item) { @@ -114,10 +125,26 @@ public function execute(EventObserver $observer) } if (!empty($shipmentItems)) { + $websiteId = $shipment->getOrder()->getStore()->getWebsiteId(); + + $salesEvent = $this->salesEventFactory->create([ + 'type' => SalesEventInterface::EVENT_SHIPMENT_CREATED, + 'objectType' => SalesEventInterface::OBJECT_TYPE_ORDER, + 'objectId' => $shipment->getOrderId() + ]); + + $websiteCode = $this->websiteRepository->getById($websiteId)->getCode(); + $salesChannel = $this->salesChannelFactory->create([ + 'data' => [ + 'type' => SalesChannelInterface::TYPE_WEBSITE, + 'code' => $websiteCode + ] + ]); + $sourceDeductionRequest = $this->sourceDeductionRequestFactory->create([ - 'websiteId' => $websiteId, 'sourceCode' => $sourceCode, 'items' => $shipmentItems, + 'salesChannel' => $salesChannel, 'salesEvent' => $salesEvent ]);