@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 (mengikuti range statistik) ── --}}
{{ $totalRange }}
Total
{{ $hadirRange }}
Hadir
{{ $persentaseKehadiran }}%
Persentase
{{ $izinRange + $sakitRange }}
Izin / Sakit
{{ $alpaRange }}
Alpa
{{-- ── TABS: Statistik – Jadwal – Riwayat ── --}}
{{-- ╔══════════════════════════════════════════╗ --}} {{-- ║ PANEL STATISTIK ║ --}} {{-- ╚══════════════════════════════════════════╝ --}}
{{-- Filter statistik --}}
@if(request('filter_status')) @endif @if(request('filter_kategori')) @endif
@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 --}}
Tren Kehadiran {{ $diffDays<=31?'Harian':'Mingguan' }}
{{-- Distribusi Status --}}
Distribusi Status
{{-- Konsistensi Score + Kalender sejajar --}}
{{-- Konsistensi Score Card --}}
Konsistensi Score per Kegiatan
@if($consistencyScores->count() > 0)
@foreach($consistencyScores as $idx => $cs)
#{{ $idx + 1 }}
{{ $cs->nama_kegiatan }}
{{ $cs->nama_kategori }} {{ $cs->hadir }}/{{ $cs->total }} hadir @if($cs->alpa > 0) {{ $cs->alpa }} alpa @endif
{{ $cs->score }}%
@if($cs->tier === 'top') @elseif($cs->tier === 'good') @elseif($cs->tier === 'fair') @elseif($cs->tier === 'warn') @else @endif {{ $cs->badge }}
@endforeach
@else

Belum ada data kehadiran dalam periode ini.

@endif @if($consistencyScores->count() > 4) @endif
{{-- end konsistensi card --}} {{-- Kalender Mini — kompak, hanya bulan terakhir dalam range --}} @php $calMonth = collect($heatmapMonths)->last(); @endphp @if($calMonth)
{{ $calMonth['label'] }}
{{-- Legend --}}
@foreach(['#f3f4f6','#bbf7d0','#4ade80','#16a34a','#064e2d'] as $hc)
@endforeach Hadir
{{-- Grid --}}
@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
{{-- end 2-col grid --}}
{{-- end panel-statistik --}} {{-- ╔══════════════════════════════════════════╗ --}} {{-- ║ 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 // Tampilkan status: hari ini pakai absensiHariIni, lainnya dari range $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) {{ $statusAbsen }} @elseif($hari === $hariIni) Belum @endif
@endforeach
@endforeach @else

Tidak ada kegiatan terjadwal dalam periode ini.

@endif
{{-- ╔══════════════════════════════════════════╗ --}} {{-- ║ PANEL RIWAYAT ║ --}} {{-- ╚══════════════════════════════════════════╝ --}}
@foreach(['today'=>'Hari Ini','this_week'=>'Minggu Ini','this_month'=>'Bulan Ini','last_month'=>'Bulan Lalu'] as $v=>$l) @endforeach
{{-- Sub-filter status & kategori --}}
{{ $riwFrom->locale('id')->isoFormat('D MMM') }} – {{ $riwTo->locale('id')->isoFormat('D MMM YYYY') }}
@if(request()->hasAny(['filter_status','filter_kategori'])) Reset filter @endif
@if($riwayats->count() > 0)
@foreach($riwayats as $idx => $absensi) @endforeach
No Tanggal Kegiatan Kategori Waktu Absen Status Aksi
{{ $riwayats->firstItem() + $idx }}
{{ \Carbon\Carbon::parse($absensi->tanggal)->format('d M Y') }}
{{ \Carbon\Carbon::parse($absensi->tanggal)->locale('id')->dayName }}
{{ $absensi->kegiatan->nama_kegiatan }} {{ $absensi->kegiatan->kategori->nama_kategori }} {{ $absensi->waktu_absen ? \Carbon\Carbon::parse($absensi->waktu_absen)->format('H:i') : '-' }} {{ $absensi->status }}
{{ $riwayats->links() }}
@else

Tidak ada riwayat absensi dalam periode ini.

@endif
{{-- CHART.JS --}} @endsection