6 declare(strict_types=1);
14 use Magento\InventorySalesApi\Model\ReturnProcessor\Result\SourceDeductedOrderItemFactory;
16 use Magento\InventorySalesApi\Model\ReturnProcessor\Result\SourceDeductedOrderItemsResultFactory;
28 private $getSourceCodeByShipmentId;
33 private $stockByWebsiteIdResolver;
38 private $getSourcesAssignedToStockOrderedByPriority;
43 private $sourceDeductedOrderItemFactory;
48 private $sourceDeductedOrderItemsResultFactory;
53 private $getItemsToDeductFromShipment;
67 SourceDeductedOrderItemFactory $sourceDeductedOrderItemFactory,
68 SourceDeductedOrderItemsResultFactory $sourceDeductedOrderItemsResultFactory,
71 $this->getSourceCodeByShipmentId = $getSourceCodeByShipmentId;
72 $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver;
73 $this->getSourcesAssignedToStockOrderedByPriority = $getSourcesAssignedToStockOrderedByPriority;
74 $this->sourceDeductedOrderItemFactory = $sourceDeductedOrderItemFactory;
75 $this->sourceDeductedOrderItemsResultFactory = $sourceDeductedOrderItemsResultFactory;
76 $this->getItemsToDeductFromShipment = $getItemsToDeductFromShipment;
92 $shippedItems = $this->getItemsToDeductFromShipment->execute(
$shipment);
93 foreach ($shippedItems as
$item) {
94 $sku =
$item->getSku();
101 $sources = $this->sortSourcesByPriority($sources, (
int)
$websiteId);
104 $sources = $this->groupItemsBySku($sources);
106 return $this->getSourceDeductedItemsResult($sources);
113 private function getSourceDeductedItemsResult(array $shippedItems): array
118 foreach (
$items as $sku => $qty) {
119 $deductedItems[] = $this->sourceDeductedOrderItemFactory->create([
124 $result[] = $this->sourceDeductedOrderItemsResultFactory->create([
126 'items' => $deductedItems
139 private function groupItemsBySku(array $sources): array
141 $skuPerSource = $itemsGroupedBySku = [];
143 foreach (
$data as $sku => $qty) {
144 if (empty($skuPerSource[$sku])) {
148 $existingSourceCode = $skuPerSource[$sku];
149 $itemsGroupedBySku[$existingSourceCode][$sku] += $qty;
154 return $itemsGroupedBySku;
164 private function sortSourcesByPriority(array $sources,
int $websiteId): array
166 $sourcesByPriority = [];
168 $stockId = (int)$this->stockByWebsiteIdResolver->execute(
$websiteId)->getStockId();
169 $assignedSourcesToStock = $this->getSourcesAssignedToStockOrderedByPriority->execute($stockId);
170 }
catch (LocalizedException $e) {
171 $assignedSourcesToStock = [];
174 foreach ($assignedSourcesToStock as
$source) {
175 if (!empty($sources[
$source->getSourceCode()])) {
176 $sourcesByPriority[
$source->getSourceCode()] = $sources[
$source->getSourceCode()];
177 unset($sources[
$source->getSourceCode()]);
185 return $sourcesByPriority;
__construct(GetSourceCodeByShipmentId $getSourceCodeByShipmentId, StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver, GetSourcesAssignedToStockOrderedByPriorityInterface $getSourcesAssignedToStockOrderedByPriority, SourceDeductedOrderItemFactory $sourceDeductedOrderItemFactory, SourceDeductedOrderItemsResultFactory $sourceDeductedOrderItemsResultFactory, GetItemsToDeductFromShipment $getItemsToDeductFromShipment)
foreach($order->getItems() as $orderItem) $shipment
execute(OrderInterface $order, array $returnToStockItems)