# 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:today` → `after: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"`