diff --git a/app/Events/Model/Rule/RuleActionFailedOnObject.php b/app/Events/Model/Rule/RuleActionFailedOnObject.php new file mode 100644 index 0000000000..ffb8d45da9 --- /dev/null +++ b/app/Events/Model/Rule/RuleActionFailedOnObject.php @@ -0,0 +1,53 @@ +. + */ + +namespace FireflyIII\Events\Model\Rule; + +use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; +use Illuminate\Queue\SerializesModels; + +/** + * Class RuleActionFailedOnObject + */ +class RuleActionFailedOnObject +{ + use SerializesModels; + + public string $error; + public TransactionJournal $journal; + public RuleAction $ruleAction; + + /** + * @param RuleAction $ruleAction + * @param TransactionJournal $journal + * @param string $error + */ + public function __construct(RuleAction $ruleAction, TransactionJournal $journal, string $error) + { + app('log')->debug('Created new RuleActionFailedOnObject'); + $this->ruleAction = $ruleAction; + $this->journal = $journal; + $this->error = $error; + } +} diff --git a/app/Handlers/Events/Model/RuleHandler.php b/app/Handlers/Events/Model/RuleHandler.php index 60f33d64e2..bbf63f33f7 100644 --- a/app/Handlers/Events/Model/RuleHandler.php +++ b/app/Handlers/Events/Model/RuleHandler.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Handlers\Events\Model; use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnObject; use FireflyIII\Notifications\User\RuleActionFailed; use Illuminate\Support\Facades\Notification; @@ -37,7 +38,7 @@ class RuleHandler * * @return void */ - public function ruleActionFailed(RuleActionFailedOnArray $event): void + public function ruleActionFailedOnArray(RuleActionFailedOnArray $event): void { app('log')->debug('Now in ruleActionFailed'); $ruleAction = $event->ruleAction; @@ -54,6 +55,31 @@ class RuleHandler $params = [$mainMessage, $groupTitle, $groupLink, $ruleTitle, $ruleLink]; + Notification::send($user, new RuleActionFailed($params)); + } + + /** + * @param RuleActionFailedOnObject $event + * + * @return void + */ + public function ruleActionFailedOnObject(RuleActionFailedOnObject $event): void + { + app('log')->debug('Now in ruleActionFailed'); + $ruleAction = $event->ruleAction; + $rule = $ruleAction->rule; + $journal = $event->journal; + $error = $event->error; + $user = $ruleAction->rule->user; + + $mainMessage = trans('rules.main_message', ['rule' => $rule->title, 'action' => $ruleAction->action_type, 'group' => $journal->transaction_group_id, 'error' => $error]); + $groupTitle = $journal->description ?? ''; + $groupLink = route('transactions.show', [$journal->transaction_group_id]); + $ruleTitle = $rule->title; + $ruleLink = route('rules.edit', [$rule->id]); + $params = [$mainMessage, $groupTitle, $groupLink, $ruleTitle, $ruleLink]; + + Notification::send($user, new RuleActionFailed($params)); } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 8ed72a2bd7..8ae53d9a93 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -33,6 +33,7 @@ use FireflyIII\Events\Model\BudgetLimit\Created; use FireflyIII\Events\Model\BudgetLimit\Deleted; use FireflyIII\Events\Model\BudgetLimit\Updated; use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnObject; use FireflyIII\Events\NewVersionAvailable; use FireflyIII\Events\RegisteredUser; use FireflyIII\Events\RequestedNewPassword; @@ -173,7 +174,10 @@ class EventServiceProvider extends ServiceProvider // rule actions RuleActionFailedOnArray::class => [ - 'FireflyIII\Handlers\Events\Model\RuleHandler@ruleActionFailed', + 'FireflyIII\Handlers\Events\Model\RuleHandler@ruleActionFailedOnArray', + ], + RuleActionFailedOnObject::class => [ + 'FireflyIII\Handlers\Events\Model\RuleHandler@ruleActionFailedOnObject', ], ]; diff --git a/app/TransactionRules/Actions/AppendNotesToDescription.php b/app/TransactionRules/Actions/AppendNotesToDescription.php index 0762b11850..93469788a8 100644 --- a/app/TransactionRules/Actions/AppendNotesToDescription.php +++ b/app/TransactionRules/Actions/AppendNotesToDescription.php @@ -82,7 +82,7 @@ class AppendNotesToDescription implements ActionInterface return true; } - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.new_notes_empty'))); return false; } diff --git a/app/TransactionRules/Actions/ConvertToDeposit.php b/app/TransactionRules/Actions/ConvertToDeposit.php index 273744c069..36091f7905 100644 --- a/app/TransactionRules/Actions/ConvertToDeposit.php +++ b/app/TransactionRules/Actions/ConvertToDeposit.php @@ -115,7 +115,7 @@ class ConvertToDeposit implements ActionInterface return $res; } - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.unsupported_transaction_type_deposit', ['type' => $type]))); return false; } diff --git a/app/TransactionRules/Actions/ConvertToTransfer.php b/app/TransactionRules/Actions/ConvertToTransfer.php index d64abdfdd5..14fe267fc7 100644 --- a/app/TransactionRules/Actions/ConvertToTransfer.php +++ b/app/TransactionRules/Actions/ConvertToTransfer.php @@ -25,6 +25,7 @@ namespace FireflyIII\TransactionRules\Actions; use DB; use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnObject; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; @@ -84,12 +85,15 @@ class ConvertToTransfer implements ActionInterface return false; } + if (TransactionType::DEPOSIT !== $type && TransactionType::WITHDRAWAL !== $type) { + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.unsupported_transaction_type_transfer', ['type' => $type]))); + return false; + } // find the asset account in the action value. /** @var AccountRepositoryInterface $repository */ $repository = app(AccountRepositoryInterface::class); $repository->setUser($user); - $opposing = null; $expectedType = null; if (TransactionType::WITHDRAWAL === $type) { $expectedType = $this->getSourceType($journalId); @@ -126,7 +130,9 @@ class ConvertToTransfer implements ActionInterface event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.complex_error'))); return false; } - event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::WITHDRAWAL, TransactionType::TRANSFER)); + if (false !== $res) { + event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::WITHDRAWAL, TransactionType::TRANSFER)); + } return $res; } if (TransactionType::DEPOSIT === $type) { @@ -139,10 +145,12 @@ class ConvertToTransfer implements ActionInterface event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.complex_error'))); return false; } - event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::DEPOSIT, TransactionType::TRANSFER)); + if (false !== $res) { + event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::DEPOSIT, TransactionType::TRANSFER)); + } return $res; } - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.unsupported_transaction_type_transfer', ['type' => $type]))); return false; } @@ -173,7 +181,6 @@ class ConvertToTransfer implements ActionInterface $journal = TransactionJournal::find($journalId); if (null === $journal) { Log::error(sprintf('Journal #%d does not exist. Cannot convert to transfer.', $journalId)); - // TODO introduce error return ''; } return (string)$journal->transactions()->where('amount', '>', 0)->first()?->account?->accountType?->type; @@ -200,7 +207,7 @@ class ConvertToTransfer implements ActionInterface [$journal->id, $opposing->name, $this->action->rule_id] ) ); - // TODO introduce error + event(new RuleActionFailedOnObject($this->action, $journal, trans('rules.already_has_source_asset', ['name' => $opposing->name]))); return false; } @@ -259,7 +266,7 @@ class ConvertToTransfer implements ActionInterface [$journal->id, $opposing->name, $this->action->rule_id] ) ); - // TODO introduce error + event(new RuleActionFailedOnObject($this->action, $journal, trans('rules.already_has_destination_asset', ['name' => $opposing->name]))); return false; } diff --git a/app/TransactionRules/Actions/ConvertToWithdrawal.php b/app/TransactionRules/Actions/ConvertToWithdrawal.php index 4c15cd551e..f844e213a0 100644 --- a/app/TransactionRules/Actions/ConvertToWithdrawal.php +++ b/app/TransactionRules/Actions/ConvertToWithdrawal.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Factory\AccountFactory; @@ -65,23 +66,26 @@ class ConvertToWithdrawal implements ActionInterface $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); if (null === $object) { Log::error(sprintf('Cannot find journal #%d, cannot convert to withdrawal.', $journal['transaction_journal_id'])); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.journal_not_found'))); return false; } $groupCount = TransactionJournal::where('transaction_group_id', $journal['transaction_group_id'])->count(); if ($groupCount > 1) { Log::error(sprintf('Group #%d has more than one transaction in it, cannot convert to withdrawal.', $journal['transaction_group_id'])); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.split_group'))); return false; } $type = $object->transactionType->type; if (TransactionType::WITHDRAWAL === $type) { Log::error(sprintf('Journal #%d is already a withdrawal (rule #%d).', $journal['transaction_journal_id'], $this->action->rule_id)); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.is_already_withdrawal'))); + return false; + } + if (TransactionType::DEPOSIT !== $type && TransactionType::TRANSFER !== $type) { + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.unsupported_transaction_type_withdrawal', ['type' => $type]))); return false; } - if (TransactionType::DEPOSIT === $type) { Log::debug('Going to transform a deposit to a withdrawal.'); try { @@ -89,7 +93,7 @@ class ConvertToWithdrawal implements ActionInterface } catch (JsonException | FireflyException $e) { Log::debug('Could not convert transfer to deposit.'); Log::error($e->getMessage()); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.complex_error'))); return false; } event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::DEPOSIT, TransactionType::WITHDRAWAL)); @@ -104,14 +108,14 @@ class ConvertToWithdrawal implements ActionInterface } catch (JsonException | FireflyException $e) { Log::debug('Could not convert transfer to deposit.'); Log::error($e->getMessage()); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.complex_error'))); return false; } event(new TriggeredAuditLog($this->action->rule, $object, 'update_transaction_type', TransactionType::TRANSFER, TransactionType::WITHDRAWAL)); return $res; } - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.unsupported_transaction_type_withdrawal', ['type' => $type]))); return false; } diff --git a/app/TransactionRules/Actions/LinkToBill.php b/app/TransactionRules/Actions/LinkToBill.php index fb61479982..74de2eeb41 100644 --- a/app/TransactionRules/Actions/LinkToBill.php +++ b/app/TransactionRules/Actions/LinkToBill.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -73,7 +74,7 @@ class LinkToBill implements ActionInterface $billName ) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.already_linked_to_subscription', ['name' => $billName]))); return false; } @@ -98,7 +99,7 @@ class LinkToBill implements ActionInterface $billName ) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_subscription', ['name' => $billName]))); return false; } } diff --git a/app/TransactionRules/Actions/MoveDescriptionToNotes.php b/app/TransactionRules/Actions/MoveDescriptionToNotes.php index ba543c6dea..9d17dd8ae2 100644 --- a/app/TransactionRules/Actions/MoveDescriptionToNotes.php +++ b/app/TransactionRules/Actions/MoveDescriptionToNotes.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; @@ -57,7 +58,7 @@ class MoveDescriptionToNotes implements ActionInterface $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); if (null === $object) { Log::error(sprintf('No journal #%d belongs to user #%d.', $journal['transaction_journal_id'], $journal['user_id'])); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.journal_other_user'))); return false; } $note = $object->notes()->first(); diff --git a/app/TransactionRules/Actions/MoveNotesToDescription.php b/app/TransactionRules/Actions/MoveNotesToDescription.php index 6ef71dac21..8ce108aa02 100644 --- a/app/TransactionRules/Actions/MoveNotesToDescription.php +++ b/app/TransactionRules/Actions/MoveNotesToDescription.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -63,19 +64,19 @@ class MoveNotesToDescription implements ActionInterface $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); if (null === $object) { Log::error(sprintf('No journal #%d belongs to user #%d.', $journal['transaction_journal_id'], $journal['user_id'])); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.journal_other_user'))); return false; } $note = $object->notes()->first(); if (null === $note) { + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_notes_to_move'))); // nothing to move, return null - // TODO introduce error return false; } if ('' === $note->text) { // nothing to move, return null $note->delete(); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_notes_to_move'))); return false; } $before = $object->description; diff --git a/app/TransactionRules/Actions/RemoveAllTags.php b/app/TransactionRules/Actions/RemoveAllTags.php index 8a4b29286b..87ccbe0b2f 100644 --- a/app/TransactionRules/Actions/RemoveAllTags.php +++ b/app/TransactionRules/Actions/RemoveAllTags.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -55,7 +56,7 @@ class RemoveAllTags implements ActionInterface $count = DB::table('tag_transaction_journal')->where('transaction_journal_id', $journal['transaction_journal_id'])->count(); if (0 === $count) { Log::debug(sprintf('RuleAction RemoveAllTags, journal #%d has no tags.', $journal['transaction_journal_id'])); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_tags_to_remove'))); return false; } Log::debug(sprintf('RuleAction RemoveAllTags removed all tags from journal %d.', $journal['transaction_journal_id'])); diff --git a/app/TransactionRules/Actions/RemoveTag.php b/app/TransactionRules/Actions/RemoveTag.php index 9c0e6bbf7d..f3f23ad9e9 100644 --- a/app/TransactionRules/Actions/RemoveTag.php +++ b/app/TransactionRules/Actions/RemoveTag.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -61,7 +62,7 @@ class RemoveTag implements ActionInterface Log::debug( sprintf('RuleAction RemoveTag tried to remove tag "%s" from journal #%d but no such tag exists.', $name, $journal['transaction_journal_id']) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_tag', ['tag' => $name]))); return false; } $count = DB::table('tag_transaction_journal')->where('transaction_journal_id', $journal['transaction_journal_id'])->where('tag_id', $tag->id)->count(); @@ -69,7 +70,7 @@ class RemoveTag implements ActionInterface Log::debug( sprintf('RuleAction RemoveTag tried to remove tag "%s" from journal #%d but no such tag is linked.', $name, $journal['transaction_journal_id']) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_unlink_tag', ['tag' => $name]))); return false; } diff --git a/app/TransactionRules/Actions/SetBudget.php b/app/TransactionRules/Actions/SetBudget.php index f14c1b9dfa..ed48a2cea5 100644 --- a/app/TransactionRules/Actions/SetBudget.php +++ b/app/TransactionRules/Actions/SetBudget.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -65,7 +66,7 @@ class SetBudget implements ActionInterface $search ) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_budget', ['name' => $search]))); return false; } @@ -78,7 +79,7 @@ class SetBudget implements ActionInterface $journal['transaction_type_type'] ) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_set_budget', ['type' => $journal['transaction_type_type'], 'name' => $search]))); return false; } diff --git a/app/TransactionRules/Actions/SetCategory.php b/app/TransactionRules/Actions/SetCategory.php index da2ab40e58..1277d1e2ce 100644 --- a/app/TransactionRules/Actions/SetCategory.php +++ b/app/TransactionRules/Actions/SetCategory.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Factory\CategoryFactory; use FireflyIII\Models\RuleAction; @@ -57,7 +58,7 @@ class SetCategory implements ActionInterface $search = $this->action->action_value; if (null === $user) { Log::error(sprintf('Journal has no valid user ID so action SetCategory("%s") cannot be applied', $search), $journal); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_such_journal'))); return false; } @@ -73,7 +74,7 @@ class SetCategory implements ActionInterface $search ) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_category', ['name' => $search]))); return false; } diff --git a/app/TransactionRules/Actions/SetDestinationAccount.php b/app/TransactionRules/Actions/SetDestinationAccount.php index 5cd65f2ea4..1daa030c64 100644 --- a/app/TransactionRules/Actions/SetDestinationAccount.php +++ b/app/TransactionRules/Actions/SetDestinationAccount.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Account; use FireflyIII\Models\RuleAction; @@ -65,7 +66,7 @@ class SetDestinationAccount implements ActionInterface if (null === $object) { Log::error('Could not find journal.'); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_such_journal'))); return false; } $type = $object->transactionType->type; @@ -81,7 +82,7 @@ class SetDestinationAccount implements ActionInterface $this->action->action_value ) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_asset', ['name' => $this->action->action_value]))); return false; } @@ -90,13 +91,13 @@ class SetDestinationAccount implements ActionInterface $source = $object->transactions()->where('amount', '<', 0)->first(); if (null === $source) { Log::error('Could not find source transaction.'); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_source_transaction'))); return false; } // account must not be deleted (in the meantime): if (null === $source->account) { Log::error('Could not find source transaction account.'); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_source_transaction_account'))); return false; } if (null !== $newAccount && (int)$newAccount->id === (int)$source->account_id) { @@ -107,7 +108,8 @@ class SetDestinationAccount implements ActionInterface $source->account_id ) ); - // TODO introduce error + + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.already_has_destination', ['name' => $newAccount->name]))); return false; } diff --git a/app/TransactionRules/Actions/SetSourceAccount.php b/app/TransactionRules/Actions/SetSourceAccount.php index 8e39b70ea3..724b47b986 100644 --- a/app/TransactionRules/Actions/SetSourceAccount.php +++ b/app/TransactionRules/Actions/SetSourceAccount.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Account; use FireflyIII\Models\RuleAction; @@ -64,7 +65,7 @@ class SetSourceAccount implements ActionInterface $this->repository = app(AccountRepositoryInterface::class); if (null === $object) { Log::error('Could not find journal.'); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_such_journal'))); return false; } $type = $object->transactionType->type; @@ -76,7 +77,7 @@ class SetSourceAccount implements ActionInterface Log::error( sprintf('Cant change source account of journal #%d because no asset account with name "%s" exists.', $object->id, $this->action->action_value) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_asset', ['name' => $this->action->action_value]))); return false; } @@ -85,13 +86,13 @@ class SetSourceAccount implements ActionInterface $destination = $object->transactions()->where('amount', '>', 0)->first(); if (null === $destination) { Log::error('Could not find destination transaction.'); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_destination_transaction'))); return false; } // account must not be deleted (in the meantime): if (null === $destination->account) { Log::error('Could not find destination transaction account.'); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_destination_transaction_account'))); return false; } if (null !== $newAccount && (int)$newAccount->id === (int)$destination->account_id) { @@ -102,12 +103,12 @@ class SetSourceAccount implements ActionInterface $destination->account_id ) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.already_has_source', ['name' => $newAccount->name]))); return false; } // if this is a deposit, the new source account must be a revenue account and may be created: - // or its a liability + // or it's a liability if (TransactionType::DEPOSIT === $type) { $newAccount = $this->findDepositSourceAccount(); } diff --git a/app/TransactionRules/Actions/SwitchAccounts.php b/app/TransactionRules/Actions/SwitchAccounts.php index c5daeaa7f4..29d71b6bcc 100644 --- a/app/TransactionRules/Actions/SwitchAccounts.php +++ b/app/TransactionRules/Actions/SwitchAccounts.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\Transaction; @@ -59,20 +60,20 @@ class SwitchAccounts implements ActionInterface $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); if (null === $object) { Log::error(sprintf('Cannot find journal #%d, cannot switch accounts.', $journal['transaction_journal_id'])); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_such_journal'))); return false; } $groupCount = TransactionJournal::where('transaction_group_id', $journal['transaction_group_id'])->count(); if ($groupCount > 1) { Log::error(sprintf('Group #%d has more than one transaction in it, cannot switch accounts.', $journal['transaction_group_id'])); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.split_group'))); return false; } $type = $object->transactionType->type; if (TransactionType::TRANSFER !== $type) { Log::error(sprintf('Journal #%d is NOT a transfer (rule #%d), cannot switch accounts.', $journal['transaction_journal_id'], $this->action->rule_id)); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.is_not_transfer'))); return false; } @@ -82,7 +83,7 @@ class SwitchAccounts implements ActionInterface $destTransaction = $object->transactions()->where('amount', '>', 0)->first(); if (null === $sourceTransaction || null === $destTransaction) { Log::error(sprintf('Journal #%d has no source or destination transaction (rule #%d), cannot switch accounts.', $journal['transaction_journal_id'], $this->action->rule_id)); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_accounts'))); return false; } $sourceAccountId = (int)$sourceTransaction->account_id; diff --git a/app/TransactionRules/Actions/UpdatePiggybank.php b/app/TransactionRules/Actions/UpdatePiggybank.php index 5b1a538232..c0699f258d 100644 --- a/app/TransactionRules/Actions/UpdatePiggybank.php +++ b/app/TransactionRules/Actions/UpdatePiggybank.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\RuleAction; @@ -61,16 +62,15 @@ class UpdatePiggybank implements ActionInterface // 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); - $journal['transaction_type_type'] = $type->type; + $journalObj = $user->transactionJournals()->find($journal['transaction_journal_id']); + $type = TransactionType::find((int)$journalObj->transaction_type_id); $piggyBank = $this->findPiggyBank($user); 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) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.cannot_find_piggy', ['name' => $this->action->action_value]))); return false; } @@ -130,7 +130,7 @@ class UpdatePiggybank implements ActionInterface $destination->account_id ) ); - // TODO introduce error + event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_link_piggy', ['name' => $this->action->action_value]))); return false; } diff --git a/resources/lang/en_US/rules.php b/resources/lang/en_US/rules.php index b9473825ad..8d034ab1f3 100644 --- a/resources/lang/en_US/rules.php +++ b/resources/lang/en_US/rules.php @@ -23,19 +23,47 @@ declare(strict_types=1); return [ - 'main_message' => 'Action ":action", present in rule ":rule", could not be applied to transaction #:group: :error', - 'find_or_create_tag_failed' => 'Could not find or create tag ":tag"', - 'tag_already_added' => 'Tag ":tag" is already linked to this transaction.', - 'inspect_transaction' => 'Inspect transaction ":title" @ Firefly III', - 'inspect_rule' => 'Inspect rule ":title" @ Firefly III', - 'journal_other_user' => 'This transaction doesn\'t belong to the user', - 'journal_already_no_budget' => 'This transaction has no budget, so it cannot be removed.', - 'journal_already_no_category' => 'This transaction had no category, so it cannot be removed', - 'journal_already_no_notes' => 'This transaction had no notes, so they cannot be removed', - 'journal_not_found' => 'Firefly III can\'t find the requested transaction.', - 'split_group' => 'Firefly III cannot execute this action on a transaction with multiple splits.', - 'is_already_deposit' => 'This transaction is already a deposit.', - 'is_already_transfer' => 'This transaction is already a transfer.', - 'complex_error' => 'Something complicated went wrong. Please inspect the logs of Firefly III.', - 'no_valid_opposing' => 'Conversion failed because there is no valid account named ":account".', + 'main_message' => 'Action ":action", present in rule ":rule", could not be applied to transaction #:group: :error', + 'find_or_create_tag_failed' => 'Could not find or create tag ":tag"', + 'tag_already_added' => 'Tag ":tag" is already linked to this transaction', + 'inspect_transaction' => 'Inspect transaction ":title" @ Firefly III', + 'inspect_rule' => 'Inspect rule ":title" @ Firefly III', + 'journal_other_user' => 'This transaction doesn\'t belong to the user', + 'no_such_journal' => 'This transaction doesn\'t exist', + 'journal_already_no_budget' => 'This transaction has no budget, so it cannot be removed', + 'journal_already_no_category' => 'This transaction had no category, so it cannot be removed', + 'journal_already_no_notes' => 'This transaction had no notes, so they cannot be removed', + 'journal_not_found' => 'Firefly III can\'t find the requested transaction', + 'split_group' => 'Firefly III cannot execute this action on a transaction with multiple splits', + 'is_already_withdrawal' => 'This transaction is already a withdrawal', + 'is_already_deposit' => 'This transaction is already a deposit', + 'is_already_transfer' => 'This transaction is already a transfer', + 'is_not_transfer' => 'This transaction is not a transfer', + 'complex_error' => 'Something complicated went wrong. Sorry about that. Please inspect the logs of Firefly III', + 'no_valid_opposing' => 'Conversion failed because there is no valid account named ":account"', + 'new_notes_empty' => 'The notes to be set are empty', + 'unsupported_transaction_type_withdrawal' => 'Firefly III cannot convert a ":type" to a withdrawal', + 'unsupported_transaction_type_deposit' => 'Firefly III cannot convert a ":type" to a deposit', + 'unsupported_transaction_type_transfer' => 'Firefly III cannot convert a ":type" to a transfer', + 'already_has_source_asset' => 'This transaction already has ":name" as the source asset account', + 'already_has_destination_asset' => 'This transaction already has ":name" as the destination asset account', + 'already_has_destination' => 'This transaction already has ":name" as the destination account', + 'already_has_source' => 'This transaction already has ":name" as the source account', + 'already_linked_to_subscription' => 'The transaction is already linked to subscription ":name"', + 'cannot_find_subscription' => 'Firefly III can\'t find subscription ":name"', + 'no_notes_to_move' => 'The transaction has no notes to move to the description field', + 'no_tags_to_remove' => 'The transaction has no tags to remove', + 'cannot_find_tag' => 'Firefly III can\'t find tag ":tag"', + 'cannot_find_asset' => 'Firefly III can\'t find asset account ":name"', + 'cannot_find_accounts' => 'Firefly III can\'t find the source or destination account', + 'cannot_find_source_transaction' => 'Firefly III can\'t find the source transaction', + 'cannot_find_destination_transaction' => 'Firefly III can\'t find the destination transaction', + 'cannot_find_source_transaction_account' => 'Firefly III can\'t find the source transaction account', + 'cannot_find_destination_transaction_account' => 'Firefly III can\'t find the destination transaction account', + 'cannot_find_piggy' => 'Firefly III can\'t find a piggy bank named ":name"', + 'no_link_piggy' => 'This transaction\'s accounts are not linked to the piggy bank, so no action will be taken', + 'cannot_unlink_tag' => 'Tag ":tag" isn\'t linked to this transaction', + 'cannot_find_budget' => 'Firefly III can\'t find budget ":name"', + 'cannot_find_category' => 'Firefly III can\'t find category ":name"', + 'cannot_set_budget' => 'Firefly III can\'t set budget ":name" to a transaction of type ":type"', ];