mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Add ability to set a rule that will trigger both when rules are created or updated
This commit is contained in:
parent
facd0144cb
commit
a73c1d5a63
@ -119,7 +119,7 @@ class StoreRequest extends FormRequest
|
||||
'description' => 'min:1|max:32768|nullable',
|
||||
'rule_group_id' => 'belongsToUser:rule_groups|required_without:rule_group_title',
|
||||
'rule_group_title' => 'nullable|min:1|max:255|required_without:rule_group_id|belongsToUser:rule_groups,title',
|
||||
'trigger' => 'required|in:store-journal,update-journal,manual-activation',
|
||||
'trigger' => 'required|in:store-journal,update-journal,manual-activation,store-or-update-journal',
|
||||
'triggers.*.type' => 'required|in:'.implode(',', $validTriggers),
|
||||
'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue|max:1024',
|
||||
'triggers.*.stop_processing' => [new IsBoolean()],
|
||||
|
@ -138,7 +138,7 @@ class UpdateRequest extends FormRequest
|
||||
'description' => 'min:1|max:32768|nullable',
|
||||
'rule_group_id' => 'belongsToUser:rule_groups',
|
||||
'rule_group_title' => 'nullable|min:1|max:255|belongsToUser:rule_groups,title',
|
||||
'trigger' => 'in:store-journal,update-journal.manual-activation',
|
||||
'trigger' => 'in:store-journal,update-journal.manual-activation,store-or-update-journal',
|
||||
'triggers.*.type' => 'required|in:'.implode(',', $validTriggers),
|
||||
'triggers.*.value' => 'required_if:actions.*.type,'.$contextTriggers.'|min:1|ruleTriggerValue|max:1024',
|
||||
'triggers.*.stop_processing' => [new IsBoolean()],
|
||||
|
@ -66,7 +66,7 @@ class StoredGroupEventHandler
|
||||
|
||||
// add the groups to the rule engine.
|
||||
// it should run the rules in the group and cancel the group if necessary.
|
||||
$groups = $ruleGroupRepository->getRuleGroupsWithRules('store-journal');
|
||||
$groups = $ruleGroupRepository->getRuleGroupsWithRules(['store-journal', 'store-or-update-journal']);
|
||||
|
||||
// create and fire rule engine.
|
||||
$newRuleEngine = app(RuleEngineInterface::class);
|
||||
|
@ -66,7 +66,7 @@ class UpdatedGroupEventHandler
|
||||
$ruleGroupRepository = app(RuleGroupRepositoryInterface::class);
|
||||
$ruleGroupRepository->setUser($updatedGroupEvent->transactionGroup->user);
|
||||
|
||||
$groups = $ruleGroupRepository->getRuleGroupsWithRules('update-journal');
|
||||
$groups = $ruleGroupRepository->getRuleGroupsWithRules(['update-journal', 'store-or-update-journal']);
|
||||
|
||||
// file rule engine.
|
||||
$newRuleEngine = app(RuleEngineInterface::class);
|
||||
|
@ -144,7 +144,7 @@ class RuleFormRequest extends FormRequest
|
||||
'description' => 'min:1|max:32768|nullable',
|
||||
'stop_processing' => 'boolean',
|
||||
'rule_group_id' => 'required|belongsToUser:rule_groups',
|
||||
'trigger' => 'required|in:store-journal,update-journal,manual-activation',
|
||||
'trigger' => 'required|in:store-journal,update-journal,manual-activation,store-or-update-journal',
|
||||
'triggers.*.type' => 'required|in:'.implode(',', $validTriggers),
|
||||
'triggers.*.value' => sprintf('required_if:triggers.*.type,%s|max:1024|min:1|ruleTriggerValue', $contextTriggers),
|
||||
'actions.*.type' => 'required|in:'.implode(',', $validActions),
|
||||
|
@ -175,7 +175,7 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
foreach ($collection as $rule) {
|
||||
/** @var RuleTrigger $ruleTrigger */
|
||||
foreach ($rule->ruleTriggers as $ruleTrigger) {
|
||||
if ('user_action' === $ruleTrigger->trigger_type && 'store-journal' === $ruleTrigger->trigger_value) {
|
||||
if ('user_action' === $ruleTrigger->trigger_type && in_array($ruleTrigger->trigger_value, ['store-journal','store-or-update-journal'], true)) {
|
||||
$filtered->push($rule);
|
||||
}
|
||||
}
|
||||
@ -201,7 +201,7 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
foreach ($collection as $rule) {
|
||||
/** @var RuleTrigger $ruleTrigger */
|
||||
foreach ($rule->ruleTriggers as $ruleTrigger) {
|
||||
if ('user_action' === $ruleTrigger->trigger_type && 'update-journal' === $ruleTrigger->trigger_value) {
|
||||
if ('user_action' === $ruleTrigger->trigger_type && in_array($ruleTrigger->trigger_value, ['update-journal','store-or-update-journal'], true)) {
|
||||
$filtered->push($rule);
|
||||
}
|
||||
}
|
||||
@ -494,6 +494,9 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
if (array_key_exists('trigger', $data) && 'store-journal' === $data['trigger']) {
|
||||
$this->setRuleTrigger('store-journal', $rule);
|
||||
}
|
||||
if (array_key_exists('trigger', $data) && 'store-or-update-journal' === $data['trigger']) {
|
||||
$this->setRuleTrigger('store-or-update-journal', $rule);
|
||||
}
|
||||
if (array_key_exists('triggers', $data)) {
|
||||
// delete triggers:
|
||||
$rule->ruleTriggers()->where('trigger_type', '!=', 'user_action')->delete();
|
||||
|
@ -236,7 +236,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface
|
||||
return $group->rules()
|
||||
->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id')
|
||||
->where('rule_triggers.trigger_type', 'user_action')
|
||||
->where('rule_triggers.trigger_value', 'store-journal')
|
||||
->whereIn('rule_triggers.trigger_value', ['store-journal', 'store-or-update-journal'])
|
||||
->where('rules.active', true)
|
||||
->get(['rules.*'])
|
||||
;
|
||||
@ -247,7 +247,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface
|
||||
return $group->rules()
|
||||
->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id')
|
||||
->where('rule_triggers.trigger_type', 'user_action')
|
||||
->where('rule_triggers.trigger_value', 'update-journal')
|
||||
->whereIn('rule_triggers.trigger_value', ['update-journal', 'store-or-update-journal'])
|
||||
->where('rules.active', true)
|
||||
->get(['rules.*'])
|
||||
;
|
||||
@ -308,7 +308,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface
|
||||
return (int) $entry;
|
||||
}
|
||||
|
||||
public function getRuleGroupsWithRules(?string $filter): Collection
|
||||
public function getRuleGroupsWithRules(?array $filter): Collection
|
||||
{
|
||||
$groups = $this->user->ruleGroups()
|
||||
->orderBy('order', 'ASC')
|
||||
@ -330,23 +330,24 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface
|
||||
if (null === $filter) {
|
||||
return $groups;
|
||||
}
|
||||
app('log')->debug(sprintf('Will filter getRuleGroupsWithRules on "%s".', $filter));
|
||||
$implodedFilter = implode(',', $filter);
|
||||
app('log')->debug(sprintf('Will filter getRuleGroupsWithRules on any of %s.', $implodedFilter));
|
||||
|
||||
return $groups->map(
|
||||
static function (RuleGroup $group) use ($filter) { // @phpstan-ignore-line
|
||||
static function (RuleGroup $group) use ($filter, $implodedFilter) { // @phpstan-ignore-line
|
||||
app('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) {
|
||||
static function (Rule $rule) use ($filter, $implodedFilter) {
|
||||
app('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));
|
||||
if ('user_action' === $trigger->trigger_type && in_array($trigger->trigger_value, $filter, true)) {
|
||||
app('log')->debug(sprintf('Rule #%d triggers on %s, include it.', $rule->id, $trigger->trigger_value));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
app('log')->debug(sprintf('Rule #%d does not trigger on %s, do not include it.', $rule->id, $filter));
|
||||
app('log')->debug(sprintf('Rule #%d does not trigger on any of %s, do not include it.', $rule->id, $implodedFilter));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ interface RuleGroupRepositoryInterface
|
||||
|
||||
public function getHighestOrderRuleGroup(): int;
|
||||
|
||||
public function getRuleGroupsWithRules(?string $filter): Collection;
|
||||
public function getRuleGroupsWithRules(?array $filter): Collection;
|
||||
|
||||
public function getRules(RuleGroup $group): Collection;
|
||||
|
||||
|
@ -46,9 +46,10 @@ class Rule extends AbstractExtension
|
||||
'allJournalTriggers',
|
||||
static function () {
|
||||
return [
|
||||
'store-journal' => (string) trans('firefly.rule_trigger_store_journal'),
|
||||
'update-journal' => (string) trans('firefly.rule_trigger_update_journal'),
|
||||
'manual-activation' => (string) trans('firefly.rule_trigger_manual'),
|
||||
'store-journal' => (string) trans('firefly.rule_trigger_store_journal'),
|
||||
'update-journal' => (string) trans('firefly.rule_trigger_update_journal'),
|
||||
'store-or-update-journal' => (string) trans('firefly.rule_trigger_store_or_update_journal'),
|
||||
'manual-activation' => (string) trans('firefly.rule_trigger_manual'),
|
||||
];
|
||||
}
|
||||
);
|
||||
|
@ -821,6 +821,7 @@ return [
|
||||
// actions and triggers
|
||||
'rule_trigger_store_journal' => 'When a transaction is created',
|
||||
'rule_trigger_update_journal' => 'When a transaction is updated',
|
||||
'rule_trigger_store_or_update_journal' => 'When a transaction is created or updated',
|
||||
'rule_trigger_manual' => 'Only when user-activated',
|
||||
'rule_trigger_user_action' => 'User action is ":trigger_value"',
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user