extend('layout/main_layout') ?> section('content') ?> attendance['timezone'] ?? user_timezone()); } catch (Throwable $e) { $displayTz = user_timezone(); } } if ($raw instanceof DateTimeInterface) { $dt = new DateTime('@' . $raw->getTimestamp()); return $dt->setTimezone(new DateTimeZone($displayTz)); } $s = trim((string)$raw); if ($s === '' || preg_match('/^0{4}-0{2}-0{2}/', $s)) return null; $srcTz = new DateTimeZone($sourceTz); $outTz = new DateTimeZone($displayTz); // Try full datetime first $dt = DateTime::createFromFormat('Y-m-d H:i:s', $s, $srcTz); if ($dt !== false) { return $dt->setTimezone($outTz); } // Try date-only $d = DateTime::createFromFormat('Y-m-d', $s, $srcTz); if ($d !== false) { if ($defaultTime) { [$H, $i, $sec] = array_map('intval', explode(':', $defaultTime)); $d->setTime($H, $i, $sec); } // else leave 00:00:00 return $d->setTimezone($outTz); } // Fallback parser try { $fallback = new DateTime($s, $srcTz); return $fallback->setTimezone($outTz); } catch (Throwable $e) { return null; } } } if (!function_exists('formatCalendarDateOnly')) { function formatCalendarDateOnly($raw): ?string { if (!$raw) return null; if ($raw instanceof DateTimeInterface) { return $raw->format('m-d-Y'); } $s = trim((string)$raw); if ($s === '' || preg_match('/^0{4}-0{2}-0{2}/', $s)) return null; if (preg_match('/^(\d{4})-(\d{2})-(\d{2})/', $s, $m)) { return $m[2] . '-' . $m[3] . '-' . $m[1]; } if (preg_match('/^(\d{1,2})[-\/](\d{1,2})[-\/](\d{4})/', $s, $m)) { return sprintf('%02d-%02d-%04d', (int)$m[1], (int)$m[2], (int)$m[3]); } $ts = strtotime($s); return $ts === false ? null : date('m-d-Y', $ts); } } ?>

Invoices and Payments

School Year:
$invoice): ?>
# Invoice Number Issue Date Due Date Description Balance Last Payment Amount Last Payment Date Status Actions
format('m-d-Y h:i A')) : '—' ?> $ $ format('m-d-Y h:i A')) : '—' ?> View/Print PDF
Event charges for Invoice #
Event Student Fee Status
$
No invoice found for this school year.
endSection() ?> section('scripts') ?> endSection() ?>