3. Master Waktu Kerja¶
Bab ini menjelaskan setup jadwal kerja: dari definisi shift, pola mingguan, sampai assignment ke kelompok karyawan.
Konsep & Hirarki¶
Sistem waktu kerja punya 4 lapis:
1. Waktu Kerja (Shift) — definisi 1 shift: Pagi 07:00-15:00
2. Jadwal Kerja — pola mingguan: shift apa di Senin/Selasa/.../Minggu
3. Kelompok Kerja — grup karyawan (Front Office, Back Office, dll)
4. Jadwal Kelompok Kerja — assignment: kelompok X pakai jadwal Y selama Z..A
Karyawan tidak langsung punya shift — mereka masuk Kelompok Kerja, dan Kelompok Kerja yang punya assignment jadwal.
Akses: sidebar Master Data → Waktu Kerja. Halaman punya 4 tab.
3.1 Tab "Kelompok Kerja"¶
Apa itu¶
Grup karyawan yang punya pola jadwal sama. Mis. "Front Office", "Operasional Lapangan", "Manajemen".
Tambah Kelompok Kerja¶
- Klik tombol "+ Tambah" di tab Kelompok Kerja
- Modal tambah:
- Kode Kelompok Kerja: unik per tenant, mis.
KK-FRO,KK-OPS - Nama: nama lengkap, mis. "Front Office"
- Simpan
Edit / Hapus¶
- Edit: ubah kode atau nama
- Hapus (soft delete): tidak bisa kalau masih dipakai karyawan aktif atau assignment aktif
Setup ini dulu sebelum tambah karyawan — karena karyawan butuh
kelompok_kerja_idsaat create.
3.2 Tab "Waktu Kerja" (Shift)¶
Apa itu¶
Definisi 1 shift kerja: jam masuk, jam pulang, dan window absensi (rentang jam yang valid untuk clock-in/clock-out).
Tambah Shift¶
- Klik "+ Tambah" di tab Waktu Kerja
- Form:
- Kode: mis.
SHIFT-PAGI,SHIFT-MALAM - Nama: mis. "Shift Pagi"
- Jam Datang: mis.
07:00 - Jam Pulang: mis.
15:00 - Window absensi datang:
Earliest Clock-In: jam paling pagi boleh absen masuk (mis.06:00)Latest Clock-In: jam paling lama tetap dianggap hadir (mis.08:00— lewat ini = telat)
- Window absensi pulang:
Earliest Clock-Out: paling cepat boleh absen pulang (mis.15:00)Latest Clock-Out: paling lama (mis.18:00)
- Simpan
Validasi window¶
Earliest Clock-In≤Jam Datang≤Latest Clock-InEarliest Clock-Out≤Jam Pulang≤Latest Clock-Out- Pengecualian untuk shift lintas tengah malam — kalau
Earliest > Latest(window wrap-around), sistem terima sebagai cross-midnight (lihat di bawah) - Bila tetap invalid (mis. Jam Datang di luar window dengan urutan tidak masuk akal), sistem tolak dengan pesan jelas: "Jam Datang/Pulang harus berada di antara Earliest & Latest"
Shift lintas tengah malam (cross-midnight) ✅¶
Untuk shift malam (mis. satpam 22:00 → 06:00 hari berikutnya):
| Field | Nilai contoh |
|---|---|
| Jam Datang | 22:00 |
| Jam Pulang | 06:00 |
| Window Datang | 21:00 / 22:00 / 23:30 (semua sebelum tengah malam) |
| Window Pulang | 05:30 / 06:00 / 08:00 (semua pagi hari berikutnya) |
Atau kasus extreme — window absen ikut wrap (mis. boleh check-in sampai 02:00 dini hari):
| Field | Nilai contoh |
|---|---|
| Earliest Clock-In | 22:00 |
| Jam Datang | 23:00 |
| Latest Clock-In | 02:00 (← lebih kecil dari Earliest = wrap-around) |
Banner kuning info akan muncul saat HR isi nilai yang men-trigger salah satu kondisi cross-midnight (Window Datang/Pulang wrap, atau Jam Pulang < Jam Datang).
Konfirmasi sebelum simpan — saat klik Simpan, dialog konfirmasi browser muncul:
Shift lewat tengah malam terdeteksi: • Jam Kerja shift malam (datang 22:00 → pulang 06:00 hari berikutnya)
Pastikan ini memang shift malam (mis. satpam 22:00 → 06:00). Apakah benar dan ingin disimpan? [Cancel] [OK]
Klik OK untuk lanjutkan submit, Cancel untuk batalkan dan koreksi nilai.
Sistem otomatis menginterpretasikan window yang wrap sebagai melintas tengah malam — jam clock-in/clock-out tetap divalidasi sesuai window dengan logic wrap-around, jadi capture jam 23:30 valid untuk window 21:00 → 02:00 (di sisi malam), demikian juga 00:30 (di sisi pagi).
Edit / Hapus¶
- Edit ulang full validasi window
- Hapus: tidak bisa kalau dipakai jadwal_kerja aktif
3.3 Tab "Jadwal Kerja" (Pola Mingguan)¶
Apa itu¶
Template pola mingguan: shift apa di hari Senin, Selasa, ..., Minggu. Bisa beda shift per hari atau libur (kosong).
Tambah Jadwal Kerja¶
- Klik "+ Tambah" di tab Jadwal Kerja
- Form:
- Kode: mis.
JAD-OPS-A,JAD-OFFICE - Nama: mis. "Pola Operasional Senin-Sabtu"
- 7 day-slot (Senin-Minggu):
- Untuk setiap hari, pilih shift dari dropdown atau kosongkan =
LIBUR - Mis. Senin-Jumat:
SHIFT-PAGI, Sabtu:SHIFT-PAGI(setengah hari), Minggu: kosong
- Untuk setiap hari, pilih shift dari dropdown atau kosongkan =
- Simpan
Contoh pola umum¶
| Pola | Senin | Selasa | Rabu | Kamis | Jumat | Sabtu | Minggu |
|---|---|---|---|---|---|---|---|
| Office Mon-Fri | PAGI | PAGI | PAGI | PAGI | PAGI | LIBUR | LIBUR |
| Operasional 6 hari | PAGI | PAGI | PAGI | PAGI | PAGI | PAGI | LIBUR |
| Shift Rotasi A | PAGI | PAGI | LIBUR | PAGI | PAGI | LIBUR | LIBUR |
| Operator 24/7 | MALAM | MALAM | LIBUR | LIBUR | PAGI | PAGI | LIBUR |
Tip: Bikin beberapa jadwal kerja standar dulu, baru assign ke kelompok kerja sesuai kebutuhan operasional.
Edit / Hapus¶
- Edit per day-slot: ganti shift atau set LIBUR
- Hapus: tidak bisa kalau masih ada assignment aktif
3.4 Tab "Jadwal Kelompok Kerja" (Assignment)¶
Apa itu¶
Penugasan: Kelompok Kerja X pakai Jadwal Kerja Y mulai tanggal tanggal_mulai sampai tanggal_berakhir (atau open-ended).
Ini layer paling penting karena karyawan ikut kelompok kerja → kelompok kerja punya assignment → assignment yang menentukan shift harian.
Tambah Assignment¶
- Klik "+ Tambah" di tab Jadwal Kelompok Kerja
- Form:
- Kelompok Kerja: dropdown
- Jadwal Kerja: dropdown
- Tanggal Mulai: kapan assignment efektif
- Tanggal Berakhir: kapan assignment habis (kosongkan = open-ended/aktif terus)
- Simpan
Validasi Overlap¶
Sistem cek otomatis: 1 kelompok kerja TIDAK boleh punya 2 assignment yang overlap di waktu yang sama. Bila overlap, sistem tolak dengan pesan:
Solusi:
- Akhiri assignment lama dulu (set tanggal_berakhir sebelum mulai assignment baru)
- Atau hapus assignment lama bila salah input
Filter di tabel¶
- Kelompok Kerja: filter assignment per kelompok
- Status Aktif: hanya yang
tanggal_mulai ≤ today ≤ tanggal_berakhir
Edit / Hapus¶
- Edit: bisa perpanjang
tanggal_berakhiratau ganti jadwal - Hapus (soft): assignment dihapus dari aktif, tidak ada efek ke jadwal harian yang sudah materialized
3.5 Alur kerja typical¶
Untuk tenant baru, urutan setup:
- Bikin Shift dasar dulu (mis. PAGI, SIANG, MALAM)
- Bikin Jadwal Kerja template (mis. JAD-OFFICE Senin-Jumat, JAD-OPS-A 6 hari)
- Bikin Kelompok Kerja (mis. KK-OFFICE, KK-FRO, KK-OPS)
- Tambah Karyawan + assign ke kelompok kerja masing-masing
- Buat Assignment: Kelompok Kerja X → Jadwal Y, mulai
tanggal_bergabungpaling awal sampai akhir tahun
Setelah ini, periode + jadwal harian bisa di-generate (bab 6).
3.6 Hari Libur¶
Hari libur bukan di-setup di tab Waktu Kerja — ada di Master Data → Miscellaneous → Hari Libur. Lihat 04-master-pendukung.md.
Saat generate jadwal harian:
- Tanggal yang ada di hari_libur untuk tenant tsb di-skip — karyawan auto LIBUR meskipun jadwal mingguan-nya menyebut shift di hari itu
- Saat kalkulasi realisasi, tanggal libur menghasilkan status_efektif='LB'
3.7 Tips & Pitfalls¶
| Tips | Catatan |
|---|---|
| Standardisasi nama shift di seluruh organisasi | Hindari "Pagi-A" / "Pagi-B" beda kelompok |
| Bikin Jadwal Kerja minimal yang cover semua pola | 3-5 jadwal biasanya cukup |
Assignment open-ended (tanggal_berakhir = NULL) |
Cocok untuk pola permanen — saat ada perubahan, akhiri assignment lama + bikin baru |
| Cek assignment aktif setiap awal periode | Pastikan tidak ada gap yang bikin karyawan tanpa shift |
| Pitfalls | Solusi |
|---|---|
| Karyawan tidak punya jadwal harian setelah generate | Cek apakah kelompok kerja-nya punya assignment aktif di periode tsb |
| Window absensi terlalu sempit → karyawan dianggap telat padahal tepat waktu | Lebarkan Latest Clock-In 5-15 menit |
| Karyawan pindah kelompok kerja saat periode berjalan | Update karyawan.kelompok_kerja_id, lalu re-generate jadwal harian periode tsb (Iterasi berikutnya) |
Langkah berikutnya¶
→ 4. Master Pendukung — Hari Libur, Status Kekaryawanan, Komponen Gaji, Formula, Fasilitas, Pinjaman.