Files

136 lines
5.4 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 Illuminate\Database\Eloquent\Builder;
use App\Models\StudentAchievement;
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')
->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),
];
}
}