# Task Breakdown: 09 - Logika Pemrosesan Scanner Kiosk

**Referensi Dokumen:** FR-08.3 (Validation Chain), Tech Spec 4.1
**Tujuan:** Menangani POST HTTP Request berbentuk JSON/AJAX dari klien halaman Kiosk. Ini adalah detak jantung terpadat di seluruh aplikasi (Perekam Pintu Masuk).

## 1. Controller API-Based
- [ ] Buat `KioskScanController` yang berdiri di belakang Middleware `auth.kiosk`. Endpoint HTTP API (`/kiosk/{token}/scan`).
  - Harus dapat menerima `payload` data barcode bertipe `string` dari kamera.

## 2. The *ScanProcessingService*
- [ ] Koding service utama `ScanProcessingService`:
  1. Identifikasi Kepemilikan (Cari Payload ke tabel token `TEACHER_QR_TOKENS` atau ke tabel murid. Filter `is_active=true` saja). Jika *NotFound* → Tolak!
  2. Profil Aktif Check (Cari kepemilikan User/Profile, apakah `is_active` true?).
  3. Cek Libur: Hubungkan referensi Helper (akan dibuat di modul *Holidays*). Skip hari absensi harian jika ada jadwal libur global yang ditandai *is_daily_attendance_active=false*.
  4. Cek Double Scan (*Anti Spam / Debounce*): Lakukan validasi jarak waktu terhadap record *check_in_time* sebelumnya. Aturan jarak minimal 1 menit (`SettingHelper::get('scan_cooldown_seconds')`).
- [ ] Pengambilan Keputusan Check-In vs Check-Out:
  - Jika belum ada row data absensi individu di log hari ini: Create absen harian baru, set *check_in_time*, lalu labeli status *Present* atau *Late* (Komparasikan waktu sekarang terhadap setingan `late_threshold` limit).
  - Jika sudah ada row check_in secara valid: Update kolom *check_out_time*.
  - Jika cek in & check out keduanya ada, namun disinggung lagi untuk scan ketiga: Abaikan record baru dan tanggapi JSON dengan alert *"Gagal men-scan, check-in out harian sudah tuntas"*.

## 3. DTO dan Respons Payload
- [ ] Objek response sukses kembali ke AJAX form Halaman Kiosk harus berupa susunan DTO informatif. Minimal berisi metadata (nama orang, posisi role, foto_url jika ada, tipe scan (`check_in_late`, `check_in`, `check_out`), dan *created time*). 

## 4. Acceptance Criteria
- [ ] Sistem menolak mentah-mentah kartu yang masuk ke daftar "disabled/non-active" pasca regenerasi.
- [ ] Terdapat status penjatuhan "Late" persis akurat merujuk ke tabel *setting dinamis* toleransi terlambat.
- [ ] Scanning spam di bawah ketentuan 1 menit, tak akan melahirkan row ganda di *Database*.
