where('is_required', true) ->pluck('id'); $students = Student::with('documents')->get(); $completion = $this->calculateCompletion($students, $requiredDocumentTypeIds); 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(), 'studentsCompleteDocuments' => $completion['complete'], 'studentsIncompleteDocuments' => $completion['incomplete'], 'studentsVerifiedDocuments' => $completion['verified_complete'], 'studentsUnverifiedDocuments' => $completion['verified_incomplete'], ], ]); } 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), ]; } }