36 lines
1.9 KiB
Markdown
36 lines
1.9 KiB
Markdown
# 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"`
|