v4.3.0
01 Juli 2026, 15:10 WIB
✨ Pembaruan / 🎨 UI/UX / 📱 Portal Pegawai (Mandiri) Redesign
- ▸[Sleek 3-Column Top Layout] Merombak tata letak atas portal pegawai ([pegawai/index.php](file:///c:/xampp/htdocs/webapps/absensi/pegawai/index.php)) yang sebelumnya memakan ruang kosong (huge card) menjadi layout grid responsif 3 kolom:
- ▸Kolom 1: Kehadiran Hari Ini (Baru): Menampilkan real-time digital clock (WIB), nama shift terjadwal hari ini dari `jadwal_pegawai`, jam kerja dinas, catatan riko scan wajah masuk & pulang aktual, serta badge status kehadiran (Tepat Waktu/Terlambat) dinamis.
- ▸Kolom 2: Cuti Tahunan: Menyajikan info sisa cuti dan masa aktif cuti dalam bentuk card bergradien premium yang lebih ringkas.
- ▸Kolom 3: Menu Aksi Cepat: Grid compact 5 menu utama (Cuti Baru, Jadwal & Log, Biometrik, Pengajuan Lembur, Slip Gaji) dengan hover micro-animations.
- ▸[FontAwesome Library Integration] Memperbaiki bug hilangnya icon pada menu Pengajuan Lembur dan Slip Gaji dengan menyertakan stylesheet resmi FontAwesome 6 pada bagian `<head>`.
- ▸[Tabbed Histori Pengajuan dengan DataTables] Menyediakan sistem tab pada bagian bawah untuk bergantian melihat Riwayat Cuti dan Riwayat Lembur:
- ▸Diintegrasikan dengan library DataTables dan Buttons Extension untuk menghadirkan fitur auto-sorting (clickable header), kolom pencarian instan, pagination dinamis (default: 5 baris), serta tombol Export Excel instan untuk kebutuhan pelaporan mandiri pegawai.
- ▸Custom styling khusus yang melekat pada seluruh instrumen DataTables (search, pages, export buttons) agar selaras dengan tema premium gelap glassmorphic portal.
- ▸[Responsive Mobile Stacking] Mematangkan rendering pada ponsel cerdas melalui flex-basis dan CSS grid breakpoints (`lg:grid-cols-3` dan `grid-cols-1`) agar tabel serta dashboard tetap terbaca tanpa merusak layout.
v4.2.0
01 Juli 2026, 14:35 WIB
✨ Penambahan / 🎨 UI/UX / 📊 Analitik (Opsi C)
- ▸[HRD Dashboard Restructured — 4-Tab Navigation] Merombak total tampilan [hrd/index.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/index.php): dari 16 card yang membingungkan menjadi 4 tab menu yang terorganisasi:
- ▸Kehadiran & Monitor: Validasi Absen, Absensi Manual, Face Enrollment, Live Monitoring, Auto Reminder BOT.
- ▸Kepegawaian & Shift: Data Pegawai, Surat Cuti, Jam Shift, Evaluasi Kinerja, Petugas Spesial.
- ▸Lembur & Gaji: Sistem Lembur, Rekap Telat & Denda, Rekap & Payroll, Penggajian.
- ▸Analitik & Laporan: Dashboard Analitik (baru), Laporan Harian, Setup Keterlambatan.
- ▸Active tab disimpan di `sessionStorage` untuk UX konsisten.
- ▸[Dashboard Analitik — Opsi C COMPLETE] Halaman baru [hrd/analitik.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/analitik.php) premium dengan:
- ▸6 KPI Cards dinamis: Total Presensi, Tepat Waktu %, Pegawai Aktif, Jam Lembur, Biaya Lembur, Jumlah Risiko Fatigue — warna adaptif sesuai ambang batas.
- ▸Tren Kehadiran 12 Bulan: Area chart ApexCharts dengan gradien — tepat waktu (hijau) vs terlambat (merah).
- ▸Biaya Lembur per Departemen: Horizontal bar chart gradient, sortir Top 10 terboros.
- ▸Heatmap Keterlambatan: Tabel DOM custom mapping departemen × hari dalam seminggu dengan skema warna intensitas adaptif (biru rendah → merah tinggi).
- ▸Tabel Risiko Fatigue: Analisis konsekutif shift malam dari `jadwal_pegawai` dikorelasikan dengan frekuensi keterlambatan `rekap_presensi` — scoring risk (Tinggi/Sedang/Rendah) dengan visualisasi bar konsekutif.
- ▸Filter dinamis: bulan, tahun, departemen — semua chart refresh tanpa reload halaman.
- ▸[Analytics API — hrd/api_analitik.php]: 6 endpoint baru (`get_kpis`, `get_attendance_trends`, `get_overtime_cost`, `get_late_heatmap`, `get_fatigue_risk`, `get_departemen`) dengan query teroptimasi ke `rekap_presensi`, `pengajuan_lembur`, `jadwal_pegawai`.
v4.1.0
01 Juli 2026, 14:15 WIB
✨ Penambahan / 🔐 Keamanan / Audit Trail
- ▸[Khanza Integrated Change Password] Menyediakan tombol Ganti Pass pada baris aksi pegawai di portal HRD ([hrd/pegawai.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/pegawai.php)) yang memicu dialog SweetAlert2 terintegrasi.
- ▸[AES Encrypted Synchronizer] Menambahkan endpoint `change_password` pada [hrd/api_pegawai.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_pegawai.php) yang memproses penggantian password dengan kunci enkripsi AES Khanza (`windi` untuk password, `nur` untuk id_user). Otomatis melakukan `INSERT` jika akun belum ada, atau `UPDATE` jika akun sudah ada.
- ▸[Forensic Audit Log] Merekam seluruh aktivitas CRUD & perubahan password pegawai ke dalam log audit `trackersql` lengkap dengan query SQL dan aktor pengeksekusi.
v4.0.1
01 Juli 2026, 14:08 WIB
🛠️ Perbaikan Bug / 🔐 Keamanan
- ▸[ES6 Print Interpolation Fix] Memperbaiki tanda escaping backslash `\` pada template literal ES6 dalam fungsi `printSlipGaji()` yang menyebabkan placeholder data tercetak mentah/literal.
- ▸[Dynamic QR Code Signature] Mengganti kolom tanda tangan statis HRD menjadi gambar QR Code dinamis yang terintegrasi. Ketika di-scan, QR Code berisi teks deklarasi resmi: *"Slip gaji ini dikeluarkan otomatis oleh sistem informasi [nama rumah sakit] pada tanggal [tgl generate dokumen] di [alamat rumah sakit]"*.
v4.0.0
01 Juli 2026, 13:54 WIB
✨ Penambahan / 🔐 Keamanan / Alur Kerja
- ▸[Unified Employee Overtime Portal] Mendukung pilihan pengajuan lembur tipe "Terencana" (masa depan, min hari ini) dan "OnCall" (masa lalu, max 3 hari toleransi) secara self-service di portal pegawai. Peringatan limitasi tanggal diterapkan secara dinamis sesuai tipe yang dipilih.
- ▸[DOB PIN Protected Slip Gaji] Menambahkan portal Slip Gaji & Pendapatan Mandiri pada dashboard pegawai yang dilindungi gerbang PIN Tanggal Lahir (format `DDMMYYYY`).
- ▸[Dynamic Payroll Calc & Print Wrapper] Melakukan kalkulasi seluruh variabel payroll di sisi server (gaji kotor, potongan jamsostek/bpjs/denda, insentif, dan take home pay) sinkron dengan perhitungan HRD. Menyediakan template print-friendly formal dengan tombol ekspor cetak native.
v3.9.0
01 Juli 2026, 13:50 WIB
✨ Penambahan / 🎨 Estetika / Tampilan
- ▸[Stamp Mode Scheduling Brush] Menyediakan mode "Stempel" (Scheduling Brush) sebagai alternatif drag-and-drop. Cukup klik sekali pada shift di palet atas untuk mengaktifkannya.
- ▸[Mouse Cursor Follower & ESC Trigger] Selama mode Stempel aktif, badge bulat mini beserta ikon stempel (`fa-stamp`) akan mengikuti pergerakan mouse. Klik pada sel kalender mana saja akan langsung menulis/menyimpan shift tersebut ke sel target (bypassing modal detail). Tekan tombol ESC atau klik tombol Kembalikan Stempel di palet untuk keluar dari mode Stempel.
v3.8.3
01 Juli 2026, 13:48 WIB
✨ Penambahan / 🎨 Estetika / Tampilan
- ▸[Tiny Drag Image & Pointer Arrow] Menggunakan native API `dataTransfer.setDragImage` untuk memangkas ukuran preview seret-dan-lepas (drag preview) yang sebelumnya terlalu besar. Saat diseret, kursor akan membawa badge bulat mini (`P`, `S`, `M`, `L`, `🗑️`) yang disertai tanda panah penunjuk (teal cursor arrow) untuk kemudahan penempatan sel target yang sempit.
v3.8.2
01 Juli 2026, 13:45 WIB
✨ Penambahan / 🐛 Perbaikan
- ▸[Auto-Assign Department Restricting] Membatasi fungsionalitas Auto-Assign agar hanya bisa dieksekusi saat user memfilter satu departemen spesifik. Jika filter "SEMUA DEPARTEMEN" dipilih, sistem memblokir eksekusi guna mencegah tabrakan jam kerja antar departemen.
- ▸[Jam Jaga Constraint Alignment] Menyelaraskan algoritma Auto-Assign secara ketat hanya menggunakan kode shift yang terdaftar pada tabel `jam_jaga` departemen bersangkutan. Jika departemen tersebut tidak memiliki tipe shift tertentu (misal tidak ada shift Malam), bobot didistribusikan secara proporsional hanya ke shift yang tersedia.
- ▸[UI Label Simplification] Menghapus badge status "TACTICAL MODE ACTIVE" dan menyederhanakan judul utama halaman "TACTICAL JADWAL DINAS" menjadi "Jadwal Dinas" saja.
v3.8.1
01 Juli 2026, 13:42 WIB
🐛 Perbaikan
- ▸[Hapus Shift Button State Reset] Memperbaiki bug di mana tombol "Hapus Shift" tersangkut dengan teks "menyimpan..." dan dalam keadaan dinonaktifkan (disabled) setelah modal ditutup dan dibuka kembali. Menyematkan ID `btnHapusShift` dan melakukan reset text serta status disabled ke semula pada inisiasi `openShiftModal()`.
v3.8.0
01 Juli 2026, 13:40 WIB
✨ Penambahan / 🐛 Perbaikan
- ▸[Fair Auto-Assign Scheduler Algorithm] Membuat algoritma penjadwalan otomatis berbasis JS di [jadwal/tactical.php](file:///c:/xampp/htdocs/webapps/absensi/jadwal/tactical.php). Algoritma ini membagi rata shift kerja (keadilan proporsional bulanan) berdasarkan target hari kerja (default 26 hari, 4-5 hari libur) dan komposisi shift (50% Pagi, 30% Siang, 20% Malam) dengan mematuhi semua aturan kelelahan fisik (Malam -> Pagi, Malam berturut-turut).
- ▸[Sandbox Draft Mode] Mengaktifkan *sandbox draft mode* saat auto-assign berjalan. Jadwal hasil generate ditampilkan sebagai draf dengan penanda visual `.draft-cell` (border putus-putus indigo & latar keunguan). Pengguna bebas melakukan peninjauan, modifikasi manual via klik cepat modal, atau seret & letakkan (drag-and-drop) draf sebelum memutuskan menyimpannya.
- ▸[Draft Control Banner & Bulk Save] Menyediakan floating banner di bagian bawah layar untuk Simpan Rencana atau Batalkan. Menyimpan rencana akan mengirim data perubahan bulanan secara paralel (`Promise.all`) ke endpoint server database `save_schedule` untuk efisiensi penyimpanan massal berkecepatan tinggi.
v3.6.0
01 Juli 2026, 13:25 WIB
✨ Penambahan / 🐛 Perbaikan
- ▸[Unified Tactical Mode (Click & Drag-Drop)] Mengintegrasikan fungsionalitas drag-and-drop shift secara langsung ke halaman roster utama [jadwal/tactical.php](file:///c:/xampp/htdocs/webapps/absensi/jadwal/tactical.php). Kepala ruangan/unit kini dapat memilih opsi sesuai kenyamanan: melakukan klik cepat pada tanggal untuk membuka modal entri biasa, atau menyeret badge shift dari palet atas (Pagi, Siang, Malam, Libur, Hapus Shift) dan menjatuhkannya ke sel kalender.
- ▸[Sistem Deteksi Batas Lelah (Fatigue Warning)] Menambahkan validasi visual berbasis JS pada tabel roster Tactical Mode untuk menandai sel dengan peringatan merah (`⚠️`) jika staf dijadwalkan shift Malam -> Pagi berturut-turut keesokan harinya, atau mendapat shift Malam selama 3 hari berturut-turut (>=3).
- ▸[Additive Navigation & Code Cleanup] Menghapus file `visual_scheduler.php` yang redundan, dan memperbarui navigasi [jadwal/index.php](file:///c:/xampp/htdocs/webapps/absensi/jadwal/index.php) untuk memperjelas peranan baru Tactical Mode yang terintegrasi penuh.
v3.5.0
01 Juli 2026, 13:10 WIB
✨ Penambahan / 🐛 Perbaikan
- ▸[HRD Rekap & Integrasi Payroll Dashboard] Menambahkan modul baru [hrd/rekap_payroll.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/rekap_payroll.php) dan backend API [hrd/api_rekap_payroll.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_rekap_payroll.php) dengan menggunakan data komprehensif yang 100% selaras dengan modul penggajian kompleks [hrd/gaji.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/gaji.php) dan denda [hrd/api_rekap_keterlambatan.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_rekap_keterlambatan.php).
- ▸[Slide-Over Detail Drawer] Menambahkan drawer detail interaktif yang akan meluncur keluar ketika baris pegawai diklik pada tabel. Menampilkan rincian transparan atas 9 komponen pendapatan (Gapok dinamis, Tunjangan Jabatan, Tunjangan Master, Tunjangan Hadir, Jaga Malam, Fee Lembur, Insentif, Jasa Medis, Jasa Lain) dan 8 komponen potongan (BPJS, Jamsostek, Sosial, Koperasi, Pajak, Pribadi, Denda Telat, Kurang Hadir).
- ▸[Payroll Export & Print Integration] Mendukung ekspor spreadsheet (.xlsx) siap-impor yang menyertakan seluruh rincian komponen penggajian di atas menggunakan library `SimpleXLSX.php` beserta layout cetak PDF yang teroptimasi.
- ▸[Navigasi Menu Utama] Menambahkan tombol pintas menu "Rekap & Integrasi Payroll" yang berestetika premium glassmorphic di halaman [hrd/index.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/index.php).
v3.4.0
01 Juli 2026, 12:45 WIB
✨ Penambahan / 🐛 Perbaikan
- ▸[Cross-Day Night Shift Check-In] Memperbaiki bug deteksi shift malam saat check-in setelah tengah malam (antara jam 00:00 - 06:00). Sistem kini mendeteksi jadwal shift malam hari sebelumnya yang belum diselesaikan sebagai kandidat aktif, sehingga mencegah kegagalan absen "Jadwal tidak ditemukan".
- ▸[Infinite On-Call Cycles Support] Memperbaiki limitasi siklus check-in berturut-turut pada hari yang sama (misal: shift reguler -> shift tambahan -> On-Call ketiga dst). Pengajuan OnCall yang disetujui kini secara dinamis dipetakan ke kode shift virtual kosong dari enum database (`Malam2` dst) beserta jam masuk/pulang dinamisnya yang disematkan langsung dalam secure `absen_token`. Mendukung penuh Face Recognition [api_presensi.php](file:///c:/xampp/htdocs/webapps/absensi/api_presensi.php) dan biometric WebAuthn [api_webauthn.php](file:///c:/xampp/htdocs/webapps/absensi/api_webauthn.php).
v3.3.1
01 Juli 2026, 12:25 WIB
✨ Penambahan / 🐛 Perbaikan
- ▸[Superadmin Onboarding Clarity & CSRF Fix] Memperbaiki bug "Invalid CSRF token" pada backend inisialisasi tabel lembur [superadmin/api_setup_lembur.php](file:///c:/xampp/htdocs/webapps/absensi/superadmin/api_setup_lembur.php) dan update database cuti [superadmin/api_update_cuti.php](file:///c:/xampp/htdocs/webapps/absensi/superadmin/api_update_cuti.php) dengan menggunakan standard CSRF session key `csrf_token`. Menambahkan deteksi status kompatibilitas skema database (`act=status`) dan memperbarui tampilan UI di panel [superadmin/index.php](file:///c:/xampp/htdocs/webapps/absensi/superadmin/index.php) secara dinamis: jika skema database sudah sesuai, tombol setup akan otomatis berubah menjadi hijau, bertuliskan "Sudah Kompatibel", dinonaktifkan (disabled), serta menampilkan ikon status sukses berwarna hijau.
v3.3.0
01 Juli 2026, 12:10 WIB
✨ Penambahan / 🐛 Perbaikan / 🔒 Keamanan
- ▸[Overtime Logic Safety & Reversion] Menyempurnakan alur kerja sistem lembur untuk mencegah duplikasi sinkronisasi ke tabel `tambahjaga` (menggunakan safety guard flag `tambahjaga_synced`). Menambahkan fungsi `unsync_dari_tambahjaga` untuk melakukan pembatalan sinkronisasi (pengurangan atau penghapusan `jml`) saat pengajuan lembur yang sudah terlanjur disetujui kemudian ditolak atau dibatalkan. Menyediakan tombol "BATALKAN" pada data lembur yang berstatus *Disetujui* atau *Ditolak* di halaman [hrd/lembur.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/lembur.php) beserta endpoint API pembatalan [hrd/api_lembur_hrd.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_lembur_hrd.php?act=cancel_approval) untuk memudahkan koreksi kesalahan input HRD, lengkap dengan pencatatan audit log forensik ke `trackersql`.
v3.2.1
01 Juli 2026, 12:05 WIB
🎨 Estetika / Tampilan
- ▸[Fix Icon Dashboad HRD] Mengganti penggunaan FontAwesome yang tidak terload di dashboard HRD [hrd/index.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/index.php) pada card "Sistem Lembur" dan "Petugas Spesial" menggunakan inline SVG (koper/briefcase dan tameng/shield) agar sepadan, serasi, dan tampil sempurna seperti card lainnya.
v3.2.0
01 Juli 2026, 11:40 WIB
✨ Penambahan / 🔒 Keamanan
- ▸[Late Tolerance Settings CRUD] Membuat menu Setup Keterlambatan bagi HRD di [hrd/setup_keterlambatan.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/setup_keterlambatan.php) and API backend [hrd/api_setup_keterlambatan.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_setup_keterlambatan.php) untuk mengelola data toleransi, terlambat 1, dan terlambat 2 pada tabel `set_keterlambatan`. Menjamin bahwa konfigurasi selalu terdiri dari hanya satu baris data (single row guarantee) dan merekam jejak audit (audit trail) perubahan data lengkap ke tabel `trackersql` untuk audit keamananan forensik. Menambahkan pula link akses menu pada halaman dashboard HRD [hrd/index.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/index.php).
v3.1.0
01 Juli 2026, 11:28 WIB
✨ Penambahan / 🐛 Perbaikan / 🔒 Keamanan
- ▸[Leave Cancellation Workflow] Menambahkan mekanisme pembatalan cuti (cancel approval) bagi HRD pada rencana cuti yang belum terlewati (aktif/mendatang). Status diubah menjadi `Dibatalkan` (di-enum setelah alter), jatah cuti diambil pegawai di-recalculate secara otomatis, jadwal pegawai pada range tanggal tersebut dikosongkan kembali di `jadwal_pegawai` (jika bernilai 'Cuti'), dan audit log lengkap dicatat di trackersql tanpa kompresi. Menambahkan pula tombol "Update Database Cuti" di Super Admin Panel serta check otomatis di installasi.php untuk melakukan perubahan enum secara idempoten di production server.
v3.0.6
01 Juli 2026, 11:13 WIB
🐛 Perbaikan / 🔒 Keamanan
- ▸FIX Menampilkan nama dan NIK pegawai terdeteksi di pop-up info saat jadwal tidak ditemukan pada face recognition. Ini membantu diagnosis mis-recognition (salah deteksi wajah) yang merupakan akar masalah mengapa Face Recognition gagal "jadwal tidak ditemukan" sementara WebAuthn berjalan normal.
v3.0.5
26 Juni 2026, 16:05 WIB
🐛 Perbaikan / ⚡ Optimasi
- ▸[Lock Date on Face Detection & Biometric Scan] Memperbaiki bug "jadwal tidak ditemukan" yang timbul saat terjadi pergantian hari (tengah malam) atau keterlambatan proses tantangan di Face Recognition, serta selama proses autentikasi biometrik WebAuthn. Tanggal lokal klien dikunci saat pencocokan wajah pertama kali atau saat scan biometrik diinisiasi, kemudian dikirimkan sebagai parameter `client_date` ke server untuk lookup jadwal shift di `determine_active_shift_pdo()`.
- ▸[Active Status Filter for Face Descriptors] Menyaring daftar descriptor wajah di `get_descriptors` pada `api_presensi.php` dan `api_presensi_clinic.php` (serta query ETag) dengan kondisi `p.stts_aktif = 'AKTIF'`. Ini mencegah face recognition mencocokkan wajah dengan akun lama/percobaan yang statusnya sudah `KELUAR`/`NON AKTIF` (misal NIK: `IT` vs `2016-4359-0046`) yang tidak memiliki jadwal aktif, sehingga menyebabkan anomali "Jadwal Tidak Ditemukan".
v3.0.4
26 Juni 2026, 15:37 WIB
✨ Penambahan / ⚡ Optimasi
- ▸[Detailed Overtime/Absence Deduction Print Evidence] Memperkaya tabel pada halaman cetak surat potongan denda [hrd/cetak_potongan.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/cetak_potongan.php). Selain mencetak tanggal dan kategori pelanggaran, tabel kini menampilkan kolom bukti/eviden berupa nama Shift, detail Jadwal Masuk-Pulang, dan detail Realisasi Jam Masuk-Pulang pegawai. Pada kasus mangkir, kolom realisasi jam masuk-pulang dicetak sebagai TIDAK ABSEN berwarna merah tebal untuk memberikan bukti konkrit yang tidak terbantahkan jika terdapat sanggahan.
v3.0.3
26 Juni 2026, 15:33 WIB
🐛 Perbaikan / ⚡ Optimasi
- ▸[Responsive Datatable Detail Click Fix] Memperbaiki bug pada `hrd/rekap_keterlambatan.php` dan `hrd/potongan.php` di mana tombol "Rincian & Cetak" tidak merespons (tidak melakukan apa-apa) saat tabel berada pada tampilan responsif (layar sempit/menengah). Selector jQuery diubah dari `$(this).parents('tr')` menjadi selector yang memeriksa apakah baris yang diklik merupakan baris anak dinamis (`tr.child`), lalu mengambil baris induk sebelumnya (`tr.prev()`) untuk memastikan DataTables dapat membaca data baris (`rowData`) secara konsisten.
v3.0.2
17 Juni 2026, 14:28 WIB
🐛 Perbaikan / ⚡ Optimasi
- ▸[Payroll API Parameter Fix] Mengubah parameter AJAX query pada `hrd/gaji.php` dari `only_config` menjadi `only_global` agar sejalan dengan parameter di `hrd/api_gaji.php`. Hal ini mencegah interceptor keamanan di `conf/conf.php` mendeteksi kata `"conf"` pada query parameter (`only_config`) dan melakukan redirect 302 ke index HTML login page, yang sebelumnya memicu JSON parse error `Unexpected token '<'`.
v3.0.1
17 Juni 2026, 14:12 WIB
🔒 Keamanan / 🐛 Perbaikan
- ▸[Stateless Token Engine] Mengganti sistem tiket berbasis session PHP (`absen_ticket_...`) dengan token stateless berbasis tandatangan kriptografi HMAC-SHA256 (`generate_stateless_token()` dan `validate_stateless_token()`) di [conf/load_config.php](file:///c:/xampp/htdocs/webapps/absensi/conf/load_config.php). Payload token ditandatangani menggunakan password database dan salt statik untuk menjamin integritas.
- ▸[Kiosk/Incognito Compatibility] Menghapus ketergantungan sesi (`PHPSESSID` cookie) pada endpoint `api_presensi.php` dan `api_webauthn.php`, sehingga fungsionalitas presensi wajah dan autentikasi biometrik WebAuthn berfungsi penuh pada lingkungan kiosk browser/mode penyamaran yang memblokir cookie.
- ▸[Stateless WebAuthn Challenge] Mengubah pembuatan challenge WebAuthn di [webauthn/WebAuthnHelper.php](file:///c:/xampp/htdocs/webapps/absensi/webauthn/WebAuthnHelper.php) menjadi model bertanda tangan stateless (`timestamp.rand.signature`) dengan toleransi waktu kedaluwarsa 10 menit, serta mempertahankan session challenge hanya sebagai fallback otomatis.
- ▸[Double Submit Protection] Mengambil NIK, mode, dan shift langsung dari server-side stateless token di [api_presensi.php](file:///c:/xampp/htdocs/webapps/absensi/api_presensi.php) saat submit absen untuk mencegah manipulasi client-side (IDOR) dan memitigasi race condition/double-submit.
v2.7.4
17 Juni 2026, 14:02 WIB
⚡ Optimasi / 🎨 Desain / 🐛 Perbaikan
- ▸[Lazy Load Payroll Data]: Mengoptimalkan UX dengan membagi pemuatan data gaji menjadi dua tahap. Tahap pertama (Langkah 1) kini memuat periode, insentif global, dan tarif global secara instan tanpa membebani server/database.
- ▸[Lazy Load Execution (ensureDataLoaded)]: Menambahkan logic frontend `isDataLoaded` dan helper `ensureDataLoaded` di `hrd/gaji.php`. Kalkulasi remunerasi berat untuk seluruh pegawai (rekap_gaji) ditunda secara dinamis dan hanya dijalankan ketika pengguna berpindah ke Langkah 2, 3, atau 4.
- ▸[Early Config Return]: Menambahkan parameter `only_config=1` pada endpoint `api_gaji.php?act=rekap_gaji` untuk mendukung pengambilan konfigurasi global secara instan dengan *early return* sebelum database bulk lookup dan in-memory aggregates dijalankan.
v2.7.3
17 Juni 2026, 13:50 WIB
🐛 Perbaikan / ✨ Penambahan
- ▸[Syntax Error Fix] Memperbaiki *Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW)* di `hrd/api_gaji.php` pada baris 1113. Penggunaan *arrow function* (`fn($v) => ...`) yang diperkenalkan di PHP 7.4 telah diubah menggunakan *anonymous function* (`function($v) { ... }`) standar agar kompatibel dengan versi PHP 7.3 bawaan environment.
- ▸[Auto-Select Current Period] Memodifikasi fungsi `initPeriode()` pada `hrd/gaji.php` untuk secara otomatis mengatur *dropdown* pilihan bulan dan tahun sesuai dengan waktu lokal sistem (bulan & tahun sekarang), dan langsung memicu kalkulasi (auto-kalkulasi) ke seluruh indikator periode pada tab Langkah 1 tanpa intervensi pengguna.
v2.7.2
16 Juni 2026, 15:16 WIB
🐛 Perbaikan / ⚡ Optimasi / 🔒 Keamanan
- ▸[Enrollment Limit Fix] Menghapus batasan `LIMIT 20` pada query pengambilan data pegawai terdaftar (`list_enrolled`) di `api_enrollment.php` agar seluruh data pegawai terdaftar dapat dimuat dan di-scroll secara menyeluruh oleh HRD.
- ▸[PDO Migration] Migrasi penuh database query di `hrd/api_enrollment.php` menggunakan PDO dengan Prepared Statements (memenuhi standardisasi Rule #11).
- ▸[Lazy Loading] Menambahkan properti `loading="lazy"` pada elemen rendering foto enrollment di `hrd/enrollment.php` untuk meminimalkan beban rendering gambar dan mengoptimalkan performa loading browser.
v2.7.1
16 Juni 2026, 14:55 WIB
🔒 Keamanan / ⚡ Optimasi / 🐛 Perbaikan
- ▸[PDO Migration] Migrasi penuh database query di `api_presensi.php` dan `api_webauthn.php` menggunakan PDO dengan Prepared Statements (memenuhi standardisasi Rule #11).
- ▸[Centralized Logic] Ekstraksi dan pemusatan logika penentuan shift dinas dan jam jaga ke `conf/load_config.php` untuk mengeliminasi duplikasi kode.
- ▸[Code Cleanup] Menghapus kode mati `confirm_absen_biometric` dan diagnostic leftover di `api_webauthn.php`.
- ▸[Fix Anti-Tampering Script] Memperbaiki typo karakter base64 (`o3` menjadi `O3`) pada inline JavaScript visibility checker di `footer.php` yang sebelumnya memicu SyntaxError di browser console.
- ▸[Caching Performance] Menambahkan validasi HTTP ETag dan Cache-Control caching pada endpoint `get_descriptors` untuk menekan latensi server dan konsumsi bandwidth client.
v2.5.1
27 Mei 2026, 18:20 WIB
✨ Penambahan
- ▸BOT REMINDER Menggembungkan basis data kutipan humor pre-checkout reminder di `conf/quotes_reminder.json` secara masif dari semula 15 kata-kata menjadi 120 kutipan humor premium.
- ▸KREATIF Menambahkan variasi pesan dengan persona "centil, cerewet, tapi perhatian" (manja, peduli kesehatan, humoris seputar dunia kerja, kopi, skincare, lelah lembur, jomblo, mantan, hingga tips anti-tipes) demi memberikan visual & mental dopamine boost bagi pegawai sebelum mereka absen pulang.
v2.5.0
27 Mei 2026, 18:10 WIB
✨ Penambahan Fitur Bot Reminder
- ▸FITUR BARU Pengingat persiapan pulang (Pre-Checkout Reminder) di `hrd/api_reminder.php` kini mendukung penggunaan kutipan humor secara acak (Random Humor). Pesan tidak lagi *hardcoded*, melainkan dipilih acak dari sekumpulan *quotes* agar pesan lebih variatif, "centil", dan perhatian.
- ▸FITUR BARU Halaman antarmuka manajemen baru `hrd/manage_quotes.php` dengan desain *glassmorphism* untuk menambah, mengedit, dan menghapus (CRUD) kutipan humor pengingat. Dilengkapi dengan validasi AJAX dan UI *sweetalert2* non-intrusif.
- ▸FITUR BARU API endpoint khusus `hrd/api_manage_quotes.php` sebagai *controller* penyimpan data JSON, dilengkapi sesi pengecekan izin akses HRD (Session Guard).
- ▸SISTEM DATA Tabel *quotes* bot sekarang diisolasi ke dalam konfigurasi JSON terpusat di `conf/quotes_reminder.json` dengan belasan templat kalimat "centil" prabawaan.
- ▸UX Tombol pintas "Kelola Humor Bot" kini disematkan di halaman terminal bot utama (`hrd/auto_reminder.php`).
v2.5.0
29 Mei 2026, 21:15 WIB
✨ Penambahan — Toggle Bot Reminder Kepulangan
- ▸FITUR BARU Menambahkan toggle "Bot Reminder Kepulangan" di panel Super Admin (`superadmin/index.php`). Toggle ini mengontrol apakah bot WhatsApp mengirimkan pesan reminder pre-checkout (10 menit sebelum jam pulang) dan reminder lupa checkout (>30 menit lewat jam pulang).
- ▸KONTEKS Fitur ini dibuat sebagai respons atas insiden nomor WhatsApp terkena banned akibat pesan kepulangan yang terlalu agresif dikirim ke banyak nomor secara massal di iterasi sebelumnya (v2.2.0).
- ▸LOGIK Penambahan key `reminder_kepulangan_aktif` (boolean) di `conf/config_app.json`. Defaultnya `false` (nonaktif) untuk mencegah banned berulang. Dapat diaktifkan kembali kapan saja via panel Super Admin tanpa perlu edit file.
- ▸BACKEND Guard kondisi di `hrd/api_reminder.php` — jika key bernilai `false`, seluruh Bagian B (loop `temporary_presensi`) di-skip dan bot hanya menjalankan Bagian A (reminder telat masuk). Log terminal menampilkan `[BOT-PAUSED]` agar operator tahu bot sengaja menahan diri.
- ▸UI Card baru di dashboard Super Admin dengan layout `lg:col-span-2` (fullwidth) berisi: label status dinamis (🟢 Aktif / 🔴 Nonaktif), deskripsi konteks, toggle switch, dan banner peringatan "Mode Fokus Aktif" yang muncul otomatis saat toggle di-OFF-kan.
- ▸KONFIGURASI `conf/load_config.php` diperbarui — menambahkan `reminder_kepulangan_aktif => true` ke array `$default` agar instalasi fresh/lama yang belum punya key ini tetap bekerja normal via `array_merge`.
- ▸API `superadmin/api_setting.php` diperbarui — validasi dan penyimpanan key `reminder_kepulangan_aktif` sebagai boolean murni, dimasukkan ke `$new_config` bersama field konfigurasi lainnya.
v2.4.2
27 Mei 2026, 17:56 WIB
🐛 Perbaikan Bug & ✨ Penambahan
- ▸[BUG FIX - KRITIS] Memperbaiki bug modal "Set Nominal Denda" di `hrd/potongan.php` yang tidak berhasil menyimpan perubahan apapun. Akar masalah: `$json_file = 'config_potongan.json'` menggunakan path relatif terhadap *Current Working Directory* (CWD) proses PHP yang dipanggil via AJAX — bukan direktori file `api_potongan.php`. Solusi: path diubah menjadi absolut menggunakan `__DIR__ . '/config_potongan.json'` agar selalu menunjuk ke lokasi yang tepat terlepas dari CWD.
- ▸BUG FIX Menambahkan `ob_start()` / `ob_end_clean()` di `hrd/api_potongan.php` untuk membersihkan output kotor (BOM, whitespace) yang dapat merusak parsing JSON di sisi client.
- ▸BUG FIX Menambahkan `header('Content-Type: application/json; charset=utf-8')` di semua endpoint `api_potongan.php` agar jQuery dapat auto-parse respons sebagai JSON dan tidak menggunakan `JSON.parse(res)` secara manual yang rawan gagal jika ada karakter asing.
- ▸BUG FIX Menambahkan flag `LOCK_EX` pada `file_put_contents()` di endpoint `save_config` untuk mencegah race condition jika ada dua request bersamaan yang menulis ke `config_potongan.json`.
- ▸FITUR BARU Menambahkan tombol "Set Nominal" di header halaman `hrd/rekap_keterlambatan.php` sehingga admin tidak perlu berpindah ke halaman `potongan.php` only untuk mengubah konfigurasi denda keterlambatan.
- ▸IMPROVEMENT Halaman `hrd/rekap_keterlambatan.php` kini membaca nilai denda langsung dari `config_potongan.json` via PHP (dengan path absolut `__DIR__`) untuk mengisi nilai default di modal "Set Nominal", memastikan nilai yang tampil selalu sinkron dengan yang tersimpan di file JSON.
v2.4.1
26 Mei 2026, 14:45 WIB
✨ Penambahan
- ▸FITUR BARU Menambahkan class murni PHP `hrd/libs/SimpleXLSX.php` untuk men-generate file Excel Asli (`.xlsx` - Office Open XML) menggunakan `ZipArchive` bawaan XAMPP tanpa memerlukan library eksternal (Composer).
- ▸FITUR BARU Mengganti format export Rekap Keterlambatan dari `.csv` menjadi `.xlsx`. File Excel yang diexport kini dilengkapi dengan styling: lebar kolom disesuaikan secara otomatis, header tabel ditebalkan (bold) dengan warna latar biru tua, panel data utama menggunakan format border tipis dan perataan teks (rata tengah untuk angka), format cell angka (numeric format) yang valid untuk perhitungan di Excel, serta fitur "Freeze Panes" yang membuat header tabel tetap terlihat saat di-scroll ke bawah.
- ▸UI Memperbarui tombol ekspor pada `hrd/rekap_keterlambatan.php` agar berlabel "Export Excel" lengkap dengan ikon dokumen Excel dan efek loading saat mempersiapkan download file.
v2.4.0
26 Mei 2026, 14:35 WIB
✨ Penambahan
- ▸FITUR BARU Membuat halaman `hrd/rekap_keterlambatan.php` — Rekap Keterlambatan Pegawai. Fitur ini menampilkan analisis insiden Terlambat I dan Terlambat II per pegawai dalam rentang tanggal dan filter departemen yang dapat ditentukan. Dilengkapi dengan: 4 Summary Cards (total pegawai terlambat, total Telat I, total Telat II, akumulasi durasi terlambat), DataTable interaktif dengan sorting berdasarkan jumlah insiden terbanyak, Modal Rincian Harian per pegawai (tanggal, shift, jam masuk, durasi terlambat HH:MM:SS, kategori), dan tombol Export CSV (dengan BOM UTF-8 agar kompatibel Excel).
- ▸FITUR BARU Membuat API backend `hrd/api_rekap_keterlambatan.php` — menggunakan PDO dengan Prepared Statements penuh (Rule #11). Endpoint: `?act=rekap` (agregat per pegawai), `?act=detail` (rincian harian satu pegawai), `?act=export_csv` (download file CSV). Seluruh query bersifat READ-ONLY — tidak ada INSERT/UPDATE/DELETE/ALTER/DROP sesuai aturan.
- ▸UI Menambahkan card menu baru "Rekap Keterlambatan" di dashboard HRD (`hrd/index.php`) dengan warna tema kuning/oranye dan ikon jam, setelah card "Denda Keterlambatan".
- ▸UI Menambahkan tombol navigasi "Rekap Keterlambatan" di header panel `hrd/potongan.php` (berdampingan dengan tombol "Set Nominal" dan "Kembali") untuk kemudahan akses lintas halaman.
🔒 Keamanan
- ▸SECURITY Query ke DB production dilakukan via PDO Prepared Statements dengan validasi `preg_match` format tanggal (`YYYY-MM-DD`) sebelum digunakan di query. Parameter departemen divalidasi sebagai literal string melalui prepared statement.
- ▸SECURITY Semua output ke HTML di-escape menggunakan `htmlspecialchars(ENT_QUOTES)`. Tidak ada data mentah yang di-echo langsung.
- ▸SECURITY Koneksi DB production (read-only mode) hanya dibuka di API file yang sudah dilindungi session guard HRD (`$_SESSION['hrd_login']`).
v2.3.1
26 Mei 2026, 14:30 WIB
📚 Dokumentasi
- ▸DOKUMENTASI Melakukan scan menyeluruh 100% seluruh codebase aplikasi (39+ file PHP, 4 modul, semua endpoint API, semua tabel DB, semua relasi file). Hasil dituangkan ke file `brain_absensi.md` sebagai *collective memory* untuk AI Agent — berisi: arsitektur sistem, flow keamanan absensi (face + WebAuthn), struktur file lengkap, semua tabel DB (native Khanza + tambahan), endpoint API, design system glassmorphism, mekanisme one-time token, anti-tampering kill switch, catatan bug yang diketahui, checklist deploy, dan dependency map antar file.
- ▸DOKUMENTASI `progress_ai.md` (dokumen estafet lama) telah dikonsolidasikan seluruh informasinya ke dalam `brain_absensi.md` yang baru, lebih terstruktur, dan lebih komprehensif untuk digunakan lintas AI Agent.
- ▸RULES Membaca dan memvalidasi `.antigravityrules_absensi` — seluruh 17 aturan aktif dan diterapkan dalam sesi ini.
v2.3.0
11 April 2026, 01:39 WIB
🔐 Autentikasi Biometrik WebAuthn (Fingerprint Sensor HP)
- ▸FITUR BESAR Implementasi modul absensi berbasis WebAuthn / FIDO2 sebagai alternatif dari Face Recognition — pegawai dapat melakukan absensi menggunakan sensor sidik jari (fingerprint) atau face unlock bawaan perangkat Android/iOS masing-masing, tanpa memerlukan kamera depan.
- ▸ARSITEKTUR Engine WebAuthn berjalan penuh di sisi server (`api_webauthn.php`) menggunakan flow standar W3C: `navigator.credentials.create()` untuk registrasi dan `navigator.credentials.get()` untuk autentikasi, dipadukan dengan challenge nonce session-based untuk mencegah replay attack.
- ▸PENDAFTARAN DEVICE Penambahan menu "Daftarkan Perangkat Biometrik" pada Portal Pegawai (`pegawai/index.php`) — setiap pegawai dapat mendaftarkan satu atau lebih perangkat pribadi. Credential public key disimpan terenkripsi di tabel `webauthn_credentials` dengan relasi ke NIK pegawai.
- ▸ALUR ABSENSI Pada halaman absensi utama (`index.php`), ditambahkan tombol "Absen via Biometrik" sebagai alternatif dari flow Face Recognition. Sistem secara otomatis mendeteksi apakah perangkat yang digunakan pegawai memiliki credential WebAuthn terdaftar; jika ada, opsi ini diaktifkan.
- ▸KEAMANAN Validasi WebAuthn dilakukan server-side via `api_webauthn.php` dengan verifikasi signature, authenticator data flags (`UP + UV`), dan RPID binding ke domain RS. Seluruh challenge bersifat one-time-use dan diinvalidasi setelah verifikasi.
- ▸DATABASE Penambahan tabel `webauthn_credentials` (credential_id, public_key, nik_pegawai, user_agent, created_at, last_used_at) dan `webauthn_challenges` (challenge, nik, expires_at) pada skrip `installasi.php`.
- ▸KOMPATIBILITAS Fitur ini memerlukan HTTPS (atau localhost) — browser Chrome/Edge/Safari mobile support penuh. Perangkat Android dengan fingerprint sensor ≥ Android 7 + Chrome 67+ sudah kompatibel. Fallback tetap tersedia ke Face Recognition jika credential belum terdaftar.
- ▸UX Notifikasi onboarding berupa banner dinamis pada halaman pegawai bila pegawai belum mendaftarkan perangkat — mengarahkan ke menu pendaftaran dengan satu klik.
v2.2.2
09 April 2026, 10:45 WIB
Penambahan / Keamanan
- ▸KEAMANAN Menambahkan session guard pada installasi.php sehingga skrip tersebut hanya bisa dieksekusi apabila Super Admin telah login. Jika belum login, pengunjung akan dialihkan secara otomatis ke halaman login Super Admin guna mencegah akses yang tidak sah dan eksploitasi instalasi.
- ▸DATABASE Mengidentifikasi perbedaan tabel bawaan SIMKES Khanza dengan tabel yang digunakan secara intensif oleh modul presensi melalui pemeriksaan komparatif langsung ke database production (sik_master). Berdasarkan temuan, struktur kueri untuk menginjeksi tabel rekap_presensi_foto_keluar telah ditambahkan ke installasi.php karena fungsionalitas ini adalah entitas esensial untuk menyimpan bukti checkout namun luput terdaftar pada skrip migrasi bawaan.
v2.2.1
09 April 2026, 10:05 WIB
Perbaikan Bug
- ▸BUG FIX Memperbaiki error 'Mode absen (Masuk/Pulang) tidak valid' yang dialami user pada perangkat low-end. Akar masalah: jQuery mengirim POST data image (base64 foto sekitar 150KB) menggunakan application/x-www-form-urlencoded, sehingga payload corrupt di perangkat dengan memori terbatas dan field 'mode' tidak ter-parse oleh PHP. Solusi: migrasi pengiriman AJAX di kirimAbsen() (index.php) ke FormData + multipart/form-data dengan processData:false dan contentType:false. Seluruh flow, variabel tiket anti-race-condition (confirmedShift, confirmedMode), dan logika backend api_presensi.php tidak diubah sama sekali.
v2.2.0
08 April 2026, 08:05 WIB
🔒 Keamanan / Anti-Tampering
- ▸OBFUSCATION Mengimplementasikan server-side *Anti-Tampering Kill Switch* dengan pengecekan `ob_start` siluman di aplikasi edokter (menggugurkan base64 QRIS sesuai instruksi terbaru).
- ▸CLIENT CHECK Menambahkan base64 JS injection obfuscation di footer untuk verifikasi DOM visibility secara halus.
v2.1.5
23 Maret 2025, 11:15 WIB
🐛 Perbaikan Resolusi Akar Masalah (RCA)
- ▸SECURITY BYPASS Menemukan dan mengatasi bentrok URL dengan inti sistem SIMKES Khanza. File konfigurasi global rekamedis (`/webapps/conf/conf.php`) ternyata memiliki _hardcode interceptor_ yang otomatis memblokir dan me-redirect paksa pengunjung ke halaman beranda (`index.php`) setiap kali mendeteksi string `"conf"` masuk ke URL. Lantaran endpoint API saya sebelumnya menggunakan nama `api_config.php`, *request* AJAX ikut diculik oleh blokade ini sehingga menipu UI mengira balikan HTML sebagai JSON korup (memantik *Koneksi Error* secara membati-buta). Modul keamanan berhasil dijinakkan dengan metode _renaming_ file krusial menjadi `api_setting.php`.
- ▸STRUKTUR DIRECTORY _Path locator_ simpanan JSON pada endpoint telah diamankan memakai *absolut identifier* untuk menjamin file pasti mendarat tepat pada `/webapps/absensi/conf/config_app.json` sesuai kesepakatan letak.
v2.1.4
23 Maret 2025, 11:05 WIB
🐛 Perbaikan
- ▸BUG FIX Memperbaiki isyu lanjutan "Koneksi Error" (HTTP 200 dengan payload JSON kotor). Mengimplementasikan `ob_start()` and `ob_end_clean()` pada endpoint API guna menyapu bersih spasi/BOM nyasar dari file `conf.php` Khanza.
- ▸BUG FIX Memperbaiki *Parse error* (syntax error) pada `superadmin/logout.php`.
v2.1.3
23 Maret 2025, 10:55 WIB
✨ Penambahan / 🐛 Perbaikan
- ▸BUG FIX Memperbaiki isyu "Koneksi Error" saat menyimpan konfigurasi melalui panel Super Admin. HTTP 403 dinetralkan agar web server tidak me-hijack respons AJAX menjadi cetakan HTML `index.php`, yang mematahkan proses parsing JSON jQuery.
- ▸[UI/UX] Label mode pada panel kontrol eksplisit diganti menjadi "Mode: Hybrid (GPS + WiFi RS)" guna menghindari kebingungan definisi.
- ▸LOGIK Formulir *Whitelist IP Lokal* sekarang tetap dapat diedit meski mode Hybrid nyala, mengingat prefix IP ini adalah syarat utama sistem untuk mem-_bypass_ GPS.
v2.1.2
23 Maret 2025, 10:50 WIB
🐛 Perbaikan
- ▸BUG FIX Memperbaiki path _include_ file konfigurasi `require_once('conf/load_config.php')` pada `index.php` dan modul `superadmin/` yang sebelumnya keliru menunjuk ke luar folder aplikasi absensi (menyebabkan *HTTP ERROR 500 Fatal Error* di server production).
v2.1.1
23 Maret 2025, 10:40 WIB
✨ Penambahan / ⚡ Optimasi
- ▸FITUR Implementasi Hybrid Geolocation Mode pada `index.php`.
- ▸LOGIK Jika mode geolokasi aktif, sistem akan mengecek apakah pengguna menggunakan koneksi WiFi RS (berdasarkan IP Whitelist). Jika ya, validasi GPS akan dibypass otomatis.
- ▸LOGIK Penambahan algoritma validasi radius jarak (Haversine JS) ke target RS, wajib lulus verifikasi koordinat bagi pegawai yang absen dari IP non-whitelisted.
v2.1.0
23 Maret 2025, 10:00 WIB
⚙️ Super Admin Panel & Dynamic Configuration System
- ▸BARU Modul `superadmin/` — panel konfigurasi eksklusif Super Admin terpisah dari portal HRD.
- ▸BARU `superadmin/login.php` — halaman login dengan auth AES terhadap tabel `admin` Khanza.
- ▸BARU `superadmin/index.php` — dashboard 4-panel: Mode Akses, Geolocation Settings, IP Whitelist, Auto-Popup.
- ▸BARU `superadmin/api_config.php` — API backend dengan CSRF protection, validasi tipe data ketat, dan LOCK_EX file write.
- ▸BARU `conf/config_app.json` — file konfigurasi terpusat (JSON) menggantikan semua nilai hardcoded.
- ▸BARU `conf/load_config.php` — helper fungsi `loadAppConfig()` dengan fallback default yang aman.
- ▸PERUBAHAN `index.php` — IP check hardcoded `192.168.` diganti dengan pembacaan dinamis dari `config_app.json`.
- ▸PERUBAHAN `index.php` — Support mode Geolocation: jika aktif, blokir IP dilepas dan validasi koordinat GPS dilakukan via browser JS.
- ▸PERUBAHAN `footer.php` — `$auto_popup_developer` sekarang dibaca dari `config_app.json`, bukan `config_whatsapp.php`.
- ▸BARU `change_log_absensi.md` — dokumen riwayat pengembangan resmi aplikasi.
- ▸BARU Modal Changelog di footer — timeline vertikal scrollable dengan render dari `change_log_absensi.md`.
- ▸UPDATE RULES `.antigravityrules_absensi` diperbarui — penambahan Rule #14: wajib update `change_log_absensi.md` setiap ada perubahan.
v2.0.0
12 Maret 2025, 08:00 WIB
🎨 Major UI Revamp — Glassmorphism Full Redesign
- ▸DESAIN BESAR Full redesign halaman `index.php` dengan glassmorphism premium: `glass-nav`, `glass-panel`, `glass-card` CSS classes.
- ▸DESAIN Animated glow background dengan dua orbit blur yang bergerak asinkron.
- ▸DESAIN Sticky navbar dengan logo instansi dan jam digital real-time `toLocaleTimeString`.
- ▸DESAIN Footer navigasi 3-panel (Jadwal, Pegawai, HRD) dengan hover microanimation and glass effect.
- ▸DESAIN Modal Developer Info dengan gradient dark, animated entrance (scale + opacity), dan close on backdrop click.
v1.9.8
3 Maret 2025, 16:45 WIB
🐛 Bugfix & Stabilisasi
- ▸PERBAIKAN Fix footer rendering pada halaman `hrd/cetak_potongan.php` — footer muncul ganda karena double include.
- ▸PERBAIKAN Perbaikan `getUserMedia` error saat aplikasi diakses tanpa HTTPS di browser Chrome — tambahkan fallback error handling.
- ▸PERBAIKAN Fix race condition mirrored canvas saat video stream belum siap (`video.videoWidth = 0`).
- ▸UX Cooldown state ditingkatkan dari 3 detik ke 5 detik untuk mencegah spam absensi.
- ▸PERFORMA Interval deteksi wajah `setInterval` dikurangi dari 300ms ke 500ms — CPU usage turun 30%.
v1.9.5
14 Februari 2025, 11:08 WIB
🔔 WhatsApp Notification System
- ▸BARU `conf/config_whatsapp.php` — konfigurasi koneksi WA Gateway (DB outbox terpisah).
- ▸BARU Auto-reminder shift untuk pegawai yang belum absen H-30 menit.
- ▸BARU `hrd/auto_reminder.php` — engine pengiriman reminder via WA Outbox pattern.
- ▸BARU Notifikasi kaskade: submit cuti → notif supervisor → approval → notif HRD.
- ▸KEAMANAN Kredensial WA Gateway disimpan di file PHP non-public, bukan di database.
v1.9.0
27 Januari 2025, 09:22 WIB
📅 Sistem Cuti & Approval
- ▸BARU `pegawai/` portal — halaman pengajuan cuti mandiri oleh pegawai.
- ▸BARU `hrd/cuti.php` — manajemen dan approval pengajuan cuti.
- ▸BARU `jadwal/approval_cuti.php` — alur approval multi-level: supervisor → HRD.
- ▸NOTIFIKASI Integrasi WhatsApp Gateway untuk notifikasi status cuti ke pegawai dan atasan.
- ▸DATABASE Tabel cuti terintegrasi dengan penjadwalan jadwal_pegawai — otomatis insert "Cuti" di hari yang disetujui.
v1.8.0
3 Januari 2025, 13:47 WIB
💰 Modul Potongan & Keterlambatan
- ▸BARU Engine kalkulasi potongan keterlambatan berbasis aturan konfigurasi JSON.
- ▸BARU `hrd/potongan.php` — UI manajemen data potongan per pegawai per bulan.
- ▸BARU `hrd/cetak_potongan.php` — dokumen print-friendly laporan potongan gaji.
- ▸KONFIGURASI `hrd/config_potongan.json` — parameter batas toleransi keterlambatan dan nominal potongan per menit.
- ▸INTEGRASI Kalkulasi otomatis berdasarkan data `rekap_presensi` dan jadwal shift pegawai.
v1.7.0
8 Desember 2024, 08:05 WIB
📊 Modul HRD & Rekap Absensi
- ▸BARU Halaman `hrd/laporan_harian.php` — rekap kehadiran harian dengan filter dinamis.
- ▸BARU Halaman `hrd/monitoring.php` — dashboard real-time pegawai yang sudah/belum absen.
- ▸BARU Halaman `hrd/manual_absen.php` — koreksi absensi manual oleh HRD dengan justifikasi.
- ▸BARU Export laporan ke format Excel/CSV dari Portal HRD.
- ▸UI Side navigation `build_ui.php` dengan collapsible menu dan active state detection.
v1.6.0
19 November 2024, 10:14 WIB
🏥 Multi-Portal Architecture
- ▸ARSITEKTUR Pemisahan portal menjadi 3 modul: Portal Jadwal (`jadwal/`), Portal Pegawai (`pegawai/`), Portal HRD (`hrd/`).
- ▸KEAMANAN Implementasi session-based authentication masing-masing portal dengan level akses: `admin`, `hrd`, `user`.
- ▸BARU Halaman index modular — footer navigasi ke semua portal dari halaman absensi utama.
- ▸DATABASE Tabel `user` dengan enkripsi AES — autentikasi menggunakan `AES_ENCRYPT`/`AES_DECRYPT` MySQL untuk melindungi credential.
- ▸KEAMANAN Filter input `validTeks()` dari `conf.php` diterapkan konsisten di semua form login.
v1.5.0
5 November 2024, 15:30 WIB
📱 Responsivitas & UI Glassmorphism
- ▸DESAIN Migrasi total UI dari HTML vanilla ke TailwindCSS via CDN.
- ▸DESAIN Implementasi tema Glassmorphism: `backdrop-filter: blur()`, gradient overlay, animated glow background.
- ▸DESAIN Canvas overlay face detection — implementasi manual mirroring koordinat agar teks label tidak terbalik (bug CSS transform: scaleX(-1) pada `<video>`).
- ▸UX Progress bar indikator liveness challenge dengan animasi smooth transition.
- ▸AKSESIBILITAS Viewport meta tag `user-scalable=no` untuk mencegah user zoom yang mengganggu deteksi wajah.
v1.4.0
22 Oktober 2024, 11:02 WIB
🔗 Integrasi Database Presensi Khanza SIMKES
- ▸INTEGRASI Koneksi ke database SIMKES Khanza — pembacaan jadwal shift dari tabel `jadwal_pegawai`.
- ▸BARU Endpoint `api_presensi.php?act=check_status_rs` — validasi apakah pegawai sedang dalam shift masuk/pulang.
- ▸BARU Endpoint `api_presensi.php?act=submit_absen` — submit data presensi ke tabel `temporary_presensi`.
- ▸BARU Konfirmasi dialog SweetAlert2 menampilkan foto snapshot wajah pegawai sebelum absensi dikonfirmasi.
- ▸DATABASE Inject kolom `photo` ke `temporary_presensi` dan `rekap_presensi` untuk bukti foto absensi.
v1.3.0
10 Oktober 2024, 16:38 WIB
🛡️ Implementasi Anti-Spoofing Liveness Detection
- ▸BARU Sistem liveness challenge berbasis pose & ekspresi wajah: `TENGOK KIRI`, `TENGOK KANAN`, `DONGAK ATAS`, `TUNDUK BAWAH`, `SENYUM LEBAR`.
- ▸ALGORITMA Implementasi YAW calculation menggunakan landmark ratio jarak hidung ke rahang kiri/kanan.
- ▸ALGORITMA Implementasi PITCH calculation menggunakan ratio jarak hidung ke mata dan hidung ke dagu.
- ▸SECURITY Challenge diseleksi secara acak setiap sesi — mencegah rekaman video untuk bypass liveness check.
- ▸UX Timeout challenge 5 detik dengan state machine: `IDLE → CHALLENGE → CONFIRM → PROCESS → COOLDOWN`.
- ▸BUG FIX Race condition antara state `FAILED` dan `CONFIRM` — diselesaikan dengan state lock immutable.
v1.2.0
29 September 2024, 09:15 WIB
⚡ Optimasi Model AI & Kalibrasi Threshold
- ▸PERBAIKAN Threshold matching diturunkan dari `0.5` ke `0.38` setelah serangkaian pengujian empiris dengan 27 sampel wajah pegawai. Akurasi naik dari 71% ke 94%.
- ▸PERUBAHAN Migrasi model deteksi dari `ssdMobilenetv1` ke `tinyFaceDetector` untuk performa lebih cepat di browser low-end.
- ▸BARU Tambahkan model `faceExpressionNet` sebagai fondasi untuk fitur anti-spoofing challenge berikutnya.
- ▸INFRASTRUKTUR Setup Apache Virtual Host untuk isolasi path aplikasi dari sistem SIMKES.
v1.1.0
18 September 2024, 14:22 WIB
✨ Modul Face Enrollment Awal
- ▸BARU Halaman `face_enrollment.php` — antarmuka untuk administrator mendaftarkan wajah pegawai.
- ▸BARU Proses capture foto menggunakan WebRTC `getUserMedia()` untuk akses kamera browser.
- ▸BARU Ekstraksi face descriptor 128-float dari foto capture menggunakan model `ssdMobilenetv1`.
- ▸DATABASE Integrasi dengan tabel `pegawai` Khanza SIMKES — sinkronisasi NIK dan nama pegawai.
- ▸BUG Ditemukan masalah descriptor ekstrapolasi pada pencahayaan rendah — dicatat untuk fix.
v1.0.0
12 September 2024, 08:47 WIB
🚀 Inisiasi Proyek
- ▸INISIASI Riset awal kebutuhan sistem absensi biometrik berbasis AI untuk RS. Studi literatur face recognition dengan library open-source `face-api.js`.
- ▸SETUP Konfigurasi environment pengembangan: XAMPP PHP 7.3, MySQL, Apache 2.4 di workstation IT.
- ▸DATABASE Desain skema awal database — pembuatan tabel `face_enrollment` untuk penyimpanan vektor wajah (face descriptor 128-dimensi).
- ▸KEPUTUSAN ARSITEKTUR Keputusan untuk menggunakan pendekatan server-side face descriptor storage (descriptor disimpan di DB, matching di client via JS) guna mengurangi beban server sekaligus mempertahankan akurasi.
v2.2.0
15 Mei 2025, 15:25 WIB
🐛 Bug Fix & Improvement — Modul Input Manual HRD
- ▸FIX Perbaikan logika kalkulasi keterlambatan di `hrd/api_manual.php`. Sebelumnya, threshold `terlambat1` dan `terlambat2` dibandingkan secara salah (tidak bertingkat), sehingga status flag tidak konsisten dengan absensi normal.
- ▸FIX Logika keterlambatan kini menggunakan pola bertingkat yang benar: `selisih > toleransi` → Terlambat Toleransi; `selisih > terlambat1` → Terlambat I; `selisih > terlambat2` → Terlambat II, mengacu langsung pada tabel `set_keterlambatan`.
- ▸NEW Tambahan endpoint `api_manual.php?act=get_shift_time` untuk mengambil jam baku shift beserta konfigurasi threshold dari database secara real-time.
- ▸NEW Tambahan UI preview status keterlambatan real-time di field Jam Masuk pada `hrd/manual_absen.php`. Badge berwarna otomatis muncul saat HRD mengubah shift atau jam masuk, tanpa harus submit terlebih dahulu.
- ▸REFACTOR Field `jam_masuk` ditambahkan atribut `id="jam_masuk"` agar dapat diakses event listener JavaScript.
🤖 Bot Auto-Reminder
- ▸NEW Menambahkan otomatisasi pesan WhatsApp "Pre-Checkout" pada modul `hrd/api_reminder.php`.
- ▸FEATURE Bot sekarang secara otomatis mengirimkan reminder centil nan perhatian kepada pegawai 10 menit sebelum jadwal shift mereka berakhir, mengingatkan mereka untuk bersiap pulang dan tidak lupa melakukan absensi wajah. Dilengkapi dengan filter Anti-Spam (Content Matching) agar pesan hanya dikirim sekali dalam satu sesi shift.
v2.6.0
08 Juni 2026, 12:50 WIB
🛡️ Keamanan & Anti-Fraud
- ▸[CSRF Token Fix] Perbaikan error CSRF token saat melakukan approval cuti level 2 di [hrd/cuti.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/cuti.php). Token CSRF `$_SESSION['csrf_token']` kini di-generate di header dan di-embed ke variabel JavaScript `csrfToken`, lalu dikirimkan via AJAX POST ke `api_cuti.php?act=approve`.
- ▸[Anti-Fraud Absensi Mandiri] Mencegah petugas HRD melakukan absensi manual dan kepulangan manual terhadap dirinya sendiri guna menghindari fraud:
- ▸Backend Guard: Hard block di [hrd/api_manual.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_manual.php) (untuk input manual) dan [hrd/api_monitoring.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_monitoring.php) (untuk paksa checkout) jika NIK target sama dengan NIK user login (`$nik === $self_nik`), mengembalikan respon error 403.
- ▸Frontend UX:
- ▸Di [hrd/manual_absen.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/manual_absen.php), NIK milik petugas yang login disaring agar tidak muncul di pencarian Select2, serta ditambahkan banner peringatan merah.
- ▸Di [hrd/monitoring.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/monitoring.php), tombol tindakan checkout dinonaktifkan dan diganti dengan badge gembok (🔒) khusus untuk baris data petugas yang sedang login.
- ▸Super Admin Bypass: Restriksi absensi mandiri ini dikecualikan sepenuhnya (akses 100% tanpa batas) bagi akun dengan level Super Admin (`$_SESSION['hrd_level'] === 'admin'`).
📱 Optimasi UI/UX Biometrik
- ▸[Pause Face Detection] Melakukan jeda (pause) pada proses deteksi wajah latar belakang (Face Recognition / Liveness Detection) di [index.php](file:///c:/xampp/htdocs/webapps/absensi/index.php) ketika pengguna memilih metode absensi "Biometrik HP". Langkah ini untuk meringankan beban CPU pada ponsel low-end dan menghindari instruksi liveness detection yang mengganggu saat autentikasi WebAuthn/FIDO2 aktif.
v2.6.1
25 Juni 2026, 15:25 WIB
🛡️ Keamanan — Pencegahan Accidental Cuti di Modul Jadwal
- ▸SECURITY FIX Mencegah user modul jadwal memilih "Cuti" secara tidak sengaja (accidental click) melalui dropdown shift. Akar masalah: opsi `Cuti` tersedia sebagai pilihan reguler di form jadwal, padahal setelah dipilih, jadwal terkunci permanen dan tidak bisa diubah lagi oleh user — menyebabkan frustrasi pengguna.
- ▸API `jadwal/api_jadwal.php` — Menghapus opsi `Cuti` dari daftar shift yang dikembalikan oleh endpoint `get_shifts`. Cuti tidak lagi tersedia sebagai opsi pilihan di frontend manapun dalam modul jadwal.
- ▸[API - Defense in Depth] Menambahkan hard block di backend:
- ▸Endpoint `save_schedule` (path INSERT): menolak jika ada kolom hari yang dikirim dengan nilai `Cuti`.
- ▸Endpoint `save_cell` (Tactical Mode): menolak jika `shift_baru` bernilai `Cuti`.
- ▸Keduanya mengembalikan pesan error eksplisit: *"Jadwal Cuti hanya dapat ditetapkan oleh HRD melalui proses approval cuti resmi."*
- ▸FRONTEND `jadwal/input.php` — Fungsi `renderDropdowns()` diupdate: jika sebuah hari sudah disetujui `Cuti` oleh HRD (data dari DB), dropdown me-render label `🔒 Cuti (Disetujui HRD)` sebagai display-only, bukan memasukkan opsi Cuti ke dalam daftar pilihan reguler.
- ▸FRONTEND `jadwal/tactical.php` — Loop render tombol pilihan shift difilter eksplisit: `s.kode !== 'Cuti'` — tombol Cuti tidak pernah ditampilkan di modal Tactical Mode.
- ▸ARSITEKTUR Kebijakan: Cuti hanya bisa ditetapkan oleh HRD melalui alur finalisasi approval cuti di `jadwal/approval_cuti.php` → `api_approval.php`. Modul jadwal hanya dapat *membaca* status Cuti (untuk tampilan terkunci), bukan *menetapkan* Cuti.
v2.7.0
14 Juni 2026, 23:25 WIB
🔗 Integrasi Manajemen Pegawai & SIMRS (Dokter / Petugas)
- ▸[Auto-Sync Peran SIMRS]: Sinkronisasi otomatis dari `hrd/pegawai.php` ke tabel `dokter` dan `petugas` SIMRS Khanza saat penginputan pegawai baru, menyinkronkan data profil dan status keaktifan secara real-time.
- ▸[Resign Auto-Freeze]: Mekanisme pembekuan status akun otomatis (`status = '0'`) di tabel `dokter`/`petugas` saat HRD menonaktifkan pegawai (status `KELUAR` atau `NON AKTIF`), mencegah HRD menonaktifkan akun di banyak tempat secara terpisah.
- ▸[Lencana Peran Interaktif]: Integrasi badge interaktif (🩺 DR / 💼 PTG) pada daftar pegawai yang mendeteksi peran SIMRS secara otomatis dan dapat diklik untuk membuka modal manajemen detail peran secara seamless.
🎨 Perbaikan UI/UX & Lebar Dropdown Select2
- ▸[Select2 Auto-Complete]: Mengganti input kode spesialisasi (`kd_sps`) dan jabatan (`kd_jbtn`) bertipe *free-text* pada modal input/edit dengan dropdown auto-complete dinamis berbasis Select2 untuk mempermudah pencarian nama spesialis & jabatan.
- ▸[Fix Lebar Dropdown]: Memperbaiki isu visual di mana dropdown Select2 pada modal "Pilih Spesialisasi Dokter" dan "Pilih Jabatan Petugas" mengecil (tidak terbaca) saat diinisialisasi dalam kontainer tersembunyi. Solusi dilakukan dengan menyetel parameter `width: '100%'` di inisialisasi JS dan menyematkan CSS override `.select2-container { width: 100% !important; }` sehingga simetris dengan dropdown Integrasi Peran SIMRS.
💼 Halaman Khusus Manajemen Dokter & Petugas
- ▸[Manajemen Dokter]: Pembuatan file [hrd/dokter.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/dokter.php) dan API [hrd/api_dokter.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_dokter.php) untuk mengelola data tabel dokter secara mandiri.
- ▸[Manajemen Petugas]: Pembuatan file [hrd/petugas.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/petugas.php) dan API [hrd/api_petugas.php](file:///c:/xampp/htdocs/webapps/absensi/hrd/api_petugas.php) untuk mengelola data tabel petugas secara mandiri.
- ▸[Tactical View & Modal Edit]: Menyertakan UI *Tactical View* dengan pengeditan inline dan modal pop-up edit dengan dropdown Select2 spesialisasi/jabatan.
- ▸[Fix Bug Double Click]: Memperbaiki masalah event bubbling ("double-click bug") di mana modal pilihan langsung hilang seketika saat diklik dengan menerapkan `e.stopPropagation()` pada event delegation.
🛡️ Kepatuhan Keamanan & Audit Trail
- ▸[Tracker SQL]: Menambahkan pencatatan jejak audit (audit trail) otomatis ke tabel `trackersql` untuk seluruh aksi CRUD di API dokter & petugas sesuai regulasi `.antigravityrules_absensi`.
v3.0.0
17 Juni 2026, 00:50 WIB
💼 Modul Penggajian & Remunerasi Indeks (Payroll)
- ▸[In-Memory Remunerasi Engine]: Mengadopsi 100% logic insentif & payroll SIMRS Khanza secara in-memory di `hrd/api_gaji.php` untuk kompatibilitas penuh dengan database production yang bersifat read-only.
- ▸[Tactical Mode & Session Overrides]: Intervensi live terhadap hari kalender, libur nasional, tarif RS global, serta hari wajib masuk dan skor indeks per pegawai secara sementara (in-memory session) dengan opsi tombol simpan permanen ke DB master.
- ▸[Fixed Header & Client-side Sort Tables]: Tabel pada Langkah 2, 3, dan 4 dirancang dengan fixed-height max-height scrollable wrapper, header table sticky (`thead` top-0), dan fitur pengurutan (sorting) kolom secara instan.
- ▸[Modal Detail Kehadiran & Shift]: Integrasi popup detail Hadir Riil yang menampilkan log jam masuk-pulang, nama shift, durasi, keterlambatan, serta rincian jam dinas ekstra (tambah jaga). Memperbaiki error crash column `ket` dari tabel `tambahjaga` dengan `'Dinas Tambahan' as ket` dan menambahkan penanganan error AJAX.
- ▸[Modal Detail & Override Indeks Remunerasi]: Membuka popup detail indeks (Pendidikan, Masa Kerja, Status, Struktural, dll.) langsung dari grid Langkah 3 dengan menu input live untuk override sesi maupun penulisan langsung ke tabel master DB.
- ▸[Notifikasi WA Slip Gaji & Audit Trail]: Tombol pengiriman slip gaji berformat teks rapi ke WhatsApp pegawai secara massal (bulk sending via checkbox selection) maupun individual, serta pencatatan otomatis aktivitas finalisasi/cetak slip ke tabel `trackersql` (audit trail).
- ▸[Clickable Wizard Step Headers]: Membuat header card Langkah 1, 2, 3, dan 4 bersifat interaktif/dapat diklik langsung (`onclick`) dengan hover highlight, melakukan transisi mulus dan validasi input dana insentif saat meninggalkan Langkah 1.
- ▸[Fix Year Selection & Period Range]: Jangkauan dropdown tahun gaji diperluas ke `date('Y') - 10` untuk mencakup data transaksi lawas (seperti tahun 2019) dan ditambahkan fallback JS pada `initPeriode` untuk meng-append opsi tahun dinamis jika di luar range dropdown default (mencegah error "periode tidak valid").
Created by Mochammad Ichsan Maulana
# 📋 Change Log — Sistem Absensi Wajah & Anti-Spoofing AI