# PRODUCT REQUIREMENTS DOCUMENT
## Aplikasi Pemesanan Tiket Bus & Manajemen Keluhan Pelanggan
### Progressive Web App (PWA) — Mobile First

---

| Atribut | Detail |
|---|---|
| **Nama Produk** | BusGo — Bus Ticketing & Complaint App |
| **Versi Dokumen** | v1.0 |
| **Tanggal** | Juni 2026 |
| **Platform** | Progressive Web App (PWA) |
| **Status** | Draft |

---

## Daftar Isi

1. [Ringkasan Eksekutif](#1-ringkasan-eksekutif)
2. [Informasi Produk](#2-informasi-produk)
3. [Tujuan Produk](#3-tujuan-produk)
4. [Pengguna (User Roles)](#4-pengguna-user-roles)
5. [Persyaratan Fungsional](#5-persyaratan-fungsional)
   - 5.1 [Fitur Admin](#51-fitur-admin)
   - 5.2 [Fitur Pelanggan](#52-fitur-pelanggan)
6. [Arsitektur Navigasi (UI/UX)](#6-arsitektur-navigasi-uiux)
7. [Persyaratan Non-Fungsional](#7-persyaratan-non-fungsional)
8. [Alur Bisnis Utama](#8-alur-bisnis-utama)
9. [Aturan Bisnis (Business Rules)](#9-aturan-bisnis-business-rules)
10. [Struktur Database](#10-struktur-database-ringkasan)
11. [Stack Teknologi](#11-stack-teknologi)
12. [Asumsi & Dependensi](#12-asumsi--dependensi)
13. [Kriteria Penerimaan](#13-kriteria-penerimaan-acceptance-criteria)
14. [Riwayat Revisi Dokumen](#14-riwayat-revisi-dokumen)

---

## 1. Ringkasan Eksekutif

Dokumen ini merupakan Product Requirements Document (PRD) untuk pengembangan aplikasi web berbasis Progressive Web App (PWA) yang dirancang khusus untuk layanan pemesanan tiket bus dan manajemen keluhan pelanggan. Aplikasi ini menggunakan tampilan mobile-first dengan navigasi berbentuk bottom navbar layaknya aplikasi mobile native.

Aplikasi ini memiliki dua peran pengguna utama: **Admin** dan **Pelanggan**. Admin bertanggung jawab mengelola operasional bus, rute, harga, serta memantau pesanan dan keluhan. Pelanggan dapat memesan tiket secara online, memilih kursi, mengisi data diri, melakukan pembayaran, hingga mengajukan keluhan terhadap layanan yang telah dinikmati.

Dengan pendekatan PWA, aplikasi ini dapat diakses melalui browser tanpa perlu instalasi dari app store, namun tetap memberikan pengalaman pengguna seperti aplikasi mobile native, termasuk kemampuan offline dan installable pada perangkat pengguna.

---

## 2. Informasi Produk

| Atribut | Detail |
|---|---|
| **Nama Produk** | BusGo — Bus Ticketing & Complaint App |
| **Jenis Aplikasi** | Progressive Web App (PWA) |
| **Platform Target** | Mobile Browser (iOS & Android), Desktop Browser |
| **Desain Tampilan** | Mobile First — Bottom Navbar Navigation |
| **Teknologi** | Laravel 12, MySQL, Bootstrap 5, PWA (manifest.json + Service Worker) |
| **Pengguna** | Admin, Pelanggan (Customer) |
| **Bahasa** | Bahasa Indonesia |

---

## 3. Tujuan Produk

### 3.1 Tujuan Bisnis

- Menyediakan platform digital untuk pemesanan tiket bus secara online yang efisien dan mudah digunakan.
- Mengurangi antrean fisik dan mempercepat proses pemesanan tiket.
- Menyediakan kanal resmi untuk pelanggan menyampaikan keluhan terkait layanan bus.
- Memberikan data dan analitik kepada admin untuk pengambilan keputusan operasional.
- Meningkatkan kepuasan pelanggan melalui transparansi informasi dan responsivitas terhadap keluhan.

### 3.2 Tujuan Pengguna

- Pelanggan dapat memesan tiket bus kapan saja dan di mana saja tanpa harus datang ke loket.
- Pelanggan dapat memilih kursi sesuai preferensi dari 36 kursi yang tersedia per bus.
- Pelanggan dapat mengajukan keluhan dengan mudah melalui e-tiket yang dimiliki.
- Admin dapat memantau seluruh aktivitas pemesanan dan keluhan dalam satu dashboard terpusat.

---

## 4. Pengguna (User Roles)

| Role | Nama Peran | Deskripsi |
|---|---|---|
| R-01 | **Admin** | Pengelola sistem yang bertanggung jawab atas konfigurasi rute, harga, pemantauan pemesanan, dan penanganan keluhan pelanggan. |
| R-02 | **Pelanggan** | Pengguna akhir yang melakukan registrasi, pemesanan tiket bus, pemilihan kursi, pembayaran, dan pengajuan keluhan. |

---

## 5. Persyaratan Fungsional

### 5.1 Fitur Admin

#### 5.1.1 Dashboard Admin

Halaman utama admin yang menampilkan ringkasan operasional dalam bentuk grafik dan statistik.

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-ADM-01 | Dashboard Overview | Menampilkan total pemesanan hari ini, total pendapatan, jumlah pelanggan aktif, dan jumlah keluhan yang belum ditangani dalam bentuk kartu statistik (summary cards). | 🔴 Tinggi |
| F-ADM-02 | Grafik Pemesanan | Menampilkan grafik batang (bar chart) jumlah pemesanan tiket per hari/minggu/bulan yang dapat difilter berdasarkan periode waktu. | 🔴 Tinggi |
| F-ADM-03 | Grafik Pendapatan | Menampilkan grafik garis (line chart) total pendapatan per periode waktu. | 🔴 Tinggi |
| F-ADM-04 | Grafik Keluhan | Menampilkan grafik donat (donut chart) distribusi status keluhan (pending, diproses, selesai). | 🟡 Sedang |
| F-ADM-05 | Rute Terpopuler | Menampilkan daftar rute bus dengan jumlah pemesanan terbanyak. | 🟡 Sedang |

#### 5.1.2 Manajemen Rute & Harga

Admin dapat membuat, mengubah, dan menghapus rute perjalanan bus beserta harga tiketnya.

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-ADM-06 | Daftar Rute | Menampilkan semua rute bus yang tersedia dalam tabel dengan informasi kota asal, kota tujuan, harga, dan status aktif/nonaktif. | 🔴 Tinggi |
| F-ADM-07 | Tambah Rute | Form untuk membuat rute baru dengan input: kota asal, kota tujuan, harga tiket, dan estimasi durasi perjalanan. | 🔴 Tinggi |
| F-ADM-08 | Edit Rute | Admin dapat mengubah informasi rute dan harga yang sudah ada. | 🔴 Tinggi |
| F-ADM-09 | Hapus / Nonaktifkan Rute | Admin dapat menghapus atau menonaktifkan rute yang tidak lagi tersedia. | 🟡 Sedang |

#### 5.1.3 Manajemen Pemesanan

Admin dapat melihat dan memantau seluruh transaksi pemesanan tiket oleh pelanggan.

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-ADM-10 | Daftar Pemesanan | Menampilkan semua data pemesanan tiket pelanggan dalam tabel: nama pelanggan, rute, tanggal, nomor kursi, status pembayaran, dan status pesanan. | 🔴 Tinggi |
| F-ADM-11 | Detail Pemesanan | Admin dapat melihat detail lengkap satu pemesanan termasuk data diri pelanggan dan bukti pembayaran. | 🔴 Tinggi |
| F-ADM-12 | Filter & Pencarian | Admin dapat memfilter data pemesanan berdasarkan status, rute, atau tanggal, serta mencari berdasarkan nama pelanggan. | 🟡 Sedang |
| F-ADM-13 | Update Status Pesanan | Admin dapat mengubah status pesanan (Pending → Dikonfirmasi → Selesai / Dibatalkan). | 🔴 Tinggi |

#### 5.1.4 Manajemen Keluhan

Admin dapat melihat dan merespons keluhan yang diajukan oleh pelanggan.

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-ADM-14 | Daftar Keluhan | Menampilkan semua keluhan pelanggan dalam tabel: nama pelanggan, nomor tiket, deskripsi singkat, rating, tanggal, dan status keluhan. | 🔴 Tinggi |
| F-ADM-15 | Detail Keluhan | Admin dapat melihat detail keluhan termasuk deskripsi lengkap, rating bintang, dan foto (jika ada). | 🔴 Tinggi |
| F-ADM-16 | Balas Keluhan | Admin dapat memberikan respons/balasan tertulis terhadap keluhan pelanggan. | 🔴 Tinggi |
| F-ADM-17 | Update Status Keluhan | Admin dapat mengubah status keluhan (Baru → Sedang Diproses → Selesai). | 🔴 Tinggi |

#### 5.1.5 Manajemen Pelanggan

Admin dapat melihat data pelanggan yang terdaftar di sistem.

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-ADM-18 | Daftar Pelanggan | Menampilkan semua pelanggan yang telah mendaftar dengan informasi nama, email, nomor telepon, dan jumlah pemesanan. | 🟡 Sedang |
| F-ADM-19 | Detail Pelanggan | Admin dapat melihat riwayat pemesanan dan keluhan dari seorang pelanggan. | 🟢 Rendah |

---

### 5.2 Fitur Pelanggan

#### 5.2.1 Autentikasi

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-PEL-01 | Registrasi | Pelanggan dapat mendaftar akun baru dengan mengisi nama lengkap, email, nomor telepon, jenis kelamin, dan kata sandi. | 🔴 Tinggi |
| F-PEL-02 | Login | Pelanggan login menggunakan email dan kata sandi yang telah terdaftar. | 🔴 Tinggi |
| F-PEL-03 | Logout | Pelanggan dapat keluar dari sesi akun. | 🔴 Tinggi |

#### 5.2.2 Dashboard Pelanggan

Halaman utama pelanggan setelah login, menampilkan ringkasan aktivitas.

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-PEL-04 | Ringkasan Pemesanan | Menampilkan jumlah total pemesanan, pemesanan aktif, dan riwayat perjalanan pelanggan. | 🔴 Tinggi |
| F-PEL-05 | Pemesanan Terbaru | Menampilkan daftar tiket terbaru milik pelanggan dengan status dan tombol aksi. | 🔴 Tinggi |
| F-PEL-06 | Notifikasi | Menampilkan notifikasi terkait status pemesanan dan balasan keluhan dari admin. | 🟡 Sedang |

#### 5.2.3 Pemesanan Tiket — Alur Multi-Step

Alur pemesanan tiket terdiri dari beberapa langkah berurutan yang harus diselesaikan pelanggan.

| Step | Halaman | Deskripsi |
|---|---|---|
| **1** | Pilih Rute & Tanggal | Pelanggan memilih rute (kota asal → kota tujuan) dari daftar rute yang telah dibuat admin, kemudian memilih tanggal keberangkatan yang diinginkan. |
| **2** | Pilih Kursi | Pelanggan diarahkan ke halaman pemilihan kursi yang menampilkan layout kursi bus dengan kapasitas 36 kursi. Kursi yang sudah dipesan ditampilkan dengan warna berbeda (tidak dapat dipilih). |
| **3** | Isi Data Diri | Pelanggan mengisi formulir data penumpang yang terdiri dari: Nama Lengkap, Nomor Telepon, dan Jenis Kelamin. |
| **4** | Pembayaran | Pelanggan melakukan pembayaran tiket. Halaman ini menampilkan ringkasan pemesanan dan nominal yang harus dibayarkan, beserta instruksi atau metode pembayaran yang tersedia. |
| **5** | Konfirmasi & E-Tiket | Setelah pembayaran berhasil dikonfirmasi oleh admin, pelanggan mendapatkan e-tiket digital yang berisi informasi pemesanan lengkap. |

#### 5.2.4 Halaman Pilih Kursi

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-PEL-07 | Layout Kursi Bus | Menampilkan denah kursi bus dengan total 36 kursi dalam format visual yang intuitif. Setiap kursi diberi nomor. | 🔴 Tinggi |
| F-PEL-08 | Indikator Status Kursi | Kursi tersedia (hijau/putih), kursi sudah dipesan (abu-abu/disabled), kursi yang dipilih pelanggan (emas/biru). | 🔴 Tinggi |
| F-PEL-09 | Pilih Satu Kursi | Pelanggan hanya dapat memilih satu kursi per transaksi pemesanan. | 🔴 Tinggi |
| F-PEL-10 | Konfirmasi Pilihan | Setelah memilih kursi, pelanggan dapat melihat ringkasan kursi yang dipilih sebelum melanjutkan ke langkah berikutnya. | 🟡 Sedang |

#### 5.2.5 Formulir Data Diri

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-PEL-11 | Input Nama Lengkap | Field teks untuk memasukkan nama lengkap penumpang. **Wajib diisi.** | 🔴 Tinggi |
| F-PEL-12 | Input Nomor Telepon | Field nomor telepon penumpang dengan validasi format. **Wajib diisi.** | 🔴 Tinggi |
| F-PEL-13 | Pilih Jenis Kelamin | Pilihan radio button atau dropdown untuk memilih Laki-laki atau Perempuan. **Wajib diisi.** | 🔴 Tinggi |

#### 5.2.6 E-Tiket & Riwayat Pemesanan

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-PEL-14 | Daftar E-Tiket | Pelanggan dapat melihat daftar semua tiket yang dimiliki beserta status pesanan (Pending, Dikonfirmasi, Selesai, Dibatalkan). | 🔴 Tinggi |
| F-PEL-15 | Detail E-Tiket | Pelanggan dapat melihat detail lengkap tiket: rute, tanggal, nomor kursi, data penumpang, dan status. | 🔴 Tinggi |

#### 5.2.7 Fitur Keluhan

> **Penting:** Keluhan hanya dapat diajukan oleh pelanggan yang sudah memiliki tiket dengan status **Selesai**. Alur pengajuan keluhan dimulai dari mengklik e-tiket yang ingin diberikan keluhan.

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-PEL-16 | Tombol Keluhan pada E-Tiket | Pada halaman detail e-tiket berstatus Selesai, tersedia tombol **Ajukan Keluhan**. Tiket yang belum Selesai tidak menampilkan tombol ini. | 🔴 Tinggi |
| F-PEL-17 | Formulir Keluhan | Halaman keluhan berisi form dengan field: Deskripsi Keluhan (textarea, wajib), Rating Bintang 1–5 (wajib), Upload Foto (opsional, JPG/PNG, maks. 2MB). | 🔴 Tinggi |
| F-PEL-18 | Satu Keluhan per Tiket | Setiap tiket hanya dapat diajukan satu kali keluhan. Setelah diajukan, tombol berganti menjadi **Lihat Keluhan**. | 🔴 Tinggi |
| F-PEL-19 | Riwayat Keluhan | Pelanggan dapat melihat daftar keluhan yang pernah diajukan beserta status dan balasan dari admin. | 🟡 Sedang |
| F-PEL-20 | Notifikasi Balasan Keluhan | Pelanggan mendapat notifikasi ketika admin memberikan balasan atas keluhannya. | 🟡 Sedang |

#### 5.2.8 Profil Pelanggan

| ID Fitur | Nama Fitur | Deskripsi | Prioritas |
|---|---|---|---|
| F-PEL-21 | Lihat Profil | Menampilkan informasi akun pelanggan: nama, email, nomor telepon, dan jenis kelamin. | 🟡 Sedang |
| F-PEL-22 | Edit Profil | Pelanggan dapat mengubah nama, nomor telepon, dan jenis kelamin. | 🟡 Sedang |
| F-PEL-23 | Ubah Password | Pelanggan dapat mengubah kata sandi akun. | 🟡 Sedang |

---

## 6. Arsitektur Navigasi (UI/UX)

### 6.1 Tampilan Pelanggan — Bottom Navigation Bar

Sebagai aplikasi PWA dengan pendekatan mobile-first, navigasi utama pelanggan menggunakan **bottom navbar** yang terdiri dari 3 menu utama:

| Ikon | Label | Halaman Tujuan |
|---|---|---|
| 🏠 | **Dashboard** | Halaman utama pelanggan: ringkasan pemesanan terbaru, tombol pesan tiket. |
| 🎫 | **Tiket** | Alur pemesanan tiket: pilih rute, tanggal, kursi, isi data diri, pembayaran. |
| 👤 | **Profil** | Informasi akun, riwayat pemesanan, riwayat keluhan, dan logout. |

### 6.2 Tampilan Admin — Sidebar / Top Navigation

Admin menggunakan tampilan desktop dengan sidebar navigasi atau top navbar, berisi menu:

- **Dashboard** — halaman utama dengan grafik dan statistik
- **Manajemen Rute & Harga** — CRUD rute bus
- **Manajemen Pemesanan** — daftar dan detail pemesanan pelanggan
- **Manajemen Keluhan** — daftar, detail, dan balasan keluhan
- **Manajemen Pelanggan** — daftar pelanggan terdaftar
- **Logout**

---

## 7. Persyaratan Non-Fungsional

| Kategori | Persyaratan |
|---|---|
| **Performa** | Halaman utama harus termuat dalam waktu < 3 detik pada koneksi 4G. Aplikasi PWA harus dapat berfungsi secara offline untuk membaca data yang sudah di-cache. |
| **Keamanan** | Autentikasi menggunakan JWT atau session Laravel. Data sensitif pengguna harus dienkripsi. Proteksi CSRF pada semua form. Validasi input server-side untuk mencegah SQL Injection dan XSS. |
| **Skalabilitas** | Sistem harus mampu menangani minimal 100 pengguna bersamaan tanpa penurunan performa signifikan. Database MySQL dioptimalkan dengan indexing pada kolom yang sering di-query. |
| **Usabilitas** | Antarmuka harus intuitif dan dapat digunakan tanpa pelatihan khusus. Semua teks harus terbaca jelas pada layar mobile (font size minimal 14px). Tombol dan elemen interaktif memiliki ukuran minimal 44×44px. |
| **Kompatibilitas** | Mendukung browser modern: Chrome (Android/iOS/Desktop), Safari (iOS), Firefox. Tampilan responsif untuk layar smartphone (360px–428px) dan tablet/desktop. |
| **PWA Compliance** | Memiliki `manifest.json` yang valid. Mengimplementasikan Service Worker untuk caching. Mendukung fitur Add to Home Screen (A2HS). Skor Lighthouse PWA minimal 80. |
| **Aksesibilitas** | Menggunakan atribut ARIA pada elemen penting. Kontras warna memenuhi standar WCAG AA (rasio kontras minimal 4.5:1). Semua gambar memiliki atribut `alt`. |

---

## 8. Alur Bisnis Utama

### 8.1 Alur Pemesanan Tiket

```
Pelanggan Login
      │
      ▼
Buka Menu "Pesan Tiket"
      │
      ▼
Pilih Rute (Kota Asal → Kota Tujuan)
      │
      ▼
Pilih Tanggal Keberangkatan
      │
      ▼
Pilih Kursi (Layout 36 Kursi)
      │
      ▼
Isi Data Diri (Nama, Telepon, Jenis Kelamin)
      │
      ▼
Ringkasan Pesanan & Pembayaran
      │
      ▼
Admin Verifikasi & Konfirmasi Pembayaran
      │
      ▼
Pelanggan Menerima E-Tiket Digital ✓
```

**Langkah detail:**

1. Pelanggan login ke aplikasi.
2. Pelanggan membuka menu Pesan Tiket dari bottom navbar.
3. Pelanggan memilih rute (kota asal dan tujuan) dari daftar rute yang tersedia.
4. Pelanggan memilih tanggal keberangkatan.
5. Sistem menampilkan halaman pilih kursi dengan layout 36 kursi; kursi yang sudah dipesan ditandai tidak tersedia.
6. Pelanggan memilih satu kursi yang tersedia.
7. Pelanggan diarahkan ke formulir data diri dan mengisi: Nama Lengkap, Nomor Telepon, Jenis Kelamin.
8. Sistem menampilkan ringkasan pesanan dan total pembayaran.
9. Pelanggan melakukan pembayaran sesuai instruksi yang ditampilkan.
10. Admin memverifikasi dan mengonfirmasi pembayaran, lalu mengubah status pesanan menjadi **Dikonfirmasi**.
11. Pelanggan menerima notifikasi konfirmasi dan e-tiket digital tersedia di halaman Tiket.

---

### 8.2 Alur Pengajuan Keluhan

```
Pelanggan Buka Halaman Tiket
      │
      ▼
Pilih E-Tiket dengan Status "Selesai"
      │
      ▼
Klik Tombol "Ajukan Keluhan"
      │
      ▼
Isi Formulir Keluhan
(Deskripsi ✱ | Rating 1–5 ✱ | Foto opsional)
      │
      ▼
Kirim Keluhan → Notifikasi ke Admin
      │
      ▼
Admin Memberikan Balasan & Update Status
      │
      ▼
Pelanggan Menerima Notifikasi Balasan ✓
```

**Langkah detail:**

1. Pelanggan membuka halaman Dashboard atau menu Tiket.
2. Pelanggan memilih e-tiket dengan status **Selesai** yang ingin diberikan keluhan.
3. Pada halaman detail e-tiket, pelanggan mengklik tombol **Ajukan Keluhan**.
4. Sistem menampilkan formulir keluhan.
5. Pelanggan mengisi: Deskripsi Keluhan (wajib), Rating bintang 1–5 (wajib), Foto/lampiran (opsional).
6. Pelanggan mengirimkan keluhan.
7. Sistem menyimpan keluhan dan mengirim notifikasi ke admin.
8. Admin melihat keluhan di panel Manajemen Keluhan, memberikan balasan dan mengubah status.
9. Pelanggan mendapat notifikasi balasan dan dapat melihat respons admin di detail keluhan.

---

## 9. Aturan Bisnis (Business Rules)

| Kode | Aturan |
|---|---|
| **BR-01** | Keluhan hanya dapat diajukan terhadap tiket dengan status **Selesai**. Tiket dengan status Pending, Dikonfirmasi, atau Dibatalkan tidak dapat diajukan keluhan. |
| **BR-02** | Setiap tiket hanya dapat memiliki **satu keluhan**. Pelanggan tidak dapat mengajukan keluhan kedua untuk tiket yang sama. |
| **BR-03** | Pemilihan kursi bersifat eksklusif: satu kursi hanya dapat dipesan oleh satu pelanggan pada satu tanggal keberangkatan yang sama (**pessimistic locking** via `lockForUpdate()`). |
| **BR-04** | Rute dan harga tiket sepenuhnya dikelola oleh Admin. Pelanggan hanya dapat memilih dari rute yang sudah tersedia dan aktif. |
| **BR-05** | Upload foto pada formulir keluhan bersifat **opsional**. Format yang diterima: JPG dan PNG dengan ukuran file maksimal 2MB. |
| **BR-06** | Admin harus merespons keluhan setelah keluhan diterima. Status keluhan default adalah **Baru** saat pertama kali diajukan. |
| **BR-07** | Pelanggan harus login terlebih dahulu sebelum dapat mengakses fitur pemesanan tiket dan pengajuan keluhan. |

---

## 10. Struktur Database (Ringkasan)

Database aplikasi ini terdiri dari **8 tabel utama** yang saling berelasi:

| No | Nama Tabel | Deskripsi |
|---|---|---|
| 1 | `users` / `pengguna` | Data akun pengguna (admin dan pelanggan): nama, email, password, role. |
| 2 | `bus` / `produk` | Data bus: nomor bus, kapasitas kursi, status aktif. |
| 3 | `rute` | Data rute perjalanan: kota asal, kota tujuan, harga, estimasi durasi. |
| 4 | `orders` / `pesanan` | Data header pemesanan: pelanggan, rute, tanggal, status, total harga. |
| 5 | `item_pesanan` | Detail pesanan: nomor kursi, data penumpang (nama, telepon, jenis kelamin). |
| 6 | `pembayaran` | Data transaksi pembayaran: metode, jumlah, status, bukti bayar. |
| 7 | `keluhan` | Data keluhan pelanggan: `id_pesanan` (FK), deskripsi, rating, foto, status. |
| 8 | `balasan_keluhan` | Balasan admin terhadap keluhan: `id_keluhan` (FK), isi balasan, timestamp. |

### Relasi Antar Tabel

```
users ──────────────── pesanan ──────── item_pesanan
  │                      │
  │                      ├──────────── pembayaran
  │                      │
  │                      └──────────── keluhan ──── balasan_keluhan
  │
  └── (admin) ──────── rute ──────────── pesanan
```

---

## 11. Stack Teknologi

| Komponen | Teknologi |
|---|---|
| **Backend Framework** | Laravel 12 |
| **Database** | MySQL (via XAMPP) |
| **Frontend Framework** | Bootstrap 5 |
| **PWA** | `manifest.json` + Service Worker (Workbox) |
| **Autentikasi** | Laravel Sanctum / Session Auth |
| **Concurrency Control** | Pessimistic Locking (`lockForUpdate()`) |
| **Scheduler** | Laravel Task Scheduling (Artisan) |
| **Bahasa Pemrograman** | PHP 8.x, JavaScript (ES6+) |
| **Version Control** | Git |
| **IDE / Editor** | VS Code |

---

## 12. Asumsi & Dependensi

### 12.1 Asumsi

- Setiap bus memiliki kapasitas tepat **36 kursi** yang ditampilkan dalam layout visual.
- Admin secara manual mengonfirmasi pembayaran pelanggan (tidak ada payment gateway otomatis pada versi awal).
- Satu pemesanan = satu kursi = satu penumpang.
- Aplikasi diakses menggunakan jaringan internet; fitur offline PWA terbatas pada pembacaan data yang sudah di-cache.
- Admin hanya ada satu level (tidak ada hierarki super-admin dan sub-admin pada versi awal).

### 12.2 Dependensi

- **Server:** PHP 8.x, MySQL, Apache/Nginx (dapat menggunakan XAMPP untuk development).
- **Node.js & NPM:** diperlukan untuk kompilasi aset frontend (Vite/Mix).
- **Koneksi internet** untuk akses real-time; Service Worker digunakan untuk partial offline support.

---

## 13. Kriteria Penerimaan (Acceptance Criteria)

Produk dianggap siap untuk diluncurkan apabila seluruh kriteria berikut terpenuhi:

1. ✅ Semua fitur dengan prioritas **Tinggi** telah diimplementasikan dan lulus pengujian fungsional.
2. ✅ Alur pemesanan tiket (5 langkah) berjalan tanpa error dari awal hingga e-tiket diterima.
3. ✅ Alur pengajuan keluhan berjalan dengan benar, termasuk validasi bahwa keluhan hanya bisa dilakukan pada tiket **Selesai**.
4. ✅ Layout 36 kursi tampil dengan benar dan kursi yang sudah dipesan tidak dapat dipilih.
5. ✅ Semua halaman admin menampilkan data yang akurat dan real-time.
6. ✅ Aplikasi dapat diinstall sebagai PWA di perangkat Android dan iOS.
7. ✅ Tidak ada bug kritis (Critical/Blocker) yang belum terselesaikan.
8. ✅ Skor usabilitas SUS (System Usability Scale) minimal **70** (kategori Good).

---

## 14. Riwayat Revisi Dokumen

| Versi | Tanggal | Deskripsi Perubahan | Penulis |
|---|---|---|---|
| v1.0 | Juni 2026 | Dokumen PRD pertama — mencakup seluruh fitur admin dan pelanggan. | Tim Pengembang |

---

*— Akhir Dokumen PRD v1.0 —*
