diff --git a/app/Http/Controllers/Json/BoxController.php b/app/Http/Controllers/Json/BoxController.php index 9a7511cea3..f380655390 100644 --- a/app/Http/Controllers/Json/BoxController.php +++ b/app/Http/Controllers/Json/BoxController.php @@ -22,11 +22,13 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Json; +use Amount; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; +use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface; @@ -88,13 +90,15 @@ class BoxController extends Controller } /** + * @param CurrencyRepositoryInterface $repository + * * @return \Illuminate\Http\JsonResponse */ - public function balance() + public function balance(CurrencyRepositoryInterface $repository) { + // Cache result, return cache if present. $start = session('start', Carbon::now()->startOfMonth()); $end = session('end', Carbon::now()->endOfMonth()); - $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); @@ -102,29 +106,56 @@ class BoxController extends Controller if ($cache->has()) { return Response::json($cache->get()); // @codeCoverageIgnore } + // prep some arrays: + $incomes = []; + $expenses = []; + $sums = []; - // try a collector for income: + // collect income of user: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAllAssetAccounts()->setRange($start, $end) ->setTypes([TransactionType::DEPOSIT]) ->withOpposingAccount(); - $income = strval($collector->getJournals()->sum('transaction_amount')); - $currency = app('amount')->getDefaultCurrency(); + $set = $collector->getJournals(); + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $currencyId = intval($transaction->transaction_currency_id); + $incomes[$currencyId] = $incomes[$currencyId] ?? '0'; + $incomes[$currencyId] = bcadd($incomes[$currencyId], $transaction->transaction_amount); + $sums[$currencyId] = $sums[$currencyId] ?? '0'; + $sums[$currencyId] = bcadd($sums[$currencyId], $transaction->transaction_amount); + } - // expense: - // try a collector for expenses: + // collect expenses /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAllAssetAccounts()->setRange($start, $end) ->setTypes([TransactionType::WITHDRAWAL]) ->withOpposingAccount(); - $expense = strval($collector->getJournals()->sum('transaction_amount')); + $set = $collector->getJournals(); + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $currencyId = intval($transaction->transaction_currency_id); + $expenses[$currencyId] = $expenses[$currencyId] ?? '0'; + $expenses[$currencyId] = bcadd($expenses[$currencyId], $transaction->transaction_amount); + $sums[$currencyId] = $sums[$currencyId] ?? '0'; + $sums[$currencyId] = bcadd($sums[$currencyId], $transaction->transaction_amount); + } + + // format amounts: + foreach ($sums as $currencyId => $amount) { + $currency = $repository->findNull($currencyId); + $sums[$currencyId] = Amount::formatAnything($currency, $sums[$currencyId], false); + $incomes[$currencyId] = Amount::formatAnything($currency, $incomes[$currencyId] ?? '0', false); + $expenses[$currencyId] = Amount::formatAnything($currency, $expenses[$currencyId] ?? '0', false); + } $response = [ - 'income' => app('amount')->formatAnything($currency, $income, false), - 'expense' => app('amount')->formatAnything($currency, $expense, false), - 'combined' => app('amount')->formatAnything($currency, bcadd($income, $expense), false), + 'incomes' => $incomes, + 'expenses' => $expenses, + 'sums' => $sums, + 'size' => count($sums), ]; $cache->store($response); diff --git a/public/js/ff/index.js b/public/js/ff/index.js index 38765985d1..a5698cea55 100644 --- a/public/js/ff/index.js +++ b/public/js/ff/index.js @@ -99,12 +99,34 @@ function getBillsBox() { * */ function getBalanceBox() { - // box-balance-total - // box-balance-out - // box-balance-in + // box-balance-sums + // box-balance-list $.getJSON('json/box/balance').done(function (data) { - $('#box-balance-total').html(data.combined); - $('#box-balance-in').html(data.income); - $('#box-balance-out').html(data.expense); + if (data.size === 1) { + // show balance in "sums", show single entry in list. + for (x in data.sums) { + $('#box-balance-sums').html(data.sums[x]); + $('#box-balance-list').html(data.incomes[x] + ' / ' + data.expenses[x]); + } + return; + } + // do not use "sums", only use list. + $('#box-balance-progress').remove(); + var expense, string, sum, income, current; + var count = 0; + for (x in data.sums) { + if (count > 1) { + return; + } + current = $('#box-balance-list').html(); + sum = data.sums[x]; + expense = data.expenses[x]; + income = data.incomes[x]; + string = income + ' / ' + expense + ': ' + sum; + + $('#box-balance-list').html(current + '' + string + '' + '
'); + count++; + } + return; }); } \ No newline at end of file