442 lines
24 KiB
PHP
442 lines
24 KiB
PHP
<?= $this->extend('layout/management_layout') ?>
|
|
<?= $this->section('content') ?>
|
|
|
|
<?php
|
|
$source = $preview['source'] ?? [];
|
|
$target = $preview['target'] ?? null;
|
|
$overview = $preview['overview'] ?? [];
|
|
$finance = $preview['finance'] ?? [];
|
|
$promotion = $preview['promotion'] ?? ['summary' => [], '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 '<a class="link-dark text-decoration-none ' . esc($class, 'attr') . '" href="' . esc($promotionUrl([
|
|
'sort' => $key,
|
|
'order' => $nextOrder,
|
|
'page' => 1,
|
|
]), 'attr') . '">' . esc($label . $indicator) . '</a>';
|
|
};
|
|
?>
|
|
|
|
<?php if (session()->getFlashdata('success')): ?>
|
|
<div class="alert alert-success"><?= esc(session()->getFlashdata('success')) ?></div>
|
|
<?php elseif (session()->getFlashdata('error')): ?>
|
|
<div class="alert alert-danger"><?= esc(session()->getFlashdata('error')) ?></div>
|
|
<?php endif; ?>
|
|
|
|
<div class="container-fluid py-3">
|
|
<div class="d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
|
|
<div>
|
|
<h2 class="mb-1">End-Year Checklist: <?= esc($source['name'] ?? '') ?></h2>
|
|
<div class="text-muted">
|
|
Status: <span class="fw-semibold"><?= esc(ucfirst($status)) ?></span>
|
|
<?php if ($target): ?>
|
|
<span class="mx-2">Next year: <span class="fw-semibold"><?= esc($target['name'] ?? '') ?></span></span>
|
|
<?php endif; ?>
|
|
<span>Generated: <?= esc($preview['generated_at'] ?? '') ?></span>
|
|
</div>
|
|
</div>
|
|
<a class="btn btn-outline-secondary" href="<?= site_url('administrator/school-years') ?>">Back to School Years</a>
|
|
</div>
|
|
|
|
<div class="border rounded bg-white p-3 mb-4">
|
|
<h5 class="mb-2">How to End This Year</h5>
|
|
<ol class="mb-0">
|
|
<li>Clear all blocking issues below.</li>
|
|
<li>Start the end-year process to lock the checklist.</li>
|
|
<li>Confirm carry-forward balances, then mark this school year closed.</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<form class="row g-2 align-items-end mb-4" method="get" action="<?= site_url('administrator/school-years/' . (int) ($source['id'] ?? 0) . '/closing/preview') ?>">
|
|
<div class="col-md-4">
|
|
<label class="form-label" for="target_school_year_id">Next school year</label>
|
|
<select class="form-select" id="target_school_year_id" name="target_school_year_id">
|
|
<option value="">Auto-select next draft year</option>
|
|
<?php foreach (($schoolYears ?? []) as $year): ?>
|
|
<?php if ((int) ($year['id'] ?? 0) !== (int) ($source['id'] ?? 0)): ?>
|
|
<option value="<?= (int) $year['id'] ?>" <?= $target && (int) $target['id'] === (int) $year['id'] ? 'selected' : '' ?>>
|
|
<?= esc($year['name'] ?? '') ?> (<?= esc($year['status'] ?? '') ?>)
|
|
</option>
|
|
<?php endif; ?>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<button class="btn btn-primary" type="submit">Refresh Checklist</button>
|
|
</div>
|
|
</form>
|
|
|
|
<div class="row g-3 mb-4">
|
|
<div class="col-md-3">
|
|
<div class="border rounded bg-white p-3 h-100">
|
|
<div class="text-muted small">Students</div>
|
|
<div class="fs-5 fw-semibold"><?= esc((string) ($overview['students'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="border rounded bg-white p-3 h-100">
|
|
<div class="text-muted small">Families</div>
|
|
<div class="fs-5 fw-semibold"><?= esc((string) ($overview['families'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="border rounded bg-white p-3 h-100">
|
|
<div class="text-muted small">Invoices</div>
|
|
<div class="fs-5 fw-semibold"><?= esc((string) ($overview['invoices'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="border rounded bg-white p-3 h-100">
|
|
<div class="text-muted small">Outstanding</div>
|
|
<div class="fs-5 fw-semibold"><?= esc($money($overview['total_outstanding'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-3 mb-4">
|
|
<div class="col-lg-6">
|
|
<div class="border rounded bg-white p-3 h-100">
|
|
<h5>Blocking Issues</h5>
|
|
<?php if ($blockers === []): ?>
|
|
<p class="text-muted mb-0">No blocking issues found.</p>
|
|
<?php else: ?>
|
|
<ul class="mb-0">
|
|
<?php foreach ($blockers as $finding): ?>
|
|
<li><strong><?= esc($finding['title']) ?>:</strong> <?= esc($finding['detail']) ?></li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-6">
|
|
<div class="border rounded bg-white p-3 h-100">
|
|
<h5>Warnings</h5>
|
|
<?php if ($warnings === []): ?>
|
|
<p class="text-muted mb-0">No warnings found.</p>
|
|
<?php else: ?>
|
|
<ul class="mb-0">
|
|
<?php foreach ($warnings as $finding): ?>
|
|
<li><strong><?= esc($finding['title']) ?>:</strong> <?= esc($finding['detail']) ?></li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-3 mb-4">
|
|
<div class="col-lg-5">
|
|
<div class="border rounded bg-white p-3 h-100">
|
|
<h5>Finance Summary</h5>
|
|
<dl class="row mb-0">
|
|
<dt class="col-7">Total invoiced</dt>
|
|
<dd class="col-5 text-end"><?= esc($money($finance['total_invoiced'] ?? 0)) ?></dd>
|
|
<dt class="col-7">Total paid</dt>
|
|
<dd class="col-5 text-end"><?= esc($money($finance['total_paid'] ?? 0)) ?></dd>
|
|
<dt class="col-7">Positive balances</dt>
|
|
<dd class="col-5 text-end"><?= esc($money($finance['positive_balance'] ?? 0)) ?></dd>
|
|
<dt class="col-7">Credits</dt>
|
|
<dd class="col-5 text-end"><?= esc($money($finance['credit_balance'] ?? 0)) ?></dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-7">
|
|
<div class="border rounded bg-white p-3 h-100">
|
|
<h5>End-Year Progress</h5>
|
|
<ol class="mb-0">
|
|
<li>Checklist generated</li>
|
|
<li class="<?= $blockers === [] ? '' : 'text-muted' ?>">Validation <?= $blockers === [] ? 'passed' : 'has blockers' ?></li>
|
|
<li class="<?= $batchStatus !== '' ? '' : 'text-muted' ?>">End-year process <?= $batchStatus !== '' ? esc($batchStatus) : 'not started' ?></li>
|
|
<li class="<?= in_array($batchStatus, ['executed', 'completed'], true) ? '' : 'text-muted' ?>">Carry-forward completed</li>
|
|
<li class="<?= $status === 'closed' ? '' : 'text-muted' ?>">Year closed</li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="border rounded bg-white p-3 mb-4">
|
|
<div class="d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
|
|
<div>
|
|
<h5 class="mb-1">Student Promotion Preview</h5>
|
|
<div class="text-muted small">Promotion decisions must be generated and resolved before this school year can end.</div>
|
|
</div>
|
|
<a class="btn btn-outline-primary btn-sm" href="<?= site_url('grading/decisions?' . http_build_query(['school_year' => $source['name'] ?? ''])) ?>">
|
|
Manage Promotion Decisions
|
|
</a>
|
|
</div>
|
|
|
|
<div class="row g-3 mb-3">
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Students</div>
|
|
<div class="fw-semibold"><?= esc((string) ($promotionSummary['total_students'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Decided</div>
|
|
<div class="fw-semibold"><?= esc((string) ($promotionSummary['with_decision'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Pass</div>
|
|
<div class="fw-semibold"><?= esc((string) ($promotionSummary['pass'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Other</div>
|
|
<div class="fw-semibold"><?= esc((string) ($promotionSummary['other_decision'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Queued</div>
|
|
<div class="fw-semibold"><?= esc((string) ($promotionSummary['queued'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Assigned</div>
|
|
<div class="fw-semibold"><?= esc((string) ($promotionSummary['assigned'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Applied</div>
|
|
<div class="fw-semibold"><?= esc((string) ($promotionSummary['applied'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Pending</div>
|
|
<div class="fw-semibold text-danger"><?= esc((string) ($promotionSummary['pending_decision'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Missing</div>
|
|
<div class="fw-semibold text-danger"><?= esc((string) ($promotionSummary['missing_decision'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-2 col-md-3 col-6">
|
|
<div class="border rounded p-2 h-100">
|
|
<div class="text-muted small">Missing Queue</div>
|
|
<div class="fw-semibold text-danger"><?= esc((string) ($promotionSummary['missing_queue'] ?? 0)) ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-flex flex-wrap justify-content-between align-items-center gap-2 mb-2">
|
|
<div class="text-muted small">
|
|
Showing <?= esc((string) $promotionFrom) ?>-<?= esc((string) $promotionTo) ?> of <?= esc((string) $promotionTotal) ?> students
|
|
</div>
|
|
<form class="d-flex align-items-center gap-2" method="get" action="<?= site_url('administrator/school-years/' . (int) ($source['id'] ?? 0) . '/closing/preview') ?>">
|
|
<?php if ($target): ?>
|
|
<input type="hidden" name="target_school_year_id" value="<?= (int) $target['id'] ?>">
|
|
<?php endif; ?>
|
|
<input type="hidden" name="sort" value="<?= esc($promotionSort, 'attr') ?>">
|
|
<input type="hidden" name="order" value="<?= esc($promotionOrder, 'attr') ?>">
|
|
<input type="hidden" name="page" value="1">
|
|
<label class="form-label small text-muted mb-0" for="promotion_per_page">Rows</label>
|
|
<select class="form-select form-select-sm w-auto" id="promotion_per_page" name="per_page" onchange="this.form.submit()">
|
|
<?php foreach ($promotionPerPageOptions as $option): ?>
|
|
<option value="<?= (int) $option ?>" <?= (int) $option === $promotionPerPage ? 'selected' : '' ?>>
|
|
<?= esc((string) $option) ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="table-responsive">
|
|
<table class="table table-sm align-middle no-mgmt-sticky" data-no-mgmt-sticky>
|
|
<thead>
|
|
<tr>
|
|
<th><?= $sortLink('student', 'Student') ?></th>
|
|
<th><?= $sortLink('school_id', 'School ID') ?></th>
|
|
<th><?= $sortLink('class', 'Class') ?></th>
|
|
<th class="text-end"><?= $sortLink('year_score', 'Year Score') ?></th>
|
|
<th><?= $sortLink('decision', 'Decision') ?></th>
|
|
<th><?= $sortLink('source', 'Source') ?></th>
|
|
<th><?= $sortLink('queue', 'Queue') ?></th>
|
|
<th><?= $sortLink('target', 'Next Year Placement') ?></th>
|
|
<th><?= $sortLink('status', 'Status') ?></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php if ($promotionTotal === 0): ?>
|
|
<tr><td colspan="9" class="text-muted">No active class assignments found for this school year.</td></tr>
|
|
<?php endif; ?>
|
|
<?php foreach ($promotionRows as $row): ?>
|
|
<?php
|
|
$rowStatus = (string) ($row['status'] ?? 'missing');
|
|
$statusClass = $rowStatus === 'decided' ? 'success' : 'danger';
|
|
$queueStatus = (string) ($row['queue_status'] ?? '');
|
|
$sourceLabel = (string) ($row['source'] ?? '');
|
|
if ($sourceLabel === 'automatic_kg_age') {
|
|
$sourceLabel = 'Auto KG age';
|
|
}
|
|
$targetLabel = trim((string) ($row['target_section'] ?? ''));
|
|
if ($targetLabel === '') {
|
|
$targetLabel = trim((string) ($row['target_class'] ?? ''));
|
|
}
|
|
?>
|
|
<tr>
|
|
<td><?= esc($row['student_name'] ?? ('Student #' . (int) ($row['student_id'] ?? 0))) ?></td>
|
|
<td><?= esc($row['school_id'] ?? '') ?></td>
|
|
<td><?= esc($row['class_section_name'] ?? '') ?></td>
|
|
<td class="text-end"><?= esc($score($row['year_score'] ?? null)) ?></td>
|
|
<td><?= esc(($row['decision'] ?? '') !== '' ? $row['decision'] : '-') ?></td>
|
|
<td><?= esc($sourceLabel) ?></td>
|
|
<td><?= esc($queueStatus !== '' ? ucfirst($queueStatus) : '-') ?></td>
|
|
<td><?= esc($targetLabel !== '' ? $targetLabel : '-') ?></td>
|
|
<td><span class="badge bg-<?= esc($statusClass) ?>"><?= esc(ucfirst($rowStatus)) ?></span></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<?php if ($promotionPageCount > 1): ?>
|
|
<?php
|
|
$pageStart = max(1, $promotionPage - 2);
|
|
$pageEnd = min($promotionPageCount, $promotionPage + 2);
|
|
if ($pageEnd - $pageStart < 4) {
|
|
$pageStart = max(1, $pageEnd - 4);
|
|
$pageEnd = min($promotionPageCount, $pageStart + 4);
|
|
}
|
|
?>
|
|
<nav aria-label="Student promotion pages">
|
|
<ul class="pagination pagination-sm justify-content-end mb-0">
|
|
<li class="page-item <?= $promotionPage <= 1 ? 'disabled' : '' ?>">
|
|
<a class="page-link" href="<?= esc($promotionUrl(['page' => max(1, $promotionPage - 1)]), 'attr') ?>">Previous</a>
|
|
</li>
|
|
<?php for ($pageNumber = $pageStart; $pageNumber <= $pageEnd; $pageNumber++): ?>
|
|
<li class="page-item <?= $pageNumber === $promotionPage ? 'active' : '' ?>">
|
|
<a class="page-link" href="<?= esc($promotionUrl(['page' => $pageNumber]), 'attr') ?>"><?= esc((string) $pageNumber) ?></a>
|
|
</li>
|
|
<?php endfor; ?>
|
|
<li class="page-item <?= $promotionPage >= $promotionPageCount ? 'disabled' : '' ?>">
|
|
<a class="page-link" href="<?= esc($promotionUrl(['page' => min($promotionPageCount, $promotionPage + 1)]), 'attr') ?>">Next</a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<div class="border rounded bg-white p-3 mb-4">
|
|
<h5>Carry-Forward Families</h5>
|
|
<div class="table-responsive">
|
|
<table class="table table-sm align-middle no-mgmt-sticky" data-no-mgmt-sticky>
|
|
<thead>
|
|
<tr>
|
|
<th>Family</th>
|
|
<th>Parent</th>
|
|
<th class="text-end">Source Balance</th>
|
|
<th class="text-end">Credits</th>
|
|
<th class="text-end">Adjustments</th>
|
|
<th class="text-end">Net Carry-Forward</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php if ($carryForward === []): ?>
|
|
<tr><td colspan="6" class="text-muted">No carry-forward balances found.</td></tr>
|
|
<?php endif; ?>
|
|
<?php foreach ($carryForward as $row): ?>
|
|
<tr>
|
|
<td><?= esc($row['family']) ?></td>
|
|
<td>
|
|
<div><?= esc($row['parent'] ?? ('Parent #' . (int) ($row['family_id'] ?? 0))) ?></div>
|
|
<?php if (! empty($row['parent_email'])): ?>
|
|
<div class="text-muted small"><?= esc($row['parent_email']) ?></div>
|
|
<?php endif; ?>
|
|
</td>
|
|
<td class="text-end"><?= esc($money($row['source_balance'])) ?></td>
|
|
<td class="text-end"><?= esc($money($row['credit_amount'])) ?></td>
|
|
<td class="text-end"><?= esc($money($row['adjustment_amount'])) ?></td>
|
|
<td class="text-end"><?= esc($money($row['carry_forward_amount'])) ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-flex flex-wrap gap-2 mb-4">
|
|
<?php if ($status === 'active' && $target && $blockers === []): ?>
|
|
<form action="<?= site_url('administrator/school-years/' . (int) $source['id'] . '/closing/start') ?>" method="post">
|
|
<?= csrf_field() ?>
|
|
<input type="hidden" name="target_school_year_id" value="<?= (int) $target['id'] ?>">
|
|
<button class="btn btn-warning" type="submit">Close Year</button>
|
|
</form>
|
|
<?php elseif ($status === 'active'): ?>
|
|
<button class="btn btn-warning" type="button" disabled>Close Year</button>
|
|
<span class="align-self-center text-muted small">
|
|
<?php if (! $target): ?>
|
|
Create or select the next school year first.
|
|
<?php elseif ($blockers !== []): ?>
|
|
Resolve the blocking issues above first.
|
|
<?php endif; ?>
|
|
</span>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($status === 'closing' && $batchStatus === 'started'): ?>
|
|
<form action="<?= site_url('administrator/school-years/' . (int) $source['id'] . '/closing/execute') ?>" method="post">
|
|
<?= csrf_field() ?>
|
|
<button class="btn btn-primary" type="submit">Confirm Carry-Forward</button>
|
|
</form>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($status === 'closing' && $batchStatus === 'executed'): ?>
|
|
<form action="<?= site_url('administrator/school-years/' . (int) $source['id'] . '/closing/complete') ?>" method="post">
|
|
<?= csrf_field() ?>
|
|
<button class="btn btn-success" type="submit">Close Year</button>
|
|
</form>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($status === 'closing' && ! in_array($batchStatus, ['executed', 'completed'], true)): ?>
|
|
<form action="<?= site_url('administrator/school-years/' . (int) $source['id'] . '/closing/cancel') ?>" method="post">
|
|
<?= csrf_field() ?>
|
|
<button class="btn btn-outline-secondary" type="submit">Cancel End-Year Process</button>
|
|
</form>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
|
|
<?= $this->endSection() ?>
|