# Panduan: Sistem Multi-Sesi Absensi

## Ringkasan Fitur

Sistem ini mendukung absensi multi-sesi fleksibel dalam satu hari. Anda dapat:
- **Membuat hingga 8 sesi** (atau lebih) dalam satu hari
- **Menetapkan jam mulai dan jam selesai** untuk setiap sesi
- Sistem **otomatis menghitung keterlambatan** berdasarkan jam mulai sesi
- **Mencegah absensi setelah sesi berakhir** (tidak bisa absen setelah jam selesai)
- **Menandai sesi aktif/nonaktif** sesuai kebutuhan

---

## Cara Menggunakan

### 1. Mengakses Menu Sesi Absensi

1. Login ke dashboard admin
2. Klik menu **"Sesi"** di sidebar
3. Atau akses langsung: `http://localhost:8080/admin/sesi`

### 2. Membuat Sesi Baru

#### Opsi A: Buat Sesi Tetap
Sesi tetap digunakan untuk pola absensi yang sama setiap hari (mis: sesi 1, sesi 2, dst).

1. Klik tombol **"Tambah"**
2. Isi form:
   - **Nama Sesi**: Contoh: "Sesi 1", "Sesi Pagi", "Blok 1"
   - **Jam Mulai**: Contoh: `07:00`
   - **Jam Selesai**: Contoh: `09:00`
3. Klik **"Simpan"**

**Contoh konfigurasi sesi dalam sehari:**

| No | Nama Sesi | Jam Mulai | Jam Selesai | Keterangan |
|----|-----------|-----------|-------------|-----------|
| 1  | Sesi 1    | 07:00     | 09:00       | Sesi pagi |
| 2  | Sesi 2    | 09:15     | 11:15       | Sesi pagi lanjutan |
| 3  | Sesi 3    | 12:30     | 14:30       | Sesi siang |
| 4  | Sesi 4    | 14:45     | 16:45       | Sesi sore |

#### Opsi B: Buat Sesi Hari Ini
Sesi khusus untuk kondisi kebutuhan absensi hari itu saja.

1. Klik tombol **"Tambah Sesi Hari Ini"**
2. Isi form sama seperti diatas, default nama: "Sesi Hari Ini"
3. Klik **"Simpan"**

---

## Cara Kerja Sistem Validasi

### Skenario Waktu Absensi

Misalkan **Sesi 1 memiliki:**
- Jam Mulai: **07:00**
- Jam Selesai: **09:00**

#### Status Berdasarkan Waktu Absen:

| Jam Absen | Status | Keterlambatan | Catatan |
|-----------|--------|---------------|---------|
| 06:45     | ✅ Diterima | 0 menit | Tepat waktu (absen sebelum jam mulai) |
| 07:00     | ✅ Diterima | 0 menit | Tepat waktu (absen tepat jam mulai) |
| 07:30     | ✅ Diterima | 30 menit | **Terlambat 30 menit** |
| 08:59     | ✅ Diterima | 119 menit | **Terlambat 119 menit** |
| 09:00     | ✅ Diterima | 120 menit | **Terlambat 120 menit** (last second) |
| 09:01     | ❌ Ditolak | - | **Sesi telah berakhir**, tidak bisa absen |
| 10:00     | ❌ Ditolak | - | **Sesi telah berakhir**, tidak bisa absen |

---

## Fitur Validasi Otomatis

### 1. **Cek Sesi Aktif**
Sistem hanya menerima absensi untuk sesi yang status "Aktif". Sesi yang tidak aktif akan ditolak.

### 2. **Validasi Waktu Sesi**
- Jika waktu absen **sebelum/pada jam selesai**: ✅ Diterima
- Jika waktu absen **setelah jam selesai**: ❌ Ditolak (pesan: "Sesi telah berakhir")

### 3. **Perhitungan Keterlambatan**
- Jika jam absen **sebelum jam mulai**: Keterlambatan = 0 menit
- Jika jam absen **setelah jam mulai**: Keterlambatan = selisih menit dari jam mulai

### 4. **Cek Duplikasi Sesi**
- Peserta hanya bisa absen **1x per sesi per hari**
- Absensi kedua untuk sesi sama akan ditolak

---

## Contoh Implementasi

### Scenario: FGD 8 Sesi Penuh

**Setup Sesi:**

```
Sesi 1   | 07:00 - 09:00 (2 jam)
Sesi 2   | 09:15 - 11:15 (2 jam)
Sesi 3   | 12:30 - 14:30 (2 jam)
Sesi 4   | 14:45 - 16:45 (2 jam)
(+ sesi tambahan sesuai kebutuhan)
```

**Proses Absensi Peserta:**

1. **Pukul 06:50** - Peserta masuk dengan QR code, sistem tanyakan "Pilih Sesi Mana?"
   - Peserta pilih: Sesi 1
   - Hasil: ✅ Diterima (tepat waktu)

2. **Pukul 09:20** - Peserta keluar dari Sesi 1, masuk Sesi 2
   - Peserta pilih: Sesi 2
   - Hasil: ✅ Diterima (15 menit terlambat dari jam mulai)

3. **Pukul 11:30** - Peserta coba absen Sesi 2 lagi
   - Pilih: Sesi 2
   - Hasil: ❌ Ditolak ("Anda sudah absen untuk sesi ini")

4. **Pukul 14:35** - Peserta absen Sesi 3
   - Pilih: Sesi 3
   - Hasil: ❌ Ditolak ("Sesi 3 telah berakhir pada jam 14:30")

---

## Editing dan Penghapusan Sesi

### Edit Sesi Existing

1. Di halaman Sesi, klik tombol **"Edit"** pada sesi yang ingin diubah
2. Update data:
   - Nama Sesi
   - Jam Mulai
   - Jam Selesai
   - Checkbox "Aktif" (untuk menonaktifkan/mengaktifkan)
3. Klik **"Simpan"**

### Nonaktifkan Sesi (Tanpa Menghapus)

1. Edit sesi
2. **Uncheck** checkbox "Aktif"
3. Klik **"Simpan"**
4. Sesi tidak akan muncul di menu pemilihan, tapi data lama tetap tersimpan

### Hapus Sesi

1. Di halaman Sesi, klik tombol **"Hapus"** pada sesi yang ingin dihapus
2. Sistem akan menghapus sesi (hati-hati: data riwayat absensi sesi ini tetap ada di database)

---

## Tips Menggunakan Sistem

### ✅ Best Practices

1. **Beri Nama Deskriptif**
   - ✅ Baik: "Sesi 1 - Pagi (07:00-09:00)"
   - ❌ Kurang: "S1"

2. **Jangan Overlap Waktu**
   - ✅ Baik: Sesi 1 (07:00-09:00) → Sesi 2 (09:15-11:15)
   - ❌ Kurang: Sesi 1 (07:00-09:00) → Sesi 2 (08:30-10:30)

3. **Set Durasi Realistis**
   - Beri gap 10-15 menit antar sesi untuk break/perpindahan
   - Durasi sesi minimal 1.5-2 jam untuk kegiatan serius

4. **Aktifkan Hanya Sesi yang Digunakan**
   - Nonaktifkan sesi jika tidak digunakan hari itu
   - Mencegah peserta memilih sesi yang tidak berlaku

### ⚠️ Hal yang Perlu Diperhatian

1. **Waktu Server**
   - Pastikan waktu server akurat
   - Keterlambatan berdasarkan jam server, bukan jam client

2. **Tidak Bisa Retroaktif**
   - Tidak bisa absen untuk sesi yang sudah lewat
   - Pastikan peserta absen sebelum sesi berakhir

3. **Timezone Consideration**
   - Jika server di zona waktu berbeda, setting timezone di `.env`
   - Contoh: `app.timezone = Asia/Jakarta`

---

## Laporan & Analytics

### Melihat Data Absensi Sesi

1. Klik menu **"Absensi Peserta"** atau **"Data Absensi"**
2. Sistem menampilkan data absensi per sesi dan tanggal
3. Filter berdasarkan:
   - Tanggal
   - Sesi
   - Grup/Kelompok
4. Export ke Excel jika diperlukan

### Analisis Keterlambatan

- Kolom "Jam Masuk" menunjukkan waktu absen actual
- Hitung selisih dengan "Jam Mulai" sesi untuk keterlambatan
- Atau lihat keterangan di sistem jika tercatat

---

## Troubleshooting

### Q: Peserta tidak bisa memilih sesi?
**A:** 
- Pastikan minimal 1 sesi dengan `is_active = 1`
- Refresh halaman scan QR
- Clear browser cache

### Q: Sistem tunjukkan error "Sesi telah berakhir"?
**A:**
- Waktu absen melebihi jam selesai sesi
- Absen harus dilakukan sebelum jam selesai sesi
- Jika perlu, edit jam selesai sesi lebih lambat

### Q: Data lama absensi masih terlihat setelah hapus sesi?
**A:**
- Itu normal - data riwayat absensi tetap disimpan
- Untuk audit trail dan laporan
- Gunakan "Nonaktifkan" alih-alih "Hapus" jika perlu arsip

### Q: Bagaimana jika ada peserta yang sudah absen tapi ingin mengubah jam masuk?
**A:**
- Admin bisa edit data presensi di menu "Edit Absensi"
- Cari peserta dan sesi, ubah jam masuk jika diperlukan
- Keterlambatan akan dihitung ulang secara otomatis

---

## Database Schema

Untuk referensi teknis, fitur sesi menggunakan tabel:

```sql
-- Tabel Sesi
tb_sesi
├── id_sesi (Primary Key)
├── nama_sesi VARCHAR(100)
├── jam_mulai TIME
├── jam_selesai TIME
└── is_active TINYINT(1)

-- Tabel Presensi dengan Sesi
tb_presensi_peserta
├── id_presensi (Primary Key)
├── id_peserta (FK)
├── id_sesi (FK) ← Link ke sesi
├── tanggal DATE
├── jam_masuk TIME
├── jam_keluar TIME
├── id_kehadiran (status: Hadir/Sakit/Izin/Alfa)
└── keterangan VARCHAR(255)
```

---

## Kontak Support

Jika ada pertanyaan atau masalah teknis, silakan:
1. Cek log di `writable/logs/`
2. Contact administrator sistem

---

**Versi Panduan**: 1.0
**Last Updated**: 2026-07-10
**Kompatibel dengan**: AbsensiAI v2.0+
