Fix semester context, attendance rosters, and billing workflows
Deploy to Shared Hosting / Shared hosting deploy (push) Failing after 31s
Tests / PHPUnit (push) Failing after 55s

- load global semester helpers consistently and use date-based semester defaults
- fix grading and daily attendance duplicate student/section rows
- keep attendance violations scoped to the current semester by default
- update invoice, refund, discount, payment, and financial aid flows
- add configuration cleanup migrations for duplicate calendar/semester keys
- refresh parent registration/report-card and print request handling
- update related models, services, views, cron notes, and test coverage
This commit is contained in:
root
2026-08-16 17:41:11 -04:00
parent 36c7e3fc6d
commit 0ac3a8375e
99 changed files with 1598 additions and 814 deletions
+31 -1
View File
@@ -1,11 +1,27 @@
<?= $this->extend('layout/main_layout') ?>
<?= $this->section('content') ?>
<?php $isSchoolYearReadonly = (bool) ($isSchoolYearReadonly ?? false); ?>
<?php
$isSchoolYearReadonly = (bool) ($isSchoolYearReadonly ?? false);
$successMessage = session()->getFlashdata('success');
$errorMessage = session()->getFlashdata('error');
?>
<div class="container-fluid py-5">
<div class="row">
<div class="col-md-12">
<h2>Print/Copy Requests</h2>
<?php if ($successMessage): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?= esc($successMessage) ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if ($errorMessage): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?= esc($errorMessage) ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if ($isSchoolYearReadonly): ?>
<div class="alert alert-warning">
This school year is read-only. Existing requests are visible, but changes are disabled.
@@ -46,6 +62,7 @@
<div class="tab-pane fade show active" id="tab-print" role="tabpanel" aria-labelledby="tab-print-tab">
<form action="<?= site_url('print-requests/create') ?>" method="post" enctype="multipart/form-data">
<?= csrf_field() ?>
<input type="hidden" name="request_token" value="<?= esc($printRequestToken ?? '') ?>">
<?php if (session()->has('errors')): ?>
<div class="alert alert-danger">
<ul>
@@ -128,6 +145,7 @@
</div>
<form id="copyRequestForm" method="post" action="<?= site_url('print-requests/create-copy') ?>">
<?= csrf_field() ?>
<input type="hidden" name="request_token" value="<?= esc($copyRequestToken ?? '') ?>">
<div class="row g-3">
<div class="col-md-4">
<label for="copy_num_copies" class="form-label">Number of Copies</label>
@@ -353,8 +371,14 @@ document.addEventListener('DOMContentLoaded', function() {
const dateSelect = document.getElementById('required_by_date');
const timeSelect = document.getElementById('required_by_time');
const hiddenInput = document.getElementById('required_by');
const submitButton = createForm.querySelector('button[type="submit"]');
if (dateSelect.value && timeSelect.value) {
hiddenInput.value = dateSelect.value + 'T' + timeSelect.value;
if (submitButton) {
submitButton.disabled = true;
submitButton.dataset.originalText = submitButton.textContent;
submitButton.textContent = 'Submitting...';
}
} else {
if (!dateSelect.value) {
alert('Please select a date.');
@@ -483,6 +507,7 @@ if (copyForm) {
const dateSelect = document.getElementById('copy_required_by_date');
const timeSelect = document.getElementById('copy_required_by_time');
const hiddenInput = document.getElementById('copy_required_by');
const submitButton = copyForm.querySelector('button[type="submit"]');
if (!dateSelect || !dateSelect.value) {
alert('Please select a date for the copy request.');
e.preventDefault();
@@ -496,6 +521,11 @@ if (copyForm) {
if (hiddenInput) {
hiddenInput.value = dateSelect.value + 'T' + timeSelect.value;
}
if (submitButton) {
submitButton.disabled = true;
submitButton.dataset.originalText = submitButton.textContent;
submitButton.textContent = 'Submitting...';
}
});
}
</script>