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. 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)
  2. 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.
  3. 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. 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. 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:

    1. ✅ Working days 5 ≤ sisa kuota 13 → lolos
    2. ✅ H-30 dari tanggal mulai > advance notice H-3 → lolos
    3. ✅ 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. 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. 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. 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_used increment (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. 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. 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:

    1. Status → dibatalkan
    2. Auto-refund balance: kuota terpakai dikembalikan sesuai jumlah hari kerja, dst sesuai type
    3. Audit log: pembatalan cuti setelah approve dicatat lengkap dengan jumlah hari yang dikembalikan
    4. 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. 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. 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. 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. 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.