Lembur, Reimburse & Cuti: HR Requests
Pengajuan lembur, biaya perjalanan, justifikasi keterlambatan, kunjungan klien. Approval flow ke admin tim, OCR struk otomatis dengan AI, integrasi ke Payroll.
- 1
Apa itu HR Requests
Plugin HR Requests handle 4 jenis pengajuan karyawan yang berdampak ke gaji/operasional:
- Lembur (
overtime), catat kerja di luar jam kerja dengan Jumlah jam dan alasan. Tidak ada kolom nominal; kalau plugin Absensi Online aktif, upah lembur dihitung otomatis dari data absensi saat payroll di-generate. - Justifikasi keterlambatan (
lateness_excuse), pembelaan telat dengan alasan tertulis. Belum ada kolom upload bukti, jadi tulis detail buktinya di kolom alasan. Jenis ini ada di web dan aplikasi Absensi (attendance.satutim.id), belum ada di aplikasi Android. - Reimbursement (
reimbursement), claim biaya kerja (transport, makan klien, ATK) dengan struk + OCR auto-extract - Kunjungan Klien (
visit), visit log untuk staff lapangan, dengan target lokasi + durasi
Setiap pengajuan butuh approval dari admin tim (role
admin_teamdi tim staff). Pengajuan yang sudah disetujui otomatis ikut dihitung saat admin men-generate payroll untuk periode itu di plugin Payroll. Generate payroll dilakukan manual oleh admin, bukan otomatis tiap akhir bulan.Owner workspace mengaktifkan plugin lewat Menu Lainnya → Kelola Plugin, lalu nyalakan switch Hitung Lembur & Keterlambatan. Hanya owner workspace yang bisa mengatur plugin. Plugin name di backend masih
overtime(legacy, dipertahankan untuk backward compat URL/lembur).- Plugin ini bisa dipakai di semua paket, termasuk Free. Yang butuh paket Pro ke atas hanya fitur baca struk otomatis (AI OCR) di pengajuan biaya perjalanan/reimburse.
- OCR struk butuh AI quota workspace, count sebagai 1 AI call per scan
- Lembur (
- 2
Cara ajukan lembur
Staff selesai project late night, butuh kompensasi:
Di web: buka Menu Lainnya → Hitung Lembur & Keterlambatan, klik Ajukan baru, lalu pilih Jenis pengajuan: Lembur. Di aplikasi Absensi (attendance.satutim.id): tab Lembur di bawah → Ajukan baru. Di aplikasi Android: tab Absensi → Lembur.
- Tim: pilih tim tempat kamu terdaftar sebagai anggota. Daftarnya menampilkan semua tim di workspace; kalau kamu memilih tim yang bukan timmu, pengajuan ditolak dengan pesan "Kamu bukan anggota tim ini".
- Tanggal & jam mulai (mis. 21 Mei 17:30)
- Tanggal & jam selesai (mis. 21 Mei 22:00)
- Isi Jumlah jam secara manual (mis. 4.5). Jam tidak dihitung otomatis dari Mulai dan Selesai.
- Alasan / keterangan (teks, mis. "Lembur perbaikan bug kritis di sistem pembayaran klien")
Lalu klik Kirim pengajuan. Status pengajuan jadi Menunggu. Semua Admin Tim di tim itu menerima notifikasi di aplikasi (ikon lonceng) dan push notification. Pengajuan tidak dikirim lewat email.
Pelajaran penting: Pengajuan lembur tidak punya kolom tarif atau nominal. Kalau plugin Absensi Online aktif, upah lembur dihitung otomatis saat payroll di-generate dari menit lembur di data absensi (gaji pokok / 173 × pengali yang diatur di Absensi Online → Pengaturan → Aturan lembur (UU Cipta Kerja)).
Pengajuan lembur retroaktif diizinkan. Belum ada pengaturan batas maksimal hari mundur, jadi Admin Tim yang menilai saat review. - 3
Cara ajukan reimbursement (dengan OCR AI)
Staff naik Grab ke klien meeting, ada biaya bensin perjalanan dinas, dll:
Di web: Hitung Lembur & Keterlambatan → Ajukan baru → Jenis pengajuan: Biaya perjalanan (di aplikasi Absensi namanya Reimburse, di Android Reimbursement / tombol Klaim).
- Tim
- Mulai (tanggal pengeluaran)
- Kategori: transport, makan, visit (kunjungan), atau lainnya
- Nominal dalam rupiah
- Alasan / keterangan (mis. "Grab ke klien Acme di Sudirman")
- Upload struk (foto JPG/PNG/HEIC/WEBP, max 8MB)
Trik AI: drag-drop struk dulu sebelum isi field. AI auto-OCR dalam ~3 detik dan auto-fill:
- Tanggal struk (di Mulai)
- Nominal (deteksi total final, bukan subtotal)
- Kategori (Transport karena merchant Grab)
- Alasan (kalau masih kosong)
Nama merchant ditampilkan sebagai ringkasan di bawah kolom lampiran; pajak tidak diisi terpisah.
Staff cuma review + edit kalau ada salah → submit. Lebih cepat 5x dari isi manual.
OCR limits:
- Format: gambar saja (PDF struk = upload manual)
- Max 8MB file size
- Kuota: tiap scan yang berhasil memakai 1 kuota AI workspace dan tercatat di pemakaian AI. Fitur ini butuh paket Pro ke atas
- Fallback: kalau AI gagal parse (struk burik / non-Indonesia / tulisan tangan), error message → staff isi manual
- Struk yang clear dan diambil dari atas (top-down view, gak miring) akurasi >95%. Struk miring/lipat akurasi turun ke 70%.
- 4
Cara ajukan justifikasi keterlambatan
Staff telat 30 menit hari Senin karena macet KRL gangguan sinyal. Tanpa justifikasi, status
latedi rekap → potong gaji (kalau tarif denda aktif).Di web: Hitung Lembur & Keterlambatan → Ajukan baru → Jenis pengajuan: Justifikasi keterlambatan (di aplikasi Absensi: Justifikasi telat). Jenis ini belum tersedia di aplikasi Android.
- Tim
- Tanggal kejadian di Mulai
- Alasan / keterangan (text, mis. "KRL Bogor-Jakarta gangguan sinyal Stasiun Manggarai, terlambat 35 menit")
- Belum ada kolom upload bukti untuk justifikasi telat; tuliskan keterangan buktinya di Alasan / keterangan
Amount = 0 (justifikasi tidak ada kompensasi, cuma exclude dari denda).
Admin tim review → kalau approved:
- Status pengajuan
approved - Record attendance hari itu masih
late(tidak modify), tapi Payroll skip record ini saat hitung potongan denda - Net effect: gaji bulan itu tidak kepotong untuk telat tanggal itu
Kalau rejected (admin gak terima alasan): potongan tetap berlaku.
Plugin Absensi harus aktif buat fitur ini ada efek finansial. Kalau Absensi off, justifikasi cuma jadi catatan tanpa pengaruh slip. - 5
Cara ajukan visit / kunjungan klien
Staff sales sering visit ke klien, perlu log untuk reporting + reimburse transport:
Di web: Hitung Lembur & Keterlambatan → Ajukan baru → Jenis pengajuan: Kunjungan / field work (di aplikasi Absensi: Kunjungan; belum ada di Android).
- Tim (sales / BD / account management)
- Tanggal & jam mulai visit
- Tanggal & jam selesai visit (optional): boleh dikosongkan, tapi isi sebelum mengirim kalau mau durasinya tercatat; pengajuan tidak bisa diedit setelah dikirim
- Lokasi (nama tempat/klien, mis. "PT Maju Mundur, Office Sudirman")
- Tujuan kunjungan di Alasan / keterangan (mis. "Demo product feature X"), dan foto di Lampiran (foto/PDF) kalau perlu
- Kunjungan tidak punya kolom nominal. Untuk ganti biaya transport, buat pengajuan terpisah dengan jenis Biaya perjalanan
Visit di-track terpisah dari Absensi mode
visit(clock-in lapangan). Beda:- Absensi
visitmode → clock-in/out langsung dari lapangan + GPS recorded. Statusremote. Real-time. - HR Request
visit→ submit setelah kejadian (atau saat berangkat) untuk approval. Tidak butuh GPS.
Gunakan sesuai workflow: kalau ada perlu approval atasan dulu → HR Request. Kalau cuma log presence → Absensi visit mode.
- Field staff bisa kombinasikan: Absensi visit mode untuk daily clock + HR Request visit untuk weekly summary
- 6
Approval flow (sisi admin)
admin_teamdi setiap tim handle approval. Di web, buka Menu Lainnya → Hitung Lembur & Keterlambatan → tab Approval tim (atur filter status ke Menunggu). Untuk cuti/sakit/izin juga bisa lewat Menu Lainnya → Izin & Cuti → bagian Menunggu persetujuan. Di Android: tab Perlu Persetujuan.Di daftar terlihat jenis, status, alasan, tanggal, nama pemohon, dan nominal (kalau ada). Klik kartunya untuk melihat tim dan lampiran.
Aksi per pengajuan:
- ✅ Klik Setujui. Saat ini belum ada kolom catatan ketika menyetujui. Status
approved. Notif ke requester (push + in-app). - ❌ Reject, note wajib (mis. "Reimburse makan pribadi tidak qualified untuk dinas, hanya entertain klien"). Status
rejected. Notif ke requester dengan alasan. - 🔄 Request More Info (Phase 2, coming soon), bouncing back ke requester dengan note, tanpa final decision.
Belum ada fitur setujui/tolak massal; setiap pengajuan disetujui atau ditolak satu per satu. Best practice: gak abuse, tiap pengajuan deserve individual review.
Filter: jenis pengajuan dan status. Useful untuk monthly review.
Yang bisa menyetujui: owner workspace dan Admin Tim (Admin Tim dari tim mana pun di workspace). Role Admin Workspace saja tanpa jadi Admin Tim belum bisa menyetujui. Kalau ada alur di Absensi Online → Persetujuan, hanya approver di level itu (atau delegasinya) yang bisa menyetujui. - ✅ Klik Setujui. Saat ini belum ada kolom catatan ketika menyetujui. Status
- 7
Cancel pengajuan pending (sisi requester)
Staff salah submit (typo amount, tanggal salah), selama status masih
pending, bisa cancel sendiri.Web: Hitung Lembur & Keterlambatan → tab Pengajuan saya → klik pengajuannya → Batalkan pengajuan → konfirmasi. Aplikasi Absensi: tab Lembur → klik pengajuan → Batalkan pengajuan. Android: tombol Batalkan di kartu pengajuan.
- Status
pending→cancelled - Pembatalan tidak mengirim notifikasi ke Admin Tim, jadi kabari atasanmu kalau perlu
Setelah cancel, gak bisa di-undo. Submit lagi pengajuan baru kalau perlu.
Catatan:
approved/rejectedgak bisa di-cancel. Pengajuan yang sudah disetujui tidak bisa diedit. Kalau angkanya perlu dikoreksi sebelum gaji final, admin bisa menghapus run payroll yang masih draft lalu generate ulang; run yang sudah difinalisasi terkunci. - Status
- 8
Lihat history pengajuan saya
Staff buka Hitung Lembur & Keterlambatan → tab Pengajuan saya (aplikasi Absensi: tab Lembur; Android: tab Pengajuanku) → list semua pengajuan personal historical.
Filter: jenis pengajuan dan status (Menunggu, Disetujui, Ditolak, Dibatalkan).
Belum ada statistik personal di halaman ini. Untuk ringkasan, buka tab Rekap (kalau kamu bukan admin, isinya rekap pengajuanmu sendiri yang sudah disetujui).
Useful buat self-monitor: kalau approval rate < 50%, mungkin perlu re-think cara submit (alasan lebih jelas, bukti lebih lengkap).
- 9
Rekap admin (Fase 5: summary endpoint)
Workspace admin / HR Manager butuh aggregat untuk reporting. Buka Menu Lainnya → Hitung Lembur & Keterlambatan → tab Rekap. Owner/Admin Tim melihat rekap seluruh workspace; anggota biasa hanya melihat rekap pengajuannya sendiri.
Pilih periode: Bulan ini, Bulan lalu, atau Tahun ini. Output:
Lembur:
- Total pengajuan approved
- Total jam lembur
- Total Rp kompensasi lembur
Keterlambatan:
- Total incident justifikasi (insiden, bukan staff, 1 staff bisa multiple)
Reimbursement:
- Total Rp di-approve
- Rincian per kategori belum ditampilkan; lihat kolom Kategori di sheet Detail pada file Excel
Kunjungan:
- Total visit count
- Total durasi (menit), kalau visit punya rentang from-to
Klik Export Excel untuk mengunduh rekap (sheet Ringkasan dan Detail).
- Limit query summary: 5000 record max, kalau workspace besar (>5000 pengajuan/bulan), pakai filter periode lebih kecil
- Data summary cuma approved, pending/rejected/cancelled di-skip
- 10
Integrasi ke Payroll otomatis
Saat admin men-generate payroll untuk suatu periode, plugin Payroll otomatis memasukkan pengajuan yang sudah disetujui di periode itu ke slip gaji:
Lembur: kalau plugin Absensi Online aktif, upah lembur di slip dihitung dari menit lembur di data absensi (bukan dari pengajuan lembur) dan masuk penghasilan kena pajak (PPh 21).
Reimbursement approved dalam periode →
- Ditambahkan ke komponen reimbursement di slip gaji
- Non-taxable default (reimburse = ganti uang yang dikeluarin staff, bukan additional income)
- Beberapa kategori tertentu (mis. makan teratur, allowance regular) bisa taxable, atur di komponen tetap profile, bukan di reimbursement individual
Justifikasi keterlambatan approved →
- Saat menghitung potongan keterlambatan, catatan absensi di-skip kalau ada justifikasi approved untuk hari yang sama
- Net effect: gaji tidak dipotong
Visit → tidak ada efek finansial otomatis. Cuma logging. Untuk reimburse transport visit, submit terpisah sebagai reimbursement.
Workflow ideal:
- Tanggal 25: HR mengingatkan tim untuk mengirim pengajuan yang belum diajukan (sistem belum mengirim pengingat otomatis untuk ini)
- Tanggal 26-28: admin tim batch approve
- Tanggal 29: HR finalisasi attendance, justifikasi sudah selesai semua approval
- Tanggal 30: generate payroll run, auto-include semua approved entries
Pengajuan yang baru disetujui setelah payroll di-generate tidak otomatis masuk. Selama run masih draft, admin bisa menghapus run itu lalu generate ulang. Run yang sudah difinalisasi tidak bisa diubah, dan pengajuan itu juga tidak terbawa ke run bulan berikutnya (yang dihitung adalah tanggal mulainya). - 11
Notifikasi push & in-app
Komunikasi real-time penting untuk approval flow gak stuck:
Saat submit: → admin tim dapet 2-channel notif:
- Push (PWA mobile): "Pengajuan baru, [Nama Staff] mengajukan lembur"
- Di aplikasi: muncul di daftar notifikasi (ikon lonceng di bar atas)
Notifikasi pengajuan dikirim lewat notifikasi di aplikasi dan push saja, belum lewat email.
Saat approved: → requester dapet:
- Push: "Pengajuan disetujui ✅, Lembur 21 Mei"
- In-app: notification list dengan link ke detail pengajuan
Saat rejected: → requester dapet:
- Push: "Pengajuan ditolak, Lihat alasannya"
- Note rejection ditampilkan di detail pengajuan
Belum ada pengaturan notifikasi khusus pengajuan. Kalau push tidak masuk, cek bagian Native Push di Pengaturan → Notifikasi.
- 12
Permission matrix + access scope
Plugin enforce role-based access ketat untuk legal/HR sensitive:
| Role | List own | List team | List all | Submit | Approve | Edit pasca-approve |
|------|----------|-----------|----------|--------|---------|---------------------|
|member| ✅ | ❌ | ❌ | ✅ | ❌ | ❌ (cancel own pending only) |Admin Tim (di tim mana pun) bisa melihat dan menyetujui pengajuan semua anggota workspace, bukan hanya timnya sendiri.
Owner workspace bisa melihat dan menyetujui semua pengajuan. Role Admin Workspace baru bisa menyetujui kalau juga menjadi Admin Tim. Pengajuan yang sudah disetujui tidak bisa diedit oleh siapa pun.
Query scope di-enforce di backend via
getVisibleUserIds()helper, bahkan kalau frontend bypass filter URL, data tetap difilter.Persetujuan, penolakan, dan pembatalan cuti setelah disetujui tercatat di Audit Trail (fitur Business, disimpan 1 tahun). Owner dan Admin Tim bisa melihat pengajuan seluruh workspace. Inspection compliance straightforward. - 13
Plan gating + AI quota
Plugin Hitung Lembur & Keterlambatan tersedia di semua paket, termasuk Free. Hanya AI OCR struk yang butuh paket Pro ke atas.
- Pro: OCR struk memakai kuota AI workspace (cek jumlah kuotanya di Billing & Paket)
- Business: kuota AI lebih besar (cek di Billing & Paket)
- Persetujuan bertingkat (mis. atasan → manajer → direktur) bisa dibuat di semua paket lewat Absensi Online → Persetujuan → Alur Baru (butuh plugin Absensi Online aktif). Belum ada integrasi khusus ke ERP
OCR struk specifically:
- 1 scan = 1 AI call
- Pemakaian quota AI tercatat per workspace
- Reset awal bulan otomatis
- Kalau quota habis: muncul pesan "Kuota AI workspace habis" → staff isi manual reimburse field
Upgrade kalau quota sering habis: Pengaturan → Billing & Paket.
Kalau plugin belum diaktifkan, pengajuan ditolak dengan pesan "Plugin "overtime" belum diaktifkan untuk workspace ini". OCR struk di paket Free ditolak dengan pesan "Fitur AI Assistant membutuhkan paket Pro atau lebih tinggi." - 14
Cuti tahunan / sakit / izin (link ke tutorial Cuti)
Selain 4 type pengajuan di atas, HR Requests sekarang juga handle 4 type cuti / leave:
- Annual leave (
annual_leave), cuti tahunan, deduct kuota 12 hari/tahun default (UU Cipta Kerja Pasal 79) - Sick leave (
sick_leave), sakit, surat dokter wajib > 2 hari - Permission leave (
permission_leave), izin pribadi (urusan keluarga, dll). Izin yang disetujui tidak otomatis memotong gaji - Maternity leave (
maternity_leave), cuti melahirkan 3 bulan UU Cipta Kerja, tidak deduct annual quota
Flow sama dengan pengajuan lain (submit → approve → notif), tapi otomatis:
- Validasi kuota saat submit (cuti tahunan ditolak kalau sisa < hari yang diminta)
- Validasi H-N advance notice (default H-3 untuk cuti tahunan)
- Hitung working days otomatis (skip weekend + hari libur)
- Auto-deduct balance saat approve
Cuti yang sudah disetujui belum bisa dibatalkan sendiri dari aplikasi (tombol Batalkan pengajuan hanya muncul selama status Menunggu). Kalau rencana berubah, hubungi support SatuTim.
Lihat tutorial Cuti: Kuota Tahunan, Sakit, Izin untuk detail kuota dan alur cuti.
- Annual leave (
- 15
Troubleshooting HR Requests
Masalah umum + fix:
"Kamu bukan anggota tim ini" saat submit:
→ User tidak terdaftar di tim yang dipilih. Cek /teams → tim X → Anggota. Admin tambah user."Tidak berhak approve pengajuan ini":
→ Kamu belum punya hak menyetujui: yang bisa adalah owner workspace atau Admin Tim. Kalau workspace memakai alur di Absensi Online → Persetujuan, hanya approver di level itu (atau delegasinya) yang bisa, dengan pesan "Bukan approver untuk level ini (atau bukan delegate aktif)".OCR struk hasil salah (amount/tanggal/merchant):
→ Struk burik/miring/non-standar (tulisan tangan, ukuran kecil). Edit manual kolom yang salah sebelum klik Kirim pengajuan."AI OCR reimbursement gagal":
→ Layanan AI sedang bermasalah atau timeout. Coba ulang 30 detik kemudian. Kalau persistent, fallback ke isi manual."Kuota AI workspace habis":
→ Workspace AI quota bulan habis. Upgrade plan atau tunggu reset awal bulan. Atau isi reimburse manual tanpa OCR.Pengajuan approved tapi gak masuk Payroll bulan ini:
→ Cek tanggal mulai pengajuan, harus dalam rentang periode payroll run (mis. run Mei = tanggal antara 1 Mei dan 31 Mei).Notif push gak masuk:
→ PWA gak ter-install / notif permission gak granted. Pengaturan → Notifikasi cek status. Re-grant kalau perlu."Pengajuan sudah diproses" saat approve/reject:
→ Pengajuan udah di-approve/reject sebelumnya (race condition antar admin tim). Refresh untuk lihat status terbaru.Staff lapor "pengajuan saya nggak nongol":
→ Cek tab-nya: pengajuan pribadimu ada di tab Pengajuan saya (bukan Approval tim). Atau status filter saat ini exclude status pengajuan (mis. filter "approved" tapi pengajuan masih pending).Masih stuck? /support/new dengan: pengajuan ID, screenshot, expected vs actual.