This commit is contained in:
James Cole 2018-03-10 06:49:03 +01:00
parent 0d58530f55
commit a436c55c50
No known key found for this signature in database
GPG Key ID: C16961E655E74B5E
2 changed files with 70 additions and 17 deletions

View File

@ -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);

34
public/js/ff/index.js vendored
View File

@ -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 + '<span title="' + string + '">' + string + '</span>' + '<br>');
count++;
}
return;
});
}