# 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"`
