123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\InventoryShipping\Model;
- use Magento\Framework\App\ObjectManager;
- use Magento\InventorySalesApi\Model\GetSkuFromOrderItemInterface;
- use Magento\InventorySourceSelectionApi\Model\GetInventoryRequestFromOrder;
- use Magento\InventorySourceSelectionApi\Api\Data\ItemRequestInterfaceFactory;
- use Magento\Sales\Api\Data\InvoiceInterface;
- use Magento\Sales\Api\Data\InvoiceItemInterface;
- use Magento\Sales\Api\Data\OrderInterface;
- use Magento\InventorySourceSelectionApi\Api\SourceSelectionServiceInterface;
- use Magento\InventorySourceSelectionApi\Api\GetDefaultSourceSelectionAlgorithmCodeInterface;
- use Magento\InventorySourceSelectionApi\Api\Data\SourceSelectionResultInterface;
- use Magento\Sales\Api\Data\OrderItemInterface;
- use Traversable;
- /**
- * Provides Source Selection by given InvoiceInterface object.
- * Used for Virtual and Downloadable products only
- */
- class GetSourceSelectionResultFromInvoice
- {
- /**
- * @var GetSkuFromOrderItemInterface
- */
- private $getSkuFromOrderItem;
- /**
- * @var ItemRequestInterfaceFactory
- */
- private $itemRequestFactory;
- /**
- * @var GetDefaultSourceSelectionAlgorithmCodeInterface
- */
- private $getDefaultSourceSelectionAlgorithmCode;
- /**
- * @var SourceSelectionServiceInterface
- */
- private $sourceSelectionService;
- /**
- * @var GetInventoryRequestFromOrder
- */
- private $getInventoryRequestFromOrder;
- /**
- * GetSourceSelectionResultFromInvoice constructor.
- *
- * @param GetSkuFromOrderItemInterface $getSkuFromOrderItem
- * @param ItemRequestInterfaceFactory $itemRequestFactory
- * @param null $stockByWebsiteIdResolver @deprecated
- * @param null $inventoryRequestFactory @deprecated
- * @param GetDefaultSourceSelectionAlgorithmCodeInterface $getDefaultSourceSelectionAlgorithmCode
- * @param SourceSelectionServiceInterface $sourceSelectionService
- * @param GetInventoryRequestFromOrder|null $getInventoryRequestFromOrder
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function __construct(
- GetSkuFromOrderItemInterface $getSkuFromOrderItem,
- ItemRequestInterfaceFactory $itemRequestFactory,
- $stockByWebsiteIdResolver,
- $inventoryRequestFactory,
- GetDefaultSourceSelectionAlgorithmCodeInterface $getDefaultSourceSelectionAlgorithmCode,
- SourceSelectionServiceInterface $sourceSelectionService,
- GetInventoryRequestFromOrder $getInventoryRequestFromOrder = null
- ) {
- $this->itemRequestFactory = $itemRequestFactory;
- $this->getDefaultSourceSelectionAlgorithmCode = $getDefaultSourceSelectionAlgorithmCode;
- $this->sourceSelectionService = $sourceSelectionService;
- $this->getSkuFromOrderItem = $getSkuFromOrderItem;
- $this->getInventoryRequestFromOrder = $getInventoryRequestFromOrder ?:
- ObjectManager::getInstance()->get(GetInventoryRequestFromOrder::class);
- }
- /**
- * Get source selection result from invoice
- *
- * @param InvoiceInterface $invoice
- * @return SourceSelectionResultInterface
- */
- public function execute(InvoiceInterface $invoice): SourceSelectionResultInterface
- {
- /** @var OrderInterface $order */
- $order = $invoice->getOrder();
- $inventoryRequest = $this->getInventoryRequestFromOrder->execute(
- (int) $order->getEntityId(),
- $this->getSelectionRequestItems($invoice->getItems())
- );
- $selectionAlgorithmCode = $this->getDefaultSourceSelectionAlgorithmCode->execute();
- return $this->sourceSelectionService->execute($inventoryRequest, $selectionAlgorithmCode);
- }
- /**
- * Get selection request items
- *
- * @param InvoiceItemInterface[]|Traversable $invoiceItems
- * @return array
- */
- private function getSelectionRequestItems(iterable $invoiceItems): array
- {
- $selectionRequestItems = [];
- foreach ($invoiceItems as $invoiceItem) {
- $orderItem = $invoiceItem->getOrderItem();
- if ($orderItem->isDummy() || !$orderItem->getIsVirtual()) {
- continue;
- }
- $itemSku = $this->getSkuFromOrderItem->execute($orderItem);
- $qty = $this->castQty($invoiceItem->getOrderItem(), $invoiceItem->getQty());
- $selectionRequestItems[] = $this->itemRequestFactory->create([
- 'sku' => $itemSku,
- 'qty' => $qty,
- ]);
- }
- return $selectionRequestItems;
- }
- /**
- * Cast qty value
- *
- * @param OrderItemInterface $item
- * @param string|int|float $qty
- * @return float
- */
- private function castQty(OrderItemInterface $item, $qty): float
- {
- if ($item->getIsQtyDecimal()) {
- $qty = (float) $qty;
- } else {
- $qty = (int) $qty;
- }
- return $qty > 0 ? $qty : 0;
- }
- }
|