Owner: Dev Team | Last Updated: 2026-02-21 | Status: Current
Key architectural decisions for the Booking project and their rationale.
Context: A full-stack framework with SPA-like UX is needed without a separate API layer for the dashboard.
Decision: Use Laravel 12 + Vue 3 + Inertia.js.
Consequences:
Context: A clear architecture is needed for 67 models and complex business logic.
Decision: Three-tier architecture: Controller -> Service -> Repository. Single-purpose operations via Actions (lorisleiva/laravel-actions).
Consequences:
Context: Payment needs to be authorized before booking confirmation.
Decision: Use Stripe Payment Intents with manual capture.
Consequences:
Context: The system serves multiple companies with different settings.
Decision: Soft multi-tenancy via the Company model and session-based company ID.
Consequences:
Context: Gift Cards have a similar structure to Experiences (price, media, availability).
Decision: GiftCard extends Experience with is_gift_card = true and Global Scope.
Consequences:
Context: Frequent availability queries for Experiences create database load.
Decision: Redis for caching experiences, availability, customer types.
Consequences:
Context: The booking widget needs to be embeddable on any third-party website.
Decision: Separate Vue SPA (resources/js/embed/) with its own router, stores, and components.
Consequences:
<script> tagContext: Some Experiences are managed by an external system (tours/bikes).
Decision: ProxyService proxies requests to the external API with authorization via Company credentials.
Consequences:
| Date | Author | Change |
|---|---|---|
| 2026-02-21 | Documentation Team | Initial creation |
Prev: Security | Up: Architecture