8.7 KiB
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
activetidak 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:
pendingwaiting_paymentwaiting_verificationconfirmedongoing
Status yang tidak memblokir:
cancelledcompleted
Route yang Dibuat
Route booking customer yang digunakan:
GET /booking/{vehicle:slug}→booking.createPOST /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.phpapp/Models/Payment.phpapp/Models/Vehicle.phpapp/Models/RentalCompany.php
Route Update
routes/web.php
Alur Booking Customer
1. Tombol Booking dari Detail Mobil
- Tombol
Booking Sekarangdi detail mobil diarahkan ke routebooking.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
- kendaraan berstatus
- Jika tidak valid, sistem mengembalikan
404.
3. Form Data Penyewa
Field yang dipakai dari form booking:
- nama lengkap
- nomor HP
- alamat
- nomor KTP
- nomor SIM
- catatan tambahan
Prefill yang dipakai:
customer_namedari nama user logincustomer_emaildari email user logincustomer_phonedari 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_datewajibreturn_datewajibreturn_dateharus lebih besar atau sama denganpickup_datepickup_datetidak 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_namewajibcustomer_emailwajib dan format email validcustomer_phonewajibcustomer_addresswajibidentity_numberwajibdriver_license_numbernullablepickup_datewajib dan minimal hari inireturn_datewajib dan tidak boleh lebih kecil daripickup_datepickup_locationwajibpickup_timenullable dengan format jam yang validwith_driverbooleannotenullable
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_idyang 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.phpresources/views/booking/data-kendaraan.blade.phpresources/views/booking/form-data-penyewa.blade.phpresources/views/booking/detail-pemesanan.blade.phpresources/views/booking/promo-voucher.blade.phpresources/views/booking/ringkasan-biaya.blade.phpresources/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
authdanrole: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
- Pastikan data rental company berstatus
approvedtersedia. - Pastikan kendaraan berstatus
activetersedia. - Buka halaman detail mobil dari katalog.
- Klik tombol booking untuk masuk ke halaman booking.
- Isi form booking lalu simpan.
Langkah Berikutnya
Tahap backend berikutnya yang paling masuk akal:
- membangun backend pembayaran customer
- menambahkan upload bukti bayar dan verifikasi admin rental
- menambahkan halaman detail booking customer
- menambahkan review setelah booking selesai