Expanded reports.

This commit is contained in:
James Cole 2015-05-15 22:00:00 +02:00
parent aae003be33
commit 911c7c662a
5 changed files with 209 additions and 156 deletions

View File

@ -227,6 +227,7 @@ class ReportQuery implements ReportQueryInterface
$object->name = intval($object->account_encrypted) == 1 ? Crypt::decrypt($object->name) : $object->name;
}
);
$data->sortByDesc('queryAmount');
return $data;
}

View File

@ -30,6 +30,7 @@ class ReportController extends Controller
*/
public function __construct(ReportHelperInterface $helper, ReportQueryInterface $query)
{
parent::__construct();
$this->query = $query;
$this->helper = $helper;
@ -246,7 +247,7 @@ class ReportController extends Controller
return view(
'reports.month',
compact(
'income', 'expenses', 'budgets', 'accounts', 'categories','shared',
'income', 'expenses', 'budgets', 'accounts', 'categories', 'shared',
'date', 'subTitle', 'displaySum', 'subTitleIcon'
)
);
@ -259,25 +260,76 @@ class ReportController extends Controller
*/
public function year($year, $shared = false)
{
$subTitle = trans('firefly.reportForYear',['year' => $year]);
$date = new Carbon('01-01-' . $year);
$end = clone $date;
$subTitle = trans('firefly.reportForYear', ['year' => $year]);
$subTitleIcon = 'fa-bar-chart';
$totalExpense = 0;
$totalIncome = 0;
if ($shared == 'shared') {
$shared = true;
$subTitle = trans('firefly.reportForYearShared',['year' => $year]);
$shared = true;
$subTitle = trans('firefly.reportForYearShared', ['year' => $year]);
}
$date = new Carbon('01-01-' . $year);
$end = clone $date;
$end->endOfYear();
$subTitleIcon = 'fa-bar-chart';
$mainTitleIcon = 'fa-line-chart';
$balances = $this->helper->yearBalanceReport($date, $shared);
$groupedIncomes = $this->query->journalsByRevenueAccount($date, $end, $shared);
$groupedExpenses = $this->query->journalsByExpenseAccount($date, $end, $shared);
/**
* ALL ACCOUNTS
* Summarized as well.
*/
$accounts = $this->query->getAllAccounts($date, $end, $shared);
$accountsSums = ['start' => 0, 'end' => 0, 'diff' => 0];
// summarize:
foreach ($accounts as $account) {
$accountsSums['start'] += $account->startBalance;
$accountsSums['end'] += $account->endBalance;
$accountsSums['diff'] += ($account->endBalance - $account->startBalance);
}
/**
* ALL INCOMES.
* Grouped, sorted and summarized.
*/
$set = $this->query->incomeInPeriod($date, $end, $shared);
// group, sort and sum:
$incomes = [];
foreach ($set as $entry) {
$id = $entry->account_id;
$totalIncome += floatval($entry->queryAmount);
if (isset($incomes[$id])) {
$incomes[$id]['amount'] += floatval($entry->queryAmount);
$incomes[$id]['count']++;
} else {
$incomes[$id] = [
'amount' => floatval($entry->queryAmount),
'name' => $entry->name,
'count' => 1,
];
}
}
unset($set, $id);
/**
* GET ALL EXPENSES
* Summarized.
*/
$expenses = $this->query->journalsByExpenseAccount($date, $end, $shared);
foreach ($expenses as $expense) {
$totalExpense += floatval($expense->queryAmount);
}
return view(
'reports.year', compact('date','shared', 'groupedIncomes', 'groupedExpenses', 'year', 'balances', 'subTitle', 'subTitleIcon', 'mainTitleIcon')
'reports.year',
compact(
'date', // the date for this report.
'shared', // is a shared report?
'totalExpense', 'totalIncome', // total income and expense.
'accounts', // all accounts
'accountsSums', // sums for all accounts
'incomes', 'expenses', // expenses and incomes.
'subTitle', 'subTitleIcon' // subtitle and subtitle icon.
)
);
}

View File

@ -88,6 +88,13 @@ return [
'reportForYear' => 'Yearly report for :year',
'reportForYearShared' => 'Yearly report for :year (including shared accounts)',
'incomeVsExpenses' => 'Income vs. expenses',
'accountBalances' => 'Account balances',
'balanceStartOfYear' => 'Balance at start of year',
'balanceEndOfYear' => 'Balance at end of year',
'difference' => 'Difference',
'in' => 'In',
'out' => 'Out',
// charts:
'dayOfMonth' => 'Day of the month',

View File

@ -88,6 +88,13 @@ return [
'reportForYear' => 'Jaaroverzicht :year',
'reportForYearShared' => 'Jaaroverzicht :year (inclusief gedeelde rekeningen)',
'incomeVsExpenses' => 'Inkomsten tegenover uitgaven',
'accountBalances' => 'Rekeningsaldi',
'balanceStartOfYear' => 'Saldo aan het begin van het jaar',
'balanceEndOfYear' => 'Saldo aan het einde van het jaar',
'difference' => 'Verschil',
'in' => 'In',
'out' => 'Uit',
// charts:
'dayOfMonth' => 'Dag vd maand',

View File

@ -2,177 +2,163 @@
{% block content %}
{{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, date, shared) }}
<div class="row">
<div class="col-lg-10 col-md-8 col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-line-chart"></i>
Income vs. expenses
</div>
<div class="panel-body">
<div id="income-expenses-chart"></div>
</div>
</div>
</div>
<div class="col-lg-2 col-md-4 col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-calendar"></i>
Income vs. expenses
</div>
<div class="panel-body">
<div id="income-expenses-sum-chart"></div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-md-6 col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-credit-card fa-fw"></i>
Account balance
<div class="row">
<div class="col-lg-10 col-md-8 col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-line-chart"></i>
{{ 'incomeVsExpenses'|_ }}
</div>
<div class="panel-body">
<div id="income-expenses-chart"></div>
</div>
</div>
<table class="table table-bordered table-striped">
<tr>
<th>Name</th>
<th>Balance at start of year</th>
<th>Balance at end of year</th>
<th>Difference</th>
</tr>
{% set start = 0 %}
{% set end = 0 %}
{% set diff = 0 %}
{% for balance in balances %}
{% set start = start + balance.start %}
{% set end = end + balance.end %}
{% set diff = diff + (balance.end - balance.start) %}
{% if not balance.hide %}
</div>
<div class="col-lg-2 col-md-4 col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-calendar"></i>
{{ 'incomeVsExpenses'|_ }}
</div>
<div class="panel-body">
<div id="income-expenses-sum-chart"></div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-md-6 col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-credit-card fa-fw"></i>
{{ 'accountBalances'|_ }}
</div>
<table class="table table-bordered table-striped">
<tr>
<th>{{ 'name'|_ }}</th>
<th>{{ 'balanceStartOfYear'|_ }}</th>
<th>{{ 'balanceStartOfYear'|_ }}</th>
<th>{{ 'difference'|_ }}</th>
</tr>
{% for account in accounts %}
<tr>
<td>
<a href="{{ route('accounts.show', balance.account.id) }}">{{ balance.account.name }}</a>
{% if balance.shared %}
<small><em>shared</em></small>
{% endif %}
<a href="{{ route('accounts.show',account.id) }}" title="{{ account.name }}">{{ account.name }}</a>
</td>
<td>{{ balance.start|formatAmount }}</td>
<td>{{ balance.end|formatAmount }}</td>
<td>{{ (balance.end - balance.start)|formatAmount }}</td>
<td>{{ account.startBalance|formatAmount }}</td>
<td>{{ account.endBalance|formatAmount }}</td>
<td>{{ (account.endBalance - account.startBalance)|formatAmount }}</td>
</tr>
{% endif %}
{% endfor %}
<tr>
<td><em>Sum of sums</em></td>
<td>{{ start|formatAmount }}</td>
<td>{{ end|formatAmount }}</td>
<td>{{ diff|formatAmount }}</td>
</tr>
</table>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-fw fa-exchange" title="Transfer"></i>
Income vs. expense
{% endfor %}
<tr>
<td><em>Sum of sums</em></td>
<td>{{ accountsSums.start|formatAmount }}</td>
<td>{{ accountsSums.end|formatAmount }}</td>
<td>{{ accountsSums.diff|formatAmount }}</td>
</tr>
</table>
</div>
{% set incomeSum = 0 %}
{% set expenseSum = 0 %}
{% for income in groupedIncomes %}
{% set incomeSum = incomeSum + (income.queryAmount*-1) %}
{% endfor %}
{% for expense in groupedExpenses %}
{% set expenseSum = expenseSum + expense.queryAmount %}
{% endfor %}
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-fw fa-exchange" title="Transfer"></i>
{{ 'incomeVsExpenses'|_ }}
</div>
<table class="table table-bordered table-striped">
<tr>
<td>In</td>
<td>{{ incomeSum|formatAmount }}</td>
<td>{{ 'in'|_ }}</td>
<td>{{ totalIncome|formatAmount }}</td>
</tr>
<tr>
<td>Out</td>
<td><span class="text-danger">{{ expenseSum|formatAmountPlain }}</span></td>
<td>{{ 'out'|_ }}</td>
<td><span class="text-danger">{{ totalExpense|formatAmountPlain }}</span></td>
</tr>
<tr>
<td>Difference</td>
<td>{{ (incomeSum - expenseSum)|formatAmount }}</td>
<td>{{ 'difference'|_ }}</td>
<td>{{ (totalIncome - totalExpense)|formatAmount }}</td>
</tr>
</table>
</div>
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-long-arrow-right fa-fw"></i>
Income
</div>
<table class="table">
{% set sum = 0 %}
{% for income in groupedIncomes %}
{% set sum = sum + (income.queryAmount * -1) %}
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-long-arrow-right fa-fw"></i>
{{ 'income'|_ }}
</div>
<table class="table">
{% for id,row in incomes %}
<tr>
<td>
<a href="{{ route('accounts.show',id) }}" title="{{ row.name }}">{{ row.name }}</a>
{% if row.count > 1 %}
<br /><small>{{ row.count }} {{ 'transactions'|_|lower }}</small>
{% endif %}
</td>
<td>{{ row.amount|formatAmount }}</td>
</tr>
{% endfor %}
<tr>
<td><a href="{{route('accounts.show',income.account_id)}}">{{ income.name }}</a></td>
<td>{{ (income.queryAmount * -1)|formatAmount }}</td>
<td><em>{{ 'sum'|_ }}</em></td>
<td>{{ totalIncome|formatAmount }}</td>
</tr>
{% endfor %}
<tr>
<td><em>Sum</em></td>
<td>{{ sum|formatAmount }}</td>
</tr>
</table>
</div>
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-long-arrow-left fa-fw"></i>
Expenses
</table>
</div>
<table class="table">
{% set sum =0 %}
{% for expense in groupedExpenses %}
<tr>
<td><a href="{{route('accounts.show',expense.id)}}">{{ expense.name }}</a></td>
<td><span class="text-danger">{{ expense.queryAmount|formatAmountPlain }}</span></td>
</tr>
{% set sum = sum + (expense.queryAmount * -1) %}
{% endfor %}
<tr>
<td><em>Sum</em></td>
<td>{{ sum|formatAmount }}</td>
</tr>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-tasks fa-fw"></i>
Budgets
</div>
<div class="panel-body">
<div id="budgets"></div>
<div class="col-lg-3 col-md-3 col-sm-3">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-long-arrow-left fa-fw"></i>
{{ 'expenses'|_ }}
</div>
<table class="table">
{% set sum =0 %}
{% for expense in expenses %}
<tr>
<td><a href="{{ route('accounts.show',expense.id) }}">{{ expense.name }}</a></td>
<td><span class="text-danger">{{ expense.queryAmount|formatAmountPlain }}</span></td>
</tr>
{% set sum = sum + (expense.queryAmount * -1) %}
{% endfor %}
<tr>
<td><em>{{ 'sum'|_ }}</em></td>
<td>{{ sum|formatAmount }}</td>
</tr>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-tasks fa-fw"></i>
{{ 'budgets'|_ }}
</div>
<div class="panel-body">
<div id="budgets"></div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<!-- load the libraries and scripts necessary for Google Charts: -->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="js/gcharts.options.js"></script>
<script type="text/javascript" src="js/gcharts.js"></script>
<!-- load the libraries and scripts necessary for Google Charts: -->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="js/gcharts.options.js"></script>
<script type="text/javascript" src="js/gcharts.js"></script>
<script type="text/javascript">
var year = '{{year}}';
var shared = {% if shared %}'/shared'{% else %}''{% endif %};
</script>
<script type="text/javascript">
var year = '{{date.year}}';
var shared = {% if shared %}'/shared'
{% else %}''{% endif %};
</script>
<script type="text/javascript" src="js/reports.js"></script>
<script type="text/javascript" src="js/reports.js"></script>
{% endblock %}