. */ declare(strict_types=1); namespace FireflyIII\Handlers\Observer; use FireflyIII\Models\Account; use FireflyIII\Models\Attachment; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Http\Api\ExchangeRateConverter; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; /** * Class AccountObserver */ class AccountObserver { /** * Also delete related objects. */ public function deleting(Account $account): void { Log::debug('Observe "deleting" of an account.'); $repository = app(AttachmentRepositoryInterface::class); $repository->setUser($account->user); DB::table('account_piggy_bank')->where('account_id', $account->id)->delete(); /** @var Attachment $attachment */ foreach ($account->attachments()->get() as $attachment) { $repository->destroy($attachment); } $journalIds = Transaction::where('account_id', $account->id) ->get(['transactions.transaction_journal_id']) ->pluck('transaction_journal_id') ->toArray() ; $groupIds = TransactionJournal::whereIn('id', $journalIds) ->get(['transaction_journals.transaction_group_id']) ->pluck('transaction_group_id') ->toArray() // @phpstan-ignore-line ; if (count($journalIds) > 0) { Transaction::whereIn('transaction_journal_id', $journalIds)->delete(); TransactionJournal::whereIn('id', $journalIds)->delete(); } if (count($groupIds) > 0) { TransactionGroup::whereIn('id', $groupIds)->delete(); } Log::debug(sprintf('Delete %d journal(s)', count($journalIds))); Log::debug(sprintf('Delete %d group(s)', count($groupIds))); $account->notes()->delete(); $account->locations()->delete(); } }