Skip to main content
Checkout QR é o fluxo em que um canal autenticado inicia uma venda, mostra um QR Code para o passageiro e o Customer autenticado vincula a sessão pelo app do cliente. A venda pode ser confirmada em dinheiro ou com crédito corporativo autorizado pelo próprio Customer.

Fluxo

Estados da sessão

Os estados abaixo são calculados a partir de linkedAt, preparedAt, confirmedAt, canceledAt e expiresAt; não há campo status persistido na sessão.

Responsabilidades

EtapaResponsávelRegra
Criar sessãoApp de vendaUsuário autenticado informa Trip e paymentMethod.
Vincular sessãoCustomer appCustomer autenticado escaneia QR; identidade vem do token autenticado.
Preparar ticketCustomer app/SalesPassageiro, itinerary, assento, promoção e crédito seguem as regras normais de checkout.
Confirmar dinheiroApp de vendaUsuário autenticado confirma que recebeu dinheiro.
Autorizar créditoCustomer app/Credit GrantCustomer autoriza uso de CreditGrant no próprio app.
Emitir ticketSalesCheckout, Order, Ticket e TripSeatSegments são criados na confirmação.

Dinheiro vs crédito

AspectoCASHCREDIT_GRANT
Autorização do CustomerScan do QR vincula a sessãoScan do QR vincula a sessão e Customer autoriza o crédito
ConfirmaçãoCanal de venda aceita o dinheiroCredit Grant reserva e captura crédito
PaymentCria Payment com method = CASH, channel do canal de venda e status = PAIDSó cria Payment se ainda houver paidAmount externo; crédito puro fica no ledger
Pós-vendaPrestação de contas do canal via CashSettlementUso fica rastreado em CreditLedgerEntry por Ticket

Validações

  • O QR Code deve pertencer a uma sessão ativa, não expirada e não confirmada.
  • O Customer deve estar autenticado no app do cliente.
  • A sessão só pode ser vinculada por um Customer autenticado uma vez; tentativa de trocar o vínculo deve cancelar a sessão e criar outra.
  • O usuário autenticado deve estar autorizado para a Trip selecionada.
  • A Trip precisa estar elegível para venda embarcada, conforme política operacional da cooperativa.
  • O ticket continua exigindo itinerary, passageiro, assento disponível e regras de benefício/promoção compatíveis.
  • Vendas com paymentMethod = CREDIT_GRANT devem validar saldo ativo do Customer e criar movimentos de reserva/captura no Credit Grant.
  • Vendas com paymentMethod = CASH não dependem de gateway e não aguardam webhook para emissão.

Dados que não devem ser persistidos

  • Saldo disponível do Customer na sessão; calcular a partir de CreditGrant.
  • Valor esperado da prestação de contas; calcular a partir dos Payments em dinheiro.
  • Diferença de caixa; calcular a partir do esperado, declarado e recebido.
  • CREDIT_GRANT em PaymentMethod; crédito corporativo permanece no domínio Credit Grant.
Veja a modelagem em CheckoutSession.