Intelligent Dispatch Board (Resource Roster) β
The central operational interface for dispatchers. Provides a visual timeline for assigning vehicles and crew to service legs, with real-time conflict detection and drag-and-drop resource management.
Visual Paradigm β
The dispatch board uses a horizontal Gantt timeline as the primary view. Each row represents a resource (vehicle or crew member), and colored blocks represent assigned ServiceLegs across a configurable time range (day, week, month).
Layout β
βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Resources β Timeline (scrollable, zoomable) β
βββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π Bus 01 β ββββ Tyrol Tour Leg 1 ββββ ββββ ββββ Leg 2 ββββ β
β π Bus 02 β ββββββββ Bavaria Day Trip βββββββββ β
β π Bus 03 β (available) β
βββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π€ Klaus β ββββ Tyrol Tour Leg 1 ββββ β οΈ REST βββββββββββββ β
β π€ Sarah β ββββββββ Bavaria Day Trip βββββββββ β
β π€ Thomas β ποΈ VACATION β
βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββResource Panel (Left) β
- Grouped by type: Vehicles first, then crew members.
- Status indicators: Available (green), assigned (blue), unavailable (red β maintenance, leave, rest).
- Quick filters: By vehicle type, crew qualifications, availability window.
- Search: Filter resources by name, license plate, or qualification.
Timeline Panel (Right) β
- Zoom levels: Day (hourly resolution), Week (daily), Month (weekly).
- Block colors: Coded by
TourOfferingorServiceLeg.leg_type. - Capacity badges: Each vehicle block shows
booked_pax / capacity(e.g., "47/49"). - Rest periods: Rendered as hatched/striped blocks between assignments.
Drag-and-Drop Interactions β
Assigning Resources β
- Drag a vehicle from the resource panel onto a
ServiceLeggap β creates aLegAssignment. - Drag a crew member onto a vehicle's row within a leg block β assigns the driver to that leg.
- Drag to reschedule: Move an existing assignment block horizontally to adjust timing.
Conflict Detection on Drop β
On every drag-and-drop action, the system performs real-time validation before confirming the assignment:
| Conflict Type | Data Source | Visual Signal |
|---|---|---|
| Insufficient rest time (EG 561/2006) | Evaluated by Backoffice Observability against CrewDutyLog | π΄ Red border + modal: "Klaus needs 11h rest. Next available: 06:00" |
| Crew qualification mismatch | crew_qualifications | π‘ Yellow warning: "Klaus lacks Module 95 β expires 2026-03-01" |
| Vehicle restriction | crew_qualifications | π‘ Warning: "Klaus restricted to automatic transmission" |
| Capacity overflow | SeatReservation count vs Vehicle.capacity | π΄ Red badge: "52 pax on 49-seater" |
| Vehicle maintenance due | vehicle_inspections | π‘ Warning if upcoming. π΄ Hard block if blocks_dispatch = true (overdue HU/SP). |
| Crew on leave | crew_absences | π΄ Block: "Klaus on vacation 04/10 β 04/17" |
| Visa/border restriction | crew_qualifications (visa entries) | π‘ Warning: "Klaus missing UK visa for this route" |
Behavior: Warnings (π‘) allow override with confirmation. Hard blocks (π΄ β rest time, leave) prevent assignment entirely.
Contextual Warnings ("Dispohinweise") β
Each CrewMember carries structured restrictions. When the dispatcher drags a crew member near a ServiceLeg, the board overlays contextual badges:
- Transmission restriction: "βοΈ Auto only" β blocks assignment to manual-transmission vehicles.
- License expiry: "π License expires in 14 days" β warning if trip falls after expiry.
- Border restrictions: "π No UK visa" β blocks assignment to UK-bound legs.
The system sources these restrictions from the crew_qualifications table β see schema-backoffice.md and PRODUCT_schema-feature-gaps.md Β§3.
Passenger Reassignment ("Umbesetzung") β
A dedicated sub-view accessible from any ServiceLeg block, for moving passengers between vehicles when capacity conflicts arise or breakdowns occur.
Interaction Flow β
- Dispatcher clicks a capacity-conflicted leg block β opens Split View.
- Left panel: Current vehicle's passenger manifest + seat map.
- Right panel: Target vehicle's manifest + seat map.
- Dispatcher drags individual passengers, groups (by
Booking), or entire boarding points from left to right. - On drop, the system:
- Remaps
SeatReservationto equivalent positions on the target vehicle'sseat_map_layout. - Preserves all linked
Booking,Payment, andPassengerProfilereferences. - Queues an automated notification to affected passengers (via Communications schema).
- Logs the reassignment in
change_eventsaudit trail.
- Remaps
Bulk Actions β
- "Move Boarding Point": Reassign all passengers from a specific
BoardingPointto the target vehicle. - "Swap Vehicles": Exchange the full manifest between two vehicles (useful for breakdown scenarios).
Algorithmic Feeder/Shuttle Suggestions β
When a TourOffering has multiple BoardingPoints with geographically dispersed passengers, the board can suggest feeder vehicle clustering:
- System groups passengers by
BoardingPoint.geo_coordinatesproximity. - Calculates optimal pickup route using the routing service.
- Suggests the minimum required vehicle size per cluster (minivan vs. coach).
- Dispatcher approves β system creates
ServiceLegentries withleg_type: TRANSFERfor feeder routes.
This is conceptual and depends on the routing service maturity. Tag as V2 feature.
Real-Time Updates β
The dispatch board is a live view powered by Hasura GraphQL Subscriptions:
- New bookings: Capacity badges update in real-time as passengers book.
- Incident alerts: Flashing overlay on affected
ServiceLegblocks when a driver creates anIncidentvia the Driver App. - ETA changes: Updated arrival times propagate from
TelemetryPointdata. - Duty log updates: Rest period blocks adjust when
CrewDutyLogentries arrive from the Driver App (manual input).[Phase 2]Operators who enable theTACHOGRAPHintegration receive real-time updates from tachograph IoT hardware β see EU-561 research Β§3.3.
Charter Quote Pipeline β
The dispatch board includes a Kanban sidebar for tracking CharterQuote lifecycle:
ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ
β DRAFT ββ β SENT ββ β ACCEPTED ββ βSCHEDULED β
β β β β β β β β
β Corp X β β Agency Y β β Club Z β β (on β
β 3-day β β Airport β β Weekend β β board) β
β charter β β shuttle β β trip β β β
ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ- DRAFT β SENT: Generates PDF quote, sends to reseller.
- SENT β ACCEPTED: Reseller confirms β system auto-generates a
TourOfferingfrom theCharterQuote. - ACCEPTED β SCHEDULED: Dispatcher assigns vehicle + crew on the Gantt board, making it operational.
Data Dependencies β
| Entity | Schema | Role |
|---|---|---|
ServiceLeg | Operations | The blocks on the timeline |
LegAssignment | Operations | Created/modified by drag-and-drop |
Vehicle | Backoffice | Resource rows (top section) |
CrewMember | Backoffice | Resource rows (bottom section) |
CrewDutyLog | Operations | Rest time validation |
crew_qualifications | Backoffice | Qualification conflict checks |
vehicle_inspections | Backoffice | Maintenance warnings and dispatch blocking |
crew_absences | Backoffice | Leave blocking |
SeatReservation | Commerce | Capacity badges |
Incident | Operations | Real-time alert overlays |
CharterQuote | Backoffice | Kanban pipeline sidebar |
BoardingPoint | Backoffice | Passenger reassignment grouping |
NOTE
Subcontracted legs: When a LegAssignment has supplier_id set (and no internal vehicle/crew), the dispatch board renders it as a distinct "Outsourced" row below internal resources. Styling: dashed border, supplier name label, muted palette. Subcontracted legs cannot be drag-drop edited β they require explicit reassignment via the LegAssignment API.