O TripEvent registra ocorrências operacionais durante o ciclo de vida de uma viagem. Eventos podem ser globais (afetam toda a viagem) ou escopados a uma parada (TripStop) específica.
Campos
| Campo | Tipo | Descrição |
|---|
tripEventId | UUID | Identificador único |
tripId | UUID | Viagem à qual o evento pertence |
tripStopId | UUID (nullable) | Parada específica (null = evento global) |
type | TripEventType | Tipo do evento |
description | string (nullable) | Descrição adicional do evento |
metadata | JSON (nullable) | Dados adicionais estruturados |
createdBy | UUID? | Usuário que criou o registro, quando aplicável |
createdAt | datetime | Data/hora do registro |
updatedBy | UUID? | Usuário que fez a última atualização, quando aplicável |
updatedAt | datetime | Data de última atualização |
Tipos de Evento
TripEventType
| Tipo | Escopo | Descrição |
|---|
DRIVER_CHANGED | Global | Motorista foi substituído durante a viagem |
VEHICLE_CHANGED | Global | Veículo foi substituído |
DEPARTURE_DELAYED | Global ou Parada | Partida atrasada |
ARRIVAL_DELAYED | Global ou Parada | Chegada atrasada |
BOARDING_STARTED | Parada | Embarque iniciado em um ponto de parada |
BOARDING_COMPLETED | Parada | Embarque concluído em um ponto de parada |
INCIDENT | Global ou Parada | Incidente operacional (acidente, problema mecânico, etc.) |
Eventos Globais vs Escopados
Evento Global (tripStopId = null)
Afeta a viagem inteira. Exemplos:
- Troca de motorista — impacta todos os passageiros.
- Troca de veículo — impacta todos os passageiros.
- Atraso na partida da viagem — afeta todas as paradas.
Evento Escopado a Parada
Afeta apenas passageiros que embarcam ou desembarcam em uma parada específica. Exemplos:
- Embarque iniciado na parada de Volta Redonda — relevante apenas para passageiros que embarcam ou desembarcam ali.
- Atraso de chegada em Juiz de Fora — impacta apenas itinerários que passam por esse ponto.
O campo metadata armazena dados estruturados específicos do tipo de evento (união discriminada por type):
| Tipo | Campos de metadata |
|---|
DRIVER_CHANGED | previousDriverId, previousDriverName, previousDriverLicenseNumber, newDriverId, newDriverName, newDriverLicenseNumber |
VEHICLE_CHANGED | previousVehicleId, previousVehicleLicensePlate, previousVehicleModel, newVehicleId, newVehicleLicensePlate, newVehicleModel |
DEPARTURE_DELAYED / ARRIVAL_DELAYED | delayMinutes, newEstimatedTime?, reason? |
BOARDING_STARTED | expectedPassengers?, stopName? (metadata opcional) |
BOARDING_COMPLETED | totalPassengers, noShowCount?, stopName? |
INCIDENT | severity (LOW/MEDIUM/HIGH/CRITICAL), category (MECHANICAL/ACCIDENT/WEATHER/PASSENGER/ROAD_BLOCK/OTHER), affectedPassengers?, requiresReplacement? |
Efeitos do registro
Registrar uma ocorrência cria um TripEvent vinculado à viagem. Quando o tipo é BOARDING_COMPLETED, o registro representa a conclusão de embarque daquela viagem/parada.
Registrar um evento não altera o status da viagem. Em particular, BOARDING_COMPLETED não move a viagem para IN_PROGRESS.
TripEvents não recebem edição de conteúdo no fluxo de negócio. Eles formam um histórico operacional da viagem.