90 lines
3.0 KiB
PHP
90 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\AcademicYear;
|
|
use App\Models\Department;
|
|
use App\Models\DocumentType;
|
|
use App\Models\SchoolClass;
|
|
use App\Models\Student;
|
|
use App\Models\StudentExit;
|
|
use App\Models\StudentTransfer;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\View\View;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
public function __invoke(): View
|
|
{
|
|
$requiredDocumentTypeIds = DocumentType::where('is_active', true)
|
|
->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),
|
|
];
|
|
}
|
|
}
|