diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index 12f1b36139..58a5c5edf7 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -170,6 +170,7 @@ class BillController extends Controller $currency = app('amount')->getDefaultCurrency(); $bill->amount_min = round((float) $bill->amount_min, $currency->decimal_places); $bill->amount_max = round((float) $bill->amount_max, $currency->decimal_places); + $rules = $this->billRepository->getRulesForBill($bill); $defaultCurrency = app('amount')->getDefaultCurrency(); // code to handle active-checkboxes @@ -184,7 +185,7 @@ class BillController extends Controller $request->session()->flash('preFilled', $preFilled); $request->session()->forget('bills.edit.fromUpdate'); - return view('bills.edit', compact('subTitle', 'periods', 'bill', 'defaultCurrency', 'preFilled')); + return view('bills.edit', compact('subTitle', 'periods', 'rules', 'bill', 'defaultCurrency', 'preFilled')); } /** diff --git a/app/Services/Internal/Support/BillServiceTrait.php b/app/Services/Internal/Support/BillServiceTrait.php index 40beb98fe4..b5b32ecbca 100644 --- a/app/Services/Internal/Support/BillServiceTrait.php +++ b/app/Services/Internal/Support/BillServiceTrait.php @@ -55,6 +55,7 @@ trait BillServiceTrait /** @var RuleAction $ruleAction */ foreach ($set as $ruleAction) { + Log::debug(sprintf('Updated rule action #%d to search for new bill name "%s"', $ruleAction->id, $newName)); $ruleAction->action_value = $newName; $ruleAction->save(); } diff --git a/app/Services/Internal/Update/BillUpdateService.php b/app/Services/Internal/Update/BillUpdateService.php index 16171dd1ce..42571b33c6 100644 --- a/app/Services/Internal/Update/BillUpdateService.php +++ b/app/Services/Internal/Update/BillUpdateService.php @@ -25,8 +25,12 @@ namespace FireflyIII\Services\Internal\Update; use FireflyIII\Factory\TransactionCurrencyFactory; use FireflyIII\Models\Bill; +use FireflyIII\Models\Rule; +use FireflyIII\Models\RuleTrigger; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Services\Internal\Support\BillServiceTrait; +use Illuminate\Support\Collection; use Log; /** @@ -69,28 +73,108 @@ class BillUpdateService $currency->enabled = true; $currency->save(); - $oldName = $bill->name; - $bill->name = $data['name']; - $bill->match = $data['match'] ?? $bill->match; - $bill->amount_min = $data['amount_min']; - $bill->amount_max = $data['amount_max']; - $bill->date = $data['date']; - $bill->transaction_currency_id = $currency->id; - $bill->repeat_freq = $data['repeat_freq']; - $bill->skip = $data['skip']; - $bill->automatch = true; - $bill->active = $data['active'] ?? true; + // old values + $oldData = [ + 'name' => $bill->name, + 'amount_min' => $bill->amount_min, + 'amount_max' => $bill->amount_max, + 'transaction_currency_name' => $bill->transactionCurrency->name, + ]; + // new values + $data['transaction_currency_name'] = $currency->name; + $bill->name = $data['name']; + $bill->match = $data['match'] ?? $bill->match; + $bill->amount_min = $data['amount_min']; + $bill->amount_max = $data['amount_max']; + $bill->date = $data['date']; + $bill->transaction_currency_id = $currency->id; + $bill->repeat_freq = $data['repeat_freq']; + $bill->skip = $data['skip']; + $bill->automatch = true; + $bill->active = $data['active'] ?? true; $bill->save(); // update note: if (isset($data['notes'])) { - $this->updateNote($bill, (string)$data['notes']); + $this->updateNote($bill, (string) $data['notes']); } // update rule actions. - $this->updateBillActions($bill, $oldName, $data['name']); + $this->updateBillActions($bill, $oldData['name'], $data['name']); + $this->updateBillTriggers($bill, $oldData, $data); return $bill; } + /** + * @param Bill $bill + * @param array $oldData + * @param array $newData + */ + private function updateBillTriggers(Bill $bill, array $oldData, array $newData): void + { + Log::debug(sprintf('Now in updateBillTriggers(%d, "%s")', $bill->id, $bill->name)); + /** @var BillRepositoryInterface $repository */ + $repository = app(BillRepositoryInterface::class); + $repository->setUser($bill->user); + $rules = $repository->getRulesForBill($bill); + if (0 === $rules->count()) { + Log::debug('Found no rules.'); + + return; + } + Log::debug(sprintf('Found %d rules', $rules->count())); + $fields = [ + 'name' => 'description_contains', + 'amount_min' => 'amount_more', + 'amount_max' => 'amount_less', + 'transaction_currency_name' => 'currency_is']; + foreach ($fields as $field => $ruleTriggerKey) { + if ($oldData[$field] === $newData[$field]) { + Log::debug(sprintf('Field %s is unchanged ("%s"), continue.', $field, $oldData[$field])); + continue; + } + $this->updateRules($rules, $ruleTriggerKey, $oldData[$field], $newData[$field]); + } + + } + + /** + * @param Collection $rules + * @param string $key + * @param string $oldValue + * @param string $newValue + */ + private function updateRules(Collection $rules, string $key, string $oldValue, string $newValue): void + { + /** @var Rule $rule */ + foreach ($rules as $rule) { + $trigger = $this->getRuleTrigger($rule, $key); + if (null !== $trigger && $trigger->trigger_value === $oldValue) { + Log::debug(sprintf('Updated rule trigger #%d from value "%s" to value "%s"', $trigger->id, $oldValue, $newValue)); + $trigger->trigger_value = $newValue; + $trigger->save(); + continue; + } + if (null !== $trigger && $trigger->trigger_value !== $oldValue && in_array($key, ['amount_more', 'amount_less'], true) + && 0 === bccomp($trigger->trigger_value, $oldValue)) { + Log::debug(sprintf('Updated rule trigger #%d from value "%s" to value "%s"', $trigger->id, $oldValue, $newValue)); + $trigger->trigger_value = $newValue; + $trigger->save(); + continue; + } + } + } + + + /** + * @param Rule $rule + * @param string $key + * + * @return RuleTrigger|null + */ + private function getRuleTrigger(Rule $rule, string $key): ?RuleTrigger + { + return $rule->ruleTriggers()->where('trigger_type', $key)->first(); + } } diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index c93febc83b..3d30ca40c8 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -829,6 +829,7 @@ return [ 'skips_over' => 'skips over', 'bill_store_error' => 'An unexpected error occurred while storing your new bill. Please check the log files', 'list_inactive_rule' => 'inactive rule', + 'bill_edit_rules' => 'Firefly III will attempt to edit the :count rule(s) related to this bill as well. If you\'ve edited these rule(s) yourself however, Firefly III won\'t change anything.', // accounts: 'inactive_account_link' => 'You have :count inactive (archived) accounts, which you can view on this separate page.', diff --git a/resources/views/v1/bills/edit.twig b/resources/views/v1/bills/edit.twig index 216b6b7a40..8d00e82cbd 100644 --- a/resources/views/v1/bills/edit.twig +++ b/resources/views/v1/bills/edit.twig @@ -17,7 +17,11 @@

{{ 'mandatoryFields'|_ }}

- {{ ExpandedForm.text('name') }} + {% if rules.count > 0 %} + {{ ExpandedForm.text('name',null, {helpText: trans('firefly.bill_edit_rules', {count: rules.count})}) }} + {% else %} + {{ ExpandedForm.text('name') }} + {% endif %} {{ CurrencyForm.currencyList('transaction_currency_id') }} {{ ExpandedForm.amountNoCurrency('amount_min') }} {{ ExpandedForm.amountNoCurrency('amount_max') }}