Criar / Editar Contrato
Pré-requisitos de acesso
- Permissão (módulo):
manageContracts - Licença/Feature: Nenhuma (para débito automático em fiat:
DIGITAL_BANKING) - Contêiner do menu: GERAL → grupo Contratos (acessada a partir da Lista de contratos)
O que é / quando usar
Formulário em duas etapas (stepper) para registrar um contrato de cobrança recorrente com um cliente: na etapa Geral define-se título, descrição, tipo de pagamento (fiat ou token), valor total, vigência, documento anexo, cliente e tipo de contrato; na etapa Pagamentos, o sistema gera automaticamente as parcelas mensais dividindo o valor total pela vigência, e permite ajustar a data de cada parcela. Use para formalizar mensalidades, assinaturas, planos de pagamento parcelado e qualquer cobrança recorrente vinculada a um usuário.
Pré-condições
- Permissão:
manageContracts(a rota e os botões de salvar só existem com este módulo). Permissão dupla — enum CPM no backend + módulo dinâmico no DB. - Licença/Feature: Nenhuma para criar. Para que o débito automático em fiat funcione depois,
DIGITAL_BANKINGprecisa estar habilitada. - Dependências de outras telas:
- É preciso ter ao menos um Tipo de contrato cadastrado — ver Tipos de contrato.
- Para pagamento em token, o token de cobrança precisa existir em [Gerenciar Tokens].
- O e-mail do cliente precisa pertencer a um usuário existente — o formulário valida isso antes de liberar o avanço.
Passo a passo
- Na Lista de contratos, clique em Novo (ou no lápis para editar).
- Etapa Geral: preencha título, descrição, tipo de pagamento, valor total, datas de vigência, anexe o documento e informe o e-mail do cliente.
- Clique no link validar se o usuário existe ao lado do e-mail — é obrigatório. Um check verde confirma; sem ele o avanço fica bloqueado.
- Selecione o Tipo de contrato (e o Token de cobrança, se o pagamento for em token).
- Avance para Pagamentos: confira as parcelas geradas automaticamente; ajuste datas se necessário (modo edição).
- Clique em Salvar e confirme no bottom-sheet.
Campos — etapa Geral
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
| Título | Nome do contrato | Sim | Grava title. Imutável em edição (campo desabilitado no modo edit). |
| Descrição | Texto livre do acordo (até 4000 caracteres) | Sim | Grava description. Imutável em edição. |
| Tipo de pagamento | Fiat ou Token | Sim (default Fiat) | Grava paymentType. Define como o débito ocorrerá: fiat debita a conta digital; token debita a carteira do cliente. Imutável em edição. |
| Token de cobrança | Token usado quando pagamento = token | Condicional (só se Token) | Grava paymentTokenId. Em fiat o campo é limpo automaticamente (paymentTokenId = ''). |
| Valor total | Montante total do contrato | Sim | Grava totalValue como BigNumber (máscara de moeda/token). Em fiat formata com 2 casas; em token com a precisão do token. Imutável em edição. |
| Data inicial | Início da vigência | Sim | Grava initialDate. Não pode ser no passado (filtro do datepicker bloqueia datas anteriores a hoje). |
| Data final | Fim da vigência | Sim | Grava endDate. Junto com a inicial define o nº de parcelas mensais. Imutável em edição. |
| Documento | Arquivo do contrato (PDF/imagem) | Sim | Sobe via API de arquivos; grava document.{name,url}. Limite de 10 MB e tipos restritos — arquivo inválido mostra erro. |
| E-mail do cliente | Identifica o usuário-alvo da cobrança | Sim | Validado por getUserBasicInfo; só com o check verde (emailChecked) o formulário libera. Grava customerEmail. Imutável em edição. |
| Tipo de contrato | Categoria do contrato | Sim | Grava contractTypeId. Alimentado por Tipos de contrato. |
Campos — etapa Pagamentos
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
| Lista de parcelas | Parcelas mensais geradas automaticamente | Gerado pelo sistema | Na criação, o total é dividido por (nº de meses entre as datas) + 1; cada parcela recebe amount e competence (uma por mês). Status inicial pendente. |
| Data da parcela (competência) | Quando a parcela vence/será debitada | Editável (parcelas pendentes) | Editar abre o modal de data; chama updateContractPayment. Só parcelas em pendente têm o lápis. |
| Valor da parcela | Valor de cada parcela | Calculado | totalValue / (monthDiff + 1) (BigNumber). Exibido com símbolo da moeda (fiat) ou ID do token. |
| Status da parcela | pendente / paga / vencida / cancelada | Sistema | Atualizado pelo scheduler de cobrança ou por pagamento manual. |
Ações e modais
- Próximo / Anterior: navegação do stepper. Em modo criação o stepper é linear: a etapa Geral só libera o avanço quando todos os campos obrigatórios estão preenchidos e o e-mail foi validado.
- Validar usuário: valida o e-mail do cliente; obrigatório para prosseguir. O ícone de limpar reseta a validação.
- Editar data da parcela: abre modal de seleção de nova data; ao confirmar, salva e recarrega a tela.
- Salvar: abre bottom-sheet de confirmação. Na criação chama
createContract; em edição chamaupdateContract. Sucesso → volta à listagem com snackbar.
Regras de negócio / cuidados
Atenção
- Em edição, a maioria dos campos é somente leitura. Só são alteráveis o tipo de contrato e as datas das parcelas pendentes. Título, descrição, valor, tipo de pagamento, token, datas de vigência, documento e cliente ficam bloqueados após a criação. Para mudar o essencial, crie um novo contrato.
- Validação de e-mail é mandatória: sem o check verde, o avanço fica travado. Um e-mail que não corresponde a um usuário existente impede a criação.
- Geração de parcelas: o número de parcelas é
meses_entre_datas + 1. Vigência de 01/jan a 01/jun gera 6 parcelas; defina as datas com isso em mente. - Data inicial no passado é bloqueada — não é possível registrar um contrato com início retroativo pelo datepicker.
- Valores financeiros: total e parcelas são BigNumber — sem arredondamento. A divisão pode gerar dízimas; confira as casas conforme fiat (2) ou token (precisão do token).
- Débito automático & cobrança: após criado e aceito pelo cliente, o scheduler diário (08h) debita as parcelas vencidas. Em fiat transfere da conta digital do cliente para a conta principal (exige
DIGITAL_BANKING); em token faz transação de carteira. Sem saldo, a parcela vai a vencida e cliente/admin recebem e-mail. - Idempotência: o débito de parcela usa o
idda parcela comoexternalIdna transação de carteira — reprocessar a mesma parcela é seguro e não duplica o débito.
Exemplos
Cenário 1 — Mensalidade em fiat com débito automático (12 parcelas)
- Geral: Título "Plano Anual Premium", descrição do serviço, Tipo de pagamento = Fiat, Valor total = R$ 1.200,00, vigência 01/07 a 01/06 do ano seguinte (gera 12 parcelas de R$ 100,00).
- Anexe o PDF assinado, informe o e-mail do cliente e clique em validar (check verde).
- Selecione o Tipo de contrato "Assinatura".
- Pagamentos: confira as 12 parcelas mensais de R$ 100,00 com competências do dia 01 de cada mês.
- Salve. Na Lista, ligue o Débito automático.
- Resultado: após o cliente aceitar no app, todo dia 01 (processado às 08h) o sistema debita R$ 100,00 da conta digital. Sem saldo → parcela vira vencida e notificações são enviadas.
Cenário 2 — Contrato pago em token (carteira)
- Geral: Tipo de pagamento = Token, escolha o Token de cobrança (ex.:
USDT), Valor total = 600 (precisão do token), vigência de 6 meses → 6 parcelas de 100. - Anexe o documento, valide o e-mail do cliente, selecione o tipo de contrato.
- Pagamentos: 6 parcelas de 100
USDT. - Salve e ligue o débito automático.
- Resultado: a cobrança verifica o saldo do token na carteira do cliente e faz uma transação de carteira (não toca a conta digital). Saldo insuficiente → parcela vencida.
Cenário 3 — Ajustar a data de uma parcela específica
- Abra o contrato em edição (ou nos Detalhes).
- Na grade de parcelas, localize uma parcela pendente (só essas têm o lápis).
- Clique em editar, escolha a nova data de competência e confirme.
- Resultado:
updateContractPaymentgrava a nova competência; a tela recarrega. Parcelas pagas ou vencidas não podem ter a data alterada.