diff --git a/app/TransactionRules/Actions/AddTag.php b/app/TransactionRules/Actions/AddTag.php index 057473463c..45da90e91e 100644 --- a/app/TransactionRules/Actions/AddTag.php +++ b/app/TransactionRules/Actions/AddTag.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -29,6 +30,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Factory\TagFactory; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use FireflyIII\User; use Illuminate\Support\Facades\Log; @@ -37,16 +39,18 @@ use Illuminate\Support\Facades\Log; */ class AddTag implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -58,19 +62,20 @@ class AddTag implements ActionInterface /** @var TagFactory $factory */ $factory = app(TagFactory::class); $factory->setUser(User::find($journal['user_id'])); - $tag = $factory->findOrCreate($this->action->action_value); + $tagName = $this->evaluator->evaluate($journal); + $tag = $factory->findOrCreate($tagName); if (null === $tag) { // could not find, could not create tag. - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.find_or_create_tag_failed', ['tag' => $this->action->action_value]))); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.find_or_create_tag_failed', ['tag' => $tagName]))); return false; } $count = DB::table('tag_transaction_journal') - ->where('tag_id', $tag->id) - ->where('transaction_journal_id', $journal['transaction_journal_id']) - ->count(); + ->where('tag_id', $tag->id) + ->where('transaction_journal_id', $journal['transaction_journal_id']) + ->count(); if (0 === $count) { // add to journal: DB::table('tag_transaction_journal')->insert(['tag_id' => $tag->id, 'transaction_journal_id' => $journal['transaction_journal_id']]); @@ -84,7 +89,7 @@ class AddTag implements ActionInterface Log::debug( sprintf('RuleAction AddTag fired but tag %d ("%s") was already added to journal %d.', $tag->id, $tag->tag, $journal['transaction_journal_id']) ); - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.tag_already_added', ['tag' => $this->action->action_value]))); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.tag_already_added', ['tag' => $tagName]))); return false; } diff --git a/app/TransactionRules/Actions/AppendDescription.php b/app/TransactionRules/Actions/AppendDescription.php index 2a52c2cb79..46eef629af 100644 --- a/app/TransactionRules/Actions/AppendDescription.php +++ b/app/TransactionRules/Actions/AppendDescription.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -27,22 +28,25 @@ use DB; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; /** * Class AppendDescription. */ class AppendDescription implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -50,7 +54,8 @@ class AppendDescription implements ActionInterface */ public function actOnArray(array $journal): bool { - $description = sprintf('%s%s', $journal['description'], $this->action->action_value); + $actionValue = $this->evaluator->evaluate($journal); + $description = sprintf('%s%s', $journal['description'], $actionValue); DB::table('transaction_journals')->where('id', $journal['transaction_journal_id'])->limit(1)->update(['description' => $description]); // event for audit log entry diff --git a/app/TransactionRules/Actions/AppendNotes.php b/app/TransactionRules/Actions/AppendNotes.php index 8d130b2521..49d7e6e71f 100644 --- a/app/TransactionRules/Actions/AppendNotes.php +++ b/app/TransactionRules/Actions/AppendNotes.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -27,6 +28,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use Illuminate\Support\Facades\Log; /** @@ -34,16 +36,18 @@ use Illuminate\Support\Facades\Log; */ class AppendNotes implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -51,18 +55,19 @@ class AppendNotes implements ActionInterface */ public function actOnArray(array $journal): bool { + $actionValue = $this->evaluator->evaluate($journal); $dbNote = Note::where('noteable_id', (int)$journal['transaction_journal_id']) - ->where('noteable_type', TransactionJournal::class) - ->first(['notes.*']); + ->where('noteable_type', TransactionJournal::class) + ->first(['notes.*']); if (null === $dbNote) { $dbNote = new Note(); $dbNote->noteable_id = (int)$journal['transaction_journal_id']; $dbNote->noteable_type = TransactionJournal::class; $dbNote->text = ''; } - Log::debug(sprintf('RuleAction AppendNotes appended "%s" to "%s".', $this->action->action_value, $dbNote->text)); + Log::debug(sprintf('RuleAction AppendNotes appended "%s" to "%s".', $actionValue, $dbNote->text)); $before = $dbNote->text; - $text = sprintf('%s%s', $dbNote->text, $this->action->action_value); + $text = sprintf('%s%s', $dbNote->text, $actionValue); $dbNote->text = $text; $dbNote->save(); diff --git a/app/TransactionRules/Actions/ConvertToDeposit.php b/app/TransactionRules/Actions/ConvertToDeposit.php index 36091f7905..bd13cfa406 100644 --- a/app/TransactionRules/Actions/ConvertToDeposit.php +++ b/app/TransactionRules/Actions/ConvertToDeposit.php @@ -1,4 +1,5 @@ action = $action; + $this->evaluator = $evaluator; } /** @@ -61,6 +65,8 @@ class ConvertToDeposit implements ActionInterface */ public function actOnArray(array $journal): bool { + $actionValue = $this->evaluator->evaluate($journal); + // make object from array (so the data is fresh). /** @var TransactionJournal|null $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); @@ -88,7 +94,7 @@ class ConvertToDeposit implements ActionInterface Log::debug('Going to transform a withdrawal to a deposit.'); try { - $res = $this->convertWithdrawalArray($object); + $res = $this->convertWithdrawalArray($object, $actionValue); } catch (JsonException | FireflyException $e) { Log::debug('Could not convert withdrawal to deposit.'); Log::error($e->getMessage()); @@ -129,7 +135,7 @@ class ConvertToDeposit implements ActionInterface * @throws FireflyException * @throws JsonException */ - private function convertWithdrawalArray(TransactionJournal $journal): bool + private function convertWithdrawalArray(TransactionJournal $journal, string $actionValue): bool { $user = $journal->user; // find or create revenue account. @@ -145,7 +151,7 @@ class ConvertToDeposit implements ActionInterface // get the action value, or use the original destination name in case the action value is empty: // this becomes a new or existing (revenue) account, which is the source of the new deposit. - $opposingName = '' === $this->action->action_value ? $destAccount->name : $this->action->action_value; + $opposingName = '' === $actionValue ? $destAccount->name : $actionValue; // we check all possible source account types if one exists: $validTypes = config('firefly.expected_source_types.source.Deposit'); $opposingAccount = $repository->findByName($opposingName, $validTypes); @@ -153,26 +159,26 @@ class ConvertToDeposit implements ActionInterface $opposingAccount = $factory->findOrCreate($opposingName, AccountType::REVENUE); } - Log::debug(sprintf('ConvertToDeposit. Action value is "%s", new opposing name is "%s"', $this->action->action_value, $opposingAccount->name)); + Log::debug(sprintf('ConvertToDeposit. Action value is "%s", new opposing name is "%s"', $actionValue, $opposingAccount->name)); // update the source transaction and put in the new revenue ID. DB::table('transactions') - ->where('transaction_journal_id', '=', $journal->id) - ->where('amount', '<', 0) - ->update(['account_id' => $opposingAccount->id]); + ->where('transaction_journal_id', '=', $journal->id) + ->where('amount', '<', 0) + ->update(['account_id' => $opposingAccount->id]); // update the destination transaction and put in the original source account ID. DB::table('transactions') - ->where('transaction_journal_id', '=', $journal->id) - ->where('amount', '>', 0) - ->update(['account_id' => $sourceAccount->id]); + ->where('transaction_journal_id', '=', $journal->id) + ->where('amount', '>', 0) + ->update(['account_id' => $sourceAccount->id]); // change transaction type of journal: $newType = TransactionType::whereType(TransactionType::DEPOSIT)->first(); DB::table('transaction_journals') - ->where('id', '=', $journal->id) - ->update(['transaction_type_id' => $newType->id, 'bill_id' => null]); + ->where('id', '=', $journal->id) + ->update(['transaction_type_id' => $newType->id, 'bill_id' => null]); Log::debug('Converted withdrawal to deposit.'); @@ -237,7 +243,7 @@ class ConvertToDeposit implements ActionInterface // get the action value, or use the original source name in case the action value is empty: // this becomes a new or existing (revenue) account, which is the source of the new deposit. - $opposingName = '' === $this->action->action_value ? $sourceAccount->name : $this->action->action_value; + $opposingName = '' === $actionValue ? $sourceAccount->name : $actionValue; // we check all possible source account types if one exists: $validTypes = config('firefly.expected_source_types.source.Deposit'); $opposingAccount = $repository->findByName($opposingName, $validTypes); @@ -245,20 +251,20 @@ class ConvertToDeposit implements ActionInterface $opposingAccount = $factory->findOrCreate($opposingName, AccountType::REVENUE); } - Log::debug(sprintf('ConvertToDeposit. Action value is "%s", revenue name is "%s"', $this->action->action_value, $opposingAccount->name)); + Log::debug(sprintf('ConvertToDeposit. Action value is "%s", revenue name is "%s"', $actionValue, $opposingAccount->name)); // update source transaction(s) to be revenue account DB::table('transactions') - ->where('transaction_journal_id', '=', $journal->id) - ->where('amount', '<', 0) - ->update(['account_id' => $opposingAccount->id]); + ->where('transaction_journal_id', '=', $journal->id) + ->where('amount', '<', 0) + ->update(['account_id' => $opposingAccount->id]); // change transaction type of journal: $newType = TransactionType::whereType(TransactionType::DEPOSIT)->first(); DB::table('transaction_journals') - ->where('id', '=', $journal->id) - ->update(['transaction_type_id' => $newType->id, 'bill_id' => null]); + ->where('id', '=', $journal->id) + ->update(['transaction_type_id' => $newType->id, 'bill_id' => null]); Log::debug('Converted transfer to deposit.'); diff --git a/app/TransactionRules/Actions/ConvertToTransfer.php b/app/TransactionRules/Actions/ConvertToTransfer.php index 14fe267fc7..7cd5fd887b 100644 --- a/app/TransactionRules/Actions/ConvertToTransfer.php +++ b/app/TransactionRules/Actions/ConvertToTransfer.php @@ -1,4 +1,5 @@ action = $action; + $this->evaluator = $evaluator; } /** @@ -59,6 +63,8 @@ class ConvertToTransfer implements ActionInterface */ public function actOnArray(array $journal): bool { + $actionValue = $this->evaluator->evaluate($journal); + // make object from array (so the data is fresh). /** @var TransactionJournal|null $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); @@ -103,7 +109,7 @@ class ConvertToTransfer implements ActionInterface $expectedType = $this->getDestinationType($journalId); // Deposit? Replace source with account with same type as destination. } - $opposing = $repository->findByName($this->action->action_value, [$expectedType]); + $opposing = $repository->findByName($actionValue, [$expectedType]); if (null === $opposing) { Log::error( @@ -111,11 +117,11 @@ class ConvertToTransfer implements ActionInterface 'Journal #%d cannot be converted because no valid %s account with name "%s" exists (rule #%d).', $expectedType, $journalId, - $this->action->action_value, + $actionValue, $this->action->rule_id ) ); - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_valid_opposing', ['name' => $this->action->action_value]))); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_valid_opposing', ['name' => $actionValue]))); return false; } @@ -214,16 +220,16 @@ class ConvertToTransfer implements ActionInterface // update destination transaction: DB::table('transactions') - ->where('transaction_journal_id', '=', $journal->id) - ->where('amount', '>', 0) - ->update(['account_id' => $opposing->id]); + ->where('transaction_journal_id', '=', $journal->id) + ->where('amount', '>', 0) + ->update(['account_id' => $opposing->id]); // change transaction type of journal: $newType = TransactionType::whereType(TransactionType::TRANSFER)->first(); DB::table('transaction_journals') - ->where('id', '=', $journal->id) - ->update(['transaction_type_id' => $newType->id, 'bill_id' => null]); + ->where('id', '=', $journal->id) + ->update(['transaction_type_id' => $newType->id, 'bill_id' => null]); Log::debug('Converted withdrawal to transfer.'); @@ -273,16 +279,16 @@ class ConvertToTransfer implements ActionInterface // update source transaction: DB::table('transactions') - ->where('transaction_journal_id', '=', $journal->id) - ->where('amount', '<', 0) - ->update(['account_id' => $opposing->id]); + ->where('transaction_journal_id', '=', $journal->id) + ->where('amount', '<', 0) + ->update(['account_id' => $opposing->id]); // change transaction type of journal: $newType = TransactionType::whereType(TransactionType::TRANSFER)->first(); DB::table('transaction_journals') - ->where('id', '=', $journal->id) - ->update(['transaction_type_id' => $newType->id, 'bill_id' => null]); + ->where('id', '=', $journal->id) + ->update(['transaction_type_id' => $newType->id, 'bill_id' => null]); Log::debug('Converted deposit to transfer.'); diff --git a/app/TransactionRules/Actions/ConvertToWithdrawal.php b/app/TransactionRules/Actions/ConvertToWithdrawal.php index f844e213a0..73b04b0ac8 100644 --- a/app/TransactionRules/Actions/ConvertToWithdrawal.php +++ b/app/TransactionRules/Actions/ConvertToWithdrawal.php @@ -1,4 +1,5 @@ action = $action; + $this->evaluator = $evaluator; } /** @@ -61,6 +65,8 @@ class ConvertToWithdrawal implements ActionInterface */ public function actOnArray(array $journal): bool { + $actionValue = $this->evaluator->evaluate($journal); + // make object from array (so the data is fresh). /** @var TransactionJournal|null $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); @@ -89,7 +95,7 @@ class ConvertToWithdrawal implements ActionInterface if (TransactionType::DEPOSIT === $type) { Log::debug('Going to transform a deposit to a withdrawal.'); try { - $res = $this->convertDepositArray($object); + $res = $this->convertDepositArray($object, $actionValue); } catch (JsonException | FireflyException $e) { Log::debug('Could not convert transfer to deposit.'); Log::error($e->getMessage()); @@ -104,7 +110,7 @@ class ConvertToWithdrawal implements ActionInterface Log::debug('Going to transform a transfer to a withdrawal.'); try { - $res = $this->convertTransferArray($object); + $res = $this->convertTransferArray($object, $actionValue); } catch (JsonException | FireflyException $e) { Log::debug('Could not convert transfer to deposit.'); Log::error($e->getMessage()); @@ -126,7 +132,7 @@ class ConvertToWithdrawal implements ActionInterface * @throws FireflyException * @throws JsonException */ - private function convertDepositArray(TransactionJournal $journal): bool + private function convertDepositArray(TransactionJournal $journal, string $actionValue): bool { $user = $journal->user; /** @var AccountFactory $factory */ @@ -141,7 +147,7 @@ class ConvertToWithdrawal implements ActionInterface // get the action value, or use the original source name in case the action value is empty: // this becomes a new or existing (expense) account, which is the destination of the new withdrawal. - $opposingName = '' === $this->action->action_value ? $sourceAccount->name : $this->action->action_value; + $opposingName = '' === $actionValue ? $sourceAccount->name : $actionValue; // we check all possible source account types if one exists: $validTypes = config('firefly.expected_source_types.destination.Withdrawal'); $opposingAccount = $repository->findByName($opposingName, $validTypes); @@ -149,25 +155,25 @@ class ConvertToWithdrawal implements ActionInterface $opposingAccount = $factory->findOrCreate($opposingName, AccountType::EXPENSE); } - Log::debug(sprintf('ConvertToWithdrawal. Action value is "%s", expense name is "%s"', $this->action->action_value, $opposingName)); + Log::debug(sprintf('ConvertToWithdrawal. Action value is "%s", expense name is "%s"', $actionValue, $opposingName)); // update source transaction(s) to be the original destination account DB::table('transactions') - ->where('transaction_journal_id', '=', $journal->id) - ->where('amount', '<', 0) - ->update(['account_id' => $destAccount->id]); + ->where('transaction_journal_id', '=', $journal->id) + ->where('amount', '<', 0) + ->update(['account_id' => $destAccount->id]); // update destination transaction(s) to be new expense account. DB::table('transactions') - ->where('transaction_journal_id', '=', $journal->id) - ->where('amount', '>', 0) - ->update(['account_id' => $opposingAccount->id]); + ->where('transaction_journal_id', '=', $journal->id) + ->where('amount', '>', 0) + ->update(['account_id' => $opposingAccount->id]); // change transaction type of journal: $newType = TransactionType::whereType(TransactionType::WITHDRAWAL)->first(); DB::table('transaction_journals') - ->where('id', '=', $journal->id) - ->update(['transaction_type_id' => $newType->id]); + ->where('id', '=', $journal->id) + ->update(['transaction_type_id' => $newType->id]); Log::debug('Converted deposit to withdrawal.'); @@ -216,7 +222,7 @@ class ConvertToWithdrawal implements ActionInterface * @throws FireflyException * @throws JsonException */ - private function convertTransferArray(TransactionJournal $journal): bool + private function convertTransferArray(TransactionJournal $journal, string $actionValue): bool { // find or create expense account. $user = $journal->user; @@ -231,7 +237,7 @@ class ConvertToWithdrawal implements ActionInterface // get the action value, or use the original source name in case the action value is empty: // this becomes a new or existing (expense) account, which is the destination of the new withdrawal. - $opposingName = '' === $this->action->action_value ? $destAccount->name : $this->action->action_value; + $opposingName = '' === $actionValue ? $destAccount->name : $actionValue; // we check all possible source account types if one exists: $validTypes = config('firefly.expected_source_types.destination.Withdrawal'); $opposingAccount = $repository->findByName($opposingName, $validTypes); @@ -239,19 +245,19 @@ class ConvertToWithdrawal implements ActionInterface $opposingAccount = $factory->findOrCreate($opposingName, AccountType::EXPENSE); } - Log::debug(sprintf('ConvertToWithdrawal. Action value is "%s", destination name is "%s"', $this->action->action_value, $opposingName)); + Log::debug(sprintf('ConvertToWithdrawal. Action value is "%s", destination name is "%s"', $actionValue, $opposingName)); // update destination transaction(s) to be new expense account. DB::table('transactions') - ->where('transaction_journal_id', '=', $journal->id) - ->where('amount', '>', 0) - ->update(['account_id' => $opposingAccount->id]); + ->where('transaction_journal_id', '=', $journal->id) + ->where('amount', '>', 0) + ->update(['account_id' => $opposingAccount->id]); // change transaction type of journal: $newType = TransactionType::whereType(TransactionType::WITHDRAWAL)->first(); DB::table('transaction_journals') - ->where('id', '=', $journal->id) - ->update(['transaction_type_id' => $newType->id]); + ->where('id', '=', $journal->id) + ->update(['transaction_type_id' => $newType->id]); Log::debug('Converted transfer to withdrawal.'); diff --git a/app/TransactionRules/Actions/LinkToBill.php b/app/TransactionRules/Actions/LinkToBill.php index 74de2eeb41..2b817077c6 100644 --- a/app/TransactionRules/Actions/LinkToBill.php +++ b/app/TransactionRules/Actions/LinkToBill.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -30,6 +31,7 @@ use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use FireflyIII\User; use Illuminate\Support\Facades\Log; @@ -38,7 +40,8 @@ use Illuminate\Support\Facades\Log; */ class LinkToBill implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. @@ -46,9 +49,10 @@ class LinkToBill implements ActionInterface * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -60,12 +64,12 @@ class LinkToBill implements ActionInterface /** @var BillRepositoryInterface $repository */ $repository = app(BillRepositoryInterface::class); $repository->setUser($user); - $billName = (string)$this->action->action_value; + $billName = $this->evaluator->evaluate($journal); $bill = $repository->findByName($billName); if (null !== $bill && $journal['transaction_type_type'] === TransactionType::WITHDRAWAL) { $count = DB::table('transaction_journals')->where('id', '=', $journal['transaction_journal_id']) - ->where('bill_id', $bill->id)->count(); + ->where('bill_id', $bill->id)->count(); if (0 !== $count) { Log::error( sprintf( @@ -80,8 +84,8 @@ class LinkToBill implements ActionInterface DB::table('transaction_journals') - ->where('id', '=', $journal['transaction_journal_id']) - ->update(['bill_id' => $bill->id]); + ->where('id', '=', $journal['transaction_journal_id']) + ->update(['bill_id' => $bill->id]); Log::debug( sprintf('RuleAction LinkToBill set the bill of journal #%d to bill #%d ("%s").', $journal['transaction_journal_id'], $bill->id, $bill->name) ); diff --git a/app/TransactionRules/Actions/PrependDescription.php b/app/TransactionRules/Actions/PrependDescription.php index c116370d9b..ef8a36931c 100644 --- a/app/TransactionRules/Actions/PrependDescription.php +++ b/app/TransactionRules/Actions/PrependDescription.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -27,22 +28,25 @@ use DB; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; /** * Class PrependDescription. */ class PrependDescription implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -50,8 +54,10 @@ class PrependDescription implements ActionInterface */ public function actOnArray(array $journal): bool { + $actionValue = $this->evaluator->evaluate($journal); + $before = $journal['description']; - $after = sprintf('%s%s', $this->action->action_value, $journal['description']); + $after = sprintf('%s%s', $actionValue, $journal['description']); DB::table('transaction_journals')->where('id', $journal['transaction_journal_id'])->limit(1)->update(['description' => $after]); // journal diff --git a/app/TransactionRules/Actions/PrependNotes.php b/app/TransactionRules/Actions/PrependNotes.php index 25534fa25d..9f86739067 100644 --- a/app/TransactionRules/Actions/PrependNotes.php +++ b/app/TransactionRules/Actions/PrependNotes.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -27,6 +28,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use Illuminate\Support\Facades\Log; /** @@ -34,16 +36,18 @@ use Illuminate\Support\Facades\Log; */ class PrependNotes implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -51,9 +55,11 @@ class PrependNotes implements ActionInterface */ public function actOnArray(array $journal): bool { + $actionValue = $this->evaluator->evaluate($journal); + $dbNote = Note::where('noteable_id', (int)$journal['transaction_journal_id']) - ->where('noteable_type', TransactionJournal::class) - ->first(['notes.*']); + ->where('noteable_type', TransactionJournal::class) + ->first(['notes.*']); if (null === $dbNote) { $dbNote = new Note(); $dbNote->noteable_id = (int)$journal['transaction_journal_id']; @@ -61,8 +67,8 @@ class PrependNotes implements ActionInterface $dbNote->text = ''; } $before = $dbNote->text; - Log::debug(sprintf('RuleAction PrependNotes prepended "%s" to "%s".', $this->action->action_value, $dbNote->text)); - $text = sprintf('%s%s', $this->action->action_value, $dbNote->text); + Log::debug(sprintf('RuleAction PrependNotes prepended "%s" to "%s".', $actionValue, $dbNote->text)); + $text = sprintf('%s%s', $actionValue, $dbNote->text); $dbNote->text = $text; $dbNote->save(); diff --git a/app/TransactionRules/Actions/RemoveTag.php b/app/TransactionRules/Actions/RemoveTag.php index f3f23ad9e9..b67a10aaa4 100644 --- a/app/TransactionRules/Actions/RemoveTag.php +++ b/app/TransactionRules/Actions/RemoveTag.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -28,6 +29,7 @@ use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use FireflyIII\User; use Illuminate\Support\Facades\Log; @@ -36,16 +38,18 @@ use Illuminate\Support\Facades\Log; */ class RemoveTag implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -54,7 +58,7 @@ class RemoveTag implements ActionInterface public function actOnArray(array $journal): bool { // if tag does not exist, no need to continue: - $name = $this->action->action_value; + $name = $this->evaluator->evaluate($journal); $user = User::find($journal['user_id']); $tag = $user->tags()->where('tag', $name)->first(); @@ -76,9 +80,9 @@ class RemoveTag implements ActionInterface Log::debug(sprintf('RuleAction RemoveTag removed tag #%d ("%s") from journal #%d.', $tag->id, $tag->tag, $journal['transaction_journal_id'])); DB::table('tag_transaction_journal') - ->where('transaction_journal_id', $journal['transaction_journal_id']) - ->where('tag_id', $tag->id) - ->delete(); + ->where('transaction_journal_id', $journal['transaction_journal_id']) + ->where('tag_id', $tag->id) + ->delete(); /** @var TransactionJournal $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); diff --git a/app/TransactionRules/Actions/SetBudget.php b/app/TransactionRules/Actions/SetBudget.php index 1dbdc54c18..9a88f49257 100644 --- a/app/TransactionRules/Actions/SetBudget.php +++ b/app/TransactionRules/Actions/SetBudget.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -29,6 +30,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use FireflyIII\User; use Illuminate\Support\Facades\Log; @@ -37,16 +39,18 @@ use Illuminate\Support\Facades\Log; */ class SetBudget implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -55,7 +59,7 @@ class SetBudget implements ActionInterface public function actOnArray(array $journal): bool { $user = User::find($journal['user_id']); - $search = $this->action->action_value; + $search = $this->evaluator->evaluate($journal); $budget = $user->budgets()->where('name', $search)->first(); if (null === $budget) { diff --git a/app/TransactionRules/Actions/SetCategory.php b/app/TransactionRules/Actions/SetCategory.php index 30608a3f11..a4ed08d7d6 100644 --- a/app/TransactionRules/Actions/SetCategory.php +++ b/app/TransactionRules/Actions/SetCategory.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -29,6 +30,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Factory\CategoryFactory; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use FireflyIII\User; use Illuminate\Support\Facades\Log; @@ -37,16 +39,18 @@ use Illuminate\Support\Facades\Log; */ class SetCategory implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -55,7 +59,7 @@ class SetCategory implements ActionInterface public function actOnArray(array $journal): bool { $user = User::find($journal['user_id']); - $search = $this->action->action_value; + $search = $this->evaluator->evaluate($journal); if (null === $user) { Log::error(sprintf('Journal has no valid user ID so action SetCategory("%s") cannot be applied', $search), $journal); event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_such_journal'))); diff --git a/app/TransactionRules/Actions/SetDescription.php b/app/TransactionRules/Actions/SetDescription.php index 26e3a2be9d..799a02ed70 100644 --- a/app/TransactionRules/Actions/SetDescription.php +++ b/app/TransactionRules/Actions/SetDescription.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -27,6 +28,7 @@ use DB; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use Illuminate\Support\Facades\Log; /** @@ -34,16 +36,18 @@ use Illuminate\Support\Facades\Log; */ class SetDescription implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -53,22 +57,23 @@ class SetDescription implements ActionInterface { /** @var TransactionJournal $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); - $before = $object->description; + $before = $journal['description']; + $after = $this->evaluator->evaluate($journal); DB::table('transaction_journals') - ->where('id', '=', $journal['transaction_journal_id']) - ->update(['description' => $this->action->action_value]); + ->where('id', '=', $journal['transaction_journal_id']) + ->update(['description' => $after]); Log::debug( sprintf( 'RuleAction SetDescription changed the description of journal #%d from "%s" to "%s".', $journal['transaction_journal_id'], - $journal['description'], - $this->action->action_value + $before, + $after ) ); $object->refresh(); - event(new TriggeredAuditLog($this->action->rule, $object, 'update_description', $before, $this->action->action_value)); + event(new TriggeredAuditLog($this->action->rule, $object, 'update_description', $before, $after)); return true; } diff --git a/app/TransactionRules/Actions/SetDestinationAccount.php b/app/TransactionRules/Actions/SetDestinationAccount.php index 1daa030c64..e4c2688831 100644 --- a/app/TransactionRules/Actions/SetDestinationAccount.php +++ b/app/TransactionRules/Actions/SetDestinationAccount.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -32,6 +33,7 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use FireflyIII\User; use Illuminate\Support\Facades\Log; @@ -41,6 +43,7 @@ use Illuminate\Support\Facades\Log; class SetDestinationAccount implements ActionInterface { private RuleAction $action; + private ActionExpressionEvaluator $evaluator; private AccountRepositoryInterface $repository; /** @@ -48,9 +51,10 @@ class SetDestinationAccount implements ActionInterface * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -58,6 +62,7 @@ class SetDestinationAccount implements ActionInterface */ public function actOnArray(array $journal): bool { + $accountName = $this->evaluator->evaluate($journal); $user = User::find($journal['user_id']); $type = $journal['transaction_type_type']; /** @var TransactionJournal|null $object */ @@ -73,16 +78,16 @@ class SetDestinationAccount implements ActionInterface $this->repository->setUser($user); // if this is a transfer or a deposit, the new destination account must be an asset account or a default account, and it MUST exist: - $newAccount = $this->findAssetAccount($type); + $newAccount = $this->findAssetAccount($type, $accountName); if ((TransactionType::DEPOSIT === $type || TransactionType::TRANSFER === $type) && null === $newAccount) { Log::error( sprintf( 'Cant change destination account of journal #%d because no asset account with name "%s" exists.', $object->id, - $this->action->action_value + $accountName ) ); - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_asset', ['name' => $this->action->action_value]))); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_asset', ['name' => $accountName]))); return false; } @@ -116,7 +121,7 @@ class SetDestinationAccount implements ActionInterface // if this is a withdrawal, the new destination account must be a expense account and may be created: // or it is a liability, in which case it must be returned. if (TransactionType::WITHDRAWAL === $type) { - $newAccount = $this->findWithdrawalDestinationAccount(); + $newAccount = $this->findWithdrawalDestinationAccount($accountName); } Log::debug(sprintf('New destination account is #%d ("%s").', $newAccount->id, $newAccount->name)); @@ -125,9 +130,9 @@ class SetDestinationAccount implements ActionInterface // update destination transaction with new destination account: DB::table('transactions') - ->where('transaction_journal_id', '=', $object->id) - ->where('amount', '>', 0) - ->update(['account_id' => $newAccount->id]); + ->where('transaction_journal_id', '=', $object->id) + ->where('amount', '>', 0) + ->update(['account_id' => $newAccount->id]); Log::debug(sprintf('Updated journal #%d (group #%d) and gave it new destination account ID.', $object->id, $object->transaction_group_id)); @@ -139,26 +144,26 @@ class SetDestinationAccount implements ActionInterface * * @return Account|null */ - private function findAssetAccount(string $type): ?Account + private function findAssetAccount(string $type, string $accountName): ?Account { // switch on type: $allowed = config(sprintf('firefly.expected_source_types.destination.%s', $type)); $allowed = is_array($allowed) ? $allowed : []; Log::debug(sprintf('Check config for expected_source_types.destination.%s, result is', $type), $allowed); - return $this->repository->findByName($this->action->action_value, $allowed); + return $this->repository->findByName($accountName, $allowed); } /** * @return Account */ - private function findWithdrawalDestinationAccount(): Account + private function findWithdrawalDestinationAccount(string $accountName): Account { $allowed = config('firefly.expected_source_types.destination.Withdrawal'); - $account = $this->repository->findByName($this->action->action_value, $allowed); + $account = $this->repository->findByName($accountName, $allowed); if (null === $account) { $data = [ - 'name' => $this->action->action_value, + 'name' => $accountName, 'account_type_name' => 'expense', 'account_type_id' => null, 'virtual_balance' => 0, diff --git a/app/TransactionRules/Actions/SetNotes.php b/app/TransactionRules/Actions/SetNotes.php index a1874c241c..28926ba319 100644 --- a/app/TransactionRules/Actions/SetNotes.php +++ b/app/TransactionRules/Actions/SetNotes.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -27,6 +28,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use Illuminate\Support\Facades\Log; /** @@ -34,16 +36,18 @@ use Illuminate\Support\Facades\Log; */ class SetNotes implements ActionInterface { - private RuleACtion $action; + private RuleACtion $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -52,7 +56,7 @@ class SetNotes implements ActionInterface public function actOnArray(array $journal): bool { $dbNote = Note::where('noteable_id', $journal['transaction_journal_id']) - ->where('noteable_type', TransactionJournal::class)->first(); + ->where('noteable_type', TransactionJournal::class)->first(); if (null === $dbNote) { $dbNote = new Note(); $dbNote->noteable_id = $journal['transaction_journal_id']; @@ -60,7 +64,8 @@ class SetNotes implements ActionInterface $dbNote->text = ''; } $oldNotes = $dbNote->text; - $dbNote->text = $this->action->action_value; + $newNotes = $this->evaluator->evaluate($journal); + $dbNote->text = $newNotes; $dbNote->save(); Log::debug( @@ -68,14 +73,14 @@ class SetNotes implements ActionInterface 'RuleAction SetNotes changed the notes of journal #%d from "%s" to "%s".', $journal['transaction_journal_id'], $oldNotes, - $this->action->action_value + $newNotes ) ); /** @var TransactionJournal $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); - event(new TriggeredAuditLog($this->action->rule, $object, 'update_notes', $oldNotes, $this->action->action_value)); + event(new TriggeredAuditLog($this->action->rule, $object, 'update_notes', $oldNotes, $newNotes)); return true; } diff --git a/app/TransactionRules/Actions/SetSourceAccount.php b/app/TransactionRules/Actions/SetSourceAccount.php index 724b47b986..8a2e1c326b 100644 --- a/app/TransactionRules/Actions/SetSourceAccount.php +++ b/app/TransactionRules/Actions/SetSourceAccount.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; @@ -32,6 +33,7 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use FireflyIII\User; use Illuminate\Support\Facades\Log; @@ -41,6 +43,7 @@ use Illuminate\Support\Facades\Log; class SetSourceAccount implements ActionInterface { private RuleAction $action; + private ActionExpressionEvaluator $evaluator; private AccountRepositoryInterface $repository; /** @@ -48,9 +51,10 @@ class SetSourceAccount implements ActionInterface * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -60,6 +64,7 @@ class SetSourceAccount implements ActionInterface { $user = User::find($journal['user_id']); $type = $journal['transaction_type_type']; + $name = $this->evaluator->evaluate($journal); /** @var TransactionJournal|null $object */ $object = $user->transactionJournals()->find((int)$journal['transaction_journal_id']); $this->repository = app(AccountRepositoryInterface::class); @@ -72,12 +77,12 @@ class SetSourceAccount implements ActionInterface $this->repository->setUser($user); // if this is a transfer or a withdrawal, the new source account must be an asset account or a default account, and it MUST exist: - $newAccount = $this->findAssetAccount($type); + $newAccount = $this->findAssetAccount($type, $name); if ((TransactionType::WITHDRAWAL === $type || TransactionType::TRANSFER === $type) && null === $newAccount) { Log::error( - sprintf('Cant change source account of journal #%d because no asset account with name "%s" exists.', $object->id, $this->action->action_value) + sprintf('Cant change source account of journal #%d because no asset account with name "%s" exists.', $object->id, $name) ); - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_asset', ['name' => $this->action->action_value]))); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_asset', ['name' => $name]))); return false; } @@ -110,16 +115,16 @@ class SetSourceAccount implements ActionInterface // if this is a deposit, the new source account must be a revenue account and may be created: // or it's a liability if (TransactionType::DEPOSIT === $type) { - $newAccount = $this->findDepositSourceAccount(); + $newAccount = $this->findDepositSourceAccount($name); } Log::debug(sprintf('New source account is #%d ("%s").', $newAccount->id, $newAccount->name)); // update source transaction with new source account: DB::table('transactions') - ->where('transaction_journal_id', '=', $object->id) - ->where('amount', '<', 0) - ->update(['account_id' => $newAccount->id]); + ->where('transaction_journal_id', '=', $object->id) + ->where('amount', '<', 0) + ->update(['account_id' => $newAccount->id]); event(new TriggeredAuditLog($this->action->rule, $object, 'set_source', null, $newAccount->name)); @@ -133,27 +138,27 @@ class SetSourceAccount implements ActionInterface * * @return Account|null */ - private function findAssetAccount(string $type): ?Account + private function findAssetAccount(string $type, string $name): ?Account { // switch on type: $allowed = config(sprintf('firefly.expected_source_types.source.%s', $type)); $allowed = is_array($allowed) ? $allowed : []; Log::debug(sprintf('Check config for expected_source_types.source.%s, result is', $type), $allowed); - return $this->repository->findByName($this->action->action_value, $allowed); + return $this->repository->findByName($name, $allowed); } /** * @return Account */ - private function findDepositSourceAccount(): Account + private function findDepositSourceAccount(string $name): Account { $allowed = config('firefly.expected_source_types.source.Deposit'); - $account = $this->repository->findByName($this->action->action_value, $allowed); + $account = $this->repository->findByName($name, $allowed); if (null === $account) { // create new revenue account with this name: $data = [ - 'name' => $this->action->action_value, + 'name' => $name, 'account_type_name' => 'revenue', 'account_type_id' => null, 'virtual_balance' => 0, diff --git a/app/TransactionRules/Actions/UpdatePiggybank.php b/app/TransactionRules/Actions/UpdatePiggybank.php index c0699f258d..faab1c7f6c 100644 --- a/app/TransactionRules/Actions/UpdatePiggybank.php +++ b/app/TransactionRules/Actions/UpdatePiggybank.php @@ -32,6 +32,7 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; +use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; use FireflyIII\User; use Illuminate\Support\Facades\Log; @@ -40,16 +41,18 @@ use Illuminate\Support\Facades\Log; */ class UpdatePiggybank implements ActionInterface { - private RuleAction $action; + private RuleAction $action; + private ActionExpressionEvaluator $evaluator; /** * TriggerInterface constructor. * * @param RuleAction $action */ - public function __construct(RuleAction $action) + public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) { $this->action = $action; + $this->evaluator = $evaluator; } /** @@ -59,18 +62,19 @@ class UpdatePiggybank implements ActionInterface { Log::debug(sprintf('Triggered rule action UpdatePiggybank on journal #%d', $journal['transaction_journal_id'])); + $piggyBankName = $this->evaluator->evaluate($journal); // refresh the transaction type. $user = User::find($journal['user_id']); /** @var TransactionJournal $journalObj */ $journalObj = $user->transactionJournals()->find($journal['transaction_journal_id']); $type = TransactionType::find((int)$journalObj->transaction_type_id); - $piggyBank = $this->findPiggyBank($user); + $piggyBank = $this->findPiggyBank($user, $piggyBankName); if (null === $piggyBank) { Log::info( - sprintf('No piggy bank named "%s", cant execute action #%d of rule #%d', $this->action->action_value, $this->action->id, $this->action->rule_id) + sprintf('No piggy bank named "%s", cant execute action #%d of rule #%d', $piggyBankName, $this->action->id, $this->action->rule_id) ); - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_piggy', ['name' => $this->action->action_value]))); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_piggy', ['name' => $piggyBankName]))); return false; } @@ -130,7 +134,7 @@ class UpdatePiggybank implements ActionInterface $destination->account_id ) ); - event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_link_piggy', ['name' => $this->action->action_value]))); + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_link_piggy', ['name' => $piggyBankName]))); return false; } @@ -139,9 +143,9 @@ class UpdatePiggybank implements ActionInterface * * @return PiggyBank|null */ - private function findPiggyBank(User $user): ?PiggyBank + private function findPiggyBank(User $user, string $name): ?PiggyBank { - return $user->piggyBanks()->where('piggy_banks.name', $this->action->action_value)->first(); + return $user->piggyBanks()->where('piggy_banks.name', $name)->first(); } /**