extend('layout/management_layout') ?> section('content') ?> [], 'rows' => []]; $promotionSummary = $promotion['summary'] ?? []; $promotionTable = $promotionTable ?? []; $promotionRows = $promotionTable['rows'] ?? ($promotion['rows'] ?? []); $promotionSort = (string) ($promotionTable['sort'] ?? 'class'); $promotionOrder = (string) ($promotionTable['order'] ?? 'asc'); $promotionPage = (int) ($promotionTable['page'] ?? 1); $promotionPerPage = (int) ($promotionTable['perPage'] ?? 25); $promotionTotal = (int) ($promotionTable['total'] ?? count($promotionRows)); $promotionPageCount = (int) ($promotionTable['pageCount'] ?? 1); $promotionFrom = (int) ($promotionTable['from'] ?? ($promotionTotal === 0 ? 0 : 1)); $promotionTo = (int) ($promotionTable['to'] ?? count($promotionRows)); $promotionPerPageOptions = $promotionTable['allowedPerPage'] ?? [10, 25, 50, 100]; $blockers = $preview['blockers'] ?? []; $warnings = $preview['warnings'] ?? []; $carryForward = $preview['carry_forward'] ?? []; $status = (string) ($source['status'] ?? ''); $batchStatus = (string) ($latestBatch['status'] ?? ''); $missingCarryForwardInvoices = (int) ($missingCarryForwardInvoices ?? 0); $money = static fn ($value): string => '$' . number_format((float) $value, 2); $score = static fn ($value): string => is_numeric($value) ? number_format((float) $value, 2) : '-'; $promotionUrl = static function (array $overrides = []) use ($source, $target, $promotionSort, $promotionOrder, $promotionPage, $promotionPerPage): string { $query = array_merge([ 'target_school_year_id' => $target['id'] ?? null, 'sort' => $promotionSort, 'order' => $promotionOrder, 'page' => $promotionPage, 'per_page' => $promotionPerPage, ], $overrides); $query = array_filter($query, static fn ($value): bool => $value !== null && $value !== ''); return site_url('administrator/school-years/' . (int) ($source['id'] ?? 0) . '/closing/preview?' . http_build_query($query)); }; $sortLink = static function (string $key, string $label, string $class = '') use ($promotionSort, $promotionOrder, $promotionUrl): string { $nextOrder = $promotionSort === $key && $promotionOrder === 'asc' ? 'desc' : 'asc'; $indicator = $promotionSort === $key ? ($promotionOrder === 'asc' ? ' (asc)' : ' (desc)') : ''; return '' . esc($label . $indicator) . ''; }; ?> getFlashdata('success')): ?>
getFlashdata('success')) ?>
getFlashdata('error')): ?>
getFlashdata('error')) ?>

End-Year Checklist:

Status: Next year: Generated:
Back to School Years
How to End This Year
  1. Clear all blocking issues below.
  2. Start the end-year process to lock the checklist.
  3. Confirm carry-forward balances, then mark this school year closed.
Students
Families
Invoices
Outstanding
Blocking Issues

No blocking issues found.

  • :
Warnings

No warnings found.

  • :
Finance Summary
Total invoiced
Total paid
Positive balances
Credits
End-Year Progress
  1. Checklist generated
  2. Validation
  3. End-year process
  4. Carry-forward completed
  5. Year closed
Student Promotion Preview
Promotion decisions must be generated and resolved before this school year can end.
Manage Promotion Decisions
Students
Decided
Pass
Pending
Other
Showing - of students
No active class assignments found for this school year.
1): ?>
Carry-Forward Families
Family Parent Source Balance Credits Adjustments Net Carry-Forward
No carry-forward balances found.
Create or select the next school year first. Resolve the blocking issues above first.
endSection() ?>