Skip to main content

Campos

CampoTipoDescrição
ticketIdUUIDIdentificador único
orderIdUUIDReferência ao pedido
tripIdUUIDReferência à viagem
tripItineraryIdUUIDReferência ao itinerário
seatIdUUIDReferência ao assento
seatTypeIdUUIDReferência ao tipo de assento
passengerIdUUIDReferência ao Passenger
seatPriceIntPreço do tipo de assento no momento da emissão (centavos)
tripItineraryPriceIntPreço do itinerário no momento da emissão (centavos)
priceIntPreço final pago pela passagem (centavos)
qrCodeStringPayload codificado para validação de embarque
codeStringCódigo legível da passagem
snapshotJson?Snapshot denormalizado (trip, itinerário, assento, tipo, passageiro) para exibição
boardedAtDateTime?Data/hora do embarque (null se ainda não embarcou)
issuedAtDateTimeData de emissão da passagem
statusTicketStatusStatus da passagem (default VALID)
createdByUUID?Usuário que criou o registro, quando aplicável
createdAtDateTimeData de criação
updatedByUUID?Usuário que fez a última atualização, quando aplicável
updatedAtDateTimeData da última atualização

Relacionamentos

Regras de Negócio

  • Os preços são congelados no momento da compra (snapshot): price = seatPrice + tripItineraryPrice.
  • Todos os valores monetários são armazenados em centavos.
  • O code é único e identifica a passagem de forma legível; qrCode é o payload usado na validação de embarque.
  • O boardedAt é preenchido quando o motorista registra o embarque. Embarque é bloqueado se a passagem estiver cancelada ou já embarcada.
  • Tentativas de validação, reimpressões e eventos operacionais do ticket ficam em TicketActivity.

Snapshot

TicketSnapshot

CampoTipoDescrição
trip{ departureAt, estimatedArrivalAt }Horários da viagem no momento da emissão
itinerary{ fromStop, toStop }Paradas de origem e destino do trecho
seat{ label, floor, row, column, side }Assento escolhido
seatType{ name, color }Categoria do assento
passenger{ name, document, documentType, birthDate }Snapshot do passageiro da passagem

TicketSnapshotStop

CampoTipoDescrição
nameStringNome do ponto
stopOrderIntOrdem da parada
arrivalAtDateTime?Data/hora de chegada
departureAtDateTime?Data/hora de partida

Enums

TicketStatus

ValorDescrição
VALIDPassagem válida
CANCELLEDPassagem cancelada

Example

{
  "ticketId": "0197a813-a9a6-7752-8173-d40a2a2d0ef0",
  "orderId": "0197a813-0fb9-7d42-9c81-50c0f6d9ae5a",
  "tripId": "0197a80f-2d8f-7710-b243-b67fb477a1c0",
  "tripItineraryId": "0197a810-87ce-7b60-9d80-660d0ee1c413",
  "seatId": "0197a80a-bc30-70c3-954f-657c74277162",
  "seatTypeId": "0197a80a-56f4-71cb-93a6-6e69d1506ef7",
  "passengerId": "0197a814-2460-74c2-a8d7-819a6a0d6f54",
  "seatPrice": 2500,
  "tripItineraryPrice": 8900,
  "price": 11400,
  "qrCode": "ticket:0197a813-a9a6-7752-8173-d40a2a2d0ef0:OAB-TCK-0001",
  "code": "OAB-TCK-0001",
  "snapshot": {
    "trip": {
      "departureAt": "2026-07-04T08:00:00.000Z",
      "estimatedArrivalAt": "2026-07-04T12:30:00.000Z"
    },
    "itinerary": {
      "fromStop": {
        "name": "Terminal Rodoviário Tietê",
        "stopOrder": 0,
        "arrivalAt": null,
        "departureAt": "2026-07-04T08:00:00.000Z"
      },
      "toStop": {
        "name": "Ribeirão Preto",
        "stopOrder": 2,
        "arrivalAt": "2026-07-04T12:30:00.000Z",
        "departureAt": null
      }
    },
    "seat": {
      "label": "01A",
      "floor": "FIRST",
      "row": 1,
      "column": "A",
      "side": "LEFT"
    },
    "seatType": {
      "name": "Executivo",
      "color": "#2563EB"
    },
    "passenger": {
      "name": "Mariana Costa",
      "document": "12345678909",
      "documentType": "CPF",
      "birthDate": "1992-04-18"
    }
  },
  "boardedAt": null,
  "issuedAt": "2026-07-03T16:02:00.000Z",
  "status": "VALID",
  "createdBy": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "createdAt": "2026-07-03T16:02:00.000Z",
  "updatedBy": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "updatedAt": "2026-07-03T16:02:00.000Z"
}