diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php
index a9dc284a09..fbec5a00f4 100644
--- a/app/Http/Controllers/Chart/BudgetController.php
+++ b/app/Http/Controllers/Chart/BudgetController.php
@@ -85,8 +85,6 @@ class BudgetController extends Controller
/**
* Shows overview of a single budget.
*
- * TODO this chart is not multi-currency aware.
- *
* @param Budget $budget
*
* @return JsonResponse
@@ -106,27 +104,47 @@ class BudgetController extends Controller
if ($cache->has()) {
return response()->json($cache->get()); // @codeCoverageIgnore
}
-
- $step = $this->calculateStep($start, $end); // depending on diff, do something with range of chart.
- $budgetCollection = new Collection([$budget]);
- $chartData = [];
- $current = clone $start;
- $current = app('navigation')->startOfPeriod($current, $step);
- while ($end >= $current) {
+ $step = $this->calculateStep($start, $end); // depending on diff, do something with range of chart.
+ $collection = new Collection([$budget]);
+ $chartData = [];
+ $loopStart = clone $start;
+ $loopStart = app('navigation')->startOfPeriod($loopStart, $step);
+ $currencies = [];
+ $defaultEntries = [];
+ // echo '
';
+ while ($end >= $loopStart) {
/** @var Carbon $currentEnd */
- $currentEnd = app('navigation')->endOfPeriod($current, $step);
+ $loopEnd = app('navigation')->endOfPeriod($loopStart, $step);
if ('1Y' === $step) {
- $currentEnd->subDay(); // @codeCoverageIgnore
+ $loopEnd->subDay(); // @codeCoverageIgnore
}
- $spent = $this->opsRepository->spentInPeriod($budgetCollection, new Collection, $current, $currentEnd);
- $label = app('navigation')->periodShow($current, $step);
- $chartData[$label] = (float)bcmul($spent, '-1');
- $current = clone $currentEnd;
- $current->addDay();
+ $spent = $this->opsRepository->sumExpenses($loopStart, $loopEnd, null, $collection);
+ $label = trim(app('navigation')->periodShow($loopStart, $step));
+
+ foreach ($spent as $row) {
+ $currencyId = $row['currency_id'];
+ $currencies[$currencyId] = $currencies[$currencyId] ?? $row; // don't mind the field 'sum'
+ // also store this day's sum:
+ $currencies[$currencyId]['spent'][$label] = $row['sum'];
+ }
+ $defaultEntries[$label] = 0;
+ // set loop start to the next period:
+ $loopStart = clone $loopEnd;
+ $loopStart->addSecond();
}
-
- $data = $this->generator->singleSet((string)trans('firefly.spent'), $chartData);
-
+ // loop all currencies:
+ foreach ($currencies as $currencyId => $currency) {
+ $chartData[$currencyId] = [
+ 'label' => count($currencies) > 1 ? sprintf('%s (%s)', $budget->name, $currency['currency_name']) : $budget->name,
+ 'type' => 'bar',
+ 'currency_symbol' => $currency['currency_symbol'],
+ 'entries' => $defaultEntries,
+ ];
+ foreach ($currency['spent'] as $label => $spent) {
+ $chartData[$currencyId]['entries'][$label] = round(bcmul($spent, '-1'), $currency['currency_decimal_places']);
+ }
+ }
+ $data = $this->generator->multiSet(array_values($chartData));
$cache->store($data);
return response()->json($data);