- CompanyCreditPurchase registra a compra de crédito feita pela Company para uma Cooperative.
- CompanyCreditAccount guarda o saldo corporativo disponível para distribuição.
- CreditGrant guarda o estado consolidado do crédito concedido ao Customer.
- CreditLedgerEntry guarda cada movimento de forma append-only.
Compra de saldo corporativo
A compra de saldo é feita pela Company para uma Cooperative escolhida. Ela usa a configuração ativa de billing dessa Cooperative e não cria Ticket.Concessão e uso do crédito
Movimentos
Regras
payment.status = PAIDcomCompanyCreditPurchase.creditedAt = nullé a única origem de aumento de saldo comprado da Company.- CompanyCreditAccount é posição consolidada; histórico de compra fica em CompanyCreditPurchase.
- CreditGrant só pode ser criado quando CompanyCreditAccount possui
availableAmountsuficiente. customerIdé obrigatório.- O crédito pode ser usado em tickets de qualquer cooperativa.
- O uso definitivo do crédito é sempre por
ticketId. CAPTUREeREFUNDdevem preencherticketId.cooperativeIdetransportOperatorIdentram no ledger como contexto do Ticket usado.- O valor nunca pode ficar negativo.
availableAmount + reservedAmount + usedAmountnão pode ultrapassaramount.- Retry de movimentos críticos deve usar idempotência.
- Ledger não é editado nem removido.
- Estorno retorna para o mesmo CreditGrant, Customer e Company que concedeu o crédito.
Compra e distribuição pela Company
- Company lista e escolhe uma Cooperative disponível.
- OPS resolve a configuração ativa de billing da Cooperative.
- OPS cria a cobrança no gateway e persiste Payment + CompanyCreditPurchase.
- O frontend acompanha
payment.statuspelo detalhe da compra. - Quando o Payment fica
PAID, o valor entra em CompanyCreditAccount ecreditedAté preenchido. - Company seleciona um usuário elegível.
- O sistema resolve ou cria automaticamente o Customer desse usuário.
- Company cria CreditGrant para o Customer.
- CompanyCreditAccount reduz
availableAmounte aumentaallocatedAmount. - O Customer usa o crédito em tickets.
O crédito distribuído pertence ao Customer. Employee serve para validar o vínculo com a Company e para relatórios corporativos, mas não é persistido em CreditGrant.
Compra com crédito
- Customer inicia checkout.
- System encontra créditos ativos do Customer.
- Customer informa quanto de crédito quer usar.
- System reserva o valor no checkout.
- Ao confirmar a compra, System distribui a captura nos tickets elegíveis.
- Cada captura gera CreditLedgerEntry com
ticketId. - Se o checkout falha, System libera a reserva.
- Se um ticket é cancelado depois, System registra estorno para aquele ticket.
Checkout QR com crédito
No Checkout QR, o canal de venda pode selecionarpaymentMethod = CREDIT_GRANT, mas a autorização do crédito pertence ao Customer no app do cliente.
- Canal de venda cria CheckoutSession para uma Trip.
- Customer autenticado escaneia o QR Code.
- Customer app valida créditos ativos do Customer.
- Customer autoriza o valor de crédito a usar.
- System reserva o crédito para o checkout.
- Ao confirmar a sessão, Sales cria Checkout, Order e Ticket.
- Credit Grant captura o valor por Ticket em CreditLedgerEntry.
- Se a sessão expira, cancela ou falha antes da confirmação, a reserva é liberada.
CREDIT_GRANT é forma de checkout da sessão, não método de Payment. O consumo definitivo continua no ledger append-only.Relatórios e comprovantes
Departamento (
Employee.department) pode ser usado como agrupamento de relatório quando a Company opera departamento como centro de custo. Centro de custo formal e independente ainda exigiria modelagem própria.
Veja a modelagem em CreditGrant.