Skip to content

Commit dd66e67

Browse files
committed
MC-38263: Catalog price rules reverting or not applying until manual reindex
1 parent bc8e51d commit dd66e67

File tree

1 file changed

+31
-44
lines changed

1 file changed

+31
-44
lines changed

app/code/Magento/CatalogRuleConfigurable/Plugin/CatalogRule/Model/Indexer/ProductRuleReindex.php

Lines changed: 31 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,22 @@
66
*/
77
namespace Magento\CatalogRuleConfigurable\Plugin\CatalogRule\Model\Indexer;
88

9+
use Magento\CatalogRule\Model\Indexer\Product\ProductRuleIndexer;
910
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
1011
use Magento\CatalogRuleConfigurable\Plugin\CatalogRule\Model\ConfigurableProductsProvider;
1112

1213
/**
13-
* Class ReindexProduct. Add configurable sub-products to reindex
14+
* Add configurable sub-products to reindex
1415
*/
1516
class ProductRuleReindex
1617
{
1718
/**
18-
* @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
19+
* @var Configurable
1920
*/
2021
private $configurable;
2122

2223
/**
23-
* @var \Magento\CatalogRuleConfigurable\Plugin\CatalogRule\Model\ConfigurableProductsProvider
24+
* @var ConfigurableProductsProvider
2425
*/
2526
private $configurableProductsProvider;
2627

@@ -37,61 +38,47 @@ public function __construct(
3738
}
3839

3940
/**
40-
* @param \Magento\CatalogRule\Model\Indexer\Product\ProductRuleIndexer $subject
41+
* Reindex configurable product with sub-products
42+
*
43+
* @param ProductRuleIndexer $subject
4144
* @param \Closure $proceed
4245
* @param int $id
43-
*
4446
* @return void
4547
*/
46-
public function aroundExecuteRow(
47-
\Magento\CatalogRule\Model\Indexer\Product\ProductRuleIndexer $subject,
48-
\Closure $proceed,
49-
$id
50-
) {
48+
public function aroundExecuteRow(ProductRuleIndexer $subject, \Closure $proceed, $id)
49+
{
50+
$isReindexed = false;
51+
5152
$configurableProductIds = $this->configurableProductsProvider->getIds([$id]);
52-
$this->reindexSubProducts($configurableProductIds, $subject);
53-
if (!$configurableProductIds) {
54-
$proceed($id);
53+
if ($configurableProductIds) {
54+
$subProducts = array_values($this->configurable->getChildrenIds($id)[0]);
55+
if ($subProducts) {
56+
$subject->executeList(array_merge([$id], $subProducts));
57+
$isReindexed = true;
58+
}
5559
}
56-
}
5760

58-
/**
59-
* @param \Magento\CatalogRule\Model\Indexer\Product\ProductRuleIndexer $subject
60-
* @param \Closure $proceed
61-
* @param array $ids
62-
*
63-
* @return void
64-
*/
65-
public function aroundExecuteList(
66-
\Magento\CatalogRule\Model\Indexer\Product\ProductRuleIndexer $subject,
67-
\Closure $proceed,
68-
array $ids
69-
) {
70-
$configurableProductIds = $this->configurableProductsProvider->getIds($ids);
71-
$subProducts = $this->reindexSubProducts($configurableProductIds, $subject);
72-
$ids = array_diff($ids, $configurableProductIds, $subProducts);
73-
if ($ids) {
74-
$proceed($ids);
61+
if (!$isReindexed) {
62+
$proceed($id);
7563
}
7664
}
7765

7866
/**
79-
* @param array $configurableIds
80-
* @param \Magento\CatalogRule\Model\Indexer\Product\ProductRuleIndexer $subject
67+
* Add sub-products to reindex
8168
*
69+
* @param ProductRuleIndexer $subject
70+
* @param array $ids
8271
* @return array
72+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
8373
*/
84-
private function reindexSubProducts(
85-
array $configurableIds,
86-
\Magento\CatalogRule\Model\Indexer\Product\ProductRuleIndexer $subject
87-
) {
88-
$subProducts = [];
89-
if ($configurableIds) {
90-
$subProducts = array_values($this->configurable->getChildrenIds($configurableIds)[0]);
91-
if ($subProducts) {
92-
$subject->executeList($subProducts);
93-
}
74+
public function beforeExecuteList(ProductRuleIndexer $subject, array $ids): array
75+
{
76+
$configurableProductIds = $this->configurableProductsProvider->getIds($ids);
77+
if ($configurableProductIds) {
78+
$subProducts = array_values($this->configurable->getChildrenIds($configurableProductIds)[0]);
79+
$ids = array_unique(array_merge($ids, $subProducts));
9480
}
95-
return $subProducts;
81+
82+
return [$ids];
9683
}
9784
}

0 commit comments

Comments
 (0)