# Menjalankan fondasi aplikasi absensi

Implementasi saat ini adalah fondasi, belum MVP selesai. Pemeriksaan koneksi menggunakan HTTP Digest pada endpoint `deviceInfo`. Endpoint person dan event belum diimplementasikan karena harus diverifikasi dengan mesin dan firmware yang digunakan. Jangan gunakan aplikasi ini sebagai sumber absensi operasional sebelum integrasi dan uji penerimaan selesai.

## Persiapan

1. Sediakan PHP 8.2 atau lebih baru beserta ekstensi `intl`, `mbstring`, `mysqli`, `curl`, `simplexml`, dan `openssl`, serta MySQL. Jalankan `composer install --no-dev`.
2. Buat database MySQL kosong dan salin `env` menjadi `.env`. Isi konfigurasi `database.default.*`, `app.baseURL`, dan `encryption.key`. Buat kunci acak dengan `php spark key:generate` dan simpan dengan aman. Kehilangan atau penggantian kunci membuat kata sandi perangkat yang tersimpan tidak dapat dibaca.
3. Jalankan `php spark migrate`, lalu `php spark attendance:create-admin` untuk membuat akun awal. Perintah ini hanya dapat dipakai jika tabel pengguna kosong. Input kata sandi mungkin terlihat di terminal; gunakan terminal privat.
4. Arahkan document root web server ke folder `public`, atau jalankan `php spark serve` untuk pengembangan. Gunakan HTTPS dan konfigurasi server yang sesuai sebelum dipakai di jaringan produksi.
5. Masuk sebagai admin, buka Pengaturan Perangkat, simpan koneksi dan jalankan Tes koneksi. Password dienkripsi dan tidak ditampilkan kembali. Tes menggunakan pengaturan terakhir yang disimpan.

Data waktu yang disimpan aplikasi diasumsikan UTC dan ditampilkan sebagai Asia/Jakarta. Sinkronisasi person tersedia secara manual melalui tombol admin di Master Person atau `php spark attendance:sync-persons`. Pengambilan event dapat dijalankan manual dari Monitoring Absensi atau dengan `php spark attendance:sync-events`; polling terjadwal, refresh otomatis, manajemen pengguna, dan detail riwayat person belum tersedia. Halaman monitoring menampilkan data yang sudah tersedia di database; data tidak akan muncul otomatis dari perangkat pada tahap ini.

## Langkah integrasi berikutnya

Diperlukan dokumentasi dan contoh request serta respons yang telah disamarkan untuk endpoint pencarian person dan event perangkat DS-K1T8003MF firmware V1.4.0, termasuk contoh halaman terakhir dan daftar kosong. Setelah format diverifikasi, implementasikan sinkronisasi lengkap secara transaksional, event idempoten, cursor, lock polling, scheduler, dan uji kegagalan seperti yang diuraikan dalam README. Jangan memasukkan kredensial atau data biometrik ke contoh tersebut.

## Pemeriksaan endpoint ISAPI

Setelah konfigurasi database, kunci enkripsi, dan perangkat tersimpan, jalankan `php spark attendance:probe-isapi`. Perintah mengirim pencarian hanya-baca untuk satu person dan satu event dalam 24 jam terakhir, lalu menampilkan status dan nama field tanpa nilai person/event. Pencarian kosong hanya membuktikan respons pencarian, bukan struktur record atau pagination. Hasil sukses tidak membuktikan bahwa seluruh rentang atau semua halaman dapat diambil dengan aman.

Kandidat endpoint berasal dari dokumentasi Access Control Hikvision, sedangkan panduan ISAPI umum yang diberikan tidak merinci endpoint tersebut. Dukungan firmware aktual masih harus diuji sebelum dipakai untuk sinkronisasi produksi.

Sinkronisasi person hanya mengubah data setelah seluruh halaman berhasil divalidasi. Person yang tidak ditemukan dinonaktifkan, dan akan diaktifkan kembali jika muncul lagi. Sebagai pengaman, respons yang menyatakan daftar person kosong tidak akan menonaktifkan seluruh person sampai kondisi kosong dapat diverifikasi secara terpisah.

Monitoring mengelompokkan event per person dan tanggal dalam zona Asia/Jakarta, dengan waktu event pertama dan terakhir. Jenis event belum diverifikasi sebagai masuk atau pulang; tampilan ini bukan penetapan kehadiran atau shift.

## Sesi absensi

Buka Monitoring Absensi, pilih tanggal dan buat sesi. Buka sesi lalu gunakan Perbarui data dari alat. Satu sesi mencakup satu tanggal di zona Asia/Jakarta; pembaruan mengulangi pengambilan untuk tanggal tersebut tanpa menggandakan event yang telah disimpan. Data lama hanya tersedia jika mesin masih menyimpannya. Sesi belum membatasi person berdasarkan kelompok atau kamar.

Admin dapat memilih bulan lalu menekan **Generate dan ambil absensi**. Sesi yang belum ada dibuat sampai hari ini; sesi yang belum pernah disinkronkan diambil dengan satu pencarian rentang tanggal (yang bisa memerlukan beberapa halaman ISAPI). Jika gagal, sesi tetap tersedia dan dapat dicoba lagi. Sesi yang sudah pernah disinkronkan tidak diambil ulang lewat tombol ini; gunakan Perbarui data dari alat pada sesi hari ini untuk event terbaru. Ketersediaan histori bergantung pada data yang masih tersimpan di perangkat.
