diff --git a/app/TransactionRules/Actions/AddTag.php b/app/TransactionRules/Actions/AddTag.php index 5048b19fe8..2f030a24bf 100644 --- a/app/TransactionRules/Actions/AddTag.php +++ b/app/TransactionRules/Actions/AddTag.php @@ -74,8 +74,8 @@ class AddTag implements ActionInterface DB::table('tag_transaction_journal')->insert(['tag_id' => $tag->id, 'transaction_journal_id' => $journal['transaction_journal_id']]); Log::debug(sprintf('RuleAction AddTag. Added tag #%d ("%s") to journal %d.', $tag->id, $tag->tag, $journal['transaction_journal_id'])); $journal = TransactionJournal::find($journal['transaction_journal_id']); + // event for audit log entry - //// changer, auditable, field, value before, value after event(new TriggeredAuditLog($this->action->rule, $journal, 'add_tag', null, $tag->tag)); return true; diff --git a/app/TransactionRules/Actions/AppendDescription.php b/app/TransactionRules/Actions/AppendDescription.php index c7f275ebf1..f348f38ff7 100644 --- a/app/TransactionRules/Actions/AppendDescription.php +++ b/app/TransactionRules/Actions/AppendDescription.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; /** * Class AppendDescription. @@ -50,6 +52,11 @@ class AppendDescription implements ActionInterface $description = sprintf('%s%s', $journal['description'], $this->action->action_value); DB::table('transaction_journals')->where('id', $journal['transaction_journal_id'])->limit(1)->update(['description' => $description]); + // event for audit log entry + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_description', null, $description)); + return true; } } diff --git a/app/TransactionRules/Actions/AppendDescriptionToNotes.php b/app/TransactionRules/Actions/AppendDescriptionToNotes.php index 783320c0ce..fbce57ca19 100644 --- a/app/TransactionRules/Actions/AppendDescriptionToNotes.php +++ b/app/TransactionRules/Actions/AppendDescriptionToNotes.php @@ -22,12 +22,26 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; +use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use Illuminate\Support\Facades\Log; class AppendDescriptionToNotes implements ActionInterface { + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ @@ -45,12 +59,17 @@ class AppendDescriptionToNotes implements ActionInterface $note->noteable()->associate($journal); $note->text = ''; } + $before = $note->text; if ('' !== $note->text) { $note->text = trim(sprintf("%s \n%s", $note->text, $journal->description)); } if ('' === $note->text) { $note->text = (string) $journal->description; } + $after = $note->text; + + // event for audit log entry + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_notes', $before, $after)); $note->save(); return true; diff --git a/app/TransactionRules/Actions/AppendNotes.php b/app/TransactionRules/Actions/AppendNotes.php index 62350cbd44..259b1ac8c5 100644 --- a/app/TransactionRules/Actions/AppendNotes.php +++ b/app/TransactionRules/Actions/AppendNotes.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -32,8 +33,7 @@ use Log; */ class AppendNotes implements ActionInterface { - /** @var RuleAction The rule action */ - private $action; + private RuleAction $action; /** * TriggerInterface constructor. @@ -62,10 +62,16 @@ class AppendNotes implements ActionInterface $dbNote->text = ''; } Log::debug(sprintf('RuleAction AppendNotes appended "%s" to "%s".', $this->action->action_value, $dbNote->text)); + $before = $dbNote->text; $text = sprintf('%s%s', $dbNote->text, $this->action->action_value); $dbNote->text = $text; $dbNote->save(); + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_notes', $before, $text)); + return true; } } diff --git a/app/TransactionRules/Actions/AppendNotesToDescription.php b/app/TransactionRules/Actions/AppendNotesToDescription.php index 81d1dca2a6..f628a06c89 100644 --- a/app/TransactionRules/Actions/AppendNotesToDescription.php +++ b/app/TransactionRules/Actions/AppendNotesToDescription.php @@ -22,10 +22,11 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; +use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Support\Request\ConvertsDataTypes; -use FireflyIII\Support\Steam; use Illuminate\Support\Facades\Log; /** @@ -34,6 +35,19 @@ use Illuminate\Support\Facades\Log; class AppendNotesToDescription implements ActionInterface { use ConvertsDataTypes; + + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ @@ -55,9 +69,13 @@ class AppendNotesToDescription implements ActionInterface } // only append if there is something to append if ('' !== $note->text) { + $before = $journal->description; $journal->description = trim(sprintf("%s %s", $journal->description, (string) $this->clearString($note->text, false))); $journal->save(); Log::debug(sprintf('Journal description is updated to "%s".', $journal->description)); + + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_description', $before, $journal->description)); + return true; } return false; diff --git a/app/TransactionRules/Actions/ClearBudget.php b/app/TransactionRules/Actions/ClearBudget.php index c13996bbcd..0fa34dec8c 100644 --- a/app/TransactionRules/Actions/ClearBudget.php +++ b/app/TransactionRules/Actions/ClearBudget.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; +use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; use Log; /** @@ -30,14 +33,37 @@ use Log; */ class ClearBudget implements ActionInterface { + + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ public function actOnArray(array $journal): bool { + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + $budget = $journal->budgets()->first(); + if (null === $budget) { + Log::debug(sprintf('RuleAction ClearBudget, no budget in journal #%d.', $journal['transaction_journal_id'])); + return false; + } + DB::table('budget_transaction_journal')->where('transaction_journal_id', '=', $journal['transaction_journal_id'])->delete(); - Log::debug(sprintf('RuleAction ClearBudget removed all budgets from journal %d.', $journal['transaction_journal_id'])); + event(new TriggeredAuditLog($this->action->rule, $journal, 'remove_budget', $budget->name, null)); + + Log::debug(sprintf('RuleAction ClearBudget removed all budgets from journal #%d.', $journal['transaction_journal_id'])); return true; } diff --git a/app/TransactionRules/Actions/ClearCategory.php b/app/TransactionRules/Actions/ClearCategory.php index d32dc222db..251ab7d156 100644 --- a/app/TransactionRules/Actions/ClearCategory.php +++ b/app/TransactionRules/Actions/ClearCategory.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; +use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; use Log; /** @@ -30,14 +33,36 @@ use Log; */ class ClearCategory implements ActionInterface { + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ public function actOnArray(array $journal): bool { + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + $category = $journal->categories()->first(); + if (null === $category) { + Log::debug(sprintf('RuleAction ClearCategory, no category in journal #%d.', $journal['transaction_journal_id'])); + return false; + } + DB::table('category_transaction_journal')->where('transaction_journal_id', '=', $journal['transaction_journal_id'])->delete(); - Log::debug(sprintf('RuleAction ClearCategory removed all categories from journal %d.', $journal['transaction_journal_id'])); + event(new TriggeredAuditLog($this->action->rule, $journal, 'removed_category', $category->name, null)); + + Log::debug(sprintf('RuleAction ClearCategory removed all categories from journal #%d.', $journal['transaction_journal_id'])); return true; } diff --git a/app/TransactionRules/Actions/ClearNotes.php b/app/TransactionRules/Actions/ClearNotes.php index d30466cd61..b066dd39eb 100644 --- a/app/TransactionRules/Actions/ClearNotes.php +++ b/app/TransactionRules/Actions/ClearNotes.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; +use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use Log; @@ -31,16 +33,38 @@ use Log; */ class ClearNotes implements ActionInterface { + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ public function actOnArray(array $journal): bool { + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + $notes = $journal->notes()->first(); + if (null === $notes) { + Log::debug(sprintf('RuleAction ClearNotes, journal #%d has no notes.', $journal['transaction_journal_id'])); + return false; + } + $before = $notes->text; + DB::table('notes') ->where('noteable_id', $journal['transaction_journal_id']) ->where('noteable_type', TransactionJournal::class) ->delete(); - Log::debug('RuleAction ClearNotes removed all notes.'); + Log::debug(sprintf('RuleAction ClearNotes removed all notes from journal #%d.', $journal['transaction_journal_id'])); + + event(new TriggeredAuditLog($this->action->rule, $journal, 'remove_notes', $before, null)); return true; } diff --git a/app/TransactionRules/Actions/ConvertToDeposit.php b/app/TransactionRules/Actions/ConvertToDeposit.php index f469c90b40..c8bf83d4ed 100644 --- a/app/TransactionRules/Actions/ConvertToDeposit.php +++ b/app/TransactionRules/Actions/ConvertToDeposit.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Factory\AccountFactory; use FireflyIII\Models\AccountType; @@ -58,7 +59,7 @@ class ConvertToDeposit implements ActionInterface public function actOnArray(array $journal): bool { $groupCount = TransactionJournal::where('transaction_group_id', $journal['transaction_group_id'])->count(); - if($groupCount > 1) { + if ($groupCount > 1) { Log::error(sprintf('Group #%d has more than one transaction in it, cannot convert to deposit.', $journal['transaction_group_id'])); return false; } @@ -73,10 +74,14 @@ class ConvertToDeposit implements ActionInterface if (TransactionType::WITHDRAWAL === $type) { Log::debug('Going to transform a withdrawal to a deposit.'); + $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $object, 'change_transaction_type', TransactionType::WITHDRAWAL, TransactionType::DEPOSIT)); return $this->convertWithdrawalArray($journal); } if (TransactionType::TRANSFER === $type) { + $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $object, 'change_transaction_type', TransactionType::TRANSFER, TransactionType::DEPOSIT)); Log::debug('Going to transform a transfer to a deposit.'); return $this->convertTransferArray($journal); diff --git a/app/TransactionRules/Actions/ConvertToTransfer.php b/app/TransactionRules/Actions/ConvertToTransfer.php index 341a9bed08..5fd893f977 100644 --- a/app/TransactionRules/Actions/ConvertToTransfer.php +++ b/app/TransactionRules/Actions/ConvertToTransfer.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\RuleAction; @@ -57,7 +58,7 @@ class ConvertToTransfer implements ActionInterface public function actOnArray(array $journal): bool { $groupCount = TransactionJournal::where('transaction_group_id', $journal['transaction_group_id'])->count(); - if($groupCount > 1) { + if ($groupCount > 1) { Log::error(sprintf('Group #%d has more than one transaction in it, cannot convert to transfer.', $journal['transaction_group_id'])); return false; } @@ -90,12 +91,17 @@ class ConvertToTransfer implements ActionInterface } if (TransactionType::WITHDRAWAL === $type) { Log::debug('Going to transform a withdrawal to a transfer.'); + $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $object, 'change_transaction_type', TransactionType::WITHDRAWAL, TransactionType::TRANSFER)); return $this->convertWithdrawalArray($journal, $asset); } if (TransactionType::DEPOSIT === $type) { Log::debug('Going to transform a deposit to a transfer.'); + $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $object, 'change_transaction_type', TransactionType::DEPOSIT, TransactionType::TRANSFER)); + return $this->convertDepositArray($journal, $asset); } diff --git a/app/TransactionRules/Actions/ConvertToWithdrawal.php b/app/TransactionRules/Actions/ConvertToWithdrawal.php index 540b99f8e3..8f2c41d5aa 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\TriggeredAuditLog; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Factory\AccountFactory; use FireflyIII\Models\AccountType; @@ -57,7 +58,7 @@ class ConvertToWithdrawal implements ActionInterface public function actOnArray(array $journal): bool { $groupCount = TransactionJournal::where('transaction_group_id', $journal['transaction_group_id'])->count(); - if($groupCount > 1) { + if ($groupCount > 1) { Log::error(sprintf('Group #%d has more than one transaction in it, cannot convert to withdrawal.', $journal['transaction_group_id'])); return false; } @@ -71,11 +72,15 @@ class ConvertToWithdrawal implements ActionInterface if (TransactionType::DEPOSIT === $type) { Log::debug('Going to transform a deposit to a withdrawal.'); + $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $object, 'change_transaction_type', TransactionType::DEPOSIT, TransactionType::WITHDRAWAL)); return $this->convertDepositArray($journal); } if (TransactionType::TRANSFER === $type) { Log::debug('Going to transform a transfer to a withdrawal.'); + $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $object, 'change_transaction_type', TransactionType::TRANSFER, TransactionType::WITHDRAWAL)); return $this->convertTransferArray($journal); } diff --git a/app/TransactionRules/Actions/DeleteTransaction.php b/app/TransactionRules/Actions/DeleteTransaction.php index bbd01aee3f..5140ddbc1d 100644 --- a/app/TransactionRules/Actions/DeleteTransaction.php +++ b/app/TransactionRules/Actions/DeleteTransaction.php @@ -22,6 +22,8 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\TriggeredAuditLog; +use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Services\Internal\Destroy\JournalDestroyService; @@ -33,6 +35,18 @@ use Log; */ class DeleteTransaction implements ActionInterface { + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ @@ -52,6 +66,8 @@ class DeleteTransaction implements ActionInterface $service = app(TransactionGroupDestroyService::class); $service->destroy($group); + event(new TriggeredAuditLog($this->action->rule, $group, 'delete_group', null, null)); + return true; } Log::debug( @@ -64,6 +80,7 @@ class DeleteTransaction implements ActionInterface /** @var JournalDestroyService $service */ $service = app(JournalDestroyService::class); $service->destroy($journal); + event(new TriggeredAuditLog($this->action->rule, $journal, 'delete_journal', null, null)); } return true; diff --git a/app/TransactionRules/Actions/LinkToBill.php b/app/TransactionRules/Actions/LinkToBill.php index 5de381a3ab..584e4b8407 100644 --- a/app/TransactionRules/Actions/LinkToBill.php +++ b/app/TransactionRules/Actions/LinkToBill.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\User; @@ -34,8 +36,7 @@ use Log; */ class LinkToBill implements ActionInterface { - /** @var RuleAction The rule action */ - private $action; + private RuleAction $action; /** * TriggerInterface constructor. @@ -69,6 +70,9 @@ class LinkToBill implements ActionInterface sprintf('RuleAction LinkToBill set the bill of journal #%d to bill #%d ("%s").', $journal['transaction_journal_id'], $bill->id, $bill->name) ); + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $journal, 'change_bill', null, $bill->id)); + return true; } diff --git a/app/TransactionRules/Actions/MoveDescriptionToNotes.php b/app/TransactionRules/Actions/MoveDescriptionToNotes.php index 58c9724f1c..04b72883d6 100644 --- a/app/TransactionRules/Actions/MoveDescriptionToNotes.php +++ b/app/TransactionRules/Actions/MoveDescriptionToNotes.php @@ -22,7 +22,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; +use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use Illuminate\Support\Facades\Log; @@ -31,6 +33,20 @@ use Illuminate\Support\Facades\Log; */ class MoveDescriptionToNotes implements ActionInterface { + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @codeCoverageIgnore + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ @@ -48,14 +64,20 @@ class MoveDescriptionToNotes implements ActionInterface $note->noteable()->associate($journal); $note->text = ''; } + $before = $note->text; + $beforeDescription = $journal->description; if ('' !== $note->text) { $note->text = trim(sprintf("%s \n%s", $note->text, $journal->description)); $journal->description = '(no description)'; } if ('' === $note->text) { - $note->text = (string) $journal->description; + $note->text = (string) $journal->description; $journal->description = '(no description)'; } + $after = $note->text; + + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_description', $beforeDescription, $journal->description)); + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_notes', $before, $after)); $note->save(); $journal->save(); diff --git a/app/TransactionRules/Actions/MoveNotesToDescription.php b/app/TransactionRules/Actions/MoveNotesToDescription.php index ddc8b17c19..3058b1d70f 100644 --- a/app/TransactionRules/Actions/MoveNotesToDescription.php +++ b/app/TransactionRules/Actions/MoveNotesToDescription.php @@ -22,6 +22,8 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\TriggeredAuditLog; +use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Support\Request\ConvertsDataTypes; use Illuminate\Support\Facades\Log; @@ -30,6 +32,20 @@ class MoveNotesToDescription implements ActionInterface { use ConvertsDataTypes; + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @codeCoverageIgnore + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ @@ -51,10 +67,15 @@ class MoveNotesToDescription implements ActionInterface $note->delete(); return false; } + $before = $journal->description; + $beforeNote = $note->text; $journal->description = (string) $this->clearString($note->text, false); $journal->save(); $note->delete(); + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_description', $before, $journal->description)); + event(new TriggeredAuditLog($this->action->rule, $journal, 'remove_notes', $beforeNote, null)); + return true; } } diff --git a/app/TransactionRules/Actions/PrependDescription.php b/app/TransactionRules/Actions/PrependDescription.php index 4640d72031..cab6bf60d6 100644 --- a/app/TransactionRules/Actions/PrependDescription.php +++ b/app/TransactionRules/Actions/PrependDescription.php @@ -23,15 +23,16 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; /** * Class PrependDescription. */ class PrependDescription implements ActionInterface { - /** @var RuleAction The rule action */ - private $action; + private RuleAction $action; /** * TriggerInterface constructor. @@ -48,8 +49,16 @@ class PrependDescription implements ActionInterface */ public function actOnArray(array $journal): bool { - $description = sprintf('%s%s', $this->action->action_value, $journal['description']); - DB::table('transaction_journals')->where('id', $journal['transaction_journal_id'])->limit(1)->update(['description' => $description]); + $before = $journal['description']; + $after = sprintf('%s%s', $this->action->action_value, $journal['description']); + DB::table('transaction_journals')->where('id', $journal['transaction_journal_id'])->limit(1)->update(['description' => $after]); + + // journal + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + + // audit log + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_description', $before, $after)); return true; } diff --git a/app/TransactionRules/Actions/PrependNotes.php b/app/TransactionRules/Actions/PrependNotes.php index 4a9f97a426..2fea0c6f1e 100644 --- a/app/TransactionRules/Actions/PrependNotes.php +++ b/app/TransactionRules/Actions/PrependNotes.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -32,8 +33,7 @@ use Log; */ class PrependNotes implements ActionInterface { - /** @var RuleAction The rule action */ - private $action; + private RuleAction $action; /** * TriggerInterface constructor. @@ -61,11 +61,19 @@ class PrependNotes implements ActionInterface $dbNote->noteable_type = TransactionJournal::class; $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); $dbNote->text = $text; $dbNote->save(); + // journal + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + + // audit log + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_notes', $before, $text)); + return true; } } diff --git a/app/TransactionRules/Actions/RemoveAllTags.php b/app/TransactionRules/Actions/RemoveAllTags.php index f49ce6e34a..6abdc259a3 100644 --- a/app/TransactionRules/Actions/RemoveAllTags.php +++ b/app/TransactionRules/Actions/RemoveAllTags.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; +use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; use Log; /** @@ -30,6 +33,18 @@ use Log; */ class RemoveAllTags implements ActionInterface { + private RuleAction $action; + + /** + * TriggerInterface constructor. + * + * @param RuleAction $action + */ + public function __construct(RuleAction $action) + { + $this->action = $action; + } + /** * @inheritDoc */ @@ -38,6 +53,12 @@ class RemoveAllTags implements ActionInterface Log::debug(sprintf('RuleAction ClearCategory removed all tags from journal %d.', $journal['transaction_journal_id'])); DB::table('tag_transaction_journal')->where('transaction_journal_id', $journal['transaction_journal_id'])->delete(); + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + + // audit log + event(new TriggeredAuditLog($this->action->rule, $journal, 'remove_all_tags', null, null)); + return true; } diff --git a/app/TransactionRules/Actions/RemoveTag.php b/app/TransactionRules/Actions/RemoveTag.php index f8bd4671e8..5a796aa8fe 100644 --- a/app/TransactionRules/Actions/RemoveTag.php +++ b/app/TransactionRules/Actions/RemoveTag.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; use FireflyIII\User; use Log; @@ -54,18 +56,22 @@ class RemoveTag implements ActionInterface $user = User::find($journal['user_id']); $tag = $user->tags()->where('tag', $name)->first(); - if (null !== $tag) { - 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(); - - return true; + if (null === $tag) { + Log::debug( + sprintf('RuleAction RemoveTag tried to remove tag "%s" from journal #%d but no such tag exists.', $name, $journal['transaction_journal_id']) + ); + return false; } - Log::debug( - sprintf('RuleAction RemoveTag tried to remove tag "%s" from journal #%d but no such tag exists.', $name, $journal['transaction_journal_id']) - ); + + 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(); + + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $journal, 'remove_tag', $tag->tag, null)); return true; } diff --git a/app/TransactionRules/Actions/SetBudget.php b/app/TransactionRules/Actions/SetBudget.php index 2e149065dd..a90fb3a888 100644 --- a/app/TransactionRules/Actions/SetBudget.php +++ b/app/TransactionRules/Actions/SetBudget.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\User; use Log; @@ -75,7 +77,7 @@ class SetBudget implements ActionInterface ) ); - return true; + return false; } Log::debug( @@ -85,6 +87,10 @@ class SetBudget implements ActionInterface DB::table('budget_transaction_journal')->where('transaction_journal_id', '=', $journal['transaction_journal_id'])->delete(); DB::table('budget_transaction_journal')->insert(['transaction_journal_id' => $journal['transaction_journal_id'], 'budget_id' => $budget->id]); + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $journal, 'set_budget', null, $budget->name)); + return true; } } diff --git a/app/TransactionRules/Actions/SetCategory.php b/app/TransactionRules/Actions/SetCategory.php index 118d5186b7..ecef7ed818 100644 --- a/app/TransactionRules/Actions/SetCategory.php +++ b/app/TransactionRules/Actions/SetCategory.php @@ -23,8 +23,10 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Factory\CategoryFactory; use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; use FireflyIII\User; use Log; @@ -83,6 +85,10 @@ class SetCategory implements ActionInterface DB::table('category_transaction_journal')->where('transaction_journal_id', '=', $journal['transaction_journal_id'])->delete(); DB::table('category_transaction_journal')->insert(['transaction_journal_id' => $journal['transaction_journal_id'], 'category_id' => $category->id]); + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + event(new TriggeredAuditLog($this->action->rule, $journal, 'set_category', null, $category->name)); + return true; } } diff --git a/app/TransactionRules/Actions/SetDescription.php b/app/TransactionRules/Actions/SetDescription.php index fc28d0725b..37506e7f8f 100644 --- a/app/TransactionRules/Actions/SetDescription.php +++ b/app/TransactionRules/Actions/SetDescription.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; +use FireflyIII\Models\TransactionJournal; use Log; /** @@ -48,6 +50,10 @@ class SetDescription implements ActionInterface */ public function actOnArray(array $journal): bool { + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + $before = $journal->description; + DB::table('transaction_journals') ->where('id', '=', $journal['transaction_journal_id']) ->update(['description' => $this->action->action_value]); @@ -61,6 +67,8 @@ class SetDescription implements ActionInterface ) ); + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_description', $before, $this->action->action_value)); + return true; } } diff --git a/app/TransactionRules/Actions/SetDestinationAccount.php b/app/TransactionRules/Actions/SetDestinationAccount.php index 4f70ed6e36..4ce2fe08d5 100644 --- a/app/TransactionRules/Actions/SetDestinationAccount.php +++ b/app/TransactionRules/Actions/SetDestinationAccount.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Account; use FireflyIII\Models\RuleAction; use FireflyIII\Models\Transaction; @@ -89,7 +90,7 @@ class SetDestinationAccount implements ActionInterface return false; } - // account must not be deleted (in the mean time): + // account must not be deleted (in the meantime): if (null === $source->account) { Log::error('Could not find source transaction account.'); @@ -114,6 +115,8 @@ class SetDestinationAccount implements ActionInterface Log::debug(sprintf('New destination account is #%d ("%s").', $newAccount->id, $newAccount->name)); + event(new TriggeredAuditLog($this->action->rule, $object, 'set_destination', null, $newAccount->name)); + // update destination transaction with new destination account: DB::table('transactions') ->where('transaction_journal_id', '=', $object->id) diff --git a/app/TransactionRules/Actions/SetNotes.php b/app/TransactionRules/Actions/SetNotes.php index 4bf792e0bb..362a00f257 100644 --- a/app/TransactionRules/Actions/SetNotes.php +++ b/app/TransactionRules/Actions/SetNotes.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -68,6 +69,11 @@ class SetNotes implements ActionInterface ) ); + /** @var TransactionJournal $journal */ + $journal = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); + + event(new TriggeredAuditLog($this->action->rule, $journal, 'update_notes', $oldNotes, $this->action->action_value)); + return true; } } diff --git a/app/TransactionRules/Actions/SetSourceAccount.php b/app/TransactionRules/Actions/SetSourceAccount.php index 21d4b60561..35836931d5 100644 --- a/app/TransactionRules/Actions/SetSourceAccount.php +++ b/app/TransactionRules/Actions/SetSourceAccount.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\TransactionRules\Actions; use DB; +use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Account; use FireflyIII\Models\RuleAction; use FireflyIII\Models\Transaction; @@ -86,7 +87,7 @@ class SetSourceAccount implements ActionInterface return false; } - // account must not be deleted (in the mean time): + // account must not be deleted (in the meantime): if (null === $destination->account) { Log::error('Could not find destination transaction account.'); @@ -117,6 +118,8 @@ class SetSourceAccount implements ActionInterface ->where('amount', '<', 0) ->update(['account_id' => $newAccount->id]); + event(new TriggeredAuditLog($this->action->rule, $object, 'set_source', null, $newAccount->name)); + Log::debug(sprintf('Updated journal #%d (group #%d) and gave it new source account ID.', $object->id, $object->transaction_group_id)); return true; diff --git a/app/TransactionRules/Actions/UpdatePiggybank.php b/app/TransactionRules/Actions/UpdatePiggybank.php index 7287581412..4b55f205e9 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\TriggeredAuditLog; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\RuleAction; use FireflyIII\Models\Transaction; @@ -90,12 +91,16 @@ class UpdatePiggybank implements ActionInterface Log::debug('Piggy bank account is linked to source, so remove amount.'); $this->removeAmount($journal, $piggyBank, $destination->amount); + event(new TriggeredAuditLog($this->action->rule, $journalObj, 'remove_from_piggy', null, ['amount' => $destination->amount, 'piggy' => $piggyBank->name])); + return true; } if ((int) $destination->account_id === (int) $piggyBank->account_id) { Log::debug('Piggy bank account is linked to source, so add amount.'); $this->addAmount($journal, $piggyBank, $destination->amount); + event(new TriggeredAuditLog($this->action->rule, $journalObj, 'add_to_piggy', null, ['amount' => $destination->amount, 'piggy' => $piggyBank->name])); + return true; } Log::info(