searchCriteriaBuilder = $searchCriteriaBuilder; $this->stockSourceLinkFactory = $stockSourceLinkFactory; $this->stockSourceLinksSave = $stockSourceLinksSave; $this->stockSourceLinksDelete = $stockSourceLinksDelete; $this->getStockSourceLinks = $getStockSourceLinks; $this->dataObjectHelper = $dataObjectHelper; } /** * @param int $stockId * @param array $linksData * @return void * @throws InputException */ public function process(int $stockId, array $linksData) { $linksForDelete = $this->getAssignedLinks($stockId); $linksForSave = []; foreach ($linksData as $linkData) { $sourceCode = $linkData[StockSourceLinkInterface::SOURCE_CODE]; if (isset($linksForDelete[$sourceCode])) { $link = $linksForDelete[$sourceCode]; } else { /** @var StockSourceLinkInterface $link */ $link = $this->stockSourceLinkFactory->create(); } $linkData[StockSourceLinkInterface::STOCK_ID] = $stockId; $this->dataObjectHelper->populateWithArray($link, $linkData, StockSourceLinkInterface::class); $linksForSave[] = $link; unset($linksForDelete[$sourceCode]); } if (count($linksForSave) > 0) { $this->stockSourceLinksSave->execute($linksForSave); } if (count($linksForDelete) > 0) { $this->stockSourceLinksDelete->execute($linksForDelete); } } /** * Retrieves links that are assigned to $stockId * * @param int $stockId * @return StockSourceLinkInterface[] */ private function getAssignedLinks(int $stockId): array { $searchCriteria = $this->searchCriteriaBuilder ->addFilter(StockSourceLinkInterface::STOCK_ID, $stockId) ->create(); $result = []; foreach ($this->getStockSourceLinks->execute($searchCriteria)->getItems() as $link) { $result[$link->getSourceCode()] = $link; } return $result; } }