diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index c4285ed..9a19919 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -51,7 +51,62 @@ class ReportsController extends Controller */ 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')); } /** diff --git a/app/SubBooking.php b/app/SubBooking.php index 5dc0658..200a687 100644 --- a/app/SubBooking.php +++ b/app/SubBooking.php @@ -213,7 +213,7 @@ class SubBooking extends Model } } - return $result; + return $result->sortBy('month')->sortBy('year')->values(); } return $result->get(); diff --git a/resources/views/bookings/index.blade.php b/resources/views/bookings/index.blade.php index 2a142ba..80e73cd 100644 --- a/resources/views/bookings/index.blade.php +++ b/resources/views/bookings/index.blade.php @@ -5,6 +5,7 @@ @section('subnav')
| Datum | +Kontostand | +Monatssaldo | +Abgänge | +Zugänge | +
|---|---|---|---|---|
| {{ formatDate(firstDayOfYear($year)) }} | +{!! formatAmount($startBalance) !!} | ++ | + | + |
| {{ formatDate($balance->date) }} | +{!! formatAmount($balance->accountBalance) !!} | +{!! formatAmount($balance->monthBalance) !!} | +{!! formatAmount($balance->expeditures) !!} | +{!! formatAmount($balance->incomes) !!} | +