diff --git a/app/Http/Controllers/Chart/ReportController.php b/app/Http/Controllers/Chart/ReportController.php index 6ab91d266b..7de2b696a7 100644 --- a/app/Http/Controllers/Chart/ReportController.php +++ b/app/Http/Controllers/Chart/ReportController.php @@ -32,6 +32,7 @@ use FireflyIII\Models\Account; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Support\CacheProperties; +use FireflyIII\Support\Facades\Navigation; use FireflyIII\Support\Http\Controllers\BasicDataSupport; use FireflyIII\Support\Http\Controllers\ChartGeneration; use Illuminate\Http\JsonResponse; @@ -64,7 +65,7 @@ class ReportController extends Controller public function netWorth(Collection $accounts, Carbon $start, Carbon $end): JsonResponse { // chart properties for cache: - $cache = new CacheProperties(); + $cache = new CacheProperties(); $cache->addProperty('chart.report.net-worth'); $cache->addProperty($start); $cache->addProperty(implode(',', $accounts->pluck('id')->toArray())); @@ -72,12 +73,12 @@ class ReportController extends Controller if ($cache->has()) { return response()->json($cache->get()); } - $locale = app('steam')->getLocale(); - $current = clone $start; - $chartData = []; + $locale = app('steam')->getLocale(); + $current = clone $start; + $chartData = []; /** @var NetWorthInterface $helper */ - $helper = app(NetWorthInterface::class); + $helper = app(NetWorthInterface::class); $helper->setUser(auth()->user()); // filter accounts on having the preference for being included. @@ -107,11 +108,11 @@ class ReportController extends Controller if ('native' === $key) { continue; } - $currencyId = $netWorthItem['currency_id']; - $label = $current->isoFormat((string) trans('config.month_and_day_js', [], $locale)); + $currencyId = $netWorthItem['currency_id']; + $label = $current->isoFormat((string)trans('config.month_and_day_js', [], $locale)); if (!array_key_exists($currencyId, $chartData)) { $chartData[$currencyId] = [ - 'label' => 'Net worth in '.$netWorthItem['currency_name'], + 'label' => 'Net worth in ' . $netWorthItem['currency_name'], 'type' => 'line', 'currency_symbol' => $netWorthItem['currency_symbol'], 'currency_code' => $netWorthItem['currency_code'], @@ -123,7 +124,7 @@ class ReportController extends Controller $current->addDays(7); } - $data = $this->generator->multiSet($chartData); + $data = $this->generator->multiSet($chartData); $cache->store($data); return response()->json($data); @@ -137,7 +138,7 @@ class ReportController extends Controller public function operations(Collection $accounts, Carbon $start, Carbon $end): JsonResponse { // chart properties for cache: - $cache = new CacheProperties(); + $cache = new CacheProperties(); $cache->addProperty('chart.report.operations'); $cache->addProperty($start); $cache->addProperty($accounts); @@ -145,6 +146,8 @@ class ReportController extends Controller if ($cache->has()) { return response()->json($cache->get()); } + + app('log')->debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray()); $format = app('navigation')->preferredCarbonFormat($start, $end); $titleFormat = app('navigation')->preferredCarbonLocalizedFormat($start, $end); @@ -154,23 +157,23 @@ class ReportController extends Controller $chartData = []; /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollectorInterface::class); + $collector = app(GroupCollectorInterface::class); $collector->setRange($start, $end)->withAccountInformation(); $collector->setXorAccounts($accounts); $collector->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::RECONCILIATION, TransactionType::TRANSFER]); - $journals = $collector->getExtractedJournals(); + $journals = $collector->getExtractedJournals(); // loop. group by currency and by period. /** @var array $journal */ foreach ($journals as $journal) { - $period = $journal['date']->format($format); - $currencyId = (int) $journal['currency_id']; + $period = $journal['date']->format($format); + $currencyId = (int)$journal['currency_id']; $data[$currencyId] ??= [ 'currency_id' => $currencyId, 'currency_symbol' => $journal['currency_symbol'], 'currency_code' => $journal['currency_code'], 'currency_name' => $journal['currency_name'], - 'currency_decimal_places' => (int) $journal['currency_decimal_places'], + 'currency_decimal_places' => (int)$journal['currency_decimal_places'], ]; $data[$currencyId][$period] ??= [ 'period' => $period, @@ -178,8 +181,8 @@ class ReportController extends Controller 'earned' => '0', ]; // in our outgoing? - $key = 'spent'; - $amount = app('steam')->positive($journal['amount']); + $key = 'spent'; + $amount = app('steam')->positive($journal['amount']); // deposit = incoming // transfer or reconcile or opening balance, and these accounts are the destination. @@ -192,8 +195,8 @@ class ReportController extends Controller // loop this data, make chart bars for each currency: /** @var array $currency */ foreach ($data as $currency) { - $income = [ - 'label' => (string) trans('firefly.box_earned_in_currency', ['currency' => $currency['currency_name']]), + $income = [ + 'label' => (string)trans('firefly.box_earned_in_currency', ['currency' => $currency['currency_name']]), 'type' => 'bar', 'backgroundColor' => 'rgba(0, 141, 76, 0.5)', // green 'currency_id' => $currency['currency_id'], @@ -201,8 +204,8 @@ class ReportController extends Controller 'currency_code' => $currency['currency_code'], 'entries' => [], ]; - $expense = [ - 'label' => (string) trans('firefly.box_spent_in_currency', ['currency' => $currency['currency_name']]), + $expense = [ + 'label' => (string)trans('firefly.box_spent_in_currency', ['currency' => $currency['currency_name']]), 'type' => 'bar', 'backgroundColor' => 'rgba(219, 68, 55, 0.5)', // red 'currency_id' => $currency['currency_id'], @@ -212,19 +215,25 @@ class ReportController extends Controller ]; // loop all possible periods between $start and $end $currentStart = clone $start; - while ($currentStart <= $end) { + $currentEnd = clone $end; + + // #8374. Sloppy fix for yearly charts. Not really interested in a better fix with v2 layout and all. + if ('1Y' === $preferredRange) { + $currentEnd = Navigation::endOfPeriod($currentEnd, $preferredRange); + } + while ($currentStart <= $currentEnd) { $key = $currentStart->format($format); $title = $currentStart->isoFormat($titleFormat); $income['entries'][$title] = app('steam')->bcround($currency[$key]['earned'] ?? '0', $currency['currency_decimal_places']); $expense['entries'][$title] = app('steam')->bcround($currency[$key]['spent'] ?? '0', $currency['currency_decimal_places']); $currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0); - } + }; - $chartData[] = $income; - $chartData[] = $expense; + $chartData[] = $income; + $chartData[] = $expense; } - $data = $this->generator->multiSet($chartData); + $data = $this->generator->multiSet($chartData); $cache->store($data); return response()->json($data);