From 7af10aca9ef0783dcb576a5670995aa2bcca6581 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 7 Apr 2018 06:20:45 +0200 Subject: [PATCH] Add new action to link a transaction to a bill. --- app/TransactionRules/Actions/LinkToBill.php | 76 +++++++++++++++++++++ app/Validation/FireflyValidator.php | 9 ++- config/firefly.php | 2 + public/js/ff/rules/create-edit.js | 3 + resources/lang/en_US/firefly.php | 2 + 5 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 app/TransactionRules/Actions/LinkToBill.php diff --git a/app/TransactionRules/Actions/LinkToBill.php b/app/TransactionRules/Actions/LinkToBill.php new file mode 100644 index 0000000000..192c01c352 --- /dev/null +++ b/app/TransactionRules/Actions/LinkToBill.php @@ -0,0 +1,76 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\TransactionRules\Actions; + +use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\TransactionType; +use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use Log; + +/** + * Class LinkToBill. + */ +class LinkToBill implements ActionInterface +{ + /** @var RuleAction The rule action */ + private $action; + + /** + * TriggerInterface constructor. + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + + /** + * Set bill to be X. + * + * @param TransactionJournal $journal + * + * @return bool + */ + public function act(TransactionJournal $journal): bool + { + /** @var BillRepositoryInterface $repository */ + $repository = app(BillRepositoryInterface::class); + $billName = (string)$this->action->action_value; + $bill = $repository->findByName($billName); + + if (null !== $bill && $journal->transactionType->type === TransactionType::WITHDRAWAL) { + $journal->bill()->associate($bill); + $journal->save(); + Log::debug(sprintf('RuleAction LinkToBill set the bill of journal #%d to bill #%d ("%s").', $journal->id, $bill->id, $bill->name)); + } + + if (null === $bill) { + Log::error(sprintf('RuleAction LinkToBill could not set the bill of journal #%d to bill "%s": no such bill found!', $journal->id, $billName)); + } + + + return true; + } +} diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index e72472c99d..79b7ced902 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -31,6 +31,7 @@ use FireflyIII\Models\AccountType; use FireflyIII\Models\Budget; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\TransactionType; +use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Services\Password\Verifier; use FireflyIII\TransactionRules\Triggers\TriggerInterface; @@ -254,6 +255,12 @@ class FireflyValidator extends Validator )->count(); return 1 === $count; + case 'link_to_bill': + /** @var BillRepositoryInterface $repository */ + $repository = app(BillRepositoryInterface::class); + $bill = $repository->findByName((string)$value); + + return null !== $bill; case 'invalid': return false; } @@ -275,7 +282,7 @@ class FireflyValidator extends Validator // loop all rule-triggers. // check if rule-value matches the thing. - if (is_array($this->data['rule-trigger'])) { + if (\is_array($this->data['rule-trigger'])) { $name = $this->getRuleTriggerName($index); $value = $this->getRuleTriggerValue($index); diff --git a/config/firefly.php b/config/firefly.php index ccc426ecbd..c23585c017 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -9,6 +9,7 @@ use FireflyIII\TransactionRules\Actions\AppendNotes; use FireflyIII\TransactionRules\Actions\ClearBudget; use FireflyIII\TransactionRules\Actions\ClearCategory; use FireflyIII\TransactionRules\Actions\ClearNotes; +use FireflyIII\TransactionRules\Actions\LinkToBill; use FireflyIII\TransactionRules\Actions\PrependDescription; use FireflyIII\TransactionRules\Actions\PrependNotes; use FireflyIII\TransactionRules\Actions\RemoveAllTags; @@ -354,6 +355,7 @@ return [ 'append_notes' => AppendNotes::class, 'prepend_notes' => PrependNotes::class, 'clear_notes' => ClearNotes::class, + 'link_to_bill' => LinkToBill::class, ], 'rule-actions-text' => [ 'set_category', diff --git a/public/js/ff/rules/create-edit.js b/public/js/ff/rules/create-edit.js index 50e6a7db88..a9b5ed0e86 100644 --- a/public/js/ff/rules/create-edit.js +++ b/public/js/ff/rules/create-edit.js @@ -224,6 +224,9 @@ function updateActionInput(selectList) { case 'set_destination_account': createAutoComplete(input, 'json/all-accounts'); break; + case 'link_to_bill': + createAutoComplete(input, 'json/bills'); + break; default: input.typeahead('destroy'); break; diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 17db817fc3..1113f9e9d1 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -404,6 +404,8 @@ return [ 'rule_action_clear_notes_choice' => 'Remove any notes', 'rule_action_clear_notes' => 'Remove any notes', 'rule_action_set_notes_choice' => 'Set notes to..', + 'rule_action_link_to_bill_choice' => 'Link to a bill..', + 'rule_action_link_to_bill' => 'Link to bill ":action_value"', 'rule_action_set_notes' => 'Set notes to ":action_value"', 'rules_have_read_warning' => 'Have you read the warning?',