Fleet & Tours
A tour is modeled as its own service record — not fields bolted onto a customer — the same way a visa or flight request is. Fleet (guiders and vehicles) is a separate resource directory that tours will draw on as this module grows.
Fleet: Guiders & Vehicles
Owner/manager only, under Fleet in the sidebar.
A Guider (the app’s term for what’s often called a driver-guide) is a directory entry with contact details, license info, primary branch, languages spoken, and specialty tags (e.g. Wildlife Safari, Cultural Triangle, Hill Country). Availability is tracked as Active, Off Duty, or On Tour — the last one is set automatically once a vehicle is assigned to a running tour, not manually.
Each guider owns one or more Vehicles, managed from within the guider’s own profile page rather than a standalone vehicle list — a vehicle always belongs to exactly one guider, though a guider can have several. A vehicle record has a registration number (shown in the UI as “License Plate Number”), vehicle type, passenger/luggage capacity, amenities (child seats, Wi-Fi, cooler box, wheelchair accessibility), and its own availability status (Active, Off Duty, or In Maintenance). Vehicles can be transferred between guiders if needed.
Primary Branch and Vehicle Type are reference-data-backed dropdowns (see Reference data), so new vehicle types or branches can be added by an admin without a code change.
A guider’s profile page has a Past Trips tab listing every tour they’ve completed (customer, trip dates, completed-at). A guider is not a customer record — this list is read directly from completed tour inquiries assigned to that guider, not from any customer-style profile.
Tours: Inbound
In the sidebar, Tours is an expandable group — Inbound (domestic Sri Lanka tours, live today) and Outbound (foreign trips for local customers, shown as coming soon). Outbound will eventually need to bundle several visas/tickets/countries into one composite trip, which is a different shape from a single tour inquiry, so it’s being designed separately rather than forced into the Inbound model.
Starting a tour inquiry
A tour inquiry is created the same way a visa or flight request is — as a tab in the Add Service modal on a customer’s page. You provide party size (adults/children/seniors), arrival and departure dates, pacing (Relaxed vs. Active/Fast-Paced), accommodation tier, interests, and dietary notes. Like other service requests, it’s automatically assigned to whoever creates it.
The status flow
A tour inquiry moves through seven steps, one at a time, via a single Advance to [next step] button — there’s no free-form status picker:
- Inquiry — just created.
- Itinerary Planning — an itinerary (template or custom, see below) must be set before advancing past this step.
- Reviewing — itinerary and guider/vehicle assignment become read-only from here on (see below); an invoice must be issued to advance further.
- Invoice Issued — at least a partial payment must be recorded to advance further.
- Confirmed — advance payment received; the customer is automatically emailed a branded confirmation (see below).
- In Progress — set manually once the tour actually starts; the assigned guider (and their vehicle) automatically flips to On Tour.
- Completed — full payment collected; the guider automatically flips back to Active.
Each step records its own timestamp, shown under that step on the tour’s detail page once it’s been reached — the step-progress bar reflects real data, not just the current status.
Itinerary: template or custom
A tour’s itinerary is set one of two mutually-exclusive ways — picking one clears the other:
- Use a Template — pick from the admin-managed Itinerary Templates catalog, managed under Service Prices → Add Template → Tours in the sidebar (owner/manager only — see Service Prices). A template is a named, fixed day-by-day plan (e.g. “Classic 5-Day Cultural Triangle”), each day with a title and optional description, plus an optional price per adult and price per child. Once selected, the template’s days are shown read-only on the tour’s detail page.
- Build Custom — build a day-by-day itinerary specific to this tour: an optional title per day plus a checkbox grid of tourist locations for that day, drawn from a new Tourist Locations reference-data category (Reference Data page, admin-managed, seeded with ~20 Sri Lankan destinations). Once saved, the days are shown as read-only location pills.
Either way, the tour can’t advance to Reviewing until an itinerary exists.
Read-only past Reviewing, with a way back
Once a tour reaches Reviewing (or any later step), the itinerary section and the guider/vehicle assignment section both become plain read-only displays — no edit controls. If changes are needed, a single Back to Itinerary Planning button (shown only while the tour is at Reviewing, next to the step’s Advance button) reverts the tour to Itinerary Planning, re-enabling both sections. The revert is intentionally scoped to Reviewing only — nothing irreversible (invoice, payment, the guider’s On Tour flip, the confirmation email) has happened yet at that point, so there’s no later-step revert path by design.
Guider & vehicle assignment
From Itinerary Planning through Reviewing, a guider can be assigned to (or reassigned on) the tour from its detail page; their vehicle is shown automatically once assigned. The assignment becomes read-only once the tour passes Reviewing, same as the itinerary.
Invoicing a templated tour
If a tour’s itinerary template has a price set, issuing an invoice for that tour pre-fills a locked, editable line item per party type — an “Adults” row (price per adult × adults, with seniors counted at the adult rate) and a “Children” row (price per child × children), each only shown when that group has a nonzero headcount — the same way a visa invoice pre-fills from its pricing catalog. The amounts stay editable but the lines can’t be removed, matching how the Visa Fee/Consulting Fee rows behave on a visa invoice. A tour with a custom itinerary, or a template with no price set, still gets a plain manual subtotal field, same as before.
Collecting payment on a tour
Once an invoice is issued, its Payment section on the tour’s detail page shows a Record Payment button next to any invoice with an outstanding balance — the same payment dialog Finance uses elsewhere in the app. Recording a payment automatically tries to advance the tour’s status (partial or full payment satisfies Invoice Issued → Confirmed; full payment satisfies In Progress → Completed) — nothing further to click if the guard is already met. Issuing the invoice itself also automatically advances the tour from Reviewing to Invoice Issued, so the whole payment lifecycle can be driven from this one page.
Confirmation email
Once a tour reaches Confirmed, the customer automatically receives a branded confirmation email listing the places they’ll be visiting — day titles for a template itinerary, checked locations for a custom one. No day descriptions, places only. A failure to send never blocks or rolls back the status change.
On the staff dashboard
Tours currently In Progress show up in a dedicated On Tour tab on the staff dashboard’s Departures/Visa Expiries widget, alongside the assigned guider. Tours arriving today also generate a checklist entry in the staff dashboard’s Checklist tab, the same way a flight departing today or a visa appointment does.
Deleting a tour inquiry
Owners, managers, and consultants can delete a tour inquiry, same permission set as visa/flight deletion — see A note on deleting things. Available from the tour’s own detail page and from the Tour Inquiries section of the customer’s page; not from the tour list view, matching how visa/flight deletion also isn’t available from their list views.
What’s next
Outbound (foreign trips for local customers, bundling several visas/tickets/countries into one composite trip) is designed but not built — it needs a different shape than a single Inbound tour inquiry, so it’s tracked as a separate design rather than forced into this model.