1. Contratos
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. Contratos

Contratos

Contratos — Regras de Negócio#

1. Conceito#

O Contrato (Contract) é a entidade central do módulo de Gestão de Portfolio. Representa o instrumento jurídico firmado entre as partes de uma operação de crédito a prazo. Todo contrato pertence a exatamente um portfolio e é criado a partir de um template que define sua estrutura de campos.
Cada contrato agrupa um ou mais pagamentos (parcelas) — ver Pagamentos.md — que representam as obrigações de pagamento individuais. O contrato define as condições gerais da operação; os pagamentos definem os vencimentos.

1.1. Modelo orientado a template#

O contrato é criado a partir de um ContractTemplate (ver ContractTemplates.md) que combina:
Tipo base fixo pela plataforma (CPR_PHYSICAL, CCB, etc.) — define campos obrigatórios, comportamento de encargos, tipos de pagamento permitidos.
Campos customizados definidos pela empresa — com seções, regras condicionais e cálculos.
O type do contrato é herdado automaticamente do baseType do template. O templateId é imutável após criação.

1.2. Participantes#

O contrato não possui um campo clientId direto. Em vez disso, os envolvidos são registrados como participantes tipados — credores, devedores e garantidores — via entidade ContractParticipant (ver Participantes.md). Todo contrato deve ter ao menos um devedor para ser ativado.

1.3. Colaterais#

As garantias (colaterais) são registradas como sub-recurso do contrato — cada contrato pode ter zero ou mais colaterais, em relação 1:N. Os colaterais cobrem tanto garantias reais (penhor, hipoteca) quanto fidejussórias (aval, fiança). Ver Colaterais.md.

1.4. Status técnico vs. label visual#

O backend devolve apenas o status técnico do contrato (enum: DRAFT, ACTIVE, OVERDUE, etc.). O label exibido na interface (ex.: "Em atraso", "Inadimplente") é derivado pelo frontend a partir desse status, conforme tabela de tradução documentada na seção 2.2 — não é um campo retornado pela API.

2. Estruturas de Dados#

2.1. Contract#

CampoTipoObrigatórioDescrição
idUUIDSimIdentificador único.
companyIdUUIDSimEmpresa.
portfolioIdUUIDSimPortfolio ao qual pertence. Resolvido pelo path.
subPortfolioIdUUIDSimCarteira à qual o contrato pertence. Obrigatório — todo contrato vive em exatamente uma carteira do seu portfolio. Para mover entre carteiras, sobrescrever o valor via PATCH (não permitido null).
templateIdUUIDSimTemplate usado na criação. Imutável.
typeEnumSimTipo base herdado do template. Imutável. CPR_PHYSICAL, CPR_FINANCIAL, INVOICE, PURCHASE_SALE_CONTRACT, CCB, PROMISSORY_NOTE, OTHER.
typeDescriptionStringCondicionalDescrição quando type = OTHER. Obrigatório nesse caso.
codeStringSimCódigo do contrato (ex: CT-2024-001). Único por portfolio. Sugerido automaticamente, editável.
descriptionStringSimDescrição comercial (ex: "CPR Física — Soja Safra 24/25 — Fazenda Tijucal").
valueDecimalSimValor total em BRL.
currencyEnumSimBRL, USD, COMMODITY_LINKED. Default: BRL.
startDateDateTimeSimData de início de vigência.
endDateDateTimeSimData de fim de vigência. Deve ser posterior a startDate.
paymentPeriodicityEnumNãoMONTHLY, BIMONTHLY, QUARTERLY, SEMIANNUAL, ANNUAL, SINGLE, HARVEST, CUSTOM.
periodicityDescriptionStringCondicionalObrigatório quando paymentPeriodicity = CUSTOM ou HARVEST.
interestRateDecimalCondicionalTaxa de juros. Obrigatoriedade condicionada pelo schema do tipo base.
interestRateTypeEnumCondicionalMONTHLY, ANNUAL. Obrigatório quando interestRate informado.
interestCalculationMethodEnumCondicionalSIMPLE, COMPOUND. Default: SIMPLE. Obrigatório quando interestRate informado.
correctionIndexEnumNãoIGPM, IPCA, CDI, SELIC, INPC, NONE. Default: NONE.
correctionIndexSpreadDecimalCondicionalSpread sobre o índice. Permitido apenas quando correctionIndex != NONE.
finePercentageDecimalNãoPercentual de multa por atraso para pagamentos deste contrato.
dailyInterestPercentageDecimalNãoJuros de mora diário para pagamentos deste contrato.
daysToDefaultIntegerNãoPrazo em dias após o vencimento que define a transição automática para DEFAULTED (parcela e contrato). Quando omitido, a transição automática não ocorre — DEFAULTED só por marcação manual.
typeSpecificFieldsObjectCondicionalCampos do tipo base (camada 2). Validados contra schema da plataforma.
customFieldsObjectCondicionalCampos customizados do template (camada 3). Validados contra definição do template.
notesStringNãoObservações livres.
originContractIdUUIDNãoContrato original quando este é resultado de renegociação.
statusEnumSimDRAFT, ACTIVE, OVERDUE, CLOSED, DEFAULTED, RENEGOTIATED, CANCELLED.
createdByObjectSimUsuário que criou, hidratado: { id, name }. No armazenamento permanece como UUID flat.
createdAtDateTime (ISO 8601 UTC)SimData de criação.
updatedAtDateTime (ISO 8601 UTC)SimData da última atualização.
closedAtDateTime (ISO 8601 UTC)NãoData de encerramento.
cancelledAtDateTime (ISO 8601 UTC)NãoData de cancelamento.

2.2. 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 do status, conforme a tabela abaixo. Esta tabela serve de "contrato de tradução" entre back e front — não é um campo retornado pela API.
status (backend)Label exibida (frontend)
DRAFT"Rascunho"
ACTIVE"Ativo"
OVERDUE"Em atraso"
DEFAULTED"Inadimplente"
CLOSED"Encerrado"
RENEGOTIATED"Renegociado"
CANCELLED"Cancelado"

2.3. ContractHistory#

Registra alterações do contrato. Imutável após criação. Cada entrada tem um type que distingue alterações de campos (PATCH) de eventos de participantes.
CampoTipoDescrição
idUUIDIdentificador único.
contractIdUUIDContrato.
typeEnumTipo do evento: FIELD_CHANGE, PARTICIPANT_ADDED, PARTICIPANT_REMOVED.
changedByObjectUsuário que executou a alteração, hidratado: { id, name }. No armazenamento permanece como UUID flat.
changedAtDateTime (ISO 8601 UTC)Data/hora.
changesArrayAplicável quando type = FIELD_CHANGE. Lista de { field, previousValue, newValue }. Para typeSpecificFields, notação typeSpecificFields.campo. Para customFields, notação customFields.key.
participantEventObjectAplicável quando type é evento de participante. Estrutura: { participantId, role, clientId } (campos relevantes conforme o tipo do evento).
Eventos de participante:
typePayload em participantEvent
PARTICIPANT_ADDEDparticipantId, role, clientId
PARTICIPANT_REMOVEDparticipantId, role, clientId
Alterações de status do contrato não são registradas no histórico — rastreadas via closedAt, cancelledAt e logs de transição do scheduler (ver Pagamentos.md para mecânica equivalente em parcelas).

2.4. Ciclo de vida#

DRAFT ──► ACTIVE ◄──► OVERDUE ──► DEFAULTED ──► CLOSED / RENEGOTIATED / CANCELLED
              │                              ▲
              └──────────────────────────────┘
              (ACTIVE também pode ir direto a CLOSED / RENEGOTIATED / CANCELLED)
              (OVERDUE volta a ACTIVE quando todas as parcelas em atraso são liquidadas
               antes da inadimplência ser formalizada)
DRAFT ──► CANCELLED
TransiçãoPré-condiçõesMecanismo
DRAFT → ACTIVEAo menos um pagamento vinculado. Ao menos um participante DEBTOR.Manual (via PUT /status).
DRAFT → CANCELLEDNenhuma.Manual.
ACTIVE → OVERDUEAo menos uma parcela em OVERDUE ou DEFAULTED.Automático via job (Contrato → OVERDUE).
OVERDUE → ACTIVENenhuma parcela em OVERDUE ou DEFAULTED (todas regularizadas).Automático via job.
OVERDUE → DEFAULTEDAo menos uma parcela em DEFAULTED, ou prazo daysToDefault do contrato ultrapassado por alguma parcela vencida.Automático via job (Contrato → DEFAULTED) ou marcação manual.
ACTIVE → DEFAULTEDMarcação operacional explícita (raro — geralmente passa por OVERDUE antes).Manual.
ACTIVE/OVERDUE/DEFAULTED → CLOSEDTodos os pagamentos PAID ou CANCELLED.Manual (via PUT /status).
ACTIVE/OVERDUE → RENEGOTIATEDoriginContractId informado no body.Manual.
ACTIVE/OVERDUE → CANCELLEDNenhuma.Manual.

3. Regras de Negócio#

Template e tipo#

RN-CONT-001: Seleção obrigatória de template
Na criação, o usuário seleciona um ContractTemplate. O type é herdado automaticamente do baseType do template. Erro: TEMPLATE_REQUIRED.
RN-CONT-001B: Carteira obrigatória
Todo contrato deve ser criado dentro de uma carteira específica do seu portfolio — o campo subPortfolioId é obrigatório no POST. Não é permitido criar contrato direto no portfolio sem informar carteira. Erro: SUB_PORTFOLIO_REQUIRED. A carteira informada deve pertencer ao mesmo portfolio do contrato e estar ativa.
RN-CONT-002: Template e tipo imutáveis
Os campos templateId e type não podem ser alterados via PATCH. Erros: CONTRACT_TEMPLATE_IMMUTABLE, CONTRACT_TYPE_IMMUTABLE.
RN-CONT-003: Validação de typeSpecificFields
Campos de typeSpecificFields são validados contra o schema do tipo base. Campos REQUIRED ausentes geram erro MISSING_TYPE_SPECIFIC_FIELD. Valores inválidos geram erro INVALID_TYPE_SPECIFIC_FIELD.
RN-CONT-004: Validação de customFields
Campos de customFields são validados contra a definição do template. Campos condicionais ocultos por regra não são validados. Ver regras em ContractTemplates.md.
RN-CONT-005: Juros condicionais ao tipo
Tipos que definem interestRate.visibility = HIDDEN rejeitam o campo se informado. Erro: INTEREST_RATE_NOT_ALLOWED. Tipos com REQUIRED exigem o preenchimento.

Código e datas#

RN-CONT-006: Código automático e único
Sugerido no formato CT-{ano}-{sequencial}, único por portfolio. Editável. Erro: CONTRACT_CODE_ALREADY_EXISTS.
RN-CONT-007: Consistência de datas
endDate deve ser posterior a startDate. Erro: INVALID_DATE_RANGE.

Valor e pagamentos#

RN-CONT-008: Consistência de valor total
Ao vincular pagamentos (parcelas), o sistema verifica se a soma dos amount.total corresponde ao value do contrato. Divergências geram alerta TOTAL_VALUE_MISMATCH (não bloqueante).
RN-CONT-009: Pré-condição para ativação
DRAFT → ACTIVE requer ao menos um pagamento (parcela) vinculado E ao menos um participante com role = DEBTOR. Erros: CONTRACT_HAS_NO_PAYMENTS, CONTRACT_HAS_NO_DEBTOR.
RN-CONT-010: Pré-condição para encerramento
ACTIVE → CLOSED requer todos os pagamentos PAID ou CANCELLED. Erro: CONTRACT_HAS_OPEN_PAYMENTS.
RN-CONT-011: Transição automática para OVERDUE
Job diário (Contrato → OVERDUE, ver Visão Geral, seção 11) move contratos ACTIVE para OVERDUE quando ao menos uma parcela vinculada está em status OVERDUE ou DEFAULTED. A transição inversa (OVERDUE → ACTIVE) ocorre quando todas as parcelas em atraso são regularizadas antes da formalização da inadimplência.
RN-CONT-012: Transição para DEFAULTED
A transição para DEFAULTED ocorre por uma das três condições:
(a) Ao menos uma parcela do contrato atinge DEFAULTED (parcela em atraso por mais de daysToDefault dias, conforme configuração do contrato);
(b) Job diário (Contrato → DEFAULTED) detecta que o prazo daysToDefault foi ultrapassado para alguma parcela vencida;
(c) Marcação manual pelo usuário via PUT /status, quando a operação reconhece formalmente a inadimplência antes do prazo.
Quando daysToDefault não está configurado no contrato, a transição automática (b) não ocorre — DEFAULTED só por (a) ou (c).

Renegociação#

RN-CONT-013: Renegociação
ACTIVE → RENEGOTIATED ou OVERDUE → RENEGOTIATED exige originContractId no body. Erro: MISSING_ORIGIN_CONTRACT_ID. Todos os pagamentos em aberto do contrato original são movidos para RENEGOTIATED simultaneamente.

Imutabilidade#

RN-CONT-014: Imutabilidade após encerramento
Contratos CLOSED, DEFAULTED, RENEGOTIATED ou CANCELLED são read-only. Erro: CONTRACT_IMMUTABLE.
RN-CONT-015: value editável com histórico
Após ativação, alterações em value geram registro em ContractHistory e alerta de divergência se aplicável.

Encargos#

RN-CONT-016: Encargos definidos no contrato
finePercentage e dailyInterestPercentage são configuração de encargos para os pagamentos (parcelas) deste contrato. Quando não informados, os encargos correspondentes não são calculados. Não existe hierarquia multi-nível — o contrato é a fonte única.
RN-CONT-017: paymentDefaults do template
O schema define paymentDefaults que condiciona se juros, multa e desconto são aplicáveis. Quando interestApplicable = false (ex: CPR_PHYSICAL), juros não são calculados independente da configuração do contrato. O usuário pode sobrescrever no momento da baixa (ver Baixas.md).

Correção monetária#

RN-CONT-018: Correção monetária informativa
Quando correctionIndex != NONE, o correctedNominalAmount dos pagamentos é calculado em tempo de leitura (informativo). A correção efetiva é aplicada na baixa (ver Baixas.md).

Exclusão e histórico#

RN-CONT-019: Exclusão lógica
Contratos nunca são deletados fisicamente.
RN-CONT-020: Histórico de alterações
Toda alteração via PATCH gera registro em ContractHistory com type = FIELD_CHANGE, incluindo campos de typeSpecificFields e customFields.

4. Padrão de Erros#

Códigos de erro específicos#

StatusCódigoDescrição
404CONTRACT_NOT_FOUNDContrato não encontrado no portfolio.
409CONTRACT_CODE_ALREADY_EXISTSCódigo duplicado no portfolio.
422TEMPLATE_REQUIREDtemplateId ausente.
422SUB_PORTFOLIO_REQUIREDsubPortfolioId ausente ou null. Toda criação de contrato exige carteira de destino.
422SUB_PORTFOLIO_INACTIVECarteira informada está inativa.
422TEMPLATE_INACTIVETemplate inativo.
422CONTRACT_TEMPLATE_IMMUTABLETentativa de alterar templateId.
422CONTRACT_TYPE_IMMUTABLETentativa de alterar type.
422INVALID_DATE_RANGEendDate anterior ou igual a startDate.
422MISSING_TYPE_DESCRIPTIONtype = OTHER sem descrição.
422MISSING_PERIODICITY_DESCRIPTIONPeriodicidade CUSTOM/HARVEST sem descrição.
422MISSING_INTEREST_RATE_TYPEinterestRate sem interestRateType/interestCalculationMethod.
422INTEREST_RATE_NOT_ALLOWEDinterestRate para tipo com HIDDEN.
422MISSING_TYPE_SPECIFIC_FIELDCampo obrigatório do tipo base ausente.
422INVALID_TYPE_SPECIFIC_FIELDCampo do tipo base com valor inválido.
422MISSING_CUSTOM_FIELDCampo obrigatório do template ausente.
422INVALID_CUSTOM_FIELD_VALUECampo customizado com valor inválido.
422INVALID_CORRECTION_INDEX_SPREADSpread sem índice.
422CONTRACT_HAS_NO_PAYMENTSAtivação sem pagamentos (parcelas).
422CONTRACT_HAS_NO_DEBTORAtivação sem devedor.
422CONTRACT_HAS_OPEN_PAYMENTSEncerramento com pagamentos em aberto.
422INVALID_STATUS_TRANSITIONTransição não permitida.
422CONTRACT_IMMUTABLEContrato em status final.
422MISSING_ORIGIN_CONTRACT_IDRenegociação sem originContractId.
422INVALID_ORIGIN_CONTRACToriginContractId inválido.
422TOTAL_AMOUNT_MISMATCHSoma dos pagamentos diverge (alerta).
422INVALID_EXPORT_FORMATFormato não suportado.

5. Endpoints#

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

POST .../contracts#

Cria um contrato em DRAFT. O type é herdado do template. Participantes podem ser incluídos inline ou adicionados depois.
Permissão: contract:create
Request body:
{
  "templateId": "tpl-001",
  "subPortfolioId": "subport-001",
  "code": "CPR-2024-001",
  "description": "CPR Física — Soja Safra 24/25 — Fazenda Tijucal",
  "value": 450000.00,
  "currency": "COMMODITY_LINKED",
  "startDate": "2026-05-13T13:32:32.209+00:00",
  "endDate": "2026-05-13T13:32:32.209+00:00",
  "paymentPeriodicity": "HARVEST",
  "periodicityDescription": "Liquidação integral na colheita da safra 2024/2025.",
  "correctionIndex": "NONE",
  "finePercentage": 2.0,
  "daysToDefault": 30,
  "typeSpecificFields": {
    "crop": "SOYBEAN",
    "harvestSeason": "2024/2025",
    "expectedQuantity": 7500,
    "quantityUnit": "BAGS_60KG",
    "deliveryLocation": "Armazém Cooperativa — Lucas do Rio Verde/MT",
    "deliveryDeadline": "2026-05-13T13:32:32.209+00:00",
    "productPriceAtContract": 120.50,
    "priceUnit": "PER_BAG_60KG"
  },
  "customFields": {
    "variedadeSoja": "TMG7062",
    "areaCultivada": 500.0,
    "produtividadeEstimada": 65.0,
    "cprRegistrada": true,
    "codigoCartorio": "1º Cartório de Lucas do Rio Verde"
  },
  "participants": [
    { "clientId": "client-006", "role": "CREDITOR", "isPrimary": true },
    { "clientId": "client-002", "role": "DEBTOR", "isPrimary": true, "notes": "Devedor principal" },
    { "clientId": "client-004", "role": "GUARANTOR", "isPrimary": true, "notes": "Avalista" }
  ],
  "collaterals": [ 
	  { "category": "REAL", 
		"type": "AGRICULTURAL_PLEDGE", 
		"name": "Penhor safra soja 24/25 — Fazenda Tijucal", 
		"description": "Penhor sobre 500 ha, matrícula 12345 do CRI de Lucas do Rio Verde/MT.", 
		"estimatedValue": 1950000.00, 
		"expirationDate": "2025-06-30", 
		"registrationNumber": "REG-2024-78945", 
		"notes": "Penhor registrado em 15/03/2024." 
		}, 
		{ "category": "FIDEJUSSORY", 
		  "type": "SURETY", 
		  "name": "Aval João Silva", 
		  "description": "Aval pessoal do sócio majoritário da Fazenda Tijucal.", "estimatedValue": 500000.00, 
		  "guarantor": {"id": "client-004"}, 
		  "notes": "Aval limitado a R$ 500.000." } 
		  ],
  "notes": "CPR registrada em cartório."
}
Response 201 Created:
{
  "id": "contract-001",
  "companyId": "company-001",
  "portfolioId": "portfolio-001",
  "subPortfolioId": "subport-001",
  "template": {
    "id": "tpl-001",
    "name": "CPR Soja — Safra"
  },
  "type": "CPR_PHYSICAL",
  "typeDescription": null,
  "code": "CPR-2024-001",
  "description": "CPR Física — Soja Safra 24/25 — Fazenda Tijucal",
  "amounts": { "total": 450000.00, "paid": 250000.00, "open": 200000.00, "overdue": 50000.00 }, 
  "payments": { "total": 12, "paid": 5, "overdue": 1 },
  "currency": "COMMODITY_LINKED",
  "startDate": "2026-05-13T13:32:32.209+00:00",
  "endDate": "2026-05-13T13:32:32.209+00:00",
  "paymentPeriodicity": "HARVEST",
  "periodicityDescription": "Liquidação integral na colheita da safra 2024/2025.",
  "interestRate": null,
  "interestRateType": null,
  "interestCalculationMethod": null,
  "correctionIndex": "NONE",
  "correctionIndexSpread": null,
  "finePercentage": 2.0,
  "dailyInterestPercentage": null,
  "daysToDefault": 30,
  "typeSpecificFields": {
    "crop": "SOYBEAN",
    "harvestSeason": "2024/2025",
    "expectedQuantity": 7500,
    "quantityUnit": "BAGS_60KG",
    "deliveryLocation": "Armazém Cooperativa — Lucas do Rio Verde/MT",
    "deliveryDeadline": "2025-04-15",
    "productPriceAtContract": 120.50,
    "priceUnit": "PER_BAG_60KG"
  },
  "customFields": {
    "variedadeSoja": "TMG7062",
    "areaCultivada": 500.0,
    "produtividadeEstimada": 65.0,
    "producaoTotalEstimada": 32500,
    "cprRegistrada": true,
    "codigoCartorio": "1º Cartório de Lucas do Rio Verde"
  },
  "notes": "CPR registrada em cartório.",
  "status": "DRAFT",
  "originContractId": null,
  "primaryDebtor": {
    "client": {
      "id": "client-002",
      "name": "Fazenda Tijucal",
      "taxId": "12345678000190"
    }
  },
  "participants": [
    { "clientId": "client-006", "type": "CREDITOR", "isPrimary": true, "name": "Thiago", "taxId": "12314124" },
    { "clientId": "client-002", "type": "DEBTOR", "isPrimary": true, "notes": "Devedor principal", "name": "Pedro", "taxId": "12314124"  },
    { "clientId": "client-004", "type": "GUARANTOR", "isPrimary": true, "notes": "Avalista", "name": "João", "taxId": "12314124"  }
  ],
  "participantsSummary": {
    "creditors": 1,
    "debtors": 1,
    "guarantors": 1
  },
  "collaterals": { 
	  "items": [ 
		  { "id": "col-001", 
			"category": "REAL", 
			"type": "AGRICULTURAL_PLEDGE", 
			"typeDescription": null, 
			"name": "Penhor safra soja 24/25 — Fazenda Tijucal", 
			"description": "Penhor sobre 500 ha, matrícula 12345 do CRI de Lucas do Rio Verde/MT.", 
			"estimatedValue": 1950000.00, 
			"expirationDate": "2025-06-30", 
			"registrationNumber": "REG-2024-78945", 
			"guarantor": null, 
			"attachments": [], 
			"notes": "Penhor registrado em 15/03/2024.", 
			"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" }, 
		{ "id": "col-002", 
		  "category": "FIDEJUSSORY", 
		  "type": "SURETY", 
		  "typeDescription": null, 
		  "name": "Aval João Silva", 
		  "description": "Aval pessoal do sócio majoritário da Fazenda Tijucal.", 
		  "estimatedValue": 500000.00, 
		  "expirationDate": null, 
		  "registrationNumber": null, 
		  "guarantor": 
			  { "id": "client-004", 
			    "name": "João Silva", 
			    "taxId": "12345678900" }, 
		  "attachments": [], 
		  "notes": "Aval limitado a R$ 500.000.", 
		  "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" } ], 
	"summary": 
		{ "total": 2, 
		  "real": 1, 
		  "fidejussory": 1, 
		  "value": 2450000.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",
  "closedAt": null,
  "cancelledAt": null
}
O campo producaoTotalEstimada foi calculado automaticamente pela regra ON_CALCULATE do template (área × produtividade).
Os campos dentro de customFields serão os campos apresentados dentro de "Informações Adicionais" nos detalhes do contrato.

GET .../contracts#

Lista contratos do subPortfolio.
Permissão: contract:read
Query params:
ParâmetroTipoObrigatórioDescrição
searchStringNãoBusca por code, description ou nome do devedor principal.
statusEnum (multi)NãoFiltrar por status.
typeEnum (multi)NãoFiltrar por tipo.
templateIdUUIDNãoFiltrar por template.
clientIdUUIDNãoFiltrar contratos onde o Client é participante (qualquer role).
startDateDatetime (ISO)NãostartDate >=.
endDateDatetime (ISO)NãoendDate <=.
cropEnumNãoFiltrar por cultura (dentro de typeSpecificFields.crop).
harvestSeasonStringNãoFiltrar por safra.
orderByEnumNãoOrdenação: code, startDate, endDate, value, createdAt. Default: createdAt.
orderEnumNãoasc ou desc. Default: desc.
offsetIntegerNãoDefault: 0.
limitIntegerNãoDefault: 20. Máximo: 100.
Response 200 OK:
{
  "items": [
    {
      "id": "contract-001",
      "code": "CPR-2024-001",
      "type": "CPR_PHYSICAL",
      "template": {
        "id": "tpl-001",
        "name": "CPR Soja — Safra"
      },
      "description": "CPR Física — Soja Safra 24/25 — Fazenda Tijucal",
      "amounts": {
        "value": 450000.00,
        "open": 50000.00,
        "overdue": 30000.00
      },
      "currency": "COMMODITY_LINKED",
      "startDate": "2024-03-01",
      "endDate": "2025-04-30",
      "status": "OVERDUE",
      "primaryDebtor": {
        "client": {
          "id": "client-002",
          "name": "Fazenda Tijucal",
          "taxId": "12345678000190"
        }
      },
      "participantsSummary": {
        "creditors": 1,
        "debtors": 1,
        "guarantors": 1
      },
      "collaterals": {
        "total": 2,
        "value": 2450000.00
      },
      "payments": {
        "total": 3,
        "paid": 1,
        "pending": 2,
        "overdue": 0
      },
      "typeSpecificFields": {
        "crop": "SOYBEAN",
        "harvestSeason": "2024/2025"
      },
      "createdAt": "2025-03-17T09:00:00.000+00:00",
      "updatedAt": "2025-03-17T09:00:00.000+00:00"
    }
  ],
  "nextPage": false
}
Na listagem, typeSpecificFields retorna apenas campos resumidos (crop, harvestSeason, invoiceNumber, ccbNumber, noteNumber — conforme tipo). customFields não é retornado na listagem.

GET .../contracts/:contractId#

Detalhe completo.
Permissão: contract:read
Response 200 OK: Mesmo formato do POST response com todos os campos. Inclui participants completo (array com todos os participantes e dados do Client), typeSpecificFields completo e customFields completo.

PATCH .../contracts/:contractId#

Atualiza dados. Permitido para contratos em status = DRAFT, ACTIVE ou OVERDUE. Os campos templateId, type e portfolioId são imutáveis.
Permissão: contract:update
Campos editáveis: subPortfolioId, code, description, value, currency, startDate, endDate, paymentPeriodicity, periodicityDescription, interestRate, interestRateType, interestCalculationMethod, correctionIndex, correctionIndexSpread, finePercentage, dailyInterestPercentage, daysToDefault, typeSpecificFields, customFields, notes.
Movimentação entre carteiras. Para mover o contrato para outra carteira do mesmo portfolio, enviar subPortfolioId com o ID da nova carteira no body. Não é permitido subPortfolioId = null — todo contrato sempre pertence a uma carteira. Permissão adicional necessária: portfolio:assign_contract (ver Carteiras.md).
Request body (exemplo):
{
  "description": "CPR Física — Soja Safra 24/25 — Revisado",
  "subPortfolioId": "subport-001",
  "daysToDefault": 45,
  "typeSpecificFields": {
    "expectedQuantity": 8000,
    "deliveryDeadline": "2025-05-01"
  },
  "customFields": {
    "areaCultivada": 600.0,
    "produtividadeEstimada": 65.0
  },
  "notes": "Aditivo assinado em 20/03/2025."
}
Response 200 OK: Contrato atualizado completo.
Erros: CONTRACT_IMMUTABLE, CONTRACT_TEMPLATE_IMMUTABLE, CONTRACT_TYPE_IMMUTABLE, CONTRACT_CODE_ALREADY_EXISTS, INVALID_DATE_RANGE, MISSING_TYPE_SPECIFIC_FIELD, INVALID_TYPE_SPECIFIC_FIELD, MISSING_CUSTOM_FIELD, INVALID_CUSTOM_FIELD_VALUE, CONTRACT_PORTFOLIO_MISMATCH (quando subPortfolioId não pertence ao portfolio do contrato).

PUT .../contracts/:contractId/status#

Substitui o status do contrato. Usado para transições manuais (ativação, encerramento, renegociação, cancelamento, marcação manual de inadimplência).
Permissão: contract:update
Request body — ativação:
{
  "status": "ACTIVE"
}
Request body — marcação manual de inadimplência:
{
  "status": "DEFAULTED",
  "reason": "Cliente comunicou impossibilidade de pagamento."
}
Request body — renegociação:
{
  "status": "RENEGOTIATED",
  "originContractId": "contract-new-001",
  "reason": "Renegociação de prazo após frustração de safra."
}
Response 200 OK:
{
  "id": "contract-001",
  "status": "ACTIVE",
  "updatedAt": "2025-03-17T10:00:00.000+00:00"
}
Erros: INVALID_STATUS_TRANSITION, CONTRACT_HAS_NO_PAYMENTS, CONTRACT_HAS_NO_DEBTOR, CONTRACT_HAS_OPEN_PAYMENTS, MISSING_ORIGIN_CONTRACT_ID, INVALID_ORIGIN_CONTRACT.

GET .../contracts/:contractId/history#

Histórico de alterações e eventos do contrato. Inclui mudanças de campo (PATCH) e eventos de participantes (adição, remoção).
Permissão: contract:read
Query params: Paginação padrão (offset / limit).
Response 200 OK:
{
  "items": [
    {
      "id": "hist-001",
      "contractId": "contract-001",
      "type": "FIELD_CHANGE",
      "changedBy": {
        "id": "8c3f1a2b-...",
        "name": "João Silva"
      },
      "changedAt": "2025-03-20T14:00:00.000+00:00",
      "changes": [
        { "field": "typeSpecificFields.expectedQuantity", "previousValue": 7500, "newValue": 8000 },
        { "field": "customFields.areaCultivada", "previousValue": 500.0, "newValue": 600.0 },
        { "field": "notes", "previousValue": "CPR registrada em cartório.", "newValue": "Aditivo assinado em 20/03/2025." }
      ]
    },
    {
      "id": "hist-002",
      "contractId": "contract-001",
      "type": "PARTICIPANT_ADDED",
      "changedBy": {
        "id": "8c3f1a2b-...",
        "name": "João Silva"
      },
      "changedAt": "2025-03-22T10:00:00.000+00:00",
      "participantEvent": {
        "participantId": "part-005",
        "role": "GUARANTOR",
        "clientId": "client-007"
      }
    },
    {
      "id": "hist-003",
      "contractId": "contract-001",
      "type": "PARTICIPANT_ADDED",
      "changedBy": {
        "id": "8c3f1a2b-...",
        "name": "João Silva"
      },
      "changedAt": "2025-03-22T10:00:00.000+00:00",
      "participantEvent": {
        "participantId": "part-005",
        "role": "GUARANTOR",
        "clientId": "client-007"
      }
    }
  ],
  "nextPage": false
}

GET .../contracts/export#

Exporta listagem em CSV ou XLSX. Mesmos filtros da listagem + format.
Permissão: contract:read
Colunas incluem campos comuns, typeSpecificFields aplicáveis ao tipo, devedor principal, garantias (nomes concatenados) e contadores.

6. Permissões RBAC#

ResourceDomínioActions
contractTENANTcreate, read, update
A gestão de participantes utiliza o mesmo resource contract — contract:update cobre adição/remoção de participantes.

7. Referências cruzadas#

MóduloComo se relaciona com Contratos
Participantes.mdCredores, devedores, garantidores do contrato. clientId foi substituído por participantes.
Pagamentos.mdParcelas/obrigações de pagamento vinculadas ao contrato.
Baixas.mdRegistros de liquidação dos pagamentos.
Colaterais.mdGarantias reais e fidejussórias como sub-recurso do contrato (1:N).
ContractTemplates.mdTemplate que define a estrutura do formulário e comportamento.
Carteiras.mdPortfolio e carteira aos quais o contrato pertence. Ambos obrigatórios.
Modificado em 2026-06-02 15:00:28
Página anterior
Gestão da carteira
Próxima página
Template Contratos
Built with