|
20 | 20 | use Magento\CatalogRule\Model\ResourceModel\Rule\RuleIdProvider; |
21 | 21 | use Magento\CatalogRule\Model\Rule; |
22 | 22 | use Magento\CatalogRule\Model\RuleFactory; |
| 23 | +use Magento\Customer\Api\GroupExcludedWebsiteRepositoryInterface; |
23 | 24 | use Magento\Eav\Model\Config; |
24 | 25 | use Magento\Framework\App\ObjectManager; |
25 | 26 | use Magento\Framework\App\ResourceConnection; |
@@ -214,6 +215,11 @@ class IndexBuilder |
214 | 215 | */ |
215 | 216 | private $ruleFactory; |
216 | 217 |
|
| 218 | + /** |
| 219 | + * @var GroupExcludedWebsiteRepositoryInterface |
| 220 | + */ |
| 221 | + private $groupExcludedWebsiteRepository; |
| 222 | + |
217 | 223 | /** |
218 | 224 | * @param RuleCollectionFactory $ruleCollectionFactory |
219 | 225 | * @param PriceCurrencyInterface $priceCurrency |
@@ -243,6 +249,7 @@ class IndexBuilder |
243 | 249 | * @param CatalogRuleInsertBatchSizeCalculator|null $insertBatchSizeCalculator |
244 | 250 | * @param RuleIdProvider|null $ruleIdProvider |
245 | 251 | * @param RuleFactory|null $ruleFactory |
| 252 | + * @param GroupExcludedWebsiteRepositoryInterface|null $groupExcludedWebsiteRepository |
246 | 253 | * @SuppressWarnings(PHPMD.ExcessiveParameterList) |
247 | 254 | * @SuppressWarnings(PHPMD.UnusedFormalParameter) |
248 | 255 | */ |
@@ -274,7 +281,8 @@ public function __construct( |
274 | 281 | ?DynamicBatchSizeCalculator $batchSizeCalculator = null, |
275 | 282 | ?CatalogRuleInsertBatchSizeCalculator $insertBatchSizeCalculator = null, |
276 | 283 | ?RuleIdProvider $ruleIdProvider = null, |
277 | | - ?RuleFactory $ruleFactory = null |
| 284 | + ?RuleFactory $ruleFactory = null, |
| 285 | + ?GroupExcludedWebsiteRepositoryInterface $groupExcludedWebsiteRepository = null |
278 | 286 | ) { |
279 | 287 | $this->resource = $resource; |
280 | 288 | $this->connection = $resource->getConnection(); |
@@ -331,6 +339,8 @@ public function __construct( |
331 | 339 | ObjectManager::getInstance()->get(RuleIdProvider::class); |
332 | 340 | $this->ruleFactory = $ruleFactory ?? |
333 | 341 | ObjectManager::getInstance()->get(RuleFactory::class); |
| 342 | + $this->groupExcludedWebsiteRepository = $groupExcludedWebsiteRepository ?? |
| 343 | + ObjectManager::getInstance()->get(GroupExcludedWebsiteRepositoryInterface::class); |
334 | 344 | } |
335 | 345 |
|
336 | 346 | /** |
@@ -443,13 +453,20 @@ protected function doReindexFull() |
443 | 453 | { |
444 | 454 | $dynamicBatchCount = $this->insertBatchSizeCalculator->getInsertBatchSize($this->connection); |
445 | 455 | $ruleIds = $this->getActiveRuleIds(); |
| 456 | + |
| 457 | + $allExcludedWebsites = $this->groupExcludedWebsiteRepository->getAllExcludedWebsites(); |
| 458 | + |
446 | 459 | foreach ($ruleIds as $ruleId) { |
447 | 460 |
|
448 | 461 | $rule = $this->loadRuleById($ruleId); |
449 | 462 | if (!$rule) { |
450 | 463 | $this->logger->warning("Rule ID {$ruleId} not found, skipping"); |
451 | 464 | continue; |
452 | 465 | } |
| 466 | + |
| 467 | + $ruleExcludedWebsites = $this->filterExcludedWebsitesForRule($rule, $allExcludedWebsites); |
| 468 | + $rule->setData('excluded_website_ids', $ruleExcludedWebsites); |
| 469 | + |
453 | 470 | $this->reindexRuleProduct->execute($rule, $dynamicBatchCount, true); |
454 | 471 |
|
455 | 472 | $rule->clearInstance(); |
@@ -780,6 +797,33 @@ protected function loadRuleById($ruleId) |
780 | 797 | return $rule->getId() ? $rule : null; |
781 | 798 | } |
782 | 799 |
|
| 800 | + /** |
| 801 | + * Filter excluded websites for a specific rule based on its customer groups |
| 802 | + * |
| 803 | + * @param Rule $rule |
| 804 | + * @param array $allExcludedWebsites |
| 805 | + * @return array |
| 806 | + */ |
| 807 | + private function filterExcludedWebsitesForRule(Rule $rule, array $allExcludedWebsites): array |
| 808 | + { |
| 809 | + $ruleExcludedWebsites = []; |
| 810 | + $customerGroupIds = $rule->getCustomerGroupIds(); |
| 811 | + |
| 812 | + if (empty($customerGroupIds) || empty($allExcludedWebsites)) { |
| 813 | + return $ruleExcludedWebsites; |
| 814 | + } |
| 815 | + |
| 816 | + foreach ($customerGroupIds as $customerGroupId) { |
| 817 | + if (isset($allExcludedWebsites[$customerGroupId])) { |
| 818 | + foreach ($allExcludedWebsites[$customerGroupId] as $websiteId) { |
| 819 | + $ruleExcludedWebsites[$websiteId] = $websiteId; |
| 820 | + } |
| 821 | + } |
| 822 | + } |
| 823 | + |
| 824 | + return array_values($ruleExcludedWebsites); |
| 825 | + } |
| 826 | + |
783 | 827 | /** |
784 | 828 | * Get active rules |
785 | 829 | * |
|
0 commit comments