diff --git a/app/Controllers/View/GradingController.php b/app/Controllers/View/GradingController.php index f9fabd7..d56ca76 100644 --- a/app/Controllers/View/GradingController.php +++ b/app/Controllers/View/GradingController.php @@ -1070,14 +1070,15 @@ class GradingController extends Controller public function belowSixty() { - $configuredSemester = (string) $this->semester; $configuredYear = (string) $this->schoolYear; - $requestedSemester = trim((string)($this->request->getGet('semester') ?? '')); + $requestedSemester = strtolower(trim((string)($this->request->getGet('semester') ?? ''))); $requestedYear = trim((string)($this->request->getGet('school_year') ?? '')); - $isYearMode = (strtolower($requestedSemester) === 'year'); - $semester = $isYearMode ? 'year' : ($requestedSemester !== '' ? $requestedSemester : ($configuredSemester !== '' ? $configuredSemester : 'Fall')); + // This page intentionally supports only Fall and Whole Year. + // Spring is still used internally for the Whole Year calculation, but it is not selectable here. + $isYearMode = ($requestedSemester === 'year'); + $semester = $isYearMode ? 'year' : 'Fall'; $schoolYear = $requestedYear !== '' ? $requestedYear : $configuredYear; $schoolYears = $this->getSchoolYearsForScores($schoolYear); @@ -1092,10 +1093,12 @@ class GradingController extends Controller 'schoolYears' => $schoolYears, 'canViewGrading' => $canViewGrading, 'isYearMode' => $isYearMode, + 'semesterOptions' => ['Fall'], 'showAllSemesterOption' => true, ]); } + public function editBelowSixtyEmail() { $studentId = (int)$this->request->getGet('student_id'); @@ -1766,7 +1769,95 @@ class GradingController extends Controller private function fetchBelowSixtyRows(string $schoolYear, string $semester): array { $isYearMode = strtolower(trim($semester)) === 'year'; - $semesterKey = $isYearMode ? '' : strtolower(trim($semester)); + + if ($isYearMode) { + $rows = $this->db->table('semester_scores ss') + ->select('s.id AS student_id') + ->select('s.school_id') + ->select('s.firstname') + ->select('s.lastname') + ->select('cs.class_section_name') + ->select("'year' AS semester", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.homework_avg END) AS fall_homework_avg", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.homework_avg END) AS spring_homework_avg", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.project_avg END) AS fall_project_avg", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.project_avg END) AS spring_project_avg", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.participation_score END) AS fall_participation_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.participation_score END) AS spring_participation_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN COALESCE(ss.test_avg, ss.quiz_avg) END) AS fall_test_avg", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN COALESCE(ss.test_avg, ss.quiz_avg) END) AS spring_test_avg", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.ptap_score END) AS fall_ptap_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.ptap_score END) AS spring_ptap_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.attendance_score END) AS fall_attendance_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.attendance_score END) AS spring_attendance_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.midterm_exam_score END) AS fall_midterm_exam_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.midterm_exam_score END) AS spring_midterm_exam_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.final_exam_score END) AS fall_final_exam_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.final_exam_score END) AS spring_final_exam_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.semester_score END) AS fall_score", false) + ->select("MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.semester_score END) AS spring_score", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.semester_score END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.semester_score END) + ) / 2 AS semester_score", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.homework_avg END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.homework_avg END) + ) / 2 AS homework_avg", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.project_avg END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.project_avg END) + ) / 2 AS project_avg", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.participation_score END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.participation_score END) + ) / 2 AS participation_score", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN COALESCE(ss.test_avg, ss.quiz_avg) END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN COALESCE(ss.test_avg, ss.quiz_avg) END) + ) / 2 AS test_avg", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.ptap_score END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.ptap_score END) + ) / 2 AS ptap_score", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.attendance_score END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.attendance_score END) + ) / 2 AS attendance_score", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.midterm_exam_score END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.midterm_exam_score END) + ) / 2 AS midterm_exam_score", false) + ->select("( + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'fall' THEN ss.final_exam_score END) + + MAX(CASE WHEN LOWER(TRIM(ss.semester)) = 'spring' THEN ss.final_exam_score END) + ) / 2 AS final_exam_score", false) + ->join('students s', 's.id = ss.student_id', 'inner') + ->join('classSection cs', 'cs.class_section_id = ss.class_section_id', 'left') + ->where('s.is_active', 1) + ->where('ss.school_year', $schoolYear) + ->where('ss.semester_score IS NOT NULL', null, false) + ->where("LOWER(TRIM(ss.semester)) IN ('fall', 'spring')", null, false) + ->groupBy('s.id, s.school_id, s.firstname, s.lastname, ss.class_section_id, cs.class_section_name') + ->having('fall_score IS NOT NULL', null, false) + ->having('spring_score IS NOT NULL', null, false) + ->having('semester_score <', 60) + ->orderBy('s.lastname', 'ASC') + ->orderBy('s.firstname', 'ASC') + ->get() + ->getResultArray(); + + foreach ($rows as &$row) { + $row['comment'] = ''; + $row['status'] = 'Open'; + $row['note'] = ''; + } + unset($row); + + return $rows; + } + + $semesterKey = 'fall'; $builder = $this->db->table('semester_scores ss') ->select([ 's.id AS student_id', @@ -1790,11 +1881,8 @@ class GradingController extends Controller ->where('s.is_active', 1) ->where('ss.school_year', $schoolYear) ->where('ss.semester_score IS NOT NULL', null, false) - ->where('ss.semester_score <', 60); - - if (!$isYearMode) { - $builder->where("LOWER(TRIM(ss.semester))", $semesterKey); - } + ->where('ss.semester_score <', 60) + ->where("LOWER(TRIM(ss.semester))", $semesterKey); $rows = $builder ->orderBy('s.lastname', 'ASC') @@ -1815,16 +1903,15 @@ class GradingController extends Controller $commentMap = []; if (!empty($studentIds)) { - $commentBuilder = $this->db->table('score_comments') + $commentRows = $this->db->table('score_comments') ->select('student_id, semester, comment, created_at') ->where('score_type', 'general') ->where('school_year', $schoolYear) ->whereIn('student_id', $studentIds) - ->orderBy('created_at', 'DESC'); - if (!$isYearMode) { - $commentBuilder->where("LOWER(TRIM(semester))", $semesterKey); - } - $commentRows = $commentBuilder->get()->getResultArray(); + ->where("LOWER(TRIM(semester))", $semesterKey) + ->orderBy('created_at', 'DESC') + ->get() + ->getResultArray(); foreach ($commentRows as $row) { $sid = (int)($row['student_id'] ?? 0); $sem = strtolower(trim((string)($row['semester'] ?? ''))); @@ -1838,15 +1925,14 @@ class GradingController extends Controller $statusMap = []; $noteMap = []; if (!empty($studentIds)) { - $flagBuilder = $this->db->table('current_flag') + $flagRows = $this->db->table('current_flag') ->select('student_id, semester, flag_state, open_description, close_description') ->where('flag', 'grade') ->where('school_year', $schoolYear) - ->whereIn('student_id', $studentIds); - if (!$isYearMode) { - $flagBuilder->where("LOWER(TRIM(semester))", $semesterKey); - } - $flagRows = $flagBuilder->get()->getResultArray(); + ->whereIn('student_id', $studentIds) + ->where("LOWER(TRIM(semester))", $semesterKey) + ->get() + ->getResultArray(); foreach ($flagRows as $row) { $sid = (int)($row['student_id'] ?? 0); if ($sid <= 0) continue; @@ -1884,6 +1970,7 @@ class GradingController extends Controller return $rows; } + private function fetchBelowSixtyEmailRow(int $studentId, string $schoolYear, string $semester): array { $semesterKey = strtolower(trim($semester)); diff --git a/app/Views/grading/below_sixty.php b/app/Views/grading/below_sixty.php index 4c440d8..5177707 100644 --- a/app/Views/grading/below_sixty.php +++ b/app/Views/grading/below_sixty.php @@ -9,12 +9,12 @@