make sure rules fire for events.

This commit is contained in:
James Cole 2019-06-21 19:06:50 +02:00
parent 47c2d0eaf1
commit b2628a290b
No known key found for this signature in database
GPG Key ID: C16961E655E74B5E
3 changed files with 27 additions and 73 deletions

View File

@ -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 */

View File

@ -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;
}
}

View File

@ -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;
}
}