From 7eb9086a2896b475bb68fa3df7744bc322378c09 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Aug 2019 10:25:23 +0200 Subject: [PATCH] Make budget tables multi-currency --- .../Controllers/Report/BudgetController.php | 5 +- app/Repositories/Bill/BillRepository.php | 9 +-- app/Repositories/Budget/BudgetRepository.php | 62 ++++++++++++------- .../views/v1/reports/partials/bills.twig | 2 +- .../v1/reports/partials/budget-period.twig | 15 ++--- 5 files changed, 54 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/Report/BudgetController.php b/app/Http/Controllers/Report/BudgetController.php index 4cc0ac2cda..38aa085ebd 100644 --- a/app/Http/Controllers/Report/BudgetController.php +++ b/app/Http/Controllers/Report/BudgetController.php @@ -100,7 +100,8 @@ class BudgetController extends Controller $repository = app(BudgetRepositoryInterface::class); $budgets = $repository->getBudgets(); $data = $repository->getBudgetPeriodReport($budgets, $accounts, $start, $end); - $data[0] = $repository->getNoBudgetPeriodReport($accounts, $start, $end); // append report data for "no budget" + $noBudget = $repository->getNoBudgetPeriodReport($accounts, $start, $end); // append report data for "no budget" + $data = array_merge($data, $noBudget); $report = $this->filterPeriodReport($data); // depending on the carbon format (a reliable way to determine the general date difference) @@ -114,7 +115,7 @@ class BudgetController extends Controller $start->startOfMonth(); } - $periods = app('navigation')->listOfPeriods($start, $end); + $periods = app('navigation')->listOfPeriods($start, $end); try { $result = view('reports.partials.budget-period', compact('report', 'periods'))->render(); // @codeCoverageIgnoreStart diff --git a/app/Repositories/Bill/BillRepository.php b/app/Repositories/Bill/BillRepository.php index 17e09784ef..137c219d57 100644 --- a/app/Repositories/Bill/BillRepository.php +++ b/app/Repositories/Bill/BillRepository.php @@ -182,10 +182,8 @@ class BillRepository implements BillRepositoryInterface */ public function getBillsForAccounts(Collection $accounts): Collection { - $fields = ['bills.id', 'bills.created_at', 'bills.updated_at', 'bills.deleted_at', 'bills.user_id', 'bills.name', 'bills.match', 'bills.amount_min', - 'bills.amount_max', 'bills.date', 'bills.transaction_currency_id', 'bills.repeat_freq', 'bills.skip', 'bills.automatch', 'bills.active', - 'bills.name_encrypted', - 'bills.match_encrypted',]; + $fields = ['bills.id', 'bills.created_at', 'bills.updated_at', 'bills.deleted_at', 'bills.user_id', 'bills.name', 'bills.amount_min', + 'bills.amount_max', 'bills.date', 'bills.transaction_currency_id', 'bills.repeat_freq', 'bills.skip', 'bills.automatch', 'bills.active',]; $ids = $accounts->pluck('id')->toArray(); $set = $this->user->bills() ->leftJoin( @@ -206,7 +204,6 @@ class BillRepository implements BillRepositoryInterface ->orderBy('bills.name', 'ASC') ->groupBy($fields) ->get($fields); - return $set; } @@ -457,7 +454,7 @@ class BillRepository implements BillRepositoryInterface $currentStart = clone $nextExpectedMatch; } $simple = $set->each( - function (Carbon $date) { + static function (Carbon $date) { return $date->format('Y-m-d'); } ); diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 1c1418894f..08c4af14a1 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -563,17 +563,8 @@ class BudgetRepository implements BudgetRepositoryInterface public function getBudgetPeriodReport(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array { $carbonFormat = Navigation::preferredCarbonFormat($start, $end); + $data = []; - $data = []; - // prep data array: - /** @var Budget $budget */ - foreach ($budgets as $budget) { - $data[$budget->id] = [ - 'name' => $budget->name, - 'sum' => '0', - 'entries' => [], - ]; - } // get all transactions: /** @var GroupCollectorInterface $collector */ @@ -585,9 +576,25 @@ class BudgetRepository implements BudgetRepositoryInterface // loop transactions: /** @var array $journal */ foreach ($journals as $journal) { - $budgetId = (int)$journal['budget_id']; - $date = $journal['date']->format($carbonFormat); - $data[$budgetId]['entries'][$date] = bcadd($data[$budgetId]['entries'][$date] ?? '0', $journal['amount']); + // prep data array for currency: + $budgetId = (int)$journal['budget_id']; + $budgetName = $journal['budget_name']; + $currencyId = (int)$journal['currency_id']; + $key = sprintf('%d-%d', $budgetId, $currencyId); + + $data[$key] = $data[$key] ?? [ + 'id' => $budgetId, + 'name' => sprintf('%s (%s)', $budgetName, $journal['currency_name']), + 'sum' => '0', + 'currency_id' => $currencyId, + 'currency_code' => $journal['currency_code'], + 'currency_name' => $journal['currency_name'], + 'currency_symbol' => $journal['currency_symbol'], + 'currency_decimal_places' => $journal['currency_decimal_places'], + 'entries' => [], + ]; + $date = $journal['date']->format($carbonFormat); + $data[$key]['entries'][$date] = bcadd($data[$budgetId]['entries'][$date] ?? '0', $journal['amount']); } return $data; @@ -647,23 +654,32 @@ class BudgetRepository implements BudgetRepositoryInterface $collector->setTypes([TransactionType::WITHDRAWAL]); $collector->withoutBudget(); $journals = $collector->getExtractedJournals(); - $result = [ - 'entries' => [], - 'name' => (string)trans('firefly.no_budget'), - 'sum' => '0', - ]; + $data = []; /** @var array $journal */ foreach ($journals as $journal) { - $date = $journal['date']->format($carbonFormat); + $currencyId = (int)$journal['currency_id']; - if (!isset($result['entries'][$date])) { - $result['entries'][$date] = '0'; + $data[$currencyId] = $data[$currencyId] ?? [ + 'id' => 0, + 'name' => sprintf('%s (%s)', trans('firefly.no_budget'), $journal['currency_name']), + 'sum' => '0', + 'currency_id' => $currencyId, + 'currency_code' => $journal['currency_code'], + 'currency_name' => $journal['currency_name'], + 'currency_symbol' => $journal['currency_symbol'], + 'currency_decimal_places' => $journal['currency_decimal_places'], + 'entries' => [], + ]; + $date = $journal['date']->format($carbonFormat); + + if (!isset($data[$currencyId]['entries'][$date])) { + $data[$currencyId]['entries'][$date] = '0'; } - $result['entries'][$date] = bcadd($result['entries'][$date], $journal['amount']); + $data[$currencyId]['entries'][$date] = bcadd($data[$currencyId]['entries'][$date], $journal['amount']); } - return $result; + return $data; } /** diff --git a/resources/views/v1/reports/partials/bills.twig b/resources/views/v1/reports/partials/bills.twig index d9fbad38a6..f5106a04d0 100644 --- a/resources/views/v1/reports/partials/bills.twig +++ b/resources/views/v1/reports/partials/bills.twig @@ -10,7 +10,7 @@ {% for bill in report.bills %} - {% if bill.expected_dates|length > 0 and bill.paid_moments|length > 0 and bill.active %} + {% if (bill.expected_dates|length > 0 or bill.paid_moments|length > 0) and bill.active %} {{ bill.name }} diff --git a/resources/views/v1/reports/partials/budget-period.twig b/resources/views/v1/reports/partials/budget-period.twig index 33fb487ff8..11655bebde 100644 --- a/resources/views/v1/reports/partials/budget-period.twig +++ b/resources/views/v1/reports/partials/budget-period.twig @@ -9,32 +9,33 @@ - {% for id, info in report %} + {% for key, info in report %} - {% if id != 0 %} - + {% if info.id != 0 %} + {% else %} {% endif %} - {{ info.name }} + {{ info.name }} {% for key, period in periods %} {% if(info.entries[key]) %} - {{ info.entries[key]|formatAmount }} + {{ formatAmountBySymbol(info.entries[key], info.currency_symbol, info.currency_decimal_places) }} {% else %} - {{ 0|formatAmount }} + {{ formatAmountBySymbol(0, info.currency_symbol, info.currency_decimal_places) }} + {% endif %} {% endfor %} - {{ info.sum|formatAmount }} + {{ formatAmountBySymbol(info.sum, info.currency_symbol, info.currency_decimal_places) }} {% endfor %}