From 344bfbe059c851a3c3f1e66b792f11b69fc99283 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 16 Feb 2025 19:30:40 +0100 Subject: [PATCH] Various includes fixed, optimize account deletion. --- .../V1/Controllers/System/AboutController.php | 3 +- .../Correction/CorrectsGroupAccounts.php | 3 +- .../Correction/CorrectsUnevenAmount.php | 7 +++-- app/Handlers/Observer/AccountObserver.php | 30 ++++++++++++------- .../Controllers/Account/ShowController.php | 2 ++ .../Destroy/AccountDestroyService.php | 8 ++--- .../Http/Controllers/ModelInformation.php | 4 +-- 7 files changed, 36 insertions(+), 21 deletions(-) diff --git a/app/Api/V1/Controllers/System/AboutController.php b/app/Api/V1/Controllers/System/AboutController.php index ead54d675b..c9f74933e6 100644 --- a/app/Api/V1/Controllers/System/AboutController.php +++ b/app/Api/V1/Controllers/System/AboutController.php @@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Controllers\System; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Transformers\UserTransformer; use Illuminate\Http\JsonResponse; +use Illuminate\Support\Facades\DB; use League\Fractal\Resource\Item; /** @@ -48,7 +49,7 @@ class AboutController extends Controller $replace = ['\~', '# ']; $phpVersion = str_replace($search, $replace, PHP_VERSION); $phpOs = str_replace($search, $replace, PHP_OS); - $currentDriver = \DB::getDriverName(); + $currentDriver = DB::getDriverName(); $data = [ 'version' => config('firefly.version'), diff --git a/app/Console/Commands/Correction/CorrectsGroupAccounts.php b/app/Console/Commands/Correction/CorrectsGroupAccounts.php index 584e2aad84..def997e955 100644 --- a/app/Console/Commands/Correction/CorrectsGroupAccounts.php +++ b/app/Console/Commands/Correction/CorrectsGroupAccounts.php @@ -30,6 +30,7 @@ use FireflyIII\Handlers\Events\UpdatedGroupEventHandler; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use Illuminate\Console\Command; +use Illuminate\Support\Facades\DB; class CorrectsGroupAccounts extends Command { @@ -45,7 +46,7 @@ class CorrectsGroupAccounts extends Command { $groups = []; $res = TransactionJournal::groupBy('transaction_group_id') - ->get(['transaction_group_id', \DB::raw('COUNT(transaction_group_id) as the_count')])// @phpstan-ignore-line + ->get(['transaction_group_id', DB::raw('COUNT(transaction_group_id) as the_count')])// @phpstan-ignore-line ; /** @var TransactionJournal $journal */ diff --git a/app/Console/Commands/Correction/CorrectsUnevenAmount.php b/app/Console/Commands/Correction/CorrectsUnevenAmount.php index c595cc34af..fdd809887f 100644 --- a/app/Console/Commands/Correction/CorrectsUnevenAmount.php +++ b/app/Console/Commands/Correction/CorrectsUnevenAmount.php @@ -30,6 +30,7 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Support\Models\AccountBalanceCalculator; use Illuminate\Console\Command; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; class CorrectsUnevenAmount extends Command @@ -118,10 +119,10 @@ class CorrectsUnevenAmount extends Command private function fixUnevenAmounts(): void { - $journals = \DB::table('transactions') + $journals = DB::table('transactions') ->groupBy('transaction_journal_id') ->whereNull('deleted_at') - ->get(['transaction_journal_id', \DB::raw('SUM(amount) AS the_sum')]) // @phpstan-ignore-line + ->get(['transaction_journal_id', DB::raw('SUM(amount) AS the_sum')]) // @phpstan-ignore-line ; /** @var \stdClass $entry */ @@ -262,7 +263,7 @@ class CorrectsUnevenAmount extends Command private function matchCurrencies(): void { $journals = TransactionJournal::leftJoin('transactions', 'transaction_journals.id', 'transactions.transaction_journal_id') - ->where('transactions.transaction_currency_id', '!=', \DB::raw('transaction_journals.transaction_currency_id')) + ->where('transactions.transaction_currency_id', '!=', DB::raw('transaction_journals.transaction_currency_id')) ->get(['transaction_journals.*']) ; diff --git a/app/Handlers/Observer/AccountObserver.php b/app/Handlers/Observer/AccountObserver.php index b9f6156c86..cf7c6dceb0 100644 --- a/app/Handlers/Observer/AccountObserver.php +++ b/app/Handlers/Observer/AccountObserver.php @@ -26,11 +26,14 @@ namespace FireflyIII\Handlers\Observer; use FireflyIII\Models\Account; use FireflyIII\Models\Attachment; -use FireflyIII\Models\PiggyBank; +use FireflyIII\Models\Transaction; +use FireflyIII\Models\TransactionGroup; +use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface; use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Http\Api\ExchangeRateConverter; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; /** @@ -53,7 +56,7 @@ class AccountObserver $repository = app(AccountRepositoryInterface::class); $currency = $repository->getAccountCurrency($account); if (null !== $currency && $currency->id !== $userCurrency->id && '' !== (string) $account->virtual_balance && 0 !== bccomp($account->virtual_balance, '0')) { - $converter = new ExchangeRateConverter(); + $converter = new ExchangeRateConverter(); $converter->setUserGroup($account->user->userGroup); $converter->setIgnoreSettings(true); $account->native_virtual_balance = $converter->convert($currency, $userCurrency, today(), $account->virtual_balance); @@ -72,24 +75,31 @@ class AccountObserver */ public function deleting(Account $account): void { - // app('log')->debug('Observe "deleting" of an account.'); - $account->accountMeta()->delete(); + app('log')->debug('Observe "deleting" of an account.'); $repository = app(AttachmentRepositoryInterface::class); $repository->setUser($account->user); - /** @var PiggyBank $piggy */ - foreach ($account->piggyBanks()->get() as $piggy) { - $piggy->accounts()->detach($account); - } + DB::table('account_piggy_bank')->where('account_id', $account->id)->delete(); /** @var Attachment $attachment */ foreach ($account->attachments()->get() as $attachment) { $repository->destroy($attachment); } - foreach ($account->transactions()->get() as $transaction) { - $transaction->delete(); + + $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(); + 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(); } diff --git a/app/Http/Controllers/Account/ShowController.php b/app/Http/Controllers/Account/ShowController.php index 37414bde5d..24ac82cea2 100644 --- a/app/Http/Controllers/Account/ShowController.php +++ b/app/Http/Controllers/Account/ShowController.php @@ -29,6 +29,7 @@ use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Account; +use FireflyIII\Models\Transaction; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Http\Controllers\PeriodOverview; @@ -80,6 +81,7 @@ class ShowController extends Controller * */ public function show(Request $request, Account $account, ?Carbon $start = null, ?Carbon $end = null) { + $objectType = config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type)); if (!$this->isEditableAccount($account)) { diff --git a/app/Services/Internal/Destroy/AccountDestroyService.php b/app/Services/Internal/Destroy/AccountDestroyService.php index 8f1c40c125..1e4bd5ad6e 100644 --- a/app/Services/Internal/Destroy/AccountDestroyService.php +++ b/app/Services/Internal/Destroy/AccountDestroyService.php @@ -31,6 +31,7 @@ use FireflyIII\Models\RecurrenceTransaction; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\DB; /** * Class AccountDestroyService @@ -46,8 +47,6 @@ class AccountDestroyService $this->moveTransactions($account, $moveTo); $this->updateRecurrences($account, $moveTo); } - $this->destroyJournals($account); - // delete recurring transactions with this account: if (null === $moveTo) { $this->destroyRecurrences($account); @@ -59,6 +58,7 @@ class AccountDestroyService // delete account meta: $account->accountMeta()->delete(); // delete account. + // at this point the account observer interferes and deletes most of the other stuff. $account->delete(); } @@ -134,8 +134,8 @@ class AccountDestroyService private function updateRecurrences(Account $account, Account $moveTo): void { - \DB::table('recurrences_transactions')->where('source_id', $account->id)->update(['source_id' => $moveTo->id]); - \DB::table('recurrences_transactions')->where('destination_id', $account->id)->update(['destination_id' => $moveTo->id]); + DB::table('recurrences_transactions')->where('source_id', $account->id)->update(['source_id' => $moveTo->id]); + DB::table('recurrences_transactions')->where('destination_id', $account->id)->update(['destination_id' => $moveTo->id]); } private function destroyJournals(Account $account): void diff --git a/app/Support/Http/Controllers/ModelInformation.php b/app/Support/Http/Controllers/ModelInformation.php index 5130ecb238..0d995753e2 100644 --- a/app/Support/Http/Controllers/ModelInformation.php +++ b/app/Support/Http/Controllers/ModelInformation.php @@ -199,7 +199,7 @@ trait ModelInformation ++$index; // amount_exactly: - $journalTriggers[$index] = 'amount_exactly'; + $journalTriggers[$index] = 'amount_is'; $values[$index] = $destination->amount; ++$index; @@ -244,7 +244,7 @@ trait ModelInformation // notes (if) $notes = $journal->notes()->first(); if (null !== $notes) { - $journalTriggers[$index] = 'notes_are'; + $journalTriggers[$index] = 'notes_is'; $values[$index] = $notes->text; }