where('is_required', true) ->pluck('id'); $students = Student::with('documents')->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(); return view('dashboard', [ 'stats' => [ 'academicYears' => AcademicYear::count(), 'departments' => Department::count(), 'classes' => SchoolClass::count(), 'documentTypes' => DocumentType::count(), 'students' => Student::count(), 'studentsDropped' => StudentExit::count(), 'studentsTransferred' => StudentTransfer::count(), 'studentsGraduated' => Student::where('status', 'graduated')->count(), 'studentAchievements' => StudentAchievement::count(), 'studentsWithAchievements' => StudentAchievement::distinct('student_id')->count('student_id'), 'studentsCompleteDocuments' => $completion['complete'], 'studentsIncompleteDocuments' => $completion['incomplete'], 'studentsVerifiedDocuments' => $completion['verified_complete'], 'studentsUnverifiedDocuments' => $completion['verified_incomplete'], ], 'studentGenderByAcademicYear' => $studentGenderByAcademicYear, ]); } 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), ]; } }