exam draft fix

This commit is contained in:
root
2026-04-11 15:33:12 -04:00
parent 89e95b7851
commit 7bc999643a
13 changed files with 582 additions and 180 deletions
+96 -1
View File
@@ -6,6 +6,7 @@ use App\Controllers\BaseController;
use App\Models\ClassSectionModel;
use App\Models\ConfigurationModel;
use App\Models\ExamDraftModel;
use App\Models\StudentClassModel;
use App\Models\TeacherClassModel;
use App\Models\UserModel;
use CodeIgniter\HTTP\Files\UploadedFile;
@@ -16,6 +17,7 @@ class ExamDraftController extends BaseController
protected ExamDraftModel $examDraftModel;
protected TeacherClassModel $teacherClassModel;
protected ClassSectionModel $classSectionModel;
protected StudentClassModel $studentClassModel;
protected UserModel $userModel;
protected ConfigurationModel $configModel;
@@ -57,6 +59,7 @@ class ExamDraftController extends BaseController
$this->examDraftModel = new ExamDraftModel();
$this->teacherClassModel = new TeacherClassModel();
$this->classSectionModel = new ClassSectionModel();
$this->studentClassModel = new StudentClassModel();
$this->userModel = new UserModel();
$this->configModel = new ConfigurationModel();
$this->db = Database::connect();
@@ -419,6 +422,52 @@ class ExamDraftController extends BaseController
}
unset($group);
$classSectionsById = [];
foreach ($classSections as $cs) {
$csId = (int) ($cs['class_section_id'] ?? 0);
if ($csId <= 0) {
continue;
}
$classSectionsById[$csId] = $cs;
}
$studentCounts = $this->studentClassModel->getStudentCountsBySection($this->schoolYear);
$visibleClasses = [];
foreach ($studentCounts as $csId => $count) {
$csId = (int) $csId;
if ($csId <= 0 || $count <= 0) {
continue;
}
$classData = $classSectionsById[$csId] ?? $this->classSectionModel->where('class_section_id', $csId)->first();
if ($classData === null) {
$classData = [
'class_section_id' => $csId,
'class_section_name' => 'Class ' . $csId,
];
}
$classData['student_count'] = $count;
$visibleClasses[$csId] = $classData;
}
uasort($visibleClasses, static fn ($a, $b): int => strcasecmp($a['class_section_name'] ?? '', $b['class_section_name'] ?? ''));
$classDraftGroups = [];
foreach ($drafts as $draft) {
$cid = (int) ($draft['class_section_id'] ?? 0);
if ($cid <= 0) {
continue;
}
$classDraftGroups[$cid][] = $draft;
}
$newSubmissionClasses = [];
foreach ($classDraftGroups as $cid => $group) {
foreach ($group as $draft) {
if (strtolower((string) ($draft['status'] ?? '')) === 'submitted') {
$newSubmissionClasses[$cid] = true;
break;
}
}
}
return view('administrator/exam_drafts', [
'drafts' => $drafts,
'statusBadges' => $this->statusBadgeMap(),
@@ -430,6 +479,9 @@ class ExamDraftController extends BaseController
'classSections' => $classSections,
'legacyByClass' => $legacyByClass,
'printableDraftIds' => $printableIds,
'visibleClasses' => $visibleClasses,
'classDraftGroups' => $classDraftGroups,
'newSubmissionClasses' => $newSubmissionClasses,
]);
}
@@ -657,6 +709,9 @@ class ExamDraftController extends BaseController
}
}
}
if ($status === 'legacy') {
$this->prepareLegacyPdfVersion($update, $draft);
}
if ($this->hasIsLegacyColumn) {
$update['is_legacy'] = strtolower($status) === 'legacy' ? 1 : 0;
}
@@ -875,7 +930,7 @@ class ExamDraftController extends BaseController
$teacherName = 'Teacher #' . $teacherId;
}
$class = $this->classSectionModel->find($classSectionId) ?? [];
$class = $this->classSectionModel->where('class_section_id', (int) $classSectionId)->first() ?? [];
$className = $class['class_section_name'] ?? ('Class ' . $classSectionId);
$subject = 'Exam draft submitted: ' . $className;
@@ -1321,4 +1376,44 @@ class ExamDraftController extends BaseController
}
return $destName;
}
private function prepareLegacyPdfVersion(array &$update, array $draft): void
{
$finalFile = $update['final_file'] ?? $draft['final_file'] ?? null;
if (empty($finalFile)) {
$teacherFile = $this->draftTeacherFile($draft);
if (!empty($teacherFile)) {
$copied = $this->copyDraftToFinal($teacherFile);
if ($copied !== null) {
$finalFile = $copied;
$update['final_file'] = $copied;
$update['final_filename'] = $this->draftTeacherFilename($draft) ?? $teacherFile;
}
}
}
if (empty($finalFile)) {
return;
}
$ext = strtolower(pathinfo($finalFile, PATHINFO_EXTENSION));
$pdfName = $this->ensurePdfExists($finalFile, $ext);
if ($pdfName === null) {
return;
}
$filename = $update['final_filename'] ?? $draft['final_filename'] ?? '';
$baseName = '';
if ($filename !== '') {
$baseName = pathinfo($filename, PATHINFO_FILENAME);
}
if ($baseName === '') {
$baseName = pathinfo($pdfName, PATHINFO_FILENAME);
}
if ($baseName === '') {
$baseName = 'exam';
}
$update['final_file'] = $pdfName;
$update['final_filename'] = $baseName . '.pdf';
if ($this->hasFinalPdfColumn) {
$update['final_pdf_file'] = $pdfName;
}
}
}