@extends('layouts.app') @section('title', 'Kegiatan & Absensi') @section('content') {{-- ── HERO ── --}}

Kegiatan & Absensi

{{ $santri->nama_lengkap }}  ·  Kelas {{ $namaKelas }}

{{ \Carbon\Carbon::now()->locale('id')->isoFormat('dddd') }}
{{ \Carbon\Carbon::now()->locale('id')->isoFormat('D MMMM YYYY') }}
{{ $santri->nis ?? $santri->id_santri }} {{ $persentaseKehadiran }}% kehadiran @if($streak > 0) Streak {{ $streak }}x hadir @endif
{{-- ── KPI 5 CARDS ── --}}
{{ $expectedTotal }}
Wajib Hadir
{{ $hadirEfektif }}
Hadir @if($terlambatRange > 0) (+{{ $terlambatRange }} terlambat) @endif
{{ $persentaseKehadiran }}%
Kehadiran
{{ $belumAbsenRange }}
Belum Absen
{{ $alpaRange }}
Alpa
{{-- ── TABS ── --}}
{{-- ╔══════════════════════════════════════════╗ --}} {{-- ║ PANEL STATISTIK ║ --}} {{-- ╚══════════════════════════════════════════╝ --}}
@foreach(['today'=>'Hari Ini','this_week'=>'Minggu Ini','last_30'=>'30 Hari','this_month'=>'Bulan Ini','last_month'=>'Bulan Lalu'] as $v=>$l) @endforeach
{{ $statFrom->locale('id')->isoFormat('D MMM YYYY') }} – {{ $statTo->locale('id')->isoFormat('D MMM YYYY') }}
Tren Kehadiran {{ $diffDays <= 31 ? 'Harian' : 'Mingguan' }}
Distribusi Status
{{-- ── Absensi Terbaru + Kalender ── Pakai class .kg-recent-cal-grid (bukan inline style) agar breakpoint CSS bisa meng-override ke 1 kolom --}}
{{-- Catatan Absensi Terbaru --}}
Absensi Terbaru {{ $statFrom->locale('id')->isoFormat('D MMM') }} – {{ $statTo->locale('id')->isoFormat('D MMM YY') }}
@if($recentAbsensi->count() > 0)
@foreach($recentAbsensi as $ab) @php $sl = strtolower($ab->status); @endphp
@if($ab->status === 'Hadir') @elseif($ab->status === 'Terlambat') @elseif($ab->status === 'Izin') @elseif($ab->status === 'Sakit') @elseif($ab->status === 'Alpa') @elseif($ab->status === 'Pulang') @endif
{{ $ab->kegiatan->nama_kegiatan }}
{{ $ab->kegiatan->kategori->nama_kategori }} @if($ab->waktu_absen) {{ \Carbon\Carbon::parse($ab->waktu_absen)->format('H:i') }} @endif @php $metode = $ab->metode_absen ?? ''; @endphp {{ $metode === 'Import_Mesin' ? 'Mesin' : ($metode ?: 'Manual') }}
{{ $ab->status }}
{{ \Carbon\Carbon::parse($ab->tanggal)->locale('id')->isoFormat('D MMM') }}
@endforeach
@else

Belum ada absensi dalam periode ini.

@endif
{{-- Kalender Mini --}} @php $calMonth = collect($heatmapMonths)->last(); @endphp @if($calMonth)
{{ $calMonth['label'] }}
@foreach(['#f3f4f6','#bbf7d0','#4ade80','#16a34a','#064e2d'] as $hc)
@endforeach Hadir
@foreach(['S','S','R','K','J','S','M'] as $hn)
{{ $hn }}
@endforeach @for($e = 1; $e < $calMonth['firstDayOfWeek']; $e++)
@endfor @foreach($calMonth['days'] as $day)
{{ $day['day'] }}
@endforeach
@endif
{{-- ╔══════════════════════════════════════════╗ --}} {{-- ║ PANEL JADWAL ║ --}} {{-- ╚══════════════════════════════════════════╝ --}}
@foreach(['today'=>'Hari Ini','this_week'=>'Minggu Ini','this_month'=>'Bulan Ini','last_month'=>'Bulan Lalu'] as $v=>$l) @endforeach
{{ $jadFrom->locale('id')->isoFormat('D MMM') }} – {{ $jadTo->locale('id')->isoFormat('D MMM YYYY') }}
@if($jadwalDalamRange->count() > 0) @php $hariOrder = ['Senin','Selasa','Rabu','Kamis','Jumat','Sabtu','Ahad']; $jadGrouped = $jadwalDalamRange->groupBy('hari') ->sortBy(fn($v,$k) => array_search($k, $hariOrder)); @endphp @foreach($jadGrouped as $hari => $jadwals)
{{ $hari }} @if($hari === $hariIni) (Hari Ini) @endif
@foreach($jadwals as $jadwal) @php $statusAbsen = $hari === $hariIni ? ($absensiHariIni[$jadwal->kegiatan_id] ?? null) : ($absensiDalamRange[$jadwal->kegiatan_id] ?? null); $sc = $statusAbsen ? 's-' . strtolower($statusAbsen) : 's-belum'; @endphp
{{ date('H:i', strtotime($jadwal->waktu_mulai)) }}
{{ date('H:i', strtotime($jadwal->waktu_selesai)) }}
{{ $jadwal->nama_kegiatan }}
{{ $jadwal->kategori->nama_kategori }} @if($jadwal->materi) {{ Str::limit($jadwal->materi, 28) }} @endif
@if($statusAbsen) @if($statusAbsen === 'Terlambat') @elseif($statusAbsen === 'Pulang') @endif {{ $statusAbsen }} @elseif($hari === $hariIni) Belum @endif Detail
@endforeach
@endforeach @else

Tidak ada kegiatan terjadwal dalam periode ini.

@endif
@endsection