Gerenciar Saques
Pré-requisitos de acesso
- Permissão (módulo):
viewWithdrawals(para ver a listagem). As ações de aprovar/recusar exigem ainda os módulosapproveWithdrawalecancelWithdrawal. - Licença/Feature:
WITHDRAWAL_HANDLING. A aba Banco Digital (saque fiduciário interno) só aparece quando a featureDIGITAL_BANKINGtambém está habilitada. - Contêiner do menu: GERAL → grupo Operações
O que é / quando usar
Tela central de aprovação de saques solicitados pelos usuários. As solicitações são separadas por tipo de destino em abas: Fiduciário (FIAT — saque bancário externo), Banco Digital (INTERNAL_FIAT — transferência interna entre contas digitais) e Bitcoin/ETH (cripto on-chain). O operador revisa os dados da solicitação (conta destino, chave PIX, endereço de carteira e os campos customizados por token), aprova — o que dispara a saída efetiva do dinheiro — ou recusa, devolvendo o valor reservado.
Pré-condições
- Permissão:
viewWithdrawalspara ver;approveWithdrawal/cancelWithdrawalpara agir (permissão dupla — enum CPM + módulo dinâmico no DB). - Licença/Feature:
WITHDRAWAL_HANDLINGhabilitada;DIGITAL_BANKINGpara a aba Banco Digital. - Dependências de outras telas: o usuário-alvo deve estar
APPROVED(KYC) e ter saldo reservado. Saques de carteiras em estado de captação (IN_CAPTATION) ficam bloqueados pela própria reserva. Só é possível agir sobre solicitações em Aguardando.
Passo a passo
- Acesse o menu Operações → Gerenciar saques.
- Escolha a aba de destino: Fiduciário, Banco Digital ou Bitcoin/ETH (a aba selecionada é guardada na sessão).
- Filtre por status (Todos, Aprovado, Cancelado, Aguardando) e busque por nome.
- Clique no ícone de detalhes (info) para abrir o modal com todos os dados da solicitação, inclusive os campos customizados por token e valores sensíveis mascarados.
- Aprove para liberar o dinheiro ou recuse para devolver o valor à carteira. Confirme no bottom-sheet.
Filtros e colunas
| Filtro/Coluna | O que mostra | Origem do dado |
|---|---|---|
| Aba (tipo) | FIAT / INTERNAL_FIAT / BTC-ETH | type da solicitação; aba persistida em MANAGE_WITHDRAWAL_TABLETYPE |
| Busca | Filtro local por nome do solicitante | name |
| Status | Aguardando / Aprovado / Cancelado / Todos | status |
| Data | Data da solicitação | when (ordenado DESC) |
| ID / Identificador | ID da solicitação e CPF/CNPJ/passaporte | id / identifier (resolvido pelo userId) |
| Valor | Montante solicitado | amount (BigNumber) |
| Status | Estado da solicitação | status |
Modal de detalhes
Mostra: nome, valor + unidade, banco, agência, conta, chave PIX, identificador, status, data e a lista de campos customizados definidos pelo token. Campos marcados como secure aparecem mascarados (••••••); booleanos viram Sim/Não; datas são formatadas. Esses campos vêm do schema withdrawal_custom_fields do token e são revalidados no backend (tipo, regex, faixas, opções de select).
Ações e modais
- Aprovar: bottom-sheet de confirmação →
updateWithdrawal(id, 'APPROVED'). O backend (FMS – Withdrawal) executa a saída efetiva do dinheiro (transferência bancária, transferência interna ou broadcast on-chain conforme o tipo). A página recarrega. - Recusar: bottom-sheet →
updateWithdrawal(id, 'CANCELLED'). Devolve o valor reservado à carteira do usuário. - Abrir usuário: navega para os detalhes do usuário pelo e-mail.
- Guia de ajuda (auto_stories): abre o modal de troubleshooting da tela.
Regras de negócio / cuidados
Atenção
- Aprovar/recusar só está disponível para solicitações em Aguardando.
- A aba Banco Digital depende da feature
DIGITAL_BANKING; sem ela, só Fiduciário e Bitcoin/ETH aparecem. - Confira os campos customizados (ex.: endereço de carteira externo, chave PIX) antes de aprovar — eles carregam o destino real do dinheiro.
Irreversível
- Aprovar dispara a saída efetiva do dinheiro (transferência bancária / on-chain). Após confirmado, não há rollback — um envio on-chain ou uma transferência bancária não podem ser desfeitos pela plataforma.
- Valores financeiros: tratados como BigNumber — sem arredondamento; conferir as casas decimais do token/moeda.
- Idempotência: a liquidação do saque no FinLib é idempotente por
externalId. Se o backend retornarE00021"already processed" (ex.: retry após timeout/crash), o saque já foi processado — trate como sucesso, não reenvie. - Status APPROVED: o usuário-alvo precisa estar
APPROVED.
Exemplos
Cenário 1 — Saque fiduciário (FIAT) via PIX para banco externo
- Aba Fiduciário, status Aguardando.
- Abra os detalhes e confira nome, valor, banco, agência, conta e chave PIX.
- Confronte o nome do titular com o do usuário (prevenção de saque para terceiros).
- Aprovar → o FMS aciona a transferência bancária externa. Resultado: status vira
APPROVED, o valor sai da casa e a reserva é consumida.
Cenário 2 — Saque interno entre contas digitais (Banco Digital)
- Aba Banco Digital (requer
DIGITAL_BANKING). - O destino é outra conta digital do ecossistema — não há transferência bancária externa.
- Aprovar → o FMS faz a transferência interna
INTERNAL_FIAT. Liquidação imediata, sem janela bancária.
Cenário 3 — Saque cripto (BTC/ETH) com endereço em campo customizado
- Aba Bitcoin/ETH.
- Nos detalhes, o endereço da carteira de destino aparece nos campos customizados definidos pelo token (validados por regex no schema do token).
- Verifique o endereço com cuidado — envio on-chain é definitivo.
- Aprovar → broadcast on-chain. Se houver retry e o backend devolver
E00021, a transação já foi enviada; não reenvie.