Skip to content

Commit e6fe0aa

Browse files
authored
Merge pull request #518 from adobe-commerce-tier-4/Tier4-Kings-PR-11-22-2024
[Support Tier-4-Kings glo02433] 11.22.2024 Regular delivery of bugfixes and improvements
2 parents 132d98c + 28dc022 commit e6fe0aa

File tree

4 files changed

+147
-4
lines changed

4 files changed

+147
-4
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
/**
3+
* Copyright 2024 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventoryCatalog\Plugin\CatalogInventory\Model\Stock\StockItemRepository;
9+
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Catalog\Model\Indexer\Product\Full as FullProductIndexer;
12+
use Magento\CatalogInventory\Api\Data\StockItemInterface;
13+
use Magento\CatalogInventory\Model\Stock\StockItemRepository;
14+
use Magento\Framework\Exception\NoSuchEntityException;
15+
use Magento\Inventory\Model\SourceItem\Command\GetSourceItemsBySku;
16+
use Magento\InventoryIndexer\Indexer\InventoryIndexer;
17+
18+
class StockItemRepositoryPlugin
19+
{
20+
21+
/**
22+
* @param FullProductIndexer $fullProductIndexer
23+
* @param InventoryIndexer $inventoryIndexer
24+
* @param ProductRepositoryInterface $productRepository
25+
* @param GetSourceItemsBySku $getSourceItemsBySku
26+
*/
27+
public function __construct(
28+
private FullProductIndexer $fullProductIndexer,
29+
private InventoryIndexer $inventoryIndexer,
30+
private ProductRepositoryInterface $productRepository,
31+
private getSourceItemsBySku $getSourceItemsBySku
32+
) {
33+
}
34+
35+
/**
36+
* Complex reindex after product stock item has been saved.
37+
*
38+
* @param StockItemRepository $subject
39+
* @param StockItemInterface $stockItem
40+
* @return StockItemInterface
41+
* @throws NoSuchEntityException
42+
*/
43+
public function afterSave(StockItemRepository $subject, StockItemInterface $stockItem): StockItemInterface
44+
{
45+
$product = $this->productRepository->getById($stockItem->getProductId());
46+
$this->fullProductIndexer->executeRow($product->getId());
47+
$sourceItems = $this->getSourceItemsBySku->execute($product->getSku());
48+
$sourceItemIds = [];
49+
50+
foreach ($sourceItems as $sourceItem) {
51+
$sourceItemIds[] = $sourceItem->getId();
52+
}
53+
$this->inventoryIndexer->executeList($sourceItemIds);
54+
return $stockItem;
55+
}
56+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
/**
3+
* Copyright 2024 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventoryCatalog\Test\Unit\Plugin\CatalogInventory\Model\Stock\StockItemRepository;
9+
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Catalog\Model\Indexer\Product\Full as FullProductIndexer;
12+
use Magento\CatalogInventory\Api\Data\StockItemInterface;
13+
use Magento\CatalogInventory\Model\Stock\StockItemRepository;
14+
use Magento\Inventory\Model\SourceItem;
15+
use Magento\Inventory\Model\SourceItem\Command\GetSourceItemsBySku;
16+
use Magento\InventoryIndexer\Indexer\InventoryIndexer;
17+
use Magento\InventoryCatalog\Plugin\CatalogInventory\Model\Stock\StockItemRepository\StockItemRepositoryPlugin;
18+
use PHPUnit\Framework\MockObject\MockObject;
19+
use PHPUnit\Framework\TestCase;
20+
21+
class StockItemRepositoryPluginTest extends TestCase
22+
{
23+
/** @var FullProductIndexer|MockObject */
24+
private $fullProductIndexer;
25+
26+
/** @var InventoryIndexer|MockObject */
27+
private $inventoryIndexer;
28+
29+
/** @var ProductRepositoryInterface|MockObject */
30+
private $productRepository;
31+
32+
/** @var GetSourceItemsBySku|MockObject */
33+
private $getSourceItemsBySku;
34+
35+
/** @var StockItemRepositoryPlugin */
36+
private $plugin;
37+
38+
protected function setUp(): void
39+
{
40+
$this->fullProductIndexer = $this->createMock(FullProductIndexer::class);
41+
$this->inventoryIndexer = $this->createMock(InventoryIndexer::class);
42+
$this->productRepository = $this->createMock(ProductRepositoryInterface::class);
43+
$this->getSourceItemsBySku = $this->createMock(GetSourceItemsBySku::class);
44+
45+
$this->plugin = new StockItemRepositoryPlugin(
46+
$this->fullProductIndexer,
47+
$this->inventoryIndexer,
48+
$this->productRepository,
49+
$this->getSourceItemsBySku
50+
);
51+
}
52+
53+
public function testAfterSave(): void
54+
{
55+
$productId = 123;
56+
$sku = 'test-sku';
57+
$sourceItemId = 456;
58+
59+
$stockItem = $this->createMock(StockItemInterface::class);
60+
$stockItem->method('getProductId')->willReturn($productId);
61+
62+
$product = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
63+
$product->method('getId')->willReturn($productId);
64+
$product->method('getSku')->willReturn($sku);
65+
$this->productRepository->method('getById')->with($productId)->willReturn($product);
66+
67+
$sourceItem = $this->createMock(SourceItem::class);
68+
$sourceItem->method('getId')->willReturn($sourceItemId);
69+
$this->getSourceItemsBySku->method('execute')->with($sku)->willReturn([$sourceItem]);
70+
71+
$this->fullProductIndexer->expects($this->once())->method('executeRow')->with($productId);
72+
$this->inventoryIndexer->expects($this->once())->method('executeList')->with([$sourceItemId]);
73+
74+
$result = $this->plugin->afterSave(
75+
$this->createMock(StockItemRepository::class),
76+
$stockItem
77+
);
78+
79+
$this->assertSame($stockItem, $result);
80+
}
81+
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
<?xml version="1.0"?>
22
<!--
33
/**
4-
* Copyright © Magento, Inc. All rights reserved.
5-
* See COPYING.txt for license details.
4+
* Copyright 2020 Adobe
5+
* All Rights Reserved.
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
99
<type name="Magento\Catalog\Model\ResourceModel\Product">
1010
<plugin name="create_source_items" type="Magento\InventoryCatalog\Plugin\Catalog\Model\ResourceModel\Product\CreateSourceItemsPlugin"/>
1111
</type>
12+
<type name="Magento\CatalogInventory\Model\Stock\StockItemRepository">
13+
<plugin name="reindex_after_save_product_stock_item" type="Magento\InventoryCatalog\Plugin\CatalogInventory\Model\Stock\StockItemRepository\StockItemRepositoryPlugin"/>
14+
</type>
1215
</config>
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
<?xml version="1.0"?>
22
<!--
33
/**
4-
* Copyright © Magento, Inc. All rights reserved.
5-
* See COPYING.txt for license details.
4+
* Copyright 2020 Adobe
5+
* All Rights Reserved.
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
99
<type name="Magento\Catalog\Model\ResourceModel\Product">
1010
<plugin name="create_source_items" type="Magento\InventoryCatalog\Plugin\Catalog\Model\ResourceModel\Product\CreateSourceItemsPlugin"/>
1111
</type>
12+
<type name="Magento\CatalogInventory\Model\Stock\StockItemRepository">
13+
<plugin name="reindex_after_save_product_stock_item" type="Magento\InventoryCatalog\Plugin\CatalogInventory\Model\Stock\StockItemRepository\StockItemRepositoryPlugin"/>
14+
</type>
1215
</config>

0 commit comments

Comments
 (0)