Sistem Reservasi Kendaraan Kantor (FleetOffice)
Sistem informasi operasional kantor untuk mengelola permohonan, penugasan, dan pemantauan armada kendaraan dinas. Sistem ini memfasilitasi pengajuan langsung oleh pegawai, proses verifikasi dan penjadwalan oleh tim General Affairs (GA), pengiriman surat tugas pengemudi via WhatsApp, validasi gerbang oleh pos keamanan menggunakan tiket QR, serta pencatatan jarak tempuh kendaraan.
Pegawai dapat mengajukan permohonan dinas dengan mengisi data nama dan kontak kantor tanpa kewajiban registrasi akun.
Mendukung pemisahan jadwal keberangkatan dan penjemputan dengan armada atau pengemudi yang berbeda.
Pemeriksaan izin keluar-masuk oleh pos keamanan melalui pemindaian tiket QR serta pencatatan angka spidometer kendaraan.
π Struktur Direktori: Core Framework vs Modul Aplikasi Kustom
Dokumentasi pemetaan arsitektur direktori untuk memisahkan komponen inti engine framework Laravel dan modul logika bisnis yang dikembangkan khusus.
Folder utama tempat seluruh aturan bisnis dan alur kerja aplikasi berada.
- app/Models/ : 6 Model bisnis (Reservation, Vehicle, Driver, TripAssignment, GateLog, Setting).
- app/Http/Controllers/ : 10 Controller (Approval, GatePass, Plotting, Master Data, dll).
- app/Services/ : FonnteService.php (WhatsApp Gateway API).
- app/Mail/ : ReservationStatusMail & TripTicketMail.
Berisi seluruh halaman HTML/Blade dengan desain Tailwind CSS modern.
- views/ga/ : Approval, Plotting, Master Mobil & Supir, Pengaturan SMTP/WA.
- views/gate/ : Modul Pos Security (Scan QR kamera & Log gerbang).
- views/reservations/ : Form pengajuan publik & pelacakan status.
- views/dashboard/ : Visualisasi kalender mingguan armada.
- views/layouts/ : Navbar header strictly-segregated per role.
- views/qr/ : Tiket boarding pass digital untuk HP driver/pemohon.
Tempat mendefinisikan skema tabel MySQL dan data awal (seeder).
- migrations/ : Migrasi 6 tabel bisnis (tb_vehicles, tb_drivers, tb_reservations, tb_trip_assignments, tb_gate_logs, tb_settings).
- seeders/ : RoleAndUserSeeder & SampleReservationsSeeder.
Akses web publik browser dan pengatur alamat URL sistem.
- public/panduan.php : Buku panduan interaktif visual ini.
- public/qr/ : Folder penyimpan file barcode QR SVG tiket.
- public/build/ : Bundel aset CSS & JS mandiri tanpa node_modules.
- routes/web.php : Rute navigasi dengan proteksi RBAC.
Folder vendor/ berisi ribuan library pihak ketiga Composer (jangan pernah mengubah kode di dalamnya secara manual). Folder storage/ menyimpan data runtime seperti log error (storage/logs/laravel.log) dan cache aplikasi. Kedua folder ini wajib ada dan tidak boleh dihapus.
π Data Flow Diagram (DFD)
Alur pergerakan data dari karyawan, PIC GA, pos security, pimpinan, hingga notifikasi WhatsApp.
1. DFD Level 0 (Context Diagram)
2. DFD Level 1 (Siklus Proses Bisnis)
πΊοΈ Entity Relationship Diagram (ERD)
Struktur relasi data antar tabel database MySQL/MariaDB (`vehicle_reservation`).
ποΈ Skema Tabel Database (MySQL / phpMyAdmin)
Database sistem tersimpan pada basis data MariaDB/MySQL Laragon dengan nama vehicle_reservation.
Menyimpan pengajuan perjalanan dinas. Kolom `user_id` bernilai NULL jika diajukan tanpa login.
Sesi penugasan mobil & supir. Jika Split-Trip, 1 reservasi memiliki 2 baris (antar & jemput).
Catatan riil waktu keluar/masuk pos gerbang beserta angka speedometer odometer (KM).
Master armada mobil kantor (nomor plat, merk, status) & master supir beserta nomor WhatsApp.
tb_drivers (nama, no_hp, status)
π‘οΈ Matriks Hak Akses Peran (RBAC)
Navigasi header dan modul telah diisolasi secara ketat per peran agar tidak tumpang tindih.
| Fitur / Halaman | Publik / Tamu | Karyawan (User) | PIC GA | Pos Security | Management |
|---|---|---|---|---|---|
| Form Pengajuan Reservasi | β | β | β | β (Redirect) | β |
| Pelacakan Status Mandiri | β | β | β | β | β |
| Approval & Plotting Armada | β | β | β | β | β |
| Master Mobil, Supir & Setting | β | β | β | β | β |
| Scan Barcode Gate Pass & KM | β | β | β | β Eksklusif | β |
| Jadwal Kalender Mingguan | β | β | β | β | β Read-Only |
π Standar Operasional Prosedur (SOP)
Tahapan operasional nyata dari hulu ke hilir.
π Panduan Akses Login, Tautan Server & Kredensial Akun Default
Alamat URL untuk mengakses antarmuka autentikasi sistem serta daftar akun default untuk demonstrasi dan inisialisasi awal.
Atau gunakan http://localhost:8000/login / http://vehicle-reservation.test/login saat server Laragon aktif.
Sesuai domain atau subdomain instansi yang didaftarkan pada berkas .env (APP_URL).
*Klik tombol demo di atas untuk mengisi form login secara instan.
Daftar Akun Default Sistem (Inisialisasi Database Seeder):
| Peran Akun (Role) | Alamat Email Login | Kata Sandi Default | Hak Akses & Modul yang Terbuka |
|---|---|---|---|
| 1. Administrator GA (PIC GA) | ga@kantor.com | password | Akses penuh: Verifikasi Approval, Plotting Mobil/Supir, Master Mobil, Master Driver, Laporan Audit, User Management, dan Setting Gateway. |
| 2. Pos Security Gerbang | security@kantor.com | password | Otomatis langsung ke modul pemindaian Barcode Tiket QR Gate Pass, validasi fisik armada/driver, serta input angka Odometer (KM). |
| 3. Pimpinan / Direksi (Management) | management@kantor.com | password | Akses eksekutif: Memantau visualisasi Kalender Jadwal Mingguan seluruh armada dan mengunduh berkas Laporan Rekapitulasi Audit CSV / Excel. |
| 4. Pegawai Internal (User Terdaftar) | user@kantor.com | password | Mengajukan reservasi dengan form terisi otomatis dari profil, memantau riwayat dinas pribadi, dan membuka tiket QR digital. |
Kata sandi bawaan password di atas hanya ditujukan untuk inisialisasi awal. Segera masuk ke akun GA -> buka menu Manajemen User (/ga/users) -> ubah kata sandi seluruh akun default menjadi kombinasi kata sandi yang kuat sebelum sistem digunakan oleh pegawai kantor.
π Panduan Karyawan: Mengisi Formulir Reservasi & Melacak Tiket
Petunjuk visual antarmuka pengajuan kendaraan dinas tanpa kewajiban login hingga memperoleh tiket QR.
Penjelasan Elemen Formulir Pengajuan:
Karyawan tamu tidak wajib login. Cukup isi Nama, Email Kantor, dan No WhatsApp. Pastikan email dan WhatsApp aktif karena tautan tiket QR akan dikirimkan otomatis ke kontak tersebut.
Tuliskan divisi dan nama-nama staf yang ikut serta beserta jumlah orangnya (misal: "Divisi Keuangan - 3 Orang") agar GA dapat memilih mobil dengan kapasitas kursi yang mencukupi.
Cantumkan nama gedung, instansi, atau alamat lengkap agar supir dapat merencanakan rute tercepat dan estimasi waktu tempuh secara presisi.
Pilih tanggal dan jam keberangkatan serta estimasi jam kepulangan. Jadwal ini akan langsung dikunci di kalender armada untuk mencegah tabrakan jam pemakaian.
Gunakan Mode Split-Trip jika Anda hanya butuh diantar ke lokasi rapat dan dijemput kembali sore harinya. Mobil tidak perlu menunggu seharian di tempat parkir dan dapat dipakai dinas lain.
Klik tombol kirim. Sistem akan menerbitkan ID Reservasi dan menampilkan halaman pelacakan status secara langsung (*Live Tracking*).
*Tunjukkan layar ini kepada petugas pos security saat checkout keluar kantor dan saat checkin kembali.
π Panduan Membaca Kalender Jadwal Mingguan (/dashboard)
Cara membaca matriks jadwal dinas armada agar tidak terjadi bentrok agenda kantor.
π Panduan GA: Verifikasi Approval & Plotting Penugasan Armada
Alur meninjau pengajuan masuk, menyetujui, menolak dengan alasan, dan menugaskan mobil serta driver.
π Panduan GA: Manajemen Master Data Mobil & Supir
Tata cara menambah armada mobil baru, mengatur status operasional (Ready/Dinas/Bengkel), serta mengelola lisensi driver.
| Plat Nomor | Merk & Model | Kapasitas | Status Operasional | Aksi |
|---|---|---|---|---|
| B 1234 KAA | Toyota Innova Reborn 2.4 V | 7 Orang | Ready | Edit β’ Kirim Bengkel |
| B 5678 DEF | Toyota Avanza 1.5 G TSS | 7 Orang | Sedang Dinas | Edit |
| B 9012 GHI | Toyota HiAce Commuter | 15 Orang | Servis Bengkel | Selesai Servis |
1. Buka menu Master Supir -> Klik + Tambah Supir.
2. Masukkan Nama Lengkap, Nomor WhatsApp aktif (format internasional e.g. 6281234567890), dan Nomor Lisensi SIM (SIM A / B1).
3. Supir yang sedang bertugas atau sedang izin/cuti dapat diubah statusnya menjadi Cuti agar tidak muncul dalam daftar pilihan saat GA melakukan plotting permohonan dinas.
π Panduan GA: Laporan Rekapitulasi Audit Jarak Tempuh & Ekspor CSV
Tata cara memeriksa odometer mobil, menghitung konsumsi BBM, dan mengunduh berkas laporan format Excel/CSV.
| Tgl Dinas | Mobil & Supir | Pemohon / Tujuan | KM Keluar (Checkout) | KM Kembali (Checkin) | Total KM Tempuh |
|---|---|---|---|---|---|
| 01/09/2026 | Innova B 1234 KAA Driver: Supriyadi |
Budi Santoso Kemenkeu RI |
45.200 km | 45.265 km | +65 KM |
π Panduan GA: Manajemen User & Integrasi Gateway Notifikasi
Tata cara mengelola akun pengguna, reset kata sandi, pengaturan token Fonnte WhatsApp, dan pengujian server SMTP Email.
Modul untuk mendaftarkan akun staf internal instansi:
User, GA, Security, atau Management.
Modul untuk mengonfigurasi jalur komunikasi otomatis sistem:
md.fonnte.com, lalu klik tombol "Uji Coba Kirim Pesan WA" untuk memastikan pesan simulasi sukses masuk ke nomor penguji.
smtp.gmail.com), Port (587 TLS / 465 SSL), Email, dan App Password, lalu klik tombol "Uji Coba Kirim Email".
π Panduan Pos Security: Scan Barcode QR & Pencatatan Odometer
Petunjuk operasional pemindaian Gate Pass mobil dinas keluar dan masuk kantor.
π Panduan Konfigurasi Database & Deployment (Lokal vs Hosting)
Panduan lengkap mengatur berkas .env dan migrasi dari Laragon lokal ke cPanel / VPS Server.
| Variabel Environment | π» Komputer Lokal (Laragon) | π Web Hosting / cPanel (Production) |
|---|---|---|
| APP_ENV | local | production |
| APP_DEBUG | true (penelusuran galat tahap pengembangan) | false (Wajib nonaktif demi keamanan data) |
| APP_URL | http://127.0.0.1:8000 | https://reservasi.namakantor.com |
| DB_HOST | 127.0.0.1 | localhost (atau IP MySQL host) |
| DB_DATABASE | vehicle_reservation | cpaneluser_vehicle (sesuai nama di cPanel) |
| DB_USERNAME | root | cpaneluser_admin (user MySQL cPanel) |
| DB_PASSWORD | (kosong / tanpa password) | P@ssw0rdKuat123# |
Menjalankan di Lokal (Laragon)
- Buka aplikasi Laragon lalu klik tombol Start All.
- Buka browser ke
http://localhost/phpmyadmindan buat database bernamavehicle_reservation. - Import file
vehicle_reservation_schema_empty.sqlyang sudah Anda unduh. - Buka terminal di folder proyek dan jalankan:
php artisan serve
- Akses website di browser: http://127.0.0.1:8000
Menjalankan di Web Hosting (cPanel)
- Masuk cPanel -> Buka menu MySQL Databases -> Buat Database dan User baru, lalu berikan hak ALL PRIVILEGES.
- Buka phpMyAdmin cPanel -> Pilih database tersebut -> Klik tab Import -> Upload file skema SQL bersih.
- Upload file proyek ke folder luar
/home/user/fleetoffice/. - Pindahkan isi folder
public/ke folderpublic_html/. - Buka Terminal cPanel dan bersihkan cache aplikasi:
php artisan config:cache php artisan route:cache php artisan view:cache
Tata Cara Mengganti Username & Password Database
Jika Anda ingin mengganti akun pengguna database (misalnya membuat kredensial baru dengan password yang kuat), jalankan 3 tahapan berikut:
Buka berkas .env dan ubah nilainya:
DB_USERNAME=user_baru DB_PASSWORD="Password123#"
*Gunakan tanda petik ganda "..." jika password mengandung karakter khusus (#, !, $, spasi).
User harus sudah dibuat di MySQL agar Laravel bisa masuk:
- Laragon: Buka phpMyAdmin → Tab User accounts → Add user account → Berikan hak akses database.
- cPanel: Menu MySQL Databases → Add New User → Pasangkan ke database dengan ALL PRIVILEGES.
Jalankan perintah ini di terminal agar Laravel segera membaca kredensial terbaru:
php artisan config:clear
Atau restart php artisan serve dengan menekan Ctrl+C lalu jalankan ulang.
π οΈ Kamus Kode Error & Panduan Penanganan Masalah
Daftar potensi pesan error sistem (Database, Web Server, HTTP, & API) beserta cara mengatasinya secara mandiri.
1. Masalah Database & Query (MySQL / MariaDB)
Penyebab: Layanan MySQL (Laragon/MariaDB) mati atau nomor port database salah.
.env tertulis DB_PORT=3306.
Penyebab: Username / Password pada berkas .env tidak cocok dengan kredensial MySQL.
DB_USERNAME & DB_PASSWORD di .env. Jika di Laragon default-nya adalah user root tanpa password. Lalu jalankan php artisan config:clear.
Penyebab: Nama database yang dicari belum pernah dibuat di phpMyAdmin.
http://localhost/phpmyadmin, buat database bernama vehicle_reservation, lalu import file skema SQL.
Penyebab: Basis data telah dibuat namun struktur tabel belum diinisialisasi (skema basis data belum di-import).
vehicle_reservation_schema_empty.sql lewat phpMyAdmin atau ketik php artisan migrate di terminal.
2. Masalah Protokol Web & HTTP Status Code
Token CSRF habis karena form terlalu lama tidak disubmit.
Error sintaks PHP, file .env hilang, atau folder storage tidak ada write-permission.
storage/logs/laravel.log & jalankan php artisan key:generate.
Halaman depan muncul tapi link lain 404 Not Found di web hosting.
public_html.
3. Masalah Notifikasi WhatsApp (Fonnte) & Email SMTP
- Periksa status WhatsApp di md.fonnte.com (harus bertuliskan Connect).
- Buka menu GA → Pengaturan Sistem dan periksa kembali Token API Fonnte.
- Gunakan tombol "Test Kirim WhatsApp" di aplikasi untuk simulasi langsung.
- Jika menggunakan Gmail SMTP, wajib menggunakan App Password 16 Digit (bukan password login biasa).
- Pastikan port SMTP diset ke
465(SSL) atau587(TLS). - Gunakan fitur "Test Kirim Email" di menu Pengaturan GA.
4. Masalah Khusus Lingkungan Hosting (cPanel / Shared Hosting / VPS)
Gejala: Composer error: require a PHP version ">= 8.2.0".
Gejala: Domain HTTPS tapi aset CSS/JS di-load via HTTP polos sehingga terblokir browser.
APP_URL=https://... di .env hosting dan aktifkan URL::forceScheme('https') di AppServiceProvider.php.
Gejala: Layar putih tanpa pesan karena APP_DEBUG=false saat terjadi fatal error.
public_html/error_log untuk melihat baris error sesungguhnya.
Gejala: Foto armada atau tiket QR tidak muncul karena fungsi symlink hosting di-disable.
php artisan storage:link di Terminal cPanel, atau buat route URL sementara untuk memanggil Artisan::call('storage:link').
Gejala: Folder vendor tertinggal atau path di public_html/index.php salah arah.
index.php mengarah tepat ke folder proyek luar: __DIR__.'/../fleetoffice/vendor/autoload.php'.
Gejala: Saat download laporan audit besar, proses putus karena limit PHP 30 detik.
max_execution_time jadi 120 dan memory_limit jadi 512M.
Prosedur Pemulihan & Pemeliharaan Cache Sistem (System Maintenance & Recovery Commands)
Apabila sistem mengalami kendala inkonsistensi antarmuka pengguna, pembaruan rute tidak terdeteksi, atau konfigurasi baru pada berkas .env belum dimuat oleh engine framework, jalankan prosedur pembersihan cache berikut melalui terminal:
# Membersihkan seluruh cache konfigurasi, routing, event, dan kompilasi view php artisan optimize:clear
π Matriks Notifikasi Otomatis (WhatsApp Gateway & Email SMTP)
Spesifikasi alur pengiriman pesan real-time berbasis peristiwa (event-driven) kepada pemohon dan driver bertugas.
| Peristiwa Pemicu (Trigger) | Pihak Penerima | Saluran Media | Data / Isi Notifikasi |
|---|---|---|---|
| 1. Persetujuan Reservasi (Approval) | Pemohon / Karyawan | WhatsApp Email | Status DISETUJUI β , rincian agenda (Tujuan, Peserta, Jam), serta link lacak status. |
| 2. Penolakan Reservasi (Rejection) | Pemohon / Karyawan | WhatsApp Email | Status DITOLAK β disertai Catatan / Alasan Resmi Penolakan dari GA. |
| 3. Plotting & Terbit Tiket | Pemohon / Karyawan | WhatsApp Email | Tiket QR Pass Digital: Plat mobil, nama & kontak supir, serta Link Barcode Tiket. |
| 4. Plotting & Terbit Tiket | Driver / Supir Bertugas | WhatsApp Resmi | Surat Tugas Operasional (SPK): Unit armada, nama penumpang, destinasi, dan instruksi odometer. |
TRIP-9A2B4C-15π‘οΈ Arsitektur Keamanan Informasi, Manajemen Risiko & Mitigasi
Standar perlindungan data instansi, analisis potensi ancaman siber, dan prosedur operasional penanganannya.
Kata sandi diacak satu arah dengan garam unik (*salt*), kebal dari pembobolan kamus (*rainbow table*).
Pos security terisolasi mutlak dari data GA. Dropdown tukar peran dihapus total demi integritas akses.
Setiap formulir transaksi wajib memverifikasi token kriptografis rahasia untuk menangkal aksi pemalsuan sesi.
Seluruh query memakai ORM prepared statements dan parameter binding, mengeliminasi celah injeksi database.
Karakter HTML otomatis di-escape sebelum tampil di peramban, menolak injeksi skrip JavaScript jahat.
Tiket QR memakai token alfanumerik acak, bukan angka ID urut, mencegah tebak-tebakan tiket digital.
Jalur komunikasi wajib terenkripsi SSL/HTTPS di server produksi untuk menangkal penyadapan jaringan (*sniffing*).
Password database dan token WA diisolasi di luar public folder dengan APP_DEBUG=false saat produksi.
π Matriks Analisis Risiko Keamanan & Penanganannya
| Skenario Potensi Risiko | Tingkat Risiko | Dampak Operasional | Solusi & Mitigasi Sistem |
|---|---|---|---|
| 1. Brute Force Login Petugas | Tinggi | Akun PIC GA / Security diambil alih pihak luar. | Login Rate Limiting: Maksimal 5 percobaan gagal berturut-turut sebelum akun diblokir sementara 60 detik. |
| 2. Pemalsuan Tiket QR Mobil | Tinggi | Kendaraan dinas keluar pool kantor tanpa izin resmi. | Validasi Silang Fisik: Security memvalidasi kesesuaian plat mobil, nama driver bertugas, dan identitas penumpang di layar scan. |
| 3. Kebocoran Berkas .env | Kritis | Kredensial database dan token Fonnte terekspos. | Isolasi Document Root: File proyek di luar public_html dan berkas .* otomatis diblokir oleh web server. |
| 4. Kebocoran Riwayat Perjalanan | Sedang | Jadwal mobilitas direksi dan staf tersebar ke publik. | RBAC Laporan: Modul laporan audit dan rekapitulasi data hanya dapat diakses oleh akun Manajemen dan PIC GA. |
| 5. Kuota WhatsApp Habis / Spamming | Sedang | Notifikasi tiket QR ke pemohon dan driver terhambat. | Event Throttling: Pesan WA hanya dikirim saat peristiwa resmi (Approval, Rejection, Plotting). Nomor HP distandarisasi ke format internasional. |
Prosedur Standar Tanggap Insiden Keamanan (Incident Response Procedure)
Buka menu GA → Manajemen User (`/ga/users`), segera reset kata sandi akun terkait atau ubah status peran menjadi nonaktif, lalu bersihkan sesi login lewat terminal.
Segera ganti password database di cPanel dan regenerate token Fonnte di dashboard md.fonnte.com, perbarui berkas .env, lalu jalankan php artisan optimize:clear.