Lewati ke isi

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

  1. Klik tombol "+ Tambah" di tab Kelompok Kerja
  2. Modal tambah:
  3. Kode Kelompok Kerja: unik per tenant, mis. KK-FRO, KK-OPS
  4. Nama: nama lengkap, mis. "Front Office"
  5. 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_id saat 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

  1. Klik "+ Tambah" di tab Waktu Kerja
  2. Form:
  3. Kode: mis. SHIFT-PAGI, SHIFT-MALAM
  4. Nama: mis. "Shift Pagi"
  5. Jam Datang: mis. 07:00
  6. Jam Pulang: mis. 15:00
  7. 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)
  8. Window absensi pulang:
    • Earliest Clock-Out: paling cepat boleh absen pulang (mis. 15:00)
    • Latest Clock-Out: paling lama (mis. 18:00)
  9. Simpan

Validasi window

  • Earliest Clock-InJam DatangLatest Clock-In
  • Earliest Clock-OutJam PulangLatest 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

  1. Klik "+ Tambah" di tab Jadwal Kerja
  2. Form:
  3. Kode: mis. JAD-OPS-A, JAD-OFFICE
  4. Nama: mis. "Pola Operasional Senin-Sabtu"
  5. 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
  6. 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

  1. Klik "+ Tambah" di tab Jadwal Kelompok Kerja
  2. Form:
  3. Kelompok Kerja: dropdown
  4. Jadwal Kerja: dropdown
  5. Tanggal Mulai: kapan assignment efektif
  6. Tanggal Berakhir: kapan assignment habis (kosongkan = open-ended/aktif terus)
  7. 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:

Assignment overlap dengan assignment X (rentang ABC..DEF)

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_berakhir atau 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:

  1. Bikin Shift dasar dulu (mis. PAGI, SIANG, MALAM)
  2. Bikin Jadwal Kerja template (mis. JAD-OFFICE Senin-Jumat, JAD-OPS-A 6 hari)
  3. Bikin Kelompok Kerja (mis. KK-OFFICE, KK-FRO, KK-OPS)
  4. Tambah Karyawan + assign ke kelompok kerja masing-masing
  5. Buat Assignment: Kelompok Kerja X → Jadwal Y, mulai tanggal_bergabung paling 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.