6 declare(strict_types=1);
16 use Magento\InventorySourceSelectionApi\Api\Data\SourceSelectionItemInterfaceFactory;
17 use Magento\InventorySourceSelectionApi\Api\Data\SourceSelectionResultInterfaceFactory;
30 private $getSourcesAssignedToStockOrderedByPriority;
35 private $sourceSelectionItemFactory;
40 private $sourceSelectionResultFactory;
45 private $searchCriteriaBuilder;
50 private $sourceItemRepository;
61 SourceSelectionItemInterfaceFactory $sourceSelectionItemFactory,
62 SourceSelectionResultInterfaceFactory $sourceSelectionResultFactory,
66 $this->getSourcesAssignedToStockOrderedByPriority = $getSourcesAssignedToStockOrderedByPriority;
67 $this->sourceSelectionItemFactory = $sourceSelectionItemFactory;
68 $this->sourceSelectionResultFactory = $sourceSelectionResultFactory;
80 $sources = $this->getEnabledSourcesOrderedByPriorityByStockId($stockId);
81 $sourceItemSelections = [];
84 $itemSku =
$item->getSku();
85 $qtyToDeliver =
$item->getQty();
87 $sourceItem = $this->getSourceItemBySourceCodeAndSku(
$source->getSourceCode(), $itemSku);
97 $qtyToDeduct = min($sourceItemQty, $qtyToDeliver);
100 if ($this->isZero((
float)$sourceItemQty)) {
104 $sourceItemSelections[] = $this->sourceSelectionItemFactory->create([
107 'qtyToDeduct' => $qtyToDeduct,
108 'qtyAvailable' => $sourceItemQty
111 $qtyToDeliver -= $qtyToDeduct;
116 if (!$this->isZero($qtyToDeliver)) {
117 $isShippable =
false;
121 return $this->sourceSelectionResultFactory->create(
123 'sourceItemSelections' => $sourceItemSelections,
124 'isShippable' => $isShippable
136 private function isZero(
float $floatNumber): bool
138 return $floatNumber < 0.0000001;
150 private function getEnabledSourcesOrderedByPriorityByStockId(
int $stockId): array
152 $sources = $this->getSourcesAssignedToStockOrderedByPriority->execute($stockId);
153 $sources = array_filter($sources,
function (SourceInterface
$source) {
166 private function getSourceItemBySourceCodeAndSku(
string $sourceCode,
string $sku)
172 $sourceItemsResult = $this->sourceItemRepository->getList(
$searchCriteria);
174 return $sourceItemsResult->getTotalCount() > 0 ? current($sourceItemsResult->getItems()) :
null;
__construct(GetSourcesAssignedToStockOrderedByPriorityInterface $getSourcesAssignedToStockOrderedByPriority, SourceSelectionItemInterfaceFactory $sourceSelectionItemFactory, SourceSelectionResultInterfaceFactory $sourceSelectionResultFactory, SearchCriteriaBuilder $searchCriteriaBuilder, SourceItemRepositoryInterface $sourceItemRepository)
execute(InventoryRequestInterface $inventoryRequest)