Add student achievements module and improve student admin workflows

This commit is contained in:
2026-04-13 06:50:37 +00:00
parent b29c591285
commit fb904f9389
21 changed files with 1111 additions and 180 deletions
+21 -2
View File
@@ -65,7 +65,7 @@ class StudentController extends Controller
$students = Student::query()
->select('students.*')
->with(['academicYear', 'department', 'classRoom', 'documents.documentType'])
->with(['academicYear', 'department', 'classRoom', 'documents.documentType', 'achievements'])
->leftJoin('academic_years', 'academic_years.id', '=', 'students.academic_year_id')
->leftJoin('departments', 'departments.id', '=', 'students.department_id')
->leftJoin('classes', 'classes.id', '=', 'students.class_id')
@@ -128,6 +128,25 @@ class StudentController extends Controller
: 100;
$student->hover_photo_url = $photoDocument?->file_path ? asset('storage/' . $photoDocument->file_path) : null;
$achievementPriority = [
'Internasional' => 6,
'Nasional' => 5,
'Provinsi' => 4,
'Kabupaten/Kota' => 3,
'Kecamatan' => 2,
'Sekolah' => 1,
];
$topAchievement = $student->achievements
->sortByDesc(fn ($achievement) => $achievementPriority[$achievement->level] ?? 0)
->first();
$student->achievement_badge_level = $topAchievement?->level;
$student->achievement_badge_count = $student->achievements->count();
$student->achievement_badge_title = $topAchievement
? sprintf('Siswa berprestasi · %s · %s prestasi', $topAchievement->level ?: 'Prestasi', $student->achievement_badge_count)
: null;
return $student;
});
@@ -177,7 +196,7 @@ class StudentController extends Controller
public function show(Student $student): View
{
$student->load(['academicYear', 'department', 'classRoom', 'parents', 'documents.documentType', 'academicHistories.academicYear', 'academicHistories.department', 'academicHistories.classRoom']);
$student->load(['academicYear', 'department', 'classRoom', 'parents', 'documents.documentType', 'academicHistories.academicYear', 'academicHistories.department', 'academicHistories.classRoom', 'achievements']);
$requiredDocumentTypes = DocumentType::where('is_active', true)
->where('is_required', true)