sourceDeductionRequestFactory = $sourceDeductionRequestFactory; $this->itemToDeductFactory = $itemToDeductFactory; $this->salesChannelFactory = $salesChannelFactory; $this->websiteRepository = $websiteRepository; } /** * @param SourceSelectionResultInterface $sourceSelectionResult * @param SalesEventInterface $salesEvent * @param int $websiteId * @return SourceDeductionRequestInterface[] */ public function create( SourceSelectionResultInterface $sourceSelectionResult, SalesEventInterface $salesEvent, int $websiteId ): array { $sourceDeductionRequests = []; $websiteCode = $this->websiteRepository->getById($websiteId)->getCode(); $salesChannel = $this->salesChannelFactory->create([ 'data' => [ 'type' => SalesChannelInterface::TYPE_WEBSITE, 'code' => $websiteCode ] ]); foreach ($this->getItemsPerSource($sourceSelectionResult->getSourceSelectionItems()) as $sourceCode => $items) { /** @var SourceDeductionRequestInterface[] $sourceDeductionRequests */ $sourceDeductionRequests[] = $this->sourceDeductionRequestFactory->create([ 'sourceCode' => $sourceCode, 'items' => $items, 'salesChannel' => $salesChannel, 'salesEvent' => $salesEvent ]); } return $sourceDeductionRequests; } /** * @param SourceSelectionItemInterface[] $sourceSelectionItems * @return ItemToDeductInterface[] */ private function getItemsPerSource(array $sourceSelectionItems) { $itemsPerSource = []; foreach ($sourceSelectionItems as $sourceSelectionItem) { if ($sourceSelectionItem->getQtyToDeduct() < 0.000001) { continue; } if (!isset($itemsPerSource[$sourceSelectionItem->getSourceCode()])) { $itemsPerSource[$sourceSelectionItem->getSourceCode()] = []; } $itemsPerSource[$sourceSelectionItem->getSourceCode()][] = $this->itemToDeductFactory->create([ 'sku' => $sourceSelectionItem->getSku(), 'qty' => $sourceSelectionItem->getQtyToDeduct(), ]); } return $itemsPerSource; } }