diff --git a/app/Api/V1/Requests/Autocomplete/AutocompleteRequest.php b/app/Api/V1/Requests/Autocomplete/AutocompleteRequest.php index 058f9dc05b..c023c500fc 100644 --- a/app/Api/V1/Requests/Autocomplete/AutocompleteRequest.php +++ b/app/Api/V1/Requests/Autocomplete/AutocompleteRequest.php @@ -45,7 +45,7 @@ class AutocompleteRequest extends FormRequest if ('' !== $types) { $array = explode(',', $types); } - $limit = $this->integer('limit'); + $limit = $this->convertInteger('limit'); $limit = 0 === $limit ? 10 : $limit; // remove 'initial balance' from allowed types. its internal diff --git a/app/Http/Controllers/Rule/CreateController.php b/app/Http/Controllers/Rule/CreateController.php index c5095b6274..3f3ea7d123 100644 --- a/app/Http/Controllers/Rule/CreateController.php +++ b/app/Http/Controllers/Rule/CreateController.php @@ -261,6 +261,7 @@ class CreateController extends Controller public function store(RuleFormRequest $request) { $data = $request->getRuleData(); + $rule = $this->ruleRepos->store($data); session()->flash('success', (string) trans('firefly.stored_new_rule', ['title' => $rule->title])); app('preferences')->mark(); diff --git a/app/Http/Controllers/Rule/EditController.php b/app/Http/Controllers/Rule/EditController.php index c5a14153d4..5cac64a28e 100644 --- a/app/Http/Controllers/Rule/EditController.php +++ b/app/Http/Controllers/Rule/EditController.php @@ -189,7 +189,8 @@ class EditController extends Controller public function update(RuleFormRequest $request, Rule $rule) { $data = $request->getRuleData(); - $this->ruleRepos->update($rule, $data); + + //$this->ruleRepos->update($rule, $data); session()->flash('success', (string) trans('firefly.updated_rule', ['title' => $rule->title])); app('preferences')->mark(); diff --git a/app/Http/Requests/RuleFormRequest.php b/app/Http/Requests/RuleFormRequest.php index 9ccdebb399..8a71856f96 100644 --- a/app/Http/Requests/RuleFormRequest.php +++ b/app/Http/Requests/RuleFormRequest.php @@ -66,11 +66,14 @@ class RuleFormRequest extends FormRequest if (is_array($triggerData)) { foreach ($triggerData as $trigger) { $stopProcessing = $trigger['stop_processing'] ?? '0'; - $return[] = [ + $prohibited = $trigger['prohibited'] ?? '0'; + $set = [ 'type' => $trigger['type'] ?? 'invalid', 'value' => $trigger['value'] ?? '', 'stop_processing' => 1 === (int) $stopProcessing, + 'prohibited' => 1 === (int) $prohibited, ]; + $return[] = $set; } } diff --git a/app/Repositories/Rule/RuleRepository.php b/app/Repositories/Rule/RuleRepository.php index 7305677f64..53e8ee1c45 100644 --- a/app/Repositories/Rule/RuleRepository.php +++ b/app/Repositories/Rule/RuleRepository.php @@ -425,9 +425,13 @@ class RuleRepository implements RuleRepositoryInterface $value = $trigger['value'] ?? ''; $stopProcessing = $trigger['stop_processing'] ?? false; $active = $trigger['active'] ?? true; + $type = $trigger['type']; + if (true === $trigger['prohibited']) { + $type = sprintf('-%s', $type); + } $triggerValues = [ - 'action' => $trigger['type'], + 'action' => $type, 'value' => $value, 'stop_processing' => $stopProcessing, 'order' => $order, diff --git a/app/Support/Http/Controllers/RenderPartialViews.php b/app/Support/Http/Controllers/RenderPartialViews.php index 3990c7bbc2..8360140fda 100644 --- a/app/Support/Http/Controllers/RenderPartialViews.php +++ b/app/Support/Http/Controllers/RenderPartialViews.php @@ -317,14 +317,19 @@ trait RenderPartialViews if ('user_action' !== $entry->trigger_type) { $count = ($index + 1); try { + $rootOperator = OperatorQuerySearch::getRootOperator($entry->trigger_type); + if(str_starts_with($rootOperator, '-')) { + $rootOperator = substr($rootOperator, 1); + } $renderedEntries[] = view( 'rules.partials.trigger', [ - 'oldTrigger' => OperatorQuerySearch::getRootOperator($entry->trigger_type), - 'oldValue' => $entry->trigger_value, - 'oldChecked' => $entry->stop_processing, - 'count' => $count, - 'triggers' => $triggers, + 'oldTrigger' => $rootOperator, + 'oldValue' => $entry->trigger_value, + 'oldChecked' => $entry->stop_processing, + 'oldProhibited' => str_starts_with($entry->trigger_type, '-'), + 'count' => $count, + 'triggers' => $triggers, ] )->render(); diff --git a/app/Support/Http/Controllers/RuleManagement.php b/app/Support/Http/Controllers/RuleManagement.php index 2144fa036d..a833732101 100644 --- a/app/Support/Http/Controllers/RuleManagement.php +++ b/app/Support/Http/Controllers/RuleManagement.php @@ -98,11 +98,12 @@ trait RuleManagement $renderedEntries[] = view( 'rules.partials.trigger', [ - 'oldTrigger' => OperatorQuerySearch::getRootOperator($oldTrigger['type']), - 'oldValue' => $oldTrigger['value'], - 'oldChecked' => 1 === (int) ($oldTrigger['stop_processing'] ?? '0'), - 'count' => $index + 1, - 'triggers' => $triggers, + 'oldTrigger' => OperatorQuerySearch::getRootOperator($oldTrigger['type']), + 'oldValue' => $oldTrigger['value'], + 'oldChecked' => 1 === (int) ($oldTrigger['stop_processing'] ?? '0'), + 'oldProhibited' => 1 === (int) ($oldTrigger['prohibited'] ?? '0'), + 'count' => $index + 1, + 'triggers' => $triggers, ] )->render(); } catch (Throwable $e) { // @phpstan-ignore-line diff --git a/public/v1/js/ff/rules/create-edit.js b/public/v1/js/ff/rules/create-edit.js index b9d2299b56..3955315a3e 100644 --- a/public/v1/js/ff/rules/create-edit.js +++ b/public/v1/js/ff/rules/create-edit.js @@ -353,6 +353,7 @@ function updateTriggerInput(selectList) { case 'has_any_tag': case 'has_attachments': case 'source_is_cash': + case 'has_no_attachments': case 'destination_is_cash': case 'account_is_cash': case 'no_external_url': diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 71ef5389db..73888a04d8 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -1077,10 +1077,10 @@ return [ 'rule_trigger_not_budget_contains' => 'Neither budget contains ":trigger_value"', 'rule_trigger_not_budget_ends' => 'Neither budget ends on ":trigger_value"', 'rule_trigger_not_budget_starts' => 'Neither budget starts with ":trigger_value"', - 'rule_trigger_not_bill_is' => 'Neither bill is ":trigger_value"', - 'rule_trigger_not_bill_contains' => 'Neither bill contains ":trigger_value"', - 'rule_trigger_not_bill_ends' => 'Neither bill ends on ":trigger_value"', - 'rule_trigger_not_bill_starts' => 'Neither bill starts with ":trigger_value"', + 'rule_trigger_not_bill_is' => 'Bill is not is ":trigger_value"', + 'rule_trigger_not_bill_contains' => 'Bill does not contain ":trigger_value"', + 'rule_trigger_not_bill_ends' => 'Bill does not end on ":trigger_value"', + 'rule_trigger_not_bill_starts' => 'Bill does not end with ":trigger_value"', 'rule_trigger_not_external_id_is' => 'External ID is not ":trigger_value"', 'rule_trigger_not_external_id_contains' => 'External ID does not contain ":trigger_value"', 'rule_trigger_not_external_id_ends' => 'External ID does not end on ":trigger_value"', diff --git a/resources/views/rules/rule/create.twig b/resources/views/rules/rule/create.twig index 2eac095b73..e8a134ee7c 100644 --- a/resources/views/rules/rule/create.twig +++ b/resources/views/rules/rule/create.twig @@ -69,6 +69,7 @@ {{ 'trigger'|_ }} + {{ 'is_not_rule_trigger'|_ }} {{ 'trigger_value'|_ }} {{ 'stop_processing_other_triggers'|_ }}