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 @@ - + + --> diff --git a/app/Views/expenses/index.php b/app/Views/expenses/index.php index a292a79..ad98fc7 100644 --- a/app/Views/expenses/index.php +++ b/app/Views/expenses/index.php @@ -80,10 +80,10 @@ - +
- + 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: - +
    diff --git a/app/Views/layout/main_layout.php b/app/Views/layout/main_layout.php index c242c9b..113453e 100644 --- a/app/Views/layout/main_layout.php +++ b/app/Views/layout/main_layout.php @@ -2,7 +2,7 @@ - + Al Rahma Sunday School diff --git a/app/Views/layout/management_layout.php b/app/Views/layout/management_layout.php index fe72df7..7a7162a 100644 --- a/app/Views/layout/management_layout.php +++ b/app/Views/layout/management_layout.php @@ -2,7 +2,7 @@ - + diff --git a/app/Views/parent/register_student.php b/app/Views/parent/register_student.php index 5084d37..1a40f68 100644 --- a/app/Views/parent/register_student.php +++ b/app/Views/parent/register_student.php @@ -11,7 +11,7 @@ $disableEmergencyBtn = count($emergencies) >= $maxEmergency;
    You've reached the maximum number of students ().
    - + 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 @@ - +
    diff --git a/app/Views/whatsapp/parent_contacts_by_class.php b/app/Views/whatsapp/parent_contacts_by_class.php index f5da0d2..7beb482 100644 --- a/app/Views/whatsapp/parent_contacts_by_class.php +++ b/app/Views/whatsapp/parent_contacts_by_class.php @@ -38,9 +38,9 @@
    - - - + + +
    @@ -92,13 +92,15 @@ - + + + -->
    - +
    @@ -109,13 +111,15 @@