diff --git a/app/Console/Commands/Tools/ApplyRules.php b/app/Console/Commands/Tools/ApplyRules.php index 11d9c9dfdb..1bc1467072 100644 --- a/app/Console/Commands/Tools/ApplyRules.php +++ b/app/Console/Commands/Tools/ApplyRules.php @@ -150,6 +150,9 @@ class ApplyRules extends Command $ruleEngine->setUser($this->getUser()); $ruleEngine->setRulesToApply($rulesToApply); + // for this call, the rule engine only includes "store" rules: + $ruleEngine->setTriggerMode(RuleEngine::TRIGGER_STORE); + $bar = $this->output->createProgressBar(count($journals)); Log::debug(sprintf('Now looping %d transactions.', count($journals))); /** @var array $journal */ diff --git a/app/Handlers/Events/StoredGroupEventHandler.php b/app/Handlers/Events/StoredGroupEventHandler.php index 6b94192bcf..4d800904c2 100644 --- a/app/Handlers/Events/StoredGroupEventHandler.php +++ b/app/Handlers/Events/StoredGroupEventHandler.php @@ -23,11 +23,8 @@ declare(strict_types=1); namespace FireflyIII\Handlers\Events; use FireflyIII\Events\StoredTransactionGroup; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Models\Rule; -use FireflyIII\Models\RuleGroup; -use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; -use FireflyIII\TransactionRules\Processor; +use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Engine\RuleEngine; /** * Class StoredGroupEventHandler @@ -38,46 +35,24 @@ class StoredGroupEventHandler * This method grabs all the users rules and processes them. * * @param StoredTransactionGroup $storedJournalEvent - * - * @return bool - * @throws FireflyException */ - public function processRules(StoredTransactionGroup $storedJournalEvent): bool + public function processRules(StoredTransactionGroup $storedJournalEvent): void { + if (false === $storedJournalEvent->applyRules) { + return; + } + + /** @var RuleEngine $ruleEngine */ + $ruleEngine = app(RuleEngine::class); + $ruleEngine->setUser($storedJournalEvent->transactionGroup->user); + $ruleEngine->setAllRules(true); + $ruleEngine->setTriggerMode(RuleEngine::TRIGGER_STORE); $journals = $storedJournalEvent->transactionGroup->transactionJournals; - if(false === $storedJournalEvent->applyRules) { - return true; - } - // TODO fix this - die('cannot apply rules yet'); - // create objects: - /** @var RuleGroupRepositoryInterface $ruleGroupRepos */ - $ruleGroupRepos = app(RuleGroupRepositoryInterface::class); + /** @var TransactionJournal $journal */ foreach ($journals as $journal) { - $ruleGroupRepos->setUser($journal->user); - $groups = $ruleGroupRepos->getActiveGroups(); - - /** @var RuleGroup $group */ - foreach ($groups as $group) { - $rules = $ruleGroupRepos->getActiveStoreRules($group); - /** @var Rule $rule */ - foreach ($rules as $rule) { - /** @var Processor $processor */ - $processor = app(Processor::class); - $processor->make($rule); - $processor->handleTransactionJournal($journal); - - // TODO refactor the stop_processing logic. - // TODO verify that rule execution happens in one place only, including the journal + rule loop (if any) - if ($rule->stop_processing) { - break; - } - } - } + $ruleEngine->processTransactionJournal($journal); } - - return true; } } diff --git a/app/Handlers/Events/UpdatedGroupEventHandler.php b/app/Handlers/Events/UpdatedGroupEventHandler.php index 32a97f2953..18bbd8d066 100644 --- a/app/Handlers/Events/UpdatedGroupEventHandler.php +++ b/app/Handlers/Events/UpdatedGroupEventHandler.php @@ -24,10 +24,8 @@ namespace FireflyIII\Handlers\Events; use FireflyIII\Events\UpdatedTransactionGroup; use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Models\Rule; -use FireflyIII\Models\RuleGroup; -use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; -use FireflyIII\TransactionRules\Processor; +use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Engine\RuleEngine; /** * Class UpdatedGroupEventHandler @@ -38,42 +36,20 @@ class UpdatedGroupEventHandler * This method will check all the rules when a journal is updated. * * @param UpdatedTransactionGroup $updatedJournalEvent - * - * @return bool - * @throws FireflyException */ - public function processRules(UpdatedTransactionGroup $updatedJournalEvent): bool + public function processRules(UpdatedTransactionGroup $updatedJournalEvent): void { - // get all the user's rule groups, with the rules, order by 'order'. + /** @var RuleEngine $ruleEngine */ + $ruleEngine = app(RuleEngine::class); + $ruleEngine->setUser($updatedJournalEvent->transactionGroup->user); + $ruleEngine->setAllRules(true); + $ruleEngine->setTriggerMode(RuleEngine::TRIGGER_UPDATE); $journals = $updatedJournalEvent->transactionGroup->transactionJournals; - // TODO fix this - die('cannot apply rules yet'); - /** @var RuleGroupRepositoryInterface $ruleGroupRepos */ - $ruleGroupRepos = app(RuleGroupRepositoryInterface::class); + /** @var TransactionJournal $journal */ foreach ($journals as $journal) { - $ruleGroupRepos->setUser($journal->user); - - $groups = $ruleGroupRepos->getActiveGroups(); - - /** @var RuleGroup $group */ - foreach ($groups as $group) { - $rules = $ruleGroupRepos->getActiveUpdateRules($group); - /** @var Rule $rule */ - foreach ($rules as $rule) { - /** @var Processor $processor */ - $processor = app(Processor::class); - $processor->make($rule); - $processor->handleTransactionJournal($journal); - - if ($rule->stop_processing) { - break; - } - } - } + $ruleEngine->processTransactionJournal($journal); } - - return true; } }