Skip to content

Commit 813b3f6

Browse files
authored
Merge pull request #379 from magento-l3/PR-L3-2023-07-14
PR-L3-2023-07-14
2 parents 9fc3d4a + 1b97782 commit 813b3f6

File tree

5 files changed

+57
-57
lines changed

5 files changed

+57
-57
lines changed

InventoryCatalogAdminUi/Observer/ProcessSourceItemsObserver.php

Lines changed: 17 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Magento\Catalog\Api\Data\ProductInterface;
1111
use Magento\Catalog\Controller\Adminhtml\Product\Save;
1212
use Magento\CatalogInventory\Api\Data\StockItemInterface;
13+
use Magento\CatalogInventory\Api\StockRegistryInterface;
1314
use Magento\Framework\Api\SearchCriteriaBuilder;
1415
use Magento\Framework\Api\SearchCriteriaBuilderFactory;
1516
use Magento\Framework\Event\Observer as EventObserver;
@@ -30,58 +31,24 @@
3031
*/
3132
class ProcessSourceItemsObserver implements ObserverInterface
3233
{
33-
/**
34-
* @var IsSourceItemManagementAllowedForProductTypeInterface
35-
*/
36-
private $isSourceItemManagementAllowedForProductType;
37-
38-
/**
39-
* @var SourceItemsProcessorInterface
40-
*/
41-
private $sourceItemsProcessor;
42-
43-
/**
44-
* @var IsSingleSourceModeInterface
45-
*/
46-
private $isSingleSourceMode;
47-
48-
/**
49-
* @var DefaultSourceProviderInterface
50-
*/
51-
private $defaultSourceProvider;
52-
53-
/**
54-
* @var SearchCriteriaBuilderFactory
55-
*/
56-
private $searchCriteriaBuilderFactory;
57-
58-
/**
59-
* @var SourceItemRepositoryInterface
60-
*/
61-
private $sourceItemRepository;
62-
6334
/**
6435
* @param IsSourceItemManagementAllowedForProductTypeInterface $isSourceItemManagementAllowedForProductType
6536
* @param SourceItemsProcessorInterface $sourceItemsProcessor
6637
* @param IsSingleSourceModeInterface $isSingleSourceMode
6738
* @param DefaultSourceProviderInterface $defaultSourceProvider
6839
* @param SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory
6940
* @param SourceItemRepositoryInterface $sourceItemRepository
41+
* @param StockRegistryInterface $stockRegistry
7042
*/
7143
public function __construct(
72-
IsSourceItemManagementAllowedForProductTypeInterface $isSourceItemManagementAllowedForProductType,
73-
SourceItemsProcessorInterface $sourceItemsProcessor,
74-
IsSingleSourceModeInterface $isSingleSourceMode,
75-
DefaultSourceProviderInterface $defaultSourceProvider,
76-
SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory,
77-
SourceItemRepositoryInterface $sourceItemRepository
44+
private IsSourceItemManagementAllowedForProductTypeInterface $isSourceItemManagementAllowedForProductType,
45+
private SourceItemsProcessorInterface $sourceItemsProcessor,
46+
private IsSingleSourceModeInterface $isSingleSourceMode,
47+
private DefaultSourceProviderInterface $defaultSourceProvider,
48+
private SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory,
49+
private SourceItemRepositoryInterface $sourceItemRepository,
50+
private StockRegistryInterface $stockRegistry
7851
) {
79-
$this->isSourceItemManagementAllowedForProductType = $isSourceItemManagementAllowedForProductType;
80-
$this->sourceItemsProcessor = $sourceItemsProcessor;
81-
$this->isSingleSourceMode = $isSingleSourceMode;
82-
$this->defaultSourceProvider = $defaultSourceProvider;
83-
$this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory;
84-
$this->sourceItemRepository = $sourceItemRepository;
8552
}
8653

8754
/**
@@ -101,7 +68,6 @@ public function execute(EventObserver $observer)
10168
/** @var Save $controller */
10269
$controller = $observer->getEvent()->getController();
10370
$productData = $controller->getRequest()->getParam('product', []);
104-
$singleSourceData = $productData['quantity_and_stock_status'] ?? [];
10571

10672
if (!$this->isSingleSourceMode->execute()) {
10773
$sources = $controller->getRequest()->getParam('sources', []);
@@ -111,20 +77,19 @@ public function execute(EventObserver $observer)
11177
? $this->prepareAssignedSources($sources['assigned_sources'])
11278
: [];
11379
$this->sourceItemsProcessor->execute((string)$productData['sku'], $assignedSources);
114-
} elseif (!empty($singleSourceData)) {
80+
} else {
11581
/** @var StockItemInterface $stockItem */
116-
$stockItem = $product->getExtensionAttributes()->getStockItem();
117-
$qty = $singleSourceData['qty'] ?? (empty($stockItem) ? 0 : $stockItem->getQty());
118-
$isInStock = $singleSourceData['is_in_stock'] ?? (empty($stockItem) ? 1 : (int)$stockItem->getIsInStock());
82+
$stockItem = $product->getExtensionAttributes()?->getStockItem()
83+
?? $this->stockRegistry->getStockItem($product->getId());
11984
$defaultSourceData = [
120-
SourceItemInterface::SKU => $productData['sku'],
85+
SourceItemInterface::SKU => $product->getSku(),
12186
SourceItemInterface::SOURCE_CODE => $this->defaultSourceProvider->getCode(),
122-
SourceItemInterface::QUANTITY => $qty,
123-
SourceItemInterface::STATUS => $isInStock,
87+
SourceItemInterface::QUANTITY => $stockItem->getQty(),
88+
SourceItemInterface::STATUS => $stockItem->getIsInStock(),
12489
];
125-
$sourceItems = $this->getSourceItemsWithoutDefault($productData['sku']);
90+
$sourceItems = $this->getSourceItemsWithoutDefault($product->getSku());
12691
$sourceItems[] = $defaultSourceData;
127-
$this->sourceItemsProcessor->execute((string)$productData['sku'], $sourceItems);
92+
$this->sourceItemsProcessor->execute((string)$product->getSku(), $sourceItems);
12893
}
12994
}
13095

InventoryImportExport/Plugin/Import/SourceItemImporter.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\InventoryImportExport\Plugin\Import;
99

1010
use Magento\CatalogImportExport\Model\Import\Product\SkuProcessor;
11+
use Magento\CatalogImportExport\Model\Import\Product\SkuStorage;
1112
use Magento\CatalogImportExport\Model\StockItemProcessorInterface;
1213
use Magento\Framework\App\ResourceConnection;
1314
use Magento\Framework\Exception\CouldNotSaveException;
@@ -63,6 +64,11 @@ class SourceItemImporter
6364
*/
6465
private $skuProcessor;
6566

67+
/**
68+
* @var SkuStorage
69+
*/
70+
private SkuStorage $skuStorage;
71+
6672
/**
6773
* StockItemImporter constructor
6874
*
@@ -72,21 +78,24 @@ class SourceItemImporter
7278
* @param IsSingleSourceModeInterface $isSingleSourceMode
7379
* @param ResourceConnection $resourceConnection
7480
* @param SkuProcessor $skuProcessor
81+
* @param SkuStorage $skuStorage
7582
*/
7683
public function __construct(
7784
SourceItemsSaveInterface $sourceItemsSave,
7885
SourceItemInterfaceFactory $sourceItemFactory,
7986
DefaultSourceProviderInterface $defaultSourceProvider,
8087
IsSingleSourceModeInterface $isSingleSourceMode,
8188
ResourceConnection $resourceConnection,
82-
SkuProcessor $skuProcessor
89+
SkuProcessor $skuProcessor,
90+
SkuStorage $skuStorage
8391
) {
8492
$this->sourceItemsSave = $sourceItemsSave;
8593
$this->sourceItemFactory = $sourceItemFactory;
8694
$this->defaultSource = $defaultSourceProvider;
8795
$this->isSingleSourceMode = $isSingleSourceMode;
8896
$this->resourceConnection = $resourceConnection;
8997
$this->skuProcessor = $skuProcessor;
98+
$this->skuStorage = $skuStorage;
9099
}
91100

92101
/**
@@ -113,7 +122,7 @@ public function afterProcess(
113122
$skusHavingDefaultSource = $this->getSkusHavingDefaultSource(array_keys($stockData));
114123

115124
foreach ($stockData as $sku => $stockDatum) {
116-
$isNewSku = !array_key_exists(strtolower((string)$sku), $this->skuProcessor->getOldSkus());
125+
$isNewSku = !$this->skuStorage->has((string)$sku);
117126
$isQtyExplicitlySet = $importedData[$sku]['qty'] ?? false;
118127

119128
$inStock = $stockDatum['is_in_stock'] ?? 0;

InventoryImportExport/Test/Unit/Plugin/Import/SourceItemImporterTest.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\InventoryImportExport\Test\Unit\Plugin\Import;
99

1010
use Magento\CatalogImportExport\Model\Import\Product\SkuProcessor;
11+
use Magento\CatalogImportExport\Model\Import\Product\SkuStorage;
1112
use Magento\CatalogImportExport\Model\StockItemProcessorInterface;
1213
use Magento\Framework\App\ResourceConnection;
1314
use Magento\Framework\DB\Adapter\AdapterInterface;
@@ -76,6 +77,11 @@ class SourceItemImporterTest extends TestCase
7677
*/
7778
private $skuProcessorMock;
7879

80+
/**
81+
* @var SkuStorage|MockObject
82+
*/
83+
private SkuStorage $skuStorageMock;
84+
7985
/**
8086
* @inheritdoc
8187
*/
@@ -104,13 +110,16 @@ protected function setUp(): void
104110

105111
$this->skuProcessorMock = $this->createMock(SkuProcessor::class);
106112

113+
$this->skuStorageMock = $this->createMock(SkuStorage::class);
114+
107115
$this->plugin = new SourceItemImporter(
108116
$this->sourceItemsSaveMock,
109117
$this->sourceItemFactoryMock,
110118
$this->defaultSourceMock,
111119
$this->isSingleSourceModeMock,
112120
$this->resourceConnectionMock,
113-
$this->skuProcessorMock
121+
$this->skuProcessorMock,
122+
$this->skuStorageMock
114123
);
115124
}
116125

@@ -145,7 +154,20 @@ public function testAfterImportForMultipleSource(
145154

146155
$this->saveSkusHavingDefaultSourceMock($sku);
147156

148-
$this->skuProcessorMock->expects($this->once())->method('getOldSkus')->willReturn($existingSkus);
157+
$this->skuProcessorMock->expects($this->never())->method('getOldSkus')->willReturn($existingSkus);
158+
159+
$this->skuStorageMock->method('get')->willReturnCallback(function ($sku) use ($existingSkus) {
160+
$skuLowered = strtolower($sku);
161+
162+
return $existingSkus[$skuLowered] ?? null;
163+
});
164+
165+
$this->skuStorageMock->method('has')->willReturnCallback(function ($sku) use ($existingSkus) {
166+
$skuLowered = strtolower($sku);
167+
168+
return isset($existingSkus[$skuLowered]);
169+
});
170+
149171
$this->defaultSourceMock->expects($this->exactly(2))->method('getCode')->willReturn($sourceCode);
150172
$this->sourceItemMock->expects($this->once())->method('setSku')->with($sku)
151173
->willReturnSelf();

InventoryIndexer/Test/Integration/Indexer/SourceItemIndexerTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ protected function setUp(): void
6464
$this->sourceItemRepository = Bootstrap::getObjectManager()->get(SourceItemRepositoryInterface::class);
6565
$this->searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class);
6666
$this->removeIndexData = Bootstrap::getObjectManager()->get(RemoveIndexData::class);
67-
$this->removeIndexData->execute([10, 20, 30]);
6867
}
6968

7069
/**
@@ -95,6 +94,7 @@ protected function tearDown(): void
9594
*/
9695
public function testReindexRow(string $sku, int $stockId, $expectedData)
9796
{
97+
$this->removeIndexData->execute([10, 20, 30]);
9898
$sourceItem = $this->getSourceItem('SKU-1', 'eu-1');
9999
$sourceItemIds = $this->getSourceItemIds->execute([$sourceItem]);
100100
foreach ($sourceItemIds as $sourceItemId) {
@@ -140,6 +140,7 @@ public function reindexRowDataProvider(): array
140140
*/
141141
public function testReindexList(string $sku, int $stockId, $expectedData)
142142
{
143+
$this->removeIndexData->execute([10, 20, 30]);
143144
$sourceItemIds = $this->getSourceItemIds->execute(
144145
[
145146
$this->getSourceItem('SKU-1', 'eu-1'),
@@ -189,6 +190,7 @@ public function reindexListDataProvider(): array
189190
*/
190191
public function testReindexAll(string $sku, int $stockId, $expectedData)
191192
{
193+
$this->removeIndexData->execute([10, 20, 30]);
192194
$this->sourceItemIndexer->executeFull();
193195

194196
$stockItemData = $this->getStockItemData->execute($sku, $stockId);

InventorySalesAdminUi/Test/Integration/Plugin/Sales/Block/Items/Renderer/DefaultRenderer/ChildManageStockIsOnTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\InventorySalesAdminUi\Test\Integration\Plugin\Sales\Block\Items\Renderer\DefaultRenderer;
99

1010
use Magento\Framework\ObjectManagerInterface;
11+
use Magento\Sales\Model\InvoiceOrder;
1112
use Magento\Sales\Model\Order;
1213
use Magento\Sales\Model\Order\CreditmemoFactory;
1314
use Magento\Sales\Block\Adminhtml\Items\Renderer\DefaultRenderer;
@@ -49,6 +50,7 @@ public function testAfterCanReturnItemToStock()
4950
/** @var Order $order */
5051
$order = $this->objectManager->create(Order::class);
5152
$order->loadByIncrementId('100000001');
53+
$this->objectManager->create(InvoiceOrder::class)->execute($order->getId());
5254
$creditmemo = $this->creditmemoFactory->createByOrder($order);
5355
$item = current($creditmemo->getItems());
5456
/** @var DefaultRenderer $defaultRenderer */

0 commit comments

Comments
 (0)