@if (blank($filters['from_academic_year_id']) || blank($filters['to_academic_year_id']))
Pilih tahun ajaran asal dan tujuan terlebih dahulu untuk melihat kelas yang siap diproses.
@elseif ($classSummaries->isEmpty())
Belum ada kelas aktif dengan siswa aktif pada tahun ajaran asal yang dipilih.
@elseif (blank($filters['class_id']) || ! $selectedClass)
Pilih kelas asal untuk memproses siswa per rombel. Ini lebih aman daripada menampilkan semua siswa sekaligus.
@elseif ($students->isEmpty())
Tidak ada siswa aktif pada kelas asal yang dipilih.
@else @php $promotionCount = $students->filter(fn ($student) => $student->promotion_recommendation['action'] === 'promote')->count(); $repeatCount = $students->filter(fn ($student) => $student->promotion_recommendation['action'] === 'repeat')->count(); $graduateCount = $students->filter(fn ($student) => $student->promotion_recommendation['action'] === 'graduate')->count(); $skipCount = $students->filter(fn ($student) => $student->promotion_recommendation['action'] === 'skip')->count(); @endphp @if ($errors->any())
Proses promosi belum bisa dilanjutkan.
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif
Kelas Sedang Diproses
{{ $selectedClass->name }}
{{ $selectedClass->department?->name ?: '-' }} • {{ $selectedClass->active_students_count }} siswa aktif
Ganti Kelas
Naik Kelas
{{ $promotionCount }}
Siswa yang akan naik ke level berikutnya.
Tinggal Kelas
{{ $repeatCount }}
Siswa yang akan tetap di level yang sama.
Lulus
{{ $graduateCount }}
Siswa kelas akhir yang akan diluluskan.
Lewati
{{ $skipCount }}
Siswa yang tidak ikut diproses pada batch ini.
Ringkasan live: {{ $promotionCount }} naik, {{ $repeatCount }} tinggal kelas, {{ $graduateCount }} lulus, dan {{ $skipCount }} dilewati.
@csrf
Aksi cepat untuk kelas ini:
@if (strtoupper((string) $selectedClass->level) === 'XII')
Kelas ini berada di level XII. Default operasionalnya biasanya Lulus, lalu admin hanya mengubah siswa pengecualian bila perlu.
@endif
@foreach ($students as $student) @php $recommendation = $student->promotion_recommendation; $promoteClasses = $recommendation['available_classes']['promote']; $repeatClasses = $recommendation['available_classes']['repeat']; $actionField = 'promotions.'.$loop->index.'.action'; $targetClassField = 'promotions.'.$loop->index.'.target_class_id'; $notesField = 'promotions.'.$loop->index.'.notes'; $studentField = 'promotions.'.$loop->index.'.student_id'; $oldAction = old($actionField, $recommendation['action']); $oldTargetClassId = old($targetClassField, $recommendation['target_class_id']); $defaultClasses = $oldAction === 'repeat' ? $repeatClasses : $promoteClasses; $rowErrors = collect([ $errors->first($studentField), $errors->first($actionField), $errors->first($targetClassField), $errors->first($notesField), ])->filter(); $selectedPromote = old($targetClassField, $promoteClasses->firstWhere('id', $recommendation['target_class_id'])?->id ?? ($promoteClasses->first()?->id ?? '')); $selectedRepeat = old($targetClassField, $repeatClasses->firstWhere('id', $recommendation['target_class_id'])?->id ?? ($repeatClasses->first()?->id ?? '')); $promoteClassOptions = $promoteClasses->map(fn ($classRoom) => [ 'id' => $classRoom->id, 'name' => $classRoom->name, 'option_label' => $classRoom->option_label, 'capacity_label' => $classRoom->capacity_label, 'remaining_capacity' => $classRoom->remaining_capacity, 'warning_level' => is_null($classRoom->remaining_capacity) ? 'normal' : ($classRoom->remaining_capacity <= 0 ? 'full' : ($classRoom->remaining_capacity <= 3 ? 'low' : 'normal')), ])->values(); $repeatClassOptions = $repeatClasses->map(fn ($classRoom) => [ 'id' => $classRoom->id, 'name' => $classRoom->name, 'option_label' => $classRoom->option_label, 'capacity_label' => $classRoom->capacity_label, 'remaining_capacity' => $classRoom->remaining_capacity, 'warning_level' => is_null($classRoom->remaining_capacity) ? 'normal' : ($classRoom->remaining_capacity <= 0 ? 'full' : ($classRoom->remaining_capacity <= 3 ? 'low' : 'normal')), ])->values(); $badgeClass = match ($recommendation['action']) { 'promote' => 'bg-emerald-100 text-emerald-700', 'repeat' => 'bg-amber-100 text-amber-700', 'graduate' => 'bg-sky-100 text-sky-700', default => 'bg-slate-100 text-slate-700', }; @endphp @endforeach
Siswa Posisi Saat Ini Rekomendasi Aksi Admin Kelas Tujuan Catatan
{{ $student->full_name }}
NIS: {{ $student->student_number ?: '-' }}
@if ($rowErrors->isNotEmpty())
Perlu diperbaiki
    @foreach ($rowErrors as $rowError)
  • {{ $rowError }}
  • @endforeach
@endif
{{ $student->classRoom?->name ?: '-' }}
{{ $student->academicYear?->name ?: '-' }}
{{ $student->department?->name ?: '-' }}
{{ $recommendation['label'] }}
@if ($recommendation['target_class_name'])
Target: {{ $recommendation['target_class_name'] }}
@endif
Ubah hanya untuk siswa pengecualian.
{{ $recommendation['target_class_name'] ?: 'Aksi ini tidak memerlukan kelas tujuan.' }}
{{ $defaultClasses->isEmpty() ? 'Belum ada kelas aktif yang cocok pada tahun ajaran target untuk aksi ini.' : 'Pilih kelas tujuan sesuai aksi. Naik kelas memakai level berikutnya, tinggal kelas memakai level yang sama.' }}
@if ($defaultClasses->isNotEmpty())
@foreach ($defaultClasses as $classRoom)
• {{ $classRoom->name }} — {{ $classRoom->capacity_label }}
@endforeach
@endif
Total siswa siap diproses dari kelas ini: {{ $students->count() }}
Tips: pola kerja idealnya set semua sesuai rekomendasi kelas, lalu ubah hanya siswa yang menjadi pengecualian.
@endif