Lampiran
Referensi & troubleshooting umum.
Konstanta (8 builtin)
Pakai syntax [KODE] di expression. Daftar konstanta yang tersedia (lookup juga di Master Data → Penggajian → tab Formula → toolbar Konstanta):
| Kategori |
Kode |
Tipe |
Sumber Data |
Penjelasan |
| Karyawan |
[GP] |
DECIMAL |
karyawan_payroll_setting.gaji_pokok |
Gaji pokok dari Setting Karyawan |
| Karyawan |
[JD_MONTH] |
INTEGER |
karyawan.tanggal_bergabung |
Bulan join (1-12) |
| Karyawan |
[JD_YEAR] |
INTEGER |
karyawan.tanggal_bergabung |
Tahun join (4 digit) |
| Waktu Kerja |
[WH] |
DECIMAL |
evaluasi_excess_working_hours.total_menit_excess ÷ 60 |
Excess working hours periode aktif (jam, signed: + lebih, − kurang) |
| Waktu Kerja |
[LMB] |
DECIMAL |
evaluasi_akumulasi_lembur.total_durasi_menit ÷ 60 |
Total lembur DISETUJUI periode aktif (jam) |
| Waktu Kerja |
[CD_MONTH] |
INTEGER |
periode.tanggal_mulai.month |
Bulan periode aktif (1-12) |
| Waktu Kerja |
[CD_YEAR] |
INTEGER |
periode.tanggal_mulai.year |
Tahun periode aktif |
| Lainnya |
[YOS] |
INTEGER |
computed |
Years of Service: tahun penuh dari tanggal_bergabung ke periode aktif (anniversary-aware) |
Operator
| Kategori |
Operator |
Penjelasan |
| Aritmatika |
+ - * / % |
Tambah, kurang, kali, bagi, modulo |
| Perbandingan |
== != < > <= >= |
Hasil 0 (false) / 1 (true) |
| Logika |
AND OR NOT |
Boolean operations (untuk kondisi IF) |
| Pengelompokan |
( ) |
Tanda kurung |
Fungsi
| Fungsi |
Signature |
Penjelasan |
IF(cond, a, b) |
3 arg |
Kembalikan a jika cond true, b jika false |
MIN(a, b, ...) |
≥ 1 arg |
Nilai terkecil dari semua argumen |
MAX(a, b, ...) |
≥ 1 arg |
Nilai terbesar |
ROUND(x, n) |
2 arg |
Pembulatan x ke n desimal |
MOD(a, b) |
2 arg |
Sisa pembagian a mod b |
ABS(x) |
1 arg |
Nilai absolut |
FLOOR(x) |
1 arg |
Pembulatan ke bawah (lantai) |
CEIL(x) |
1 arg |
Pembulatan ke atas (langit) |
Contoh Real
[GP] # Gaji pokok langsung
[GP] * [WH] * 8 / 173 # Kelebihan Hari Kerja (jam excess × hourly rate)
[GP] * [LMB] / 173 # Uang Lembur (jam lembur × hourly rate)
ROUND([GP] / 173, 2) # Tarif per jam pembulatan 2 desimal
IF([WH] > 0, [GP] * [WH] / 173, 0) # Bayar lembur kalau excess > 0
IF(MOD([YOS], 5) == 0 AND [YOS] > 0 AND [JD_MONTH] == [CD_MONTH], [GP] * 3, 0) # Cuti besar (anniversary 5 tahun + bulan match)
MIN(MAX([GP] * 0.05, 100000), 500000) # Bonus 5% dari GP, min 100rb max 500rb
Validasi & Error
Saat simpan formula:
- FORMULA_SYNTAX_ERROR — parser tolak karena tanda kurung tidak match, operator tidak dikenal, dll
- FORMULA_UNKNOWN_CONSTANT — [KODE] tidak terdaftar di registry. Cek typo (case-insensitive)
- FORMULA_UNKNOWN_FUNCTION — fungsi tidak ada (mis. SUM(...) — bukan fungsi yang didukung)
- FORMULA_RUNTIME_ERROR — error saat evaluasi (mis. division by zero, type mismatch)
Live validation badge muncul di builder saat Anda mengetik. ✓ Valid (hijau) atau ✗ Error (merah) dengan pesan parser.
Preview di Builder
Tombol Preview di Formula builder:
1. Pilih karyawan (search NIK/nama)
2. Pilih periode (default: aktif)
3. Klik Hitung
4. Tampilkan hasil + breakdown nilai konstanta:
Hasil: Rp 5.000.000
Breakdown Konstanta:
[GP] = 5000000
[WH] = 12.50
B. Glosarium Lengkap
Domain HR
| Istilah |
Arti |
| Tenant |
Organisasi/perusahaan yang menyewa aplikasi. Setiap tenant punya data terpisah. |
| Multi-tenant |
Arsitektur 1 instance app melayani banyak tenant. |
| Biodata |
Data identitas seseorang (KTP, alamat, keluarga, pendidikan). 1 biodata bisa jadi karyawan di banyak penempatan (mutasi). |
| Karyawan |
Penempatan biodata pada satu jabatan + kelompok kerja, dengan nomor induk + tanggal bergabung. |
| Jabatan |
Posisi/role di organisasi. Punya hierarki via parent_id dan level (golongan 1-20). |
| Golongan |
jabatan.level (1-20). Dipakai untuk lookup tarif (fasilitas progressif, komponen perjalanan dinas). |
| Tipe Penempatan |
INISIASI (karyawan baru) / PROMOSI / MUTASI / LAINNYA. |
| Status Kekaryawanan |
Status karyawan (TETAP, KONTRAK, MAGANG, dll) — per tenant, master di Miscellaneous. |
| PII |
Personally Identifiable Information. KTP, NPWP, nama ibu — disimpan terenkripsi. |
Domain Waktu Kerja
| Istilah |
Arti |
| Shift / Waktu Kerja |
Definisi 1 shift: jam masuk/pulang + window absensi (toleransi clock-in/clock-out). |
| Window absensi |
Rentang jam yang valid untuk clock-in (Earliest-Latest Clock-In) atau clock-out. |
| Cross midnight |
Shift yang lintas tengah malam (mis. 22:00-06:00 hari berikutnya). |
| Jadwal Kerja |
Pola mingguan: shift apa di Senin/Selasa/.../Minggu. |
| Day-slot |
1 dari 7 slot per minggu (Senin-Minggu). Bisa shift atau LIBUR. |
| Kelompok Kerja |
Grup karyawan yang dapat assignment jadwal yang sama. |
| Assignment |
Penugasan jadwal kerja ke kelompok kerja untuk rentang tanggal. |
| Hari Libur |
Tanggal libur tenant (HARI_BESAR / CUTI_BERSAMA). |
Domain Pipeline
| Istilah |
Arti |
| Periode |
Periode payroll satu bulanan (mis. "2026-04"). |
| Cut-off |
Deadline submit pengajuan setelah tanggal_selesai periode. |
| Pola Periode |
Template periode tenant: tanggal mulai-selesai + cut-off. Auto-generate kode. |
| Jadwal Harian Karyawan |
Materialisasi: 1 row per (karyawan × tanggal periode) → waktu_kerja_id. |
| Realisasi |
Hasil kalkulasi presensi harian per karyawan. |
| Status Efektif |
Hasil status realisasi: HADIR / IZ (ijin) / AZ (alpa) / CT (cuti) / DN (dinas) / LB (libur). |
| Tutup Bulan |
Snapshot evaluasi periode + bikin periode berikutnya. |
| Evaluasi |
4 tabel snapshot per periode: excess working hours, kelebihan hari kerja, selisih absensi, akumulasi lembur. |
| Excess Working Hours (WH) |
Selisih jam kerja: (jadwal_datang - clock_in) + (clock_out - jadwal_pulang). Signed. |
| Kelebihan Hari Kerja |
Selisih: hadir_seharusnya - hadir_aktual per karyawan. |
| Akumulasi Lembur |
Total durasi lembur DISETUJUI per karyawan periode. |
| Archive |
Pindah data periode tertua ke Elasticsearch (cold storage). |
Domain Penggajian
| Istilah |
Arti |
| Setting Karyawan |
Setup payroll per karyawan: gaji_pokok + status_kekaryawanan + bank rekening. |
| Komponen Gaji |
Baris yang muncul di slip gaji. Punya kategori (PENDAPATAN/POTONGAN/BENEFIT) + Model (FORMULA/FASILITAS/UPLOAD/PINJAMAN). |
| Model komponen |
Source nilai komponen — menentukan cara resolve nominal. |
| Value Reference |
Pointer polymorphic dari komponen ke entity sumber (formula.id / fasilitas_id / jenis_pinjaman.id). |
| Status Berhak (M:N) |
List status_kekaryawanan yang berhak dapat komponen tsb. |
| Perhitungan Pajak |
Kategori PPh 21 yang diterapkan saat kalkulasi pajak (8 enum). |
| Formula |
Definisi rumus DSL reusable. Direferensi komponen model=FORMULA. |
| Konstanta Formula |
Variabel [KODE] yang resolve ke data karyawan/periode/evaluasi runtime. |
| Fasilitas Progressif |
Tunjangan dengan tarif berbeda per golongan jabatan. |
| Tarif (fasilitas) |
Nominal per golongan + satuan periode (HARIAN/BULANAN). |
| Jenis Pinjaman |
Master tipe pinjaman (Kasbon, Koperasi, Bank, dll). |
| Pinjaman Karyawan |
Transaksi pinjaman per karyawan + angsuran flat per bulan. |
Domain Proses Gaji
| Istilah |
Arti |
| Periode Lewat Terakhir |
Periode dengan tanggal_selesai < today() paling baru — default fixed di sub-menu Proses Gaji. |
| Replicate Previous |
Pattern UI: copy data periode sebelum, replace data periode aktif. Idempotent. |
| Pengecualian |
Override final per (komponen × karyawan × periode). Bypass kalkulasi standar. |
| Idempotent |
Property: re-run = same result, tidak duplikat / accumulate. |
| All-or-nothing CSV |
Validasi upload: bila ada error, reject seluruhnya. Tidak partial-success. |
| Kalkulasi Idempotent |
Tombol Kalkulasi: full DELETE + re-INSERT untuk periode tsb. Predictable. |
C. Troubleshooting Umum
Pendaftaran & Login
| Masalah |
Solusi |
| Email verifikasi tidak masuk |
Cek folder spam. Klik "Kirim ulang verifikasi" di halaman status. |
| Lupa password |
Klik "Lupa password" di login (akan kirim email reset). |
| "Kode tenant sudah dipakai" |
Pilih kode lain. Kode unik global. |
| Captcha gagal terus |
Refresh, pastikan JavaScript & cookies aktif. |
Master Data
| Masalah |
Solusi |
| Tidak bisa hapus jabatan |
Ada child aktif atau dipakai karyawan aktif. Pindahkan dulu. |
| Tidak bisa hapus shift |
Dipakai jadwal_kerja aktif. Replace di jadwal dulu. |
| Kode duplikat saat tambah |
Kode unique per tenant — pilih kode lain. |
| Range golongan tidak boleh? |
Cek Profile Organisasi: range level (default 1-10) — sesuaikan bila perlu pakai golongan > 10. |
Pengajuan
| Masalah |
Solusi |
| Approve cuti tapi konflik dengan ijin |
Resolver auto-cancel cuti (per precedence). Cek log audit. |
| Tukar shift gagal: "tidak ada jadwal_harian" |
Karyawan B belum punya jadwal_harian di tanggal tsb. Generate jadwal periode dulu. |
| Lembur slot penuh |
Max 2 slot per karyawan per tanggal. Tunggu approve lembur lain dibatalkan. |
| SPD auto-reject |
today >= tanggal_mulai - 2. Submit SPD ≥ 2 hari sebelum tanggal mulai. |
Pipeline Periode
| Masalah |
Solusi |
| "Periode overlap" saat tambah |
Periode tidak boleh overlap dengan existing. Akhiri periode lama dulu. |
| Generate jadwal harian: rows_inserted = 0 |
Cek apakah karyawan punya kelompok_kerja_id + assignment aktif di periode tsb. |
| Kalkulasi realisasi menghasilkan banyak AZ (alpha) |
Cek presence_capture — mungkin data biometrik belum import; atau window absensi shift terlalu sempit. |
| Tutup bulan gagal |
Cek error message — biasanya pengajuan PENDING di periode yang harus di-resolve dulu. |
Proses Gaji
| Masalah |
Solusi |
Banyak karyawan dapat 0 di komponen FORMULA [GP] |
Setting Karyawan belum lengkap: gaji_pokok belum di-isi. Pakai script seed atau isi manual. |
| Komponen UPLOAD = 0 karyawan |
Belum upload CSV / replicate. Aksi di Proses Gaji → Data Upload. |
| Komponen PINJAMAN = 0 |
Tidak ada pinjaman_karyawan aktif yang overlap periode. Cek tab Data Pinjaman. |
| Komponen FASILITAS kurang karyawan |
Karyawan tidak punya jabatan.level valid; atau tarif tidak cover golongan tsb. |
| Status filter terlalu strict |
Buka Komponen Gaji → cek "Status Berhak" — pastikan cover semua status karyawan. |
| Kalkulasi error / lambat |
Cek backend log; untuk tenant besar (1000+ karyawan), kalkulasi bisa beberapa detik. |
| Kalkulasi tidak update setelah ubah Pengecualian |
Manual klik Kalkulasi lagi (idempotent re-run). |
Browser / UI
| Masalah |
Solusi |
| Halaman tidak load setelah login |
Hard refresh (Ctrl+Shift+R). Clear cache bila perlu. |
| Sidebar tidak expand/collapse |
Single-open accordion: hanya 1 section terbuka. Klik header lain untuk pindah. |
| Modal tidak bisa scroll |
Modal punya max-height calc viewport; bila konten besar, body sticky scroll. |
| Logout otomatis |
Token JWT expired (default 1 jam). Login ulang. |
D. Kontak Bantuan
Issue / fitur missing → laporkan ke admin sistem internal organisasi Anda.
Untuk dokumentasi teknis (developer), lihat folder /documentation/ di repository:
- api_endpoints.md — daftar 176 endpoint API
- penggajian.md — modul payroll detail
- proses_gaji.md — modul proses gaji detail
- pipeline.md — modul periode + realisasi
- waktu-kerja.md — modul jadwal & shift
E. Changelog Manual
| Versi |
Tanggal |
Perubahan |
| 1.0 |
2026-05 |
Manual awal, cover 7 bab utama (pendaftaran → kalkulasi). |