Lewati ke isi

8. Gaji Non Reguler

Bab ini menjelaskan run penggajian di luar siklus bulanan reguler: THR Idul Fitri, Bonus akhir tahun, Gaji XIII, Insentif kuartalan, dsb. Berbeda dengan Proses Gaji (Bab 7) yang dieksekusi tiap akhir periode, modul ini dipakai ad-hoc sesuai kebutuhan.

Konsep singkat

Setiap run gaji non reguler direpresentasikan oleh 1 Setup (header). Tiap Setup punya: - Jenis: THR / Bonus / Gaji XIII / Insentif / Lainnya - Nomor SK + Tanggal SK: referensi dokumen kebijakan - Periode Dasar: periode reguler yang dipakai sebagai sumber nominal komponen (mis. THR 2026 ambil komponen dari periode 2026-06) - Tanggal Proses: kapan run akan dieksekusi - Syarat eligibility (opsional): agama, status kekaryawanan, minimum lama kerja

Run kemudian diisi dengan Komponen Income (komponen apa saja yang ikut dihitung) + Override per Karyawan (penyesuaian nominal kalau berbeda dari snapshot periode dasar).

Prerequisite

Sebelum mulai, pastikan: - Periode Dasar sudah dikalkulasi (lihat 07-proses-gaji.md — sub-menu Kalkulasi). Tabel kalkulasi_komponen_karyawan di periode itu jadi sumber snapshot nominal default. - Komponen Gaji master sudah lengkap (lihat 04-master-pendukung.md) - Status Kekaryawanan sudah didefinisikan kalau mau dipakai sebagai syarat

Catatan: kalau periode dasar belum dikalkulasi, modal "Override Karyawan" akan menampilkan alert "Periode dasar belum dikalkulasi" — daftar karyawan kosong. Jalankan kalkulasi reguler dulu.

Akses: sidebar Gaji Non Reguler → 3 sub-menu.


Status Setup

Setiap Setup punya 1 dari 3 status (computed dari kondisi data):

Badge Definisi Bisa diapakan?
Baru Setup baru dibuat, belum ada override apapun Edit / Hapus tersedia
Proses Sudah ada override per-karyawan di salah satu komponen Read-only di Setup; lanjutkan di Komponen Income / Konfirmasi
Selesai Sudah Finalize (is_closed=true) — struktur dibekukan Read-only di semua menu; Reopen via halaman Konfirmasi detail

Transisi:

Baru ──[attach komponen + set override]──► Proses ──[Finalize]──► Selesai
                                              ▲                       │
                                              └──[Reopen]──────────────┘


8.1 Setup

Akses: Gaji Non Reguler → Setup.

Buat Setup baru

Klik Buat Setup Baru. Modal terbuka dengan field:

Field Wajib Catatan
Jenis dropdown THR / Bonus / Gaji XIII / Insentif / Lainnya
Nomor SK unik per tenant (mis. SK-THR-2026-001)
Tanggal SK tanggal dokumen SK
Tanggal Proses kapan run dieksekusi. Harus ≥ Tanggal SK
Periode Dasar dropdown periode tenant (sumber nominal komponen)
Deskripsi catatan internal HR
Syarat: filter agama centang untuk aktif; pilih satu atau lebih agama (chip multi-select)
Syarat: filter status kekaryawanan pilih status mana yang berhak (mis. TETAP saja)
Syarat: filter minimum lama kerja minimum bulan kerja agar eligible (0–600 bulan)

Catatan syarat: kalau toggle dimatikan, dimensi tsb tidak filter siapa-siapa (semua karyawan eligible default). Empty array [] ditolak — gunakan toggle off.

Tabel Setup

Kolom Isi
Jenis badge berwarna
Nomor SK nomor + deskripsi + timestamp dibuat
Tanggal SK tanggal dokumen
Tanggal Proses rencana eksekusi
Periode Dasar kode periode (mis. 2026-06)
Syarat chip kompak per dimensi (Agama / Status / Min. Kerja)
Status Baru (dengan dropdown → Edit / Hapus), Proses (read-only), Selesai (read-only)

Filter: dropdown jenis + search nomor SK.

Action — Hanya status "Baru"

Status Baru menampilkan tombol kebab () dengan dropdown: - Edit — buka modal edit dengan field yang sama - Hapus — soft-delete (konfirmasi modal)

Status Proses dan Selesai tidak ada aksi di kolom Status — manajemen lifecycle dilakukan via halaman Konfirmasi.


8.2 Komponen Income

Akses: Gaji Non Reguler → Komponen Income.

List

Tabel menampilkan setup yang belum closing (status Baru + Proses). Setup Selesai tidak muncul. Setiap row punya tombol Daftar Komponen → yang membuka halaman picker.

Halaman Daftar Komponen

Akses via tombol di list ATAU via URL /admin/gaji-non-reguler/komponen-income/:setupId.

Layout 2 kolom:

Kiri — Komponen Terpilih: - Grouping per kategori (Pendapatan / Potongan / Benefit) - Tiap kartu: kode + nama komponen + jumlah karyawan punya override eksplisit - Tombol Set Override → buka modal override per karyawan - Tombol Hapus → detach komponen dari run (cascade-hapus override terkait)

Kanan — Komponen Tersedia: - Filter kategori + search kode/nama - Tiap kartu: badge kategori + kode + nama + tombol + Tambah → attach ke run

Setup yang sudah closing menampilkan alert di atas + semua tombol aksi disabled.

Klik Set Override → modal lebar dengan tabel scrollable + paginasi (default 10/halaman; pilihan 10/25/50/100):

Kolom Isi
NIK nomor induk karyawan
Nama nama karyawan dari biodata
Snapshot (Rp) nominal default dari kalkulasi komponen di periode dasar
Nominal Override (Rp) input editable. Kosong = pakai snapshot. Isi = override
Aksi tombol Reset muncul kalau row dalam keadaan override (untuk balik ke snapshot)
  • Row yang dalam keadaan override di-highlight (background terracotta tipis)
  • Search NIK / nama (real-time, paginasi ikut filter)
  • Counter di header: total karyawan + jumlah override aktif

Save mengirim batch diff (hanya row yang berubah dari initial state): - Input diisi ≠ snapshot → INSERT/UPDATE override - Input dikosongkan ATAU = snapshot → DELETE override (kembali ke default)

Sumber daftar karyawan: tabel kalkulasi_komponen_karyawan di periode_dasar. Karyawan yang TIDAK punya snapshot tapi punya override eksplisit tetap tampil (HR bisa lihat & atur).


8.3 Konfirmasi

Akses: Gaji Non Reguler → Konfirmasi.

Halaman ini menampilkan proyeksi total per setup sebelum di-Finalize. Hitungan live dari komponen ter-attach × resolved per-karyawan (override OR snapshot).

List

Kolom Isi
Jenis badge
Status badge Baru / Proses / Selesai
Nomor SK nomor + tanggal SK
Tanggal Proses rencana eksekusi
Komp. jumlah komponen ter-attach
Karyawan jumlah karyawan terdampak (resolved)
Total Pendapatan sum nominal kategori PENDAPATAN
Total Potongan sum nominal kategori POTONGAN
Total Benefit sum nominal kategori BENEFIT
Aksi tombol Detail →

Filter: default hanya tampilkan setup belum closing (Baru + Proses). Centang "Sertakan setup Selesai" untuk include Selesai (berguna untuk akses Reopen).

Eligibility filter di proyeksi: total dihitung dari semua karyawan yang punya snapshot/override di komponen ter-attach. Syarat setup (agama / status_kekaryawanan / min_lama_kerja) tidak diterapkan di proyeksi — akan diterapkan saat eksekusi final (TODO).

Detail (2 tab)

Klik Detail → → halaman dengan badge Jenis + Nomor SK + Status di header, plus:

Tombol di header (tergantung status): - Status Proses → tombol Konfirmasi & Finalize → (primary). Set is_closed=true + snapshot riwayat transfer dibuat (bank, status kekaryawanan, totals di-freeze). Konfirmasi via modal. - Status Selesai → tombol Reopen. Set is_closed=false + snapshot riwayat transfer di-delete. Override per-karyawan tetap (tidak dihapus).

Apa itu snapshot saat Finalize? Saat HR menutup SK, sistem otomatis "memotret" bank rekening + status kekaryawanan + total nominal per karyawan ke tabel terpisah. Tujuannya: laporan Riwayat Transfer immutable — kalau karyawan ganti bank setelah SK ditutup, laporan tetap menampilkan bank lama (saat transfer aktual dilakukan), bukan bank baru. Ini penting untuk audit ledger transfer payroll.

Kalau HR Reopen, snapshot dihapus dan laporan kembali ke mode "live preview" (baca dari bank rekening current). Saat HR Finalize ulang, snapshot baru dibuat dengan data live saat itu.

Tab "Per Karyawan"

Card grand total (3 kartu): Total Pendapatan / Total Potongan / Total Benefit.

Tabel:

Kolom Isi
NIK nomor induk
Nama nama biodata
Pendapatan sum PENDAPATAN karyawan ini
Potongan sum POTONGAN karyawan ini
Benefit sum BENEFIT karyawan ini
Take Home Pendapatan − Potongan

Search NIK / nama. Paginasi 20/halaman (opsi 10/25/50/100).

Tab "Per Komponen"

Card subtotal: Pendapatan / Potongan / Benefit / Grand Total.

Tabel:

Kolom Isi
Kategori badge
Kode kode komponen
Nama Komponen nama
Karyawan jumlah karyawan terdampak
Override jumlah row override eksplisit (— kalau 0)
Total Nominal sum nominal komponen

Alur tipikal (THR Lebaran)

  1. Periode dasar siap: pastikan periode reguler bulan Mei (atau Juni) sudah di-Tutup Bulan + Kalkulasi dijalankan.
  2. Buat Setup:
  3. Jenis = THR
  4. Nomor SK = SK-THR-2026-001
  5. Tanggal SK = 2026-04-01
  6. Tanggal Proses = 2026-04-15
  7. Periode Dasar = 2026-05 (kalkulasi sudah ada)
  8. Syarat: lama kerja min 3 bulan (opsional)
  9. Komponen Income: klik Daftar Komponen →, attach komponen relevan (mis. Gaji Pokok untuk basis THR penuh; tidak attach potongan untuk skenario "bersih")
  10. Override Karyawan: klik Set Override kalau ada karyawan dengan nominal khusus (mis. karyawan baru < 1 tahun dapat pro-rata). Untuk mayoritas yang sama persis = snapshot, biarkan input kosong.
  11. Konfirmasi: cek halaman Konfirmasi. Klik Detail → untuk review per karyawan + per komponen. Pastikan grand total sesuai budget.
  12. Finalize: di Konfirmasi detail, klik Konfirmasi & Finalize →. Status berubah ke Selesai. Struktur dibekukan + snapshot riwayat transfer dibuat (bank/status/totals per karyawan, immutable).
  13. (Bila perlu) Reopen: di Konfirmasi list, centang Sertakan Selesai → klik Detail row Selesai → tombol Reopen. Snapshot dihapus; bisa edit ulang.
  14. Karyawan melihat hasil: setelah SK ditutup, karyawan otomatis bisa lihat di menu Penggajian → Gaji Non Reguler (/me/penggajian/non-reguler) dengan badge jenis berwarna (THR ochre, Bonus moss, dll). Klik Detail untuk breakdown komponen.

8.4 Karyawan view (read-only)

Karyawan punya akses sendiri ke list SK gaji non reguler yang ia terdaftar via menu sidebar Penggajian → Gaji Non Reguler (/me/penggajian/non-reguler).

Yang ditampilkan ke karyawan: - Hanya SK yang sudah Selesai (is_closed=true). SK Baru/Proses tidak muncul untuk menghindari nominal tentative disalahpahami sebagai final. - Tabel: Jenis (badge berwarna per kategori) | Nomor SK | Tanggal SK | Pendapatan | Potongan | THP - Klik Detail → modal dengan breakdown komponen + 4 stat cards (Pendapatan/Potongan/Benefit/THP)

Sumber data: tabel snapshot gaji_non_reguler_riwayat_transfer yang dibuat saat HR Finalize. Kalau HR Reopen → row snapshot dihapus → SK hilang dari view karyawan sampai di-Finalize ulang.

HR tidak bisa akses endpoint ini (HTTP 403) — /me/penggajian/non-reguler strict KARYAWAN-only.


Troubleshooting

"Periode dasar belum dikalkulasi" di modal Override Karyawan → Tabel kalkulasi_komponen_karyawan di periode dasar kosong untuk komponen tsb. Buka Proses Gaji → Kalkulasi untuk periode itu, jalankan Kalkulasi.

Setup di-Finalize tapi total nol → Cek bahwa komponen sudah ter-attach (Komponen Income) + periode dasar sudah dikalkulasi. Tanpa snapshot dan tanpa override = 0.

Hapus setup gagal: "Setup sudah closing" → Setup Selesai harus di-Reopen dulu sebelum dihapus. Buka halaman Konfirmasi → centang "Sertakan Selesai" → Detail → Reopen.

Edit komponen tertolak: 409 SETUP_CLOSED → Sama dengan di atas: Reopen dulu via Konfirmasi detail page.

Karyawan tidak muncul di modal Override padahal punya jabatan tertentu → Modal mengambil karyawan dari snapshot kalkulasi periode dasar. Kalau karyawan tidak punya baris di komponen tsb di periode dasar (mis. komponen baru ditambah setelah karyawan join), dia tidak akan muncul. Solusi: jalankan kalkulasi reguler periode dasar lagi setelah master karyawan/komponen di-update.

Karyawan ganti bank rekening setelah SK ditutup — bank di laporan berubah? → Tidak. Saat HR Finalize, bank di-snapshot ke tabel gaji_non_reguler_riwayat_transfer. Laporan Riwayat Transfer (HR + karyawan view) tetap menampilkan bank lama untuk audit integrity. Kalau HR butuh refresh ke bank baru (mis. SK belum disbursed dan rekening lama salah), HR harus Reopen → Finalize ulang.

SK Selesai tidak muncul di /me/penggajian/non-reguler karyawan → Cek apakah karyawan benar-benar terdaftar di SK tsb (punya komponen ter-resolve dengan nominal > 0 di periode dasar). Karyawan tanpa komponen apapun tidak masuk snapshot.