GetSourceSelectionResultFromInvoice.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\InventoryShipping\Model;
  8. use Magento\Framework\App\ObjectManager;
  9. use Magento\InventorySalesApi\Model\GetSkuFromOrderItemInterface;
  10. use Magento\InventorySourceSelectionApi\Model\GetInventoryRequestFromOrder;
  11. use Magento\InventorySourceSelectionApi\Api\Data\ItemRequestInterfaceFactory;
  12. use Magento\Sales\Api\Data\InvoiceInterface;
  13. use Magento\Sales\Api\Data\InvoiceItemInterface;
  14. use Magento\Sales\Api\Data\OrderInterface;
  15. use Magento\InventorySourceSelectionApi\Api\SourceSelectionServiceInterface;
  16. use Magento\InventorySourceSelectionApi\Api\GetDefaultSourceSelectionAlgorithmCodeInterface;
  17. use Magento\InventorySourceSelectionApi\Api\Data\SourceSelectionResultInterface;
  18. use Magento\Sales\Api\Data\OrderItemInterface;
  19. use Traversable;
  20. /**
  21. * Provides Source Selection by given InvoiceInterface object.
  22. * Used for Virtual and Downloadable products only
  23. */
  24. class GetSourceSelectionResultFromInvoice
  25. {
  26. /**
  27. * @var GetSkuFromOrderItemInterface
  28. */
  29. private $getSkuFromOrderItem;
  30. /**
  31. * @var ItemRequestInterfaceFactory
  32. */
  33. private $itemRequestFactory;
  34. /**
  35. * @var GetDefaultSourceSelectionAlgorithmCodeInterface
  36. */
  37. private $getDefaultSourceSelectionAlgorithmCode;
  38. /**
  39. * @var SourceSelectionServiceInterface
  40. */
  41. private $sourceSelectionService;
  42. /**
  43. * @var GetInventoryRequestFromOrder
  44. */
  45. private $getInventoryRequestFromOrder;
  46. /**
  47. * GetSourceSelectionResultFromInvoice constructor.
  48. *
  49. * @param GetSkuFromOrderItemInterface $getSkuFromOrderItem
  50. * @param ItemRequestInterfaceFactory $itemRequestFactory
  51. * @param null $stockByWebsiteIdResolver @deprecated
  52. * @param null $inventoryRequestFactory @deprecated
  53. * @param GetDefaultSourceSelectionAlgorithmCodeInterface $getDefaultSourceSelectionAlgorithmCode
  54. * @param SourceSelectionServiceInterface $sourceSelectionService
  55. * @param GetInventoryRequestFromOrder|null $getInventoryRequestFromOrder
  56. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  57. */
  58. public function __construct(
  59. GetSkuFromOrderItemInterface $getSkuFromOrderItem,
  60. ItemRequestInterfaceFactory $itemRequestFactory,
  61. $stockByWebsiteIdResolver,
  62. $inventoryRequestFactory,
  63. GetDefaultSourceSelectionAlgorithmCodeInterface $getDefaultSourceSelectionAlgorithmCode,
  64. SourceSelectionServiceInterface $sourceSelectionService,
  65. GetInventoryRequestFromOrder $getInventoryRequestFromOrder = null
  66. ) {
  67. $this->itemRequestFactory = $itemRequestFactory;
  68. $this->getDefaultSourceSelectionAlgorithmCode = $getDefaultSourceSelectionAlgorithmCode;
  69. $this->sourceSelectionService = $sourceSelectionService;
  70. $this->getSkuFromOrderItem = $getSkuFromOrderItem;
  71. $this->getInventoryRequestFromOrder = $getInventoryRequestFromOrder ?:
  72. ObjectManager::getInstance()->get(GetInventoryRequestFromOrder::class);
  73. }
  74. /**
  75. * Get source selection result from invoice
  76. *
  77. * @param InvoiceInterface $invoice
  78. * @return SourceSelectionResultInterface
  79. */
  80. public function execute(InvoiceInterface $invoice): SourceSelectionResultInterface
  81. {
  82. /** @var OrderInterface $order */
  83. $order = $invoice->getOrder();
  84. $inventoryRequest = $this->getInventoryRequestFromOrder->execute(
  85. (int) $order->getEntityId(),
  86. $this->getSelectionRequestItems($invoice->getItems())
  87. );
  88. $selectionAlgorithmCode = $this->getDefaultSourceSelectionAlgorithmCode->execute();
  89. return $this->sourceSelectionService->execute($inventoryRequest, $selectionAlgorithmCode);
  90. }
  91. /**
  92. * Get selection request items
  93. *
  94. * @param InvoiceItemInterface[]|Traversable $invoiceItems
  95. * @return array
  96. */
  97. private function getSelectionRequestItems(iterable $invoiceItems): array
  98. {
  99. $selectionRequestItems = [];
  100. foreach ($invoiceItems as $invoiceItem) {
  101. $orderItem = $invoiceItem->getOrderItem();
  102. if ($orderItem->isDummy() || !$orderItem->getIsVirtual()) {
  103. continue;
  104. }
  105. $itemSku = $this->getSkuFromOrderItem->execute($orderItem);
  106. $qty = $this->castQty($invoiceItem->getOrderItem(), $invoiceItem->getQty());
  107. $selectionRequestItems[] = $this->itemRequestFactory->create([
  108. 'sku' => $itemSku,
  109. 'qty' => $qty,
  110. ]);
  111. }
  112. return $selectionRequestItems;
  113. }
  114. /**
  115. * Cast qty value
  116. *
  117. * @param OrderItemInterface $item
  118. * @param string|int|float $qty
  119. * @return float
  120. */
  121. private function castQty(OrderItemInterface $item, $qty): float
  122. {
  123. if ($item->getIsQtyDecimal()) {
  124. $qty = (float) $qty;
  125. } else {
  126. $qty = (int) $qty;
  127. }
  128. return $qty > 0 ? $qty : 0;
  129. }
  130. }