configService->context(); $schoolYear = $schoolYear ?: (string) ($context['school_year'] ?? ''); $semester = (string) ($context['semester'] ?? ''); $yearsRows = DB::table('enrollments') ->selectRaw('DISTINCT school_year') ->orderByDesc('school_year') ->get() ->map(fn ($r) => (array) $r) ->all(); $schoolYears = array_values(array_filter(array_map(static function ($r) { return isset($r['school_year']) ? (string) $r['school_year'] : null; }, $yearsRows))); $students = Student::query() ->select('students.id', 'students.firstname', 'students.lastname', 'students.registration_date', 'students.is_new', 'students.age', 'students.parent_id', 'students.registration_grade') ->join('enrollments as e', 'e.student_id', '=', 'students.id') ->when($schoolYear !== '', fn ($q) => $q->where('e.school_year', $schoolYear)) ->groupBy('students.id') ->orderBy('students.lastname') ->orderBy('students.firstname') ->get() ->toArray(); if (empty($students)) { $students = Student::query() ->select('students.id', 'students.firstname', 'students.lastname', 'students.registration_date', 'students.is_new', 'students.age', 'students.parent_id', 'students.registration_grade') ->orderBy('students.lastname') ->orderBy('students.firstname') ->get() ->toArray(); } $studentData = []; foreach ($students as $student) { $studentId = (int) ($student['id'] ?? 0); $sectionNames = StudentClass::getClassSectionsByStudentIdWithFlags($studentId, $schoolYear, true); $sectionIds = StudentClass::getClassSectionIdsByStudentId($studentId, $schoolYear); $sectionDisplay = ! empty($sectionNames) ? implode(', ', $sectionNames) : ''; $parentId = (int) ($student['parent_id'] ?? 0); $emergencyInfo = $parentId > 0 ? (EmergencyContact::getEmergencyContactByParentId($parentId) ?? []) : []; $studentData[] = [ 'student_id' => $studentId, 'name' => trim(($student['firstname'] ?? '').' '.($student['lastname'] ?? '')), 'age' => $student['age'] ?? 'N/A', 'email' => $emergencyInfo['email'] ?? '', 'phone' => $emergencyInfo['cellphone'] ?? '', 'registration_grade' => $student['registration_grade'] ?? 'N/A', 'class_section_name' => $sectionDisplay !== '' ? $sectionDisplay : 'No class assigned', 'class_section_names' => $sectionNames, 'class_section_ids' => $sectionIds, 'new_student' => ((int) ($student['is_new'] ?? 0) === 1) ? 'Yes' : 'No', 'registration_date' => $student['registration_date'] ?? '', 'school_year' => $schoolYear, 'semester' => $semester, ]; } $classes = ClassSection::query() ->select('id', 'class_section_id', 'class_section_name', 'school_year') ->when($schoolYear !== '', fn ($q) => $q->where('school_year', $schoolYear)) ->orderBy('class_section_name') ->get() ->toArray(); if (empty($classes)) { $classes = ClassSection::query() ->select('id', 'class_section_id', 'class_section_name') ->orderBy('class_section_name') ->get() ->toArray(); } return [ 'students' => $studentData, 'classes' => $classes, 'schoolYears' => $schoolYears, 'selectedYear' => $schoolYear, 'currentYear' => (string) ($context['school_year'] ?? ''), 'isCurrentYear' => $schoolYear !== '' && $schoolYear === (string) ($context['school_year'] ?? ''), ]; } public function removedStudents(?string $schoolYear = null): array { $context = $this->configService->context(); $schoolYear = $schoolYear ?: (string) ($context['school_year'] ?? ''); $activeStudents = Student::query() ->select('id', 'school_id', 'firstname', 'lastname', 'gender', 'age') ->where('is_active', 1) ->orderBy('lastname') ->orderBy('firstname') ->get() ->toArray(); $removedStudents = Student::query() ->select('id', 'school_id', 'firstname', 'lastname', 'gender', 'age') ->where('is_active', 0) ->orderBy('lastname') ->orderBy('firstname') ->get() ->toArray(); $classRows = DB::table('student_class as sc') ->select('sc.student_id', 'cs.class_section_name') ->join('classSection as cs', 'cs.class_section_id', '=', 'sc.class_section_id') ->when($schoolYear !== '', fn ($q) => $q->where('sc.school_year', $schoolYear)) ->get() ->map(fn ($r) => (array) $r) ->all(); $classMap = []; foreach ($classRows as $row) { $studentId = (int) ($row['student_id'] ?? 0); $name = trim((string) ($row['class_section_name'] ?? '')); if ($studentId <= 0 || $name === '') { continue; } $classMap[$studentId][] = $name; } $attachClasses = static function (array $students) use ($classMap): array { foreach ($students as &$student) { $studentId = (int) ($student['id'] ?? 0); $names = $classMap[$studentId] ?? []; $names = array_values(array_unique(array_filter($names))); $student['class_sections'] = $names; $student['class_section_name'] = ! empty($names) ? implode(', ', $names) : 'No class assigned'; } unset($student); return $students; }; return [ 'active_students' => $attachClasses($activeStudents), 'removed_students' => $attachClasses($removedStudents), 'school_year' => $schoolYear, ]; } public function listStudents(?string $schoolYear = null, ?array $parentIds = null): array { $context = $this->configService->context(); $selectedYear = $schoolYear ?: (string) ($context['school_year'] ?? ''); $students = Student::query() ->select([ 'id', 'school_id', 'firstname', 'lastname', 'dob', 'age', 'gender', 'is_active', 'registration_grade', 'is_new', 'photo_consent', 'parent_id', 'registration_date', 'tuition_paid', 'semester', 'year_of_registration', 'school_year', ]) ->when($selectedYear !== '', fn ($q) => $q->where('school_year', $selectedYear)) ->when(! empty($parentIds), fn ($q) => $q->whereIn('parent_id', $parentIds)) ->orderBy('lastname') ->orderBy('firstname') ->get() ->toArray(); return [ 'students' => $students, 'schoolYear' => $selectedYear, 'currentYear' => (string) ($context['school_year'] ?? ''), ]; } }