📋 Status Kehadiran
- HADIR — scan masuk tercatat di presence.entry_time
- ALPA — tidak ada record di presence untuk tanggal itu
- TERLAMBAT — hadir tapi entry_time_late > 0
- IZIN/CUTI/SAKIT — presence_type ≠ 'normal'
✅ Rekap Per Shift
- PAGI — 09:00, shift P* saja
- SIANG — 14:00, gabung P* + S* + M*
- ALL — 19:00, semua shift termasuk NO SCHEDULE
- Group by: Posisi (Supervisor → Admin → Kasir → ...)
⚠️ Edge Cases
- Scan sebelum shift → entry_time_late = 0 (early)
- Telat > 600 menit → cap di 600 (safety)
- Shift belum dijadwalkan → "NO SCHEDULE" group
- Mesin Gambir sering delay 1-2 hari