# SUBS UAT Checklist

## Prasyarat

- Pastikan `php artisan queue:listen --tries=1` sedang berjalan.
- Pastikan `MAIL_*` dalam `.env` betul.
- Jika mahu data demo cepat, jalankan:
  - `php artisan db:seed --class=SubsUatSeeder`
- Pastikan ada sekurang-kurangnya:
  - satu `Site`
  - satu `Season Pass Package`
  - satu user role `SPV`
  - satu user role `AO`
  - satu user role `Customer`
- Pastikan `Billing Settings` sudah diisi.

## Akaun Demo UAT

- `subs.admin@example.com` / `Password123!`
- `subs.ao@example.com` / `Password123!`
- `subs.ae@example.com` / `Password123!`
- `subs.spv@example.com` / `Password123!`
- `subs.customer@example.com` / `Password123!`

## UAT 1: Customer Register

1. Buka `Register User`.
2. Daftar satu akaun customer baru.
3. Cuba login terus.

Expected:
- login disekat
- mesej `pending approval` dipaparkan

## UAT 2: SPV / Admin Approve Customer

1. Login sebagai `SPV` atau `Admin`.
2. Buka `Users`.
3. Cari customer tadi.
4. Klik `Approve`.

Expected:
- status approval jadi `Approved`
- customer boleh login selepas itu

## UAT 3: AO/Admin Setup Master Data

1. Login sebagai `AO` atau `Admin`.
2. Buka `Season Pass Packages`.
3. Tambah package baru jika belum ada.
4. Buka `Billing Settings`.
5. Isi:
   - `Monthly Invoice Generate Day`
   - `Invoice Due Day`
   - `E-Invoice Request Window (Days)`

Expected:
- package berjaya disimpan
- billing settings berjaya disimpan

## UAT 4: SPV Create Subscription

1. Login sebagai `SPV`.
2. Buka `Subscriptions`.
3. Klik `Add Subscription`.
4. Isi:
   - customer
   - site
   - package
   - commencement month
   - monthly amount
   - car plate
5. Save.

Expected:
- subscription status = `pending`

## UAT 5: AO Approve Subscription

1. Login sebagai `AO`.
2. Buka `Subscriptions`.
3. Cari subscription `pending`.
4. Klik `Approve`.

Expected:
- status jadi `approved`

## UAT 6: AO Generate First Invoice

1. Masih di `Subscriptions`.
2. Klik `Generate Invoice`.

Expected:
- satu invoice baru diwujudkan dalam sistem
- status invoice = `Unpaid`
- customer email menerima `Renewal Invoice`

## UAT 7: Check Invoice In Customer Portal

1. Login sebagai `Customer`.
2. Buka `My Invoices`.

Expected:
- invoice baru dipaparkan
- `Invoice Status = Unpaid`
- `Request Window` belum dibuka

## UAT 8: SPV Mark Paid

1. Login sebagai `SPV` atau `AO`.
2. Buka `E-Invoice Requests`.
3. Cari invoice berkaitan.
4. Klik `Mark Paid`.

Expected:
- `Invoice Status = Paid`
- receipt PDF dijana
- customer email menerima `Payment Receipt`
- email minta customer request e-invoice dalam tempoh yang dibenarkan

## UAT 9: Customer Request E-Invoice

1. Login sebagai `Customer`.
2. Buka `My Invoices`.
3. Cari invoice `Paid`.
4. Klik `Request E-Invoice`.

Expected:
- `Request Window = Requested`
- action button hilang
- rekod masuk ke queue semakan `AO/Admin`

## UAT 10: AO Submit To LHDN

1. Login sebagai `AO`.
2. Buka `E-Invoice Requests`.
3. Cari rekod customer yang baru request.
4. Klik `Approve & Submit LHDN`.

Expected:
- rekod bergerak ke `E-Invoice Submissions`
- `lhdn_uuid` diwujudkan jika berjaya
- status jadi `waiting_validation` atau `validated`

## UAT 11: Validated E-Invoice

1. Buka `E-Invoice Submissions`.
2. Semak rekod yang sudah `validated`.
3. Klik `Preview`.
4. Klik `Download PDF`.

Expected:
- QR LHDN muncul
- PDF berjaya dibuka
- email e-invoice dihantar jika flow auto-email aktif

## UAT 12: Auto Cancel Overdue Invoice

1. Guna satu invoice test yang `Unpaid`.
2. Set `due_date` ke tarikh semalam.
3. Jalankan:
   - `php artisan invoices:auto-cancel-overdue`

Expected:
- `Invoice Status = Cancelled`
- `E-Invoice Status = Cancelled`

## UAT 13: Renewal Invoice Automation

1. Pastikan subscription status `active`.
2. Set `next_invoice_date` kepada hari ini.
3. Jalankan:
   - `php artisan subscriptions:generate-renewals`

Expected:
- invoice renewal baru dijana
- email renewal invoice dihantar

## Semakan Email

Semak tiga jenis email:

- `Renewal Invoice`
- `Payment Receipt`
- `E-Invoice Ready`

Expected:
- subject betul
- attachment PDF ada
- nombor invoice betul
- site / customer / amount betul

## Semakan Akhir

- role `SPV` tidak boleh submit LHDN
- role `AE` view only
- role `AO` boleh approve subscription, edit invoice data, submit LHDN
- role `Admin` full access
- consolidated hanya ambil invoice `paid` yang layak
