InventoryRequestFromOrderFactory.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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\Sales\Api\Data\OrderInterface;
  9. use Magento\Sales\Api\Data\OrderItemInterface;
  10. use Magento\Sales\Model\Order\Item as OrderItem;
  11. use Magento\InventorySourceSelectionApi\Api\Data\InventoryRequestInterface;
  12. use Magento\InventorySourceSelectionApi\Api\Data\ItemRequestInterfaceFactory;
  13. use Magento\InventorySourceSelectionApi\Api\Data\InventoryRequestInterfaceFactory;
  14. use Magento\InventorySalesApi\Model\StockByWebsiteIdResolverInterface;
  15. use Magento\InventorySalesApi\Model\GetSkuFromOrderItemInterface;
  16. class InventoryRequestFromOrderFactory
  17. {
  18. /**
  19. * @var ItemRequestInterfaceFactory
  20. */
  21. private $itemRequestFactory;
  22. /**
  23. * @var InventoryRequestInterfaceFactory
  24. */
  25. private $inventoryRequestFactory;
  26. /**
  27. * @var StockByWebsiteIdResolverInterface
  28. */
  29. private $stockByWebsiteIdResolver;
  30. /**
  31. * @var GetSkuFromOrderItemInterface
  32. */
  33. private $getSkuFromOrderItem;
  34. /**
  35. * @param ItemRequestInterfaceFactory $itemRequestFactory
  36. * @param InventoryRequestInterfaceFactory $inventoryRequestFactory
  37. * @param StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver
  38. * @param GetSkuFromOrderItemInterface $getSkuFromOrderItem
  39. */
  40. public function __construct(
  41. ItemRequestInterfaceFactory $itemRequestFactory,
  42. InventoryRequestInterfaceFactory $inventoryRequestFactory,
  43. StockByWebsiteIdResolverInterface $stockByWebsiteIdResolver,
  44. GetSkuFromOrderItemInterface $getSkuFromOrderItem
  45. ) {
  46. $this->itemRequestFactory = $itemRequestFactory;
  47. $this->inventoryRequestFactory = $inventoryRequestFactory;
  48. $this->stockByWebsiteIdResolver = $stockByWebsiteIdResolver;
  49. $this->getSkuFromOrderItem = $getSkuFromOrderItem;
  50. }
  51. /**
  52. * @param OrderInterface $order
  53. * @return InventoryRequestInterface
  54. */
  55. public function create(OrderInterface $order) : InventoryRequestInterface
  56. {
  57. $requestItems = [];
  58. $websiteId = $order->getStore()->getWebsiteId();
  59. $stockId = (int)$this->stockByWebsiteIdResolver->execute((int)$websiteId)->getStockId();
  60. /** @var OrderItemInterface|OrderItem $orderItem */
  61. foreach ($order->getItems() as $orderItem) {
  62. $itemSku = $this->getSkuFromOrderItem->execute($orderItem);
  63. $qtyToDeliver = $orderItem->getQtyToShip();
  64. //check if order item is not delivered yet
  65. if ($orderItem->isDeleted()
  66. || $orderItem->getParentItemId()
  67. || $this->isZero((float)$qtyToDeliver)
  68. || $orderItem->getIsVirtual()
  69. ) {
  70. continue;
  71. }
  72. $requestItems[] = $this->itemRequestFactory->create([
  73. 'sku' => $itemSku,
  74. 'qty' => $qtyToDeliver
  75. ]);
  76. }
  77. return $this->inventoryRequestFactory->create([
  78. 'stockId' => $stockId,
  79. 'items' => $requestItems
  80. ]);
  81. }
  82. /**
  83. * Compare float number with some epsilon
  84. *
  85. * @param float $floatNumber
  86. *
  87. * @return bool
  88. */
  89. private function isZero(float $floatNumber): bool
  90. {
  91. return $floatNumber < 0.0000001;
  92. }
  93. }