Cuti: Kuota Tahunan, Sakit, Izin
Manage kuota cuti tahunan karyawan sesuai UU Cipta Kerja: 12 hari default, carry-over policy, surat dokter wajib, advance notice, auto-deduct di-approve.
- 1
Apa itu Cuti Management
Plugin Cuti adalah extension dari HR Requests yang handle 4 jenis leave Indonesia:
- Cuti tahunan (
annual_leave), UU Cipta Kerja Pasal 79: 12 hari/tahun setelah bekerja 12 bulan. Banyak workspace kasih lebih (15-20 hari). - Cuti sakit (
sick_leave), UU 13/2003: tidak dibatasi kalau ada surat dokter, tapi gaji dibayar penuh max 4 bulan pertama, lalu turun gradual. - Izin (
permission_leave), keperluan pribadi non-sakit (urusan keluarga, pernikahan kerabat, dll). Default unpaid kalau lewat 3 hari/tahun. - Cuti melahirkan (
maternity_leave), UU Cipta Kerja: 3 bulan, full paid, tidak deduct quota tahunan.
Berbeda dengan lembur/reimburse, cuti deduct kuota otomatis saat approved. Sistem track per-tahun per-user dengan carry-over policy custom workspace.
Aktivasi: sama dengan plugin Absensi,
Pengaturan → Plugin → Absensi. Plugin Cuti otomatis aktif kalau Absensi aktif (shared backbone).- Quota dihitung working days saja, weekend + hari libur nasional otomatis skip
- Carry-over default OFF, sisa cuti hangus akhir tahun (admin bisa enable kalau policy lain)
- Cuti tahunan (
- 2
Setup leave config (workspace policy)
Admin workspace setup policy global di /absensi/admin → Cuti → Konfigurasi:
- Kuota tahunan default (
annualQuotaDefault), default 12 (UU). Senior/manager bisa di-override per-user di balance. - Kuota sakit default (
sickQuotaDefault), default 0 (unlimited dengan surat dokter). Set angka kalau workspace mau cap. - Carry-over enabled, toggle ON/OFF. Default OFF (sisa hangus akhir tahun).
- Carry-over max, kalau enabled, max berapa hari boleh carry (default 6).
- Carry-over expiry month, carry-over hangus bulan ke-N tahun depan (default 3 = hangus Maret 2027 untuk carry-over dari 2026).
- Wajib surat dokter setelah N hari sakit (
requireAttachmentAfterDays), default 2 hari. Sakit 1 hari gak perlu surat, 3+ hari wajib. - Advance notice (H-N), cuti tahunan + izin wajib ajukan H berapa hari (default H-3). Cuti sakit + maternity bypass karena emergency.
Click Simpan. Policy ini auto-applied ke semua karyawan workspace.
Update policy mid-year affect ke pengajuan baru saja, pengajuan pending/approved sebelumnya tidak retroaktif. - Kuota tahunan default (
- 3
Setup balance per-user (override kuota)
Default 12 hari kurang untuk senior? Atau intern cuma boleh 6 hari? Admin bisa override per-user:
/absensi/admin → Cuti → Balance → pilih tahun → klik user → Edit:
- Annual quota, set custom (mis. 18 untuk manager 5 tahun)
- Carry-over, input manual sisa dari tahun lalu (mis. 6 hari dari 2025)
- Carry-over expires at, datetime picker (default 31 Maret tahun depan)
- Notes, catatan admin (mis. "Senior dengan 5 tahun masa kerja, kuota +6 hari per company policy")
Atau secara massal: sistem otomatis tiap awal Januari bikin saldo cuti untuk semua user aktif dengan quota default. Yang custom di-override admin manual.
- Carry-over default 0, admin harus manual set kalau policy workspace allow carry
- Notes appear di audit log + balance detail, useful kalau ada dispute "kok kuota saya cuma 12?"
- 4
Cara staff cek sisa cuti
Staff buka /cuti → "Sisa Kuota Saya" atau /dashboard widget Cuti:
- Cuti tahunan: quota 12 - terpakai 5 + carry-over 6 = sisa 13 hari (kalau carry-over masih valid)
- Cuti sakit terpakai: 3 hari (tidak ada limit visual kalau quota default 0)
- Izin pribadi terpakai: 2 hari
- Maternity (kalau applicable): 0/90 hari
Display juga timeline approved leaves bulan ini + projected akhir tahun (kalau pakai semua sisa = cuti penuh dari tanggal X sampai Y).
Widget juga warning kalau:
- Sisa < 3 hari + tahun tinggal Q4 ("Pertimbangkan ambil sebelum hangus akhir tahun")
- Carry-over expire dalam 1 minggu ("Sisa carry-over 6 hari hangus dalam 5 hari")
- Refresh balance otomatis saat ada pengajuan baru di-approve / cancel
- 5
Cara ajukan cuti tahunan
Staff plan vacation Lebaran 5 hari:
/cuti → + Ajukan Cuti → Cuti Tahunan:
- Tim
- Dari tanggal (mis. 2026-04-01)
- Sampai tanggal (mis. 2026-04-08)
- System auto-hitung working days = 5 (skip weekend + Lebaran tanggal 3-7 di setting libur workspace)
- Alasan (text, mis. "Mudik Lebaran ke kampung halaman Bandung")
- Backup person (opsional, siapa yang handle tugasnya saat cuti)
Validasi auto sebelum submit:
- ✅ Working days 5 ≤ sisa kuota 13 → lolos
- ✅ H-30 dari tanggal mulai > advance notice H-3 → lolos
- ✅ Bukan range terlalu pendek (working days > 0) → lolos
Click Submit → pengajuan tercipta dengan status pending. Admin tim dapet notif.
Kalau validasi gagal:
- ❌ "Sisa kuota cuti tahunan 3 hari, tidak cukup untuk 5 hari"
- ❌ "Pengajuan cuti tahunan wajib H-3 dari tanggal mulai. Sisa 1 hari saja."
→ Adjust tanggal atau request admin add kuota custom.
Advance notice strict, emergency cuti tahunan gak bisa. Pakai sick_leave atau permission_leave kalau benar2 mendadak. - 6
Cara ajukan cuti sakit (+ surat dokter)
Staff demam 3 hari:
/cuti → + Ajukan Cuti → Sakit:
- Tim
- Dari tanggal
- Sampai tanggal
- Diagnosis singkat (opsional, privacy-respecting, "demam tinggi" cukup, gak perlu detail)
- Lampiran surat dokter, upload foto/PDF (auto-required kalau working days > 2 hari sesuai config)
Validasi:
- 1-2 hari sakit → submit boleh tanpa surat dokter
- 3+ hari sakit → wajib upload surat dokter sebagai lampiran
- Tanpa surat dokter saat required: "Cuti sakit > 2 hari wajib lampirkan surat dokter"
Kalau approved → kuota cuti sakit terpakai bertambah. Tidak deduct annual quota, sakit + tahunan terpisah secara akuntansi.
Sakit jangka panjang (kronis, opname > 1 minggu): admin bisa pakai admin balance edit untuk catat manual + attach dokumen medis sebagai bukti kompliance ke BPJS.
- Surat dokter ditolak kalau handwriting susah dibaca atau tidak resmi (kop dokter/RS). Admin tim review subjective.
- 7
Cara ajukan izin pribadi
Permission leave untuk keperluan non-sakit non-cuti tahunan:
- Pernikahan saudara
- Sakit anak (bukan staff sendiri)
- Urusan administrasi (KTP, paspor, dll)
- Family emergency
/cuti → + Ajukan Cuti → Izin Pribadi:
- Tim
- Dari & sampai tanggal
- Alasan (text, wajib, mis. "Anak sakit demam tinggi, perlu temani ke dokter pagi")
- Lampiran opsional
Berbeda dengan cuti tahunan:
- Default UNPAID kalau lewat 3 hari/tahun (per workspace policy)
- Tidak deduct annual quota, track terpisah di
permissionUsed - Advance notice tetap H-3 (kecuali emergency dengan note jelas)
- Admin tim bisa override jadi paid (audit log catat)
Indonesian UU 13/2003: ada ketentuan paid days untuk acara tertentu (pernikahan staff 3 hari, istri melahirkan 2 hari, keluarga inti meninggal 2 hari, khitan/baptis anak 2 hari). Set policy workspace sesuai UU + check note pengajuan. - 8
Cara ajukan cuti melahirkan
UU Cipta Kerja: cuti melahirkan 3 bulan (1.5 bulan sebelum + 1.5 bulan setelah persalinan), full paid, tidak deduct annual quota.
/cuti → + Ajukan Cuti → Cuti Melahirkan:
- Tim
- HPL (Hari Perkiraan Lahir), system auto-compute fromAt = HPL - 45 hari, toAt = HPL + 45 hari
- Atau manual range kalau case khusus (premature, dll)
- Lampiran: surat keterangan dokter kandungan / USG
Validasi:
- Lampiran wajib (medis sensitive, perlu bukti)
- Range > 60 hari → admin review extra (luar normal range, mungkin ada kompliasi)
Approved →
maternity_usedincrement (visible di balance), tidak deduct `annual_used`. Workspace yang mau tracking ekstensi (mis. extend 1 bulan lagi pasca-persalinan setelah konsultasi dokter): admin pakai balance edit + new annual_leave pengajuan terpisah.- Bapak juga dapet cuti, `permission_leave` 2 hari "istri melahirkan" (UU 13/2003)
- Beberapa workspace policy ekstra: 4 bulan / 6 bulan (sesuai best practice progressive companies)
- 9
Approval flow (sisi admin tim)
Admin tim buka /cuti → Approval Queue:
Per pengajuan kelihatan:
- Type (badge: Cuti Tahunan / Sakit / Izin / Maternity)
- Requester + foto
- Range tanggal + working days computed
- Alasan
- Lampiran (kalau ada, preview inline)
- Sisa balance setelah pengajuan ini (preview impact)
- Backup person
Approve:
- Opsional note ("OK cuti Lebaran, jangan lupa serah-terima tugas dulu")
- System auto-deduct dari
annualUsed/sickUsed/permissionUsed - Rollback automatic: kalau deduct gagal (concurrent issue: sisa berkurang karena pengajuan lain di-approve duluan), pengajuan kembali ke pending dengan error: "Gagal approve: Sisa kuota berubah. Status di-rollback." Admin retry atau request adjust quota.
Reject:
- Note wajib (mis. "Sorry, periode itu deadline project akhir bulan. Tolong reschedule ke minggu depan.")
- Tidak deduct balance
Notif push + in-app + email ke requester.
Bulk approve (Phase 2, coming soon): select multiple pengajuan tipe sama dengan note template seragam. Berguna untuk batch process akhir tahun.
Admin tim cuma bisa approve untuk tim sendiri. Multi-tim member submit ke tim X → admin tim X yang approve. Cross-tim approval = admin workspace. - 10
Cancel approved cuti (refund balance)
Staff approved cuti, tapi cancel last-minute (rencana berubah, family member sembuh, dll).
/cuti → my history → klik pengajuan approved → "Batalkan":
Validasi:
- ✅ tanggal mulai > sekarang (cuti belum dimulai) → allowed
- ❌ tanggal mulai sudah lewat atau sedang berlangsung → "Cuti yang sudah dimulai/lewat tidak bisa dibatalkan. Hubungi admin untuk koreksi."
Kalau allowed:
- Status → dibatalkan
- Auto-refund balance: kuota terpakai dikembalikan sesuai jumlah hari kerja, dst sesuai type
- Audit log: pembatalan cuti setelah approve dicatat lengkap dengan jumlah hari yang dikembalikan
- Notif ke admin tim ("Cuti X dibatalkan oleh requester, 3 hari di-refund")
Useful kalau:
- Sakit sembuh lebih cepat (sakit 5 hari approved, sembuh hari ke-3)
- Travel plan batal
- Project urgent muncul, staff voluntary masuk
Cancel cuti yang udah dimulai: staff hubungi admin → admin pakai fitur koreksi untuk edit pengajuan (tanggal selesai dikurangi), trigger refund manual.
- Cancel pending (belum approved) gak refund apa-apa karena balance belum di-deduct
- 11
Carry-over policy (sisa cuti tahun lalu)
Akhir tahun, staff masih punya sisa cuti 4 hari. Apa yang terjadi?
Carry-over OFF (default):
- 31 Desember 23:59 → sisa hangus
- 1 Januari → balance baru, quota 12, used 0, carry-over 0
- Sistem otomatis reset saldo cuti setiap 1 Januari
Carry-over ON (admin enable):
- Sistem menghitung sisa quota tahun lama → bisa carry maksimal sesuai batas carry-over (default 6 hari)
- Saldo tahun baru dapat carry-over = nilai terkecil antara sisa dan batas maksimal
- Tanggal kedaluwarsa carry-over default 31 Maret tahun baru
- Setelah kedaluwarsa: sistem otomatis menghapus sisa carry-over jadi 0
Contoh:
- 2026: quota 12, used 8, sisa 4 hari
- Carry-over enabled, max 6 → carry 4 hari
- 2027: quota 12, used 0, carryOver 4 (expire 31 Maret 2027)
- Staff bisa pakai sampai 16 hari sekaligus di Januari-Maret 2027
- 1 April 2027: kalau carry-over masih 0-belum-pakai, hangus → balance balik ke 12 saja
Edge case, staff resign mid-year dengan carry-over besar:
- Saat resign, balance dibekukan
- Sisa unconsumed = compensation? Tergantung policy workspace (biasanya unpaid kalau staff resign sukarela, paid kalau di-PHK)
- Admin handle manual via balance edit + notes
Proses carry-over otomatis hanya jalan 1 Januari tiap tahun. Manual override admin via balance edit kapan saja. - 12
Integrasi cuti ke Payroll & Absensi
Cuti di SatuTim bukan silo, cross-feature integration:
Payroll lateness fairness:
- Saat generate Payroll bulanan, lateness deduction skip tanggal yang punya approved leave (annual/sick/permission/maternity)
- Fair: staff cuti tahunan tanggal 5, gak akan kepotong gaji karena gak masuk tanggal itu
- Holiday skip juga apply (tanggal libur nasional bukan workday)
Attendance stats:
- Streak personal skip cuti approved (gak putus streak)
- Stats "presentDays bulan ini" exclude cuti hari (hadir 18 / scheduled 22 = 4 hari off, mis. 2 cuti + 2 weekend)
Pengingat clock-in otomatis:
- Tiap pagi sistem kirim push "Jangan lupa clock-in", skip user yang cuti hari itu
- Skip whole workspace kalau hari libur nasional
Manager Team Today board:
- Display badge "📴 Cuti Tahunan" untuk user yang on-leave hari itu
- Beda dengan "🟢 Hadir" / "🟡 Telat" / "🔴 Belum clock-in"
- Manager tahu siapa available untuk tugas hari itu
Payroll period: cuti tahunan paid full → tidak ada potongan slip. Cuti besar (mis. 3 bulan maternity) tetap full salary 3 bulan pertama (UU), bulan ke-4+ kalau ada extend = workspace policy.
- 13
Plan gating + audit
Cuti management = Pro+ (bundled dengan plugin Absensi):
- Free: tidak ada akses cuti management. Track manual di spreadsheet.
- Pro: full leave management, 4 types, balance tracking, auto-deduct, basic carry-over.
- Business: + bulk balance import (CSV), + custom approval workflow (multi-step kalau workspace besar), + extended audit retention 90 hari, + Q4 quota warning notifications.
- Enterprise: + on-premise audit export untuk compliance Indonesia (Kemnaker inspeksi), + multi-country leave policy (kalau perusahaan punya cabang Singapore/Malaysia dengan policy beda), + SLA 99.9%.
Audit log mandatory untuk semua leave action:
- Pengajuan cuti dibuat, siapa, kapan, type, days
- Pengajuan cuti disetujui, admin yang approve, deduct details
- Pengajuan cuti ditolak, alasan reject
- Pengajuan cuti dibatalkan setelah approve, refund details
- Saldo cuti diubah admin, admin manual edit kuota
- Carry-over diproses, event tahunan otomatis
Retention: sesuai plan workspace. Compliance Indonesia (Kemnaker) require keep records 5+ years, workspace Business+ kasih digital retention; pakai export CSV untuk physical archive di cloud lain kalau perlu beyond plan retention.
Compliance penting: kalau ada dispute karyawan (mis. "kuota saya kurang"), audit log immutable ini yang dipakai pengadilan / mediator BPJS. - 14
Troubleshooting Cuti
Masalah umum + fix:
"Sisa kuota cuti tahunan X hari, tidak cukup untuk Y hari":
→ Working days pengajuan > sisa balance. Cek balance di /cuti → balance saya. Adjust tanggal atau request admin add kuota custom."Pengajuan cuti tahunan wajib H-N dari tanggal mulai":
→ Submit terlalu mepet. Cuti tahunan strict policy advance notice. Pakai sick/permission untuk emergency."Cuti sakit > N hari wajib lampirkan surat dokter":
→ Upload surat dokter sebagai lampiran. Foto cukup, format JPG/PNG/PDF max 5MB."Rentang tanggal tidak ada hari kerja":
→ Range cuma weekend / libur nasional. Tidak ada working days = tidak ada yang di-deduct = pengajuan dianggap invalid. Adjust tanggal."Gagal approve: Sisa kuota berubah. Status di-rollback.":
→ Race condition: 2 cuti approved parallel, sisa berkurang. Refresh, recheck balance, retry approve.Balance tidak ke-refund saat cancel:
→ Cek tanggal mulai cuti, kalau cuti udah dimulai/lewat, gak bisa cancel. Hubungi admin untuk koreksi via balance edit manual.Carry-over hilang padahal seharusnya ada:
→ Cek tanggal kedaluwarsa carry-over, mungkin sudah lewat. Atau admin reset balance tahun lalu sebelum proses carry-over jalan. Audit log catat tanggal kejadian.Cuti approved tapi Payroll masih potong gaji:
→ Cek tanggal mulai cuti harus dalam rentang periode payroll run (mis. cuti tanggal 3 Juni masuk run Juni, bukan Mei). Re-generate run kalau salah periode.Staff tidak bisa lihat balance:
→ Plan workspace mungkin Free (no Pro+). Upgrade atau pakai HR Requests biasa tanpa kuota tracking.Masih stuck? /support/new dengan: pengajuan ID, screenshot balance, expected vs actual.