Oksa Satya.

11 Juli 2026 · 8 menit baca

Arsitektur Aplikasi HRIS & Payroll: Pelajaran dari Membangun Dexova

HRISPayrollGoArsitektur

Menghitung gaji terlihat seperti aritmetika: jam kerja dikali tarif, potong pajak, selesai. Sampai Anda benar-benar membangunnya. Artikel ini merangkum keputusan arsitektur terpenting saat saya membangun modul HRIS & Payroll di Dexova — dan kesalahan yang untungnya ketahuan lebih awal.

Kenapa payroll tidak boleh dihitung dari data hidup

Kesalahan pertama yang hampir semua sistem payroll amatir lakukan: menghitung gaji langsung dari tabel absensi yang masih bisa berubah. Karyawan mengajukan koreksi jam masuk, HR menyetujuinya — dan slip gaji yang sudah dibayar tiba-tiba tidak cocok dengan data.

Solusinya adalah periode yang dikunci. Di Dexova, rekap kehadiran bulanan mengunci data absensi sebagai snapshot; payroll run hanya boleh digenerate dari periode yang sudah terkunci. Koreksi setelah kunci masuk ke periode berikutnya sebagai penyesuaian — bukan mengubah sejarah.

Aturan regulasi sebagai konfigurasi, bukan if-else

Lembur di Indonesia diatur bertingkat (PP 35/2021): jam pertama dan jam berikutnya punya pengali berbeda, hari libur berbeda lagi. Menuliskannya sebagai rantai if-else berarti setiap perubahan regulasi atau kebijakan perusahaan adalah deploy baru.

Di Dexova, tarif lembur, pembagi tarif harian, strategi pembulatan, dan tipe minggu kerja adalah konfigurasi per perusahaan. Kode hanya tahu cara mengevaluasi aturan; nilai aturannya milik data. Efek sampingnya bagus: menguji perhitungan jadi soal menyiapkan konfigurasi + input absensi, lalu membandingkan output.

  • Tarif lembur bertingkat per jam ke-1 / berikutnya / hari libur — konfigurasi.
  • Cutoff vs payday dipisah; payday bergeser otomatis saat libur bank.
  • Komponen gaji dan tarif per karyawan (pro-rata karyawan baru) — data, bukan kode.
  • Penyesuaian satu-kali (bonus, THR, severance) hidup di run, bukan di komponen permanen.

Payroll run sebagai job async

Menghitung gaji ratusan karyawan bukan pekerjaan satu request HTTP. Payroll run di Dexova berjalan sebagai job async dengan progress monitoring: HR menekan satu tombol, melihat progresnya, dan mendapat hasil yang bisa diperiksa sebelum finalisasi.

Pola yang sama dipakai untuk bulk import karyawan dari Excel — pekerjaan berat apa pun yang menyentuh banyak baris tidak boleh memblokir UI, dan harus bisa dilacak statusnya.

Absensi: jaga validitas di sumbernya

Payroll hanya sebaik data absensinya. Karena itu validasi dilakukan di titik masuk: check-in lewat PWA dengan geofence (aplikasi mendeteksi kantor terdekat dan menolak absen di luar radius), WFH lewat model dua alamat yang ber-approval, dan koreksi kehadiran yang selalu melewati persetujuan — bukan edit bebas di database.

Membersihkan data kotor belakangan selalu lebih mahal daripada menolaknya sejak awal.

Ringkasan

Kalau harus diringkas satu kalimat: pisahkan aturan dari kode, kunci data sebelum menghitung, dan jadikan pekerjaan berat sebagai job yang terlacak. Tiga hal itu yang membuat payroll bisa diaudit — dan membuat tidur lebih nyenyak di tanggal gajian.

Sedang membangun sistem serupa?

Saya menerima proyek dan konsultasi teknis seputar sistem bisnis.