dstpabuaran.com/docs/leave-request-validation-fix.md

1.9 KiB

Fix: Validasi Pengajuan Cuti & Timezone

Tujuan

Memperbaiki 3 masalah pada modul pengajuan cuti:

  1. Timezone bug — tanggal yang dipilih mundur 1 hari (user pilih 8, ke-save 7)
  2. Tidak bisa mengajukan cuti untuk hari ini
  3. Tidak bisa mengajukan cuti di tanggal yang sama lebih dari 1x

File yang Dibaca

  • resources/js/pages/admin/hr/leave-request/index.tsx → Frontend form pengajuan cuti
  • app/Http/Requests/Admin/HR/LeaveRequestRequest.php → Validasi backend
  • app/Services/Admin/HR/LeaveRequestService.php → Service logic
  • app/Models/LeaveRequest.php → Model dengan cast date:Y-m-d

Pola yang Ditemukan

  • Frontend menggunakan toISOString().split('T')[0] untuk format tanggal → PROBLEM: toISOString() konversi ke UTC, sehingga waktu WIB (UTC+7) mundur 1 hari
  • Validasi backend hanya after_or_equal:today → bisa submit untuk hari ini
  • Tidak ada pengecekan duplikat tanggal cuti per employee

Perubahan

1. Frontend — Fix Timezone (index.tsx)

  • Tambah helper function toLocalDateString() yang menggunakan getFullYear(), getMonth(), getDate() (local time) alih-alih toISOString() (UTC)
  • Ganti semua toISOString().split('T')[0]toLocalDateString(...)

2. Backend — Validasi Stricter (LeaveRequestRequest.php)

  • start_date: after_or_equal:todayafter:today (tidak bisa hari ini)
  • Tambah custom closure rule: cek apakah employee sudah punya leave request dengan start_date yang sama (exclude status cancelled dan record sendiri saat update)
  • Error message: "Anda sudah mengajukan cuti pada tanggal ini."

Cara Kerja

  1. User pilih tanggal 8 Agustus → DatePicker simpan sebagai Date object (local time)
  2. toLocalDateString() format sebagai "2026-08-08" tanpa konversi UTC
  3. Backend validasi: pastikan tanggal > hari ini + belum ada cuti di tanggal yang sama
  4. Service simpan ke DB dengan cast date:Y-m-d → tetap "2026-08-08"