Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SourceItemsProcessor.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
13 use Magento\Framework\Api\SearchCriteriaBuilderFactory;
16 use Magento\InventoryApi\Api\Data\SourceItemInterfaceFactory;
20 
26 {
30  private $searchCriteriaBuilderFactory;
31 
35  private $sourceItemRepository;
36 
40  private $sourceItemFactory;
41 
45  private $dataObjectHelper;
46 
50  private $sourceItemsSave;
51 
55  private $sourceItemsDelete;
56 
65  public function __construct(
66  SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory,
67  SourceItemRepositoryInterface $sourceItemRepository,
68  SourceItemInterfaceFactory $sourceItemFactory,
69  DataObjectHelper $dataObjectHelper,
70  SourceItemsSaveInterface $sourceItemsSave,
71  SourceItemsDeleteInterface $sourceItemsDelete
72  ) {
73  $this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory;
74  $this->sourceItemRepository = $sourceItemRepository;
75  $this->sourceItemFactory = $sourceItemFactory;
76  $this->dataObjectHelper = $dataObjectHelper;
77  $this->sourceItemsSave = $sourceItemsSave;
78  $this->sourceItemsDelete = $sourceItemsDelete;
79  }
80 
87  public function process($sku, array $sourceItemsData)
88  {
89  $sourceItemsForDelete = $this->getCurrentSourceItemsMap($sku);
90  $sourceItemsForSave = [];
91 
92  foreach ($sourceItemsData as $sourceItemData) {
93  $this->validateSourceItemData($sourceItemData);
94 
96  if (isset($sourceItemsForDelete[$sourceCode])) {
97  $sourceItem = $sourceItemsForDelete[$sourceCode];
98  } else {
100  $sourceItem = $this->sourceItemFactory->create();
101  }
102 
103  $sourceItemData[SourceItemInterface::SKU] = $sku;
104  $this->dataObjectHelper->populateWithArray($sourceItem, $sourceItemData, SourceItemInterface::class);
105 
106  $sourceItemsForSave[] = $sourceItem;
107  unset($sourceItemsForDelete[$sourceCode]);
108  }
109  if ($sourceItemsForSave) {
110  $this->sourceItemsSave->execute($sourceItemsForSave);
111  }
112  if ($sourceItemsForDelete) {
113  $this->sourceItemsDelete->execute($sourceItemsForDelete);
114  }
115  }
116 
123  private function getCurrentSourceItemsMap(string $sku): array
124  {
126  $searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create();
127  $searchCriteria = $searchCriteriaBuilder->addFilter(ProductInterface::SKU, $sku)->create();
128  $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems();
129 
130  $sourceItemMap = [];
131  if ($sourceItems) {
132  foreach ($sourceItems as $sourceItem) {
133  $sourceItemMap[$sourceItem->getSourceCode()] = $sourceItem;
134  }
135  }
136  return $sourceItemMap;
137  }
138 
144  private function validateSourceItemData(array $sourceItemData)
145  {
146  if (!isset($sourceItemData[SourceItemInterface::SOURCE_CODE])) {
147  throw new InputException(__('Wrong Product to Source relation parameters given.'));
148  }
149  }
150 }
$sourceItemFactory
__()
Definition: __.php:13
$searchCriteria
$sourceItems
$sourceCode
Definition: inventory.phtml:11
$sourceItemsSave
$searchCriteriaBuilder
__construct(SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory, SourceItemRepositoryInterface $sourceItemRepository, SourceItemInterfaceFactory $sourceItemFactory, DataObjectHelper $dataObjectHelper, SourceItemsSaveInterface $sourceItemsSave, SourceItemsDeleteInterface $sourceItemsDelete)
$sourceItemRepository