# PRD.md --- Laravel 12 Product Requirements Document

## 0. Project Metadata

-   Project name: `MY HUB Web App`
-   Description: `Web platform & lifestyle hub untuk reservasi perawatan kendaraan (Car & Motorcycle Wash/Detailing) serta digital self-ordering Restaurant & Café di Mataram.`
-   Type: `WEBSITE / BOOKING / WEB APP`
-   Business: `MY HUB Mataram`
-   Primary language: `id (Bahasa Indonesia)`
-   Secondary language: `en (English - Optional/Secondary)`
-   Target market: `Pengendara kendaraan bermotor, keluarga, komunitas otomotif, profesional muda, dan mahasiswa di Mataram, Lombok.`
-   Domain: `myhubmataram.com`
-   Laravel: `12`
-   PHP: `8.3 / 8.4`
-   Database: `MySQL`
-   Frontend: `Blade + Alpine.js (atau Livewire 3)`
-   CSS: `Tailwind CSS`
-   JavaScript: `Alpine.js`

## 1. Product Overview

### What is the product?
Platform digital terintegrasi untuk **MY HUB Mataram**, yang menggabungkan:
1. Profil & landing page gaya hidup modern (Wash, Dine, Relax & Connect).
2. Sistem booking online antrean cuci mobil/motor terencana dengan kuota stall (bay) dinamis.
3. Sistem self-order menu restoran & kafe via scan QR code meja tanpa repot login dan bayar di kasir/meja di akhir.

### What problem does it solve?
- Menghilangkan kebosanan dan ketidakpastian antrean panjang cuci kendaraan konvensional.
- Mengurangi beban antrean kasir resto saat jam sibuk dan mempercepat proses pesan menu pelanggan di meja.
- Membantu manajemen MY HUB mengatur kapasitas stall cuci secara fleksibel tanpa overload antrean.

### Value proposition
Satu platform untuk merawat kendaraan sambil menikmati hidangan kafe, bersantai di taman/indoor ber-AC, dan menikmati hiburan live music tanpa khawatir waktu terbuang sia-sia.

### Core product promise
> "Clean Ride. Great Food. Good Vibes — Semua kebutuhan perawatan kendaraan dan relaksasi kuliner dalam satu genggaman praktis."

## 2. Goals

### Primary Goals
1. Memfasilitasi reservasi slot waktu cuci kendaraan secara online guna meminimalisir penumpukan fisik di lokasi.
2. Memudahkan pelanggan kafe memesan makanan/minuman langsung dari meja menggunakan smartphone tanpa aplikasi tambahan.
3. Mengintegrasikan pencatatan kasir dan dapur secara terstruktur.

### Business Goals
- Meningkatkan retensi pelanggan kafe dengan mengonversi pengunjung car wash menjadi pengunjung resto.
- Menekan tingkat pembatalan (*no-show*) cuci mobil dengan pencatatan data identitas pengguna.
- Memudahkan pemilik bisnis mengatur kapasitas stall aktif sesuai kondisi riil di lapangan.

### Technical Goals
- Sistem ringan, cepat diakses lewat smartphone (*mobile-first*), dengan beban autentikasi rendah (akses menu tanpa login).
- Arsitektur kuota slot jam cuci yang modular dan tahan terhadap benturan jadwal (*race condition/overbooking*).

## 3. Non-Goals
- **Payment Gateway Otomatis:** Tidak mengintegrasikan Midtrans/Xendit/kartu kredit di MVP (semua pembayaran cash/QRIS statis diselesaikan di kasir/meja).
- **QR Code Terenkripsi Dinamis per Meja:** Tidak membuat token URL khusus untuk setiap meja; meja diinput manual via dropdown oleh pelanggan.
- **Aplikasi Mobile Native:** Tidak membangun aplikasi iOS/Android (fokus penuh pada PWA/Responsive Web).

## 4. Target Users

### Customer Car Wash
- **Description:** Pemilik mobil/motor yang membutuhkan kepastian jadwal cuci dan detailing tanpa menunggu lama dalam mobil.
- **Needs:** Memilih paket cuci, memilih slot jam kedatangan, mendapatkan estimasi harga dan kode booking.
- **Pain points:** Malas antre berjam-jam tanpa kejelasan estimasi pengerjaan.

### Customer Resto & Café
- **Description:** Pengunjung kafe (baik yang sedang cuci mobil maupun yang murni nongkrong/bekerja/makan).
- **Needs:** Melihat daftar menu lengkap, foto, harga, dan memesan langsung tanpa menunggu waiter datang mencatat.
- **Pain points:** Waiter lama datang saat jam ramai, salah catat pesanan.

### Staff / Kasir & Dapur
- **Description:** Tim operasional di lokasi MY HUB Mataram.
- **Needs:** Melihat order cuci masuk, memverifikasi kode booking, dan menerima pesanan meja dapur secara real-time.
- **Pain points:** Miskomunikasi antara kasir, pencuci mobil, dan bagian dapur.

### Admin / Owner
- **Description:** Pemilik dan manajer operasional MY HUB.
- **Needs:** Mengatur ketersediaan jumlah stall (bay) cuci, mengubah status ketersediaan menu resto, dan rekap transaksi harian.

## 5. Roles & Permissions

| Role | Description | Main Permissions |
| :--- | :--- | :--- |
| **Guest** | Pengunjung publik belum login | Melihat landing page, daftar menu, melakukan scan & order resto (tanpa login). |
| **Customer** | Pengguna terdaftar dan terotentikasi | Melakukan booking car wash, melihat riwayat booking, menyimpan data profil/kendaraan. |
| **Staff / Cashier** | Staf car wash & kasir kafe | Verifikasi booking code, konfirmasi bayar pesanan resto, update status cuci/pesanan. |
| **Admin** | Manajer & Pemilik sistem | Mengatur bay capacity, kelola user, menu, paket cuci, laporan penjualan, setting jam buka. |

## 6. Core Features

### Feature 1 --- Landing Page & Informasi MY HUB
- **Purpose:** Menampilkan profil bisnis, fasilitas lengkap (mushola, ruang AC, outdoor garden, parkir), dan jadwal live music.
- **User can:** Menjelajahi informasi, melihat lokasi via Google Maps, dan menekan CTA *Booking Cuci* atau *Order Kafe*.
- **Business rules:** jam operasional bisa diubah sewaktu-waktu oleh Admin.
- **Acceptance criteria:** Tampilan mobile-friendly, loading di bawah 2 detik, peta dan tombol kontak/WA berfungsi.

### Feature 2 --- Dynamic Car Wash Booking (Perlu Login)
- **Purpose:** Mengatur jadwal reservasi cuci kendaraan agar tidak terjadi antrean menumpuk.
- **User can:**
  - Login/Register akun.
  - Memilih jenis kendaraan (Mobil/Motor) & tipe ukuran (Small, Medium, Large).
  - Memilih paket (Cuci reguler, Detailing, Polishing, Interior, dll.).
  - Memilih tanggal dan slot jam kedatangan yang tersedia.
  - Menginput nomor plat kendaraan.
  - Menerima ringkasan rincian biaya dan **Kode Booking** (misal: `HUB-2609-001`).
- **Business rules:**
  - Pelanggan hanya bisa memilih slot jam yang sisa kapasitasnya $> 0$.
  - Batas maksimal booking harian dibatasi sesuai konfigurasi Admin.
- **Acceptance criteria:** Validasi ketersediaan slot terjadi di level database sehingga tidak terjadi overbooking pada jam yang sama.

### Feature 3 --- Dynamic Bay / Stall Capacity Management (Admin)
- **Purpose:** Memungkinkan Admin/Kasir menambah atau mengurangi jumlah kapasitas stall cuci yang aktif secara mandiri.
- **User can (Admin):**
  - Mengubah angka kapasitas bay mobil (misal: dari 3 menjadi 4 stall).
  - Mengubah angka kapasitas bay motor (misal: 2 stall).
  - Mengubah status operasional slot waktu (buka/tutup darurat).
- **Business rules:** Perubahan kapasitas hanya berlaku untuk perhitungan slot pemesanan baru dan tidak merusak booking yang sudah terdaftar.
- **Acceptance criteria:** Ketika kapasitas diubah dari 3 ke 2, jika pada jam tertentu sudah ada 2 booking, jam tersebut langsung berstatus *Penuh*.

### Feature 4 --- Café Digital Self-Order (Tanpa Login + Dropdown Meja)
- **Purpose:** Memudahkan pemesanan makanan/minuman langsung dari meja tanpa harus login/registrasi.
- **User can:**
  - Scan QR statis di meja menuju `/order` atau `/menu`.
  - Melihat katalog menu berdasarkan kategori (Makanan, Minuman, Snack, Signature).
  - Menambahkan item ke keranjang dan memberi catatan per item (*less sugar, pedas*, dll).
  - Memilih **Nomor Meja** via dropdown list (Meja 01 s/d Meja XX).
  - Mengisi Nama Pemesan.
  - Menekan tombol *Kirim Pesanan*.
- **Business rules:**
  - Tidak memerlukan login akun pelanggan.
  - Harga yang dicatat adalah harga saat pesanan disubmit.
  - Status pesanan dimulai dari `Pending` $\rightarrow$ `Diproses` $\rightarrow$ `Selesai` $\rightarrow$ `Paid`.
- **Acceptance criteria:** Pesanan langsung masuk ke daftar pesanan kasir/dapur dengan indikasi nomor meja yang jelas.

### Feature 5 --- Order & Queue Monitoring Dashboard (Staff/Kasir)
- **Purpose:** Antarmuka operasional staf untuk mengontrol antrean cuci dan pesanan kafe.
- **User can (Staff):**
  - Memeriksa keabsahan kode booking saat kendaraan tiba.
  - Memperbarui status cuci: `Menunggu` $\rightarrow$ `Dikerjakan` $\rightarrow$ `Selesai`.
  - Melihat pesanan meja masuk dan mencetak/menandai pesanan telah diantar.
  - Melakukan penyelesaian transaksi (menandai tagihan Lunas / Bayar di Tempat).
- **Acceptance criteria:** UI ringkas dan mudah dioperasikan via tablet atau laptop kasir.

## 7. User Journey

### Alur 1: Cuci Mobil / Motor (Dengan Reservasi Online)
``` text
[Akses Web MY HUB]
   ↓
[Pilih Cuci Mobil / Motor]
   ↓
[Login / Daftar Akun Cepat]
   ↓
[Input Plat, Pilih Paket Cuci, Tanggal, & Jam Slot]
   ↓
[Sistem Konfirmasi & Terbitkan Kode Booking (HUB-XXXX)]
   ↓
[Pelanggan Datang ke MY HUB Mataram sesuai Jam]
   ↓
[Tunjukkan Kode Booking ke Kasir/Staf]
   ↓
[Mobil Dicuci; Pelanggan Menuju Resto & Kafe]
   ↓
[Selesai Cuci & Bayar di Kasir]

Alur 2: Pesan Makanan & Minuman di Kafe (Scan Meja)
[Pelanggan Duduk di Meja Kafe]
   ↓
[Scan QR Code Statis di Meja]
   ↓
[Buka Halaman Menu (Tanpa Login)]
   ↓
[Pilih Makanan / Minuman & Masuk Keranjang]
   ↓
[Pilih Nomor Meja dari Dropdown & Masukkan Nama]
   ↓
[Klik Submit Order]
   ↓
[Staf Dapur Menyiapkan & Waiter Mengantar ke Meja]
   ↓
[Waiter Memberikan Struk Fisik & Pelanggan Bayar di Tempat/Kasir]
```

Alternative journeys: - error/recovery - cancellation - rescheduling -
failed transaction - permission denied

## 8. Authentication

Required: PARTIAL

Car Wash Booking: Wajib Login / Register (Nama, No. WhatsApp, Email, Password).

Resto & Café Order: Tanpa Login (Tamu umum bisa langsung pesan).

Staf & Admin: Login multi-auth Laravel standar dengan session/guard terpisah.

Requirements:

Login & Registrasi Pelanggan sederhana.

Logout.

Reset Password via Email/WA token.

Edit Profil & No. Telepon.

Requirements: - registration - login - logout - password reset - email
verification - profile

Remove unnecessary items.

## 9. Authorization

Describe access rules: - 
Guest: Akses halaman publik, katalog menu, submit order resto meja.

Customer: Akses riwayat booking cuci milik sendiri, edit profil sendiri.

Staff: Akses halaman antrean cuci hari ini, order resto aktif, konfirmasi pembayaran.

Admin: Akses penuh ke master data menu, paket layanan, bay capacity settings, user management, dan rekapan laporan.

Example:

``` text
Customer → own records
Staff → permitted operational records
Admin → administrative records
```

## 10. Main Pages

Public
/ --- Landing Page utama (About, Facilities, Live Music, Google Maps Mataram).

/services --- Daftar harga & paket car/motorcycle care.

/menu atau /order --- Halaman pemesanan resto & kafe (Menu katalog + Keranjang + Pilih Meja).

/login & /register --- Autentikasi pelanggan.

Customer (Auth Required)
/customer/booking --- Form booking cuci kendaraan & pemilihan slot jam.

/customer/my-bookings --- Daftar riwayat dan status booking aktif / selesai.

/customer/profile --- Pengaturan profil pelanggan.

Staff / Operational
/staff/carwash-queue --- Dashboard pemantauan antrean fisik cuci kendaraan hari ini.

/staff/kitchen-orders --- Tampilan pesanan dapur dan status meja kafe.

/staff/cashier --- Kasir untuk pelunasan tagihan cuci dan resto.

Admin
/admin/dashboard --- Metrik ringkasan transaksi & performa.

/admin/settings/bays --- Pengaturan jumlah kapasitas stall/bay aktif mobil & motor.

/admin/services --- Kelola paket layanan cuci & harga.

/admin/menu --- Kelola makanan/minuman kafe (tambah, edit, stok habis/ready).

/admin/tables --- Kelola daftar nomor meja aktif.



Design personality: MODERN / FRESH / WELCOMING / ENERGETIC

Should feel:

Bersih, dinamis, mudah dipahami dalam 3 detik, ramah pengguna mobile.

Memberikan nuansa hangout place yang asri dan berkelas namun terjangkau.

Should not feel:

Kaku seperti bengkel reparasi tradisional atau kotor.

Terlalu rumit dengan langkah checkout yang panjang (cluttered).

Visual direction:

Primary colors: Emerald / Forest Green dipadu Deep Charcoal / Slate (mencerminkan suasana hijau rindang & modern otomotif).

Accent: Warm Amber / Gold (memberikan kesan hangat kafe & live music).

Typography: Sans-serif modern dan bersih (misal: Plus Jakarta Sans / Inter).

Imagery: Foto area outdoor taman, mobil bersih mengilap, kopi & makanan estetis, panggung live music santai.

Avoid:

Tombol checkout tersembunyi.

Form pengisian yang terlalu panjang.

Pop-up yang mengganggu saat pelanggan membuka menu makanan.

12. Responsive Design
Required:

360px (Small Android viewport)

390px (Standard iPhone)

768px (iPad / Tablet Kasir)

1024px & Desktop (Admin & Staff Monitor)

Mobile requirements:

Menu pemesanan resto wajib memiliki Sticky Bottom Bar yang menampilkan jumlah item dan total biaya keranjang.

Tombol aksi utama (CTA) dapat dijangkau mudah oleh jempol (thumb-friendly zone).

## 13. Database Requirements

### Main Entities

Main Entities
users

tables

bay_settings

vehicle_categories

wash_services

carwash_bookings

menu_categories

menu_items

cafe_orders

cafe_order_items

### Relationships

``` text
[bay_settings] (Konfigurasi global kapasitas per kategori)

[users] 
  │
  └──< [carwash_bookings] >── [wash_services]

[tables]
  │
  └──< [cafe_orders]
         │
         └──< [cafe_order_items] >── [menu_items]
```

### Entity Detail

Entity Detail
bay_settings
id: PK, Auto Increment

vehicle_category: Enum/Varchar (mobil, motor)

total_bays: Integer (Kapasitas aktif yang bisa diubah admin)

slot_interval_minutes: Integer (default: 60)

is_active: Boolean

carwash_bookings
id: PK, Auto Increment

booking_code: Varchar(20), Unique (Indexed)

user_id: FK ke users

wash_service_id: FK ke wash_services

plate_number: Varchar(15)

booking_date: Date

booking_time: Time

estimated_price: Decimal(12,2)

status: Enum (PENDING, IN_PROGRESS, DONE, CANCELLED)

payment_status: Enum (UNPAID, PAID)

tables
id: PK, Auto Increment

table_number: Varchar(10), Unique (contoh: "Meja 01", "Outdoor 03")

area: Enum (INDOOR, OUTDOOR)

is_active: Boolean (default: true)

cafe_orders
id: PK, Auto Increment

order_code: Varchar(20), Unique

table_id: FK ke tables

customer_name: Varchar(100)

customer_phone: Varchar(20), Nullable

total_amount: Decimal(12,2)

notes: Text, Nullable

status: Enum (PENDING, PREPARING, SERVED, COMPLETED, CANCELLED)

payment_status: Enum (UNPAID, PAID)

linked_booking_code: Varchar(20), Nullable (jika ingin gabung billing cuci)

## 14. Status & Lifecycle

If applicable:
Siklus Cuci Kendaraan (Carwash Booking)
Plaintext
PENDING (Booking Dibuat di Web)
  ↓
IN_PROGRESS (Pelanggan Tiba & Kendaraan Masuk Stall)
  ↓
DONE (Selesai Dicuci/Detailing)
(Status alternatif: CANCELLED jika pelanggan tidak datang/batal).

Allowed transitions: - `[STATUS] → [STATUS]`

Forbidden transitions: - `[STATUS] → [STATUS]`

## 15. Payments

Required: YES

Method: Manual / Bayar di Tempat (Cash, Transfer Bank Langsung, QRIS Statis di Kasir)

Provider: NONE (Tanpa payment gateway pihak ketiga di MVP)

Rules:

Semua pesanan resto dan booking cuci otomatis berstatus payment UNPAID ketika dibuat.

Kasir/Staff yang bertugas mengubah status menjadi PAID setelah uang fisik atau bukti scan QRIS manual diterima di kasir.

Payment statuses:

UNPAID

PAID

Keep payment status separate from business/order status.

## 16. Notifications

Customer: Halaman sukses booking menampilkan kode unik dan instruksi kedatangan.

Staff / Dapur: Tampilan dashboard kasir/dapur melakukan auto-refresh / polling berkala (Livewire polling atau SSE) untuk memunculkan suara/tanda pesanan baru.

## 17. Search & Filtering

Admin/Staff Booking:

Search: Nomor Plat, Kode Booking, Nama Pelanggan.

Filter: Tanggal kunjungan, Status booking, Jenis kendaraan.

Menu Kafe (Customer):

Filter: Kategori (Makanan Berat, Coffee, Non-Coffee, Snack).

Search: Nama menu.

## 18. File Uploads

Required: YES

Types: jpg, jpeg, png, webp

Maximum size: 50MB per file

Storage: public/storage

Use case: Foto katalog menu makanan/minuman, banner promosi live music di landing page.

## 19. API Requirements

API required: NO

Tidak ada API eksternal yang diwajibkan untuk MVP. Seluruh fungsionalitas menggunakan server-rendered Blade + Alpine.js / Livewire 3 bawaan Laravel 12.

If no API is required: \> No API is required for the MVP. Use Laravel
server-rendered functionality where appropriate.

## 20. External Integrations

  Integration   Purpose       Required
  ------------- ------------- ------------
 Google Maps Embed	Menampilkan titik lokasi fisik MY HUB di Mataram	YES
 WhatsApp URL Scheme	Tombol bantuan cepat langsung ke admin via chat WA	YES

Never put real credentials or secrets here.

## 21. Business Rules

Locking Slot Kapasitas Cuci: Pengecekan ketersediaan stall car wash dihitung berdasarkan:$$\text{Slot Tersedia} = \text{Total Bays Aktif} - \sum(\text{Booking Aktif pada Tanggal \& Jam Tersebut})$$Jika hasil $\le 0$, slot ditutup untuk pemesanan baru.Tanpa Pembatalan Mandiri Menit Terakhir: Pelanggan tidak dapat membatalkan booking di sistem kurang dari 1 jam sebelum jadwal, wajib konfirmasi via WhatsApp kasir.Validasi Meja Resto: Pilihan nomor meja pada form order resto harus berasal dari ID meja yang valid dan berstatus aktif di database.Pencegahan Double-Submit: Tombol submit order kafe dan booking cuci otomatis terkunci (disabled) saat diklik pertama kali untuk mencegah pesanan ganda.

All important rules must be enforced server-side.

## 22. Security

Proteksi CSRF di seluruh form request Laravel.

Input validation & sanitize ketat pada nomor meja dan catatan makanan.

Rate limiting pada form pemesanan makanan publik untuk mencegah bot spam order.

Password hashing menggunakan bcrypt / argon2id bawaan Laravel 12.

Role-based middleware untuk mengunci rute /admin dan /staff.

## 23. SEO

SEO required: YES (Untuk halaman publik/landing page).

Meta Title: MY HUB Mataram | Car Wash, Detailing, Café & Live Music

Meta Description: Destinasi modern di Mataram: rawat kendaraan Anda dengan layanan cuci & detailing profesional sambil menikmati kopi, makanan lezat, dan live music santai.

Target Keywords: car wash mataram, cuci mobil mataram, kafe mataram, detailing mobil lombok, tempat nongkrong mataram, my hub mataram.

Open Graph tags untuk preview menarik saat link dibagikan ke WhatsApp dan Instagram.

## 24. Performance

Halaman katalog menu kafe harus ter-render di browser ponsel dalam waktu $< 1.5$ detik.Penggunaan eager loading (with('items')) pada query pesanan untuk mencegah masalah $N+1$.Kompresi gambar menu (WebP) agar hemat kuota pengunjung saat membuka menu via seluler.

## 25. Reporting & Analytics

Required: YES (Sederhana untuk Admin)

Rekap jumlah kendaraan dicuci per hari/minggu.

Rekap menu resto terlaris (best-seller).

Total omzet harian (Car wash vs Kafe) berdasarkan pesanan berstatus PAID.
## 26. Audit & History

Pencatatan tanggal dan jam tiap status berubah (booking_created_at, wash_started_at, wash_completed_at).

Pencatatan nama staf yang melayani pelunasan di kasir.

## 27. MVP Scope

### Must Have

-   Landing page lengkap profil MY HUB Mataram (Services, Fasilitas, Live Music, Google Maps).Fitur registrasi/login pelanggan cuci kendaraan.Form booking antrean cuci mobil/motor + generator kode booking.Panel admin pengubah jumlah kapasitas stall (Bay Management).Katalog menu kafe via web + form order dengan dropdown nomor meja (tanpa login).Dashboard kasir/staf untuk update status antrean cuci & pesanan meja kafe.Sistem pembayaran manual (Bayar di Tempat / Unpaid $\rightarrow$ Paid).

### Nice to Have

-   Integrasi WhatsApp gateway otomatis (Fonnte) untuk mengirim bukti kode booking.

Fitur "Gabung Tagihan" antara car wash dan meja kafe ke dalam 1 struk kasir.

Status tracker pengerjaan mobil real-time yang bisa dilihat pelanggan dari meja kafe.

### Out of Scope

-   Pembayaran kartu kredit / e-wallet otomatis (Payment Gateway).

Reservasi booking meja kafe (meja murni first-come, first-served).

Sistem delivery / pesan antar keluar lokasi.

## 28. Future Versions

V2
Integrasi Payment Gateway (QRIS dinamis otomatis terverifikasi).

Notifikasi WhatsApp otomatis ke pelanggan saat kendaraan selesai dicuci.

Fitur loyalty poin membership (setiap 5x cuci gratis 1x kopi).

V3
Booking meja VIP / area rapat untuk acara komunitas.

Inventory control stok bahan baku kafe dan shampoo/wax car wash.

## 29. Acceptance Criteria

The MVP is successful when:
MVP dinyatakan selesai dan sukses apabila:

Pengguna dapat mendaftar, memilih paket cuci mobil, memilih jam yang masih tersedia, dan mendapatkan kode booking resmi.

Ketika kuota stall pada jam tertentu penuh, sistem secara otomatis menolak/mengunci slot jam tersebut.

Admin dapat mengubah kapasitas stall mobil dari dashboard dan perubahannya langsung berdampak pada ketersediaan slot di sisi pelanggan.

Pengunjung kafe dapat memesan makanan dari smartphone tanpa login, memilih nomor meja, dan pesanan tampil di layar kasir/staf dengan status belum bayar.

Kasir dapat memverifikasi kode booking serta menyelesaikan pembayaran kedua layanan di kasir.

## 30. Development Phases

### Phase 0 --- Discovery

-   inspect project
-   read PRD
-   architecture plan
-   identify ambiguities

### Phase 1 --- Foundation

-   configuration
-   authentication
-   roles
-   base database
-   authorization

### Phase 2 --- Core Data

-   migrations
-   models
-   relationships
-   seeders

### Phase 3 --- Core Feature

-   `[FEATURE]`

### Phase 4 --- Operations

-   admin
-   staff
-   workflows

### Phase 5 --- Integrations

-   `[INTEGRATION]`

### Phase 6 --- UI Polish

-   responsive design
-   accessibility
-   visual refinement
-   SEO

### Phase 7 --- Testing

-   feature tests
-   unit tests
-   authorization tests
-   edge cases

### Phase 8 --- Production Readiness

-   environment configuration
-   caching
-   queues
-   storage
-   backups
-   monitoring
-   security review

## 31. Open Questions

Berapa jumlah nomor meja fisik yang akan dipasang stiker QR di kafe pada tahap awal?

Apakah jam operasional car wash dan kafe berbeda (misal: cuci buka 08.00–18.00, kafe buka 08.00–22.00)?

Do not invent answers without confirmation.

## 32. Definition of Done

The product is ready when: - MVP acceptance criteria pass - important
business logic is tested - authorization is verified - validation is
implemented - mobile and desktop interfaces work - important error/empty
states exist - production security is reviewed - environment variables
are documented - no secrets are committed - migrations work from a clean
database - production build succeeds - known issues are documented
