From db7e3d725e519c4f420eadcc42919989cb538df2 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 14 Oct 2018 17:38:26 +0200 Subject: [PATCH] Fix for #1781 --- app/Http/Requests/RuleFormRequest.php | 29 ++++++++-------- app/Validation/FireflyValidator.php | 4 +-- config/firefly.php | 50 +++++++++++++++++++++++---- 3 files changed, 58 insertions(+), 25 deletions(-) diff --git a/app/Http/Requests/RuleFormRequest.php b/app/Http/Requests/RuleFormRequest.php index 40df4da5d8..acca6dba81 100644 --- a/app/Http/Requests/RuleFormRequest.php +++ b/app/Http/Requests/RuleFormRequest.php @@ -75,32 +75,31 @@ class RuleFormRequest extends Request $validTriggers = array_keys(config('firefly.rule-triggers')); $validActions = array_keys(config('firefly.rule-actions')); - // some actions require text: - $contextActions = implode(',', config('firefly.rule-actions-text')); + // some actions require text (aka context): + $contextActions = implode(',', config('firefly.context-rule-actions')); - $titleRule = 'required|between:1,100|uniqueObjectForUser:rules,title'; - /** @var Rule $rule */ - $rule = $this->route()->parameter('rule'); + // some triggers require text (aka context): + $contextTriggers = implode(',', config('firefly.context-rule-triggers')); - if (null !== $rule) { - $titleRule = 'required|between:1,100|uniqueObjectForUser:rules,title,' . $rule->id; - } + // initial set of rules: $rules = [ - 'title' => $titleRule, + 'title' => 'required|between:1,100|uniqueObjectForUser:rules,title', 'description' => 'between:1,5000|nullable', 'stop_processing' => 'boolean', 'rule_group_id' => 'required|belongsToUser:rule_groups', 'trigger' => 'required|in:store-journal,update-journal', 'rule_triggers.*.name' => 'required|in:' . implode(',', $validTriggers), - 'rule_triggers.*.value' => 'required|min:1|ruleTriggerValue', + 'rule_triggers.*.value' => sprintf('required_if:rule_triggers.*.name,%s|min:1|ruleTriggerValue', $contextTriggers), 'rule-actions.*.name' => 'required|in:' . implode(',', $validActions), + 'rule_actions.*.value' => sprintf('required_if:rule_actions.*.name,%s|min:1|ruleActionValue', $contextActions), 'strict' => 'in:0,1', ]; - // since Laravel does not support this stuff yet, here's a trick. - for ($i = 0; $i < 10; ++$i) { - $key = sprintf('rule_actions.%d.value', $i); - $rule = sprintf('required-if:rule_actions.%d.name,%s|ruleActionValue', $i, $contextActions); - $rules[$key] = $rule; + + /** @var Rule $rule */ + $rule = $this->route()->parameter('rule'); + + if (null !== $rule) { + $rules['title'] = 'required|between:1,100|uniqueObjectForUser:rules,title,' . $rule->id; } return $rules; diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index 1c62516695..cc4766ed26 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -313,10 +313,8 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateRuleTriggerValue(string $attribute, string $value): bool + public function validateRuleTriggerValue(string $attribute, string $value = null): bool { - // - // first, get the index from this string: $parts = explode('.', $attribute); $index = (int)($parts[1] ?? '0'); diff --git a/config/firefly.php b/config/firefly.php index d8811e0999..fa6f94ec9c 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -375,23 +375,59 @@ return [ 'convert_deposit' => ConvertToDeposit::class, 'convert_transfer' => ConvertToTransfer::class, ], - 'rule-actions-text' => [ + 'context-rule-actions' => [ 'set_category', 'set_budget', 'add_tag', 'remove_tag', - 'link_to_bill', 'set_description', 'append_description', 'prepend_description', + 'set_source_account', + 'set_destination_account', + 'set_notes', + 'append_notes', + 'prepend_notes', + 'link_to_bill', + 'convert_withdrawal', + 'convert_deposit', + 'convert_transfer', ], - 'test-triggers' => [ + 'context-rule-triggers' => [ + 'from_account_starts', + 'from_account_ends', + 'from_account_is', + 'from_account_contains', + 'to_account_starts', + 'to_account_ends', + 'to_account_is', + 'to_account_contains', + 'amount_less', + 'amount_exactly', + 'amount_more', + 'description_starts', + 'description_ends', + 'description_contains', + 'description_is', + 'transaction_type', + 'category_is', + 'budget_is', + 'tag_is', + 'currency_is', + 'notes_contain', + 'notes_start', + 'notes_end', + 'notes_are', + ], + + + 'test-triggers' => [ 'limit' => 10, 'range' => 200, ], - 'default_currency' => 'EUR', - 'default_language' => 'en_US', - 'search_modifiers' => ['amount_is', 'amount', 'amount_max', 'amount_min', 'amount_less', 'amount_more', 'source', 'destination', 'category', - 'budget', 'bill', 'type', 'date', 'date_before', 'date_after', 'on', 'before', 'after'], + 'default_currency' => 'EUR', + 'default_language' => 'en_US', + 'search_modifiers' => ['amount_is', 'amount', 'amount_max', 'amount_min', 'amount_less', 'amount_more', 'source', 'destination', 'category', + 'budget', 'bill', 'type', 'date', 'date_before', 'date_after', 'on', 'before', 'after'], // tag notes has_attachments ];