diff --git a/app/Controllers/View/ExamDraftController.php b/app/Controllers/View/ExamDraftController.php index 6031752..7575778 100644 --- a/app/Controllers/View/ExamDraftController.php +++ b/app/Controllers/View/ExamDraftController.php @@ -182,7 +182,7 @@ class ExamDraftController extends BaseController } $classSectionId = (int) ($this->request->getPost('class_section_id') ?? session()->get('class_section_id') ?? 0); - $examType = trim((string) $this->request->getPost('exam_type')); + $examType = $this->normalizeExamType($this->request->getPost('exam_type')); $authorComment = trim((string) $this->request->getPost('author_comment')); if ($classSectionId <= 0) { @@ -226,7 +226,11 @@ class ExamDraftController extends BaseController ->orderBy('version', 'DESC') ->first(); - $title = $examType ?: 'Exam Draft'; + if ($examType === '') { + return redirect()->back()->withInput()->with('error', 'Select an exam type before submitting.'); + } + + $title = $examType; if ($saveAsDraft) { if ($teacherFile === null && (empty($existingDraft) || empty($this->draftTeacherFile($existingDraft)))) { @@ -235,7 +239,7 @@ class ExamDraftController extends BaseController if (!empty($existingDraft) && strtolower((string) ($existingDraft['status'] ?? '')) === 'draft') { $draftRowId = (int) ($existingDraft['id'] ?? 0); $updateDraft = [ - 'exam_type' => $examType ?: null, + 'exam_type' => $examType, 'draft_title' => $title, 'author_comment' => $authorComment === '' ? null : $authorComment, 'status' => 'draft', @@ -263,7 +267,7 @@ class ExamDraftController extends BaseController 'class_section_id' => $classSectionId, 'semester' => $this->semester, 'school_year' => $this->schoolYear, - 'exam_type' => $examType ?: null, + 'exam_type' => $examType, 'draft_title' => $title, 'author_comment' => $authorComment === '' ? null : $authorComment, 'status' => 'draft', @@ -280,9 +284,6 @@ class ExamDraftController extends BaseController } $existingStatus = strtolower((string) ($existingDraft['status'] ?? '')); - if ($examType === '') { - return redirect()->back()->withInput()->with('error', 'Select an exam type before submitting.'); - } if ($teacherFile === null) { return redirect()->back()->withInput()->with('error', 'Upload a DOC/DOCX file to submit the exam draft.'); } @@ -291,7 +292,7 @@ class ExamDraftController extends BaseController if (!empty($existingDraft) && $existingStatus === 'submitted') { $draftRowId = (int) ($existingDraft['id'] ?? 0); $updateSubmit = [ - 'exam_type' => $examType ?: null, + 'exam_type' => $examType, 'draft_title' => $title, 'author_comment' => $authorComment === '' ? null : $authorComment, 'status' => 'submitted', @@ -322,7 +323,7 @@ class ExamDraftController extends BaseController 'class_section_id' => $classSectionId, 'semester' => $this->semester, 'school_year' => $this->schoolYear, - 'exam_type' => $examType ?: null, + 'exam_type' => $examType, 'draft_title' => $title, 'author_comment' => $authorComment === '' ? null : $authorComment, 'status' => 'submitted', @@ -499,7 +500,7 @@ class ExamDraftController extends BaseController $classSectionIds = array_values(array_filter(array_map('intval', $classSectionIds))); $schoolYear = trim((string) ($this->request->getPost('school_year') ?? $this->schoolYear)); $semester = trim((string) ($this->request->getPost('semester') ?? $this->semester)); - $examType = trim((string) $this->request->getPost('exam_type')); + $examType = $this->normalizeExamType($this->request->getPost('exam_type')); if (empty($classSectionIds)) { return redirect()->back()->withInput()->with('error', 'Select at least one class section.'); @@ -510,6 +511,9 @@ class ExamDraftController extends BaseController if ($semester === '') { return redirect()->back()->withInput()->with('error', 'Semester is required.'); } + if ($examType === '') { + return redirect()->back()->withInput()->with('error', 'Exam type is required.'); + } $file = $this->request->getFile('old_exam_file'); if (!$file || !$file->isValid()) { @@ -534,8 +538,8 @@ class ExamDraftController extends BaseController $this->authorIdColumn => $adminId, // store under admin user since legacy uploads are admin-only 'semester' => ucfirst(strtolower($semester)), 'school_year' => $schoolYear, - 'exam_type' => $examType === '' ? null : $examType, - 'draft_title' => $examType === '' ? 'Legacy Exam' : $examType, + 'exam_type' => $examType, + 'draft_title' => $examType, 'author_comment' => null, 'final_file' => $stored, 'final_filename' => $file->getClientName(), @@ -646,13 +650,18 @@ class ExamDraftController extends BaseController $baseVersion = 1; } $reviewRevision = $this->nextReviewRevision($draft, $baseVersion); + $reviewExamType = $this->normalizeExamType($draft['exam_type'] ?? $draft['draft_title'] ?? ''); + if ($reviewExamType === '') { + return redirect()->back()->with('error', 'This draft is missing an exam type. Update the exam type before reviewing.'); + } + $newRow = [ $this->authorIdColumn => $this->draftTeacherId($draft), 'class_section_id' => (int) ($draft['class_section_id'] ?? 0), 'semester' => (string) ($draft['semester'] ?? ''), 'school_year' => (string) ($draft['school_year'] ?? ''), - 'exam_type' => $draft['exam_type'] ?? null, - 'draft_title' => $draft['draft_title'] ?? $draft['exam_type'] ?? 'Exam Draft', + 'exam_type' => $reviewExamType, + 'draft_title' => $draft['draft_title'] ?? $reviewExamType, 'author_comment' => $draft['author_comment'] ?? null, 'status' => $status, 'reviewed_at' => $update['reviewed_at'], @@ -1309,7 +1318,7 @@ class ExamDraftController extends BaseController // Attempt conversion via LibreOffice if available $cmd = 'soffice --headless --convert-to pdf --outdir ' . escapeshellarg($targetDir) . ' ' . escapeshellarg($sourcePath) . ' 2>/dev/null'; - @exec($cmd); + @\exec($cmd); return is_file($targetPath) ? basename($targetPath) : null; } @@ -1358,6 +1367,11 @@ class ExamDraftController extends BaseController ); } + private function normalizeExamType($value): string + { + return trim((string) $value); + } + private function copyDraftToFinal(string $draftFilename): ?string { $source = $this->fullUploadPath(self::TEACHER_UPLOAD_DIR, $draftFilename); diff --git a/app/Views/administrator/paypal_transactions.php b/app/Views/administrator/paypal_transactions.php index c3fc791..0a00eff 100644 --- a/app/Views/administrator/paypal_transactions.php +++ b/app/Views/administrator/paypal_transactions.php @@ -13,17 +13,19 @@ - + + -->
| = esc($e['approver_firstname'] . ' ' . $e['approver_lastname'] ?? '-') ?> | - +
-
+
View receipt
N/A
diff --git a/app/Views/landing_page/parent_dashboard.php b/app/Views/landing_page/parent_dashboard.php
index ad8a525..aa29e9b 100644
--- a/app/Views/landing_page/parent_dashboard.php
+++ b/app/Views/landing_page/parent_dashboard.php
@@ -140,7 +140,7 @@
Enrollment deadline:
= $lastDayOfRegistration ? local_date($lastDayOfRegistration, 'm-d-Y') : 'N/A' ?>
-
+
You've reached the maximum number of students (= $maxChilds ?>).
-
+
getFlashdata('error')): ?>
diff --git a/app/Views/staff/edit.php b/app/Views/staff/edit.php
index 49ed6d9..79aefa8 100644
--- a/app/Views/staff/edit.php
+++ b/app/Views/staff/edit.php
@@ -22,16 +22,18 @@
-
+
+ -->
diff --git a/app/Views/staff/index.php b/app/Views/staff/index.php
index 14d81d6..edb5b83 100644
--- a/app/Views/staff/index.php
+++ b/app/Views/staff/index.php
@@ -11,7 +11,7 @@
-
+
|