Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
GetInvoicedItemsPerSourceByPriority.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
12 use Magento\Sales\Model\Order\Item as OrderItemModel;
20 use Magento\InventorySalesApi\Model\ReturnProcessor\Result\SourceDeductedOrderItemFactory;
21 use Magento\InventorySalesApi\Model\ReturnProcessor\Result\SourceDeductedOrderItemsResultFactory;
23 
25 {
29  private $getSkuFromOrderItem;
30 
34  private $stockByWebsiteIdResolver;
35 
39  private $getSourcesAssignedToStockOrderedByPriority;
40 
44  private $getSourceItemsBySku;
45 
49  private $defaultSourceProvider;
50 
54  private $sourceDeductedOrderItemFactory;
55 
59  private $sourceDeductedOrderItemsResultFactory;
60 
70  public function __construct(
71  GetSkuFromOrderItemInterface $getSkuFromOrderItem,
72  StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver,
73  GetSourcesAssignedToStockOrderedByPriorityInterface $getSourcesAssignedToStockOrderedByPriority,
74  GetSourceItemsBySkuInterface $getSourceItemsBySku,
75  DefaultSourceProviderInterface $defaultSourceProvider,
76  SourceDeductedOrderItemFactory $sourceDeductedOrderItemFactory,
77  SourceDeductedOrderItemsResultFactory $sourceDeductedOrderItemsResultFactory
78  ) {
79  $this->getSkuFromOrderItem = $getSkuFromOrderItem;
80  $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver;
81  $this->getSourcesAssignedToStockOrderedByPriority = $getSourcesAssignedToStockOrderedByPriority;
82  $this->getSourceItemsBySku = $getSourceItemsBySku;
83  $this->defaultSourceProvider = $defaultSourceProvider;
84  $this->sourceDeductedOrderItemFactory = $sourceDeductedOrderItemFactory;
85  $this->sourceDeductedOrderItemsResultFactory = $sourceDeductedOrderItemsResultFactory;
86  }
87 
93  public function execute(OrderInterface $order, array $returnToStockItems): array
94  {
95  $invoicedItems = [];
97  foreach ($order->getInvoiceCollection() as $invoice) {
98  foreach ($invoice->getItems() as $item) {
99  $orderItem = $item->getOrderItem();
100  if ($this->isValidItem($orderItem, $returnToStockItems)) {
101  $itemSku = $this->getSkuFromOrderItem->execute($orderItem);
102  $invoicedItems[$itemSku] = ($invoicedItems[$itemSku] ?? 0) + $item->getQty();
103  }
104  }
105  }
106  $websiteId = (int)$order->getStore()->getWebsiteId();
107 
108  return $this->getSourceDeductedInvoiceItemsResult($invoicedItems, $websiteId);
109  }
110 
116  private function getSourceDeductedInvoiceItemsResult(array $invoicedItems, int $websiteId): array
117  {
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([
123  'sku' => $sku,
124  'quantity' => $qty
125  ]);
126  }
127 
128  foreach ($invoicedItemsToReturn as $sourceCode => $items) {
129  $result[] = $this->sourceDeductedOrderItemsResultFactory->create([
130  'sourceCode' => $sourceCode,
131  'items' => $items
132  ]);
133  }
134 
135  return $result;
136  }
137 
143  private function getSourceCodeWithHighestPriorityBySku(string $sku, int $stockId): string
144  {
145  $sourceCode = $this->defaultSourceProvider->getCode();
146  try {
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()) {
152  $sourceCode = $assignedSource->getSourceCode();
153  break 2;
154  }
155  }
156  }
157  } catch (LocalizedException $e) {
158  //Use Default Source if the source can't be resolved
159  }
160 
161  return $sourceCode;
162  }
163 
169  private function isValidItem(OrderItemModel $orderItem, array $returnToStockItems): bool
170  {
171  return (in_array($orderItem->getId(), $returnToStockItems)
172  || in_array($orderItem->getParentItemId(), $returnToStockItems))
173  && $orderItem->getIsVirtual()
174  && !$orderItem->isDummy();
175  }
176 }
$orderItem
Definition: order.php:30
$order
Definition: order.php:55
$sourceCode
Definition: inventory.phtml:11
$invoice
__construct(GetSkuFromOrderItemInterface $getSkuFromOrderItem, StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver, GetSourcesAssignedToStockOrderedByPriorityInterface $getSourcesAssignedToStockOrderedByPriority, GetSourceItemsBySkuInterface $getSourceItemsBySku, DefaultSourceProviderInterface $defaultSourceProvider, SourceDeductedOrderItemFactory $sourceDeductedOrderItemFactory, SourceDeductedOrderItemsResultFactory $sourceDeductedOrderItemsResultFactory)
$items