add refund logic and fix books inventory logic
Deploy to Shared Hosting / Shared hosting deploy (push) Failing after 47s
Tests / PHPUnit (push) Failing after 1m20s

This commit is contained in:
root
2026-08-22 13:44:25 -04:00
parent 23d1cbb64c
commit d906a915d6
45 changed files with 4711 additions and 442 deletions
+12 -22
View File
@@ -47,8 +47,13 @@
<strong>School Year:</strong> <?= esc($schoolYear) ?>,
<strong>Semester:</strong> <?= esc($semester) ?>
</div>
<div><strong>On Hand:</strong> <?= (int)$onHand ?></div>
<div>
<strong>On Hand:</strong> <?= (int)$onHand ?>
</div>
</div>
<?php if ((int)($priceConfirmed ?? 0) !== 1 || (int)($unitChargeCents ?? 0) <= 0): ?>
<div class="mt-2 text-danger">This book cannot be distributed until its active-year charge price is confirmed.</div>
<?php endif; ?>
</div>
<!-- Submission form (POST) -->
@@ -57,6 +62,7 @@
<!-- Keep class section hidden -->
<input type="hidden" name="class_section_id" value="<?= esc($class_section_id) ?>">
<input type="hidden" name="item_id" value="<?= esc($item_id) ?>">
<input type="hidden" name="idempotency_key" value="<?= esc(hash('sha256', (string) microtime(true) . ':' . (string) random_int(1, PHP_INT_MAX))) ?>">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
@@ -96,7 +102,7 @@
class="form-check-input student-box"
name="student_ids[]"
value="<?= esc($sid) ?>"
<?= $given ? 'checked' : '' ?><?= $disabledAttr ?>>
<?= $given ? 'checked disabled' : $disabledAttr ?>>
</td>
<td><?= esc($student['school_id'] ?? '-') ?></td>
<td><?= esc($student['firstname'] ?? '') ?></td>
@@ -123,7 +129,7 @@
<textarea class="form-control" rows="2" name="note" placeholder="e.g., Distributed in class today"<?= $disabledAttr ?>></textarea>
</div>
<div class="d-flex gap-2">
<button type="button" class="btn btn-success"<?= $disabledAttr ?>>Deduct & Save</button>
<button type="submit" class="btn btn-success"<?= $disabledAttr ?><?= ((int)($priceConfirmed ?? 0) !== 1 || (int)($unitChargeCents ?? 0) <= 0) ? ' disabled' : '' ?>>Deduct & Save</button>
<button type="button" class="btn btn-secondary" id="clearSelectionBtn"<?= $disabledAttr ?>>Cancel</button>
</div>
</div>
@@ -148,34 +154,18 @@
document.getElementById('checkAllBtn')?.addEventListener('click', () => {
if (distributeReadonly) return;
document.querySelectorAll('.student-box').forEach(cb => cb.checked = true);
});
document.getElementById('uncheckAllBtn')?.addEventListener('click', () => {
if (distributeReadonly) return;
document.querySelectorAll('.student-box').forEach(cb => cb.checked = false);
});
</script>
<script>
// Auto-submit filter when book changes
document.getElementById('bookSelect')?.addEventListener('change', () => {
document.getElementById('filterForm').submit();
});
document.getElementById('checkAllBtn')?.addEventListener('click', () => {
if (distributeReadonly) return;
document.querySelectorAll('.student-box').forEach(cb => cb.checked = true);
document.querySelectorAll('.student-box:not(:disabled)').forEach(cb => cb.checked = true);
});
document.getElementById('uncheckAllBtn')?.addEventListener('click', () => {
if (distributeReadonly) return;
document.querySelectorAll('.student-box').forEach(cb => cb.checked = false);
document.querySelectorAll('.student-box:not(:disabled)').forEach(cb => cb.checked = false);
});
// Cancel button clears all checkboxes
document.getElementById('clearSelectionBtn')?.addEventListener('click', () => {
if (distributeReadonly) return;
document.querySelectorAll('.student-box').forEach(cb => cb.checked = false);
document.querySelectorAll('.student-box:not(:disabled)').forEach(cb => cb.checked = false);
});
</script>