sourceSelectionService = $sourceSelectionService; $this->getDefaultSourceSelectionAlgorithmCode = $getDefaultSourceSelectionAlgorithmCode; $this->sourceRepository = $sourceRepository; $this->itemRequestFactory = $itemRequestFactory; $this->getInventoryRequestFromOrder = $getInventoryRequestFromOrder ?: ObjectManager::getInstance()->get(GetInventoryRequestFromOrder::class); } /** * Get request items * * @param array $requestData * @return array */ private function getRequestItems(array $requestData): array { $requestItems = []; foreach ($requestData as $data) { $requestItems[] = $this->itemRequestFactory->create([ 'sku' => $data['sku'], 'qty' => $data['qty'] ]); } return $requestItems; } /** * @inheritdoc * @throws NoSuchEntityException */ public function execute(): ResultInterface { /** @var Page $result */ $resultJson = $this->resultFactory->create(ResultFactory::TYPE_JSON); $request = $this->getRequest(); $postRequest = $request->getPost()->toArray(); $orderId = (int) $postRequest['orderId']; if (!empty($postRequest['requestData'])) { $requestData = $postRequest['requestData']; $defaultCode = $this->getDefaultSourceSelectionAlgorithmCode->execute(); $algorithmCode = !empty($postRequest['algorithmCode']) ? $postRequest['algorithmCode'] : $defaultCode; $requestItems = $this->getRequestItems($requestData); $inventoryRequest = $this->getInventoryRequestFromOrder->execute($orderId, $requestItems); $sourceSelectionResult = $this->sourceSelectionService->execute($inventoryRequest, $algorithmCode); foreach ($requestData as $data) { $orderItem = $data['orderItem']; foreach ($sourceSelectionResult->getSourceSelectionItems() as $item) { if ($item->getSku() === $data['sku']) { $result[$orderItem][] = [ 'sourceName' => $this->getSourceName($item->getSourceCode()), 'sourceCode' => $item->getSourceCode(), 'qtyAvailable' => $item->getQtyAvailable(), 'qtyToDeduct' => $item->getQtyToDeduct() ]; } } } foreach ($this->sources as $value => $label) { $result['sourceCodes'][] = [ 'value' => $value, 'label' => $label ]; } $resultJson->setData($result); } return $resultJson; } /** * Get source name by code * * @param string $sourceCode * @return mixed * @throws NoSuchEntityException */ public function getSourceName(string $sourceCode): string { if (!isset($this->sources[$sourceCode])) { $this->sources[$sourceCode] = $this->sourceRepository->get($sourceCode)->getName(); } return $this->sources[$sourceCode]; } }