where('is_required', true) ->pluck('id'); $students = Student::with('documents') ->where('status', 'active') ->get(); $completion = $this->calculateCompletion($students, $requiredDocumentTypeIds); $studentGenderByAcademicYear = AcademicYear::query() ->orderByDesc('name') ->get(['id', 'name']) ->map(function (AcademicYear $academicYear) { $maleCount = Student::where('academic_year_id', $academicYear->id)->where('gender', 'L')->count(); $femaleCount = Student::where('academic_year_id', $academicYear->id)->where('gender', 'P')->count(); return [ 'name' => $academicYear->name, 'male' => $maleCount, 'female' => $femaleCount, 'total' => $maleCount + $femaleCount, ]; }) ->filter(fn (array $item) => $item['total'] > 0) ->values(); $activeAcademicYearId = AcademicYear::query()->where('is_active', true)->value('id'); $studentStatisticsByClass = SchoolClass::query() ->with(['academicYear', 'department']) ->when($activeAcademicYearId, fn (Builder $query) => $query->where('academic_year_id', $activeAcademicYearId)) ->withCount([ 'students as active_students_count' => fn (Builder $query) => $query->where('status', 'active'), 'students as male_students_count' => fn (Builder $query) => $query->where('status', 'active')->where('gender', 'L'), 'students as female_students_count' => fn (Builder $query) => $query->where('status', 'active')->where('gender', 'P'), ]) ->orderBy('level') ->orderBy('name') ->get() ->filter(fn (SchoolClass $classRoom) => $classRoom->active_students_count > 0) ->values(); return view('dashboard', [ 'stats' => [ 'academicYears' => AcademicYear::count(), 'departments' => Department::count(), 'classes' => SchoolClass::count(), 'documentTypes' => DocumentType::count(), 'students' => Student::where('status', 'active')->count(), 'studentsDropped' => StudentExit::count(), 'studentsTransferred' => StudentTransfer::count(), 'studentsGraduated' => Student::where('status', 'graduated')->count(), 'studentAchievements' => StudentAchievement::query() ->whereHas('student', fn (Builder $query) => $query->where('status', 'active')) ->count(), 'studentsWithAchievements' => StudentAchievement::query() ->whereHas('student', fn (Builder $query) => $query->where('status', 'active')) ->distinct('student_id') ->count('student_id'), 'studentsCompleteDocuments' => $completion['complete'], 'studentsIncompleteDocuments' => $completion['incomplete'], 'studentsVerifiedDocuments' => $completion['verified_complete'], 'studentsUnverifiedDocuments' => $completion['verified_incomplete'], ], 'studentGenderByAcademicYear' => $studentGenderByAcademicYear, 'studentStatisticsByClass' => $studentStatisticsByClass, ]); } protected function calculateCompletion(Collection $students, Collection $requiredDocumentTypeIds): array { if ($requiredDocumentTypeIds->isEmpty()) { return [ 'complete' => $students->count(), 'incomplete' => 0, 'verified_complete' => $students->count(), 'verified_incomplete' => 0, ]; } $complete = 0; $verifiedComplete = 0; foreach ($students as $student) { $requiredDocuments = $student->documents->whereIn('document_type_id', $requiredDocumentTypeIds); $uploadedRequired = $requiredDocuments ->pluck('document_type_id') ->unique() ->count(); $verifiedRequired = $requiredDocuments ->where('verification_status', 'valid') ->pluck('document_type_id') ->unique() ->count(); if ($uploadedRequired >= $requiredDocumentTypeIds->count()) { $complete++; } if ($verifiedRequired >= $requiredDocumentTypeIds->count()) { $verifiedComplete++; } } return [ 'complete' => $complete, 'incomplete' => max($students->count() - $complete, 0), 'verified_complete' => $verifiedComplete, 'verified_incomplete' => max($students->count() - $verifiedComplete, 0), ]; } }