SourceDeductionRequestsFromSourceSelectionFactory.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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\InventorySalesApi\Api\Data\SalesEventInterface;
  9. use Magento\InventorySourceDeductionApi\Model\ItemToDeductInterface;
  10. use Magento\InventorySourceDeductionApi\Model\ItemToDeductInterfaceFactory;
  11. use Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestInterface;
  12. use Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestInterfaceFactory;
  13. use Magento\InventorySourceSelectionApi\Api\Data\SourceSelectionItemInterface;
  14. use Magento\InventorySourceSelectionApi\Api\Data\SourceSelectionResultInterface;
  15. use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory;
  16. use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
  17. use Magento\Store\Api\WebsiteRepositoryInterface;
  18. class SourceDeductionRequestsFromSourceSelectionFactory
  19. {
  20. /**
  21. * @var SourceDeductionRequestInterfaceFactory
  22. */
  23. private $sourceDeductionRequestFactory;
  24. /**
  25. * @var ItemToDeductInterfaceFactory
  26. */
  27. private $itemToDeductFactory;
  28. /**
  29. * @var SalesChannelInterfaceFactory
  30. */
  31. private $salesChannelFactory;
  32. /**
  33. * @var WebsiteRepositoryInterface
  34. */
  35. private $websiteRepository;
  36. /**
  37. * @param SourceDeductionRequestInterfaceFactory $sourceDeductionRequestFactory
  38. * @param ItemToDeductInterfaceFactory $itemToDeductFactory
  39. * @param SalesChannelInterfaceFactory $salesChannelFactory
  40. * @param WebsiteRepositoryInterface $websiteRepository
  41. */
  42. public function __construct(
  43. SourceDeductionRequestInterfaceFactory $sourceDeductionRequestFactory,
  44. ItemToDeductInterfaceFactory $itemToDeductFactory,
  45. SalesChannelInterfaceFactory $salesChannelFactory,
  46. WebsiteRepositoryInterface $websiteRepository
  47. ) {
  48. $this->sourceDeductionRequestFactory = $sourceDeductionRequestFactory;
  49. $this->itemToDeductFactory = $itemToDeductFactory;
  50. $this->salesChannelFactory = $salesChannelFactory;
  51. $this->websiteRepository = $websiteRepository;
  52. }
  53. /**
  54. * @param SourceSelectionResultInterface $sourceSelectionResult
  55. * @param SalesEventInterface $salesEvent
  56. * @param int $websiteId
  57. * @return SourceDeductionRequestInterface[]
  58. */
  59. public function create(
  60. SourceSelectionResultInterface $sourceSelectionResult,
  61. SalesEventInterface $salesEvent,
  62. int $websiteId
  63. ): array {
  64. $sourceDeductionRequests = [];
  65. $websiteCode = $this->websiteRepository->getById($websiteId)->getCode();
  66. $salesChannel = $this->salesChannelFactory->create([
  67. 'data' => [
  68. 'type' => SalesChannelInterface::TYPE_WEBSITE,
  69. 'code' => $websiteCode
  70. ]
  71. ]);
  72. foreach ($this->getItemsPerSource($sourceSelectionResult->getSourceSelectionItems()) as $sourceCode => $items) {
  73. /** @var SourceDeductionRequestInterface[] $sourceDeductionRequests */
  74. $sourceDeductionRequests[] = $this->sourceDeductionRequestFactory->create([
  75. 'sourceCode' => $sourceCode,
  76. 'items' => $items,
  77. 'salesChannel' => $salesChannel,
  78. 'salesEvent' => $salesEvent
  79. ]);
  80. }
  81. return $sourceDeductionRequests;
  82. }
  83. /**
  84. * @param SourceSelectionItemInterface[] $sourceSelectionItems
  85. * @return ItemToDeductInterface[]
  86. */
  87. private function getItemsPerSource(array $sourceSelectionItems)
  88. {
  89. $itemsPerSource = [];
  90. foreach ($sourceSelectionItems as $sourceSelectionItem) {
  91. if ($sourceSelectionItem->getQtyToDeduct() < 0.000001) {
  92. continue;
  93. }
  94. if (!isset($itemsPerSource[$sourceSelectionItem->getSourceCode()])) {
  95. $itemsPerSource[$sourceSelectionItem->getSourceCode()] = [];
  96. }
  97. $itemsPerSource[$sourceSelectionItem->getSourceCode()][] = $this->itemToDeductFactory->create([
  98. 'sku' => $sourceSelectionItem->getSku(),
  99. 'qty' => $sourceSelectionItem->getQtyToDeduct(),
  100. ]);
  101. }
  102. return $itemsPerSource;
  103. }
  104. }