5. Pengajuan & Workflow¶
Bab ini menjelaskan cara HR mengelola pengajuan karyawan: cuti, ijin, tukar shift, lembur, perjalanan dinas. Setiap jenis pengajuan punya 2 sisi:
- HR (admin) — lihat semua, approve/reject, atau bikin proxy on behalf of karyawan
- Karyawan (self-service) — submit sendiri lewat menu /me/...
Bab ini fokus ke sisi HR. Sisi karyawan dibahas singkat di tiap section.
Konsep Workflow¶
Status pengajuan standar:
| Status | Arti |
|---|---|
PENDING / MENUNGGU APPROVAL |
Diajukan, belum di-review HR |
DISETUJUI |
HR approve, masuk realisasi |
DITOLAK |
HR reject |
DIBATALKAN |
Karyawan cancel sendiri (saat status PENDING saja) |
Resolver konflik: bila pengajuan overlap (cuti × ijin × dinas × tukar shift di tanggal sama), sistem auto-cancel pengajuan lain dengan precedence: - SPD (Perjalanan Dinas) > IZ/AZ (Ijin) > CT (Cuti)
Mis. saat HR approve Ijin di tanggal X, Cuti existing di tanggal X auto-DIBATALKAN dengan catatan "auto-cancel by konflik".
5.1 Cuti¶
Akses HR: sidebar Pengajuan → Cuti.
Tampilan halaman¶
Tabel pengajuan cuti dengan kolom: - Karyawan (NIK + nama) - Tanggal Mulai - Selesai (range) - Jumlah Hari - Alasan - Status (badge berwarna) - Aksi
Toolbar filter (sama pola untuk Cuti, Ijin, Lembur, Tukar Shift):
- Pill status di baris atas —
PENDING/DISETUJUI/DITOLAK/DIBATALKAN/ALL, dengan counter angka di samping label - Search karyawan (NIK atau nama) — text input "Cari NIK atau nama karyawan…". Debounce 300 ms → auto-apply (tidak butuh tombol). Cocok untuk approval cepat per karyawan
- Rentang tanggal — dua field tanggal (mulai s/d akhir) + tombol Terapkan. Wajib klik Terapkan supaya tidak hit API tiap ketikan
- Reset muncul kalau ada filter aktif → clear semua filter sekaligus
- Counter di pill status ikut filter aktif — total per status konsisten dengan list di bawahnya
- Page reset ke halaman 1 setiap kali filter berubah
Khusus Tukar Shift, search NIK/nama match karyawan pengaju ATAU penerima — penting untuk rotasi segitiga (1 karyawan muncul di beberapa transaksi).
HR Approve / Reject Cuti¶
- Klik baris cuti yang
PENDING - Modal detail:
- Tampilkan info karyawan, tanggal, alasan, attachment (kalau ada)
- Tombol:
- Approve — set status DISETUJUI; sistem cek konflik (overlap pengajuan lain auto-resolved)
- Reject — set status DITOLAK; isi catatan rejection (opsional)
HR Proxy Create (Buat cuti on behalf of karyawan)¶
Untuk kasus: karyawan tidak bisa akses sistem, HR yang input.
- Klik "+ Tambah Cuti" (kanan atas)
- Form:
- Karyawan: picker by NIK/nama
- Tanggal Mulai + Tanggal Selesai
- Tipe Cuti (Tahunan / Sakit / Lainnya)
- Alasan
- Simpan — status auto =
DISETUJUI(HR proxy = auto approve)
Karyawan Self-Service¶
Karyawan pakai menu /me/cuti untuk:
- List cuti sendiri + filter status
- Submit cuti baru → status PENDING → HR review
- Cancel cuti sendiri (PENDING saja)
5.2 Ijin¶
Akses HR: Pengajuan → Ijin.
Bedanya dengan Cuti¶
- Cuti = absen dengan saldo cuti, tipe formal (tahunan/sakit/melahirkan)
- Ijin = absen tanpa saldo, tipe informal (keperluan keluarga, urusan pribadi singkat)
- Status efektif di realisasi:
IZ(ijin)
Workflow¶
Sama dengan Cuti: HR approve/reject, atau proxy create.
Catatan¶
- Ijin tidak punya field "tipe" — generic
- Approve Ijin akan auto-cancel Cuti yang overlap di tanggal sama (per resolver)
Karyawan Self-Service¶
/me/ijin — submit, list, cancel.
5.3 Tukar Shift (Pertukaran Shift)¶
Akses HR: Pengajuan → Tukar Shift.
Konsep¶
Karyawan A (pengaju) minta tukar shift dengan Karyawan B (penerima) di tanggal tertentu. Saat approved:
- jadwal_harian_karyawan Karyawan A pakai shift Karyawan B
- jadwal_harian_karyawan Karyawan B pakai shift Karyawan A
- Swap di realisasi
Workflow karyawan-driven (dengan HR override)¶
Flow normal:
1. Karyawan A ajukan via /me/tukar-shift: pilih Karyawan B + tanggal + alasan
2. Karyawan B terima notifikasi. Buka /me/tukar-shift/:id → klik Accept atau Reject
3. Bila B accept → status DISETUJUI, swap otomatis
4. Bila B reject → status DITOLAK
HR bisa override alur:
- HR Proxy Create: HR ajukan tukar on behalf of A (mis. via /admin/pertukaran-shift)
- HR Approve langsung tanpa nunggu B (untuk kasus emergency)
HR view¶
Tabel di /admin/pertukaran-shift tampilkan semua pengajuan tenant. HR bisa:
- Approve langsung (override workflow)
- Reject
- Lihat detail kedua karyawan + WaktuKerja inline
Catatan teknis¶
- Karyawan harus punya
jadwal_harian_karyawandi tanggal tsb (dari periode aktif). Bila tidak, sistem tolak. - Approve = call ke Pipeline
kalkulasi-realisasiuntuk tanggal terkait (re-compute)
5.4 Lembur¶
Akses HR: Pengajuan → Lembur.
Konsep¶
Karyawan ajukan lembur sendiri (sebelumnya HR-driven via "perintah lembur" — sekarang flow lebih natural). HR review & approve.
Status di DB tetap pakai enum DIPERINTAHKAN (legacy), tapi label di UI = "Menunggu Approval".
Workflow¶
Karyawan-driven:
1. Karyawan submit via /me/lembur: tanggal + jam mulai-selesai + tugas + catatan
2. Slot 1/2 auto-pick: sistem cek kapasitas slot lembur per tanggal (max 2 slot per karyawan). Bila penuh → tolak 409
3. Status DIPERINTAHKAN (= "Menunggu Approval")
4. HR review di /admin/lembur:
- Approve: status → DISETUJUI, disetujui_pada di-set, karyawan_pemberi_perintah_id di-update jadi HR (audit "Diapprove oleh")
- Reject: status → DITOLAK + catatan
Karyawan cancel sendiri (status DIPERINTAHKAN saja).
HR Proxy Create¶
- HR ajukan on behalf of karyawan via
/admin/lemburPOST - Body:
{karyawan_lembur_id, tanggal, jam_mulai, jam_selesai, tugas}
Catatan¶
- Lembur DISETUJUI muncul di
evaluasi_akumulasi_lembursaat tutup bulan → konstanta[LMB]di formula gaji - Total lembur per karyawan periode ini bisa dilihat di Proses Gaji → Data Waktu Kerja → tab Jumlah Lembur
5.5 Perjalanan Dinas (SPD)¶
Akses HR: Pengajuan → Perjalanan Dinas.
Konsep¶
SPD = Surat Perjalanan Dinas. HR bikin SPD untuk karyawan, sistem auto-generate benefit perjalanan dinas berdasarkan: - Komponen Perjalanan Dinas master (per nama × golongan) — lihat 04-master-pendukung.md - Golongan jabatan karyawan - Range tanggal SPD
HR-driven (HR yang bikin)¶
- Klik "+ Tambah SPD" di
/admin/perjalanan-dinas - Wizard 2 langkah:
Step 1 — Detail SPD: - Karyawan: picker by NIK/nama - Tanggal Mulai + Tanggal Selesai - Tujuan: nama kota/lokasi - Keperluan: deskripsi - Catatan: opsional
Step 2 — Benefit Auto-Generated:
- Sistem lookup komponen perjalanan dinas yang level_jabatan = golongan karyawan
- Tampilkan tabel benefit:
- Nama komponen (mis. "Uang Harian", "Tiket Pesawat")
- Anggaran Dasar (referensi default — boleh override)
- Pajak (%)
- Nominal Final (editable — default = anggaran × jumlah hari, kecuali tiket flat)
- HR review dan adjust nominal per row bila perlu
Submit: SPD + benefit di-snapshot. Master Komponen Perjalanan Dinas boleh diubah/hapus setelah ini tanpa break histori.
Auto-Approve¶
- SPD < 2 hari atau backdate → auto-approve saat create
- SPD ≥ 2 hari ke depan → status
PENDING - Bila
today >= tanggal_mulai - 2dan masih PENDING → auto-reject (lewat deadline)
Karyawan view¶
Karyawan tidak bisa ajukan SPD sendiri (HR-driven). /me/perjalanan-dinas hanya read SPD yang berlaku untuk dirinya.
5.6 Tabel ringkas Pengajuan¶
| Pengajuan | Pengaju | Approver | HR proxy | Auto-approve |
|---|---|---|---|---|
| Cuti | Karyawan | HR | ✓ | — |
| Ijin | Karyawan | HR | ✓ | — |
| Tukar Shift | Karyawan A | Karyawan B + HR override | ✓ | — |
| Lembur | Karyawan | HR | ✓ | — |
| Perjalanan Dinas | HR | (auto) | (HR-only) | < 2 hari atau backdate |
5.7 Badge live di sidebar¶
Sidebar HR menampilkan badge dengan jumlah PENDING untuk tiap menu pengajuan:
- Cuti (3) = 3 cuti pending review
- Ijin (1)
- Tukar Shift (2)
- Lembur (5)
Refresh otomatis saat load dashboard. Klik menu = tab list filter status=PENDING.
5.8 Tips¶
| Tips | Catatan |
|---|---|
| Refresh halaman setelah approve | Sistem auto-update tabel; refresh manual bila perlu |
| Cek konflik dulu sebelum approve | Resolver auto-cancel, tapi info ke karyawan terkait penting |
Approve Cuti per batch dengan filter status=PENDING + select all |
Belum ada bulk approve UI — TODO iterasi berikutnya |
| Lembur DISETUJUI → masuk evaluasi periode tsb | Pastikan disetujui SEBELUM tutup bulan |
Langkah berikutnya¶
→ 6. Pipeline Periode — kelola periode payroll: buat periode baru, generate jadwal harian, kalkulasi realisasi, tutup bulan.