@extends('layouts.app') @section('title', 'Year-End Close') @push('styles') @endpush @php $money = fn ($n) => ($n < 0 ? '(' : '') . '₦' . number_format(abs($n), 2) . ($n < 0 ? ')' : ''); $isClosed = $close?->isClosed(); $wasReopened = $close && !$isClosed; $statusOf = fn ($y) => ($closes[$y] ?? null)?->isClosed() ? 'closed' : (($closes[$y] ?? null) ? 'reopened' : ($y < today()->year ? 'open' : 'current')); $dot = ['closed' => '#15803d', 'reopened' => '#b45309', 'open' => '#b91c1c', 'current' => '#94a3b8']; @endphp @section('content')
{{-- Status banner --}} @if ($isClosed)
{{ $year }} is closed and locked
Closed {{ $close->closed_at?->format('M d, Y H:i') }} by {{ $close->closed_by ?? '—' }} @if ($close->closing_entry_id) · closing entry "{$year}-12-31"]) }}">#{{ $close->closing_entry_id }}@endif · {{ $close->net_income >= 0 ? 'Net income' : 'Net loss' }} {{ $money(abs($close->net_income)) }} to Retained Earnings.
@if ($can['delete'] && !$laterClosed) @endif
@if ($laterClosed)
To reopen {{ $year }}, reopen {{ $laterClosed->fiscal_year }} first — its retained earnings build on this year's.
@endif @elseif (!$yearEnded)
{{ $year }} is still in progress
It can be closed from December 31, {{ $year }}. The preview below shows where it stands today.
@else
{{ $year }} has ended but is still open
@if ($wasReopened)Reopened {{ $close->reopened_at?->format('M d, Y') }} by {{ $close->reopened_by ?? '—' }}. @endif Entries can still be posted into it. Close it once the year's books are final.
@if ($can['create']) @endif
@if ($earlierOpen->isNotEmpty())
{{ $earlierOpen->implode(', ') }} {{ $earlierOpen->count() === 1 ? 'is' : 'are' }} also still open — years are usually closed oldest first.
@endif @endif
@foreach ([ ['Revenue ' . ($isClosed ? 'closed' : 'to close'), $isClosed ? (float) $close->total_revenue : $preview['revenue'], 'bi-graph-up-arrow', '#dcfce7', '#15803d'], ['Expenses ' . ($isClosed ? 'closed' : 'to close'), $isClosed ? (float) $close->total_expense : $preview['expense'], 'bi-receipt', '#fee2e2', '#b91c1c'], [($isClosed ? (float) $close->net_income : $preview['net']) >= 0 ? 'Net income → Retained Earnings' : 'Net loss → Retained Earnings', $isClosed ? (float) $close->net_income : $preview['net'], 'bi-bank', '#eef2ff', '#4f46e5'], ] as [$label, $amount, $icon, $bg, $fg])
{{ $money($amount) }}{{ $label }}
@endforeach

{{ $isClosed ? "{$year} closing entry" : "Closing entry preview · {$year}" }}

{{ $isClosed ? 'Posted on December 31 and locked.' : 'What closing would post, dated December 31, ' . $year . '. Recalculated live from the ledger.' }}

@if ($isClosed && $close->closing_entry_id === null)
{{ $year }} had no revenue or expense activity — it was closed without an entry.
@elseif (!$isClosed && $preview['accounts']->isEmpty())
No revenue or expense activity in {{ $year }} — nothing to move to Retained Earnings.
@elseif (!$isClosed)
@foreach ($preview['accounts'] as $a) @php $debit = $a->isDebitNormal() ? ($a->net < 0 ? -$a->net : 0) : ($a->net > 0 ? $a->net : 0); $credit = $a->isDebitNormal() ? ($a->net > 0 ? $a->net : 0) : ($a->net < 0 ? -$a->net : 0); @endphp @endforeach
AccountTypeYear's balanceDebitCredit
{{ $a->account_code }}{{ $a->account_name }} {{ $a->account_type }} {{ $money($a->net) }} {{ $debit ? '₦' . number_format($debit, 2) : '' }} {{ $credit ? '₦' . number_format($credit, 2) : '' }}
3900Retained Earnings Equity {{ $preview['net'] < 0 ? '₦' . number_format(-$preview['net'], 2) : '' }} {{ $preview['net'] > 0 ? '₦' . number_format($preview['net'], 2) : '' }}
Every revenue and expense account is brought to zero for {{ $year }}; the difference is the year's result, which lands in Retained Earnings.
@else
The closing entry brought {{ $preview['accounts']->count() }} revenue/expense {{ Str::plural('account', $preview['accounts']->count()) }} to zero. "{$year}-12-31"]) }}">See its lines in the journal.
@endif

Opening balances for {{ $year + 1 }}

The balance sheet at December 31, {{ $year }} — carried forward by the ledger itself.

    @foreach (['Asset' => 'Assets', 'Liability' => 'Liabilities', 'Equity' => 'Equity (incl. retained & current earnings)'] as $type => $label)
  • {{ $label }}{{ $money($opening->data['totals'][$type]) }}
  • @endforeach
  • Status @if (abs($opening->data['variance']) < 0.01)Balanced@elseOut by {{ $money($opening->data['variance']) }}@endif

History

Every close and reopening.

    @forelse ($closes as $c)
  • {{ $c->fiscal_year }} {{ $c->isClosed() ? 'Closed' : 'Reopened' }}
    Closed {{ $c->closed_at?->format('M d, Y') }} by {{ $c->closed_by ?? '—' }} · {{ $money((float) $c->net_income) }} @if (!$c->isClosed())
    Reopened {{ $c->reopened_at?->format('M d, Y') }} by {{ $c->reopened_by ?? '—' }}@endif
  • @empty
  • No year has been closed yet.
  • @endforelse
@if (!$isClosed && $yearEnded && $can['create']) @endif @if ($isClosed && $can['delete'] && !$laterClosed) @endif @endsection