Files
pollux/app/Http/Controllers/ReportsController.php
T

132 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Project;
use App\SubBooking;
use Illuminate\Http\Request;
class ReportsController extends Controller
{
/**
* Display the port of a project.
*
* @return \Illuminate\Http\Response
*/
public function project(Project $project)
{
$id = $project->id;
$projectBookings =
SubBooking::select('id', 'account_type_id', 'reference', 'amount',
'booking_id')
->whereHas('project', function($query) use ($id) {
return $query->whereId($id);
})
->with('accountType:id,name,account_class_id',
'accountType.accountClass:id,io_type_id,name,scope_id',
'accountType.accountClass.scope:id,name',
'accountType.accountClass.ioType:id,name,factor',
'booking:id,date,person_or_company')
->get()
->sortBy('booking.date');
$incomes = $projectBookings
->where('accountType.accountClass.ioType.factor', '>', 0)
->sum('amount');
$expeditures = $projectBookings
->where('accountType.accountClass.ioType.factor', '<', 0)
->sum('amount');
return view('reports.project', compact('project', 'projectBookings',
'incomes', 'expeditures'));
}
/**
* Display the monthly balances during a year.
*
* @return \Illuminate\Http\Response
*/
public function balances($year)
{
# Load monthly incomes, expeditures and the start account balance from
# the database.
$incomes = SubBooking::incomesInInterval(firstDayOfYear($year),
lastDayOfYear($year), true)->sortBy('month');
$expeditures = SubBooking::expedituresInInterval(firstDayOfYear($year),
lastDayOfYear($year), true)->sortBy('month');
$startBalance = SubBooking::balanceAt(lastDayOfYear($year - 1));
# If the data contains future months remove the data of all incomplete
# months.
if (date('Y') <= $year) {
foreach ([$incomes, $expeditures] as $cashflows) {
foreach ($cashflows as $key => $cashflow) {
if ($cashflow->month >= date('n')) {
$cashflows->forget($key);
}
}
}
}
# Create a collection of balances, every entry holds information about
# one month.
$balances = collect();
for ($i = 0; $i < count($incomes); $i++) {
$balance = collect();
$balance->incomes = $incomes[$i]->incomes;
$balance->expeditures = $expeditures[$i]->expeditures;
$balance->monthBalance = $incomes[$i]->incomes
+ $expeditures[$i]->expeditures;
# Set date separately if the next month is in the new year.
if ($incomes[$i]->month == 12) {
$balance->date = firstDayOfYear($incomes[$i]->year + 1);
} else {
$balance->date = startOfMonth($incomes[$i]->year,
$incomes[$i]->month + 1);
}
# Set the balance of the first month separately since the value
# depends on the startBalance value and not on a value already
# existing in the balances collection.
if ($incomes[$i]->month == 1) {
$balance->accountBalance = $startBalance
+ $balance->monthBalance;
} else {
$balance->accountBalance = $balances[$i - 1]->accountBalance
+ $balance->monthBalance;
}
# Add complete balance to the balances collection
$balances->push($balance);
}
return view('reports.balances', compact('year', 'balances', 'startBalance'));
}
/**
* Display the bookings sorted by scopes.
*
* @return \Illuminate\Http\Response
*/
public function scopes($type, $year)
{
//
}
/**
* Display a list of all open targets.
*
* @return \Illuminate\Http\Response
*/
public function targets()
{
//
}
}