Lewati ke isi

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

  1. Klik baris cuti yang PENDING
  2. Modal detail:
  3. Tampilkan info karyawan, tanggal, alasan, attachment (kalau ada)
  4. Tombol:
  5. Approve — set status DISETUJUI; sistem cek konflik (overlap pengajuan lain auto-resolved)
  6. 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.

  1. Klik "+ Tambah Cuti" (kanan atas)
  2. Form:
  3. Karyawan: picker by NIK/nama
  4. Tanggal Mulai + Tanggal Selesai
  5. Tipe Cuti (Tahunan / Sakit / Lainnya)
  6. Alasan
  7. 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_karyawan di tanggal tsb (dari periode aktif). Bila tidak, sistem tolak.
  • Approve = call ke Pipeline kalkulasi-realisasi untuk 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/lembur POST
  • Body: {karyawan_lembur_id, tanggal, jam_mulai, jam_selesai, tugas}

Catatan

  • Lembur DISETUJUI muncul di evaluasi_akumulasi_lembur saat 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)

  1. Klik "+ Tambah SPD" di /admin/perjalanan-dinas
  2. 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 - 2 dan 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.