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; namespace FireflyIII\Http\Controllers\Json;
use Amount;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
@ -88,13 +90,15 @@ class BoxController extends Controller
} }
/** /**
* @param CurrencyRepositoryInterface $repository
*
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function balance() public function balance(CurrencyRepositoryInterface $repository)
{ {
// Cache result, return cache if present.
$start = session('start', Carbon::now()->startOfMonth()); $start = session('start', Carbon::now()->startOfMonth());
$end = session('end', Carbon::now()->endOfMonth()); $end = session('end', Carbon::now()->endOfMonth());
$cache = new CacheProperties; $cache = new CacheProperties;
$cache->addProperty($start); $cache->addProperty($start);
$cache->addProperty($end); $cache->addProperty($end);
@ -102,29 +106,56 @@ class BoxController extends Controller
if ($cache->has()) { if ($cache->has()) {
return Response::json($cache->get()); // @codeCoverageIgnore return Response::json($cache->get()); // @codeCoverageIgnore
} }
// prep some arrays:
$incomes = [];
$expenses = [];
$sums = [];
// try a collector for income: // collect income of user:
/** @var JournalCollectorInterface $collector */ /** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class); $collector = app(JournalCollectorInterface::class);
$collector->setAllAssetAccounts()->setRange($start, $end) $collector->setAllAssetAccounts()->setRange($start, $end)
->setTypes([TransactionType::DEPOSIT]) ->setTypes([TransactionType::DEPOSIT])
->withOpposingAccount(); ->withOpposingAccount();
$income = strval($collector->getJournals()->sum('transaction_amount')); $set = $collector->getJournals();
$currency = app('amount')->getDefaultCurrency(); /** @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: // collect expenses
// try a collector for expenses:
/** @var JournalCollectorInterface $collector */ /** @var JournalCollectorInterface $collector */
$collector = app(JournalCollectorInterface::class); $collector = app(JournalCollectorInterface::class);
$collector->setAllAssetAccounts()->setRange($start, $end) $collector->setAllAssetAccounts()->setRange($start, $end)
->setTypes([TransactionType::WITHDRAWAL]) ->setTypes([TransactionType::WITHDRAWAL])
->withOpposingAccount(); ->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 = [ $response = [
'income' => app('amount')->formatAnything($currency, $income, false), 'incomes' => $incomes,
'expense' => app('amount')->formatAnything($currency, $expense, false), 'expenses' => $expenses,
'combined' => app('amount')->formatAnything($currency, bcadd($income, $expense), false), 'sums' => $sums,
'size' => count($sums),
]; ];
$cache->store($response); $cache->store($response);

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

@ -99,12 +99,34 @@ function getBillsBox() {
* *
*/ */
function getBalanceBox() { function getBalanceBox() {
// box-balance-total // box-balance-sums
// box-balance-out // box-balance-list
// box-balance-in
$.getJSON('json/box/balance').done(function (data) { $.getJSON('json/box/balance').done(function (data) {
$('#box-balance-total').html(data.combined); if (data.size === 1) {
$('#box-balance-in').html(data.income); // show balance in "sums", show single entry in list.
$('#box-balance-out').html(data.expense); 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;
}); });
} }