Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
BulkInventoryTransfer.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
16 
24 {
28  private $resourceConnection;
29 
33  private $getProductTypesBySkus;
34 
38  private $isSourceItemManagementAllowedForProductType;
39 
43  private $defaultSourceProvider;
44 
48  private $setDataToLegacyStockItem;
49 
53  private $bulkZeroLegacyStockItem;
54 
64  public function __construct(
65  ResourceConnection $resourceConnection,
66  GetProductTypesBySkusInterface $getProductTypesBySkus,
67  IsSourceItemManagementAllowedForProductTypeInterface $isSourceItemManagementAllowedForProductType,
68  DefaultSourceProviderInterface $defaultSourceProvider,
69  SetDataToLegacyStockItem $setDataToLegacyStockItem,
70  BulkZeroLegacyStockItem $bulkZeroLegacyStockItem
71  ) {
72  $this->resourceConnection = $resourceConnection;
73  $this->getProductTypesBySkus = $getProductTypesBySkus;
74  $this->isSourceItemManagementAllowedForProductType = $isSourceItemManagementAllowedForProductType;
75  $this->defaultSourceProvider = $defaultSourceProvider;
76  $this->setDataToLegacyStockItem = $setDataToLegacyStockItem;
77  $this->bulkZeroLegacyStockItem = $bulkZeroLegacyStockItem;
78  }
79 
85  private function getSourceItemData(string $sku, string $source): ?array
86  {
87  $connection = $this->resourceConnection->getConnection();
88  $tableName = $this->resourceConnection->getTableName(SourceItem::TABLE_NAME_SOURCE_ITEM);
89 
90  $query = $connection->select()->from($tableName)
91  ->where(SourceItemInterface::SOURCE_CODE . ' = ?', $source)
92  ->where(SourceItemInterface::SKU . ' = ?', $sku);
93 
94  $res = $connection->fetchRow($query);
95  if ($res === false) {
96  return null;
97  }
98 
99  return $res;
100  }
101 
108  private function transferInventory(
109  string $sku,
110  string $originSource,
111  string $destinationSource
112  ): void {
113  $connection = $this->resourceConnection->getConnection();
114  $tableName = $this->resourceConnection->getTableName(SourceItem::TABLE_NAME_SOURCE_ITEM);
115 
116  $orgSourceItem = $this->getSourceItemData($sku, $originSource);
117  $dstSourceItem = $this->getSourceItemData($sku, $destinationSource);
118 
119  $orgSourceItemQty = $orgSourceItem === null ? 0.0 : (float) $orgSourceItem[SourceItemInterface::QUANTITY];
120  $dstSourceItemQty = $dstSourceItem === null ? 0.0 : (float) $dstSourceItem[SourceItemInterface::QUANTITY];
121 
122  $finalQuantity = $orgSourceItemQty + $dstSourceItemQty;
123 
124  if ($orgSourceItem !== null) {
125  $status = (int) $orgSourceItem[SourceItemInterface::STATUS];
126  } elseif ($dstSourceItemQty !== null) {
127  $status = (int) $dstSourceItem[SourceItemInterface::STATUS];
128  } else {
130  }
131 
132  $updateOperation = [
133  SourceItemInterface::QUANTITY => $finalQuantity,
135  ];
136 
137  if ($dstSourceItem === null) {
138  $updateOperation[SourceItemInterface::SOURCE_CODE] = $destinationSource;
139  $updateOperation[SourceItemInterface::SKU] = $sku;
140 
141  $connection->insert($tableName, $updateOperation);
142  } elseif ($orgSourceItem !== null) {
143  $connection->update($tableName, $updateOperation, [
144  SourceItemInterface::SOURCE_CODE . '=?' => $destinationSource,
145  SourceItemInterface::SKU . '=?' => $sku,
146  ]);
147  }
148 
149  // Align legacy stock
150  if ($destinationSource === $this->defaultSourceProvider->getCode()) {
151  $this->setDataToLegacyStockItem->execute($sku, $finalQuantity, $status);
152  }
153  }
154 
161  private function clearSource(array $skus, string $source, bool $unassign)
162  {
163  $connection = $this->resourceConnection->getConnection();
164  $tableName = $this->resourceConnection->getTableName(SourceItem::TABLE_NAME_SOURCE_ITEM);
165 
166  if ($unassign) {
167  $connection->delete($tableName, [
169  SourceItemInterface::SKU . ' IN(?)' => $skus,
170  ]);
171  } else {
172  $connection->update($tableName, [
175  ], [
177  SourceItemInterface::SKU . ' IN(?)' => $skus,
178  ]);
179  }
180 
181  // Align legacy stock
182  if ($source === $this->defaultSourceProvider->getCode()) {
183  $this->bulkZeroLegacyStockItem->execute($skus);
184  }
185  }
186 
196  public function execute(
197  array $skus,
198  string $originSource,
199  string $destinationSource,
200  bool $unassignFromOrigin
201  ): void {
202  $connection = $this->resourceConnection->getConnection();
203  $types = $this->getProductTypesBySkus->execute($skus);
204 
205  $connection->beginTransaction();
206  foreach ($types as $sku => $type) {
207  if ($this->isSourceItemManagementAllowedForProductType->execute($type)) {
208  $this->transferInventory($sku, $originSource, $destinationSource);
209  }
210  }
211 
212  $this->clearSource($skus, $originSource, $unassignFromOrigin);
213  $connection->commit();
214  }
215 }
$tableName
Definition: trigger.php:13
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$source
Definition: source.php:23
foreach($websiteCodes as $websiteCode) $skus
$type
Definition: item.phtml:13
__construct(ResourceConnection $resourceConnection, GetProductTypesBySkusInterface $getProductTypesBySkus, IsSourceItemManagementAllowedForProductTypeInterface $isSourceItemManagementAllowedForProductType, DefaultSourceProviderInterface $defaultSourceProvider, SetDataToLegacyStockItem $setDataToLegacyStockItem, BulkZeroLegacyStockItem $bulkZeroLegacyStockItem)
$status
Definition: order_status.php:8
execute(array $skus, string $originSource, string $destinationSource, bool $unassignFromOrigin)
$connection
Definition: bulk.php:13