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; $object->name = intval($object->account_encrypted) == 1 ? Crypt::decrypt($object->name) : $object->name;
} }
); );
$data->sortByDesc('queryAmount');
return $data; return $data;
} }

View File

@@ -30,6 +30,7 @@ class ReportController extends Controller
*/ */
public function __construct(ReportHelperInterface $helper, ReportQueryInterface $query) public function __construct(ReportHelperInterface $helper, ReportQueryInterface $query)
{ {
parent::__construct();
$this->query = $query; $this->query = $query;
$this->helper = $helper; $this->helper = $helper;
@@ -246,7 +247,7 @@ class ReportController extends Controller
return view( return view(
'reports.month', 'reports.month',
compact( compact(
'income', 'expenses', 'budgets', 'accounts', 'categories','shared', 'income', 'expenses', 'budgets', 'accounts', 'categories', 'shared',
'date', 'subTitle', 'displaySum', 'subTitleIcon' 'date', 'subTitle', 'displaySum', 'subTitleIcon'
) )
); );
@@ -259,25 +260,76 @@ class ReportController extends Controller
*/ */
public function year($year, $shared = false) public function year($year, $shared = false)
{ {
$date = new Carbon('01-01-' . $year);
$subTitle = trans('firefly.reportForYear',['year' => $year]); $end = clone $date;
$subTitle = trans('firefly.reportForYear', ['year' => $year]);
$subTitleIcon = 'fa-bar-chart';
$totalExpense = 0;
$totalIncome = 0;
if ($shared == 'shared') { if ($shared == 'shared') {
$shared = true; $shared = true;
$subTitle = trans('firefly.reportForYearShared',['year' => $year]); $subTitle = trans('firefly.reportForYearShared', ['year' => $year]);
} }
$date = new Carbon('01-01-' . $year);
$end = clone $date;
$end->endOfYear(); $end->endOfYear();
$subTitleIcon = 'fa-bar-chart'; /**
$mainTitleIcon = 'fa-line-chart'; * ALL ACCOUNTS
$balances = $this->helper->yearBalanceReport($date, $shared); * Summarized as well.
$groupedIncomes = $this->query->journalsByRevenueAccount($date, $end, $shared); */
$groupedExpenses = $this->query->journalsByExpenseAccount($date, $end, $shared); $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( 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', 'reportForYear' => 'Yearly report for :year',
'reportForYearShared' => 'Yearly report for :year (including shared accounts)', '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: // charts:
'dayOfMonth' => 'Day of the month', 'dayOfMonth' => 'Day of the month',

View File

@@ -88,6 +88,13 @@ return [
'reportForYear' => 'Jaaroverzicht :year', 'reportForYear' => 'Jaaroverzicht :year',
'reportForYearShared' => 'Jaaroverzicht :year (inclusief gedeelde rekeningen)', '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: // charts:
'dayOfMonth' => 'Dag vd maand', 'dayOfMonth' => 'Dag vd maand',

View File

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