6 declare(strict_types=1);
20 use Magento\InventorySalesApi\Model\ReturnProcessor\Result\SourceDeductedOrderItemFactory;
21 use Magento\InventorySalesApi\Model\ReturnProcessor\Result\SourceDeductedOrderItemsResultFactory;
29 private $getSkuFromOrderItem;
34 private $stockByWebsiteIdResolver;
39 private $getSourcesAssignedToStockOrderedByPriority;
44 private $getSourceItemsBySku;
49 private $defaultSourceProvider;
54 private $sourceDeductedOrderItemFactory;
59 private $sourceDeductedOrderItemsResultFactory;
76 SourceDeductedOrderItemFactory $sourceDeductedOrderItemFactory,
77 SourceDeductedOrderItemsResultFactory $sourceDeductedOrderItemsResultFactory
79 $this->getSkuFromOrderItem = $getSkuFromOrderItem;
80 $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver;
81 $this->getSourcesAssignedToStockOrderedByPriority = $getSourcesAssignedToStockOrderedByPriority;
84 $this->sourceDeductedOrderItemFactory = $sourceDeductedOrderItemFactory;
85 $this->sourceDeductedOrderItemsResultFactory = $sourceDeductedOrderItemsResultFactory;
100 if ($this->isValidItem(
$orderItem, $returnToStockItems)) {
101 $itemSku = $this->getSkuFromOrderItem->execute(
$orderItem);
102 $invoicedItems[$itemSku] = ($invoicedItems[$itemSku] ?? 0) +
$item->getQty();
108 return $this->getSourceDeductedInvoiceItemsResult($invoicedItems,
$websiteId);
116 private function getSourceDeductedInvoiceItemsResult(array $invoicedItems,
int $websiteId): array
118 $invoicedItemsToReturn =
$result = [];
119 $stockId = (int)$this->stockByWebsiteIdResolver->execute(
$websiteId)->getStockId();
120 foreach ($invoicedItems as $sku => $qty) {
121 $sourceCode = $this->getSourceCodeWithHighestPriorityBySku($sku, $stockId);
122 $invoicedItemsToReturn[
$sourceCode][] = $this->sourceDeductedOrderItemFactory->create([
129 $result[] = $this->sourceDeductedOrderItemsResultFactory->create([
143 private function getSourceCodeWithHighestPriorityBySku(
string $sku,
int $stockId): string
145 $sourceCode = $this->defaultSourceProvider->getCode();
147 $availableSourcesForProduct = $this->getSourceItemsBySku->execute($sku);
148 $assignedSourcesToStock = $this->getSourcesAssignedToStockOrderedByPriority->execute($stockId);
149 foreach ($assignedSourcesToStock as $assignedSource) {
150 foreach ($availableSourcesForProduct as $availableSource) {
151 if ($assignedSource->getSourceCode() == $availableSource->getSourceCode()) {
157 }
catch (LocalizedException $e) {
169 private function isValidItem(OrderItemModel
$orderItem, array $returnToStockItems): bool
171 return (in_array(
$orderItem->getId(), $returnToStockItems)
172 || in_array(
$orderItem->getParentItemId(), $returnToStockItems))
__construct(GetSkuFromOrderItemInterface $getSkuFromOrderItem, StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver, GetSourcesAssignedToStockOrderedByPriorityInterface $getSourcesAssignedToStockOrderedByPriority, GetSourceItemsBySkuInterface $getSourceItemsBySku, DefaultSourceProviderInterface $defaultSourceProvider, SourceDeductedOrderItemFactory $sourceDeductedOrderItemFactory, SourceDeductedOrderItemsResultFactory $sourceDeductedOrderItemsResultFactory)
execute(OrderInterface $order, array $returnToStockItems)