feat: update student import and graduation workflows

This commit is contained in:
2026-04-30 00:04:52 +07:00
parent 189b076ab0
commit ac22f8b7c8
51 changed files with 4547 additions and 1287 deletions
@@ -18,8 +18,10 @@ class StudentAchievementController extends Controller
$search = trim((string) $request->get('search'));
$academicYearId = $request->get('academic_year_id');
$classId = $request->get('class_id');
$level = trim((string) $request->get('level'));
$category = trim((string) $request->get('category'));
$achievements = StudentAchievement::query()
$achievementsQuery = StudentAchievement::query()
->with(['student.academicYear', 'student.department', 'student.classRoom'])
->when($search !== '', function ($query) use ($search) {
$query->where(function ($subQuery) use ($search) {
@@ -35,25 +37,67 @@ class StudentAchievementController extends Controller
})
->when($academicYearId, fn ($query) => $query->whereHas('student', fn ($studentQuery) => $studentQuery->where('academic_year_id', $academicYearId)))
->when($classId, fn ($query) => $query->whereHas('student', fn ($studentQuery) => $studentQuery->where('class_id', $classId)))
->when($level !== '', fn ($query) => $query->where('level', $level))
->when($category !== '', fn ($query) => $query->where('category', $category));
$achievements = (clone $achievementsQuery)
->latest('achievement_year')
->latest('achievement_date')
->latest('id')
->paginate(15)
->withQueryString();
$levelCounts = StudentAchievement::query()
->selectRaw('COALESCE(level, ?) as level_label, COUNT(*) as total', ['Tanpa tingkat'])
->groupBy('level')
->orderByDesc('total')
->pluck('total', 'level_label');
$withCertificateCount = StudentAchievement::query()->whereNotNull('certificate_file')->count();
$withPhotoCount = StudentAchievement::query()->whereNotNull('activity_photo')->count();
$thisYearCount = StudentAchievement::query()->where('achievement_year', now()->year)->count();
$recentAchievements = StudentAchievement::query()
->with(['student:id,full_name'])
->latest('achievement_date')
->latest('achievement_year')
->latest('id')
->limit(3)
->get();
$categoryOptions = StudentAchievement::query()
->whereNotNull('category')
->where('category', '!=', '')
->distinct()
->orderBy('category')
->pluck('category', 'category');
return view('student-achievements.index', [
'achievements' => $achievements,
'search' => $search,
'filters' => [
'academic_year_id' => $academicYearId,
'class_id' => $classId,
'level' => $level,
'category' => $category,
],
'academicYears' => AcademicYear::orderBy('name')->pluck('name', 'id'),
'classes' => SchoolClass::orderBy('name')->pluck('name', 'id'),
'categoryOptions' => $categoryOptions,
'levelOptions' => $this->levelOptions(),
'summary' => [
'total' => StudentAchievement::count(),
'filtered' => $achievements->total(),
'students' => StudentAchievement::distinct('student_id')->count('student_id'),
'latest_year' => StudentAchievement::max('achievement_year'),
'top_level' => $levelCounts->keys()->first(),
'top_level_total' => $levelCounts->first(),
'with_certificate' => $withCertificateCount,
'without_certificate' => max(StudentAchievement::count() - $withCertificateCount, 0),
'with_photo' => $withPhotoCount,
'this_year' => $thisYearCount,
],
'recentAchievements' => $recentAchievements,
]);
}