# VRC (Vehicle Registration Certificate) Request — Implementation Plan

## Overview

Fitur VRC Request memungkinkan user memilih kendaraan berstatus `not registered` miliknya dan mengajukan permohonan registrasi ke petugas DOJ. Setelah di-accept petugas, `vehicle_user` otomatis diperbarui: status → `registered`, `expdate` → +30 hari, dan kolom `accept` diisi ID petugas.

---

## Hal yang Perlu User Review

> [!IMPORTANT]
> **Siapa yang bisa accept VRC?** — Diasumsikan petugas DOJ (table `users_doj`) yang accept melalui **panel DOJ terpisah**, bukan dari portal Loket ini. Dari sisi Loket, user hanya **create/view** request, tidak bisa self-accept.

> [!WARNING]
> **Batasan 1 VRC per kendaraan** — Satu kendaraan hanya boleh punya 1 VRC Request yang sedang `pending` pada satu waktu. Jika sudah ada yang pending, user tidak bisa submit lagi untuk kendaraan yang sama.

---

## Proposed Changes

### 1. Migration Baru — `vrc_request`

#### [NEW] `2026_04_10_vrc_request.php`

Kolom:
- `id`
- `vehicle_id` — FK ke `vehicle_user.id`
- `loket_user_id` — FK ke `users_loket.id` (pemilik, untuk query mudah)
- `application_no` — format `VRC-2026-0001`
- `accept` — FK ke `users_doj.id` (nullable, diisi saat petugas accept)
- `date` — tanggal pengajuan
- `status` — enum: `pending`, `approved`, `rejected`
- `timestamps`

---

### 2. Model Baru

#### [NEW] `VrcRequest.php`

Relasi:
- `belongsTo VehicleUser`
- `belongsTo LoketUser`

---

### 3. Controller Baru

#### [NEW] `VrcRequestController.php`

Method:
- `index()` — daftar semua VRC request milik user (untuk dashboard)
- `create()` — tampilkan form pilih kendaraan `not registered`
- `store()` — validasi (tidak boleh duplicate pending), generate `application_no`, simpan
- `show($id)` — detail request

> [!NOTE]
> Accept/approve ada di sisi DOJ panel — **bukan** di Loket. Loket hanya bisa lihat status.

---

### 4. Update `vehicle_user` (saat accept dari DOJ)

Ketika DOJ accept VRC, field di `vehicle_user`:
- `status` → `registered`
- `accept` → ID petugas DOJ
- `expdate` → `now() + 30 hari`

Ini akan diimplementasikan di logic accept (bisa dijalankan via command/webhook dari panel DOJ). Untuk sekarang, tambahkan **observer** atau **method helper** di model `VrcRequest`.

---

### 5. Routes

```php
// di dalam middleware 'profile'
Route::get('/forms/vrc', [VrcRequestController::class, 'create'])->name('vrc.create');
Route::post('/forms/vrc', [VrcRequestController::class, 'store'])->name('vrc.store');
Route::get('/forms/vrc/{id}', [VrcRequestController::class, 'show'])->name('vrc.show');
```

---

### 6. Views

#### [NEW] `resources/views/forms/vrc/create.blade.php`
- Tampilkan daftar kendaraan user yang `status = not registered`
- Pilih kendaraan (radio/card select)
- Preview info kendaraan setelah dipilih
- Info: application_no di-generate otomatis

#### [NEW] `resources/views/forms/vrc/show.blade.php`
- Detail VRC request
- Status badge
- Info kendaraan yang diajukan

---

### 7. Update Navbar & Dashboard

#### [MODIFY] `layouts/app.blade.php`
- Tambah link "VRC" di navbar menu

#### [MODIFY] `dashboard/index.blade.php`
- Tambah section VRC Requests di dashboard

#### [MODIFY] `DashboardController.php`
- Query VRC requests milik user
- Hitung total pending/approved/rejected

---

## Yang Kurang dari Sisi Loket (Rekomendasi)

| # | Hal | Prioritas |
|---|-----|-----------|
| 1 | **Notifikasi status** — user tidak tahu saat DOJ approve/reject | Tinggi |
| 2 | **Mencegah submit VRC duplikat** saat kendaraan sudah pending | Tinggi (akan diimplementasikan) |
| 3 | **VRC expiry warning** — notif H-7 sebelum expdate | Sedang |
| 4 | **Upload bukti pembayaran** — jika ada biaya registrasi | Opsional |
| 5 | **History VRC** — riwayat semua VRC (termasuk yang expired/rejected) | Sedang |

---

## Verification Plan

- Jalankan `php artisan migrate`
- Submit VRC dengan kendaraan `not registered` → cek application_no di-generate
- Submit VRC ke-2 untuk kendaraan sama → harus ditolak dengan error
- Cek dashboard menampilkan VRC requests
