From ae9e1278e570cd1f3628c9303285ef517fea8069 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 10 Aug 2025 06:38:23 +0200 Subject: [PATCH] Expand some timers, fix reports. --- .../Autocomplete/AccountController.php | 5 ++-- .../Controllers/Account/ShowController.php | 14 ++++++---- app/Http/Controllers/ReportController.php | 22 ++------------- app/Support/Debug/Timer.php | 27 ++++++++++++++----- .../Http/Controllers/PeriodOverview.php | 13 ++++----- resources/lang/en_US/firefly.php | 1 + resources/views/reports/index.twig | 7 +++++ 7 files changed, 50 insertions(+), 39 deletions(-) diff --git a/app/Api/V1/Controllers/Autocomplete/AccountController.php b/app/Api/V1/Controllers/Autocomplete/AccountController.php index 3b19beeb54..45c5398716 100644 --- a/app/Api/V1/Controllers/Autocomplete/AccountController.php +++ b/app/Api/V1/Controllers/Autocomplete/AccountController.php @@ -85,7 +85,8 @@ class AccountController extends Controller $query = $data['query']; $date = $data['date'] ?? today(config('app.timezone')); $return = []; - Timer::start(sprintf('AC accounts "%s"', $query)); + $timer = Timer::getInstance(); + $timer->start(sprintf('AC accounts "%s"', $query)); $result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit')); // set date to subday + end-of-day for account balance. so it is at $date 23:59:59 @@ -137,7 +138,7 @@ class AccountController extends Controller return $posA - $posB; } ); - Timer::stop(sprintf('AC accounts "%s"', $query)); + $timer->stop(sprintf('AC accounts "%s"', $query)); return response()->api($return); } diff --git a/app/Http/Controllers/Account/ShowController.php b/app/Http/Controllers/Account/ShowController.php index 8bff8d1ef2..27e46de601 100644 --- a/app/Http/Controllers/Account/ShowController.php +++ b/app/Http/Controllers/Account/ShowController.php @@ -40,6 +40,7 @@ use Illuminate\Routing\Redirector; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Log; use Illuminate\View\View; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Class ShowController @@ -81,7 +82,9 @@ class ShowController extends Controller * */ public function show(Request $request, Account $account, ?Carbon $start = null, ?Carbon $end = null) { - + if(0 === $account->id) { + throw new NotFoundHttpException(); + } $objectType = config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type)); if (!$this->isEditableAccount($account)) { @@ -116,18 +119,19 @@ class ShowController extends Controller $firstTransaction = $this->repository->oldestJournalDate($account) ?? $start; Log::debug('Start period overview'); - Timer::start('period-overview'); + $timer = Timer::getInstance(); + $timer->start('period-overview'); $periods = $this->getAccountPeriodOverview($account, $firstTransaction, $end); Log::debug('End period overview'); - Timer::stop('period-overview'); + $timer->stop('period-overview'); // if layout = v2, overrule the page title. if ('v1' !== config('view.layout')) { $subTitle = (string) trans('firefly.all_journals_for_account', ['name' => $account->name]); } Log::debug('Collect transactions'); - Timer::start('collection'); + $timer->start('collection'); /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); @@ -146,7 +150,7 @@ class ShowController extends Controller Log::debug('End collect transactions'); - Timer::stop('collection'); + $timer->stop('collection'); // enrich data in arrays. diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 40d1b3b642..e40edf41e7 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -188,16 +188,7 @@ class ReportController extends Controller $start->endOfDay(); // end of day so the final balance is at the end of that day. $end->endOfDay(); - app('view')->share( - 'subTitle', - trans( - 'firefly.report_default', - [ - 'start' => $start->isoFormat($this->monthAndDayFormat), - 'end' => $end->isoFormat($this->monthAndDayFormat), - ] - ) - ); + app('view')->share('subTitle', trans('firefly.report_default', ['start' => $start->isoFormat($this->monthAndDayFormat), 'end' => $end->isoFormat($this->monthAndDayFormat),])); $generator = ReportGeneratorFactory::reportGenerator('Standard', $start, $end); $generator->setAccounts($accounts); @@ -222,16 +213,7 @@ class ReportController extends Controller $start->endOfDay(); // end of day so the final balance is at the end of that day. $end->endOfDay(); - app('view')->share( - 'subTitle', - trans( - 'firefly.report_double', - [ - 'start' => $start->isoFormat($this->monthAndDayFormat), - 'end' => $end->isoFormat($this->monthAndDayFormat), - ] - ) - ); + app('view')->share('subTitle', trans('firefly.report_double', ['start' => $start->isoFormat($this->monthAndDayFormat), 'end' => $end->isoFormat($this->monthAndDayFormat),])); $generator = ReportGeneratorFactory::reportGenerator('Account', $start, $end); $generator->setAccounts($accounts); diff --git a/app/Support/Debug/Timer.php b/app/Support/Debug/Timer.php index dc9caca357..94e48187b7 100644 --- a/app/Support/Debug/Timer.php +++ b/app/Support/Debug/Timer.php @@ -28,19 +28,34 @@ use Illuminate\Support\Facades\Log; class Timer { - private static array $times = []; + private array $times = []; + private static ?Timer $instance = null; - public static function start(string $title): void + private function __construct() { - self::$times[$title] = microtime(true); + // Private constructor to prevent direct instantiation. } - public static function stop(string $title): void + public static function getInstance(): self { - $start = self::$times[$title] ?? 0; + if (null === self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + public function start(string $title): void + { + $this->times[$title] = microtime(true); + } + + public function stop(string $title): void + { + $start = $this->times[$title] ?? 0; $end = microtime(true); $diff = $end - $start; - unset(self::$times[$title]); + unset($this->times[$title]); Log::debug(sprintf('Timer "%s" took %f seconds', $title, $diff)); } } diff --git a/app/Support/Http/Controllers/PeriodOverview.php b/app/Support/Http/Controllers/PeriodOverview.php index 4c64a4a089..14e8e53fef 100644 --- a/app/Support/Http/Controllers/PeriodOverview.php +++ b/app/Support/Http/Controllers/PeriodOverview.php @@ -80,7 +80,8 @@ trait PeriodOverview protected function getAccountPeriodOverview(Account $account, Carbon $start, Carbon $end): array { Log::debug('Now in getAccountPeriodOverview()'); - Timer::start('account-period-total'); + $timer = Timer::getInstance(); + $timer->start('account-period-total'); $this->accountRepository = app(AccountRepositoryInterface::class); $range = Navigation::getViewRange(true); [$start, $end] = $end < $start ? [$end, $start] : [$start, $end]; @@ -101,14 +102,14 @@ trait PeriodOverview $entries = []; // run a custom query because doing this with the collector is MEGA slow. - Timer::start('account-period-collect'); + $timer->start('account-period-collect'); $transactions = $this->accountRepository->periodCollection($account, $start, $end); - Timer::stop('account-period-collect'); + $timer->stop('account-period-collect'); // loop dates Log::debug(sprintf('Count of loops: %d', count($dates))); $loops = 0; // stop after 10 loops for memory reasons. - Timer::start('account-period-loop'); + $timer->start('account-period-loop'); foreach ($dates as $currentDate) { $title = Navigation::periodShow($currentDate['start'], $currentDate['period']); [$transactions, $spent] = $this->filterTransactionsByType(TransactionTypeEnum::WITHDRAWAL, $transactions, $currentDate['start'], $currentDate['end']); @@ -127,9 +128,9 @@ trait PeriodOverview ]; ++$loops; } - Timer::stop('account-period-loop'); + $timer->stop('account-period-loop'); $cache->store($entries); - Timer::stop('account-period-total'); + $timer->stop('account-period-total'); Log::debug('End of getAccountPeriodOverview()'); return $entries; diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index a6ca387fe2..138eb8e33e 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -2333,6 +2333,7 @@ return [ // reports: + 'quick_link_needs_accounts' => 'In order to generate reports, you need to add at least one asset account to Firefly III.', 'report_default' => 'Default financial report between :start and :end', 'report_audit' => 'Transaction history overview between :start and :end', 'report_category' => 'Category report between :start and :end', diff --git a/resources/views/reports/index.twig b/resources/views/reports/index.twig index 5c00c6a24b..15acad7e56 100644 --- a/resources/views/reports/index.twig +++ b/resources/views/reports/index.twig @@ -128,6 +128,12 @@

{{ 'quick_link_reports'|_ }}

+ {% if '' == accountList %} +

+ {{ 'quick_link_needs_accounts'|_ }} +

+ {% endif %} + {% if '' != accountList %}

{{ 'quick_link_examples'|_ }}

@@ -172,6 +178,7 @@

{{ 'reports_can_bookmark'|_ }}

+ {% endif %}