1.9 KiB
1.9 KiB
Fix: Validasi Pengajuan Cuti & Timezone
Tujuan
Memperbaiki 3 masalah pada modul pengajuan cuti:
- Timezone bug — tanggal yang dipilih mundur 1 hari (user pilih 8, ke-save 7)
- Tidak bisa mengajukan cuti untuk hari ini
- 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 cutiapp/Http/Requests/Admin/HR/LeaveRequestRequest.php→ Validasi backendapp/Services/Admin/HR/LeaveRequestService.php→ Service logicapp/Models/LeaveRequest.php→ Model dengan castdate: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 menggunakangetFullYear(),getMonth(),getDate()(local time) alih-alihtoISOString()(UTC) - Ganti semua
toISOString().split('T')[0]→toLocalDateString(...)
2. Backend — Validasi Stricter (LeaveRequestRequest.php)
start_date:after_or_equal:today→after:today(tidak bisa hari ini)- Tambah custom closure rule: cek apakah employee sudah punya leave request dengan
start_dateyang sama (exclude statuscancelleddan record sendiri saat update) - Error message: "Anda sudah mengajukan cuti pada tanggal ini."
Cara Kerja
- User pilih tanggal 8 Agustus → DatePicker simpan sebagai
Dateobject (local time) toLocalDateString()format sebagai"2026-08-08"tanpa konversi UTC- Backend validasi: pastikan tanggal > hari ini + belum ada cuti di tanggal yang sama
- Service simpan ke DB dengan cast
date:Y-m-d→ tetap"2026-08-08"