Sistem booking tiket bus online yang dibangun dengan Laravel 11, menggunakan arsitektur modern dengan Service Layer, Events & Listeners, dan Policy-based authorization.
- Pencarian Trip - Cari trip berdasarkan asal, tujuan, dan tanggal
- Seat Picker Dinamis - Pilih kursi dengan layout real-time dari database
- Rekomendasi Kursi Otomatis - Sistem cerdas untuk rekomendasi kursi terbaik
- Booking dengan Validasi - Mencegah double booking dengan database transaction
- Notifikasi WhatsApp - Integrasi dengan Fonnte untuk notifikasi otomatis
- E-Ticket PDF - Download tiket dalam format PDF
- Cancel Booking - User bisa membatalkan booking sendiri (status pending)
- Audit Log - Log lengkap setiap perubahan status booking
- Role-based Access Control - Admin dan User dengan permission berbeda
- Policy-based Authorization - Fine-grained access control
- Rate Limiting - Mencegah spam booking
- Input Validation - Validasi dan sanitasi input
- Concurrency Control - Mencegah race condition saat booking
- CRUD Bus, Route, Trip, Booking
- Manage Seat Layout - Atur layout kursi per bus
- WhatsApp Logs - Monitor notifikasi WhatsApp
- Export CSV - Export data booking dan trip
- Dashboard Statistik - Overview sistem
- PHP >= 8.2
- Composer >= 2.0
- MySQL >= 8.0 atau PostgreSQL >= 13
- Node.js >= 18 (untuk build assets)
- NPM atau Yarn
- BCMath
- Ctype
- Fileinfo
- JSON
- Mbstring
- OpenSSL
- PDO
- Tokenizer
- XML
git clone https://github.com/ShinZeleo/SiBusku.git
cd SiBusku# Install PHP dependencies
composer install
# Install Node dependencies
npm install# Copy file environment
cp .env.example .env
# Generate application key
php artisan key:generateEdit file .env dan sesuaikan konfigurasi database:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sibusku
DB_USERNAME=root
DB_PASSWORD=π Untuk tutorial lengkap, lihat: TUTORIAL_FONNTE_API.md
Ringkasan cepat:
- Daftar akun di https://fonnte.com
- Buat device dan dapatkan token API
- Hubungkan device dengan scan QR Code
- Tambahkan konfigurasi di
.env:
FONNTE_API_URL=https://api.fonnte.com/send
FONNTE_API_TOKEN=your_token_here
FONNTE_ADMIN_PHONE=6281234567890
FONNTE_DEFAULT_COUNTRY=62
WHATSAPP_ENABLED=true
WHATSAPP_TIMEOUT=3# Buat database (jika belum ada)
# mysql -u root -p
# CREATE DATABASE sibusku;
# Jalankan migration dan seeder
php artisan migrate --seednpm run build
# atau untuk development
npm run devphp artisan serveAkses aplikasi di: http://localhost:8000
Setelah menjalankan seeder, gunakan kredensial berikut:
- Email:
admin@sibusku.com - Password:
password
- Email:
budi@example.com - Password:
password - Email:
siti@example.com - Password:
password
- Buka halaman home (
/) - Isi form pencarian:
- Kota Asal
- Kota Tujuan
- Tanggal Keberangkatan
- Klik "Cari Trip"
- Pilih trip dari hasil pencarian
- Klik "Lihat Detail" pada trip yang dipilih
- Klik "Pilih Kursi dan Booking"
- Isi data pemesan (nama, WhatsApp)
- Klik "PILIH KURSI"
- Pilih kursi atau klik "Pilih Kursi Terbaik untuk Saya"
- Klik "GUNAKAN KURSI"
- Klik "KONFIRMASI BOOKING"
- Akan diarahkan ke halaman success
- Login sebagai user
- Buka "Riwayat Booking"
- Klik "Lihat Detail" pada booking yang sudah confirmed
- Klik "Download E-Ticket PDF"
- Login sebagai user
- Buka "Riwayat Booking"
- Klik "Batal" pada booking dengan status pending
- Konfirmasi pembatalan
- Login sebagai admin
- Buka "Bus" di menu admin
- Klik "Layout Kursi" pada bus yang ingin dikelola
- Atur nomor kursi, baris, kolom, dan section
- Klik "Simpan Layout"
# Jalankan semua test
php artisan test
# Jalankan test spesifik
php artisan test --filter BookingSeatConflictTest
php artisan test --filter AdminRouteAccessTest
php artisan test --filter UserCancelBookingTest- BookingSeatConflictTest - Test mencegah double booking kursi
- AdminRouteAccessTest - Test akses route admin
- UserCancelBookingTest - Test cancel booking oleh user
# Reset database dan seed ulang
php artisan migrate:fresh --seed
# Atau hanya seed tanpa reset
php artisan db:seed --class=DatabaseSeeder- 1 Admin user
- 2 User biasa
- 3 Bus dengan seat layout lengkap
- 4 Route (Jakarta-Bandung, Jakarta-Yogyakarta, dll)
- 10+ Trip aktif
- 2 Sample booking
Lihat dokumen lengkap: ARSITEKTUR_SISTEM.md
- Service Layer - Business logic terpisah dari controller
- Events & Listeners - Event-driven architecture
- Policies - Policy-based authorization
- API Endpoints - RESTful API untuk frontend
sibusku/
βββ app/
β βββ Events/ # Laravel Events
β βββ Http/
β β βββ Controllers/ # Controllers
β β βββ Middleware/ # Custom middleware
β β βββ Requests/ # Form requests
β βββ Listeners/ # Event listeners
β βββ Models/ # Eloquent models
β βββ Policies/ # Authorization policies
β βββ Services/ # Business logic services
βββ database/
β βββ factories/ # Model factories
β βββ migrations/ # Database migrations
β βββ seeders/ # Database seeders
βββ resources/
β βββ views/ # Blade templates
β βββ js/ # JavaScript (Alpine.js)
β βββ css/ # Tailwind CSS
βββ routes/
β βββ web.php # Web routes
βββ tests/
βββ Feature/ # Feature tests
Untuk fitur export PDF, install package:
composer require barryvdh/laravel-dompdf
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"- Laporan Lengkap Sistem - Dokumentasi lengkap fitur, relasi, dan arsitektur
- Implementasi Lanjutan - Fitur lanjutan untuk nilai A++
- Arsitektur Sistem - Diagram arsitektur untuk presentasi
- Testing - Dokumentasi testing
- Ringkasan Final - Ringkasan semua implementasi
- Pastikan
FONNTE_API_TOKENsudah diisi di.env - Pastikan nomor admin (
FONNTE_ADMIN_PHONE) valid - Cek log di
storage/logs/laravel.log
- Pastikan JavaScript sudah di-build (
npm run build) - Cek browser console untuk error JavaScript
- Pastikan API endpoint
/api/trips/{trip}/seatsbisa diakses
- Install package:
composer require barryvdh/laravel-dompdf - Pastikan booking status sudah
confirmed
MIT License
- Developer: ShinZeleo
- Laravel Framework
- Tailwind CSS
- Alpine.js
- Fonnte API
Selamat menggunakan SIBUSKU! πβ¨