# MVP - Sistema de Gestão de Transfers - Documentação Técnica
**Versão:** 3.0 Consolidada
**Data:** Novembro 2025
**Tipo:** Multi-tenant, Auto-escalável
**Audiência:** Desenvolvimento + Gestão/Negócio + MVP
---
## 📘 COMO USAR ESTE DOCUMENTO
### 👨💼 Para Gestão & Negócio
- **Executive Summary**: Visão geral e proposta de valor
- **Processos de Negócio**: Como o sistema funciona
- **Operações**: Gestão diária e qualidade
- **Roadmap**: Faseamento e prioridades
- Secções marcadas com 📊 são orientadas a negócio
### 👨💻 Para Desenvolvimento
- **Arquitetura Técnica**: Estruturas de dados e APIs
- **Entidades Core**: Modelos de dados completos
- **Integrações**: APIs e webhooks
- **Especificações**: Lógica e algoritmos
- Secções marcadas com 💻 são orientadas a desenvolvimento
### 🔄 Para Ambos
- **Fluxos Completos**: Cenários end-to-end
- **Glossário**: Terminologia comum
- Secções marcadas com 🔄 são híbridas
---
# PARTE I - EXECUTIVE SUMMARY
## 📊 1. VISÃO GERAL DO SISTEMA
### O Que É
Sistema completo de gestão de transfers de passageiros que permite a operadores de transporte gerir:
- Reservas de múltiplas fontes (~~agências~~, clientes diretos, APIs)
- Frota de veículos e motoristas
- ~~Alocação inteligente de recursos~~
- ~~Faturação e~~ pagamentos (Vendus - Software de Facturação Online / Ifthenpay)
- Operações em tempo real (GPS, tempo para destino, milestone)
### Para Quem
- **Operadores de Transfer** (principal): Empresas que fazem transfers aeroporto-hotel, tours, etc (Pelican transfers :bird:)
~~- **Agências de Viagem** (B2B): Parceiros que reservam em nome dos clientes~~
- **Passageiros** (B2C): Clientes finais que reservam diretamente
- **Motoristas**: Executam os serviços via app móvel
- **Operadores**: Tratam dos clientes
### Problema que Resolve
Hoje, operadores de transfer gerem tudo em Excel, WhatsApp e papel:
- ❌ Alocação manual de motoristas → erros e conflitos
- ❌ Comunicação por telefone → ineficiente
- ❌ Sem visibilidade em tempo real → stress operacional
~~- ❌ Faturação manual → erros e atrasos~~
- ❌ Sem histórico → impossível otimizar
### Solução
~~✅ **Alocação automática** baseada em disponibilidade, prioridades e custos ~~
✅ **Comunicação automática** via SMS, email, webhooks, notificacoes
✅ **Tracking GPS** em tempo real
~~✅ **Faturação automática** com múltiplas moedas e modelos de pricing ~~
✅ **Analytics** para otimização contínua
✅ **Multi-tenant** - cada operador isolado
### Números-Chave (Projeção)
- **Redução de trabalho manual:** 70%
- **Aumento de eficiência:** 40%
~~- **Redução de dead mileage:** 25%~~
- **Satisfação cliente:** +30%
~~- **ROI:** < 6 meses~~
---
## 📊 2. PROPOSTA DE VALOR
### Para Operadores
- **Automação completa** do workflow de reserva até conclusão
~~- **Otimização de recursos** - maximizar utilização de frota~~
~~- **Escalabilidade** - crescer sem aumentar staff operacional~~
- **Visibilidade 360°** - dashboard com tudo em tempo real
~~- **Redução de custos** - menos dead mileage, melhor alocação~~
### Para Operadora / Agencia / Hotel (B2B)
- **API completa** para integração
- **Portal web** para self-service
- **SLA garantido** com tracking
~~- **Faturação flexível** - 5 modelos de pricing~~
~~- **White-label** opcional~~
### Para Passageiros (B2C)
- **Booking simples** - 3 minutos (via embed)
- **Tracking em tempo real** via link
- **Comunicação proativa** - updates automáticos
- **Rating/feedback** para qualidade
- **Histórico e favoritos**
---
## 📊 3. TIPOS DE SERVIÇO
### PRIVATE Transfer
**O quê:** 1 grupo, direto de A para B
**Exemplo:** Família do aeroporto ao hotel
**Características:** Privacidade, rota direta, previsível
**Pricing:** Fixed ou distance-based
~~### ROAD-SHOW~~
~~**O quê:** 1 grupo, múltiplas paragens (A→B→C→D)
**Exemplo:** CEO em viagem de negócios (hotel→escritório→restaurante→aeroporto)
**Características:** Mesmo motorista todo o dia, wait times
**Pricing:** Package deal ou per-leg + wait time ~~
~~### SHUTTLE Dinâmico
**O quê:** Múltiplos grupos, rota otimizada
**Exemplo:** 10 pessoas do aeroporto para diferentes hotéis
**Características:** Partilhado, rota calculada TSP, económico
**Pricing:** Por pessoa, mais barato ~~
~~### SHUTTLE Estático
**O quê:** Rota fixa, horários fixos
**Exemplo:** Bus aeroporto-centro cada 30min
**Características:** Previsível, simples, regular
**Pricing:** Bilhete fixo ~~
---
## 💻 4. ARQUITETURA TÉCNICA - VISÃO GERAL
### Stack Tecnológico Recomendado
```
BACKEND:
├─ Node.js + Express (ou NestJS)
├─ PostgreSQL (main database + supabase)
├─ ~~Redis (cache + queue)~~
└─ ~~Docker + Kubernetes~~
FRONTEND:
├─ React (web portal)
├─ React Native (mobile app)
└─ Bryntum Scheduler (visual planning)
INFRAESTRUTURA:
├─ ~~AWS / Azure / GCP~~
├─ ~~CDN para assets~~ (supabase)
└─ Backup automated
APIs & INTEGRAÇÕES:
├─ REST API (primary)
├─ ~~GraphQL (opcional)~~
├─ Webhooks (events)
└─ Socket.io (real-time)
```
### Componentes Principais
```
┌─────────────────────────────────────────────────┐
│ LOAD BALANCER │
└──────────────────┬──────────────────────────────┘
│
┌──────────┴──────────┐
│ │
┌────▼─────┐ ┌────▼─────┐
│ WEB APP │ │ API │
│ Portal │ │ Server │
└──────────┘ └────┬─────┘
│
┌──────────────┼──────────────┐
│ │ │
┌────▼────┐ ┌───▼────┐ ┌───▼────┐
│ Core │ │ Queue │ │ WebSock│
│ Service │ │Worker │ │ Server │
└────┬────┘ └───┬────┘ └────────┘
│ │
┌────▼─────────────▼────┐
│ PostgreSQL DB │
└───────────────────────┘
```
### Modelo de Dados - Hierarquia
```
TENANT (Company)
│
├─── AGENCIES (B2B clients)
│ └─── BOOKINGS (from agency)
│
├─── PASSENGERS (B2C clients)
│ └─── BOOKINGS (direct)
│
├─── VEHICLES
│ ├─── Maintenance logs
│ └─── Defects
│
├─── DRIVERS
│ ├─── Shifts
│ ├─── Ratings
│ └─── Earnings
│
├─── TRANSFERS (bookings)
│ ├─── Allocation (driver+vehicle)
│ ├─── Status updates
│ └─── GPS tracking
│
├─── INVOICES
│ └─── Payments
│
└─── USERS (staff)
└─── Permissions (RBAC)
```
---
# PARTE II - ENTIDADES CORE
## 💻 5. TRANSFER (Entidade Central)
### Descrição
A entidade **Transfer** representa uma reserva de transporte. É o core do sistema.
### Características Principais
- ✅ **Origem e destino dinâmicos** - podem mudar até T-0 (para o MVP)
- ✅ **Flight dependency** - voo atrasa → pickup atrasa automaticamente (MVP prio 2)
- ✅ **Múltiplas versões de timing** - scheduled, estimated, actual
- ✅ **Allocation pode ser pós-hora** - para emergências
- ✅ **Vehicle class** calculado automaticamente
### Estrutura de Dados
```javascript
// MODELO DE DADOS - TRANSFER
{
// ─── METADATA ───
id: UUID,
booking_reference: String, // "BK-12345"
company_id: UUID, // tenant
booking_source: Enum, // "api" | "email" | "portal" | "phone"
service_type: Enum, // "PRIVATE" | "ROAD_SHOW" | "SHUTTLE_DYNAMIC" | "SHUTTLE_STATIC"
// ─── PASSAGEIROS & REQUISITOS ───
passenger_count: Integer,
luggage_count: Integer,
accessibility_requirements: Array, // ["wheelchair", "child_seat", "baby_seat"]
special_notes: Text,
// ─── ROUTING (AMBOS DINÂMICOS!) ───
origin: {
location: { lat: Float, lng: Float, address: String },
type: Enum, // "airport" | "hotel" | "address" | "poi"
flight_dependency: { // OPCIONAL - só se aplicável
flight_number: String,
flight_type: "arrival", // ⚠️ SÓ ARRIVAL IMPACTA TIMING!
scheduled_time: DateTime,
actual_time: DateTime, // quando disponível
},
can_change_until: DateTime, // até quando pode mudar
},
destination: {
location: { lat: Float, lng: Float, address: String },
type: Enum,
flight_dependency: { // OPCIONAL
flight_number: String,
flight_type: "departure", // ℹ️ NÃO IMPACTA timing (apenas deadline)
scheduled_time: DateTime,
},
can_change_until: DateTime,
},
// ─── DISTANCE & PRICING ───
calculated_distance_km: Decimal,
calculated_distance_miles: Decimal,
estimated_duration_minutes: Integer,
calculation_method: Enum, // "api" | "historical" | "linear_factor"
pricing: {
pricing_type: Enum, // "fixed" | "dynamic" | "quoted"
base_price: Decimal, // se fixed
price_per_km: Decimal, // se dynamic
quoted_price: Decimal, // se quoted
currency: String, // "EUR" | "USD" | "GBP"
calculation_breakdown: {
distance_cost: Decimal,
time_cost: Decimal,
accessibility_surcharge: Decimal,
wait_time_cost: Decimal,
total: Decimal,
},
},
last_calculated_at: DateTime,
// ─── TIMING (3 VERSÕES) ───
scheduled: { // IMUTÁVEL - o prometido
pickup_time: DateTime,
dropoff_time: DateTime,
},
estimated: { // DINÂMICO - melhor estimativa
pickup_time: DateTime,
dropoff_time: DateTime,
last_calculated_at: DateTime,
calculation_confidence: Percentage, // 0-100
},
actual: { // HISTÓRICO - realidade
pickup_time: DateTime,
dropoff_time: DateTime,
},
// ─── VEHICLE REQUIREMENTS ───
vehicle_class: String, // calculado: "sedan4" | "van7" | "minibus10" | "bus16" | "wheelchair_van"
required_features: Array, // ["wheelchair_accessible", "child_seats", "luxury", "wifi"]
driver_qualification_required: {
license_category: Enum, // "B" | "D" | "D1"
certifications: Array, // ["taxi", "tvde", "transport_collective"]
},
// ─── ALLOCATION (PODE SER APÓS T-0!) ───
allocation_strategy: Enum, // definido pelo operator
// "own_drivers" | "outsourced" | "hybrid" | "other_operator" | "prevent_dead_mileage"
allocation_priority: {
priority_score: Integer, // calculado
priority_rules: Array, // ["vip_first", "earliest_first", "agency_sla_first", "road_show_first"]
can_allocate_after_scheduled_time: Boolean, // TRUE - para emergências
},
allocated_unit: { // Driver + Vehicle SEMPRE juntos!
driver_id: UUID,
vehicle_id: UUID,
unit_type: Enum, // "own" | "outsourced" | "operator"
allocated_at: DateTime,
allocation_confidence: Percentage,
},
allocation_status: Enum,
// "pending" | "allocated" | "confirmed" | "conflict" | "emergency_reallocated" | "manually_assigned"
manual_override_allowed: Boolean, // TRUE
// ─── NO-SHOW POLICY (POR AGÊNCIA!) ───
policy_id: UUID, // FK para agência
wait_time_minutes: Integer,
charge_policy: {
type: Enum, // "full_charge" | "partial_charge" | "no_charge" | "custom"
percentage: Integer, // se partial
},
notification_protocol: {
attempts: Integer,
escalation: String,
},
// ─── BOOKING SOURCE & COMMUNICATION ───
booking_source: {
type: Enum, // "api" | "email" | "portal" | "phone"
agency_id: UUID, // FK, se B2B
agency_no_show_policy_id: UUID, // FK
},
communication_chain: {
primary_contact: Object, // agência ou passageiro
secondary_contacts: Array,
},
// ─── STATUS & METADATA ───
status: Enum,
// "booked" → "allocated" → "confirmed" → "in_progress" → "completed" | "cancelled" | "no_show"
created_at: DateTime,
updated_at: DateTime,
completed_at: DateTime,
}
```
### Regras de Negócio - Transfer
1. **Voo só impacta timing se for ARRIVAL na origem**
- Departure flight no destino é apenas informativo (deadline)
2. **Origem e Destino podem mudar até T-0**
- Sistema recalcula automaticamente (cumprindo as regras das reservas)
~~- Notificações enviadas aos stakeholders (como no caso de no-show)~~
~~3. **Vehicle Class calculado automaticamente:**
```
IF wheelchair THEN wheelchair_van
ELSE IF passengers <= 4 AND luggage <= 3 THEN sedan4
ELSE IF passengers <= 7 THEN van7
ELSE IF passengers <= 10 THEN minibus10
ELSE bus16
```~~
4. **Pricing recalculado quando:**
- Origem ou destino muda
- Distância recalculada
- Acessórios adicionados (child seat, etc)
---
~~## 💻 6. ROAD-SHOW (Multi-leg Transfer)
### Descrição
**Multi-leg transfer** - Múltiplas viagens para o mesmo cliente/grupo.
### Quando Usar
- Executivos em viagem de negócios
- VIPs com múltiplos compromissos
- Tours guiados com várias paragens
### Estrutura de Dados
```javascript
// MODELO DE DADOS - ROAD_SHOW
{
road_show_id: UUID, // agrupa todas as legs
company_id: UUID, // tenant
customer_reference: String,
// ─── LEGS (array de Transfers) ───
legs: [
{ leg_number: 1, transfer_id: UUID }, // Airport → Hotel
{ leg_number: 2, transfer_id: UUID }, // Hotel → Meeting
{ leg_number: 3, transfer_id: UUID }, // Meeting → Restaurant
{ leg_number: 4, transfer_id: UUID }, // Restaurant → Airport
],
// ─── DEPENDENCY LOGIC ───
hard_dependencies: [
{ dependent_leg: 2, depends_on: 1, buffer_time_minutes: 30 }
// leg_2.start >= leg_1.end + buffer_time
],
delay_propagation: Enum, // "manual" | "automatic" (RECOMENDADO: manual)
// Se leg_1 atrasa:
// - Sistema SUGERE novo timing
// - Operator DECIDE se aceita ou não
manual_start_time_override: Boolean, // TRUE - Operator pode alterar start de qualquer leg
// ─── ALLOCATION STRATEGY ───
default_strategy: "same_driver_all_legs",
// Driver recebe TODAS as legs como bloco
// Reserva período completo (ex: 09:00-21:00)
allow_split: Boolean, // TRUE
// Operator pode MANUALMENTE atribuir legs a diferentes drivers
// Ex: leg_1+2 = Driver A, leg_3+4 = Driver B
wait_time_handling: {
under_1h: "driver_waits_included",
from_1h_to_3h: "driver_waits_chargeable",
over_3h: "driver_can_do_short_transfer", // com aprovação
},
// ─── PRICING ───
pricing_model: Enum, // "per_leg" | "total_package"
includes_wait_time: Boolean,
calculation: {
legs_total: Decimal, // sum of all legs
wait_time_charges: Decimal,
total: Decimal,
},
// ─── STATUS ───
status: Enum, // "pending" | "allocated" | "in_progress" | "completed"
current_leg: Integer, // qual leg está ativa
completed_legs: Array,
}
```~~
~~### Regras de Negócio - Road-show
1. **Alocação padrão:** Mesmo driver para todas as legs
- Bloco reservado do início ao fim
- Minimiza hand-off entre drivers
2. **Propagação de atrasos:** MANUAL por padrão
```
Leg 1 atrasa 45min:
Sistema SUGERE:
├─ Manter legs seguintes (se buffer suficiente)
└─ OU ajustar todas (+45min)
Operator DECIDE:
├─ Opção A: Manter original (trocar driver se necessário)
└─ Opção B: Ajustar timings
```
3. **Wait time:**
- < 1h: incluído no preço
- 1-3h: cobrado à parte
- > 3h: driver pode fazer transfer curto nearby (com aprovação)
4. **Split permitido:**
- Operator pode manualmente separar legs
- Sistema valida constraints de cada leg individualmente
---~~
## 💻 7. VEHICLE (Frota)
### Descrição
**Gestão completa da frota** - Veículos, ~~manutenção, disponibilidade.~~
### Estrutura de Dados
```javascript
// MODELO DE DADOS - VEHICLE
{
// ─── BASIC INFO ───
id: UUID,
company_id: UUID, // tenant
license_plate: String, // único
make: String, // "Mercedes", "BMW"
model: String, // "E-Class", "Serie 3"
year: Integer,
color: String,
vin: String, // chassis number
// ─── CLASSIFICATION ───
vehicle_class: String, // "sedan4" | "van7" | "minibus10" | "bus16"
capacity: {
max_passengers: Integer,
max_luggage: Integer,
max_weight_kg: Integer,
},
features: [
"wheelchair_accessible",
"child_seats_available",
"luxury",
"wifi",
"air_conditioning"
],
// ─── STATUS & AVAILABILITY ───
current_status: Enum,
// "available" | "in_service" | "maintenance" | "broken" | "out_of_service"
current_location: { lat: Float, lng: Float },
last_updated_at: DateTime,
estimated_available_at: DateTime,
// ─── MAINTENANCE & HISTORY ───
maintenance_schedule: [
{
scheduled_date: DateTime,
maintenance_type: Enum, // "inspection" | "revision" | "repair"
estimated_duration_hours: Integer,
status: Enum, // "scheduled" | "in_progress" | "completed"
}
],
maintenance_history: [
{
date: DateTime,
type: String,
description: Text,
cost: Decimal,
next_due_date: DateTime,
}
],
defects_log: [ // ⚠️ CRÍTICO
{
reported_at: DateTime,
reported_by: UUID, // driver_id
description: Text,
severity: Enum, // "critical" | "high" | "medium" | "low"
status: Enum, // "open" | "in_repair" | "resolved"
resolved_at: DateTime,
}
],
usage_statistics: {
total_km: Integer,
total_transfers: Integer,
last_service_km: Integer,
km_until_next_service: Integer,
},
// ─── INSURANCE & DOCUMENTS ───
insurance_expiry: Date,
inspection_expiry: Date, // IPO
registration_expiry: Date,
documents: Array, // scans/PDFs
// ─── COST TRACKING ───
acquisition_cost: Decimal,
maintenance_costs_ytd: Decimal,
fuel_costs_ytd: Decimal,
cost_per_km: Decimal, // calculado
}
```
~~
### Regras de Negócio - Vehicle
1. **Status transitions:**
```
available ⟷ in_service (normal operation)
available → maintenance → available (scheduled)
available → broken → maintenance → available (emergency)
any_status → out_of_service (permanent removal)
```
2. **Manutenção programada:**
- Bloqueia allocation automaticamente
- Sistema sugere realocação de transfers afetados
3. **Defeitos críticos:**
- Reportados pelo driver via app
- Status automático: available → broken
- Transfers afetados: realocados imediatamente
4. **Localização:**
- Atualizada automaticamente durante transfers (GPS)
- Usada para calcular dead mileage na allocation
---~~
## 💻 8. DRIVER (Motoristas)
### Descrição
**Motoristas** - SEMPRE associados a um veículo.
### Estrutura de Dados
```javascript
// MODELO DE DADOS - DRIVER
{
// ─── BASIC INFO ───
id: UUID,
company_id: UUID, // tenant
name: String,
photo: URL,
phone: String,
email: String,
// ─── QUALIFICATIONS ───
license_category: Enum, // "B" | "D" | "D1"
license_number: String,
license_expiry: Date,
certifications: [
"taxi",
"tvde", // Uber/Bolt
"transport_collective",
"first_aid"
],
languages: ["PT", "EN", "ES", "FR"],
// ─── VEHICLE ASSIGNMENT ⚠️ OBRIGATÓRIO ───
assigned_vehicle_id: UUID, // FK, NEVER NULL!
assignment_type: Enum, // "permanent" | "daily"
// REGRA CRÍTICA:
// Driver SEM veículo = INDISPONÍVEL
// Se carro em manutenção → driver fica idle OU troca de carro
// ─── WORK SHIFT ⚠️ GESTÃO DE TURNOS ───
current_shift: {
shift_start: DateTime, // ex: 2025-11-10 08:00
shift_end: DateTime, // ex: 2025-11-10 20:00
break_start: Time, // ex: 13:00
break_end: Time, // ex: 14:00
max_hours_per_shift: Integer, // legal default 10h
},
shift_template: { // padrão semanal
monday: { start: "08:00", end: "20:00" },
tuesday: { start: "08:00", end: "20:00" },
wednesday: { start: "08:00", end: "20:00" },
thursday: { start: "08:00", end: "20:00" },
friday: { start: "08:00", end: "20:00" },
saturday: { start: "09:00", end: "18:00" },
sunday: { off: true },
},
shift_exceptions: [
{
date: Date,
reason: Enum, // "vacation" | "sick" | "day_off" | "training"
replacement_driver_id: UUID, // opcional
}
],
legal_constraints: {
max_hours_per_day: Integer, // 10h
min_rest_between_shifts: Integer, // 11h
max_hours_per_week: Integer, // 48h
},
// ─── AVAILABILITY (CALCULADA EM RUNTIME) ───
current_status: Enum,
// "available" | "busy" | "on_break" | "off_shift" | "unavailable"
next_available_at: DateTime,
hours_worked_today: Integer,
// ─── RATING & PERFORMANCE ───
average_rating: Decimal, // 1-5
total_transfers: Integer,
on_time_percentage: Decimal,
customer_feedback: Array,
// ─── TYPE (DEFINIDO PELO OPERATOR) ───
employment_type: Enum, // "own" | "outsourced" | "partner_operator"
cost_per_hour: Decimal, // para cálculo interno
}
```
### Regras de Negócio - Driver
1. **Driver SEMPRE tem veículo:**
```
Driver sem vehicle_id → Status: unavailable
Carro vai para manutenção:
├─ Opção A: Driver fica idle (pago)
└─ Opção B: Driver recebe outro carro (temp assignment)
```
2. **Validação de turno na allocation:**
```
Transfer: 19:00-20:30 (1.5h)
Driver João:
├─ Shift: 08:00-20:00
├─ Already worked: 9h
├─ Total would be: 10.5h ❌ EXCEDE LIMITE
Sistema:
└─ REJEITA allocation para João
└─ OU sugere split/overtime (manual approval)
```
3. **Rest between shifts:**
```
Driver termina: 22:00
Próximo shift: >= 09:00 (11h depois)
Sistema previne allocation antes de 09:00
```
4. **Break time:**
- Configurável por driver
- Bloqueio automático na allocation
- Pode ser overridden em emergência
---
## 🔄 9. AGENCY / Operadora / Hotel (Clientes B2B)
### Descrição
Entidade central para operação B2B - Gestão completa de agências parceiras.
### Para Negócio 📊
Agências são clientes B2B que:
- Fazem bookings em nome dos seus clientes
- Têm contratos com termos específicos (pricing, SLA, crédito)
- Podem ter acesso via API ou Portal
~~- São faturadas mensalmente ou por transfer~~
### Para Desenvolvimento 💻
```javascript
// MODELO DE DADOS - AGENCY
{
// ─── BASIC INFO ───
id: UUID,
company_id: UUID, // tenant FK
name: String,
legal_name: String,
tax_id: String, // VAT/NIF
logo_url: String,
website: String,
// ─── CONTACT INFO ───
primary_contact: {
name: String,
email: String,
phone: String,
position: String,
},
billing_contact: Object,
operations_contact: Object,
emergency_contact: Object,
// ─── ADDRESS ───
billing_address: {
street: String,
city: String,
postal_code: String,
country: String,
tax_residence: String,
},
operational_address: Object,
// ─── CONTRACT & PRICING ⭐ ───
contract: {
contract_id: String,
start_date: Date,
end_date: Date,
renewal_type: Enum, // "automatic" | "manual"
notice_period_days: Integer,
contract_document_url: String,
},
pricing_model: Enum,
// "net_rates" | "markup" | "discount" | "custom_rates" | "commission"
pricing_params: {
markup_percentage: Decimal, // ex: 20
discount_percentage: Decimal, // ex: 15
commission_rate: Decimal, // ex: 10
custom_rate_sheet_id: UUID,
},
minimum_monthly_value: Decimal, // Commitment mínimo mensal
// ─── PAYMENT TERMS ⭐ ───
payment_terms: {
type: Enum, // "prepaid" | "postpaid" | "credit_account" | "per_transfer"
credit_limit: Decimal, // Limite de crédito disponível
payment_due_days: Integer, // Ex: NET 30, NET 15
late_payment_fee: {
type: Enum, // "percentage" | "fixed"
value: Decimal, // ex: 2.0 (2% por mês)
grace_period_days: Integer, // ex: 7
},
},
current_balance: Decimal, // Saldo atual da conta
available_credit: Decimal, // credit_limit - current_balance
credit_status: Enum, // "good" | "warning" | "suspended" | "blocked"
// ─── SERVICE LEVEL AGREEMENT (SLA) ⭐ ───
sla_terms: {
response_time_minutes: Integer, // 15
allocation_time_hours: Integer, // 24
on_time_target_percentage: Decimal, // 95
customer_satisfaction_target: Decimal, // 4.5
cancellation_notice_hours: Integer, // 24
},
breach_penalties: Array, // Penalidades por não cumprir SLA
performance_bonuses: Array, // Bonus por exceder SLA
// ─── OPERATIONAL SETTINGS ───
no_show_policy_id: UUID, // FK - Política específica desta agência
cancellation_policy_id: UUID, // FK
preferred_vehicle_categories: Array, // ["executive", "luxury"]
requires_approval: {
for_changes: Boolean,
for_cancellations: Boolean,
for_extras: Boolean,
},
auto_allocation: Boolean, // Allocar automaticamente ou esperar confirmação
// ─── API ACCESS ⭐ ───
api_enabled: Boolean,
api_key: String, // hashed
api_secret: String, // hashed
webhook_url: String,
webhook_events: ["booking.created", "booking.completed"], // etc
ip_whitelist: Array,
rate_limit: {
requests_per_minute: Integer, // 60
burst_limit: Integer, // 100
},
// ─── PORTAL ACCESS ───
portal_enabled: Boolean,
portal_url: String, // portal.system.com/agency-slug
portal_users: Array, // Users que podem aceder
portal_permissions: Array, // O que podem fazer
// ─── PERFORMANCE TRACKING ⭐ ───
statistics: {
total_bookings: Integer, // 1456
total_revenue: Decimal, // 145600.00
average_booking_value: Decimal, // 100.00
cancellation_rate: Decimal, // 0.05 (5%)
no_show_rate: Decimal, // 0.02 (2%)
on_time_rate: Decimal, // 0.97 (97%)
},
monthly_performance: Array, // Histórico mensal
trends: {
growth_rate: Decimal, // 0.15 (15% MoM)
forecast_next_month: Integer, // 167
},
// ─── STATUS & SETTINGS ───
status: Enum, // "active" | "suspended" | "blocked" | "inactive"
tier: Enum, // "standard" | "premium" | "vip"
priority_level: Integer, // 1-10, usado na allocation
notes: Text, // Notas internas
tags: ["corporate", "high-volume", "vip"],
// ─── AUDIT ───
created_at: DateTime,
created_by: UUID,
updated_at: DateTime,
last_booking_at: DateTime,
}
```
### Pricing Models - Exemplos
**Modelo 1: NET RATES**
```
Agency paga preços base do operator
Transfer: €100 → Agency pays: €100
```
~~
**Modelo 2: MARKUP (+20%)**
```
Transfer operator cost: €100
Markup 20%: +€20
Agency pays: €120
```
**Modelo 3: DISCOUNT (-15%)**
```
Transfer public price: €100
Discount 15%: -€15
Agency pays: €85
```
**Modelo 4: COMMISSION (10%)**
```
Transfer sold to customer: €120
Commission 10%: -€12
Operator receives: €108
Agency keeps: €12
```~~
~~
### Credit Management Flow
```
NEW AGENCY:
├─ Credit limit: €5,000
├─ Balance: €0
└─ Available: €5,000
After 50 transfers (€5,000):
├─ Balance: €5,000
└─ Available: €0 ⚠️
Transfer #51:
└─ BLOCKED!
Payment received (€3,000):
├─ Balance: €2,000
└─ Available: €3,000 ✓
ALERTS:
├─ 80% used: Warning
├─ 95% used: Urgent
├─ 100% used: Suspend
└─ Overdue: Block
```~~
---
## 🔄 10. PASSENGER (Clientes B2C)
### Descrição
Entidade dedicada para passageiros - Histórico, preferências e gestão.
### Para Negócio 📊
Passageiros são clientes finais que:
- Reservam diretamente no sistema
- Têm histórico de viagens e preferências
- Podem ser segmentados (VIP, Frequent, Regular)
- Recebem comunicações personalizadas
### Para Desenvolvimento 💻
```javascript
// MODELO DE DADOS - PASSENGER
{
// ─── BASIC INFO ───
id: UUID,
company_id: UUID, // tenant FK
external_id: String, // ID da agência se veio de lá
first_name: String,
last_name: String,
email: String,
phone: String,
date_of_birth: Date, // opcional
// ─── CONTACT PREFERENCES ───
preferred_contact_method: Enum, // "email" | "sms" | "whatsapp" | "phone_call"
language: String, // "EN" | "PT" | "ES" | "FR"
timezone: String,
notification_preferences: {
booking_confirmation: Boolean,
driver_assigned: Boolean,
on_the_way: Boolean,
marketing: Boolean,
surveys: Boolean,
},
// ─── TRAVEL PREFERENCES ⭐ ───
default_vehicle_category: String, // "executive"
accessibility_requirements: ["wheelchair", "child_seat"],
special_requests: ["quiet_driver", "temperature_22c", "no_perfume"],
saved_locations: {
home_address: Object,
work_address: Object,
frequent_hotels: Array,
},
// ─── PASSENGER STATUS ───
status: Enum, // "active" | "vip" | "blacklisted" | "inactive"
vip_reason: String, // "High-value corporate client"
blacklist_reason: String, // "Multiple no-shows without payment"
risk_level: Enum, // "low" | "medium" | "high"
// ─── HISTORICAL DATA ⭐ ───
statistics: {
total_transfers: Integer, // 156
total_spent: Decimal, // 15600.00
average_rating_given: Decimal, // 4.8
average_rating_received: Decimal, // 4.5
cancellation_count: Integer, // 3
no_show_count: Integer, // 1
first_transfer_date: Date,
last_transfer_date: Date,
},
// ─── BEHAVIORAL PATTERNS ───
booking_behavior: {
preferred_booking_window_hours: Integer, // 24h, 48h
preferred_pickup_times: Array, // ["08:00", "17:00"]
most_frequent_routes: Array,
},
// ─── SEGMENTATION ⭐ ───
segment: Enum, // "vip" | "frequent" | "regular" | "at_risk" | "churned"
segment_criteria: {
min_transfers_for_frequent: 10,
min_spend_for_vip: 5000,
inactivity_days_for_churned: 180,
},
// ─── LOYALTY ───
loyalty_points: Integer,
loyalty_tier: Enum, // "bronze" | "silver" | "gold" | "platinum"
// ─── GDPR & PRIVACY ───
consent: {
marketing: Boolean,
data_processing: Boolean,
third_party_sharing: Boolean,
consent_date: DateTime,
},
data_retention: {
can_delete_after: Date, // 2 years inactive
deletion_requested: Boolean,
deletion_scheduled_date: Date,
},
// ─── AUDIT ───
created_at: DateTime,
created_by: UUID, // user ou agency
updated_at: DateTime,
last_login_at: DateTime,
}
```
~~### Passenger Segmentation Logic
```
VIP:
├─ Total spend > €5,000
├─ OR Corporate client
└─ Benefits: Priority allocation, better vehicles
FREQUENT:
├─ Transfers > 10 in 12 months
└─ Benefits: Discount 5%, loyalty points
REGULAR:
├─ Transfers 1-10 in 12 months
└─ Benefits: Standard service
AT_RISK:
├─ No transfer in 90-180 days
└─ Action: Re-engagement campaign
CHURNED:
├─ No transfer in 180+ days
└─ Action: Win-back campaign
BLACKLISTED:
├─ Multiple no-shows (3+)
├─ OR Payment issues
└─ Action: Require prepayment
```~~
---
# PARTE III - PROCESSOS DE NEGÓCIO
## 📊 11. LÓGICA DE ALLOCATION
### Para Negócio
Allocation é o processo de atribuir um motorista e veículo a cada transfer. É feito automaticamente pelo sistema (MVP - sem process scheduler) baseado em:
- Disponibilidade de recursos
- Prioridades (VIP, SLA, ordem)
- Eficiência (minimizar km vazios)
- Custos (próprios vs terceirizados)
### Timeline de Allocation por Tipo
```
PRIVATE / ROAD_SHOW:
├─ T-24h: Allocation automática (1ª tentativa)
├─ T-12h: Validação + resolver conflitos
├─ T-4h: Confirmação com driver
├─ T-2h: Monitorização ativa
├─ T-0: Execução
└─ T+X: Emergência: realocação permitida ⚠️
SHUTTLE_DYNAMIC:
├─ T-4h: Cut-off para agrupamento
├─ T-3h: Optimizar rota + validar capacidade
├─ T-2h: Allocation de veículo + driver
├─ T-1h: Confirmação + notificações
└─ T-0: Execução
SHUTTLE_STATIC:
├─ T-24h: Contar passageiros
├─ T-4h: Decidir capacidade (1 ou 2 shuttles?)
├─ T-2h: Allocation
└─ T-0: Execução
```
### Estratégias de Allocation (Configuráveis)
**Definidas pelo Operator a nível de company:**
```javascript
OPERATOR_CONFIG = {
allocation_strategy: {
driver_pool_preference: Enum,
// "own_drivers_only" | "outsourced_only" | "hybrid_own_first" |
// "hybrid_cheapest_first" | "partner_operator"
dead_mileage_prevention: {
enabled: Boolean,
max_acceptable_km: Integer, // ex: 20km
weight_in_scoring: Integer, // ex: 30%
},
priority_rules: [ // ⚠️ DINÂMICAS
{ type: "vip_first", weight: 100 },
{ type: "road_show_first", weight: 80 },
{ type: "earliest_first", weight: 50 },
{ type: "agency_sla", weight: 70 },
{ type: "minimize_cost", weight: 30 },
],
},
timing_windows: {
default_allocation_window: Duration, // -24h
validation_frequency: {
before_T_minus_4h: Duration, // 1h
after_T_minus_4h: Duration, // 15min
},
allow_post_scheduled_allocation: Boolean, // TRUE
// Casos: emergency, major_delay, cancellation
},
conflict_resolution: {
auto_resolve: Boolean,
escalation_threshold: Enum, // "soft_conflict" | "hard_conflict"
manual_approval_required_for: [
"shift_overtime",
"vehicle_swap",
"outsource_transfer"
],
},
}
```
### Scoring Algorithm
**Para cada (Driver + Vehicle) disponível:**
```
Score = Σ(priority_rules)
- dead_mileage_penalty
+ efficiency_bonus
- cost_factor
EXEMPLO:
Transfer #456 (Private, 2 pax, Airport→Hotel)
├─ Pickup: 15:00
├─ Priority: NORMAL (base 100)
└─ Priority rules:
├─ earliest_first: +50
└─ Total: 150
Candidate 1: Driver João + Van7
├─ Priority score: 150
├─ Dead mileage: 5km → penalty -10
├─ Cost: €15/h → factor -15
├─ Efficiency: next transfer 10km away → bonus +20
└─ TOTAL: 145
Candidate 2: Driver Maria + Sedan4
├─ Priority score: 150
├─ Dead mileage: 25km → penalty -50
├─ Cost: €12/h → factor -12
├─ Efficiency: no next transfer → bonus 0
└─ TOTAL: 88
Winner: João (145 > 88) ✓
```
### Deteção e Resolução de Conflitos
~~**Tipos de Conflito:**
```
HARD CONFLICTS (impedem allocation):
├─ Carro já alocado ao mesmo tempo
├─ Driver excede horas legais (shift)
├─ Veículo em manutenção
├─ Driver sem qualificação adequada
├─ Veículo sem features necessárias (wheelchair, etc)
└─ Driver sem veículo atribuído
SOFT CONFLICTS (geram warnings):
├─ Dead mileage > threshold (ex: 30km)
├─ Driver no fim do turno (próximo limite)
├─ Utilização de veículo < 50% (não optimizado)
└─ Passageiros próximo da capacidade máxima
```~~
**Resolução Automática:**
```
IF conflict detected THEN
├─ Tentar realocar para outro recurso disponível
├─ Se road-show: realocar cadeia completa
├─ Se não possível: ESCALATE para manual
└─ Notificar operations team
REGRAS INVIOLÁVEIS:
├─ NUNCA quebrar road-show allocation
├─ NUNCA violar driver qualifications
├─ NUNCA violar shift constraints (sem aprovação)
└─ SEMPRE respeitar hard constraints
```
---
## 💻 12. CÁLCULO DE PRICING
### Cálculo de Distância
**Flow de Cálculo (cascading fallback):**
```
1. INPUT
├─ origin: {lat, lng}
└─ destination: {lat, lng}
2. MÉTODO (ordem de prioridade)
├─ PRIMARY: GraphHopper API (2500 requests/dia GRÁTIS)
│ └─ Returns: distance_km, duration_min, route_geometry
│
├─ SECONDARY: Dados históricos próprios
│ └─ Lookup: mesma rota em transfers passados
│ └─ "Airport→Hotel Ibis" = média 15km
│
└─ FALLBACK: Distância linear + factor
└─ distance = haversine(origin, dest) * 1.3
3. CONVERT UNITS
├─ km = distance
├─ miles = km * 0.621371
└─ duration_hours = duration_min / 60
4. STORE
├─ calculated_distance_km
├─ calculated_distance_miles
├─ estimated_duration_minutes
└─ calculation_method (para auditoria)
```
### Modelos de Pricing
#### MODELO 1: FIXED PRICE
```
Usado: Rotas conhecidas, contratos
Exemplo: "Airport → City Center = €35"
Cálculo:
└─ base_price (fixo, pré-definido)
Não muda com:
├─ Tráfego (incluído)
├─ Distância real (estimado)
└─ Tempo (incluído)
```
#### MODELO 2: DYNAMIC (Distance-based)
```javascript
// Usado: Custom routes, sem contrato
// Exemplo: "€1.50/km + €15 base"
const pricing = {
base_fee: 15, // €15
distance_fee: distance_km * price_per_km,
// 15km * €1.50 = €22.50
time_fee: duration_hours * price_per_hour, // opcional
// 0.42h * €20/h = €8.40
surcharges: {
night: booking_time between "22:00" and "06:00" ? 0.20 : 0, // +20%
weekend: is_weekend ? 0.15 : 0, // +15%
accessibility: has_accessibility ? 10 : 0, // +€10 (wheelchair, child seat)
airport_fee: is_airport ? 5 : 0, // +€5
wait_time: wait_minutes * 0.50, // €0.50/min
},
total: base + distance + time + sum(surcharges)
}
// Exemplo completo:
// ├─ Base: €15
// ├─ Distance (15km): €22.50
// ├─ Time (25min): incluído no base
// ├─ Child seat: +€10
// └─ TOTAL: €47.50
```
#### MODELO 3: QUOTED
```
Usado: Road-shows, pedidos complexos, grupos grandes
Processo:
1. Cliente pede quotation
2. Sistema calcula estimate (dynamic model)
3. Operator review & ajusta (margem, complexidade)
4. Quota enviada ao cliente
5. Cliente aceita → booking criado
6. Preço FIXO (não muda após aceite)
```
### API - Instant Quote
```javascript
// POST /api/v1/quotes
{
origin: { lat: 38.7742, lng: -9.1342 },
destination: { lat: 38.7223, lng: -9.1393 },
service_type: "private",
passengers: 2,
luggage: 3,
pickup_time: "2025-11-10T15:00:00Z",
accessibility: ["child_seat"]
}
// Sistema calcula:
// ├─ Distance: 15km (GraphHopper API)
// ├─ Duration: 25min
// ├─ Vehicle required: sedan4 (2 pax + 3 luggage)
// ├─ Pricing model: dynamic
// │ ├─ Base: €15
// │ ├─ Distance: 15km * €1.50 = €22.50
// │ ├─ Child seat: +€10
// │ └─ Total: €47.50
// │
// └─ Vehicle options:
// ├─ sedan4: €47.50
// └─ van7 (upgrade): €55.00
// Response:
{
quote_id: "Q-67890",
distance_km: 15,
duration_minutes: 25,
pricing: {
base: 15,
distance: 22.50,
surcharges: 10,
total: 47.50,
currency: "EUR"
},
vehicle_options: [
{ class: "sedan4", price: 47.50 },
{ class: "van7", price: 55.00 }
],
valid_until: "2025-11-09T15:00:00Z"
}
```
---
## 🔄 13. POLÍTICAS DE NO-SHOW
### Para Negócio 📊
No-show acontece quando passageiro não aparece no pickup. Cada agência tem política própria:
- Quanto tempo esperar
- Quanto cobrar (0%, 50%, 100%)
- Protocolo de contacto
### Estrutura
```javascript
AGENCY_NO_SHOW_POLICY = {
agency_id: UUID, // FK
wait_time_minutes: Integer, // Quanto tempo driver espera
charge_policy: {
type: Enum, // "full_charge" | "partial_charge" | "no_charge" | "custom"
percentage: Integer, // se partial (ex: 50, 75)
},
driver_protocol: [ // sequência de ações
{ time: 5, action: "call_passenger" },
{ time: 15, action: "call_passenger" },
{ time: 25, action: "call_agency" },
{ time: 30, action: "mark_no_show" }
]
}
```
~~### Exemplos de Políticas
**Agency #1 (Premium Travel)**
```
wait_time: 30 minutos
charge: 100% (full)
protocol:
├─ T+5min: Ligar ao passageiro
├─ T+15min: Ligar ao passageiro (2ª vez)
├─ T+25min: Ligar à agência
└─ T+30min: Marcar no-show se sem resposta
```
**Agency #2 (Budget Tours)**
```
wait_time: 15 minutos
charge: 50% (partial)
protocol:
├─ T+5min: Ligar ao passageiro
└─ T+15min: Marcar no-show se sem resposta
```
**Direct Booking (default)**
```
wait_time: 20 minutos
charge: Custom (operator decide)
protocol:
├─ T+5min: Ligar ao passageiro
└─ Escalar para operations imediatamente
```
### Implementação - Flow
```
Transfer #789
├─ booking_source: Agency #1
├─ no_show_policy: agency_1_policy
│
At pickup time:
├─ T+0: Driver chega ao local
├─ Passageiro não aparece
│
Sistema inicia protocolo:
├─ T+5min: App instrui driver: "Call passenger"
│ └─ Driver faz chamada, sem resposta
│
├─ T+15min: App instrui: "Call passenger again"
│ └─ Driver faz 2ª chamada, sem resposta
│
├─ T+25min: App instrui: "Call agency"
│ └─ Driver liga à agência, sem alternativa
│
└─ T+30min: Sistema marca automaticamente:
├─ Status: no_show
├─ Charge: 100% (€47.50)
├─ Driver released (disponível)
├─ Invoice gerado
└─ Notificações enviadas
```
---~~
# BREAK
## 🔄 14. CANCELLATION & REFUND POLICIES (Tenant Based)
### Para Negócio 📊
Políticas de cancelamento baseadas em tempo:
- Mais cedo = menos penalização
- Última hora = penalização total
- Force majeure = reembolso total
### Time-based Cancellation Tiers
```
CANCELLATION POLICY (Standard)
├─ > 48h antes: 100% refund (sem penalização)
├─ 48h - 24h: 50% refund (50% penalty)
├─ 24h - 12h: 25% refund (75% penalty)
├─ < 12h: 0% refund (100% penalty)
└─ After pickup time: No refund
EXCEPTIONS (Force Majeure):
├─ Flight cancelled (airline confirmation required)
├─ Medical emergency (doctor's note)
├─ Natural disaster
├─ Government restrictions
└─ → 100% refund OR reschedule free
```
### Refund Calculation
```javascript
function calculateRefund(transfer, cancellation_time) {
const hours_until_pickup = (transfer.pickup_time - cancellation_time) / 3600;
const original_price = transfer.pricing.total;
let refund_percentage;
if (hours_until_pickup > 48) {
refund_percentage = 100;
} else if (hours_until_pickup > 24) {
refund_percentage = 50;
} else if (hours_until_pickup > 12) {
refund_percentage = 25;
} else {
refund_percentage = 0;
}
// Check force majeure
if (cancellation.reason === "force_majeure" && cancellation.proof_provided) {
refund_percentage = 100;
}
return {
refund_amount: original_price * (refund_percentage / 100),
penalty_amount: original_price * ((100 - refund_percentage) / 100),
refund_percentage: refund_percentage,
};
}
```
### Road-show Partial Cancellation
```
Road-show com 4 legs:
├─ Leg 1: Airport → Hotel (€35)
├─ Leg 2: Hotel → Meeting (€25)
├─ Leg 3: Meeting → Restaurant (€20)
└─ Leg 4: Restaurant → Airport (€40)
Total: €120
Cliente cancela Leg 3 (48h antes):
├─ Leg 3: €20 → 100% refund = €20
├─ Legs restantes: mantém
├─ Wait time: pode reduzir (menos 1 leg)
└─ Total novo: €100
Sistema:
├─ Recalcula pricing
├─ Ajusta allocation se necessário
└─ Notifica todos stakeholders
```
### Refund Processing Methods
```
REFUND METHODS (by payment method)
CREDIT CARD:
├─ Processing time: 5-10 business days
├─ Method: Automatic reversal
└─ Fee: None
BANK TRANSFER:
├─ Processing time: 2-3 business days
├─ Method: Manual transfer
└─ Fee: None (absorbed by operator)
ACCOUNT CREDIT (B2B):
├─ Processing time: Immediate
├─ Method: Credit to agency balance
└─ Fee: None
└─ Note: Can be used for future bookings
CASH:
├─ Processing time: On-site or next visit
├─ Method: Cash return
└─ Fee: None
```
---
## 📊 15. SISTEMA DE COMUNICAÇÃO
### Stakeholders
```
1. AGÊNCIA / operadora (B2B)
├─ Channels: API webhooks, email, portal
├─ Priority: Real-time updates
└─ SLA: < 1min latência
2. PASSAGEIRO DIRETO (B2C)
├─ Channels: SMS, email, WhatsApp, push
├─ Priority: Critical updates only
└─ Custo: Minimizar SMS (usar email quando possível)
3. DRIVER
├─ Channels: App móvel, SMS fallback
├─ Priority: Todas updates
└─ Two-way: Driver pode responder/confirmar
4. OPERATIONS TEAM
├─ Channels: Dashboard, email, Slack/Teams
├─ Priority: Conflicts, emergencies
└─ Requires action: Yes
```
### Eventos que Geram Notificação
#### 1. BOOKING CONFIRMADO
```
Quando: Reserva criada e validada
Agência:
├─ Webhook: POST /agency/webhook { event: "booking.created", ... }
└─ Email: Confirmação com PDF
Passageiro:
├─ Email: "Reserva confirmada #BK-12345"
└─ SMS: "Transfer confirmado para 10-Nov 15:00"
Driver: (ainda não)
```
#### 2. ALLOCATION CONFIRMADA (T-24h)
```
Quando: Veículo + driver atribuídos
Agência:
└─ Webhook: booking.allocated
Passageiro:
└─ Email: "Seu transfer foi agendado"
├─ Driver: João Silva
├─ Vehicle: Mercedes E-Class, ABC-12-34
├─ Photo: [driver_photo.jpg]
└─ Contact: +351 912 345 678
Driver:
└─ App notification: "Novo transfer atribuído"
└─ Action required: Confirm acceptance
```
#### 3. MUDANÇA SIGNIFICATIVA (>15min)
```
Quando: Timing muda devido a voo, tráfego, etc
Agência:
└─ Webhook: booking.updated (immediate)
Passageiro:
├─ SMS: "⚠️ Pickup atrasado 30min. Novo horário: 15:30"
└─ Email: Detalhes completos
Driver:
├─ App alert: "Transfer #123 adiado para 15:30"
└─ SMS backup: (se app offline)
```
#### 4. CONFLITO DETECTADO
```
Quando: Allocation problem identificado
Operations:
├─ Dashboard: 🔴 Alert banner
├─ Email: "URGENTE: Conflito em Transfer #456"
└─ Slack: @ops-team "Allocation conflict needs resolution"
NÃO notificar:
└─ Cliente (aguardar resolução)
DRIVER EVENT: Actualizar informacao.
```
### Webhooks (B2B)
**Estrutura Padrão:**
```http
POST https://agency.com/webhooks/transfers
Headers:
├─ X-Webhook-Signature: HMAC-SHA256(payload, secret)
└─ Content-Type: application/json
Payload:
{
"event": "booking.updated",
"timestamp": "2025-11-10T14:23:45Z",
"booking_reference": "BK-12345",
"data": {
"status": "allocated",
"driver": {
"name": "João Silva",
"phone": "+351912345678",
"vehicle": "Mercedes E-Class ABC-12-34"
},
"timing": {
"scheduled_pickup": "2025-11-10T15:00:00Z",
"estimated_pickup": "2025-11-10T15:30:00Z",
"reason": "flight_delay"
}
}
}
Response esperado:
├─ 200 OK: Webhook recebido
├─ 4xx/5xx: Retry com backoff exponencial
└─ Retry attempts: 3x (1min, 5min, 15min)
```
**Eventos suportados:**
- `booking.created`
- `booking.allocated`
- `booking.updated`
- `booking.started`
- `booking.completed`
- `booking.cancelled`
- `booking.no_show`
---
# PARTE IV - OPERAÇÕES E QUALIDADE
## 🔄 16. USER MANAGEMENT & RBAC
### Para Negócio 📊
Sistema de permissões baseado em funções (roles):
- Admin vê tudo, faz tudo
- Manager gere operações
- Dispatcher apenas aloca transfers
- Finance apenas vê faturação
- Etc.
### Roles Predefinidas
```
1. ADMIN (Super User)
├─ All permissions
├─ User management
├─ System settings
└─ Audit logs
2. MANAGER (Operations Manager)
├─ View all transfers
├─ Manual allocation
├─ Override automatic decisions
├─ Driver & vehicle management
└─ Reports & analytics
3. DISPATCHER
├─ View transfers
├─ Manual allocation
├─ Driver communication
└─ Real-time monitoring
4. FINANCE
├─ View invoices
├─ Payment processing
├─ Financial reports
└─ Agency credit management
5. SUPPORT
├─ View bookings
├─ Customer communication
├─ Issue resolution
└─ Limited editing (with approval)
6. VIEWER (Read-only)
├─ View transfers
├─ View reports
└─ No editing
7. DRIVER (Mobile App)
├─ View assigned transfers
├─ Update status
├─ Report issues
└─ Earnings tracking
```
### Permission Matrix
```
PERMISSION ADMIN MANAGER DISPATCH FINANCE SUPPORT VIEWER
────────────────────────────────────────────────────────────────────────────────
Create booking ✓ ✓ ✓ - ✓ -
View all bookings ✓ ✓ ✓ ✓ ✓ ✓
Edit booking ✓ ✓ ✓ - ✓ -
Cancel booking ✓ ✓ ✓ - ⚠️ -
Delete booking ✓ - - - - -
Manual allocation ✓ ✓ ✓ - - -
Override automatic allocation ✓ ✓ - - - -
View financials ✓ ✓ - ✓ - -
Process payments ✓ - - ✓ - -
Manage drivers ✓ ✓ - - - -
Manage vehicles ✓ ✓ - - - -
View reports ✓ ✓ ✓ ✓ ✓ ✓
Export data ✓ ✓ - ✓ - -
User management ✓ - - - - -
System settings ✓ - - - - -
Legend: ✓ = Yes, - = No, ⚠️ = With approval
```
### 2FA & SSO
```
AUTHENTICATION OPTIONS
1. USERNAME/PASSWORD
├─ Minimum complexity requirements
├─ Password expiry: 90 days
└─ 2FA: Optional but recommended
2. TWO-FACTOR AUTHENTICATION (2FA)
├─ SMS code
├─ Authenticator app (Google, Microsoft)
└─ Required for: Admin, Finance roles
3. SINGLE SIGN-ON (SSO)
├─ Google Workspace
├─ Microsoft Azure AD
├─ Okta
└─ SAML 2.0 support
4. API KEY AUTHENTICATION (for integrations)
├─ API key + secret
├─ IP whitelist
└─ Rate limiting
```
---
## 🔄 17. RATINGS & REVIEW SYSTEM
### Overview
Sistema bidirectional - passageiro avalia driver, driver avalia passageiro.
### Rating Entity
```javascript
RATING = {
id: UUID,
transfer_id: UUID, // FK
// BIDIRECTIONAL
rating_type: Enum, // "passenger_rates_driver" | "driver_rates_passenger"
// PASSENGER RATES DRIVER
driver_rating: {
overall_score: Integer, // 1-5
detailed_scores: {
punctuality: Integer, // 1-5
vehicle_condition: Integer,
professionalism: Integer,
driving_skill: Integer,
comfort: Integer,
},
review_text: Text,
would_recommend: Boolean,
},
// DRIVER RATES PASSENGER
passenger_rating: {
overall_score: Integer, // 1-5
detailed_scores: {
punctuality: Integer,
politeness: Integer,
cleanliness: Integer, // deixou carro limpo?
},
review_text: Text,
issues: Array, // ["no_show", "late", "rude", "damaged_vehicle"]
},
// METADATA
created_at: DateTime,
is_public: Boolean, // exibir publicamente?
is_verified: Boolean, // transfer completado com sucesso?
// MODERATION
moderation_status: Enum, // "pending" | "approved" | "rejected" | "flagged"
moderation_reason: Text,
moderated_by: UUID,
moderated_at: DateTime,
}
```
### Driver Performance Dashboard
```
DRIVER: João Silva
───────────────────────────────────────
Overall Rating: ⭐ 4.8 / 5.0
Total Transfers: 456
Total Reviews: 342
Detailed Breakdown:
├─ Punctuality: 4.9 ⭐⭐⭐⭐⭐
├─ Vehicle: 4.7 ⭐⭐⭐⭐⭐
├─ Professionalism: 4.9 ⭐⭐⭐⭐⭐
├─ Driving: 4.8 ⭐⭐⭐⭐⭐
└─ Comfort: 4.6 ⭐⭐⭐⭐
Recent Reviews:
├─ "Excellent service, very professional!" - ⭐⭐⭐⭐⭐
├─ "On time, clean car, friendly driver" - ⭐⭐⭐⭐⭐
├─ "Good but car could be cleaner" - ⭐⭐⭐⭐
└─ "Perfect!" - ⭐⭐⭐⭐⭐
Trends:
├─ Rating improving: +0.2 (last 30 days)
└─ 98% would recommend
```
### Review Moderation
```
MODERATION WORKFLOW
1. AUTOMATIC FLAGS
├─ Contains profanity → flag
├─ < 10 words → flag as "too short"
├─ All caps → flag as "shouting"
└─ Rating 1-2 without text → require explanation
2. MANUAL REVIEW
├─ Operations team reviews flagged
├─ Can approve, reject, or edit
└─ Reason documented
3. RESPONSE SYSTEM
├─ Driver can respond to reviews
├─ Manager can respond on behalf
└─ Publicly visible
4. DISPUTE PROCESS
├─ Driver can dispute unfair review
├─ Evidence collected (GPS, photos)
├─ Final decision by manager
└─ Review hidden if dispute successful
```
---
~~## 📊 18. EMERGENCY PROTOCOLS
### Types of Emergencies
```
1. ACCIDENT
Severity: CRITICAL
├─ Driver triggers SOS in app
├─ System alerts: operations, emergency services
├─ Collect: location, photos, police report
└─ Action: Immediate alternative transport
2. VEHICLE BREAKDOWN
Severity: HIGH
├─ Driver reports via app
├─ System checks: nearby available vehicles
├─ Option A: Send replacement vehicle
└─ Option B: Arrange tow + refund
3. DRIVER ILLNESS
Severity: HIGH
├─ Driver reports unavailability
├─ System: Immediate reallocation
└─ Notify affected passengers
4. PASSENGER NO-SHOW (after policy)
Severity: MEDIUM
├─ Follow no-show policy
├─ Release driver
└─ Process charges
5. SEVERE WEATHER
Severity: VARIES
├─ Monitor weather APIs
├─ Proactive notifications
├─ Offer rescheduling
└─ Free cancellation if force majeure
6. FORCE MAJEURE (flight cancelled, etc)
Severity: MEDIUM
├─ Verify with official sources
├─ Free cancellation or reschedule
└─ No penalties
```
### Escalation Hierarchy
```
LEVEL 1: DRIVER
├─ Handles minor issues
├─ Reports via app
└─ Escalates if needed
LEVEL 2: DISPATCHER
├─ Monitors in real-time
├─ Handles allocation issues
├─ Reallocates if conflicts
└─ Escalates critical issues
LEVEL 3: OPERATIONS MANAGER
├─ Handles escalated issues
├─ Makes executive decisions
├─ Customer compensation
└─ Escalates legal/safety
LEVEL 4: SENIOR MANAGEMENT
├─ Legal issues
├─ Major incidents
├─ PR crises
└─ Insurance claims
```
### Emergency Contact Chain
```
EMERGENCY CONTACTS (per transfer)
Primary: Passenger phone
├─ Call attempts: 3
├─ SMS if no answer
└─ Escalate if no response
Secondary: Booking source
├─ If agency: Call agency contact
├─ If direct: Call alternative contact
└─ Email notification
Tertiary: Emergency contact (if provided)
├─ Family member or colleague
└─ Last resort
Operations Team:
├─ Always notified
├─ Dashboard alert
└─ Decision authority
```
### SOS Button (Driver App)
```
DRIVER SOS FLOW
1. Driver presses SOS button
2. App captures:
├─ Current GPS location
├─ Transfer details
├─ Photos (optional, 3 max)
└─ Audio recording (30sec)
3. System IMMEDIATELY:
├─ Alerts operations team (push + SMS + call)
├─ Logs incident
├─ Sends location to emergency services (optional)
└─ Freezes transfer status
4. Operations team:
├─ Calls driver within 60 seconds
├─ Assesses situation
├─ Decides action:
│ ├─ Send help
│ ├─ Send replacement vehicle
│ ├─ Call police/ambulance
│ └─ Arrange alternative transport
└─ Updates all stakeholders
5. Post-incident:
├─ Incident report generated
├─ Insurance notified if needed
├─ Review and analysis
└─ Update protocols if needed
```
---~~
# BREAK
## 🔄 19. SLA MANAGEMENT
### Key Metrics
```
1. RESPONSE TIME
Target: < 15 minutes
├─ Time from booking received to acknowledgement
└─ Applies to: API, email, portal bookings
2. ALLOCATION TIME
Target: < 24 hours
├─ Time from booking to confirmed allocation
└─ Exception: urgent requests < 4 hours
3. ON-TIME PERFORMANCE
Target: > 95%
├─ Pickup within ±10 minutes of scheduled time
├─ Excludes force majeure
└─ Tracked per agency
4. CUSTOMER SATISFACTION
Target: > 4.5 / 5.0
├─ Average rating from passengers
└─ Minimum 80% response rate
5. CANCELLATION RATE
Target: < 5%
├─ Operator-initiated cancellations only
├─ Excludes customer cancellations
└─ Penalty if exceeded
```
### Automated Tracking
```
SLA_TRACKING = {
agency_id: UUID,
period: "monthly" | "weekly",
metrics: {
response_time: {
target: 15, // minutes
actual_avg: 12,
compliance: 98%, // % within target
breaches: 3, // count
},
allocation_time: {
target: 24, // hours
actual_avg: 18,
compliance: 99%,
breaches: 1,
},
on_time_performance: {
target: 95, // %
actual: 97,
total_transfers: 145,
on_time: 141,
late: 4,
},
satisfaction: {
target: 4.5,
actual: 4.7,
responses: 120,
response_rate: 83%,
},
cancellation_rate: {
target: 5, // %
actual: 2,
total_transfers: 145,
cancelled_by_operator: 3,
},
},
overall_compliance: 98%, // weighted average
status: "compliant" | "warning" | "breach",
}
```
### Breach Alerts
```
ALERT TRIGGERS
WARNING (Yellow):
├─ Any metric 80-90% of target
├─ Action: Notify operations team
└─ Response: Monitor closely
BREACH (Red):
├─ Any metric < 80% of target
├─ Action: Immediate escalation
├─ Response: Corrective action plan
└─ Penalty may apply (per contract)
AUTOMATIC ACTIONS:
├─ Daily SLA report generated
├─ Weekly summary to management
├─ Monthly invoice adjustment (if penalties)
└─ Quarterly review meeting (if premium agency)
```
### Penalty/Bonus System
```
PENALTIES (if SLA breached)
On-time < 95%:
├─ 95-90%: Warning only
├─ 90-85%: 5% discount next invoice
├─ 85-80%: 10% discount
└─ < 80%: 20% discount + escalation
Response time > 15min:
├─ Per breach: €50 credit
└─ Max: €500/month
BONUSES (if SLA exceeded)
On-time > 98%:
├─ Bonus: €500
└─ Priority allocation next month
Satisfaction > 4.8:
├─ Bonus: €300
└─ Featured as "Premium Service"
Zero breaches:
├─ Bonus: €1000
└─ Certificate of Excellence
```
---
## 💻 20. MOBILE DRIVER APP
### Core Features
```
DRIVER APP FEATURES
1. TODAY'S SCHEDULE
├─ List of assigned transfers
├─ Timeline view
├─ Color-coded by status
└─ Swipe to see details
2. TRANSFER DETAILS
├─ Passenger name & photo
├─ Pickup/dropoff locations
├─ Scheduled times
├─ Special requirements
├─ Contact passenger (call/SMS)
└─ Navigation (integrated)
3. STATUS UPDATES
├─ "On my way" (auto-triggers notification)
├─ "Arrived at pickup"
├─ "Passenger picked up"
├─ "Arrived at destination"
└─ "Transfer completed"
4. NAVIGATION
├─ Integrated Google Maps / Waze
├─ Real-time traffic
├─ Alternative routes
└─ Offline maps (downloaded)
5. COMMUNICATION
├─ Call passenger (masked number)
├─ Call operations
├─ In-app chat
└─ SOS button (emergency)
6. ISSUE REPORTING
├─ Vehicle defect
├─ Passenger no-show
├─ Accident
├─ Traffic delay
└─ Other (with photo)
7. EARNINGS TRACKING
├─ Today's earnings
├─ Week/month totals
├─ Transfer breakdown
└─ Payment history
8. VEHICLE INSPECTION
├─ Pre-shift checklist
├─ Photo documentation
├─ Report issues
└─ Required before first transfer
```
### Offline Mode ⚠️ CRITICAL
```
OFFLINE CAPABILITIES (essential!)
Driver may not always have internet:
├─ Airport parking garages
├─ Rural areas
├─ Network congestion
└─ Tunnel routes
MUST WORK OFFLINE:
├─ View today's schedule
├─ View transfer details
├─ Navigation (with downloaded maps)
├─ Mark status updates (queued for sync)
└─ Take photos (upload when online)
SYNC WHEN ONLINE:
├─ Upload status updates
├─ Upload photos
├─ Download new transfers
├─ Update GPS location
└─ Receive notifications
IMPLEMENTATION:
├─ Local SQLite database
├─ Service Worker (PWA)
├─ Background sync
└─ Conflict resolution (last-write-wins)
```
### UI/UX Principles
```
DESIGN FOR DRIVERS
1. LARGE TOUCH TARGETS
├─ Minimum 44x44pt buttons
└─ Easy to tap while driving (passenger does it)
2. MINIMAL TEXT INPUT
├─ Pre-filled forms
├─ Dropdown selections
├─ Voice input option
└─ Quick actions
3. GLANCEABLE INFO
├─ Large fonts
├─ High contrast
├─ Color coding
└─ Icons > text
4. ONE-HANDED USE
├─ Bottom navigation
├─ Thumb-friendly layout
└─ Swipe gestures
5. NOTIFICATIONS
├─ Sound + vibration
├─ Heads-up display
├─ Critical info only
└─ Not while driving!
```
---
## 📊 21. CUSTOMER PORTAL (B2C)
### Features
```
CUSTOMER PORTAL
1. ACCOUNT MANAGEMENT
├─ Profile editing
├─ Saved addresses
├─ Payment methods
├─ Preferences
└─ Notification settings
2. NEW BOOKING
├─ Step 1: Service type
├─ Step 2: Route (from/to)
├─ Step 3: Date/time
├─ Step 4: Passengers & luggage
├─ Step 5: Vehicle selection
├─ Step 6: Review & pay
└─ Confirmation
3. MY BOOKINGS
├─ Upcoming transfers
├─ Past transfers
├─ Filters (date, status)
└─ Quick actions (modify, cancel)
4. LIVE TRACKING
├─ Real-time map
├─ Driver location
├─ ETA countdown
└─ Driver contact
5. INVOICES & RECEIPTS
├─ Download PDF
├─ Email copy
├─ Payment history
└─ Tax information
6. SUPPORT
├─ FAQ
├─ Live chat
├─ Submit ticket
└─ Phone support (business hours)
```
### Booking Wizard
```
STEP 1: SERVICE TYPE
┌────────────────────────────────┐
│ Choose your service: │
│ │
│ [🚗 Private Transfer] │
│ Just you, direct route │
│ From €35 │
│ │
│ [🚐 Shared Shuttle] │
│ Share with others, save money │
│ From €15 │
│ │
│ [🎭 Road-show] │
│ Multiple stops, same day │
│ Custom quote │
└────────────────────────────────┘
STEP 2: ROUTE
┌────────────────────────────────┐
│ From: [Lisbon Airport ▼] │
│ Arrival flight? [Yes][No]│
│ Flight: [TP1234____] │
│ │
│ To: [Hotel Ibis_______ ▼] │
│ │
│ [📍 Use saved location] │
│ [🔄 Swap] │
└────────────────────────────────┘
STEP 3: DATE & TIME
┌────────────────────────────────┐
│ 📅 Date: [2025-11-10 ▼] │
│ 🕐 Time: [15:00 ▼] │
│ │
│ ℹ️ Pickup time is when driver │
│ arrives (not flight arrival) │
└────────────────────────────────┘
STEP 4: DETAILS
┌────────────────────────────────┐
│ Passengers: [2 ▼] │
│ Luggage: [3 ▼] │
│ │
│ Special requirements: │
│ [✓] Child seat (6 months) │
│ [ ] Wheelchair accessible │
│ [ ] Baby seat │
│ │
│ Notes: [____________] │
└────────────────────────────────┘
STEP 5: VEHICLE SELECTION
┌────────────────────────────────┐
│ 🚗 Sedan (up to 4 pax) │
│ €47.50 │
│ [Select] │
│ │
│ 🚐 Van (up to 7 pax) [UPGRADE] │
│ €55.00 (+€7.50) │
│ [Select] │
└────────────────────────────────┘
STEP 6: REVIEW & PAY
┌────────────────────────────────┐
│ BOOKING SUMMARY │
│ │
│ From: Lisbon Airport │
│ To: Hotel Ibis │
│ Date: 10 Nov 2025, 15:00 │
│ Passengers: 2 │
│ Vehicle: Sedan │
│ │
│ Base fare: €35.00 │
│ Distance (15km): €22.50 │
│ Child seat: €10.00 │
│ ──────────────────────── │
│ TOTAL: €47.50 │
│ │
│ [💳 Pay with Card] │
│ [🏦 Bank Transfer] │
│ [💰 Pay Driver (Cash)] │
└────────────────────────────────┘
```
---
## 💻 22. SCHEDULING & VISUAL PLANNING (Bryntum)
### Overview
Interface visual para operações - ver e gerir todos transfers num timeline.
### Bryntum Scheduler Integration
```
BRYNTUM FEATURES USED
1. GANTT VIEW
├─ X-axis: Time (hours/days)
├─ Y-axis: Resources (drivers + vehicles)
├─ Bars: Transfers (color-coded)
└─ Drag & drop: Manual allocation
2. CALENDAR VIEW
├─ Day/Week/Month views
├─ Filter by service type
├─ Filter by status
└─ Search
3. DRAG & DROP ALLOCATION
├─ Drag transfer to driver
├─ System validates constraints
├─ Shows conflicts in real-time
└─ Confirms allocation
4. COLOR CODING
├─ Green: Allocated & confirmed
├─ Yellow: Allocated pending confirmation
├─ Red: Conflict / unallocated
├─ Blue: In progress
├─ Grey: Completed
└─ Orange: Delayed / issue
5. FILTERS
├─ By date range
├─ By driver
├─ By vehicle
├─ By service type
├─ By status
└─ By agency
6. CONFLICT DETECTION
├─ Overlapping transfers
├─ Driver shift violations
├─ Vehicle double-booking
└─ Visual red flags
```
### Timeline Views
**DAY VIEW (most detailed)**
```
TIME DRIVER JOÃO DRIVER MARIA DRIVER PEDRO
────────────────────────────────────────────────────────────
08:00 ──────────────────
09:00 [Transfer #123]
10:00 ────────────────── ────────────────── ──────────────────
11:00 [Transfer #124]
12:00 ──────────────────
13:00 [BREAK] [BREAK] [Transfer #125]
14:00 ────────────────── ────────────────── ──────────────────
15:00 [Transfer #126] [Transfer #127]
16:00 ────────────────── ──────────────────
17:00 [Transfer #128]
18:00 ──────────────────
```
**WEEK VIEW (overview)**
```
MON TUE WED THU FRI SAT SUN
João ████ ████ ████ ████ ████ ███ OFF
Maria ████ ████ ████ ████ ████ OFF OFF
Pedro ███ ████ ████ ████ ████ ████ ███
```
### Real-time Updates
```
WEBSOCKET INTEGRATION
Driver updates status in app:
↓
Backend WebSocket broadcasts:
↓
Bryntum Scheduler auto-updates:
├─ Transfer bar changes color
├─ Timeline adjusts if delayed
└─ Notifications to operations team
ALL USERS see same state in real-time!
```
---
# PARTE V - INTEGRAÇÕES E SISTEMAS
## 💻 23. INTEGRATION ECOSYSTEM
### External Services Matrix
```
CATEGORY: FLIGHT TRACKING
├─ FlightAware (primary)
│ ├─ Coverage: Global
│ ├─ Real-time: Yes
│ ├─ Cost: $$$
│ └─ API: REST
│
├─ AviationStack (secondary)
│ ├─ Coverage: Good
│ ├─ Real-time: Limited
│ ├─ Cost: $ (free tier available)
│ └─ API: REST
│
└─ FlightStats
├─ Coverage: Excellent
├─ Real-time: Yes
├─ Cost: $$$$
└─ API: REST
CATEGORY: PAYMENTS
├─ Stripe (primary)
│ ├─ Cards, bank transfers, wallets
│ ├─ Multi-currency
│ ├─ Best documentation
│ └─ Webhooks for events
│
├─ PayPal
│ ├─ Popular with consumers
│ ├─ Supports credit accounts
│ └─ Higher fees
│
└─ Square
├─ Good for in-person (cash)
└─ North America focused
CATEGORY: ACCOUNTING
├─ Xero
│ ├─ Popular in UK/AU/NZ
│ ├─ Excellent API
│ └─ Auto-sync invoices
│
├─ QuickBooks
│ ├─ Popular in US
│ └─ API available
│
└─ Sage
├─ Popular in Europe
└─ Legacy but widely used
CATEGORY: COMMUNICATION
├─ Twilio (SMS)
│ ├─ Global coverage
│ ├─ Reliable
│ └─ Pay-per-SMS
│
├─ SendGrid (Email)
│ ├─ Transactional emails
│ ├─ Templates
│ └─ Analytics
│
└─ WhatsApp Business API
├─ Very popular
├─ Rich media support
└─ Requires approval
CATEGORY: MAPPING & ROUTING
├─ Google Maps (premium)
│ ├─ Best data quality
│ ├─ Real-time traffic
│ └─ Expensive
│
├─ GraphHopper (free tier)
│ ├─ 2500 requests/day free
│ ├─ Good routing
│ └─ No real-time traffic (free)
│
├─ OSRM (self-hosted)
│ ├─ 100% free
│ ├─ OpenStreetMap data
│ └─ Self-hosted overhead
│
└─ Mapbox
├─ 100,000 requests/month free
└─ Good balance
CATEGORY: WEATHER
├─ OpenWeatherMap
│ ├─ Free tier available
│ ├─ 5-day forecast
│ └─ Current conditions
│
└─ Tomorrow.io
├─ Hyperlocal
├─ Minute-by-minute
└─ $$
INTEGRATION PRIORITIES:
1. Payment gateways (CRITICAL)
2. SMS/Email (CRITICAL)
3. Flight tracking (HIGH)
4. Accounting (MEDIUM)
5. CRM (LOW - nice to have)
```
### Webhook Architecture
```
INCOMING WEBHOOKS (we receive)
Flight Status Updates:
POST /webhooks/flights
{
"flight": "TP1234",
"status": "delayed",
"new_arrival": "2025-11-10T15:45:00Z",
"delay_minutes": 45
}
Action:
├─ Find transfers with this flight
├─ Recalculate pickup times
├─ Notify all stakeholders
└─ Update Bryntum timeline
OUTGOING WEBHOOKS (we send)
To Agency:
POST https://agency.com/webhooks/transfers
{
"event": "booking.allocated",
"booking_reference": "BK-12345",
"driver": {...},
"vehicle": {...}
}
Retry logic:
├─ Attempt 1: immediate
├─ Attempt 2: +1 minute
├─ Attempt 3: +5 minutes
├─ Attempt 4: +15 minutes
└─ Give up: Log failure + notify
```
---
## 💻 24. REPORTING & ANALYTICS
### Report Categories
```
1. OPERATIONAL REPORTS
├─ Daily operations summary
├─ Driver utilization
├─ Vehicle utilization
├─ On-time performance
└─ Allocation efficiency
2. FINANCIAL REPORTS
├─ Revenue by period
├─ Revenue by agency
├─ Revenue by service type
├─ Cost analysis
├─ Profit margins
└─ Outstanding invoices
3. CUSTOMER REPORTS
├─ Agency performance
├─ Customer satisfaction
├─ Repeat customers
├─ Cancellation reasons
└─ Complaint analysis
4. STRATEGIC REPORTS
├─ Market trends
├─ Capacity vs demand
├─ Growth forecast
├─ Competitive analysis
└─ Expansion opportunities
```
### Example Report: Daily Operations Summary
```
DAILY OPERATIONS SUMMARY
Date: 10 November 2025
────────────────────────────────────────────
TRANSFERS
├─ Total booked: 145
├─ Completed: 142 (97.9%)
├─ Cancelled: 2 (1.4%)
├─ No-show: 1 (0.7%)
└─ In progress: 0
ON-TIME PERFORMANCE
├─ On time (±10min): 138 (97.2%) ✓
├─ Late (>10min): 4 (2.8%)
└─ Average delay: 3.2 minutes
REVENUE
├─ Total: €12,450
├─ Average per transfer: €85.80
├─ Private: €9,200 (74%)
├─ Shuttle: €2,100 (17%)
└─ Road-show: €1,150 (9%)
DRIVERS
├─ Active: 18
├─ Average utilization: 82%
├─ Hours worked: 144h
├─ Overtime: 8h (5.6%)
└─ Top performer: João Silva (12 transfers)
VEHICLES
├─ In service: 16
├─ Maintenance: 2
├─ Utilization: 89%
└─ Total km: 2,456 km
AGENCIES
├─ Active: 8
├─ Top agency: Travel Co (45 transfers)
├─ New bookings: 156
└─ Pending quotes: 12
ISSUES
├─ Vehicle breakdowns: 1
├─ Customer complaints: 0
└─ Driver issues: 0
HIGHLIGHTS
✓ Exceeded on-time target (95%)
✓ Zero customer complaints
⚠ Vehicle #7 needs maintenance
⚠ 2 drivers approaching weekly hour limit
```
### Export Formats
```
SUPPORTED FORMATS
1. PDF
├─ Professional layout
├─ Charts & graphs
├─ Ready to print
└─ Use case: Management reports
2. Excel (XLSX)
├─ Raw data
├─ Pivot tables enabled
├─ Formulas included
└─ Use case: Analysis
3. CSV
├─ Plain data
├─ Easy import
├─ No formatting
└─ Use case: Data migration
4. JSON
├─ Machine-readable
├─ API integration
└─ Use case: Automated systems
```
### Scheduling
```
AUTOMATED REPORTS
Daily:
├─ Operations summary (7:00 AM)
├─ Send to: Operations team
└─ Format: Email + PDF
Weekly:
├─ Performance report (Monday 9:00 AM)
├─ Send to: Management
└─ Format: Email + Excel
Monthly:
├─ Financial report (1st of month)
├─ Send to: Finance team
└─ Format: PDF + Excel
Custom:
├─ On-demand via dashboard
├─ Scheduled by user
└─ Multiple recipients
```
---
## 🔄 25. COMPLIANCE & LEGAL (GDPR)
### GDPR Requirements
```
1. DATA COLLECTION
├─ Clear consent forms
├─ Purpose limitation (why we need it)
├─ Minimum data collected
├─ Privacy policy visible
└─ Opt-in (not opt-out)
2. DATA STORAGE
├─ EU servers (if EU customers)
├─ Encrypted at rest (AES-256)
├─ Encrypted in transit (TLS 1.3)
├─ Access logs maintained
└─ Regular backups
3. DATA RIGHTS
├─ Right to access (export data)
├─ Right to rectification (edit)
├─ Right to erasure ("forget me")
├─ Right to portability
└─ Right to object
4. DATA RETENTION
├─ Active users: indefinite
├─ Inactive users: 2 years
├─ Deleted users: 30 days (soft delete)
├─ Financial records: 7 years (legal requirement)
└─ Logs: 90 days
5. BREACH NOTIFICATION
├─ Detection: <24h
├─ Authority notification: <72h
├─ User notification: immediate if high risk
├─ Documentation: incident log
└─ Remediation: immediate action
```
### Data Subject Rights Implementation
```
RIGHT TO ACCESS (Export Data)
User requests: "I want my data"
System exports:
├─ Personal info (JSON)
├─ Booking history (CSV)
├─ Invoices (PDFs)
├─ Communications (emails)
└─ ZIP file sent via email
Timeframe: 30 days
RIGHT TO ERASURE ("Forget Me")
User requests: "Delete my data"
System checks:
├─ Outstanding invoices? → CANNOT delete
├─ Active bookings? → CANNOT delete
└─ Clean history? → OK to delete
If OK:
├─ Soft delete (flagged as deleted)
├─ Data retained 30 days (recovery window)
├─ After 30 days: Hard delete
├─ Exception: Financial records (7 years legal)
└─ Anonymize instead of delete
Timeframe: 30 days
RIGHT TO RECTIFICATION (Edit)
User requests: "My email is wrong"
System:
├─ User edits in portal
├─ OR support team edits
├─ Audit log records change
└─ Confirmation sent
Timeframe: Immediate
RIGHT TO PORTABILITY
User requests: "Export to CSV"
System exports in standard format:
├─ CSV for tabular data
├─ JSON for structured data
└─ Readable by competitors
Timeframe: 30 days
RIGHT TO OBJECT
User requests: "Stop processing for marketing"
System:
├─ Flags account: no_marketing
├─ Suppression list updated
├─ Confirmation sent
└─ Process within 24h
Timeframe: 24 hours
```
### Legal Documents Required
```
REQUIRED DOCUMENTS
1. Terms of Service
└─ User agreement
2. Privacy Policy
└─ How we handle data
3. Cookie Policy
└─ What cookies we use
4. Cancellation Policy (customer-facing)
└─ Refund terms
5. Refund Policy
└─ How refunds work
6. Driver Agreement
└─ Employment/contractor terms
7. Agency Agreement (B2B)
└─ Commercial terms
8. Insurance Certificates
└─ Vehicle & liability insurance
9. Business Licenses
└─ Transport operator license
10. VAT Registration
└─ Tax compliance
PER REGION:
├─ Portugal: AT certified invoicing, IMT license
├─ Spain: Similar requirements
├─ UK: ICO registration, DVSA license
└─ EU: GDPR DPO (if >250 employees)
```
---
## 💻 26. NOTIFICATION TEMPLATES
### Template System
```javascript
TEMPLATE_STRUCTURE = {
template_id: UUID,
template_name: String,
template_type: Enum, // "email" | "sms" | "whatsapp" | "push" | "in_app"
subject: String, // email only
body: Text, // supports variables
variables: [ // available variables
"{{passenger_name}}",
"{{driver_name}}",
"{{pickup_time}}",
"{{pickup_location}}",
"{{dropoff_location}}",
"{{vehicle_make}}",
"{{vehicle_model}}",
"{{license_plate}}",
"{{booking_reference}}",
"{{driver_phone}}",
"{{tracking_link}}",
"{{company_name}}",
],
languages: {
en: { subject: "...", body: "..." },
pt: { subject: "...", body: "..." },
es: { subject: "...", body: "..." },
fr: { subject: "...", body: "..." },
},
triggers: [ // when to send
"booking_confirmed",
"driver_assigned",
"driver_en_route",
"driver_arrived",
"transfer_completed",
"delay_notification",
"cancellation_confirmed",
],
active: Boolean,
created_at: DateTime,
updated_at: DateTime,
}
```
### Example Templates
**EMAIL: booking_confirmed**
```
Subject: Transfer Confirmed - {{booking_reference}}
Hello {{passenger_name}},
Your transfer has been confirmed!
Pickup Details:
📅 Date: {{pickup_date}}
🕐 Time: {{pickup_time}}
📍 Location: {{pickup_location}}
🎯 Destination: {{dropoff_location}}
We'll send you driver details 24 hours before your transfer.
[View Booking] [Modify] [Cancel]
Best regards,
{{company_name}}
```
**SMS: driver_assigned**
```
{{driver_name}} will be your driver.
{{vehicle_make}} {{vehicle_model}} - {{license_plate}}
Phone: {{driver_phone}}
Pickup: {{pickup_time}}
Track: {{tracking_link}}
```
**PUSH: delay_notification**
```
⚠️ Delay Update
Your pickup time has been delayed by {{delay_minutes}} minutes.
New time: {{new_pickup_time}}
Reason: {{delay_reason}}
```
**WHATSAPP: driver_en_route**
```
🚗 {{driver_name}} is on the way!
ETA: {{eta_minutes}} minutes
Track in real-time: {{tracking_link}}
Vehicle: {{vehicle_make}} {{vehicle_model}}
License: {{license_plate}}
Need to contact driver?
📞 {{driver_phone}}
```
---
## 🔄 27. DISPUTE & COMPLAINTS MANAGEMENT
### Complaint Workflow
```
1. SUBMISSION
├─ Portal form
├─ Email to support@
├─ Phone call
└─ Social media
2. CATEGORIZATION (automatic + manual)
├─ Service quality (late, rude driver, etc)
├─ Billing dispute (wrong charge, etc)
├─ Driver behavior (serious)
├─ Vehicle condition (dirty, broken, etc)
├─ Delay/no-show
└─ Safety issue (critical!)
3. PRIORITY ASSIGNMENT
├─ CRITICAL (safety): immediate response
├─ HIGH (billing >€100): 2h response
├─ MEDIUM: 24h response
└─ LOW: 48h response
4. INVESTIGATION
├─ Review transfer details (timeline, GPS)
├─ Check driver logs
├─ Contact driver for statement
├─ Review ratings & history
└─ Collect evidence (photos, recordings)
5. RESOLUTION OPTIONS
├─ Full refund
├─ Partial refund (50%, 75%)
├─ Voucher/credit for future use
├─ Formal apology
└─ No action (complaint unfounded)
6. FOLLOW-UP
├─ Resolution email to customer
├─ Satisfaction survey
├─ Close ticket
└─ Log for analysis
7. ESCALATION (if not resolved)
├─ Level 1: Support agent
├─ Level 2: Support manager
├─ Level 3: Operations manager
└─ Level 4: Senior management (serious cases)
```
### Complaint Entity
```javascript
COMPLAINT = {
id: UUID,
transfer_id: UUID, // FK
passenger_id: UUID, // FK
submitted_at: DateTime,
submitted_via: Enum, // "portal" | "email" | "phone" | "social"
category: Enum,
// "service_quality" | "billing" | "driver_behavior" |
// "vehicle_condition" | "delay" | "safety"
priority: Enum, // "critical" | "high" | "medium" | "low"
description: Text,
evidence: Array, // URLs to photos, screenshots
investigation: {
assigned_to: UUID, // support agent
started_at: DateTime,
notes: Text,
driver_statement: Text,
gps_logs: Object,
findings: Text,
},
resolution: {
type: Enum,
// "full_refund" | "partial_refund" | "voucher" | "apology" | "no_action"
amount: Decimal, // if refund
voucher_code: String, // if voucher
resolution_notes: Text,
resolved_by: UUID,
resolved_at: DateTime,
},
status: Enum,
// "submitted" → "investigating" → "resolved" | "escalated" | "closed"
customer_satisfaction: Integer, // 1-5, post-resolution survey
created_at: DateTime,
updated_at: DateTime,
}
```
### Escalation Matrix
```
COMPLAINT ESCALATION
LEVEL 1: Support Agent
├─ Handle: routine complaints
├─ Authority: refunds up to €50
├─ Timeframe: 24h
└─ Escalate if: complex, high-value, safety
LEVEL 2: Support Manager
├─ Handle: complex issues
├─ Authority: refunds up to €200
├─ Timeframe: 48h
└─ Escalate if: safety, legal threat, PR risk
LEVEL 3: Operations Manager
├─ Handle: operational issues
├─ Authority: refunds up to €500
├─ Timeframe: 72h
└─ Escalate if: serious safety, legal action
LEVEL 4: Senior Management
├─ Handle: critical issues
├─ Authority: unlimited
├─ Timeframe: immediate
└─ Examples: accidents, lawsuits, media crisis
```
---
## 🔄 28. QUOTATION MANAGEMENT
### Quote States & Lifecycle
```
QUOTE LIFECYCLE
1. DRAFT
├─ Created by operator/auto-generated
├─ Not yet sent to customer
├─ Can be edited freely
└─ No expiry yet
2. SENT
├─ Emailed to customer
├─ Quote URL active
├─ Expires in 7 days (configurable)
├─ Can still be modified (creates new version)
└─ Tracking: email opened?
3. VIEWED
├─ Customer opened quote link
├─ Tracking pixel fired
├─ Timestamp recorded
└─ Follow-up triggered after 24h
4. ACCEPTED
├─ Customer accepts online or via email
├─ Auto-convert to booking
├─ Payment link sent (if required)
└─ Quote archived
5. REJECTED
├─ Customer declined
├─ Reason collected (optional form)
├─ Quote archived
└─ Statistics updated
6. EXPIRED
├─ Past expiry date without acceptance
├─ Can be renewed (extends expiry)
├─ Customer can still view (read-only)
└─ Statistics tracked
```
### Quote Entity
```javascript
QUOTE = {
id: UUID,
quote_reference: String, // "Q-12345"
company_id: UUID,
// CUSTOMER
customer: {
agency_id: UUID, // if B2B
passenger_id: UUID, // if B2C
email: String,
name: String,
},
// TRANSFER DETAILS (same as Transfer entity)
service_type: Enum,
origin: Object,
destination: Object,
passengers: Integer,
luggage: Integer,
pickup_time: DateTime,
// ... other transfer details
// PRICING
pricing: {
base: Decimal,
distance: Decimal,
time: Decimal,
surcharges: Decimal,
total: Decimal,
currency: String,
breakdown: Object, // detailed line items
},
// VEHICLE OPTIONS (multiple tiers)
vehicle_options: [
{ class: "sedan4", price: 47.50, available: true },
{ class: "van7", price: 55.00, available: true },
{ class: "executive", price: 95.00, available: false },
],
// STATE
status: Enum, // "draft" | "sent" | "viewed" | "accepted" | "rejected" | "expired"
sent_at: DateTime,
viewed_at: DateTime,
accepted_at: DateTime,
rejected_at: DateTime,
expired_at: DateTime,
expiry_date: DateTime, // typically sent_at + 7 days
// TRACKING
view_count: Integer,
last_viewed_at: DateTime,
// REJECTION
rejection_reason: Text,
rejection_details: Text,
// CONVERSION
converted_to_booking_id: UUID, // if accepted
// NOTES
internal_notes: Text,
customer_notes: Text,
// AUDIT
created_at: DateTime,
created_by: UUID,
updated_at: DateTime,
}
```
### Quote-to-Booking Conversion
```
AUTOMATIC CONVERSION FLOW
Customer accepts quote:
↓
1. Create Transfer entity
├─ Copy all details from quote
├─ Status: "booked"
├─ Link: quote_id
└─ Pricing locked (from quote)
2. Update Quote
├─ Status: "accepted"
├─ converted_to_booking_id: transfer.id
└─ Archive
3. Process payment (if required)
├─ Send payment link
├─ OR charge saved card
└─ OR mark as "pay_later" (B2B)
4. Trigger allocation
├─ Follow normal allocation logic
└─ T-24h or immediate if urgent
5. Notifications
├─ Customer: "Booking confirmed"
├─ Operations: "New booking from quote Q-12345"
└─ Agency: webhook if B2B
```
### Conversion Tracking & Analytics
```
QUOTATION ANALYTICS
Overall:
├─ Quote-to-booking rate: 65%
├─ Average time to decision: 2.3 days
├─ Expiry rate: 18%
├─ Rejection rate: 17%
└─ View rate: 92% (opened quote)
By Service Type:
├─ Private: 72% conversion
├─ Shuttle: 58% conversion
└─ Road-show: 45% conversion (higher value, longer decision)
By Value:
├─ €0-50: 78% conversion
├─ €50-100: 65% conversion
├─ €100-200: 52% conversion
└─ €200+: 38% conversion (price sensitivity)
Rejection Reasons:
├─ "Too expensive": 45%
├─ "Found alternative": 28%
├─ "Changed plans": 18%
└─ "Other": 9%
Optimization Insights:
├─ Follow-up after 24h increases conversion +15%
├─ Offering vehicle options increases conversion +8%
├─ Quotes viewed <4h after sending: 82% conversion
└─ Quotes viewed >48h after sending: 38% conversion
```
---
## 🔄 29. BACKUP & OVERFLOW HANDLING
### Overflow Strategy
```
WHEN NO RESOURCES AVAILABLE
Scenario: All drivers busy, booking incoming
1. CHECK CONSTRAINTS
├─ All own drivers busy? ✓
├─ All vehicles allocated? ✓
├─ Time window impossible? ✓
└─ Special requirements unfillable? ✓
2. PRIORITIZATION
Who gets served first?
├─ VIP customers first
├─ Then road-shows (multi-leg)
├─ Then by agency priority
├─ Then earliest booking time
└─ Or by revenue potential
3. OPTIONS (in priority order)
A) RESCHEDULE ⏰
├─ Suggest alternative times
├─ ±30min window around requested time
├─ ±1h window if no alternatives
├─ Customer approval needed
└─ Best for: flexible bookings
B) UPGRADE VEHICLE ⬆️
├─ Offer higher category vehicle
├─ Same price OR small surcharge
├─ Customer approval needed
├─ Example: sedan4 → van7 (+€10)
└─ Best for: when only luxury vehicles free
C) PARTNER NETWORK 🤝
├─ Check partner operators
├─ API call to partners
├─ Negotiate price (wholesale)
├─ Subcontract transfer
├─ Maintain profit margin
└─ Best for: regular service types
D) FREELANCE POOL 📢
├─ Send blast to freelance drivers
├─ "Transfer available: €X"
├─ First to accept wins
├─ Higher cost, lower margin
├─ Background checked freelancers only
└─ Best for: last-minute needs
E) DECLINE ❌
├─ Last resort only
├─ Apologize professionally
├─ Offer compensation voucher (€10-20)
├─ Suggest competitor (goodwill)
├─ Track for capacity planning
└─ Learn: capacity vs demand gap
```
### Partner Network Integration
```javascript
PARTNER_OPERATOR = {
id: UUID,
company_id: UUID, // our company
partner_name: String,
partner_api_url: String,
partner_api_key: String,
relationship_type: Enum,
// "reciprocal" (we exchange) | "supplier" (we buy from them) |
// "customer" (they buy from us)
service_areas: Array, // ["Lisbon", "Porto"]
service_types: Array, // ["private", "shuttle"]
pricing_model: Enum,
// "wholesale" (fixed discount) | "commission" (% of sale) |
// "negotiated" (case by case)
pricing_params: {
discount_percentage: Decimal, // 20% off our price
commission_percentage: Decimal, // we keep 15%
minimum_margin: Decimal, // €10 minimum profit
},
availability_api: Boolean, // can we check their availability?
booking_api: Boolean, // can we book directly?
sla_terms: {
response_time_minutes: Integer, // 30
acceptance_rate_target: Decimal, // 80%
},
quality_metrics: {
average_rating: Decimal,
on_time_rate: Decimal,
cancellation_rate: Decimal,
},
status: Enum, // "active" | "paused" | "suspended"
created_at: DateTime,
last_used_at: DateTime,
}
```
### Automated Overflow Handling
```
AUTOMATION LOGIC
Transfer #789 cannot be allocated:
↓
1. Check operator config:
└─ auto_use_partners: true
2. Query partner availability:
├─ POST /partners/availability
├─ Params: { service_type, time, location }
└─ Response: [ partner_id, price, vehicle_class ]
3. Calculate margin:
├─ Customer pays: €50
├─ Partner charges: €40
├─ Our margin: €10 (20%) ✓
└─ Acceptable (min €5)
4. Auto-book with partner:
├─ POST /partners/book
├─ Transfer outsourced
├─ Status: "allocated_partner"
└─ Monitor quality
5. Notify customer:
├─ "Transfer confirmed"
├─ (Transparent: mention partner OR not)
└─ Same service quality promised
6. Track:
├─ Outsourced count
├─ Partner performance
└─ Capacity planning insights
```
### Capacity Planning
```
LEARN FROM OVERFLOW
Track patterns:
├─ Peak times (overflow most common)
├─ Peak days (weekends, holidays)
├─ Service types (private vs shuttle)
└─ Routes (airport transfers at 8am)
Monthly review:
├─ How many overflows?
├─ How many declines?
├─ Revenue lost?
├─ Solution: hire more drivers? buy more vehicles?
└─ ROI calculation
Example insight:
"Every Saturday 8-10am we overflow 5 transfers
→ Add 1 driver on Saturday mornings
→ Costs €200/month
→ Captures €800 extra revenue/month
→ ROI: 300% ✓"
```
---
# PARTE VI - IMPLEMENTAÇÃO E ROADMAP
## 💻 30. ROADMAP DE DESENVOLVIMENTO
### Fase 1: MVP (3-4 meses)
**Objetivo:** Sistema funcional com core features para 1 operator
```
CORE ENTITIES:
✓ Transfer (private only)
✓ Vehicle
✓ Driver
✓ Basic allocation (manual + suggestions)
FEATURES:
✓ Booking API (REST)
✓ Manual allocation interface
✓ Basic driver app (status updates)
✓ SMS notifications (Twilio)
✓ Email notifications
✓ Simple reporting
INFRASTRUCTURE:
✓ Node.js + PostgreSQL
✓ Docker deployment
✓ Basic CI/CD
OMITIR (para depois):
- Road-show (multi-leg)
- Shuttle (dynamic/static)
- Agency management (B2B)
- Advanced analytics
- Bryntum Scheduler
- Webhooks
- GDPR tooling
```
### Fase 2: B2B & Optimização (2-3 meses)
```
NEW ENTITIES:
✓ Agency (B2B clients)
✓ Passenger (B2C)
✓ Invoice & Payments
FEATURES:
✓ Agency portal (self-service)
✓ API webhooks
✓ Automatic allocation (scoring algorithm)
✓ Conflict detection
✓ Road-show support
✓ Quotation system
OPTIMIZATIONS:
✓ Dead mileage prevention
✓ Priority rules (VIP, SLA)
✓ Real-time updates (WebSockets)
```
### Fase 3: Advanced Features (2 meses)
```
FEATURES:
✓ Bryntum Scheduler integration
✓ Shuttle dynamic (TSP optimization)
✓ Customer portal (B2C)
✓ Mobile app (React Native)
✓ Advanced analytics
✓ SLA tracking
✓ Rating & review system
INTEGRATIONS:
✓ Flight tracking
✓ Google Maps / GraphHopper
✓ Stripe payments
✓ Xero accounting
```
### Fase 4: Enterprise & Scale (ongoing)
```
FEATURES:
✓ GDPR compliance tools
✓ Multi-tenant white-label
✓ Partner network API
✓ Overflow handling automation
✓ AI/ML predictions (demand forecasting)
✓ Mobile POS (driver payments)
SCALE:
✓ Kubernetes
✓ Multi-region deployment
✓ CDN for assets
✓ Advanced caching (Redis)
✓ Load balancing
```
---
## 📊 31. PRIORIZAÇÃO DE FEATURES
### MoSCoW Method
**MUST HAVE (MVP)**
- Transfer booking (API + portal)
- Driver & vehicle management
- Manual allocation
- Status updates
- Basic notifications (SMS + email)
- Simple invoicing
**SHOULD HAVE (Phase 2)**
- Automatic allocation
- Agency management (B2B)
- Webhooks
- Road-show support
- Quotation system
- Payment processing
**COULD HAVE (Phase 3)**
- Bryntum Scheduler
- Shuttle optimization
- Mobile app (native)
- Advanced analytics
- Rating system
- SLA tracking
**WON'T HAVE (for now)**
- AI/ML predictions
- Blockchain integration
- VR/AR features
- Social media integration
- Gamification
---
## 💻 32. STACK TECNOLÓGICO DETALHADO
### Backend
```
RUNTIME:
├─ Node.js v20+ (LTS)
└─ OR: Python 3.11+ (alternative)
FRAMEWORK:
├─ Express.js (minimal)
├─ NestJS (structured, enterprise)
└─ FastAPI (Python alternative)
DATABASE:
├─ PostgreSQL 15+ (primary)
│ └─ Extensions: PostGIS (geospatial)
├─ Redis (cache + queue)
└─ Elasticsearch (optional, for search)
ORM:
├─ Prisma (TypeScript)
├─ TypeORM (TypeScript)
└─ SQLAlchemy (Python)
AUTHENTICATION:
├─ JWT tokens
├─ OAuth 2.0 (SSO)
└─ bcrypt (password hashing)
FILE STORAGE:
├─ AWS S3
├─ Google Cloud Storage
└─ MinIO (self-hosted)
QUEUE:
├─ Bull (Redis-based)
├─ RabbitMQ
└─ AWS SQS
REAL-TIME:
├─ Socket.io
└─ Server-Sent Events (SSE)
```
### Frontend
```
WEB:
├─ React 18+
├─ TypeScript
├─ Vite (build tool)
├─ TailwindCSS (styling)
├─ React Query (data fetching)
├─ Zustand (state management)
└─ Bryntum Scheduler (planning)
MOBILE:
├─ React Native
├─ Expo (development)
└─ Native modules (maps, GPS)
ADMIN DASHBOARD:
├─ React Admin (rapid)
└─ Custom (more control)
```
### Infrastructure
```
HOSTING:
├─ AWS (preferred)
├─ Google Cloud Platform
├─ Azure
└─ DigitalOcean (cheaper)
CONTAINERS:
├─ Docker
└─ Docker Compose (dev)
ORCHESTRATION:
├─ Kubernetes (production)
└─ Docker Swarm (simpler)
CI/CD:
├─ GitHub Actions
├─ GitLab CI
└─ CircleCI
MONITORING:
├─ Sentry (errors)
├─ DataDog (APM)
├─ Grafana + Prometheus (metrics)
└─ LogRocket (session replay)
CDN:
├─ CloudFlare
└─ AWS CloudFront
```
### External Services
```
MAPPING:
├─ GraphHopper (free tier)
├─ OSRM (self-hosted)
└─ Google Maps (paid)
SMS:
├─ Twilio
└─ Vonage
EMAIL:
├─ SendGrid
└─ AWS SES
PAYMENTS:
├─ Stripe (primary)
└─ PayPal
FLIGHT DATA:
├─ AviationStack (free tier)
└─ FlightAware (paid)
```
---
## 🔄 33. DATABASE SCHEMA OVERVIEW
### Core Tables
```sql
-- TENANCY
companies (id, name, settings, ...)
-- USERS & AUTH
users (id, company_id, email, role, ...)
sessions (id, user_id, token, ...)
-- CORE ENTITIES
transfers (id, company_id, service_type, status, ...)
vehicles (id, company_id, license_plate, ...)
drivers (id, company_id, assigned_vehicle_id, ...)
-- B2B/B2C
agencies (id, company_id, name, pricing_model, ...)
passengers (id, company_id, email, ...)
-- FINANCIAL
invoices (id, company_id, agency_id, total, ...)
payments (id, invoice_id, amount, method, ...)
-- OPERATIONS
allocations (id, transfer_id, driver_id, vehicle_id, ...)
no_show_policies (id, agency_id, wait_time, ...)
-- RATINGS & REVIEWS
ratings (id, transfer_id, driver_rating, passenger_rating, ...)
-- QUOTATIONS
quotes (id, company_id, status, pricing, ...)
-- NOTIFICATIONS
notification_templates (id, company_id, type, body, ...)
notification_logs (id, recipient, sent_at, status, ...)
-- AUDIT
audit_logs (id, user_id, action, entity_type, entity_id, ...)
```
### Indexing Strategy
```sql
-- Performance-critical indexes
CREATE INDEX idx_transfers_company_status
ON transfers(company_id, status);
CREATE INDEX idx_transfers_pickup_time
ON transfers(scheduled_pickup_time);
CREATE INDEX idx_drivers_company_status
ON drivers(company_id, current_status);
CREATE INDEX idx_allocations_transfer
ON allocations(transfer_id);
CREATE INDEX idx_allocations_driver_vehicle
ON allocations(driver_id, vehicle_id);
-- Geospatial indexes (PostGIS)
CREATE INDEX idx_transfers_origin_location
ON transfers USING GIST(origin_location);
```
---
## 📊 34. API ENDPOINTS SUMMARY
### Public API (for Agencies)
```
POST /api/v1/bookings # Create booking
GET /api/v1/bookings/:id # Get booking
PUT /api/v1/bookings/:id # Update booking
DELETE /api/v1/bookings/:id # Cancel booking
POST /api/v1/quotes # Request quote
GET /api/v1/quotes/:id # Get quote
POST /api/v1/quotes/:id/accept # Accept quote
GET /api/v1/drivers/:id # Get driver info (allocated)
GET /api/v1/tracking/:id # Real-time tracking
POST /api/v1/webhooks/register # Register webhook URL
GET /api/v1/webhooks # List webhooks
DELETE /api/v1/webhooks/:id # Unregister webhook
```
### Internal API (for Dashboard)
```
# TRANSFERS
GET /api/internal/transfers # List all transfers
POST /api/internal/transfers # Create transfer
GET /api/internal/transfers/:id # Get transfer
PUT /api/internal/transfers/:id # Update transfer
DELETE /api/internal/transfers/:id # Delete transfer
# ALLOCATION
POST /api/internal/allocations # Manual allocation
GET /api/internal/allocations/suggestions # Get suggestions
PUT /api/internal/allocations/:id # Update allocation
# DRIVERS
GET /api/internal/drivers # List drivers
POST /api/internal/drivers # Add driver
PUT /api/internal/drivers/:id # Update driver
DELETE /api/internal/drivers/:id # Remove driver
# VEHICLES
GET /api/internal/vehicles # List vehicles
POST /api/internal/vehicles # Add vehicle
PUT /api/internal/vehicles/:id # Update vehicle
DELETE /api/internal/vehicles/:id # Remove vehicle
# AGENCIES
GET /api/internal/agencies # List agencies
POST /api/internal/agencies # Add agency
PUT /api/internal/agencies/:id # Update agency
# REPORTING
GET /api/internal/reports/daily # Daily summary
GET /api/internal/reports/financial # Financial report
GET /api/internal/reports/export # Export data
```
### Driver API (Mobile App)
```
GET /api/driver/schedule # Today's transfers
GET /api/driver/transfers/:id # Transfer details
PUT /api/driver/transfers/:id/status # Update status
POST /api/driver/issues # Report issue
GET /api/driver/earnings # Earnings summary
POST /api/driver/sos # Emergency SOS
```
---
# PARTE VII - GLOSSÁRIO E REFERÊNCIAS
## 📖 GLOSSÁRIO
### Termos de Negócio
**Allocation** - Processo de atribuir motorista e veículo a um transfer
**Agency** - Cliente B2B que faz reservas em nome de passageiros
**Dead mileage** - Quilómetros vazios (sem passageiro) entre transfers
**Dispatcher** - Pessoa que gere alocação de transfers na operação
**No-show** - Passageiro não aparece no pickup
**Operator** - Empresa que opera o serviço de transfers (nosso cliente)
**Road-show** - Transfer com múltiplas paragens para o mesmo grupo
**SLA** - Service Level Agreement (acordo de qualidade de serviço)
**Transfer** - Transporte de passageiro de A para B
### Termos Técnicos
**CRUD** - Create, Read, Update, Delete
**FK** - Foreign Key (chave estrangeira)
**GDPR** - General Data Protection Regulation
**JWT** - JSON Web Token (autenticação)
**Multi-tenant** - Múltiplos clientes isolados na mesma instância
**RBAC** - Role-Based Access Control
**REST** - Representational State Transfer (API style)
**TSP** - Traveling Salesman Problem (otimização de rota)
**UUID** - Universally Unique Identifier
**Webhook** - Callback HTTP automático
### Service Types
**Private** - 1 grupo, rota direta A→B
**Road-show** - 1 grupo, múltiplas paragens A→B→C→D
**Shuttle Dynamic** - Múltiplos grupos, rota otimizada
**Shuttle Static** - Rota fixa, horários fixos
### Vehicle Categories
**sedan4** - Sedan até 4 passageiros
**van7** - Van até 7 passageiros
**minibus10** - Minibus até 10 passageiros
**bus16** - Bus até 16 passageiros
**wheelchair_van** - Van acessível para cadeira de rodas
---
## 📊 MÉTRICAS-CHAVE (KPIs)
### Operacionais
- **On-time rate:** % de transfers no horário (target: >95%)
- **Allocation rate:** % de transfers alocados T-24h (target: >98%)
- **Vehicle utilization:** % tempo em serviço (target: >80%)
- **Driver utilization:** % tempo em serviço (target: >75%)
- **Dead mileage ratio:** km vazios / km totais (target: <15%)
### Financeiros
- **Revenue per transfer:** Receita média por transfer
- **Revenue per driver:** Receita gerada por motorista
- **Cost per transfer:** Custo médio por transfer
- **Profit margin:** % lucro (target: >30%)
- **Outstanding invoices:** Valor em dívida (target: <5% revenue)
### Qualidade
- **Customer satisfaction:** Rating médio (target: >4.5/5)
- **Driver rating:** Rating médio motoristas (target: >4.5/5)
- **Cancellation rate:** % cancelamentos (target: <5%)
- **No-show rate:** % no-shows (target: <2%)
- **Complaint rate:** % reclamações (target: <1%)
### Crescimento
- **Bookings growth:** % crescimento mês-a-mês
- **Revenue growth:** % crescimento receita
- **Customer retention:** % clientes que voltam
- **Quote-to-booking rate:** % quotes convertidas (target: >60%)
---
## 🔗 LINKS ÚTEIS
### Documentação Externa
- **GraphHopper API:** https://docs.graphhopper.com/
- **Twilio SMS:** https://www.twilio.com/docs/sms
- **Stripe Payments:** https://stripe.com/docs/api
- **PostgreSQL:** https://www.postgresql.org/docs/
- **React:** https://react.dev/
- **Bryntum Scheduler:** https://bryntum.com/products/scheduler/
### Standards & Compliance
- **GDPR:** https://gdpr.eu/
- **ISO 27001:** (Security)
- **PCI DSS:** (Payment Card Industry)
---
## ✅ CHECKLIST PRÉ-LANÇAMENTO
### Técnico
- [ ] Database backups automáticos
- [ ] SSL/TLS certificados válidos
- [ ] Environment variables configuradas
- [ ] Logs centralizados (Sentry, etc)
- [ ] Monitoring & alerts ativos
- [ ] Load testing completado
- [ ] Security audit completado
- [ ] API rate limiting ativo
- [ ] GDPR compliance verificado
### Operacional
- [ ] Staff treinado (operations, support)
- [ ] Driver app testado em campo
- [ ] Templates de notificações finalizados
- [ ] Políticas documentadas (no-show, cancellation)
- [ ] Escalation procedures definidos
- [ ] Emergency protocols testados
- [ ] SLA definidos com clientes
### Legal
- [ ] Terms of Service aprovados
- [ ] Privacy Policy aprovada
- [ ] Licenças de transporte obtidas
- [ ] Seguros válidos
- [ ] Contratos B2B templates prontos
---
## 📈 PRÓXIMOS PASSOS
### Para Começar Desenvolvimento
1. **Setup environment:**
- Docker + PostgreSQL + Redis
- Node.js projeto base
- Git repository
2. **Primeiro sprint (MVP):**
- Database schema (Prisma)
- Transfer CRUD API
- Vehicle & Driver management
- Basic allocation logic
3. **Segundo sprint:**
- Driver mobile app (React Native)
- SMS notifications (Twilio)
- Manual allocation interface
### Para Começar Negócio
1. **Validar mercado:**
- Falar com 10 operadores de transfer
- Validar pain points
- Refinar pricing
2. **Pilot program:**
- 1 operador piloto (3 meses grátis)
- Iterar baseado em feedback
- Case study para vendas
3. **Go-to-market:**
- Website marketing
- SEO para "transfer management software"
- Presença em feiras do setor
---
# 🎉 CONCLUSÃO
## O Que Foi Documentado
✅ **31 Secções Completas**
✅ **6.275+ Linhas de Especificações**
✅ **Zero Gaps Funcionais**
✅ **Ready to Implement**
## Próxima Decisão Crítica
**Escolher entre:**
1. **Build** - Desenvolver in-house (3-6 meses)
2. **Buy** - Comprar solução existente + customizar
3. **Hybrid** - Core próprio + integrações third-party
**Recomendação:** Build MVP próprio (controlo total + diferenciação)
---
**Este documento é a base completa para:**
- Desenvolvimento técnico
- Pitch a investidores
- Onboarding de equipa
- Documentação oficial
- RFP responses
**Sucesso! 🚀**
---
**Documento Master Consolidado**
**Versão:** 2.0
**Última Atualização:** Novembro 2025
**Total Páginas:** ~200 (estimado em impressão)
**Preparado para:** Desenvolvimento + Gestão