Estados no front da Nero¶
Para: Dev — Conferido em 2026-10-18.
O front da Nero (nero_client) não conhece o Dracma. Ele vê um conjunto fechado de estados, fixado no contrato do portal, que o nero_payments calcula a partir de duas fontes: o estado local do outbox e o último estado do Dracma aplicado (lido por fetch-back).
O que é¶
Esta página é a tabela de tradução entre os estados do Dracma e os do front. A regra geral é que o estado mostrado ao jogador nunca adianta dinheiro: paid só aparece depois que o crédito (depósito) ou a finalização (saque) foi gravado no nero_ledger. A versão genérica desta tabela, para qualquer produto, está em Estados no seu produto.
Rotas do portal¶
| Método e rota (portal) | Autenticação | Pedido e resposta |
|---|---|---|
POST /api/payments/deposits |
Jogador | {amount: number (reais, ex. 50.00), method: "pix", accept_bonus: bool, cpf?: string} devolve 201 ou 202 com {deposit_id, status, amount, currency, method, pix?: {copy_paste, qr_code_png_base64?, expires_at}, expires_at} |
GET /api/payments/deposits/{deposit_id} |
Jogador, só o dono (outro recebe 404) |
Mesmo formato; o front faz polling até paid ou expired |
POST /api/wallet/withdraw/request |
Jogador | Corpo legado {amount, type: "pix", pix_key, pix_type, accept_terms, currency?} devolve 200 {status: true, withdrawal_id, state: "processing" ou "under_review", message}; os erros de negócio mantêm as mensagens atuais |
GET /api/payments/withdrawals/{withdrawal_id} |
Jogador, só o dono | {withdrawal_id, state, amount, currency, created_at, updated_at} |
POST /api/payments/dracma/webhook |
Nenhuma no portal; assinatura no conector | 200, 401, 400 ou 503 (Webhook, eventos e reconciliação) |
deposit_id e withdrawal_id são o external_id enviado ao Dracma (dep_<uuidv7>, wdr_<uuidv7>), opacos para o front. O id do Dracma fica só no nero_payments.
Rotas legadas removidas (respondem 404 depois do corte): /api/wallet/deposit/payment, /api/payments/{deposits,callbacks,status}/{gateway}, /api/{gateway}/qrcode-pix, /api/{gateway}/consult-status-transaction e os callbacks dos gateways antigos.
Quando usar¶
Ao implementar a tradução de estado no nero_payments e a tela de depósito e saque. Confira cada linha com o time de produto antes de fixar as mensagens.
Como funciona¶
Depósito: Dracma para o front¶
Estados do front: creating, pending, paid, expired, cancelled, failed, under_review.
Situação no nero_payments |
Estado do Dracma (fetch-back) | Front vê | Dinheiro na carteira | Mensagem sugerida |
|---|---|---|---|---|
Intent gravado, sem resposta conclusiva (timeout, 5xx, 429) |
Nenhum | creating |
Nada | "Gerando seu PIX..." |
202 do Dracma |
created |
creating |
Nada | "Gerando seu PIX..." |
| Nenhuma | pending |
pending (com pix) |
Nada | "Pague o PIX até {expires_at}" |
| Nenhuma | under_review |
under_review |
Nada | "Pagamento recebido, em análise." |
| Crédito gravado no ledger | paid |
paid |
Creditado uma vez | "Depósito confirmado." |
| Nenhuma | expired |
expired |
Nada | "O PIX expirou. Gere outro." |
| Nenhuma | cancelled |
cancelled |
Nada | "Depósito cancelado." |
| Nenhuma | failed |
failed |
Nada | "Não foi possível gerar o PIX. Tente de novo." |
| Nenhuma | returned |
failed |
Nada | "O pagamento não pôde ser aceito. Fale com o suporte." |
paid já creditado, depois estorno ou chargeback |
refunded ou chargeback |
paid (continua) |
Não mexe: needs_decision (D6) |
Tratado pelo backoffice |
| Nenhuma | pending_compliance ou frozen |
under_review |
Nada | "Pagamento em análise." |
| Nenhuma | paid_partial |
under_review |
Nada: needs_decision |
"Pagamento em análise." |
| Nenhuma | Estado desconhecido | Mantém o último estado mostrado (ou under_review se era pending) |
Nada | "Pagamento em análise." |
4xx na criação (sem objeto no Dracma) |
Nenhum | Erro HTTP ao front (sem deposit_id utilizável) |
Nada | Tabela de erros em Depósito |
| Produção sem Dracma configurado (D5) | Nenhum | Erro 503 payment_provider_not_configured |
Nada | "Depósito indisponível no momento." |
returnednão existe na lista de estados do front: a Nero mostrafailedcom a mensagem de devolução.refundedechargebackacontecem depois de o jogador ter vistopaid. A tela não volta atrás; o caso vai para a filaneeds_decision(Revisão e decisões).- Nunca explique
under_reviewcom o motivo (PAYER_MISMATCH,AMOUNT_MISMATCH) ao jogador; o suporte vê. - Com o Mercado Pago,
under_reviewporPAYER_UNKNOWNfica mais comum, porque o PSP não informa o pagador (PSPs).
Reservado no contrato
pending_compliance, frozen e paid_partial fazem parte do contrato, mas a operação PIX não os produz hoje. O conector da Nero os trata como under_review por segurança.
Saque: Dracma para o front¶
Estados do front: processing, under_review, paid, rejected, failed, cancelled.
Situação no nero_payments |
Estado do Dracma (fetch-back) | Front vê | Reserva no ledger | Mensagem sugerida |
|---|---|---|---|---|
| Intent e reserva gravados, sem resposta conclusiva | Nenhum | processing |
Mantida | "Saque em processamento." |
| Nenhuma | requested (consulta de titularidade pendente) |
processing |
Mantida | "Saque em processamento." |
| Nenhuma | approved ou processing |
processing |
Mantida | "Saque em processamento." |
| Nenhuma | under_review |
under_review |
Mantida | "Saque em análise." |
| Finalização gravada | paid |
paid |
Finalizada (saída definitiva) | "Saque enviado." |
| Nenhuma | rejected |
rejected |
Devolvida | "Saque não aprovado. O valor voltou para sua carteira." |
| Nenhuma | failed |
failed |
Devolvida | "Não foi possível enviar o PIX. O valor voltou para sua carteira." |
| Nenhuma | cancelled |
cancelled |
Devolvida | "Saque cancelado. O valor voltou para sua carteira." |
paid já finalizado, o banco devolveu |
returned |
under_review |
Não mexe: needs_decision (D7) |
"Saque em análise." |
| Nenhuma | pending_compliance, sent, in_transit ou recall_requested |
processing |
Mantida | "Saque em processamento." (nunca dizer "compliance", D24) |
| Nenhuma | recalled |
under_review |
Não mexe: needs_decision (D18) |
"Saque em análise." |
| Nenhuma | Estado desconhecido | processing |
Mantida | "Saque em processamento." |
4xx na criação (422, 400) |
Nenhum | 200 {status: false, message} (mensagem legada) |
Devolvida | Saque |
409 idempotency_key_reused no envio |
Nenhum | processing |
Mantida: needs_decision (D12) |
"Saque em processamento." |
Resposta do POST /api/wallet/withdraw/request: state: "under_review" quando o 201 do Dracma veio com under_review; state: "processing" em todos os outros casos aceitos, inclusive quando o Dracma não respondeu de forma conclusiva (o pedido está no outbox e a reserva está feita).
O returned do saque aparece como under_review no front e abre needs_decision: a Nero não recredita sozinha (D7). O dinheiro volta ao caixa da operação no Dracma, e o backoffice decide se recredita a carteira.
Como calcular o estado sem corrida¶
estado_front(intent):
se intent.dracma_version é nulo: # o Dracma ainda não respondeu de forma conclusiva
devolve "creating" (depósito) ou "processing" (saque)
s = intent.dracma_status # último estado APLICADO (fetch-back, versão maior)
devolve TABELA[s] ou PADRAO_DESCONHECIDO
- Aplique um estado novo só se a
versionfor maior queintent.dracma_version(webhooks chegam fora de ordem). - O efeito de dinheiro e a atualização de
dracma_statusvão na mesma transação do ledger. Assim o front nunca vêpaidantes do crédito. - O polling do front não chama o Dracma a cada pedido. Se o intent está parado em
creatingoupendinghá mais de 60 segundos, onero_paymentspode fazer um fetch-back por id (no máximo a cada 10 segundos por objeto), além do webhook e do job deGET /events.
Exemplos¶
A tabela acima é o exemplo. Para o caminho completo com comandos, veja Primeiros passos no sandbox.
Erros e casos de borda¶
- Estado do Dracma que a tabela não conhece: nunca mova dinheiro. Mantenha o último estado e registre.
- Versão do evento menor ou igual à aplicada: ignore (já foi superada).
- Divergência entre o estado local e o fetch-back: vale o fetch-back; registre a diferença.