# Dokumentasi Fitur Absensi, Master Device, dan Atur Jadwal

## 1. Tujuan
Dokumen ini menjelaskan gambaran umum fitur absensi berbasis device, pengelolaan master device, serta pengaturan jadwal yang digunakan dalam sistem.

## 2. Fitur Absensi
### 2.1 Fungsi Utama
- Menerima data absensi secara realtime dari device facial recognition.
- Mencatat status absensi seperti hadir dan pulang.
- Menyimpan informasi pegawai, device pengirim, waktu kejadian, serta foto (jika tersedia).

### 2.2 Alur Kerja
1. Device mengirim event absensi ke endpoint webhook.
2. Sistem memvalidasi payload yang diterima.
3. Sistem memeriksa apakah event merupakan absensi sukses.
4. Sistem menghindari duplikasi absensi berdasarkan debounce waktu.
5. Data absensi disimpan ke basis data.

### 2.3 Bagian Kode yang Bekerja
- Controller utama untuk absensi adalah app/Http/Controllers/AttendanceWebhookController.php.
- Method store() adalah titik masuk utama yang menerima request dari device, memproses payload, dan menyimpan data absensi.
- Method determineAttendanceStatus() dipakai untuk menentukan apakah event ini termasuk hadir atau pulang berdasarkan urutan event dalam satu hari.
- Method parseEventTime() mengubah waktu dari device menjadi format yang aman untuk disimpan ke database.
- Method isSystemEmployeeNo() memastikan hanya employeeNo yang formatnya sesuai sistem yang diproses.
- Model yang dipakai adalah app/Models/Attendance.php untuk menyimpan record absensi, dan app/Models/StudentFaceRegistration.php untuk mengubah employeeNo menjadi student_id.

### 2.4 Catatan Penting
- Event heartbeat akan diabaikan.
- Event yang bukan status aktif akan ditolak.
- Data absensi hanya diproses untuk employee number yang sesuai format sistem.

## 3. Master Device
### 3.1 Fungsi Utama
- Mengelola data device yang terhubung ke sistem.
- Menyimpan informasi seperti nama device, IP address, dan status pemetaan.
- Digunakan sebagai referensi saat menerima event absensi dari device tertentu.

### 3.2 Kegunaan
- Menentukan device pengirim event absensi.
- Memudahkan identifikasi dan pemantauan perangkat absensi.
- Menjaga konsistensi data antara event yang masuk dan master device.

### 3.3 Bagian Kode yang Bekerja
- Master device dikelola lewat app/Http/Controllers/DeviceController.php.
- Method store() dan update() dipakai untuk menambah atau mengubah data device seperti nama, IP, port, username, password, fdid, dan door_no.
- Method testConnection() dipakai untuk cek koneksi ke device sebelum dipakai.
- Method checkFaceLibType() dan capabilities() dipakai untuk membaca kemampuan device secara live.
- Model app/Models/Device.php menyimpan struktur data device yang dipakai oleh sistem.
- Saat event absensi masuk, controller absensi akan mencocokkan IP pengirim dengan data device di tabel device.

## 4. Atur Jadwal
### 4.1 Fungsi Utama
- Mengatur jadwal kerja atau jadwal kehadiran pegawai.
- Digunakan untuk mendukung proses absensi dan pelacakan kehadiran secara lebih terstruktur.

### 4.2 Kegunaan
- Menentukan pola kehadiran yang berlaku.
- Membantu sistem dalam memproses status absensi sesuai jadwal yang ditetapkan.
- Mendukung kebutuhan administrasi dan monitoring.

### 4.3 Bagian Kode yang Bekerja
- Pengaturan jadwal device di-handle oleh app/Http/Controllers/DeviceScheduleController.php.
- Method store() menyimpan data jadwal baru atau meng-update jadwal yang sudah ada.
- Method sync() mengirim jadwal ke device lewat service FaceDeviceService agar device memahami jam kerja yang berlaku.
- Method destroy() menghapus atau menonaktifkan jadwal yang sudah tidak dipakai.
- Service app/Services/FaceDeviceService.php memegang logika komunikasi dengan device lewat HTTP dan ISAPI.
- Di dalam service ini ada method setAccessTimeWindow() dan setUserRightPlanTemplate() yang dipakai untuk menerapkan jadwal ke device.

## 5. Struktur Umum Proses
- Absensi: menerima dan menyimpan event kehadiran.
- Master Device: mengelola perangkat yang terhubung.
- Jadwal: mengatur aturan kerja yang menjadi acuan sistem.

### 5.1 Ringkasan Alur Kode Secara Keseluruhan
1. Device mengirim event ke sistem.
2. AttendanceWebhookController menerima request dan memvalidasi payload.
3. Sistem menilai event apakah layak diproses atau diabaikan.
4. IP pengirim dicocokkan dengan data device di master device.
5. FaceDeviceService bisa dipakai untuk mengatur device dan jadwal ke perangkat fisik.
6. Sistem menentukan status absensi berdasarkan urutan event dalam satu hari.
7. Data disimpan ke database melalui model Attendance dan siap dipakai untuk pelaporan atau monitoring.

## 6. Kesimpulan
Ketiga fitur ini saling berkaitan untuk memastikan proses absensi berjalan akurat, aman, dan terkontrol. Absensi bergantung pada data device yang valid, sementara jadwal membantu sistem menentukan aturan pelaksanaan absensi yang lebih konsisten.
