Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
GetSourceSelectionResultFromInvoice.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
13 use Magento\InventorySourceSelectionApi\Api\Data\InventoryRequestInterfaceFactory;
14 use Magento\InventorySourceSelectionApi\Api\Data\ItemRequestInterfaceFactory;
21 use Traversable;
22 
28 {
32  private $getSkuFromOrderItem;
33 
37  private $itemRequestFactory;
38 
42  private $inventoryRequestFactory;
43 
47  private $stockByWebsiteIdResolver;
48 
52  private $getDefaultSourceSelectionAlgorithmCode;
53 
57  private $sourceSelectionService;
58 
67  public function __construct(
68  GetSkuFromOrderItemInterface $getSkuFromOrderItem,
69  ItemRequestInterfaceFactory $itemRequestFactory,
70  StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver,
71  InventoryRequestInterfaceFactory $inventoryRequestFactory,
72  GetDefaultSourceSelectionAlgorithmCodeInterface $getDefaultSourceSelectionAlgorithmCode,
73  SourceSelectionServiceInterface $sourceSelectionService
74  ) {
75  $this->itemRequestFactory = $itemRequestFactory;
76  $this->inventoryRequestFactory = $inventoryRequestFactory;
77  $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver;
78  $this->getDefaultSourceSelectionAlgorithmCode = $getDefaultSourceSelectionAlgorithmCode;
79  $this->sourceSelectionService = $sourceSelectionService;
80  $this->getSkuFromOrderItem = $getSkuFromOrderItem;
81  }
82 
88  {
89  $order = $invoice->getOrder();
90  $websiteId = $order->getStore()->getWebsiteId();
91  $stockId = (int)$this->stockByWebsiteIdResolver->execute((int)$websiteId)->getStockId();
92 
94  $inventoryRequest = $this->inventoryRequestFactory->create([
95  'stockId' => $stockId,
96  'items' => $this->getSelectionRequestItems($invoice->getItems())
97  ]);
98 
99  $selectionAlgorithmCode = $this->getDefaultSourceSelectionAlgorithmCode->execute();
100  return $this->sourceSelectionService->execute($inventoryRequest, $selectionAlgorithmCode);
101  }
102 
107  private function getSelectionRequestItems(Traversable $invoiceItems): array
108  {
109  $selectionRequestItems = [];
110  foreach ($invoiceItems as $invoiceItem) {
111  $orderItem = $invoiceItem->getOrderItem();
112 
113  if ($orderItem->isDummy() || !$orderItem->getIsVirtual()) {
114  continue;
115  }
116 
117  $itemSku = $this->getSkuFromOrderItem->execute($orderItem);
118  $qty = $this->castQty($invoiceItem->getOrderItem(), $invoiceItem->getQty());
119 
120  $selectionRequestItems[] = $this->itemRequestFactory->create([
121  'sku' => $itemSku,
122  'qty' => $qty,
123  ]);
124  }
125  return $selectionRequestItems;
126  }
127 
133  private function castQty(OrderItemInterface $item, $qty)
134  {
135  if ($item->getIsQtyDecimal()) {
136  $qty = (double)$qty;
137  } else {
138  $qty = (int)$qty;
139  }
140 
141  return $qty > 0 ? $qty : 0;
142  }
143 }
$invoiceItem
__construct(GetSkuFromOrderItemInterface $getSkuFromOrderItem, ItemRequestInterfaceFactory $itemRequestFactory, StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver, InventoryRequestInterfaceFactory $inventoryRequestFactory, GetDefaultSourceSelectionAlgorithmCodeInterface $getDefaultSourceSelectionAlgorithmCode, SourceSelectionServiceInterface $sourceSelectionService)
$orderItem
Definition: order.php:30
$order
Definition: order.php:55
$invoice