6 declare(strict_types=1);
16 use Magento\InventorySalesApi\Api\Data\SalesEventInterfaceFactory;
19 use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory;
21 use Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory;
30 private $placeReservationsForSalesEvent;
35 private $getSkusByProductIds;
40 private $websiteRepository;
45 private $salesChannelFactory;
50 private $salesEventFactory;
55 private $itemsToSellFactory;
60 private $checkItemsQuantity;
65 private $stockByWebsiteIdResolver;
70 private $getProductTypesBySkus;
75 private $isSourceItemManagementAllowedForProductType;
93 SalesChannelInterfaceFactory $salesChannelFactory,
94 SalesEventInterfaceFactory $salesEventFactory,
95 ItemToSellInterfaceFactory $itemsToSellFactory,
101 $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent;
102 $this->getSkusByProductIds = $getSkusByProductIds;
105 $this->salesEventFactory = $salesEventFactory;
106 $this->itemsToSellFactory = $itemsToSellFactory;
107 $this->checkItemsQuantity = $checkItemsQuantity;
108 $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver;
109 $this->getProductTypesBySkus = $getProductTypesBySkus;
110 $this->isSourceItemManagementAllowedForProductType = $isSourceItemManagementAllowedForProductType;
121 $itemsById = $itemsBySku = $itemsToSell = [];
123 if (!isset($itemsById[
$item->getProductId()])) {
124 $itemsById[
$item->getProductId()] = 0;
126 $itemsById[
$item->getProductId()] +=
$item->getQtyOrdered();
128 $productSkus = $this->getSkusByProductIds->execute(array_keys($itemsById));
132 if (
false === $this->isSourceItemManagementAllowedForProductType->execute(
$productTypes[$sku])) {
136 $itemsBySku[$sku] = (float)$itemsById[
$productId];
137 $itemsToSell[] = $this->itemsToSellFactory->create([
145 $stockId = (int)$this->stockByWebsiteIdResolver->execute((
int)
$websiteId)->getStockId();
147 $this->checkItemsQuantity->execute($itemsBySku, $stockId);
150 $salesEvent = $this->salesEventFactory->create([
153 'objectId' => (
string)
$order->getEntityId()
155 $salesChannel = $this->salesChannelFactory->create([
162 $this->placeReservationsForSalesEvent->execute($itemsToSell, $salesChannel, $salesEvent);
__construct(PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent, GetSkusByProductIdsInterface $getSkusByProductIds, WebsiteRepositoryInterface $websiteRepository, SalesChannelInterfaceFactory $salesChannelFactory, SalesEventInterfaceFactory $salesEventFactory, ItemToSellInterfaceFactory $itemsToSellFactory, CheckItemsQuantity $checkItemsQuantity, StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver, GetProductTypesBySkusInterface $getProductTypesBySkus, IsSourceItemManagementAllowedForProductTypeInterface $isSourceItemManagementAllowedForProductType)
if(!isset($_GET['website_code'])) $websiteCode