Integrasi HRIS menghilangkan entri data manual, kesalahan, dan risiko kepatuhan dengan menghubungkan platform HR dengan penggajian, tunjangan, dan sistem bisnis lainnya. Untuk UKM Indonesia, penggajian adalah salah satu modul yang paling kritis secara operasional — kesalahan berarti karyawan tidak puas dan potensi pelanggaran hukum ketenagakerjaan. Saya telah melihat perusahaan Indonesia menghabiskan 3-5 hari per bulan untuk pemrosesan penggajian menggunakan kombinasi file Excel dan transfer bank manual.
Penggajian Indonesia memiliki komponen spesifik yang harus dimodelkan dengan benar: Gaji Pokok, Tunjangan Jabatan, Tunjangan Makan, Tunjangan Transport, Uang Lembur, THR (Tunjangan Hari Raya), dan berbagai potongan (BPJS Kesehatan, BPJS Ketenagakerjaan, PPh 21, potongan keterlambatan/absensi). Setiap komponen memiliki perlakuan pajak berbeda.
Modul penggajian kami membaca data kehadiran dari tiga sumber yang mungkin: mesin kehadiran biometrik (via API atau impor CSV), persetujuan timesheet di modul proyek, atau entri manual oleh HR. Rekaman kehadiran diagregasi per karyawan per bulan untuk menghitung: total hari kerja, keterlambatan, absensi tanpa izin, dan jam lembur (jam di luar 8 per hari atau 40 per minggu, dibayar 1,5x atau 2x per UU Ketenagakerjaan).
Indonesian Payroll Computation Flow (NestJS + PostgreSQL)
Inputs:
┌──────────────┐ ┌─────────────────┐ ┌────────────────┐
│ Attendance │ │ Employee Master │ │ Timesheet │
│ (biometric/ │ │ Gaji Pokok │ │ (project hrs) │
│ manual) │ │ Tunjangan │ │ │
└──────┬───────┘ └────────┬────────┘ └───────┬────────┘
└──────────────────┬┘ │
▼ │
┌──────────────────────────────────────────────────────┐
│ PayrollComputationService │
│ │
│ Gaji Pokok + Tunjangan Jabatan │
│ + Tunjangan Makan + Tunjangan Transport │
│ + Uang Lembur (1.5x or 2x per UU Ketenagakerjaan) │
│ − BPJS Kesehatan (1% karyawan) │
│ − BPJS JHT (2% karyawan) − BPJS JP (1% karyawan) │
│ − PPh 21 (anualisasi method, progressive tariff) │
│ − Potongan Keterlambatan / Absensi │
│ ═══════════════════════════════════════════════ │
│ = Gaji Bersih (Net Pay) │
└──────────────────────────┬───────────────────────────┘
│
┌──────────────┼───────────────┐
▼ ▼ ▼
PayslipPDF DisbursementFile JournalEntry
(Puppeteer) (BCA/Mandiri CSV) (debit Payroll
Expense)Dari pengalaman saya membangun sistem ERP di Commsult: selalu implementasikan simulasi payroll run sebelum payroll aktual. Biarkan manajer HR menjalankan komputasi penuh dan meninjau payslip sebelum pembayaran apa pun dipicu. Kami menyebut ini 'dry run' — menghasilkan semua payslip dengan status DRAFT dan laporan pengecualian. Dry run adalah fitur bernilai tertinggi tunggal dalam modul penggajian.
Perhitungan PPh 21 di Indonesia kompleks: menggunakan struktur tarif progresif (5%, 15%, 25%, 30%, 35%), memperhitungkan PTKP (ambang batas penghasilan tidak kena pajak berdasarkan status perkawinan dan tanggungan), dan berbeda untuk karyawan tetap. Sistem kami mengimplementasikan metode Anualisasi yang dipersyaratkan oleh regulasi pajak Indonesia: gaji bulanan dianualisasi, pajak dihitung atas jumlah tahunan, kemudian dibagi 12 untuk pemotongan bulanan.
Iuran BPJS Kesehatan dan BPJS Ketenagakerjaan wajib bagi semua karyawan. BPJS Kesehatan: 4% pemberi kerja + 1% karyawan dari gaji (dibatasi pada batas premi BPJS). BPJS Ketenagakerjaan: JHT 3,7% pemberi kerja + 2% karyawan, JKK 0,24-1,74% pemberi kerja tergantung kelas risiko usaha, JKM 0,3% pemberi kerja, JP 2% pemberi kerja + 1% karyawan. Persentase ini bersifat regulasi dan harus diperbarui setiap kali BPJS menerbitkan tarif baru.
// NestJS: PPh 21 Anualisasi (Annualization Method)
// Reference: PER-16/PJ/2016 (DJP)
function calculatePph21(employee: Employee, monthlyGross: number): number {
const ptkp = getPtkp(employee.maritalStatus, employee.dependents);
// K/0 = 54,000,000; K/1 = 58,500,000; K/2 = 63,000,000; K/3 = 67,500,000
// TK/0 = 54,000,000
const annualGross = monthlyGross * 12;
const annualPtkp = ptkp;
const annualPhkp = Math.max(0, annualGross - annualPtkp); // PKP
const annualTax = computeProgressiveTax(annualPhkp);
return Math.round(annualTax / 12); // monthly PPh 21
}
function computeProgressiveTax(pkp: number): number {
// Tarif Pasal 17 UU PPh (2023 update)
let tax = 0;
if (pkp > 500_000_000) tax += (pkp - 500_000_000) * 0.35;
if (pkp > 250_000_000) tax += (Math.min(pkp, 500_000_000) - 250_000_000) * 0.30;
if (pkp > 60_000_000) tax += (Math.min(pkp, 250_000_000) - 60_000_000) * 0.25;
if (pkp > 60_000_000) tax += (Math.min(pkp, 60_000_000) - 0) * 0.15; // 5% up to 60M
// Simplified — full implementation handles all brackets
return Math.round(tax);
}
// BPJS contribution rates (update when BPJS changes rates)
const BPJS_RATES = {
kesehatan: { employer: 0.04, employee: 0.01 },
jht: { employer: 0.037, employee: 0.02 },
jkk: { employer: 0.0024 }, // varies by risk class
jkm: { employer: 0.003 },
jp: { employer: 0.02, employee: 0.01 },
};Modul penggajian adalah NestJS service yang mengorkestrasikan: PayrollComputationService, TaxCalculationService (PPh 21 dan BPJS), PayslipGenerationService (membuat PDF payslip via Puppeteer), dan DisbursementService (menghasilkan file transfer bank dalam format transfer massal BCA atau Mandiri).
Ketika kesalahan penggajian ditemukan setelah pembayaran — rekaman kehadiran yang terlewat, tier gaji yang salah, batas BPJS yang tidak diperbarui — koreksi harus ditangani dengan hati-hati. Jangan pernah hapus payroll run yang sudah dibayar. Sebagai gantinya, buat payroll run penyesuaian yang hanya menyertakan karyawan yang terpengaruh dan posting jumlah koreksi. Kami juga memiliki klien yang mencoba mengurangi kelebihan pembayaran melalui potongan besar tunggal dari payslip berikutnya — ini melanggar UU Ketenagakerjaan yang membatasi potongan hingga 50% gaji bersih.
Setiap karyawan mendapatkan PDF payslip yang dihasilkan oleh Puppeteer dari template HTML. Template menampilkan: detail karyawan, komponen gaji, potongan, gaji bersih, dan kode QR yang mengarah ke payslip online untuk verifikasi keaslian. Payslip disimpan di Google Cloud Storage dengan signed URL khusus karyawan.
Karyawan Indonesia membutuhkan Bukti Potong PPh 21 setiap tahun untuk mengajukan SPT Tahunan. Sistem kami menghasilkan dokumen Bukti Potong untuk semua karyawan di akhir tahun: total penghasilan bruto, total PPh 21 yang dipotong, NPWP pemberi kerja dan karyawan. Ini diekspor dalam format XML yang diperlukan oleh e-SPT, aplikasi pengarsipan DJP. Fitur ini saja menghemat 2-3 hari kerja tim HR setiap tahun.