From a3cac6fd0fd1753e9b69bd79ed290a293fabc916 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 8 Oct 2025 15:16:10 +0200 Subject: [PATCH] Fix #11031 --- .../RuleGroup/RuleGroupRepository.php | 31 ++++++++++--------- .../Engine/SearchRuleEngine.php | 19 ++++++++++-- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/app/Repositories/RuleGroup/RuleGroupRepository.php b/app/Repositories/RuleGroup/RuleGroupRepository.php index a3256ccf50..4e99d53728 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepository.php +++ b/app/Repositories/RuleGroup/RuleGroupRepository.php @@ -139,7 +139,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte /** @var Rule $entry */ foreach ($set as $entry) { if ($entry->order !== $count) { - app('log')->debug(sprintf('Rule #%d was on spot %d but must be on spot %d', $entry->id, $entry->order, $count)); + Log::debug(sprintf('Rule #%d was on spot %d but must be on spot %d', $entry->id, $entry->order, $count)); $entry->order = $count; $entry->save(); } @@ -167,7 +167,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte if ($action->order !== $index) { $action->order = $index; $action->save(); - app('log')->debug(sprintf('Rule action #%d was on spot %d but must be on spot %d', $action->id, $action->order, $index)); + Log::debug(sprintf('Rule action #%d was on spot %d but must be on spot %d', $action->id, $action->order, $index)); } ++$index; } @@ -189,7 +189,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte if ($order !== $index) { $trigger->order = $index; $trigger->save(); - app('log')->debug(sprintf('Rule trigger #%d was on spot %d but must be on spot %d', $trigger->id, $order, $index)); + Log::debug(sprintf('Rule trigger #%d was on spot %d but must be on spot %d', $trigger->id, $order, $index)); } ++$index; } @@ -235,6 +235,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte public function getActiveStoreRules(RuleGroup $group): Collection { return $group->rules() + ->orderBy('rules.order', 'ASC') ->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id') ->where('rule_triggers.trigger_type', 'user_action') ->where('rule_triggers.trigger_value', 'store-journal') @@ -275,23 +276,23 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte if (null === $filter) { return $groups; } - app('log')->debug(sprintf('Will filter getRuleGroupsWithRules on "%s".', $filter)); + Log::debug(sprintf('Will filter getRuleGroupsWithRules on "%s".', $filter)); return $groups->map( static function (RuleGroup $group) use ($filter) { // @phpstan-ignore-line - app('log')->debug(sprintf('Now filtering group #%d', $group->id)); + Log::debug(sprintf('Now filtering group #%d', $group->id)); // filter the rules in the rule group: $group->rules = $group->rules->filter( static function (Rule $rule) use ($filter) { - app('log')->debug(sprintf('Now filtering rule #%d', $rule->id)); + Log::debug(sprintf('Now filtering rule #%d', $rule->id)); foreach ($rule->ruleTriggers as $trigger) { if ('user_action' === $trigger->trigger_type && $filter === $trigger->trigger_value) { - app('log')->debug(sprintf('Rule #%d triggers on %s, include it.', $rule->id, $filter)); + Log::debug(sprintf('Rule #%d triggers on %s, include it.', $rule->id, $filter)); return true; } } - app('log')->debug(sprintf('Rule #%d does not trigger on %s, do not include it.', $rule->id, $filter)); + Log::debug(sprintf('Rule #%d does not trigger on %s, do not include it.', $rule->id, $filter)); return false; } @@ -331,23 +332,23 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte if (null === $filter) { return $groups; } - app('log')->debug(sprintf('Will filter getRuleGroupsWithRules on "%s".', $filter)); + Log::debug(sprintf('Will filter getRuleGroupsWithRules on "%s".', $filter)); return $groups->map( static function (RuleGroup $group) use ($filter) { // @phpstan-ignore-line - app('log')->debug(sprintf('Now filtering group #%d', $group->id)); + Log::debug(sprintf('Now filtering group #%d', $group->id)); // filter the rules in the rule group: $group->rules = $group->rules->filter( static function (Rule $rule) use ($filter) { - app('log')->debug(sprintf('Now filtering rule #%d', $rule->id)); + Log::debug(sprintf('Now filtering rule #%d', $rule->id)); foreach ($rule->ruleTriggers as $trigger) { if ('user_action' === $trigger->trigger_type && $filter === $trigger->trigger_value) { - app('log')->debug(sprintf('Rule #%d triggers on %s, include it.', $rule->id, $filter)); + Log::debug(sprintf('Rule #%d triggers on %s, include it.', $rule->id, $filter)); return true; } } - app('log')->debug(sprintf('Rule #%d does not trigger on %s, do not include it.', $rule->id, $filter)); + Log::debug(sprintf('Rule #%d does not trigger on %s, do not include it.', $rule->id, $filter)); return false; } @@ -414,7 +415,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte ->decrement('order') ; $ruleGroup->order = $newOrder; - app('log')->debug(sprintf('Order of group #%d ("%s") is now %d', $ruleGroup->id, $ruleGroup->title, $newOrder)); + Log::debug(sprintf('Order of group #%d ("%s") is now %d', $ruleGroup->id, $ruleGroup->title, $newOrder)); $ruleGroup->save(); return; @@ -425,7 +426,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface, UserGroupInte ->increment('order') ; $ruleGroup->order = $newOrder; - app('log')->debug(sprintf('Order of group #%d ("%s") is now %d', $ruleGroup->id, $ruleGroup->title, $newOrder)); + Log::debug(sprintf('Order of group #%d ("%s") is now %d', $ruleGroup->id, $ruleGroup->title, $newOrder)); $ruleGroup->save(); } diff --git a/app/TransactionRules/Engine/SearchRuleEngine.php b/app/TransactionRules/Engine/SearchRuleEngine.php index 7843d1ffca..f5802bc2ed 100644 --- a/app/TransactionRules/Engine/SearchRuleEngine.php +++ b/app/TransactionRules/Engine/SearchRuleEngine.php @@ -506,9 +506,22 @@ class SearchRuleEngine implements RuleEngineInterface */ private function fireGroup(RuleGroup $group): void { - Log::debug(sprintf('Going to fire group #%d with %d rule(s)', $group->id, $group->rules->count())); - - $rules = $group->rules()->orderBy('order', 'ASC')->get(); + $rules =[]; + if($group->relationLoaded('rules')) { + Log::debug('Group rules have been pre-loaded, do not reload them.'); + $rules = $group->rules; + } + if(!$group->relationLoaded('rules')) { + Log::debug('Group rules have NOT been pre-loaded, load them NOW.'); + $rules = $group->rules() + ->orderBy('rules.order', 'ASC') +// ->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id') +// ->where('rule_triggers.trigger_type', 'user_action') +// ->where('rule_triggers.trigger_value', 'store-journal') + ->where('rules.active', true) + ->get(['rules.*']); + } + Log::debug(sprintf('Going to fire group #%d with %d rule(s)', $group->id, $rules->count())); /** @var Rule $rule */ foreach ($rules as $rule) {