Aplikasi Bengkel Project Doc

Ini adalah dokumentasi project Aplikasi-Bengkel

Tue May 26 2026
2131 words · 17 minutes
Documentation No tags assigned

Dokumentasi Aplikasi Bengkel Home Service

Daftar Isi

  1. Gambaran Umum
  2. Tech Stack
  3. Instalasi & Setup
  4. Arsitektur Aplikasi
  5. Database & Model
  6. Fitur Utama
  7. Routing & API
  8. Frontend
  9. Testing
  10. Deployment

Gambaran Umum

Bengkel Home Service (ASM MOTOR) adalah aplikasi booking servis motor panggilan berbasis web. Pelanggan dapat memesan layanan servis motor (ganti oli, tune up, perbaikan ringan) yang dikerjakan langsung di lokasi pelanggan oleh mekanik keliling.

Tujuan Aplikasi

  • Menyediakan platform booking online untuk servis motor home service
  • Mengelola paket layanan dan item servis custom
  • Menghitung biaya transport berdasarkan jarak
  • Memvalidasi area coverage layanan
  • Menyediakan dashboard admin untuk manajemen booking dan analitik

Lokasi Operasional

Karawang, Jawa Barat, Indonesia (area coverage mencakup Karawang Barat, Timur, Kota, dan sekitarnya dalam radius operasional).


Tech Stack

Backend

TeknologiVersiKeterangan
PHP8.4Runtime
Laravel13Framework utama
Inertia.js3Bridge server-client
Fortify1Autentikasi
Wayfinder0.xTyped route generation
Pest4Testing framework
Pint1Code formatter
Sail1Docker dev environment

Frontend

TeknologiVersiKeterangan
Svelte5UI framework
Tailwind CSS4Utility-first CSS
Vite8Build tool
Leaflet1.9Peta interaktif
Lucide Svelte0.468Icon library
bits-ui2.15Headless UI components
svelte-sonner0.3Toast notifications

Database

  • MySQL (default)
  • SQLite (development alternatif)

Instalasi & Setup

Prasyarat

  • PHP >= 8.3
  • Composer
  • Node.js & npm
  • MySQL / MariaDB
  • Git

Langkah Instalasi

Terminal window
# 1. Clone repository
git clone <repository-url>
cd aplikasi-bengkel
# 2. Install dependencies
composer install
npm install
# 3. Setup environment
cp .env.example .env
php artisan key:generate
# 4. Konfigurasi database di .env
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=aplikasi_bengkel
# DB_USERNAME=root
# DB_PASSWORD=
# 5. Jalankan migrasi dan seeder
php artisan migrate
php artisan db:seed
# 6. Build frontend assets
npm run build
# 7. Jalankan development server
composer run dev
# Atau manual:
# php artisan serve
# npm run dev (di terminal terpisah)

Shortcut Setup (Composer Script)

Terminal window
composer run setup

Script ini otomatis menjalankan: install dependencies, copy .env, generate key, migrate, install npm, dan build assets.

Environment Variables Penting

VariableKeteranganDefault
APP_NAMENama aplikasiBengkel Home Service
APP_TIMEZONETimezoneAsia/Jakarta
APP_LOCALELocaleid
WORKSHOP_CONTACT_PHONENomor telepon bengkel-
WORKSHOP_CONTACT_WHATSAPPNomor WhatsApp bengkel-
WORKSHOP_FOOTER_ADDRESSAlamat bengkelJl. Badami Ciherang…
WORKSHOP_FOOTER_LATITUDELatitude lokasi bengkel-6.3025000
WORKSHOP_FOOTER_LONGITUDELongitude lokasi bengkel107.3035000
WORKSHOP_TRANSPORT_FREE_RADIUS_KMRadius gratis ongkir (km)10
WORKSHOP_TRANSPORT_FEE_PER_KMBiaya per km di luar radius5000

Arsitektur Aplikasi

Struktur Direktori Utama

aplikasi-bengkel/
├── app/
│ ├── Actions/ # Business logic (single-responsibility)
│ │ ├── Booking/ # Aksi terkait booking
│ │ ├── CustomServiceItem/# Aksi item servis custom
│ │ ├── Fortify/ # Aksi autentikasi
│ │ ├── ServicePackage/ # Aksi paket servis
│ │ └── Visitor/ # Aksi tracking visitor
│ ├── Concerns/ # Shared traits
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── Admin/ # Controller panel admin
│ │ │ ├── Public/ # Controller halaman publik
│ │ │ └── Settings/ # Controller pengaturan user
│ │ ├── Middleware/ # HTTP middleware
│ │ └── Requests/ # Form request validation
│ ├── Models/ # Eloquent models
│ └── Support/
│ └── Enums/ # PHP enums
├── config/
│ ├── booking.php # Konfigurasi booking
│ └── workshop.php # Konfigurasi bengkel
├── database/
│ ├── factories/ # Model factories
│ ├── migrations/ # Database migrations
│ └── seeders/ # Database seeders
├── resources/
│ └── js/
│ ├── components/ # Svelte components
│ │ ├── admin/ # Komponen admin
│ │ ├── public/ # Komponen publik
│ │ └── ui/ # UI primitives (shadcn-svelte)
│ ├── layouts/ # Layout templates
│ └── pages/ # Inertia pages
│ ├── admin/ # Halaman admin
│ ├── auth/ # Halaman autentikasi
│ ├── public/ # Halaman publik
│ └── settings/ # Halaman pengaturan
├── routes/
│ ├── web.php # Route utama
│ └── settings.php # Route pengaturan
└── tests/
├── Feature/ # Feature tests
└── Unit/ # Unit tests

Pola Arsitektur

Actions Pattern

Aplikasi menggunakan pola Actions untuk memisahkan business logic dari controller. Setiap action adalah class dengan satu tanggung jawab tunggal.

app/Actions/Booking/
├── CalculateBookingPriceAction.php # Hitung total harga booking
├── CalculateTransportChargeAction.php # Hitung biaya transport
├── CreateBookingAction.php # Buat booking baru
├── DeleteBookingAction.php # Hapus booking
├── GenerateBookingCodeAction.php # Generate kode booking unik
├── GetBookingFooterLocationAction.php # Ambil lokasi footer
├── GetBookingServiceFeeAction.php # Ambil biaya jasa
├── GetBookingTransportChargeSettingsAction.php # Ambil setting transport
├── GetPublicBookingPageDataAction.php # Data untuk halaman booking publik
├── UpdateBookingFooterLocationAction.php # Update lokasi footer
├── UpdateBookingNotesAction.php # Update catatan booking
├── UpdateBookingServiceFeeAction.php # Update biaya jasa
├── UpdateBookingStatusAction.php # Update status booking
├── UpdateBookingTransportChargeAction.php # Update biaya transport
├── ValidateBookingSlotAction.php # Validasi ketersediaan slot
└── ValidateCoverageAreaAction.php # Validasi area coverage

Enums

// BookingStatus: pending, confirmed, on_the_way, completed, cancelled, rescheduled
// MotorcycleType: matic, bebek, sport, lainnya
// PackageType: fixed_package, custom_package

Price Snapshot

Saat booking dibuat, nama dan harga paket/item di-snapshot ke dalam record booking. Ini memastikan perubahan harga di masa depan tidak mempengaruhi booking yang sudah ada.


Database & Model

Entity Relationship Diagram (Konseptual)

┌─────────────────┐ ┌──────────────────────┐
│ ServicePackage │ │ ServicePackageItem │
├─────────────────┤ ├──────────────────────┤
│ id │──┐ │ id │
│ name │ │ │ service_package_id │──┐
│ slug │ │ │ name │ │
│ short_description│ │ │ description │ │
│ description │ └───>│ display_order │ │
│ price │ └──────────────────────┘ │
│ duration_estimate│ │
│ is_active │ │
│ display_order │ │
└─────────────────┘ │
│ │
│ (nullable FK) │
▼ │
┌─────────────────────────────────────────────┐ │
│ Booking │ │
├─────────────────────────────────────────────┤ │
│ id, booking_code │ │
│ customer_name, customer_email, customer_phone│ │
│ motorcycle_type, motorcycle_brand/model/year │ │
│ plate_number │ │
│ package_type, service_package_id │◄────┘
│ package_name_snapshot, package_price_snapshot │
│ notes, service_date, service_time │
│ status │
│ subtotal_price, service_fee │
│ transport_distance_km, transport_charge │
│ total_price │
│ address_text, house_landmark │
│ latitude, longitude │
│ admin_notes, requires_manual_review │
│ confirmed_at, completed_at │
└─────────────────────────────────────────────┘
│ │
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────────┐
│ BookingCustomItem│ │ BookingStatusLog │
├──────────────────┤ ├──────────────────────┤
│ id │ │ id │
│ booking_id │ │ booking_id │
│ custom_service_ │ │ old_status │
│ item_id │ │ new_status │
│ item_name_snapshot│ │ changed_by (user_id) │
│ item_price_snapshot│ │ note │
│ qty │ └──────────────────────┘
│ subtotal │
└──────────────────┘
│ (nullable FK)
┌──────────────────────┐
│ CustomServiceItem │
├──────────────────────┤
│ id │
│ name, slug │
│ category │
│ description │
│ price │
│ unit_label │
│ is_active │
│ display_order │
└──────────────────────┘
┌──────────────────┐ ┌──────────────────┐
│ BookingSetting │ │ VisitorLog │
├──────────────────┤ ├──────────────────┤
│ id │ │ id │
│ service_fee │ │ visit_date │
│ transport_free_ │ │ ip_hash │
│ radius_km │ │ session_key │
│ transport_fee_ │ │ path │
│ per_km │ │ referrer │
│ footer_address │ │ user_agent │
│ footer_latitude │ │ is_unique_daily │
│ footer_longitude │ └──────────────────┘
└──────────────────┘

Deskripsi Tabel

service_packages

Paket layanan servis tetap yang ditawarkan bengkel.

KolomTipeKeterangan
namestringNama paket
slugstring (unique)URL-friendly identifier
short_descriptionstring(255)Deskripsi singkat
descriptiontextDeskripsi lengkap
priceunsigned intHarga dalam Rupiah
duration_estimate_minutesunsigned intEstimasi durasi (menit)
is_activebooleanStatus aktif
display_orderunsigned intUrutan tampilan

service_package_items

Item-item yang termasuk dalam sebuah paket servis.

KolomTipeKeterangan
service_package_idFKRelasi ke service_packages
namestringNama item
descriptiontextDeskripsi item
display_orderunsigned intUrutan tampilan

custom_service_items

Item servis satuan yang bisa dipilih pelanggan secara custom.

KolomTipeKeterangan
namestringNama item
slugstring (unique)URL-friendly identifier
categorystringKategori item
descriptiontextDeskripsi
priceunsigned intHarga satuan (Rupiah)
unit_labelstringLabel satuan (misal: “liter”)
is_activebooleanStatus aktif
display_orderunsigned intUrutan tampilan

bookings

Record booking pelanggan.

KolomTipeKeterangan
booking_codestring (unique)Kode booking (prefix: ASM)
customer_namestring(100)Nama pelanggan
customer_emailstring(100)Email pelanggan
customer_phonestring(30)Nomor telepon
motorcycle_typeenumTipe motor (matic/bebek/sport/lainnya)
motorcycle_brandstring(100)Merek motor
motorcycle_modelstring(100)Model motor
motorcycle_yearstring(4)Tahun motor
plate_numberstring(20)Nomor plat
package_typeenumTipe paket (fixed/custom)
service_package_idFK (nullable)Relasi ke paket tetap
package_name_snapshotstringSnapshot nama paket saat booking
package_price_snapshotunsigned intSnapshot harga paket
notestextCatatan pelanggan
service_datedateTanggal servis
service_timestring(5)Jam servis (HH:MM)
statusenumStatus booking
subtotal_priceunsigned intSubtotal harga
service_feeunsigned intBiaya jasa
transport_distance_kmdecimal(8,2)Jarak transport (km)
transport_chargeunsigned intBiaya transport
total_priceunsigned intTotal harga akhir
address_texttextAlamat lengkap
house_landmarkstring(255)Patokan rumah
latitudedecimal(10,7)Koordinat latitude
longitudedecimal(10,7)Koordinat longitude
admin_notestextCatatan admin
requires_manual_reviewbooleanPerlu review manual
confirmed_attimestampWaktu konfirmasi
completed_attimestampWaktu selesai

booking_custom_items

Item custom yang dipilih dalam sebuah booking.

KolomTipeKeterangan
booking_idFKRelasi ke bookings
custom_service_item_idFK (nullable)Relasi ke custom_service_items
item_name_snapshotstringSnapshot nama item
item_price_snapshotunsigned intSnapshot harga item
qtyunsigned intJumlah
subtotalunsigned intSubtotal (harga × qty)

booking_status_logs

Audit trail perubahan status booking.

KolomTipeKeterangan
booking_idFKRelasi ke bookings
old_statusstring (nullable)Status sebelumnya
new_statusstringStatus baru
changed_byFK (nullable)User yang mengubah
notestring(500)Catatan perubahan

booking_settings

Pengaturan global booking (singleton row).

KolomTipeKeterangan
service_feeunsigned intBiaya jasa default
transport_free_radius_kmdecimalRadius gratis transport
transport_fee_per_kmunsigned intBiaya per km
footer_addressstringAlamat footer
footer_latitudedecimalLatitude footer
footer_longitudedecimalLongitude footer

visitor_logs

Log kunjungan halaman (privacy-friendly, IP di-hash).

KolomTipeKeterangan
visit_datedateTanggal kunjungan
ip_hashstring(64)Hash IP pengunjung
session_keystring(120)Session identifier
pathstring(255)Path halaman
referrerstring(255)Referrer URL
user_agenttextUser agent browser
is_unique_dailybooleanKunjungan unik harian

Fitur Utama

1. Landing Page Publik

Halaman utama yang menampilkan:

  • Hero section dengan tagline bengkel
  • Highlight layanan (Servis Rutin, Ganti Oli, Perbaikan Darurat)
  • Paket servis aktif dari database
  • Cara kerja booking (3 langkah)
  • Area coverage layanan
  • FAQ
  • Testimonial pelanggan
  • CTA menuju form booking

2. Sistem Booking

Alur Booking Pelanggan

Landing Page → Form Booking → Review → Submit → Halaman Sukses
  1. Pilih Paket — Fixed package (paket tetap) atau custom package (pilih item sendiri)
  2. Info Motor — Tipe, merek, model, tahun, plat nomor
  3. Pilih Jadwal — Tanggal dan jam servis (slot tersedia: 08:00-16:00)
  4. Tentukan Lokasi — Alamat, patokan rumah, pin di peta (Leaflet)
  5. Review & Submit — Ringkasan harga termasuk biaya jasa dan transport

Validasi Booking

  • Slot Capacity: Maksimal 3 booking per slot waktu
  • Coverage Area: Bounding box check (latitude/longitude)
  • Rate Limiting: Maksimal 5 percobaan per 10 menit per device
  • Out-of-area: Booking di luar area otomatis ditandai requires_manual_review

Perhitungan Harga

Total = Subtotal Paket/Item + Service Fee + Transport Charge
Transport Charge:
- Jarak ≤ free_radius_km (default 10km) → Rp 0
- Jarak > free_radius_km → (jarak - free_radius) × fee_per_km (default Rp5.000/km)

3. Manajemen Booking (Admin)

Status Workflow

Pending → Confirmed → On The Way → Completed
│ │
└─────────┴──→ Cancelled
└──→ Rescheduled

Fitur admin:

  • Lihat daftar semua booking (filter, search)
  • Detail booking lengkap
  • Update status booking (dengan catatan)
  • Tambah admin notes
  • Hapus booking
  • Audit trail perubahan status

4. Manajemen Paket Servis (Admin)

  • CRUD paket servis (nama, deskripsi, harga, estimasi durasi)
  • Kelola item dalam paket (nama, deskripsi, urutan)
  • Aktivasi/deaktivasi paket
  • Pengaturan urutan tampilan

5. Manajemen Item Servis Custom (Admin)

  • CRUD item servis custom (nama, kategori, harga, satuan)
  • Deaktivasi item
  • Pengaturan urutan tampilan

6. Pengaturan Booking (Admin)

  • Service Fee: Biaya jasa yang ditambahkan ke setiap booking
  • Transport Charge: Radius gratis dan biaya per km
  • Footer Location: Alamat dan koordinat bengkel (titik awal perhitungan jarak)

7. Analitik Visitor

  • Tracking kunjungan halaman (privacy-friendly, IP di-hash)
  • Statistik kunjungan harian
  • Unique visitor per hari
  • Chart visualisasi

8. Autentikasi & Keamanan

  • Login admin (Laravel Fortify)
  • Two-Factor Authentication (2FA)
  • Password reset
  • Profile management
  • Session management

Routing & API

Route Publik

MethodURINamaKeterangan
GET/homeLanding page
GET/bookingbookings.createForm booking
POST/bookingsbookings.storeSubmit booking
GET/booking/successbookings.successHalaman sukses
GET/booking/{code}bookings.public.showDetail booking publik

Route Admin (prefix: /admin, middleware: auth)

MethodURINamaKeterangan
GET/admin/dashboardadmin.dashboardDashboard
GET/admin/bookingsadmin.bookings.indexDaftar booking
GET/admin/bookings/{code}admin.bookings.showDetail booking
PATCH/admin/bookings/{code}/statusadmin.bookings.update-statusUpdate status
PATCH/admin/bookings/{code}/notesadmin.bookings.update-notesUpdate catatan
DELETE/admin/bookings/{code}admin.bookings.destroyHapus booking
GET/admin/service-packagesadmin.service-packages.indexDaftar paket
POST/admin/service-packagesadmin.service-packages.storeBuat paket
GET/admin/service-packages/{id}/editadmin.service-packages.editEdit paket
PATCH/admin/service-packages/{id}admin.service-packages.updateUpdate paket
PATCH/admin/service-packages/{id}/activateadmin.service-packages.activateAktifkan
PATCH/admin/service-packages/{id}/deactivateadmin.service-packages.deactivateNonaktifkan
DELETE/admin/service-packages/{id}admin.service-packages.destroyHapus paket
GET/admin/custom-service-itemsadmin.custom-service-items.indexDaftar item
POST/admin/custom-service-itemsadmin.custom-service-items.storeBuat item
GET/admin/custom-service-items/{id}/editadmin.custom-service-items.editEdit item
PATCH/admin/custom-service-items/{id}admin.custom-service-items.updateUpdate item
PATCH/admin/custom-service-items/{id}/deactivateadmin.custom-service-items.deactivateNonaktifkan
DELETE/admin/custom-service-items/{id}admin.custom-service-items.destroyHapus item
PATCH/admin/booking-settings/service-feeadmin.booking-settings.service-feeUpdate fee
PATCH/admin/booking-settings/footer-locationadmin.booking-settings.footer-locationUpdate lokasi
PATCH/admin/booking-settings/transport-chargeadmin.booking-settings.transport-chargeUpdate transport
GET/admin/visitorsadmin.visitors.indexAnalitik visitor

Route Settings (middleware: auth)

MethodURINamaKeterangan
GET/settings/profileprofile.editEdit profil
PATCH/settings/profileprofile.updateUpdate profil
DELETE/settings/profileprofile.destroyHapus akun
GET/settings/securitysecurity.editKeamanan
PUT/settings/passworduser-password.updateUpdate password
GET/settings/appearanceappearance.editTampilan

Frontend

Halaman (Inertia Pages)

Publik (resources/js/pages/public/)

FileKeterangan
LandingPage.svelteHalaman utama dengan info layanan
BookingPage.svelteForm booking multi-step
BookingSummaryPage.svelteDetail booking setelah submit
BookingSuccessPage.svelteKonfirmasi booking berhasil

Admin (resources/js/pages/admin/)

FileKeterangan
DashboardPage.svelteDashboard statistik
BookingsIndexPage.svelteDaftar semua booking
BookingDetailPage.svelteDetail & manajemen booking
ServicePackagesPage.svelteCRUD paket servis
CustomServiceItemsPage.svelteCRUD item custom
VisitorsPage.svelteAnalitik pengunjung
auth/LoginPage.svelteHalaman login admin

Settings (resources/js/pages/settings/)

FileKeterangan
Profile.svelteEdit profil user
Security.sveltePassword & 2FA
Appearance.svelteTema tampilan

Komponen Utama

Komponen Publik (resources/js/components/public/)

KomponenKeterangan
HeroSectionBanner utama landing page
ServiceHighlightsHighlight layanan
PackageCardsSectionKartu paket servis
HowItWorksSectionLangkah-langkah booking
CoverageAreaSectionPeta area layanan
FaqSectionFrequently Asked Questions
TestimonialsSectionTestimoni pelanggan
BookingCtaSectionCall-to-action booking
BookingFormForm booking utama
BookingPackageSelectorPemilih paket
BookingCustomItemsSelectorPemilih item custom
BookingMotorInfoFieldsInput info motor
BookingSchedulePickerPemilih jadwal
BookingLocationPickerPemilih lokasi (peta)
BookingPriceSummaryRingkasan harga
BookingReviewPanelPanel review sebelum submit
PublicHeaderHeader halaman publik
PublicFooterFooter dengan peta

Komponen Admin (resources/js/components/admin/)

KomponenKeterangan
AdminHeaderHeader panel admin
AdminSidebarSidebar navigasi admin
BookingsTableTabel daftar booking
BookingDetailCardKartu detail booking
BookingStatusBadgeBadge status booking
StatusHistoryTimelineTimeline riwayat status
BookingServiceFeeCardPengaturan biaya jasa
BookingTransportChargeCardPengaturan transport
BookingFooterLocationCardPengaturan lokasi
ServicePackageFormForm paket servis
ServicePackageItemsEditorEditor item paket
CustomServiceItemFormForm item custom
DashboardStatCardKartu statistik dashboard
VisitorsChartChart pengunjung
CopyValueButtonTombol salin nilai

UI Components (resources/js/components/ui/)

Menggunakan komponen headless dari bits-ui dengan styling Tailwind CSS (pola shadcn-svelte):

  • Alert, Avatar, Badge, Breadcrumb, Button, Card
  • Checkbox, Collapsible, Dialog, Dropdown Menu
  • Input, Input OTP, Label, Navigation Menu
  • Select, Separator, Sheet, Sidebar
  • Skeleton, Sonner (toast), Spinner, Tooltip

Testing

Framework

  • Pest v4 (PHP testing framework di atas PHPUnit)
  • Test runner: php artisan test --compact

Struktur Test

tests/
├── Feature/
│ ├── Admin/
│ │ ├── BookingFooterLocationManagementTest.php
│ │ ├── BookingManagementTest.php
│ │ ├── BookingServiceFeeManagementTest.php
│ │ ├── BookingTransportChargeManagementTest.php
│ │ ├── CustomServiceItemManagementTest.php
│ │ ├── ServicePackageManagementTest.php
│ │ └── VisitorAnalyticsTest.php
│ ├── Auth/
│ │ ├── AuthenticationTest.php
│ │ ├── EmailVerificationTest.php
│ │ ├── PasswordConfirmationTest.php
│ │ ├── PasswordResetTest.php
│ │ ├── RegistrationTest.php
│ │ ├── TwoFactorChallengeTest.php
│ │ └── VerificationNotificationTest.php
│ ├── Booking/
│ │ ├── BookingEmailConfirmationTest.php
│ │ ├── BookingPublicPagesTest.php
│ │ ├── BookingTransportChargeTest.php
│ │ └── StoreBookingTest.php
│ ├── Settings/
│ │ ├── ProfileUpdateTest.php
│ │ └── SecurityTest.php
│ └── Visitor/
│ └── TrackVisitorMiddlewareTest.php
├── Unit/
├── Browser/ # Pest Browser tests (Playwright)
├── Pest.php
└── TestCase.php

Menjalankan Test

Terminal window
# Semua test
php artisan test --compact
# Filter test tertentu
php artisan test --compact --filter=StoreBookingTest
# Dengan coverage
php artisan test --coverage

Linting & Formatting

Terminal window
# PHP (Pint)
vendor/bin/pint --dirty --format agent
# JavaScript/Svelte (ESLint + Prettier)
npm run lint # Fix lint issues
npm run lint:check # Check only
npm run format # Format files
npm run format:check # Check formatting
# TypeScript check
npm run types:check

CI/CD

GitHub Actions workflows tersedia di .github/workflows/:

  • lint.yml — Linting check
  • tests.yml — Test suite

Deployment

Prasyarat Production

  • PHP 8.3+ dengan ekstensi yang diperlukan
  • MySQL 8.0+
  • Node.js (untuk build assets)
  • Web server (Nginx/Apache)

Langkah Deploy

Terminal window
# 1. Install dependencies (production)
composer install --no-dev --optimize-autoloader
npm ci
# 2. Build frontend
npm run build
# 3. Optimize Laravel
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
# 4. Migrasi database
php artisan migrate --force
# 5. Set permissions
chmod -R 775 storage bootstrap/cache

Laravel Cloud

Aplikasi ini dapat di-deploy menggunakan Laravel Cloud untuk deployment dan scaling yang lebih mudah.


Konfigurasi

config/booking.php

return [
'code_prefix' => 'ASM', // Prefix kode booking
'max_per_slot' => 3, // Maks booking per slot
'default_service_fee' => 0, // Biaya jasa default
'slot_interval_minutes' => 60, // Interval slot (menit)
'available_hours' => [ // Jam operasional
'08:00', '09:00', '10:00', '11:00',
'13:00', '14:00', '15:00', '16:00',
],
'rate_limit' => [
'max_attempts' => 5, // Maks percobaan
'decay_seconds' => 600, // Cooldown (detik)
],
];

config/workshop.php

return [
'brand_name' => env('APP_NAME', 'ASM MOTOR'),
'tagline' => 'Servis ringan motor panggilan...',
'contact_phone' => env('WORKSHOP_CONTACT_PHONE'),
'contact_whatsapp' => env('WORKSHOP_CONTACT_WHATSAPP'),
'footer_location' => [
'address' => env('WORKSHOP_FOOTER_ADDRESS'),
'latitude' => env('WORKSHOP_FOOTER_LATITUDE'),
'longitude' => env('WORKSHOP_FOOTER_LONGITUDE'),
],
'transport_charge' => [
'free_radius_km' => env('WORKSHOP_TRANSPORT_FREE_RADIUS_KM', '10'),
'fee_per_km' => env('WORKSHOP_TRANSPORT_FEE_PER_KM', '5000'),
],
'service_areas' => [...], // Daftar area layanan
'coverage' => [
'bounding_box' => [ // Batas area coverage
'min_latitude' => -6.75,
'max_latitude' => -6.05,
'min_longitude' => 106.55,
'max_longitude' => 107.05,
],
],
'landing' => [ // Konten landing page
'seo' => [...],
'highlights' => [...],
'how_it_works' => [...],
'coverage' => [...],
'faqs' => [...],
'testimonials' => [...],
'cta' => [...],
],
];

Seeder Data

Aplikasi menyediakan seeder untuk data awal:

Terminal window
php artisan db:seed

Seeder yang tersedia:

  • AdminSeeder — Membuat akun admin default
  • ServicePackageSeeder — Paket servis contoh
  • CustomServiceItemSeeder — Item servis custom contoh

Scripts Tersedia

Composer Scripts

ScriptKeterangan
composer run setupSetup lengkap project
composer run devJalankan dev server (Laravel + Queue + Vite)
composer run lintFormat PHP dengan Pint
composer run lint:checkCheck formatting PHP
composer run testJalankan semua test
composer run ci:checkFull CI check (lint + format + types + test)

NPM Scripts

ScriptKeterangan
npm run devVite dev server
npm run buildBuild production assets
npm run build:ssrBuild dengan SSR
npm run lintESLint fix
npm run lint:checkESLint check
npm run formatPrettier format
npm run format:checkPrettier check
npm run types:checkSvelte/TypeScript type check

Lisensi

MIT License


Thanks for reading!

Aplikasi Bengkel Project Doc

Tue May 26 2026
2131 words · 17 minutes
Documentation No tags assigned

© Rifky Awalul Huda | CC BY-NC-SA 4.0