Delete DOKUMENTASI_BACKEND_BOOKING_CUSTOMER.md
This commit is contained in:
parent
f9216b7d8e
commit
2913dad86b
|
|
@ -1,308 +0,0 @@
|
||||||
# Dokumentasi Backend Booking Customer
|
|
||||||
|
|
||||||
Dokumentasi ini menjelaskan tahap 4 backend yang sudah dibuat untuk **booking customer** pada website rental kendaraan berbasis Laravel.
|
|
||||||
|
|
||||||
## Tujuan Fitur
|
|
||||||
|
|
||||||
Tahap ini dibuat agar customer bisa melakukan booking kendaraan secara valid menggunakan data nyata dari database.
|
|
||||||
|
|
||||||
Fokus fitur ini:
|
|
||||||
|
|
||||||
- hanya customer login yang boleh booking
|
|
||||||
- kendaraan yang dibooking harus valid dan layak tampil
|
|
||||||
- customer mengisi data booking melalui form frontend yang sudah ada
|
|
||||||
- sistem memvalidasi data booking secara backend
|
|
||||||
- sistem mengecek bentrok tanggal booking kendaraan
|
|
||||||
- booking yang valid disimpan ke database
|
|
||||||
- payment awal dibuat otomatis dengan status unpaid
|
|
||||||
- booking diarahkan ke langkah pembayaran placeholder
|
|
||||||
|
|
||||||
## Aturan Bisnis yang Diterapkan
|
|
||||||
|
|
||||||
Aturan yang wajib dipatuhi:
|
|
||||||
|
|
||||||
- customer wajib login sebelum booking
|
|
||||||
- rental yang belum diverifikasi tidak boleh dibooking
|
|
||||||
- kendaraan dengan status selain `active` tidak boleh dibooking
|
|
||||||
- satu kendaraan tidak boleh dibooking pada tanggal yang sama jika booking aktif masih memblokir
|
|
||||||
- customer hanya boleh booking kendaraan dari rental dengan status `approved`
|
|
||||||
- backend pembayaran penuh belum dibuat di tahap ini
|
|
||||||
- review belum dibuat di tahap ini
|
|
||||||
|
|
||||||
Status booking yang dianggap memblokir kendaraan:
|
|
||||||
|
|
||||||
- `pending`
|
|
||||||
- `waiting_payment`
|
|
||||||
- `waiting_verification`
|
|
||||||
- `confirmed`
|
|
||||||
- `ongoing`
|
|
||||||
|
|
||||||
Status yang tidak memblokir:
|
|
||||||
|
|
||||||
- `cancelled`
|
|
||||||
- `completed`
|
|
||||||
|
|
||||||
## Route yang Dibuat
|
|
||||||
|
|
||||||
Route booking customer yang digunakan:
|
|
||||||
|
|
||||||
- `GET /booking/{vehicle:slug}` → `booking.create`
|
|
||||||
- `POST /booking/{vehicle:slug}` → `booking.store`
|
|
||||||
|
|
||||||
Catatan:
|
|
||||||
- route booking hanya tersedia untuk user dengan role `customer`
|
|
||||||
- guest diarahkan ke login
|
|
||||||
- admin rental dan super admin tidak masuk flow booking customer
|
|
||||||
- route booking lama yang umum tanpa slug tidak dipakai untuk create flow
|
|
||||||
|
|
||||||
## File Backend yang Ditambahkan
|
|
||||||
|
|
||||||
### Controller
|
|
||||||
- `app/Http/Controllers/Customer/BookingController.php`
|
|
||||||
|
|
||||||
### Form Request
|
|
||||||
- `app/Http/Requests/StoreBookingRequest.php`
|
|
||||||
|
|
||||||
### Model yang Disesuaikan
|
|
||||||
- `app/Models/Booking.php`
|
|
||||||
- `app/Models/Payment.php`
|
|
||||||
- `app/Models/Vehicle.php`
|
|
||||||
- `app/Models/RentalCompany.php`
|
|
||||||
|
|
||||||
### Route Update
|
|
||||||
- `routes/web.php`
|
|
||||||
|
|
||||||
## Alur Booking Customer
|
|
||||||
|
|
||||||
### 1. Tombol Booking dari Detail Mobil
|
|
||||||
|
|
||||||
- Tombol `Booking Sekarang` di detail mobil diarahkan ke route `booking.create`.
|
|
||||||
- Jika guest klik tombol ini, sistem mengarah ke halaman login.
|
|
||||||
- Jika user login bukan customer, sistem diarahkan ke home sebagai langkah aman.
|
|
||||||
|
|
||||||
### 2. Halaman Booking
|
|
||||||
|
|
||||||
- Customer membuka halaman booking berdasarkan slug kendaraan.
|
|
||||||
- Controller memuat data kendaraan beserta rental company dan foto kendaraan.
|
|
||||||
- Sistem mengecek bahwa:
|
|
||||||
- kendaraan berstatus `active`
|
|
||||||
- rental company berstatus `approved`
|
|
||||||
- Jika tidak valid, sistem mengembalikan `404`.
|
|
||||||
|
|
||||||
### 3. Form Data Penyewa
|
|
||||||
|
|
||||||
Field yang dipakai dari form booking:
|
|
||||||
|
|
||||||
- nama lengkap
|
|
||||||
- email
|
|
||||||
- nomor HP
|
|
||||||
- alamat
|
|
||||||
- nomor KTP
|
|
||||||
- nomor SIM
|
|
||||||
- catatan tambahan
|
|
||||||
|
|
||||||
Prefill yang dipakai:
|
|
||||||
|
|
||||||
- `customer_name` dari nama user login
|
|
||||||
- `customer_email` dari email user login
|
|
||||||
- `customer_phone` dari nomor HP user login jika ada
|
|
||||||
|
|
||||||
Jika tidak ada customer profile tambahan, data tetap diambil dari `users` dan input form yang tersedia.
|
|
||||||
|
|
||||||
### 4. Detail Pemesanan
|
|
||||||
|
|
||||||
Field booking yang diproses:
|
|
||||||
|
|
||||||
- pickup_date
|
|
||||||
- return_date
|
|
||||||
- pickup_time nullable
|
|
||||||
- pickup_location
|
|
||||||
- return_location nullable
|
|
||||||
- with_driver boolean
|
|
||||||
- note nullable
|
|
||||||
|
|
||||||
Logika yang diterapkan:
|
|
||||||
|
|
||||||
- `pickup_date` wajib
|
|
||||||
- `return_date` wajib
|
|
||||||
- `return_date` harus lebih besar atau sama dengan `pickup_date`
|
|
||||||
- `pickup_date` tidak boleh di masa lalu
|
|
||||||
- duration dihitung otomatis di backend
|
|
||||||
- subtotal dihitung otomatis dari duration dan harga kendaraan per hari
|
|
||||||
- discount_amount sementara `0`
|
|
||||||
- additional_cost sementara `0`
|
|
||||||
- total_amount dihitung ulang di backend
|
|
||||||
|
|
||||||
## Validasi Booking
|
|
||||||
|
|
||||||
Validasi utama yang dipakai di `StoreBookingRequest`:
|
|
||||||
|
|
||||||
- `customer_name` wajib
|
|
||||||
- `customer_email` wajib dan format email valid
|
|
||||||
- `customer_phone` wajib
|
|
||||||
- `customer_address` wajib
|
|
||||||
- `identity_number` wajib
|
|
||||||
- `driver_license_number` nullable
|
|
||||||
- `pickup_date` wajib dan minimal hari ini
|
|
||||||
- `return_date` wajib dan tidak boleh lebih kecil dari `pickup_date`
|
|
||||||
- `pickup_location` wajib
|
|
||||||
- `pickup_time` nullable dengan format jam yang valid
|
|
||||||
- `with_driver` boolean
|
|
||||||
- `note` nullable
|
|
||||||
|
|
||||||
Catatan:
|
|
||||||
- nilai harga, subtotal, total, dan durasi tidak diambil dari frontend
|
|
||||||
- semua perhitungan harga dihitung ulang di backend
|
|
||||||
|
|
||||||
## Logika Bentrok Tanggal
|
|
||||||
|
|
||||||
Sebelum booking disimpan, sistem mengecek apakah kendaraan sudah dibooking pada rentang tanggal yang sama.
|
|
||||||
|
|
||||||
Logika overlap yang dipakai:
|
|
||||||
|
|
||||||
- cek booking lain dengan `vehicle_id` yang sama
|
|
||||||
- cek booking yang statusnya masih memblokir kendaraan
|
|
||||||
- overlap dianggap terjadi jika:
|
|
||||||
- tanggal mulai booking baru berada di dalam rentang booking lama
|
|
||||||
- tanggal selesai booking baru berada di dalam rentang booking lama
|
|
||||||
- booking baru sepenuhnya mencakup booking lama
|
|
||||||
|
|
||||||
Jika bentrok ditemukan:
|
|
||||||
|
|
||||||
- sistem mengembalikan user ke form booking
|
|
||||||
- sistem menampilkan error bahwa kendaraan tidak tersedia pada rentang tanggal tersebut
|
|
||||||
|
|
||||||
## Booking Code
|
|
||||||
|
|
||||||
Booking code dibuat otomatis dengan format:
|
|
||||||
|
|
||||||
- `BK-YYYYMMDD-XXXXXX`
|
|
||||||
|
|
||||||
Contoh:
|
|
||||||
|
|
||||||
- `BK-20260421-A1B2C3`
|
|
||||||
|
|
||||||
Aturan yang dipakai:
|
|
||||||
|
|
||||||
- memakai prefix `BK`
|
|
||||||
- memakai tanggal hari ini
|
|
||||||
- memakai random string kapital 6 karakter
|
|
||||||
- dicek ke database agar unik sebelum dipakai
|
|
||||||
|
|
||||||
## Penyimpanan Booking
|
|
||||||
|
|
||||||
Jika data valid dan tidak bentrok, sistem menyimpan record booking ke tabel `bookings` dengan data:
|
|
||||||
|
|
||||||
- booking_code unik
|
|
||||||
- customer_id dari user login
|
|
||||||
- rental_company_id dari vehicle
|
|
||||||
- vehicle_id dari kendaraan yang dipilih
|
|
||||||
- pickup_date
|
|
||||||
- return_date
|
|
||||||
- pickup_time
|
|
||||||
- pickup_location
|
|
||||||
- return_location
|
|
||||||
- duration_days
|
|
||||||
- with_driver
|
|
||||||
- customer_name
|
|
||||||
- customer_email
|
|
||||||
- customer_phone
|
|
||||||
- customer_address
|
|
||||||
- identity_number
|
|
||||||
- driver_license_number
|
|
||||||
- note
|
|
||||||
- subtotal
|
|
||||||
- discount_amount
|
|
||||||
- additional_cost
|
|
||||||
- total_amount
|
|
||||||
- booking_status = `waiting_payment`
|
|
||||||
- payment_status = `unpaid`
|
|
||||||
|
|
||||||
## Pembuatan Payment Awal
|
|
||||||
|
|
||||||
Setelah booking berhasil dibuat, sistem otomatis membuat data payment awal di tabel `payments`.
|
|
||||||
|
|
||||||
Nilai yang disimpan:
|
|
||||||
|
|
||||||
- booking_id
|
|
||||||
- payment_method = `manual_transfer`
|
|
||||||
- amount = total_amount
|
|
||||||
- payment_status = `unpaid`
|
|
||||||
- proof_payment = null
|
|
||||||
- paid_at = null
|
|
||||||
- verified_by = null
|
|
||||||
- verified_at = null
|
|
||||||
|
|
||||||
Keputusan ini dipakai karena backend pembayaran penuh belum dibangun, tetapi relasi booking-payment sudah disiapkan dari awal.
|
|
||||||
|
|
||||||
## Redirect Setelah Booking Berhasil
|
|
||||||
|
|
||||||
Setelah booking berhasil disimpan:
|
|
||||||
|
|
||||||
- user diarahkan ke halaman pembayaran placeholder
|
|
||||||
- notifikasi sukses dikirim ke session
|
|
||||||
|
|
||||||
Pendekatan ini dipilih karena paling aman dan paling mudah dikembangkan ke tahap pembayaran berikutnya.
|
|
||||||
|
|
||||||
## Partial Blade yang Dipakai
|
|
||||||
|
|
||||||
### Booking
|
|
||||||
- `resources/views/booking/index.blade.php`
|
|
||||||
- `resources/views/booking/data-kendaraan.blade.php`
|
|
||||||
- `resources/views/booking/form-data-penyewa.blade.php`
|
|
||||||
- `resources/views/booking/detail-pemesanan.blade.php`
|
|
||||||
- `resources/views/booking/promo-voucher.blade.php`
|
|
||||||
- `resources/views/booking/ringkasan-biaya.blade.php`
|
|
||||||
- `resources/views/booking/tombol-lanjut-pembayaran.blade.php`
|
|
||||||
|
|
||||||
### Detail Mobil
|
|
||||||
- `resources/views/detail-mobil/tombol-booking.blade.php`
|
|
||||||
|
|
||||||
## Penyesuaian Frontend
|
|
||||||
|
|
||||||
Frontend booking yang sudah ada tetap dipakai, hanya disambungkan ke backend nyata.
|
|
||||||
|
|
||||||
Penyesuaian utama:
|
|
||||||
|
|
||||||
- data kendaraan diambil dari vehicle yang dipilih
|
|
||||||
- data customer login dipakai sebagai default form penyewa
|
|
||||||
- ringkasan biaya dihitung ulang berdasarkan backend logic
|
|
||||||
- tombol lanjut pembayaran diubah menjadi tombol submit booking
|
|
||||||
- promo voucher tetap placeholder karena backend promo belum ada
|
|
||||||
|
|
||||||
## Keamanan dan Performa
|
|
||||||
|
|
||||||
- flow booking dilindungi middleware `auth` dan `role:customer`
|
|
||||||
- vehicle divalidasi dengan route model binding `vehicle:slug`
|
|
||||||
- kendaraan tidak valid diblok dengan `404`
|
|
||||||
- query bentrok memakai filter status yang jelas
|
|
||||||
- booking code dicek unik sebelum disimpan
|
|
||||||
- harga tidak pernah dipercaya dari frontend
|
|
||||||
- data payment awal selalu dibuat dari transaksi booking yang sama
|
|
||||||
|
|
||||||
## Status Pengerjaan
|
|
||||||
|
|
||||||
- customer bisa membuka halaman booking dari detail mobil
|
|
||||||
- guest diarahkan ke login
|
|
||||||
- hanya customer login yang bisa akses booking
|
|
||||||
- validasi booking backend sudah aktif
|
|
||||||
- cek bentrok tanggal sudah aktif
|
|
||||||
- booking dan payment awal sudah tersimpan otomatis
|
|
||||||
- pembayaran penuh, upload bukti bayar, dan review masih belum dibuat
|
|
||||||
|
|
||||||
## Langkah Menjalankan
|
|
||||||
|
|
||||||
1. Pastikan data rental company berstatus `approved` tersedia.
|
|
||||||
2. Pastikan kendaraan berstatus `active` tersedia.
|
|
||||||
3. Buka halaman detail mobil dari katalog.
|
|
||||||
4. Klik tombol booking untuk masuk ke halaman booking.
|
|
||||||
5. Isi form booking lalu simpan.
|
|
||||||
|
|
||||||
## Langkah Berikutnya
|
|
||||||
|
|
||||||
Tahap backend berikutnya yang paling masuk akal:
|
|
||||||
|
|
||||||
1. membangun backend pembayaran customer
|
|
||||||
2. menambahkan upload bukti bayar dan verifikasi admin rental
|
|
||||||
3. menambahkan halaman detail booking customer
|
|
||||||
4. menambahkan review setelah booking selesai
|
|
||||||
Loading…
Reference in New Issue