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'] ?? ''); $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
Other
Queued
Assigned
Applied
Pending
Missing
Missing Queue
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() ?>