1. Pagamentos
AgRisk
  • AgRisk
    • Documentação
      • AgRisk
    • API - AgRisk
      • Login
        • Atualizar token
        • Autenticar usuário
      • Consultas
        • Solicitar consulta
        • Listar consultas
        • Listar consultas da empresa
      • Listagem de Produtos
        • Listar produtos
      • Clientes
        • Listar clientes
        • Criar cliente
        • Listar contadores de clientes
        • Deletar cliente
        • Listar contadores de clientes no grupo
      • Dados Cadastrais
        • Buscar dados cadastrais
      • Grupos
        • Listar grupos
        • Criar grupo
        • Listar clientes em grupo
        • Criar cliente em grupo
        • Atualizar nome do grupo
        • Deletar grupo
        • Inserir cliente em grupo
        • Remover cliente de grupo
      • Análise de Matrícula
        • Listar análises de matrículas
        • Criar análise de matrícula
        • Buscar análise de matrícula
        • Deletar análise de matrícula
      • Contatos
        • Listar contatos
      • BNDES
        • Listar BNDES
      • Boa Vista
        • Listar Boa Vista
      • Compliance
        • Listar compliance
      • CPRs
        • Listar CPRs
        • Buscar CPR
      • Grupo econômico
        • familiar
          • Listar grupo econômico
          • Listar grupo familiar
      • Imposto de Renda
        • Criar ativo financeiro
        • Listar ativos financeiros
        • Criar dívida
        • Importar dívidas
        • Listar dívidas
        • Atualizar dívida
        • Deletar dívida
        • Criar ativo móvel
        • Listar ativos móveis
        • Atualizar ativo móvel
        • Deletar ativo móvel
        • Criar imóvel urbano
        • Listar imóveis urbanos
        • Atualizar imóvel urbano
        • Deletar imóvel urbano
      • Judicial
        • Listar processos judiciais
        • Buscar processo judicial
        • Solicitar análise por IA
      • Protestos
        • Listar protestos
      • Imóveis Rurais - Simples
        • Criar imóvel rural
        • Listar imóveis rurais
        • Buscar imóvel rural
      • Endividamento
        • Listar SCR (endividamento)
      • Imóveis Rurais - CAR
        • Listar CAR (Cadastro Ambiental Rural)
        • Buscar CAR
        • Deletar CAR
        • Criar CAR
        • Download certidão CAR
      • QUOD
        • Buscar Quod
      • Restritivo Nacional
        • Buscar Restritivo Nacional
      • Veicular
        • Buscar Patrimônio Veicular
      • Sintegra
        • Listar Sintegras
    • APIs
    • Raiz
    • Esquemas
      • API Requests
        • ClientResponse
  • AgFlow
    • 🇧🇷 Português
      • Aprovação
        • Aprovação — Visão Geral
        • Consultar configuração de aprovação
        • Criar configuração de aprovação
        • Atualizar configuração de aprovação
        • Adicionar regra de aprovação
        • Atualizar regra de aprovação
        • Remover configuração de aprovação
        • Consultar aprovação do card
        • Registrar voto de aprovação
        • Atualizar voto de aprovação
      • Fluxo
        • Fluxo — Visão Geral
        • Verificar disponibilidade
        • Criar fluxo
        • Listar fluxos
        • Obter fluxo
        • Atualizar fluxo
        • Remover fluxo
        • Adicionar usuário ao fluxo
        • Remover usuário do fluxo
        • Listar caminhos de campos dinâmicos
      • Consulta a Bureau
        • Consulta a Bureau — Visão Geral
        • Obter configuração de consulta a bureau
        • Criar configuração de consulta a bureau
        • Atualizar configuração de consulta a bureau
      • Campos
        • Campos — Visão Geral
        • Listar campos da fase
        • Atualizar campos da fase
        • Atualizar regras de campos da fase
      • Conversa
        • Conversa — Visão Geral
        • Obter configuração de conversa
        • Criar configuração de conversa
        • Remover configuração de conversa
      • Motores
        • Motores — Visão Geral
        • Consultar resultado do motor de decisão do card
        • Executar motor de decisão no card
        • Consultar inputs do motor de crédito para o card
        • Consultar resultado do motor de crédito do card
        • Executar motor de crédito no card
        • Consultar configuração do motor de decisão
        • Criar configuração do motor de decisão
        • Atualizar configuração do motor de decisão
        • Remover configuração do motor de decisão
        • Consultar detalhe da configuração do motor de crédito
        • Criar configuração do motor de crédito
        • Listar configurações do motor de crédito do flow
        • Listar políticas de crédito aplicáveis a um card
        • Atualizar configuração do motor de crédito
        • Remover configuração do motor de crédito
      • Parecer
        • Parecer — Visão Geral
        • Consultar configuração do parecer técnico
        • Criar configuração do parecer técnico
        • Atualizar configuração do parecer técnico
        • Consultar parecer registrado no card
        • Registrar parecer no card
        • Atualizar parecer no card
      • Formulário Inicial
        • Formulário Inicial — Visão Geral
        • Criar formulário inicial
        • Definir regras condicionais do formulário
        • Atualizar metadados do formulário
        • Consultar formulário inicial
        • Consultar formulário público
        • Atualizar campos do formulário
        • Remover formulário inicial
      • Filtros
        • Filtros — Visão Geral
        • Listar filtros salvos
        • Criar filtro salvo
        • Atualizar filtro salvo
        • Buscar cards do flow
        • Busca global de cards
      • AgRisk
        • AgRisk — Visão Geral
        • Listar produtos de consulta AgRisk
      • Gatilhos
        • Gatilhos — Visão Geral
        • Listar gatilhos do flow
        • Criar gatilho
        • Atualizar gatilho
        • Remover gatilho
        • Listar gatilhos da fase
      • Autenticação
        • Autenticação — Visão Geral
        • Autenticar usuário
      • Mensageria
        • Mensageria — Visão Geral
        • Configurar telefone
        • Consultar configuração de mensageria
        • Criar configuração de mensageria
        • Atualizar configuração de mensageria
        • Criar regras de mensageria
        • Atualizar regra de mensageria
        • Remover configuração de mensageria
      • Empresas e Papéis
        • Empresas e Papéis — Visão Geral
        • Listar usuários da empresa
        • Listar papéis da empresa
        • Atualizar papel
        • Listar catálogo de permissões
        • Criar papel
        • Gerar URL de upload do logotipo
        • Gerar URL de download do logotipo
        • Atribuir papéis a um usuário
      • Documentos
        • Documentos — Visão Geral
        • Criar configuração de geração automática de documento
        • Remover configuração de geração automática de documento
        • Consultar configuração de geração automática de documento
        • Atualizar configuração de geração automática de documento
        • Consultar campos para geração do documento
        • Gerar documento a partir de template
        • Consultar template por ID
        • Listar templates do card
        • Ativar template
        • Criar template de documento
        • Remover template
        • Listar templates
        • Definir campos do template
        • Configurar regras condicionais do template
        • Atualizar arquivo do template
      • Cards
        • Cards — Visão Geral
        • Listar cards de uma fase
        • Mover card de fase
        • Criar card
        • Listar cards do flow
        • Criar card via link público
        • Buscar cards
        • Obter card
        • Atualizar card
        • Atualizar responsável do card
        • Atualizar campos via link público
        • Atualizar campos de fase do card
        • Remover cards em lote
        • Atualizar Ficha Cadastral do card
        • Obter responsável do card
        • Listar etiquetas do card
        • Listar campos de uma fase do card
        • Listar campos de uma fase do card (link público)
        • Obter histórico do card
        • Listar clientes do card
        • Criar comentário no card
        • Listar comentários do card
        • Remover comentário do card
        • Listar anexos do card
        • Cadastrar anexo no card
        • Remover anexo do card
        • Remover vínculo do anexo com campo de fase
        • Adicionar membros ao grupo do card
        • Remover membro do grupo do card
      • Configuração de Cliente
        • Configuração de Cliente — Visão Geral
        • Obter configuração de cliente por empresa
        • Criar configuração de cliente
        • Atualizar configuração de cliente
        • Obter configuração de cliente
        • Remover configuração de cliente
        • Listar seções
        • Criar seções
        • Obter seção
        • Atualizar seção
        • Atualizar seção parcialmente
        • Remover seção
        • Listar campos
        • Criar campos
        • Obter campo
        • Atualizar campo
        • Atualizar campo parcialmente
        • Remover campo
        • Listar regras
        • Criar regra
        • Obter regra
        • Atualizar regra
        • Atualizar regra parcialmente
        • Remover regra
      • Fase
        • Fase — Visão Geral
        • Criar ação de fase
        • Criar fase
        • Remover ação de fase
        • Remover fase
        • Listar ações da fase
        • Listar fases
        • Atualizar ação de fase
        • Atualizar fase
    • 🇺🇸 English
      • Phase
        • Phase — Overview
        • Create phase action
        • Create phase
        • Delete phase action
        • Delete phase
        • List phase actions
        • List phases
        • Update phase action
        • Update phase
      • Approval
        • Approval — Overview
        • Get approval configuration
        • Create approval configuration
        • Update approval configuration
        • Add approval rule
        • Update approval rule
        • Delete approval configuration
        • Get card approval
        • Register approval vote
        • Update approval vote
      • Flow
        • Flow — Overview
        • Health check
        • Create flow
        • List flows
        • Get flow
        • Update flow
        • Delete flow
        • Add user to flow
        • Remove user from flow
        • List dynamic field paths
      • Bureau Query
        • Bureau Query — Overview
        • Get bureau query configuration
        • Create bureau query configuration
        • Update bureau query configuration
      • Fields
        • Fields — Overview
        • List phase fields
        • Update phase fields
        • Update phase field rules
      • Engines
        • Engines — Overview
        • Get card decision engine result
        • Run card decision engine
        • Get card credit engine inputs
        • Get card credit engine result
        • Run card credit engine
        • Get decision engine configuration
        • Create decision engine configuration
        • Update decision engine configuration
        • Delete decision engine configuration
        • Get credit engine configuration detail
        • Create credit engine configuration
        • List flow credit engine configurations
        • List credit policies applicable to a card
        • Update credit engine configuration
        • Delete credit engine configuration
      • Conversation
        • Conversation — Overview
        • Get conversation configuration
        • Create conversation configuration
        • Delete conversation configuration
      • Opinion
        • Opinion — Overview
        • Get opinion configuration
        • Create opinion configuration
        • Update opinion configuration
        • Get card opinion
        • Create card opinion
        • Update card opinion
      • Start Form
        • Start Form — Overview
        • Create start form
        • Set start form conditional rules
        • Update start form metadata
        • Get start form
        • Get public start form
        • Update start form fields
        • Delete start form
      • Filters
        • Filters — Overview
        • List saved filters
        • Create saved filter
        • Update saved filter
        • Search flow cards
        • Search cards across flows
      • AgRisk
        • AgRisk — Overview
        • List AgRisk query products
      • Triggers
        • Triggers — Overview
        • List flow triggers
        • Create trigger
        • Update trigger
        • Delete trigger
        • List phase triggers
      • Authentication
        • Authentication — Overview
        • Authenticate user
      • Messaging
        • Messaging — Overview
        • Configure phone
        • Get messaging config
        • Create messaging config
        • Update messaging config
        • Create messaging rules
        • Update messaging rule
        • Delete messaging config
      • Companies & Roles
        • Companies & Roles — Overview
        • List company users
        • List company roles
        • Update role
        • List permissions catalog
        • Create role
        • Generate company logo upload URL
        • Generate company logo download URL
        • Assign roles to a user
      • Documents
        • Documents — Overview
        • Create automatic document configuration
        • Delete automatic document configuration
        • Get automatic document configuration
        • Update automatic document configuration
        • Get fields for document generation
        • Generate document from template
        • Get template by ID
        • List card templates
        • Activate template
        • Create document template
        • Delete template
        • List templates
        • Set template fields
        • Configure template conditional rules
        • Update template file
      • Cards
        • Cards — Overview
        • List cards in a phase
        • Move card to another phase
        • Create card
        • List flow cards
        • Create card via public link
        • Search cards
        • Get card
        • Update card
        • Update card assignee
        • Update fields via public link
        • Update card phase fields
        • Delete cards in bulk
        • Update card registration record
        • Get card assignee
        • List card labels
        • List card phase fields
        • List card phase fields (public link)
        • Get card history
        • List card clients
        • Create card comment
        • List card comments
        • Delete card comment
        • List card attachments
        • Register card attachment
        • Delete card attachment
        • Delete attachment's phase-field link
        • Add members to card group
        • Remove card group member
      • Client Configuration
        • Client Configuration — Overview
        • Get client configuration by company
        • Create client configuration
        • Update client configuration
        • Get client configuration
        • Delete client configuration
        • List sections
        • Create sections
        • Get section
        • Update section
        • Partially update section
        • Delete section
        • List fields
        • Create fields
        • Get field
        • Update field
        • Partially update field
        • Delete field
        • List rules
        • Create rule
        • Get rule
        • Update rule
        • Partially update rule
        • Delete rule
    • 💼 Visão de Negócio
      • Fase
      • Fluxo
      • Campos — Visão de Negócio
      • Aprovação
      • Parecer
      • Motores
      • Empresas e Papéis
      • Gatilhos
      • Conversa
      • Documentos
      • Mensageria
      • Filtros
      • Autenticação
      • Configuração de Cliente
      • Cards
      • AgRisk
      • Formulário Inicial
      • Consulta a Bureau
    • 💼 Business Overview
      • Phase
      • Flow
      • Approval
      • Fields — Business Overview
      • Opinion
      • Engines
      • Companies & Roles
      • Documents
      • Triggers
      • Messaging
      • Conversation
      • Filters
      • Authentication
      • Client Configuration
      • Cards
      • AgRisk
      • Start Form
      • Bureau Query
  • Portfolio
    • Documentação
      • Empresa
      • Gestão de portfolio
        • Análise geral
        • Dicionário de campos base (Necessário validar)
        • [Desatualizado]Fluxo de funcionamento
        • Carteiras
          • Gestão da carteira
        • Contratos
          • Contratos
          • Template Contratos
        • Pagamentos
          • Pagamentos
        • Baixas
          • Baixas
        • Clientes
          • Devedores e credores (Participantes)
          • Informações dos clientes
        • Importação de dados
          • Importação de dados
        • Garantia
          • Colaterais
      • Gestão de Cobrança
        • Régua de cobrança
          • Regras da régua por empresa
        • Atividades
          • Regras das Atividades
  1. Pagamentos

Pagamentos

Pagamentos — Regras de Negócio#

1. Conceito#

O Pagamento (ContractPayment) é a unidade mínima de cobrança dentro de um contrato. Representa uma obrigação de pagamento individual com valor nominal e data de vencimento definidos. Um contrato agrupa um ou mais pagamentos, que em conjunto correspondem ao valor total da operação formalizada.
Pagamentos não são subdivisíveis — cada pagamento é uma parcela atômica e indivisível. Renegociações que resultam em novos vencimentos ou valores devem ser tratadas como cancelamento do pagamento original e criação de novos pagamentos no contrato substituto.
O ciclo de vida de um pagamento é independente do contrato, mas impacta diretamente o status do contrato pai (ver Contratos.md, seção 2.4 — transições automáticas de ACTIVE → OVERDUE → DEFAULTED).

1.1. Relação com o tipo do contrato#

O tipo do pagamento é restrito pelo tipo do contrato pai. Cada tipo de contrato define, via allowedPaymentTypes no seu schema, quais tipos de pagamento são permitidos. O tipo padrão na criação é herdado de paymentDefaults.typeDefault do schema do contrato.
O comportamento de cálculo de encargos (juros, multa, desconto) também é condicionado pelo tipo do contrato. Contratos cujo schema define paymentDefaults.interestApplicable = false (ex: CPR_PHYSICAL) não terão cálculo automático de juros nos seus pagamentos.

1.2. Correção monetária#

Para contratos com correctionIndex != NONE, os pagamentos exibem um campo calculado amounts.corrected que representa o valor da parcela atualizado pelo índice de correção até a data da consulta. Esse valor é informativo — não altera o amounts.value armazenado. A correção efetiva é aplicada no momento do registro de baixa (ver Baixas.md).

2. Estruturas de Dados#

2.1. ContractPayment#

Contrato de API (não confundir com armazenamento). Esta tabela descreve o payload das respostas e requisições da API. A estrutura aninhada (amounts, charges, discount, createdBy) é resultado de serialização — o modelo de dados em 12. Modelo de Dados.md armazena os campos em colunas flat. O backend hidrata e agrupa na hora de devolver.

Campos top-level#

CampoTipoObrigatórioDescrição
idUUIDSimIdentificador único do pagamento.
contractIdUUIDSimContrato ao qual o pagamento pertence.
companyIdUUIDSimEmpresa. Desnormalizado para facilitar consultas.
codeStringNãoCódigo ou número do pagamento (ex: NF-001, CPR-2024-03). Único por contrato quando informado.
typeEnumSimTipo: CPR, INVOICE, PURCHASE_SALE_CONTRACT, CCB, PROMISSORY_NOTE, OTHER. Deve estar contido no allowedPaymentTypes do schema do contrato pai. Quando omitido na criação, herda paymentDefaults.typeDefault.
descriptionStringCondicionalDescrição livre. Obrigatório quando type = OTHER.
dueDateDateTime (ISO 8601 UTC)SimData de vencimento.
statusEnumSimPENDING, PAID, PARTIALLY_PAID, OVERDUE, DEFAULTED, RENEGOTIATED, CANCELLED. Fixo em PENDING na criação manual via POST. Em importação (ver Importação.md) aceita outros valores para migração de parcelas legadas.
overdueDaysIntegerNãoDias em atraso. Calculado em tempo de leitura quando em atraso. null para demais status.
amountsObjectSimObjeto com os valores monetários da parcela. Ver detalhe abaixo.
chargesObjectSimObjeto com encargos (juros, multa, desconto). Sempre presente, mesmo quando todos os componentes estão null. Ver detalhe abaixo.
createdByObjectSimUsuário que criou, hidratado: { id, name }. Ver detalhe abaixo.
createdAtDateTime (ISO 8601 UTC)SimData de criação.
updatedAtDateTime (ISO 8601 UTC)SimData da última atualização.
paidAtDateTime (ISO 8601 UTC)NãoData em que foi integralmente liquidado. Preenchido ao mover para PAID.
defaultedAtDateTime (ISO 8601 UTC)NãoData em que foi marcado como inadimplência formal. Preenchido ao mover para DEFAULTED.
cancelledAtDateTime (ISO 8601 UTC)NãoData de cancelamento.

amounts (objeto)#

CampoTipoObrigatórioDescrição
amounts.valueDecimalSimValor da parcela em BRL — o valor original da obrigação, sem acréscimos.
amounts.correctedDecimalNãoValor da parcela corrigido pelo índice de correção monetária do contrato. Campo calculado em tempo de leitura. null quando correctionIndex = NONE.
amounts.dueDecimalNãoValor total devido: corrected ?? value + charges.interest + charges.fine − charges.discount.calculatedAmount. Campo calculado em tempo de leitura.
amounts.receivedDecimalNãoValor total efetivamente recebido. Soma do receivedAmount de todas as baixas com status = ACTIVE (ver Baixas.md).
amounts.remainingDecimalNãoValor em aberto: due − received. Campo calculado em tempo de leitura.

charges (objeto)#

CampoTipoObrigatórioDescrição
charges.interestDecimalNãoJuros de mora calculados automaticamente em tempo de leitura. null quando não aplicável ou parcela não está em atraso.
charges.fineDecimalNãoMulta por atraso. Aplicada a partir do 1º dia de atraso. null quando não aplicável.
charges.discountObjectSimObjeto de desconto. Sempre presente, mesmo quando não há desconto configurado (nesse caso, type e value ficam null). Ver detalhe abaixo.

charges.discount (objeto)#

CampoTipoObrigatórioDescrição
charges.discount.typeEnumNãoFIXED ou PERCENTAGE. null quando não há desconto configurado.
charges.discount.valueDecimalNãoQuando type = FIXED, valor monetário do desconto. Quando type = PERCENTAGE, percentual aplicado sobre amounts.value. null quando type é null.
charges.discount.calculatedAmountDecimalNãoValor monetário efetivo do desconto. Quando type = FIXED, igual a discount.value. Quando type = PERCENTAGE, amounts.value × (discount.value / 100). Campo calculado em tempo de leitura. null quando não há desconto.

createdBy (objeto)#

CampoTipoObrigatórioDescrição
createdBy.idUUIDSimID do usuário que criou a parcela.
createdBy.nameStringSimNome do usuário, hidratado pelo backend a partir do User vinculado.

2.2. Ciclo de vida#

PENDING ◄──► OVERDUE ──► DEFAULTED ──► PAID / PARTIALLY_PAID / RENEGOTIATED / CANCELLED
         │                          ▲
         └──────────────────────────┘
         (PENDING também pode ir direto a PAID / PARTIALLY_PAID / RENEGOTIATED / CANCELLED)
         (OVERDUE volta a PENDING quando a parcela é liquidada antes da formalização da inadimplência)
TransiçãoTipoDescrição
PENDING → PAIDAutomática (via baixa)Baixa integral registrada.
PENDING → PARTIALLY_PAIDAutomática (via baixa)Baixa parcial. Valor menor que amounts.due.
PENDING → OVERDUEAutomática (via job)dueDate ultrapassado. Job diário (Pagamento → OVERDUE).
PENDING → CANCELLEDManualCancelamento administrativo.
PENDING → RENEGOTIATEDManual (via contrato)Substituído por renegociação do contrato pai.
PARTIALLY_PAID → PAIDAutomática (via baixa)Baixa do saldo restante (amounts.remaining = 0).
PARTIALLY_PAID → OVERDUEAutomática (via job)Parcialmente pago mas dueDate ultrapassado e ainda há saldo aberto. Histórico de baixas anteriores preservado em amounts.received.
OVERDUE → PENDINGAutomática (via job)Parcela em atraso é liquidada antes da formalização da inadimplência (raro — ocorre se dueDate é movido para futuro via PATCH, situação anômala).
OVERDUE → PAIDAutomática (via baixa)Baixa integral após vencimento.
OVERDUE → PARTIALLY_PAIDAutomática (via baixa)Baixa parcial após vencimento.
OVERDUE → DEFAULTEDAutomática (via job) ou ManualJob: daysToDefault do contrato ultrapassado. Manual: usuário marca via PUT /status.
OVERDUE → RENEGOTIATEDManual (via contrato)Renegociação do contrato.
DEFAULTED → PAIDAutomática (via baixa)Baixa integral mesmo após inadimplência formal.
DEFAULTED → PARTIALLY_PAIDAutomática (via baixa)Baixa parcial após inadimplência.
DEFAULTED → RENEGOTIATEDManual (via contrato)Renegociação.
DEFAULTED → CANCELLEDManualCancelamento administrativo após inadimplência.

2.3. Status técnico e label de exibição (referência para frontend)#

O backend devolve sempre o campo status técnico (enum). O label exibido na UI é derivado pelo frontend a partir desse status — não é um campo retornado pela API.
status (backend)Label exibida (frontend)
PENDING"Em aberto"
OVERDUE"Em atraso"
DEFAULTED"Inadimplente"
PARTIALLY_PAID"Parcialmente pago"
PAID"Pago"
RENEGOTIATED"Renegociado"
CANCELLED"Cancelado"

2.4. Cálculo de encargos#

Configuração de encargos#

Os encargos são configurados no contrato (finePercentage, dailyInterestPercentage) e condicionados pelo tipo via paymentDefaults do template. Não existe hierarquia multi-nível — o contrato é a fonte única de configuração.
FonteDescrição
ContratofinePercentage e dailyInterestPercentage definem os percentuais. Quando não informados, encargos não são calculados.
Template (paymentDefaults)Define se juros, multa e desconto são aplicáveis. Quando interestApplicable = false, o cálculo é ignorado independente do que estiver no contrato.
Sobrescrita na baixaNo momento da baixa, o usuário pode informar valores diferentes dos calculados. Ver Baixas.md.

Aplicabilidade condicionada ao tipo#

O schema do tipo do contrato define via paymentDefaults:
paymentDefaultsEfeito
interestApplicable = falsecharges.interest permanece null. Juros não calculados.
fineApplicable = falsecharges.fine permanece null.
discountApplicable = falseObjeto charges.discount é aceito mas type/value rejeitados na criação. Permanece como { type: null, value: null, calculatedAmount: null }.

Fórmulas#

Todas as fórmulas abaixo referenciam campos do objeto serializado conforme seção 2.1. No armazenamento (doc 12), os campos são flat (nominalAmount, interestAmount, etc. — nomes das colunas pendentes de alinhamento com a nomenclatura value); aqui usamos a notação aninhada do contrato de API.
Juros de mora (charges.interest):
Método SIMPLE:
charges.interest = amounts.value × (contract.dailyInterestPercentage / 100) × overdueDays
Método COMPOUND:
charges.interest = amounts.value × ((1 + contract.dailyInterestPercentage / 100) ^ overdueDays − 1)
Conversão quando dailyInterestPercentage do contrato não informado:
MONTHLY: dailyRate = contract.interestRate / 30
ANNUAL: dailyRate = contract.interestRate / 365
Multa (charges.fine):
charges.fine = amounts.value × (contract.finePercentage / 100)
Aplicada integralmente a partir do 1º dia de atraso. Não acumula por dia.
Desconto (charges.discount.calculatedAmount):
Quando charges.discount.type = FIXED: calculatedAmount = charges.discount.value.
Quando charges.discount.type = PERCENTAGE: calculatedAmount = amounts.value × (charges.discount.value / 100).
Quando charges.discount.type = null: calculatedAmount = null.
Correção monetária (amounts.corrected):
amounts.corrected = amounts.value × (índice acumulado no período)
null quando contract.correctionIndex = NONE.
Total devido (amounts.due):
base = amounts.corrected ?? amounts.value
amounts.due = base + (charges.interest ?? 0) + (charges.fine ?? 0) − (charges.discount.calculatedAmount ?? 0)
Desconto só é subtraído quando o pagamento está PENDING e a data de baixa é anterior ou igual ao dueDate. Após o vencimento, o calculatedAmount deixa de ser aplicado no cálculo de due (o desconto vira informativo).
Valor em aberto (amounts.remaining):
amounts.remaining = amounts.due − amounts.received

3. Regras de Negócio#

Criação e vínculo#

RN-PAY-001: Vínculo obrigatório com contrato ativo
Pagamentos só podem ser criados em contratos com status = DRAFT, ACTIVE ou OVERDUE. Erro: INVALID_CONTRACT_STATUS.
RN-PAY-002: Unicidade de código por contrato
O code, quando informado, deve ser único dentro do contrato. Erro: PAYMENT_CODE_ALREADY_EXISTS.
RN-PAY-003: Vencimento dentro da vigência do contrato
O dueDate deve estar dentro do intervalo startDate — endDate do contrato. Erro: DUE_DATE_OUT_OF_CONTRACT_RANGE.
RN-PAY-004: Tipo restrito pelo contrato
O type deve estar em allowedPaymentTypes do schema do contrato. Quando omitido, herda paymentDefaults.typeDefault. Erro: INCOMPATIBLE_PAYMENT_TYPE.
RN-PAY-004B: Status na criação
O campo status é fixo em PENDING no POST /payments (criação manual) — não pode ser informado pelo cliente. Em importação (ver Importação.md), o campo status é aceito no payload para permitir migração de parcelas legadas já em estados como PAID, PARTIALLY_PAID ou CANCELLED. Erro: INVALID_STATUS_TRANSITION quando o valor informado em importação é inválido para o ciclo de vida da parcela.
RN-PAY-005: Alerta de divergência com value do contrato
Ao adicionar ou remover pagamentos, o sistema verifica se a soma dos amounts.value das parcelas corresponde ao amounts.value do contrato. Divergências geram alerta TOTAL_AMOUNT_MISMATCH (não bloqueante).

Transições de status#

RN-PAY-006: Transição automática para OVERDUE
Job diário (Pagamento → OVERDUE, ver Visão Geral, seção 11) move pagamentos PENDING ou PARTIALLY_PAID com dueDate ultrapassado para OVERDUE. Quando o status passa de PARTIALLY_PAID para OVERDUE, o amounts.received (valor já liquidado por baixas anteriores) é preservado — a trilha histórica de pagamentos parciais não é perdida.
RN-PAY-007: Transição para DEFAULTED
A transição OVERDUE → DEFAULTED ocorre por duas vias:
Automática: job diário (Pagamento → DEFAULTED) move parcelas em OVERDUE para DEFAULTED quando o prazo daysToDefault do contrato (ver Contratos.md, seção 2.1) é ultrapassado contado a partir do dueDate.
Manual: usuário marca explicitamente via PUT /status, quando a operação reconhece a inadimplência formalmente antes do prazo configurado.
Quando o contrato não tem daysToDefault configurado, a transição automática não ocorre — DEFAULTED só por marcação manual.
RN-PAY-008: Impacto no contrato
Parcelas em OVERDUE ou DEFAULTED fazem o contrato transitar para OVERDUE (e eventualmente DEFAULTED) conforme regras documentadas em Contratos.md (RN-CONT-011 e RN-CONT-012).
RN-PAY-009: Cancelamento direto
Apenas pagamentos com status = PENDING podem ser cancelados diretamente via PUT /status. Pagamentos em OVERDUE, PARTIALLY_PAID, DEFAULTED ou PAID exigem fluxos específicos: renegociação (via contrato) ou cancelamento de baixa (ver Baixas.md — não há estorno no domínio). Erro: PAYMENT_NOT_CANCELLABLE.
RN-PAY-010: Renegociação
Transição para RENEGOTIATED ocorre em conjunto com a renegociação do contrato. Todos os pagamentos em aberto (PENDING, OVERDUE, DEFAULTED, PARTIALLY_PAID) são movidos simultaneamente.

Encargos#

RN-PAY-011: Cálculo automático
A partir de OVERDUE, o sistema recalcula diariamente charges.interest e charges.fine com base nos percentuais definidos no contrato (finePercentage, dailyInterestPercentage). Quando os percentuais não estão configurados no contrato, os encargos correspondentes não são calculados (null).
RN-PAY-012: Sobrescrita na baixa
Na baixa, o usuário pode informar valores diferentes dos calculados para encargos. Ver Baixas.md.
RN-PAY-013: Baixa parcial e múltiplas baixas até liquidar
Quando o valor da baixa é menor que amounts.due, o pagamento transita para PARTIALLY_PAID e o amounts.remaining é recalculado. Múltiplas baixas parciais são permitidas — a parcela permanece em PARTIALLY_PAID enquanto houver saldo aberto. Transita para PAID quando amounts.remaining = 0. A multa (charges.fine) é aplicada uma única vez sobre o título (não acumula por baixa).
RN-PAY-014: Configuração de desconto
O objeto charges.discount é sempre presente na resposta, mesmo quando não há desconto configurado (nesse caso type, value e calculatedAmount ficam null). Na criação ou edição, o campo charges.discount.type aceita FIXED ou PERCENTAGE. value deve ser numérico positivo. Quando o type é informado, value é obrigatório (e vice-versa) — informar um sem o outro gera erro INVALID_DISCOUNT_CONFIG. Quando paymentDefaults.discountApplicable = false, qualquer configuração de desconto (type/value não nulos) é rejeitada. Erro: DISCOUNT_NOT_ALLOWED. O campo calculatedAmount é sempre derivado em tempo de leitura — não pode ser enviado pelo cliente; se enviado, é ignorado.

Edição e exclusão#

RN-PAY-015: Edição restrita a PENDING
Apenas pagamentos PENDING podem ser editados via PATCH. Erro: PAYMENT_IMMUTABLE.
RN-PAY-016: Exclusão lógica
Nunca deletados fisicamente. Encerramento via CANCELLED ou PAID.

4. Padrão de Erros#

Códigos de erro específicos#

StatusCódigoDescrição
404PAYMENT_NOT_FOUNDPagamento não encontrado.
409PAYMENT_CODE_ALREADY_EXISTSCódigo duplicado no contrato.
422INVALID_CONTRACT_STATUSContrato não está em DRAFT ou ACTIVE.
422DUE_DATE_OUT_OF_CONTRACT_RANGEdueDate fora da vigência do contrato.
422INCOMPATIBLE_PAYMENT_TYPETipo não permitido para o contrato.
422MISSING_DESCRIPTIONtype = OTHER sem description informado.
422INVALID_STATUS_TRANSITIONStatus informado na criação ou transição requisitada não é permitida.
422PAYMENT_NOT_CANCELLABLEApenas PENDING pode ser cancelado.
422PAYMENT_IMMUTABLEPagamento em status que não permite edição.
422INVALID_DISCOUNT_CONFIGcharges.discount.type informado sem value (ou vice-versa), ou valor não numérico/negativo.
422DISCOUNT_NOT_ALLOWEDDesconto não aplicável ao tipo do contrato (paymentDefaults.discountApplicable = false).
422TOTAL_AMOUNT_MISMATCHSoma dos amounts.value das parcelas diverge do amounts.value do contrato (alerta).

5. Endpoints#

Base path: /v2/companies/:companyId/portfolios/:portfolioId/contracts/:contractId/payments

POST .../payments#

Cria um novo pagamento. Status fixo em PENDING na criação manual (RN-PAY-004B).
Permissão: payment:create
Request body (com desconto percentual):
{
  "code": "NF-001",
  "type": "INVOICE",
  "amounts": {
    "value": 150000.00
  },
  "dueDate": "2024-03-14T00:00:00.000+00:00",
  "charges": {
    "discount": {
      "type": "PERCENTAGE",
      "value": 2.0
    }
  }
}
Exemplo para contrato CPR_PHYSICAL (sem desconto):
{
  "code": "CPR-001",
  "amounts": {
    "value": 450000.00
  },
  "dueDate": "2025-04-15T00:00:00.000+00:00"
}
Response 201 Created:
{
  "id": "pay-001",
  "contractId": "contract-001",
  "companyId": "company-001",
  "code": "NF-001",
  "type": "INVOICE",
  "description": null,
  "dueDate": "2024-03-14T00:00:00.000+00:00",
  "status": "PENDING",
  "overdueDays": null,
  "amounts": {
    "value": 150000.00,
    "corrected": null,
    "due": 147000.00,
    "received": 0.00,
    "remaining": 147000.00
  },
  "charges": {
    "interest": null,
    "fine": null,
    "discount": {
      "type": "PERCENTAGE",
      "value": 2.0,
      "calculatedAmount": 3000.00
    }
  },
  "createdBy": {
    "id": "8c3f1a2b-...",
    "name": "João Silva"
  },
  "createdAt": "2025-03-17T09:00:00.000+00:00",
  "updatedAt": "2025-03-17T09:00:00.000+00:00",
  "paidAt": null,
  "defaultedAt": null,
  "cancelledAt": null
}

GET ...:contractId/payments#

Lista pagamentos do contrato.
Permissão: payment:read
Query params:
ParâmetroTipoObrigatórioDescrição
statusEnum (multi)NãoFiltrar por status.
dueDateStartDate (ISO)NãodueDate >=.
dueDateEndDate (ISO)NãodueDate <=.
orderByEnumNãoOrdenação: dueDate, amounts.value, overdueDays, status, createdAt. Default: dueDate.
orderEnumNãoasc ou desc. Default: asc.
offsetIntegerNãoDefault: 0.
limitIntegerNãoDefault: 20. Máximo: 100.
Response 200 OK:
{
  "items": [
    {
      "id": "pay-001",
      "contractId": "contract-001",
      "code": "NF-001",
      "type": "INVOICE",
      "description": null,
      "dueDate": "2026-05-13T13:32:32.209+00:00",
      "status": "OVERDUE",
      "overdueDays": 3,
      "amounts": {
        "value": 150000.00,
        "corrected": null,
        "due": 150225.00,
        "received": 0.00,
        "remaining": 150225.00
      },
      "charges": {
        "interest": 225.00,
        "fine": 3000.00,
        "discount": {
          "type": "PERCENTAGE",
          "value": 2.0,
          "calculatedAmount": null
        }
      },
      "createdBy": {
        "id": "8c3f1a2b-...",
        "name": "João Silva"
      },
      "createdAt": "2025-03-17T09:00:00.000+00:00",
      "updatedAt": "2025-03-17T09:00:00.000+00:00",
      "paidAt": null,
      "defaultedAt": null,
      "cancelledAt": null
    }
  ],
  "nextPage": false
}
Nota sobre o exemplo acima: charges.discount.calculatedAmount aparece como null porque a parcela está em OVERDUE — após o vencimento o desconto deixa de ser aplicado (RN-PAY-014 + seção 2.4). A configuração (type e value) permanece registrada.

GET .../payments/:paymentId#

Detalhe completo com encargos calculados até o momento da consulta.
Permissão: payment:read
Response 200 OK: Mesmo formato do POST response com todos os campos.

PATCH .../payments/:paymentId#

Atualiza dados. Apenas status = PENDING.
Permissão: payment:update
Campos editáveis: code, type, description, dueDate, amounts.value, charges.discount.type, charges.discount.value.
Os demais campos de amounts e charges são derivados em tempo de leitura e não podem ser enviados pelo cliente — se enviados, são ignorados.
Request body (editar valor da parcela e remover desconto):
{
  "code": "NF-001-REV",
  "amounts": {
    "value": 155000.00
  },
  "dueDate": "2024-04-14T00:00:00.000+00:00",
  "charges": {
    "discount": {
      "type": null,
      "value": null
    }
  }
}
Response 200 OK: Pagamento atualizado completo (mesmo formato do POST response).

PUT .../payments/:paymentId/status#

Substitui o status do pagamento. Usado para transições manuais (cancelamento, marcação manual de inadimplência).
Permissão: payment:update
Request body — cancelamento:
{
  "status": "CANCELLED",
  "reason": "Pagamento emitido com valor incorreto."
}
Request body — marcação manual de inadimplência:
{
  "status": "DEFAULTED",
  "reason": "Cliente comunicou impossibilidade de pagamento."
}
Response 200 OK:
{
  "id": "pay-001",
  "status": "CANCELLED",
  "cancelledAt": "2025-03-17T12:00:00.000+00:00",
  "updatedAt": "2025-03-17T12:00:00.000+00:00"
}

6. Permissões RBAC#

ResourceDomínioActions
paymentTENANTcreate, read, update
O nome técnico da entidade no código permanece ContractPayment — apenas o resource RBAC foi renomeado para payment (mais conciso, dado que o contexto do módulo já implica que pagamento é de contrato).
Modificado em 2026-06-02 15:00:45
Página anterior
Template Contratos
Próxima página
Baixas
Built with