Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
All Data Structures Namespaces Files Functions Variables Pages
UpdateSourceItemAtLegacyQtyCounterPlugin.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
18 
24 {
28  private $sourceItemRepository;
29 
33  private $sourceItemsSave;
34 
38  private $defaultSourceProvider;
39 
43  private $searchCriteriaBuilder;
44 
48  private $resourceConnection;
49 
53  private $getSkusByProductIds;
54 
63  public function __construct(
64  SourceItemRepositoryInterface $sourceItemRepository,
65  SourceItemsSaveInterface $sourceItemsSave,
66  DefaultSourceProviderInterface $defaultSourceProvider,
67  SearchCriteriaBuilder $searchCriteriaBuilder,
68  ResourceConnection $resourceConnection,
69  GetSkusByProductIdsInterface $getSkusByProductIds
70  ) {
71  $this->sourceItemRepository = $sourceItemRepository;
72  $this->sourceItemsSave = $sourceItemsSave;
73  $this->defaultSourceProvider = $defaultSourceProvider;
74  $this->searchCriteriaBuilder = $searchCriteriaBuilder;
75  $this->resourceConnection = $resourceConnection;
76  $this->getSkusByProductIds = $getSkusByProductIds;
77  }
78 
89  public function aroundCorrectItemsQty(
90  QtyCounterInterface $subject,
91  callable $proceed,
92  array $items,
93  $websiteId,
94  $operator
95  ) {
96  if (empty($items)) {
97  return;
98  }
99 
100  $connection = $this->resourceConnection->getConnection();
101  $connection->beginTransaction();
102 
103  try {
104  $proceed($items, $websiteId, $operator);
105  $this->updateSourceItemAtLegacyCatalogInventoryQtyCounter($items, $operator);
106 
107  $connection->commit();
108  } catch (\Exception $e) {
109  $connection->rollBack();
110  throw $e;
111  }
112  }
113 
119  private function updateSourceItemAtLegacyCatalogInventoryQtyCounter(
120  array $productQuantitiesByProductId,
121  $operator
122  ) {
123  $productQuantitiesBySku = $this->getProductQuantitiesBySku($productQuantitiesByProductId);
124 
125  $searchCriteria = $this->searchCriteriaBuilder->addFilter(
127  array_keys($productQuantitiesBySku),
128  'in'
129  )->addFilter(
131  $this->defaultSourceProvider->getCode()
132  )->create();
133 
134  $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems();
135  foreach ($sourceItems as $sourceItem) {
136  $sourceItem->setQuantity(
137  $sourceItem->getQuantity() + (float)($operator . $productQuantitiesBySku[$sourceItem->getSku()])
138  );
139  }
140  $this->sourceItemsSave->execute($sourceItems);
141  }
142 
147  private function getProductQuantitiesBySku(array $productQuantitiesByProductId): array
148  {
149  $productSkus = $this->getSkusByProductIds->execute(array_keys($productQuantitiesByProductId));
150 
151  $productQuantitiesBySku = [];
152  foreach ($productSkus as $productId => $productSku) {
153  $productQuantitiesBySku[$productSku] = $productQuantitiesByProductId[$productId];
154  }
155  return $productQuantitiesBySku;
156  }
157 }
aroundCorrectItemsQty(QtyCounterInterface $subject, callable $proceed, array $items, $websiteId, $operator)
$searchCriteria
$sourceItems
$sourceItemsSave
$searchCriteriaBuilder
__construct(SourceItemRepositoryInterface $sourceItemRepository, SourceItemsSaveInterface $sourceItemsSave, DefaultSourceProviderInterface $defaultSourceProvider, SearchCriteriaBuilder $searchCriteriaBuilder, ResourceConnection $resourceConnection, GetSkusByProductIdsInterface $getSkusByProductIds)
$connection
Definition: bulk.php:13
$sourceItemRepository
$items