searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory; $this->sourceItemRepository = $sourceItemRepository; $this->sourceItemFactory = $sourceItemFactory; $this->dataObjectHelper = $dataObjectHelper; $this->sourceItemsSave = $sourceItemsSave; $this->sourceItemsDelete = $sourceItemsDelete; } /** * @param string $sku * @param array $sourceItemsData * @return void * @throws InputException */ public function process($sku, array $sourceItemsData) { $sourceItemsForDelete = $this->getCurrentSourceItemsMap($sku); $sourceItemsForSave = []; foreach ($sourceItemsData as $sourceItemData) { $this->validateSourceItemData($sourceItemData); $sourceCode = $sourceItemData[SourceItemInterface::SOURCE_CODE]; if (isset($sourceItemsForDelete[$sourceCode])) { $sourceItem = $sourceItemsForDelete[$sourceCode]; } else { /** @var SourceItemInterface $sourceItem */ $sourceItem = $this->sourceItemFactory->create(); } $sourceItemData[SourceItemInterface::SKU] = $sku; $this->dataObjectHelper->populateWithArray($sourceItem, $sourceItemData, SourceItemInterface::class); $sourceItemsForSave[] = $sourceItem; unset($sourceItemsForDelete[$sourceCode]); } if ($sourceItemsForSave) { $this->sourceItemsSave->execute($sourceItemsForSave); } if ($sourceItemsForDelete) { $this->sourceItemsDelete->execute($sourceItemsForDelete); } } /** * Get Source Items Hash Table by SKU * * @param string $sku * @return SourceItemInterface[] */ private function getCurrentSourceItemsMap(string $sku): array { /** @var SearchCriteriaBuilder $searchCriteriaBuilder */ $searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create(); $searchCriteria = $searchCriteriaBuilder->addFilter(ProductInterface::SKU, $sku)->create(); $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems(); $sourceItemMap = []; if ($sourceItems) { foreach ($sourceItems as $sourceItem) { $sourceItemMap[$sourceItem->getSourceCode()] = $sourceItem; } } return $sourceItemMap; } /** * @param array $sourceItemData * @return void * @throws InputException */ private function validateSourceItemData(array $sourceItemData) { if (!isset($sourceItemData[SourceItemInterface::SOURCE_CODE])) { throw new InputException(__('Wrong Product to Source relation parameters given.')); } } }