7.5 KiB
DOKUMENTASI TAHAP 7
Backend Review/Ulasan Customer
Tanggal: 21 April 2026 Project: WebRental (Laravel)
1. Tujuan Tahap Ini
Tahap ini fokus pada alur: completed booking -> customer membuat review -> review tampil di detail mobil.
Cakupan yang dikerjakan:
- Customer bisa membuat ulasan hanya untuk booking miliknya yang sudah completed.
- Satu booking hanya boleh punya satu review.
- Riwayat booking customer menampilkan status review dan tombol Beri Ulasan saat memenuhi syarat.
- Halaman detail mobil menampilkan data review nyata dari database (rata-rata, jumlah, daftar ulasan).
- Admin rental bisa melihat daftar review yang masuk untuk rental miliknya (list sederhana).
Cakupan yang tidak dikerjakan:
- Promo/CRM.
- Super admin module review.
- Balas review.
- Edit/hapus review.
2. Implementasi Database
2.1 Migration Baru
Dibuat tabel reviews dengan relasi kuat ke booking, customer, vehicle, rental_company.
File:
- database/migrations/2026_04_21_000010_create_reviews_table.php
Struktur penting:
- booking_id dibuat unique untuk menjamin satu booking maksimal satu review.
- rating disimpan sebagai unsignedTinyInteger.
- review dibuat nullable agar customer tetap bisa memberi rating walau tanpa komentar.
- Index tambahan untuk query listing dan ringkasan rating.
3. Model dan Relasi
3.1 Model Baru
File:
- app/Models/Review.php
Relasi:
- Review belongsTo Booking
- Review belongsTo User sebagai customer
- Review belongsTo Vehicle
- Review belongsTo RentalCompany
3.2 Penyesuaian Model Existing
File:
-
app/Models/Booking.php
- Tambah relasi hasOne review()
-
app/Models/Vehicle.php
- Tambah relasi hasMany reviews()
-
app/Models/RentalCompany.php
- Tambah relasi hasMany reviews()
-
app/Models/User.php
- Tambah relasi hasMany reviews() dengan foreign key customer_id
4. Controller dan Request
4.1 Customer Review Controller
File:
- app/Http/Controllers/Customer/ReviewController.php
Method:
- create(Booking $booking)
- store(StoreReviewRequest $request, Booking $booking)
Aturan yang ditegakkan di controller:
- Booking harus milik customer login. Jika bukan, response 404.
- Booking harus status completed.
- Booking tidak boleh sudah punya review.
- Data relasi review diambil dari booking valid di server, bukan dari input frontend.
Setelah store sukses:
- Redirect ke detail booking customer dengan flash success.
4.2 Form Request
File:
- app/Http/Requests/StoreReviewRequest.php
Validasi:
- rating: required, integer, min 1, max 5.
- review: nullable, string, max 1000.
Alasan review nullable:
- User bisa cepat memberikan rating tanpa wajib menulis komentar panjang.
4.3 Admin Rental Review Controller
File:
- app/Http/Controllers/AdminRental/ReviewController.php
Method:
- index()
Fungsi:
- Menampilkan review yang hanya milik rental company dari admin login.
- Query menggunakan filter rental_company_id agar admin tidak melihat data rental lain.
5. Routing
File:
- routes/web.php
Route customer review:
- GET /my-bookings/{booking:booking_code}/review -> customer.reviews.create
- POST /my-bookings/{booking:booking_code}/review -> customer.reviews.store
Proteksi:
- middleware auth + role:customer
Route admin rental review:
- GET /admin-rental/reviews -> admin-rental.reviews.index
Proteksi:
- middleware auth + role:admin_rental
6. Perubahan Query Data
6.1 Detail Mobil
File:
- app/Http/Controllers/Customer/KatalogController.php
Pada method show(Vehicle $vehicle):
- Ambil hanya review kendaraan yang terkait booking completed.
- Hitung average rating.
- Hitung total review.
- Hitung breakdown jumlah bintang 1 sampai 5.
- Ambil daftar review terbaru dengan eager loading customer.
Hasil dikirim ke view detail mobil:
- reviews
- averageRating
- totalReviews
- ratingBreakdown
6.2 Riwayat Booking Customer
File:
- app/Http/Controllers/Customer/MyBookingController.php
Perubahan:
- Eager load relasi review pada index.
- Eager load relasi review pada show.
Tujuan:
- Menghindari N+1 saat cek status sudah direview atau belum.
7. Perubahan Blade
7.1 Halaman Form Review Customer
File baru:
- resources/views/customer/reviews/create.blade.php
Isi utama:
- Info kendaraan, rental, booking code, tanggal sewa.
- Input rating 1-5.
- Textarea komentar (opsional).
- Submit ke customer.reviews.store.
7.2 Riwayat Booking Customer (Index)
File:
- resources/views/customer/bookings/index.blade.php
Perubahan:
- Tambah kolom Ulasan.
- Jika completed + belum direview -> status Belum Direview.
- Jika completed + sudah direview -> status Sudah Direview.
- Tombol Beri Ulasan tampil hanya jika completed dan belum direview.
7.3 Detail Booking Customer (Show)
File:
- resources/views/customer/bookings/show.blade.php
Perubahan:
- Jika completed + belum direview -> tampil CTA Beri Ulasan.
- Jika completed + sudah direview -> tampil ringkasan ulasan yang sudah dibuat.
7.4 Detail Mobil - Section Ulasan
File:
- resources/views/detail-mobil/rating-dan-ulasan.blade.php
Perubahan:
- Ganti placeholder menjadi data review nyata.
- Tampil rata-rata rating dan total review.
- Tampil breakdown bintang.
- Tampil daftar review terbaru dengan nama customer disamarkan sebagian.
- Tampil empty state jika belum ada review.
Catatan teknis:
- Untuk menghindari error kompilasi style dinamis pada Blade, visual bar distribusi memakai elemen progress.
7.5 Detail Mobil - Informasi Utama
File:
- resources/views/detail-mobil/informasi-utama.blade.php
Perubahan:
- Tambah ringkasan rating sederhana (avg dan jumlah review).
7.6 Admin Rental - List Ulasan
File baru:
- resources/views/admin-rental/reviews/index.blade.php
Perubahan:
- Tabel sederhana berisi tanggal, kendaraan, customer, booking, rating, cuplikan ulasan.
7.7 Sidebar Admin Rental
File:
- resources/views/components/admin-rental-sidebar.blade.php
Perubahan:
- Tambah menu Data Ulasan ke halaman admin-rental.reviews.index.
8. Validasi Aturan Bisnis yang Dipenuhi
- Customer hanya bisa review booking miliknya sendiri.
- Customer hanya bisa review jika booking completed.
- Satu booking hanya satu review (double guard: unique DB + guard controller).
- Data review terhubung ke booking, vehicle, rental_company, customer.
- Detail mobil menampilkan review nyata dari database.
- Admin rental hanya melihat review rental miliknya.
9. Verifikasi yang Dilakukan
Perintah yang dijalankan:
- php artisan route:list --path=my-bookings; php artisan route:list --path=review; php artisan route:list --path=admin-rental/reviews
- php artisan route:list --path=admin-rental/reviews
Hasil:
- Route customer review create/store terdaftar.
- Route admin rental reviews index terdaftar.
- Pemeriksaan error file penting tidak menemukan error setelah perbaikan akhir.
10. Ringkasan Alur End-to-End
- Booking customer mencapai status completed.
- Di riwayat booking/detail booking muncul tombol Beri Ulasan.
- Customer submit rating dan komentar opsional.
- Backend validasi kepemilikan booking, status completed, dan review belum ada.
- Review disimpan dan terhubung ke booking, vehicle, rental_company, customer.
- Detail mobil otomatis menampilkan ringkasan dan daftar ulasan terbaru.
- Admin rental melihat ulasan masuk pada menu Data Ulasan.
11. Langkah Lanjutan yang Disarankan
- Tambah unit/feature test untuk skenario akses review (ownership, completed, duplicate).
- Tambah endpoint agregasi rating jika nanti dipakai modul promo/CRM.
- Tambah moderation sederhana untuk kualitas konten ulasan sebelum tahap promo.