> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devmob.app.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Ticket

> Passagens emitidas vinculando pedido, viagem, itinerário, assento e passageiro

## Campos

| Campo                | Tipo           | Descrição                                                                          |
| -------------------- | -------------- | ---------------------------------------------------------------------------------- |
| `ticketId`           | `UUID`         | Identificador único                                                                |
| `orderId`            | `UUID`         | Referência ao pedido                                                               |
| `tripId`             | `UUID`         | Referência à viagem                                                                |
| `tripItineraryId`    | `UUID`         | Referência ao itinerário                                                           |
| `seatId`             | `UUID`         | Referência ao assento                                                              |
| `seatTypeId`         | `UUID`         | Referência ao tipo de assento                                                      |
| `passengerId`        | `UUID`         | Referência ao [Passenger](/data-modelling/sales/passenger)                         |
| `seatPrice`          | `Int`          | Preço do tipo de assento no momento da emissão (centavos)                          |
| `tripItineraryPrice` | `Int`          | Preço do itinerário no momento da emissão (centavos)                               |
| `price`              | `Int`          | Preço final pago pela passagem (centavos)                                          |
| `qrCode`             | `String`       | Payload codificado para validação de embarque                                      |
| `code`               | `String`       | Código legível da passagem                                                         |
| `snapshot`           | `Json?`        | Snapshot denormalizado (trip, itinerário, assento, tipo, passageiro) para exibição |
| `boardedAt`          | `DateTime?`    | Data/hora do embarque (null se ainda não embarcou)                                 |
| `issuedAt`           | `DateTime`     | Data de emissão da passagem                                                        |
| `status`             | `TicketStatus` | Status da passagem (default `VALID`)                                               |
| `createdBy`          | `UUID?`        | Usuário que criou o registro, quando aplicável                                     |
| `createdAt`          | `DateTime`     | Data de criação                                                                    |
| `updatedBy`          | `UUID?`        | Usuário que fez a última atualização, quando aplicável                             |
| `updatedAt`          | `DateTime`     | Data da última atualização                                                         |

## Relacionamentos

* Relaciona-se com [Order](/data-modelling/sales/order)
* Relaciona-se com [Trip](/data-modelling/operations/trip)
* Relaciona-se com [TripItinerary](/data-modelling/operations/trip-itinerary)
* Relaciona-se com [Seat](/data-modelling/fleet/seat)
* Relaciona-se com [SeatType](/data-modelling/fleet/seat-type)
* Relaciona-se com [Passenger](/data-modelling/sales/passenger)
* Relaciona-se com múltiplos [TicketActivity](/data-modelling/sales/ticket-activity)
* Relaciona-se com múltiplos [TripSeatSegment](/data-modelling/operations/trip-seat-segment)
* Relaciona-se com múltiplos [PromotionalUsageHistory](/data-modelling/promotion/promotional-usage-history), quando a promoção é aplicada no nível da passagem
* Relaciona-se com múltiplos [CreditLedgerEntry](/data-modelling/credit-grant/credit-ledger-entry), quando crédito é capturado ou estornado no nível da passagem

## 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](/data-modelling/sales/ticket-activity).

## Snapshot

### TicketSnapshot

| Campo       | Tipo                                          | Descriçã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

| Campo         | Tipo        | Descrição            |
| ------------- | ----------- | -------------------- |
| `name`        | `String`    | Nome do ponto        |
| `stopOrder`   | `Int`       | Ordem da parada      |
| `arrivalAt`   | `DateTime?` | Data/hora de chegada |
| `departureAt` | `DateTime?` | Data/hora de partida |

## Enums

### TicketStatus

| Valor       | Descrição          |
| ----------- | ------------------ |
| `VALID`     | Passagem válida    |
| `CANCELLED` | Passagem cancelada |

## Example

```json theme={null}
{
  "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"
}
```
