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

Template Contratos

Templates de Contrato — Regras de Negócio#

1. Conceito#

O Template de Contrato (ContractTemplate) é a estrutura que define a experiência de cadastro de um contrato na plataforma. Ele combina um tipo base pré-definido pela plataforma (CPR Física, CCB, Duplicata, etc.) com campos customizados definidos pela empresa, organizados em seções visuais e com suporte a regras condicionais e cálculos automáticos.
A plataforma fornece tipos base com campos obrigatórios fixos que garantem a integridade do instrumento jurídico. Por cima desses campos, a empresa adiciona campos customizados agrupados em seções, com comportamento dinâmico via regras.
Uma empresa pode ter múltiplos templates para o mesmo tipo base. Por exemplo:
Template "CPR Soja" (tipo base: CPR_PHYSICAL) — com campos agronômicos de soja
Template "CPR Café" (tipo base: CPR_PHYSICAL) — com campos específicos de café

1.1. Arquitetura em 3 camadas com snapshot#

┌─────────────────────────────────────────────────┐
│  Camada 1 — Campos comuns do contrato           │  Definidos pela plataforma
│  (code, description, total, dates, etc.)        │  no ContractFieldDictionary.
│                                                 │  Capturados via snapshot
│                                                 │  na criação do template.
├─────────────────────────────────────────────────┤
│  Camada 2 — Campos do tipo base                 │  Definidos pela plataforma
│  (baseTypeFields)                               │  no ContractFieldDictionary,
│  Ex: CPR_PHYSICAL → safra, cultura, entrega     │  por baseType. Capturados
│                                                 │  via snapshot na criação.
├─────────────────────────────────────────────────┤
│  Camada 3 — Campos customizados da empresa      │  Configurados pela empresa
│  (customFields)                                 │  no template. Organizados
│  Ex: variedade, área cultivada, laudo           │  em seções, com regras.
└─────────────────────────────────────────────────┘
No momento da criação do template, o backend copia (snapshot) as camadas 1 e 2 do ContractFieldDictionary (ver seção 5) e acrescenta a camada 3 configurada pela empresa. O template fica autocontido — carrega tudo o que precisa para validar contratos.
Alterações posteriores do dictionary pela plataforma não afetam templates existentes — só novos templates pegam o dictionary atualizado. A empresa pode optar por atualizar um template para o dictionary mais recente via endpoint dedicado (ver seção 8).

1.2. Inspiração no modelo AgFlow#

O sistema de campos customizados segue os padrões do AgFlow (start-forms / phase-fields), adaptados ao contexto de contratos:
Conceito AgFlowEquivalente no template de contrato
Start FormTemplate de contrato
Seções (sectionMetadata)Seções do template (sections)
Campos do formuláriocustomFields do template
Rules (onChange, onCalculate, onLoad)rules do template
Campos condicionais (category)category: "conditional" nos custom fields

2. Estruturas de Dados#

2.1. ContractTemplate#

CampoTipoObrigatórioDescrição
idUUIDSimIdentificador único do template.
companyIdUUIDSimEmpresa à qual o template pertence. Todo template tem uma empresa proprietária.
baseTypeEnumSimTipo base: CPR_PHYSICAL, CPR_FINANCIAL, INVOICE, PURCHASE_SALE_CONTRACT, CCB, PROMISSORY_NOTE, OTHER. Imutável após criação.
nameStringSimNome do template. Único por empresa.
descriptionStringNãoDescrição do propósito.
commonFieldsArraySimSnapshot da camada 1 capturado do ContractFieldDictionary na criação. Ver seção 5.
baseTypeFieldsArraySimSnapshot da camada 2 capturado do ContractFieldDictionary na criação. Array vazio quando baseType = OTHER. Ver seção 5.
sectionsArray<TemplateSection>NãoSeções visuais para agrupamento dos campos customizados (camada 3). Ver seção 2.2.
customFieldsArray<CustomFieldDefinition>NãoCampos customizados (camada 3). Ver seção 2.3.
rulesArray<FieldRule>NãoRegras condicionais e cálculos (camada 3). Ver seção 2.5.
allowedPaymentTypesArray<Enum>SimSnapshot dos tipos de pagamento permitidos, capturado do dictionary na criação.
paymentDefaultsObjectSimSnapshot dos defaults de aplicabilidade de encargos, capturado do dictionary na criação.
dictionaryVersionIntegerSimVersão do ContractFieldDictionary capturada na criação ou no último refresh.
dictionarySnapshotAtDateTime (ISO 8601 UTC)SimData/hora do último snapshot do dictionary (criação ou refresh).
statusEnumSimACTIVE, INACTIVE.
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.

2.2. TemplateSection#

Agrupamento visual de campos customizados. Campos com o mesmo sectionId são exibidos juntos na interface.
CampoTipoObrigatórioDescrição
idUUIDSimIdentificador único da seção. Gerado automaticamente.
titleStringSimTítulo da seção exibido na interface (ex: "Dados agronômicos", "Documentos").
descriptionStringNãoDescrição auxiliar da seção.
orderIntegerSimOrdem de exibição da seção no formulário. Começa em 1.

2.3. CustomFieldDefinition#

Define um campo customizado dentro do template.
CampoTipoObrigatórioDescrição
idUUIDSimIdentificador único do campo. Gerado automaticamente na criação. Obrigatório em atualizações — sem ele, a API cria campo duplicado.
sectionIdUUIDNãoSeção à qual o campo pertence. null para campos fora de seção (exibidos no topo).
keyStringSimChave técnica (camelCase, sem espaços). Única no template. Não pode colidir com campos do tipo base. Usada como chave no customFields do contrato.
labelStringSimLabel exibido na interface.
fieldTypeEnumSimTipo do campo. Ver seção 2.4.
requiredBooleanSimSe obrigatório na criação do contrato. Pode ser sobrescrito por regra setRequired/setOptional.
editableBooleanSimtrue = editável pelo usuário. false = somente leitura (usado para campos calculados). Default: true.
activeBooleanSimtrue = campo visível. false = desativado (não aparece no formulário nem na validação). Default: true.
categoryEnumSim"default" = sempre visível. "conditional" = oculto por padrão, controlado por regras. Default: "default".
helpTextStringNãoTexto de instrução exibido abaixo do campo.
placeholderStringNãoPlaceholder do campo no formulário.
defaultValueAnyNãoValor padrão estático. Para inicialização dinâmica, usar regra onLoad.
optionsArray<FieldOption>CondicionalOpções para SELECT, MULTI_SELECT, RADIO. Obrigatório nesses tipos. Mínimo: 2 opções.
validationObjectNãoRegras de validação adicionais. Ver seção 2.6.
orderIntegerSimOrdem do campo dentro da seção (ou do topo, se sem seção). Começa em 1.

2.4. Tipos de campo (fieldType)#

TipoDescriçãoValor armazenadoObservação
TEXTTexto curto (uma linha).String—
TEXT_AREATexto longo (múltiplas linhas).String—
NUMBERNúmero decimal.DecimalIdeal para área em hectares, percentuais.
INTEGERNúmero inteiro.Integer—
CURRENCYValor monetário (BRL).DecimalExibido com máscara R$.
DATEData sem hora.Date (ISO)—
BOOLEANSim/Não.Boolean—
SELECTDropdown de seleção única.String (value da opção)Requer options.
MULTI_SELECTSeleção múltipla (checkboxes).Array<String>Requer options.
RADIOBotões de escolha única.String (value da opção)Equivalente visual ao SELECT. Requer options.
EMAILE-mail com validação de formato.String—
PHONETelefone com máscara.String—
ATTACHMENTUpload de arquivo(s).Object ou Array<Object>. Ver seção 2.7.Aceita PDF, imagens, planilhas.

2.5. FieldRule (Regras condicionais e cálculos)#

Cada regra é vinculada a um campo (via fieldId) e define um gatilho (trigger) com condições e ações.
CampoTipoObrigatórioDescrição
idUUIDSimIdentificador único da regra. Gerado automaticamente.
fieldIdUUIDSimCampo que dispara ou recebe a regra.
triggerEnumSimTipo do gatilho: ON_CHANGE, ON_CALCULATE, ON_LOAD.
activeBooleanSimSe a regra está ativa. Default: true.
operationsArray<RuleOperation>CondicionalCondições e ações. Obrigatório para ON_CHANGE e ON_LOAD.
calculationObjectCondicionalConfiguração de cálculo. Obrigatório para ON_CALCULATE.

2.5.1. Triggers#

TriggerQuando disparaUso principal
ON_CHANGEQuando o valor do campo fieldId muda.Mostrar/ocultar campos condicionais, setar valores, alterar obrigatoriedade.
ON_CALCULATEQuando qualquer campo da expressão é alterado.Calcular soma, multiplicação ou resultado em um campo de destino.
ON_LOADAo abrir o formulário de criação do contrato.Inicializar campos com valor padrão dinâmico.

2.5.2. RuleOperation (para ON_CHANGE e ON_LOAD)#

Múltiplas operations em uma regra são tratadas como OR (qualquer uma verdadeira dispara suas ações). Múltiplas conditions dentro de uma operation são tratadas como AND (todas precisam ser verdadeiras).
CampoTipoDescrição
conditionsArray<RuleCondition>Condições a serem avaliadas. Vazio para ON_LOAD (dispara sempre).
actionsArray<RuleAction>Ações executadas quando as condições são satisfeitas.

2.5.3. RuleCondition#

CampoTipoDescrição
fieldIdUUIDCampo avaliado na condição.
operatorEnumOperador. Ver tabela abaixo.
valueAnyValor de comparação. Tipo depende do operador e do campo.
Operadores disponíveis:
OperadorUsoTipos de campo compatíveis
EQUALSIgual aTodos
NOT_EQUALSDiferente deTodos
GREATER_THANMaior queNUMBER, INTEGER, CURRENCY
LESS_THANMenor queNUMBER, INTEGER, CURRENCY
GREATER_OR_EQUALMaior ou igualNUMBER, INTEGER, CURRENCY
LESS_OR_EQUALMenor ou igualNUMBER, INTEGER, CURRENCY
CONTAINSContém o valorMULTI_SELECT
NOT_CONTAINSNão contémMULTI_SELECT
IS_EMPTYCampo vazioTodos
IS_NOT_EMPTYCampo preenchidoTodos

2.5.4. RuleAction#

CampoTipoDescrição
typeEnumTipo da ação. Ver tabela abaixo.
targetFieldIdUUIDCampo alvo da ação.
valueAnyValor a ser aplicado. Usado com SET_VALUE.
Tipos de ação:
TipoEfeitoObservação
SHOWExibe o campo alvo.Usado com campos category: "conditional".
HIDEOculta o campo alvo.—
SET_REQUIREDTorna o campo alvo obrigatório.—
SET_OPTIONALTorna o campo alvo opcional.—
SET_VALUEPopula o campo alvo com value.—
CLEAR_VALUELimpa o valor do campo alvo.—
Padrão recomendado para pares: Sempre configurar ações complementares. Para mostrar: SHOW + SET_REQUIRED. Para ocultar: HIDE + SET_OPTIONAL + CLEAR_VALUE.

2.5.5. Calculation (para ON_CALCULATE)#

CampoTipoDescrição
expressionStringExpressão matemática usando IDs dos campos como variáveis. Ex: "({cf-001} * {cf-002})". Suporta +, -, *, /, parênteses.
targetFieldIdUUIDCampo de destino que recebe o resultado. Deve ter editable: false.
precisionIntegerCasas decimais do resultado. Default: 2.
Exemplo de campo calculado: "Valor total estimado" = preço por saca × quantidade de sacas.
{
  "fieldId": "cf-price",
  "trigger": "ON_CALCULATE",
  "active": true,
  "calculation": {
    "expression": "({cf-price} * {cf-quantity})",
    "targetFieldId": "cf-total-estimated",
    "precision": 2
  }
}

2.6. Regras de validação (validation)#

RegraTipos aplicáveisDescrição
minLengthTEXT, TEXT_AREAComprimento mínimo.
maxLengthTEXT, TEXT_AREAComprimento máximo.
minNUMBER, INTEGER, CURRENCYValor mínimo.
maxNUMBER, INTEGER, CURRENCYValor máximo.
minDateDATEData mínima.
maxDateDATEData máxima.
maxFileSizeATTACHMENTTamanho máximo em MB. Default plataforma: 10 MB.
allowedFileTypesATTACHMENTArray de extensões aceitas (ex: ["pdf", "jpg", "png"]).
maxFilesATTACHMENTNúmero máximo de arquivos. Default: 1.

2.7. Attachment (referência a arquivo)#

Quando fieldType = ATTACHMENT, o valor armazenado no customFields do contrato é:
{
  "fileId": "file-uuid-001",
  "fileName": "laudo_vistoria.pdf",
  "fileSize": 245000,
  "mimeType": "application/pdf",
  "uploadedBy": "user-uuid",
  "uploadedAt": "2025-03-17T09:00:00.000+00:00",
  "url": "link do bucket" //necessário confirmar
}
Quando maxFiles > 1, o valor é um array de objetos. O upload é feito via endpoint separado de arquivos (fora do escopo deste documento).

2.8. FieldOption (opções de SELECT/MULTI_SELECT/RADIO)#

CampoTipoObrigatórioDescrição
valueStringSimValor armazenado.
labelStringSimLabel exibido.
orderIntegerSimOrdem de exibição.

3. Exemplo Completo: Template "CPR Soja — Safra"#

Nota: O JSON abaixo representa a entidade ContractTemplate como armazenada — autocontida, com snapshot das camadas 1 e 2 capturado do ContractFieldDictionary na criação (ver seção 5) somado à camada 3 configurada pela empresa.
{
  "id": "tpl-001",
  "companyId": "company-001",
  "baseType": "CPR_PHYSICAL",
  "name": "CPR Soja — Safra",
  "description": "Template para CPRs de soja com campos agronômicos e documentos.",
  "status": "ACTIVE",
  "dictionaryVersion": 3,
  "dictionarySnapshotAt": "2025-03-17T09:00:00.000+00:00",
  "commonFields": [
    { "field": "code", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "description", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "total", "type": "DECIMAL", "visibility": "REQUIRED" },
    { "field": "startDate", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "endDate", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "interestRate", "type": "DECIMAL", "visibility": "HIDDEN", "helpText": "CPRs Físicas não possuem taxa de juros." },
    { "field": "paymentPeriodicity", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "HARVEST", "helpText": "Geralmente liquidação na colheita." },
    { "field": "currency", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "COMMODITY_LINKED" }
  ],
  "baseTypeFields": [
    { "field": "crop", "type": "ENUM", "visibility": "REQUIRED", "enumValues": ["SOYBEAN", "CORN", "COTTON", "COFFEE", "SUGARCANE", "WHEAT", "RICE", "OTHER"], "helpText": "Cultura vinculada à CPR." },
    { "field": "harvestSeason", "type": "STRING", "visibility": "REQUIRED", "helpText": "Safra (ex: 2024/2025)." },
    { "field": "expectedQuantity", "type": "DECIMAL", "visibility": "REQUIRED", "helpText": "Quantidade de produto a ser entregue." },
    { "field": "quantityUnit", "type": "ENUM", "visibility": "REQUIRED", "enumValues": ["TONS", "BAGS_60KG", "BAGS_50KG", "ARROBAS", "LITERS", "OTHER"] },
    { "field": "deliveryLocation", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "deliveryDeadline", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "productPriceAtContract", "type": "DECIMAL", "visibility": "OPTIONAL", "helpText": "Preço unitário de referência." },
    { "field": "priceUnit", "type": "ENUM", "visibility": "OPTIONAL", "enumValues": ["PER_TON", "PER_BAG_60KG", "PER_ARROBA"] }
  ],
  "allowedPaymentTypes": ["CPR"],
  "paymentDefaults": {
    "typeDefault": "CPR",
    "interestApplicable": false,
    "fineApplicable": true,
    "discountApplicable": false
  },
  "sections": [
    { "id": "sec-01", "title": "Dados agronômicos", "description": "Informações sobre a cultura e produção.", "order": 1 },
    { "id": "sec-02", "title": "Registro e documentos", "description": null, "order": 2 }
  ],
  "customFields": [
    {
      "id": "cf-001", "sectionId": "sec-01", "key": "variedadeSoja", "label": "Variedade de soja",
      "fieldType": "SELECT", "required": true, "editable": true, "active": true, "category": "default",
      "helpText": "Variedade da soja plantada.",
      "options": [
        { "value": "TMG7062", "label": "TMG 7062 IPRO", "order": 1 },
        { "value": "M8644", "label": "M 8644 IPRO", "order": 2 },
        { "value": "OUTRA", "label": "Outra", "order": 3 }
      ],
      "order": 1
    },
    {
      "id": "cf-002", "sectionId": "sec-01", "key": "variedadeOutraDescricao", "label": "Descrição da variedade",
      "fieldType": "TEXT", "required": false, "editable": true, "active": true, "category": "conditional",
      "helpText": "Informe a variedade quando 'Outra' selecionada.",
      "order": 2
    },
    {
      "id": "cf-003", "sectionId": "sec-01", "key": "areaCultivada", "label": "Área cultivada (hectares)",
      "fieldType": "NUMBER", "required": true, "editable": true, "active": true, "category": "default",
      "validation": { "min": 0.1 },
      "order": 3
    },
    {
      "id": "cf-004", "sectionId": "sec-01", "key": "produtividadeEstimada", "label": "Produtividade estimada (sacas/ha)",
      "fieldType": "NUMBER", "required": false, "editable": true, "active": true, "category": "default",
      "order": 4
    },
    {
      "id": "cf-005", "sectionId": "sec-01", "key": "producaoTotalEstimada", "label": "Produção total estimada (sacas)",
      "fieldType": "NUMBER", "required": false, "editable": false, "active": true, "category": "default",
      "helpText": "Calculado automaticamente: área × produtividade.",
      "order": 5
    },
    {
      "id": "cf-006", "sectionId": "sec-02", "key": "cprRegistrada", "label": "CPR registrada em cartório?",
      "fieldType": "BOOLEAN", "required": true, "editable": true, "active": true, "category": "default",
      "defaultValue": false,
      "order": 1
    },
    {
      "id": "cf-007", "sectionId": "sec-02", "key": "codigoCartorio", "label": "Código do cartório",
      "fieldType": "TEXT", "required": false, "editable": true, "active": true, "category": "conditional",
      "order": 2
    },
    {
      "id": "cf-008", "sectionId": "sec-02", "key": "laudoVistoria", "label": "Laudo de vistoria",
      "fieldType": "ATTACHMENT", "required": false, "editable": true, "active": true, "category": "default",
      "validation": { "maxFileSize": 10, "allowedFileTypes": ["pdf", "jpg", "png"], "maxFiles": 3 },
      "order": 3
    }
  ],
  "rules": [
    {
      "id": "rule-001",
      "fieldId": "cf-001",
      "trigger": "ON_CHANGE",
      "active": true,
      "operations": [
        {
          "conditions": [{ "fieldId": "cf-001", "operator": "EQUALS", "value": "OUTRA" }],
          "actions": [
            { "type": "SHOW", "targetFieldId": "cf-002" },
            { "type": "SET_REQUIRED", "targetFieldId": "cf-002" }
          ]
        },
        {
          "conditions": [{ "fieldId": "cf-001", "operator": "NOT_EQUALS", "value": "OUTRA" }],
          "actions": [
            { "type": "HIDE", "targetFieldId": "cf-002" },
            { "type": "SET_OPTIONAL", "targetFieldId": "cf-002" },
            { "type": "CLEAR_VALUE", "targetFieldId": "cf-002" }
          ]
        }
      ]
    },
    {
      "id": "rule-002",
      "fieldId": "cf-003",
      "trigger": "ON_CALCULATE",
      "active": true,
      "calculation": {
        "expression": "({cf-003} * {cf-004})",
        "targetFieldId": "cf-005",
        "precision": 0
      }
    },
    {
      "id": "rule-003",
      "fieldId": "cf-006",
      "trigger": "ON_CHANGE",
      "active": true,
      "operations": [
        {
          "conditions": [{ "fieldId": "cf-006", "operator": "EQUALS", "value": true }],
          "actions": [
            { "type": "SHOW", "targetFieldId": "cf-007" },
            { "type": "SET_REQUIRED", "targetFieldId": "cf-007" }
          ]
        },
        {
          "conditions": [{ "fieldId": "cf-006", "operator": "EQUALS", "value": false }],
          "actions": [
            { "type": "HIDE", "targetFieldId": "cf-007" },
            { "type": "SET_OPTIONAL", "targetFieldId": "cf-007" },
            { "type": "CLEAR_VALUE", "targetFieldId": "cf-007" }
          ]
        }
      ]
    },
    {
      "id": "rule-004",
      "fieldId": "cf-006",
      "trigger": "ON_LOAD",
      "active": true,
      "operations": [
        {
          "conditions": [],
          "actions": [
            { "type": "SET_VALUE", "targetFieldId": "cf-006", "value": false }
          ]
        }
      ]
    }
  ]
}
Este exemplo demonstra:
2 seções ("Dados agronômicos" e "Registro e documentos")
Campo condicional: "Descrição da variedade" só aparece quando "Outra" é selecionada
Campo calculado: "Produção total estimada" = área × produtividade (read-only)
Campo condicional por boolean: "Código do cartório" só aparece quando "CPR registrada?" = Sim
Inicialização: "CPR registrada?" inicia como false via regra ON_LOAD
Attachment: Laudo com limite de 3 arquivos PDF/JPG/PNG até 10MB

3.1. Exemplo: Template OTHER (sem campos base)#

Quando a empresa utiliza um instrumento que não se encaixa nos tipos pré-definidos, ela cria um template com baseType = OTHER. Neste caso, a camada 2 é vazia — a entrada do dictionary para OTHER define baseTypeFields: []. Toda a especificidade do contrato vem da camada 3, definida pela empresa.
Nota: O JSON abaixo é autocontido — inclui o snapshot da camada 1 (do dictionary OTHER), a camada 2 vazia, e a camada 3 configurada pela empresa.
{
  "id": "tpl-other-001",
  "companyId": "company-001",
  "baseType": "OTHER",
  "name": "Contrato de Parceria Agrícola",
  "description": "Template para contratos de parceria agrícola customizados.",
  "status": "ACTIVE",
  "dictionaryVersion": 2,
  "dictionarySnapshotAt": "2025-03-17T09:00:00.000+00:00",
  "commonFields": [
    { "field": "code", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "description", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "total", "type": "DECIMAL", "visibility": "REQUIRED" },
    { "field": "startDate", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "endDate", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "interestRate", "type": "DECIMAL", "visibility": "OPTIONAL" },
    { "field": "interestRateType", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "ANNUAL" },
    { "field": "interestCalculationMethod", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "SIMPLE" },
    { "field": "correctionIndex", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "NONE" },
    { "field": "paymentPeriodicity", "type": "ENUM", "visibility": "OPTIONAL" },
    { "field": "currency", "type": "ENUM", "visibility": "REQUIRED", "defaultValue": "BRL" },
    { "field": "typeDescription", "type": "STRING", "visibility": "REQUIRED", "helpText": "Descrição livre do instrumento jurídico." }
  ],
  "baseTypeFields": [],
  "allowedPaymentTypes": ["OTHER"],
  "paymentDefaults": {
    "typeDefault": "OTHER",
    "interestApplicable": true,
    "fineApplicable": true,
    "discountApplicable": true
  },
  "sections": [
    { "id": "sec-pa-01", "title": "Dados da parceria", "description": "Informações sobre a parceria agrícola.", "order": 1 },
    { "id": "sec-pa-02", "title": "Documentos", "description": null, "order": 2 }
  ],
  "customFields": [
    {
      "id": "cf-pa-001", "sectionId": "sec-pa-01", "key": "tipoParceria", "label": "Tipo de parceria",
      "fieldType": "SELECT", "required": true, "editable": true, "active": true, "category": "default",
      "helpText": "Modalidade da parceria agrícola.",
      "options": [
        { "value": "MEACAO", "label": "Meação (50/50)", "order": 1 },
        { "value": "TERCO", "label": "Terço (1/3 proprietário)", "order": 2 },
        { "value": "ARRENDAMENTO", "label": "Arrendamento fixo", "order": 3 },
        { "value": "CUSTOM", "label": "Percentual customizado", "order": 4 }
      ],
      "order": 1
    },
    {
      "id": "cf-pa-002", "sectionId": "sec-pa-01", "key": "percentualProprietario", "label": "Percentual do proprietário (%)",
      "fieldType": "NUMBER", "required": false, "editable": true, "active": true, "category": "conditional",
      "helpText": "Informe o percentual quando 'Percentual customizado' selecionado.",
      "validation": { "min": 0, "max": 100 },
      "order": 2
    },
    {
      "id": "cf-pa-003", "sectionId": "sec-pa-01", "key": "propriedadeNome", "label": "Nome da propriedade",
      "fieldType": "TEXT", "required": true, "editable": true, "active": true, "category": "default",
      "placeholder": "Ex: Fazenda Horizonte",
      "order": 3
    },
    {
      "id": "cf-pa-004", "sectionId": "sec-pa-01", "key": "areaTotal", "label": "Área total (hectares)",
      "fieldType": "NUMBER", "required": true, "editable": true, "active": true, "category": "default",
      "validation": { "min": 0.1 },
      "order": 4
    },
    {
      "id": "cf-pa-005", "sectionId": "sec-pa-01", "key": "culturaPrincipal", "label": "Cultura principal",
      "fieldType": "TEXT", "required": true, "editable": true, "active": true, "category": "default",
      "placeholder": "Ex: Soja, Milho safrinha",
      "order": 5
    },
    {
      "id": "cf-pa-006", "sectionId": "sec-pa-01", "key": "safra", "label": "Safra",
      "fieldType": "TEXT", "required": true, "editable": true, "active": true, "category": "default",
      "placeholder": "Ex: 2024/2025",
      "order": 6
    },
    {
      "id": "cf-pa-007", "sectionId": "sec-pa-02", "key": "contratoAssinado", "label": "Contrato assinado",
      "fieldType": "ATTACHMENT", "required": false, "editable": true, "active": true, "category": "default",
      "validation": { "maxFileSize": 10, "allowedFileTypes": ["pdf"], "maxFiles": 1 },
      "order": 1
    },
    {
      "id": "cf-pa-008", "sectionId": "sec-pa-02", "key": "observacoesGerais", "label": "Observações",
      "fieldType": "TEXT_AREA", "required": false, "editable": true, "active": true, "category": "default",
      "validation": { "maxLength": 2000 },
      "order": 2
    }
  ],
  "rules": [
    {
      "id": "rule-pa-001", "fieldId": "cf-pa-001", "trigger": "ON_CHANGE", "active": true,
      "operations": [
        {
          "conditions": [{ "fieldId": "cf-pa-001", "operator": "EQUALS", "value": "CUSTOM" }],
          "actions": [
            { "type": "SHOW", "targetFieldId": "cf-pa-002" },
            { "type": "SET_REQUIRED", "targetFieldId": "cf-pa-002" }
          ]
        },
        {
          "conditions": [{ "fieldId": "cf-pa-001", "operator": "NOT_EQUALS", "value": "CUSTOM" }],
          "actions": [
            { "type": "HIDE", "targetFieldId": "cf-pa-002" },
            { "type": "SET_OPTIONAL", "targetFieldId": "cf-pa-002" },
            { "type": "CLEAR_VALUE", "targetFieldId": "cf-pa-002" }
          ]
        }
      ]
    }
  ]
}
Toda a estrutura específica do formulário é definida pela empresa na camada 3 (sections + customFields + rules). O tipo base OTHER não impõe nenhum campo específico (camada 2 vazia) — apenas a obrigatoriedade de typeDescription no contrato (campo da camada 1).

4. Armazenamento no Contrato#

Quando um contrato é criado usando um template:
Campo do ContractDescrição
typeTipo base herdado do template. Imutável.
templateIdReferência ao template. Imutável.
typeSpecificFieldsValores dos campos da camada 2. Validados contra o snapshot baseTypeFields do template (não contra o dictionary atual da plataforma).
customFieldsValores dos campos customizados (camada 3). Validados contra a camada 3 do template.
Exemplo de customFields armazenado:
{
  "variedadeSoja": "TMG7062",
  "areaCultivada": 500.0,
  "produtividadeEstimada": 65.0,
  "producaoTotalEstimada": 32500,
  "cprRegistrada": true,
  "codigoCartorio": "1º Cartório de Lucas do Rio Verde",
  "laudoVistoria": [
    { "fileId": "file-001", "fileName": "laudo_fazenda.pdf", "fileSize": 245000, "mimeType": "application/pdf", "uploadedBy": "user-001", "uploadedAt": "2025-03-17T09:00:00.000+00:00" }
  ]
}
Campos condicionais que estavam ocultos (por regra HIDE) não são armazenados — suas chaves simplesmente não existem no JSON.

4.1. Evolução do template vs. contratos existentes#

Contratos já criados não são afetados por alterações no template. O customFields é um snapshot dos valores. Se um campo for removido do template, o valor permanece no contrato. Se um campo for adicionado, contratos antigos não o possuem.

5. ContractFieldDictionary (camadas 1 e 2 da plataforma)#

As camadas 1 (campos comuns do contrato) e 2 (campos do tipo base) são definidas pela plataforma e armazenadas no ContractFieldDictionary — recurso de referência centralizado e versionado, gerido pelo AgRisk. O dictionary tem uma entrada por baseType, com a definição completa dos campos aplicáveis e das configurações de pagamento padrão.

5.1. Estrutura do dictionary#

Exemplo de uma entrada do dictionary (para CPR_PHYSICAL):
{
  "baseType": "CPR_PHYSICAL",
  "version": 3,
  "commonFields": [
    { "field": "code", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "total", "type": "DECIMAL", "visibility": "REQUIRED" },
    { "field": "startDate", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "endDate", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "interestRate", "type": "DECIMAL", "visibility": "HIDDEN", "helpText": "CPRs Físicas não possuem taxa de juros." },
    { "field": "paymentPeriodicity", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "HARVEST" },
    { "field": "currency", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "COMMODITY_LINKED" }
  ],
  "baseTypeFields": [
    { "field": "crop", "type": "ENUM", "visibility": "REQUIRED", "enumValues": ["SOYBEAN", "CORN", "COTTON", "COFFEE", "SUGARCANE", "WHEAT", "RICE", "OTHER"] },
    { "field": "harvestSeason", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "expectedQuantity", "type": "DECIMAL", "visibility": "REQUIRED" },
    { "field": "quantityUnit", "type": "ENUM", "visibility": "REQUIRED", "enumValues": ["TONS", "BAGS_60KG", "BAGS_50KG", "ARROBAS", "LITERS", "OTHER"] },
    { "field": "deliveryLocation", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "deliveryDeadline", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "productPriceAtContract", "type": "DECIMAL", "visibility": "OPTIONAL" },
    { "field": "priceUnit", "type": "ENUM", "visibility": "OPTIONAL", "enumValues": ["PER_TON", "PER_BAG_60KG", "PER_ARROBA"] }
  ],
  "allowedPaymentTypes": ["CPR"],
  "paymentDefaults": {
    "typeDefault": "CPR",
    "interestApplicable": false,
    "fineApplicable": true,
    "discountApplicable": false
  },
  "updatedAt": "2025-03-17T09:00:00.000+00:00"
}
Cada baseType (CPR_PHYSICAL, CPR_FINANCIAL, INVOICE, PURCHASE_SALE_CONTRACT, CCB, PROMISSORY_NOTE, OTHER) tem sua própria entrada no dictionary com os mesmos campos.

5.2. Gestão do dictionary#

A gestão do dictionary é responsabilidade exclusiva da plataforma (AgRisk) — não exposta ao tenant. Mudanças se dão por:
Seed / migration em código: para alterações estruturais (novo tipo base, mudança de tipo de campo).
Painel admin interno + API admin: para ajustes pontuais (renomear label, mudar visibility, adicionar enumValue, alterar paymentDefaults).
A API admin fica em namespace separado (ex.: /admin/contract-field-dictionary) e é documentada em runbook técnico interno, fora do escopo deste módulo.

5.3. Versionamento#

Cada entrada do dictionary tem um campo version (inteiro) incrementado a cada mudança aprovada na entrada daquele baseType. A versão é registrada no template no momento da criação (campo dictionaryVersion), permitindo rastrear contra qual snapshot do dictionary o template foi configurado.
Nota: o formato exato do version está sob avaliação. A documentação atual considera inteiro incremental (1, 2, 3, ...). Pode evoluir para semver, timestamp ou outra convenção em revisão futura.

5.4. Snapshot do dictionary no template#

Quando uma empresa cria um template via POST /v2/companies/:companyId/contract-templates, o backend:
1.
Lê a entrada do dictionary correspondente ao baseType informado.
2.
Copia commonFields, baseTypeFields, allowedPaymentTypes e paymentDefaults para o template (snapshot).
3.
Acrescenta os customFields, sections e rules enviados pela empresa (camada 3).
4.
Persiste o template com dictionaryVersion e dictionarySnapshotAt marcando a fotografia capturada.
O template fica autocontido — não há lookup dinâmico do dictionary em tempo de leitura. Quem consulta o template recebe tudo que precisa para validar contratos.

5.5. Alterações posteriores no dictionary#

Quando a plataforma altera o dictionary (ex.: adicionar novo campo obrigatório em CPR_PHYSICAL):
Novos templates criados após a mudança refletem o dictionary atualizado (versão N+1).
Templates existentes continuam com o snapshot capturado na criação (versão N).
Contratos criados a partir de templates antigos seguem funcionando — o template tem tudo que precisa.
Se a empresa quiser incorporar a mudança em um template existente, usa o endpoint de refresh (ver seção 8 — POST /:templateId/refresh-dictionary). O refresh é atômico (substitui o snapshot inteiro) e preserva a camada 3 do template (customFields, sections, rules).

5.6. Templates iniciais#

Não existem "templates padrão da plataforma" com companyId = null. Todo template tem uma empresa proprietária (companyId definido).
Quando uma empresa começa a usar o módulo e ainda não tem templates configurados, o AgRisk pode criar manualmente um conjunto inicial via POST normal — templates da empresa, sem customFields, apenas com o snapshot do dictionary. A empresa pode editar/desativar/excluir esses templates a qualquer momento como qualquer outro.

5.7. Comportamento para baseType = OTHER#

A entrada do dictionary para OTHER tem:
commonFields — campos comuns aplicáveis (camada 1), incluindo typeDescription como obrigatório.
baseTypeFields: [] — vazio (não há campos específicos do "tipo" OTHER).
allowedPaymentTypes: ["OTHER"].
paymentDefaults — geralmente todos aplicáveis (true), permitindo flexibilidade na configuração da empresa.
Templates baseType = OTHER capturam essa entrada normalmente — o snapshot da camada 2 fica vazio e toda a especificidade vem da camada 3 da empresa.

6. Regras de Negócio#

Template#

RN-TPL-001: Nome único por empresa. Erro: TEMPLATE_NAME_ALREADY_EXISTS.
RN-TPL-002: Tipo base imutável após salvar. Erro: TEMPLATE_BASE_TYPE_IMMUTABLE.
RN-TPL-003: Desativação sem impacto retroativo. Templates podem ser desativados mesmo com contratos existentes. Contratos mantêm seus dados. Novos contratos não podem usar template inativo. Erro: TEMPLATE_INACTIVE.

Campos customizados#

RN-TPL-004: Key única por template. Erro: CUSTOM_FIELD_KEY_ALREADY_EXISTS.
RN-TPL-005: Key não colide com tipo base. Erro: CUSTOM_FIELD_KEY_CONFLICTS_WITH_BASE.
RN-TPL-006: Opções obrigatórias. SELECT, MULTI_SELECT e RADIO exigem ao menos 2 opções. Erro: SELECT_FIELD_REQUIRES_OPTIONS.
RN-TPL-007: Validação de rules por tipo de campo. Operadores numéricos (GREATER_THAN, etc.) só são aceitos para campos numéricos. CONTAINS só para MULTI_SELECT. Erro: INVALID_RULE_OPERATOR.
RN-TPL-008: Campo calculado deve ser read-only. Quando um campo é targetFieldId de uma regra ON_CALCULATE, ele deve ter editable: false. Erro: CALCULATED_FIELD_MUST_BE_READONLY.
RN-TPL-009: Referências circulares proibidas. Uma regra ON_CALCULATE não pode referenciar o próprio targetFieldId na expressão. Erro: CIRCULAR_CALCULATION_REFERENCE.

Uso nos contratos#

RN-TPL-010: Seleção obrigatória de template. Na criação, o usuário seleciona um template. O type é herdado automaticamente. Erro: TEMPLATE_REQUIRED.
RN-TPL-011: Validação de customFields. Campos required = true (que não estão ocultos por regra) devem estar presentes. Campos SELECT/RADIO/MULTI_SELECT devem conter valores das opções. Validações numéricas (min/max) e de texto (maxLength) são aplicadas. Erros: MISSING_CUSTOM_FIELD, INVALID_CUSTOM_FIELD_VALUE, CUSTOM_FIELD_OUT_OF_RANGE, CUSTOM_FIELD_TOO_LONG.
RN-TPL-012: Template imutável no contrato. O templateId não pode ser alterado via PATCH. Erro: CONTRACT_TEMPLATE_IMMUTABLE.

Edição do template#

RN-TPL-013: Adição de campos. Campos novos não afetam contratos existentes.
RN-TPL-014: Remoção de campos. Valores permanecem nos contratos existentes.
RN-TPL-015: Alteração de obrigatoriedade. Afeta apenas novos contratos.
RN-TPL-016: Alteração de opções. Contratos com valores de opções removidas mantêm esses valores.
RN-TPL-017: Operações incrementais via CRUDs individuais. Seções, campos e regras são gerenciados via endpoints CRUD individuais (POST/PATCH/DELETE), não por substituição em massa. Cada operação afeta apenas o elemento alvo — outros campos/seções/regras do template permanecem intactos. Para criar um conjunto inicial de campos e regras em lote, o POST de criação do template aceita sections, customFields e rules inline.

Snapshot do dictionary#

RN-TPL-018: Snapshot do dictionary na criação. No momento da criação do template, o backend captura um snapshot das camadas 1 (commonFields) e 2 (baseTypeFields), além de allowedPaymentTypes e paymentDefaults, da entrada do ContractFieldDictionary correspondente ao baseType informado. O snapshot fica armazenado no template (campos commonFields, baseTypeFields, allowedPaymentTypes, paymentDefaults, dictionaryVersion, dictionarySnapshotAt). Alterações posteriores do dictionary não afetam templates existentes.
RN-TPL-019: Refresh atômico do dictionary preserva camada 3. O endpoint POST /:templateId/refresh-dictionary substitui de forma atômica as camadas 1 e 2 (commonFields, baseTypeFields), allowedPaymentTypes e paymentDefaults do template pelos valores atuais do ContractFieldDictionary correspondente ao baseType. A camada 3 (customFields, sections, rules) é preservada integralmente. Contratos já criados a partir do template não são afetados pelo refresh — eles têm seus próprios snapshots de valores. Erro: INCOMPATIBLE_CUSTOM_FIELD_KEY quando o refresh introduz campo da camada 1 ou 2 cuja field colide com key de campo customizado existente.

7. Padrão de Erros#

StatusCódigoDescrição
404TEMPLATE_NOT_FOUNDTemplate não encontrado.
409TEMPLATE_NAME_ALREADY_EXISTSNome duplicado.
422TEMPLATE_BASE_TYPE_IMMUTABLETentativa de alterar tipo base.
422TEMPLATE_INACTIVETemplate inativo.
409CUSTOM_FIELD_KEY_ALREADY_EXISTSKey duplicada no template.
422CUSTOM_FIELD_KEY_CONFLICTS_WITH_BASEKey colide com campo do tipo base.
422SELECT_FIELD_REQUIRES_OPTIONSSELECT/MULTI_SELECT/RADIO sem opções suficientes.
422INVALID_VALIDATION_RULERegra de validação incompatível com tipo de campo.
422INVALID_RULE_OPERATOROperador incompatível com tipo de campo na rule.
422CALCULATED_FIELD_MUST_BE_READONLYCampo alvo de cálculo não é read-only.
422CIRCULAR_CALCULATION_REFERENCEReferência circular em cálculo.
422MISSING_CUSTOM_FIELDCampo obrigatório ausente no contrato.
422INVALID_CUSTOM_FIELD_VALUEValor inválido.
422CUSTOM_FIELD_OUT_OF_RANGEFora do range min/max.
422CUSTOM_FIELD_TOO_LONGTexto excede maxLength.
422INVALID_ATTACHMENTArquivo inválido.
422CONTRACT_TEMPLATE_IMMUTABLETentativa de alterar templateId do contrato.
422INCOMPATIBLE_CUSTOM_FIELD_KEYRefresh do dictionary introduziu campo da plataforma cuja key colide com campo customizado existente no template.
404DICTIONARY_ENTRY_NOT_FOUNDEntrada do dictionary não encontrada para o baseType informado (situação anômala — indica problema na plataforma).

8. Endpoints#

Base path: /v2/companies/:companyId/contract-templates
Todos os templates pertencem a uma empresa (companyId sempre definido). A listagem é escopada por companyId via path. Quando uma empresa começa sem templates configurados, a Nagro pode criar um conjunto inicial via POST normal (ver seção 5.6) — templates com snapshot do dictionary atual e sem customFields, que a empresa pode editar/desativar a qualquer momento.

8.1. CRUD de Templates da Empresa#

POST /v2/companies/:companyId/contract-templates#

Cria um novo template customizado. O body pode incluir sections, customFields e rules na mesma requisição, ou eles podem ser configurados separadamente via PUT depois.
Permissão: contract_template:create
Request body:
{
  "baseType": "CPR_PHYSICAL",
  "name": "CPR Soja — Safra",
  "description": "Template para CPRs de soja com campos agronômicos.",
  "sections": [
    { "title": "Dados agronômicos", "description": "Informações sobre a cultura e produção.", "order": 1 },
    { "title": "Registro e documentos", "order": 2 }
  ],
  "customFields": [
    {
      "sectionId": null,
      "key": "variedadeSoja",
      "label": "Variedade de soja",
      "fieldType": "SELECT",
      "required": true,
      "editable": true,
      "active": true,
      "category": "default",
      "helpText": "Variedade da soja plantada.",
      "options": [
        { "value": "TMG7062", "label": "TMG 7062 IPRO", "order": 1 },
        { "value": "M8644", "label": "M 8644 IPRO", "order": 2 },
        { "value": "OUTRA", "label": "Outra", "order": 3 }
      ],
      "order": 1
    },
    {
      "sectionId": null,
      "key": "areaCultivada",
      "label": "Área cultivada (hectares)",
      "fieldType": "NUMBER",
      "required": true,
      "editable": true,
      "active": true,
      "category": "default",
      "validation": { "min": 0.1 },
      "order": 2
    }
  ]
}
Na criação, não incluir id nos campos, seções ou regras — a API gera automaticamente. O sectionId nos campos é resolvido após a criação das seções; quando enviados juntos no POST, o backend vincula pela posição/ordem.
Response 201 Created:
O response retorna o template completo com snapshot das camadas 1 e 2 capturado do dictionary (ver seção 5) somado à camada 3 enviada pela empresa.
{
  "id": "tpl-001",
  "companyId": "company-001",
  "baseType": "CPR_PHYSICAL",
  "name": "CPR Soja — Safra",
  "description": "Template para CPRs de soja com campos agronômicos.",
  "status": "ACTIVE",
  "dictionaryVersion": 3,
  "dictionarySnapshotAt": "2025-03-17T09:00:00.000+00:00",
  "commonFields": [
    { "field": "code", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "total", "type": "DECIMAL", "visibility": "REQUIRED" },
    { "field": "startDate", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "endDate", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "interestRate", "type": "DECIMAL", "visibility": "HIDDEN" },
    { "field": "paymentPeriodicity", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "HARVEST" },
    { "field": "currency", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "COMMODITY_LINKED" }
  ],
  "baseTypeFields": [
    { "field": "crop", "type": "ENUM", "visibility": "REQUIRED", "enumValues": ["SOYBEAN", "CORN", "COTTON", "COFFEE", "SUGARCANE", "WHEAT", "RICE", "OTHER"] },
    { "field": "harvestSeason", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "expectedQuantity", "type": "DECIMAL", "visibility": "REQUIRED" },
    { "field": "quantityUnit", "type": "ENUM", "visibility": "REQUIRED", "enumValues": ["TONS", "BAGS_60KG", "BAGS_50KG", "ARROBAS", "LITERS", "OTHER"] },
    { "field": "deliveryLocation", "type": "STRING", "visibility": "REQUIRED" },
    { "field": "deliveryDeadline", "type": "DATE", "visibility": "REQUIRED" },
    { "field": "productPriceAtContract", "type": "DECIMAL", "visibility": "OPTIONAL" },
    { "field": "priceUnit", "type": "ENUM", "visibility": "OPTIONAL", "enumValues": ["PER_TON", "PER_BAG_60KG", "PER_ARROBA"] }
  ],
  "allowedPaymentTypes": ["CPR"],
  "paymentDefaults": {
    "typeDefault": "CPR",
    "interestApplicable": false,
    "fineApplicable": true,
    "discountApplicable": false
  },
  "sections": [
    { "id": "sec-01", "title": "Dados agronômicos", "description": "Informações sobre a cultura e produção.", "order": 1 },
    { "id": "sec-02", "title": "Registro e documentos", "description": null, "order": 2 }
  ],
  "customFields": [
    {
      "id": "cf-001",
      "sectionId": "sec-01",
      "key": "variedadeSoja",
      "label": "Variedade de soja",
      "fieldType": "SELECT",
      "required": true,
      "editable": true,
      "active": true,
      "category": "default",
      "helpText": "Variedade da soja plantada.",
      "placeholder": null,
      "defaultValue": null,
      "options": [
        { "value": "TMG7062", "label": "TMG 7062 IPRO", "order": 1 },
        { "value": "M8644", "label": "M 8644 IPRO", "order": 2 },
        { "value": "OUTRA", "label": "Outra", "order": 3 }
      ],
      "validation": null,
      "order": 1
    },
    {
      "id": "cf-002",
      "sectionId": "sec-01",
      "key": "areaCultivada",
      "label": "Área cultivada (hectares)",
      "fieldType": "NUMBER",
      "required": true,
      "editable": true,
      "active": true,
      "category": "default",
      "helpText": null,
      "placeholder": null,
      "defaultValue": null,
      "options": null,
      "validation": { "min": 0.1 },
      "order": 2
    }
  ],
  "rules": [],
  "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"
}
Erros específicos:
StatusCódigo
409TEMPLATE_NAME_ALREADY_EXISTS
422CUSTOM_FIELD_KEY_ALREADY_EXISTS
422CUSTOM_FIELD_KEY_CONFLICTS_WITH_BASE
422SELECT_FIELD_REQUIRES_OPTIONS

GET /v2/companies/:companyId/contract-templates#

Lista templates da empresa + padrão da plataforma disponíveis.
Permissão: contract_template:read
Query params:
ParâmetroTipoObrigatórioDescrição
baseTypeEnumNãoFiltrar por tipo base.
statusEnumNãoACTIVE ou INACTIVE.
searchStringNãoBusca por name.
orderByEnumNãoOrdenação: name, createdAt. Default: name.
orderEnumNãoasc ou desc. Default: asc.
offsetIntegerNãoDefault: 0.
limitIntegerNãoDefault: 20. Máximo: 100.
Response 200 OK:
{
  "items": [
    {
      "id": "tpl-001",
      "companyId": "company-001",
      "baseType": "CPR_PHYSICAL",
      "name": "CPR Soja — Safra",
      "description": "Template para CPRs de soja com campos agronômicos.",
      "summary": {
        "sections": 2,
        "customFields": 8,
        "rules": 4
      },
      "status": "ACTIVE",
      "createdAt": "2025-03-17T09:00:00.000+00:00"
    },
    {
      "id": "tpl-002",
      "companyId": "company-001",
      "baseType": "CPR_PHYSICAL",
      "name": "CPR Café — Safra",
      "description": "Template para CPRs de café.",
      "summary": {
        "sections": 1,
        "customFields": 5,
        "rules": 2
      },
      "status": "ACTIVE",
      "createdAt": "2025-03-18T10:00:00.000+00:00"
    },
    {
      "id": "tpl-003",
      "companyId": "company-001",
      "baseType": "CPR_FINANCIAL",
      "name": "CPR Financeira — Default",
      "description": "Template inicial criado para a empresa, sem customização.",
      "summary": {
        "sections": 0,
        "customFields": 0,
        "rules": 0
      },
      "status": "ACTIVE",
      "createdAt": "2025-03-16T08:00:00.000+00:00"
    }
  ],
  "nextPage": false
}

GET /v2/companies/:companyId/contract-templates/:templateId#

Retorna o detalhe completo do template com seções, campos e regras.
Permissão: contract_template:read
Response 200 OK: Mesmo formato da Response 201 do POST (seção acima), com todos os campos, seções e regras populados. Ver seção 3 para exemplo completo.

POST /v2/companies/:companyId/contract-templates/:templateId/refresh-dictionary#

Atualiza o template para o snapshot atual do ContractFieldDictionary correspondente ao baseType do template. O refresh é atômico: substitui commonFields, baseTypeFields, allowedPaymentTypes e paymentDefaults de uma vez. A camada 3 (customFields, sections, rules) é preservada integralmente.
Contratos já criados a partir do template não são afetados — eles têm seus próprios snapshots de valores capturados na criação do contrato.
Permissão: contract_template:update
Request body: vazio. O endpoint sempre captura a versão atual do dictionary para o baseType do template.
Response 200 OK: Retorna o template completo atualizado, com dictionaryVersion e dictionarySnapshotAt refletindo o novo snapshot.
{
  "id": "tpl-001",
  "companyId": "company-001",
  "baseType": "CPR_PHYSICAL",
  "name": "CPR Soja — Safra",
  "dictionaryVersion": 4,
  "dictionarySnapshotAt": "2025-04-10T14:30:00.000+00:00",
  "commonFields": [ /* snapshot atualizado */ ],
  "baseTypeFields": [ /* snapshot atualizado */ ],
  "allowedPaymentTypes": ["CPR"],
  "paymentDefaults": { /* ... */ },
  "sections": [ /* preservado */ ],
  "customFields": [ /* preservado */ ],
  "rules": [ /* preservado */ ],
  "status": "ACTIVE",
  "updatedAt": "2025-04-10T14:30:00.000+00:00"
}
Erros: INCOMPATIBLE_CUSTOM_FIELD_KEY (quando o snapshot atualizado introduz campo das camadas 1 ou 2 cuja field colide com key de campo customizado existente — exige resolução manual antes), DICTIONARY_ENTRY_NOT_FOUND (entrada do dictionary não encontrada para o baseType, situação anômala).

GET /v2/companies/:companyId/contract-templates/:templateId/dictionary-diff#

Retorna a diferença entre o snapshot armazenado no template e a versão atual do ContractFieldDictionary para o baseType do template. Usado pela UI para sinalizar ao usuário se há atualização disponível e o que mudou antes de confirmar o refresh.
Permissão: contract_template:read
Response 200 OK:
{
  "templateId": "tpl-001",
  "baseType": "CPR_PHYSICAL",
  "currentVersion": 3,
  "latestVersion": 4,
  "hasUpdate": true,
  "diff": {
    "commonFields": {
      "added": [
        { "field": "correctionIndex", "type": "ENUM", "visibility": "OPTIONAL", "defaultValue": "NONE" }
      ],
      "removed": [],
      "changed": [
        { "field": "paymentPeriodicity", "previous": { "visibility": "OPTIONAL" }, "current": { "visibility": "REQUIRED" } }
      ]
    },
    "baseTypeFields": {
      "added": [
        { "field": "registrationNumber", "type": "STRING", "visibility": "OPTIONAL" }
      ],
      "removed": [],
      "changed": []
    },
    "allowedPaymentTypes": {
      "previous": ["CPR"],
      "current": ["CPR"]
    },
    "paymentDefaults": {
      "previous": { /* anterior */ },
      "current": { /* atual */ }
    }
  }
}
Quando hasUpdate = false, o template já está na versão atual e os arrays de diff retornam vazios.

PATCH /v2/companies/:companyId/contract-templates/:templateId#

Atualiza metadados do template: name, description. Não altera seções, campos nem regras — esses são gerenciados pelos CRUDs individuais (ver seção 8.2).
Permissão: contract_template:update
Request body:
{
  "name": "CPR Soja — Safra 24/25",
  "description": "Template revisado para safra 24/25."
}
Response 200 OK: Retorna o template atualizado completo.
Erros: TEMPLATE_NAME_ALREADY_EXISTS.

8.2. CRUDs individuais de Seções, Campos e Regras#

Cada elemento do template (seções, campos customizados, regras) tem seu próprio CRUD. As operações são incrementais — não substituem o conjunto inteiro.
Importante: as referências entre elementos (campos referenciam seções por sectionId; regras referenciam campos por fieldId e targetFieldId) exigem ordem na criação:
1.
Criar seções primeiro.
2.
Criar campos customizados, referenciando os sectionId recém-criados.
3.
Criar regras, referenciando fieldId e targetFieldId dos campos.

Seções#

POST /v2/companies/:companyId/contract-templates/:templateId/sections#
Cria uma nova seção no template.
Permissão: contract_template:update
Request body:
{
  "title": "Documentos complementares",
  "description": "Anexos opcionais relacionados ao contrato.",
  "order": 3
}
Response 201 Created:
{
  "id": "sec-03",
  "title": "Documentos complementares",
  "description": "Anexos opcionais relacionados ao contrato.",
  "order": 3
}
PATCH /v2/companies/:companyId/contract-templates/:templateId/sections/:sectionId#
Atualiza atributos da seção (title, description, order).
Permissão: contract_template:update
Response 200 OK: Retorna a seção atualizada.
DELETE /v2/companies/:companyId/contract-templates/:templateId/sections/:sectionId#
Remove a seção do template. Campos associados ficam com sectionId = null (órfãos), exibidos no topo do formulário.
Permissão: contract_template:update
Response 204 No Content

Campos customizados#

POST /v2/companies/:companyId/contract-templates/:templateId/fields#
Adiciona um campo customizado ao template.
Permissão: contract_template:update
Request body:
{
  "sectionId": "sec-01",
  "key": "sistemaPlantio",
  "label": "Sistema de plantio",
  "fieldType": "SELECT",
  "required": false,
  "editable": true,
  "active": true,
  "category": "default",
  "options": [
    { "value": "DIRETO", "label": "Plantio direto", "order": 1 },
    { "value": "CONVENCIONAL", "label": "Convencional", "order": 2 }
  ],
  "order": 6
}
Response 201 Created: Retorna o campo criado, incluindo o id gerado.
Erros: CUSTOM_FIELD_KEY_ALREADY_EXISTS, CUSTOM_FIELD_KEY_CONFLICTS_WITH_BASE, SELECT_FIELD_REQUIRES_OPTIONS, INVALID_VALIDATION_RULE.
PATCH /v2/companies/:companyId/contract-templates/:templateId/fields/:fieldId#
Atualiza atributos de um campo existente. Apenas os campos enviados no body são alterados.
Permissão: contract_template:update
Request body (exemplo — alterar label e adicionar opção):
{
  "label": "Variedade de soja plantada",
  "options": [
    { "value": "TMG7062", "label": "TMG 7062 IPRO", "order": 1 },
    { "value": "M8644", "label": "M 8644 IPRO", "order": 2 },
    { "value": "NS7709", "label": "NS 7709 IPRO", "order": 3 },
    { "value": "OUTRA", "label": "Outra", "order": 4 }
  ]
}
Response 200 OK: Retorna o campo atualizado completo.
Erros: CUSTOM_FIELD_KEY_ALREADY_EXISTS (se key for alterada e conflitar), SELECT_FIELD_REQUIRES_OPTIONS, INVALID_VALIDATION_RULE.
DELETE /v2/companies/:companyId/contract-templates/:templateId/fields/:fieldId#
Remove um campo customizado do template. Valores desse campo em contratos existentes são preservados (customFields.{key} permanece nos contratos antigos).
Regras que referenciavam o campo (via fieldId ou targetFieldId) também são removidas em cascata.
Permissão: contract_template:update
Response 204 No Content

Regras (Rules)#

POST /v2/companies/:companyId/contract-templates/:templateId/rules#
Adiciona uma nova regra ao template. Pode referenciar qualquer fieldId ou targetFieldId existente (criar campos antes).
Permissão: contract_template:update
Request body:
{
  "fieldId": "cf-001",
  "trigger": "ON_CHANGE",
  "active": true,
  "operations": [
    {
      "conditions": [{ "fieldId": "cf-001", "operator": "EQUALS", "value": "OUTRA" }],
      "actions": [
        { "type": "SHOW", "targetFieldId": "cf-002" },
        { "type": "SET_REQUIRED", "targetFieldId": "cf-002" }
      ]
    },
    {
      "conditions": [{ "fieldId": "cf-001", "operator": "NOT_EQUALS", "value": "OUTRA" }],
      "actions": [
        { "type": "HIDE", "targetFieldId": "cf-002" },
        { "type": "SET_OPTIONAL", "targetFieldId": "cf-002" },
        { "type": "CLEAR_VALUE", "targetFieldId": "cf-002" }
      ]
    }
  ]
}
Response 201 Created: Retorna a regra criada, incluindo id gerado.
Erros: INVALID_RULE_OPERATOR, CALCULATED_FIELD_MUST_BE_READONLY, CIRCULAR_CALCULATION_REFERENCE.
PATCH /v2/companies/:companyId/contract-templates/:templateId/rules/:ruleId#
Atualiza uma regra existente. Apenas os campos enviados no body são alterados.
Permissão: contract_template:update
Request body (exemplo — ativar/desativar regra):
{
  "active": false
}
Response 200 OK: Retorna a regra atualizada completa.
DELETE /v2/companies/:companyId/contract-templates/:templateId/rules/:ruleId#
Remove uma regra do template. Não afeta contratos já criados (regras só rodam durante criação/edição de contrato).
Permissão: contract_template:update
Response 204 No Content

PUT /v2/companies/:companyId/contract-templates/:templateId/status#

Substitui o status do template (ativação/desativação).
Permissão: contract_template:delete
Request body:
{
  "status": "INACTIVE"
}
Response 200 OK:
{
  "id": "tpl-001",
  "status": "INACTIVE",
  "updatedAt": "2025-03-20T11:00:00.000+00:00"
}

9. Permissões RBAC#

ResourceDomínioActions
contract_templateTENANTcreate, read, update, delete

10. Impacto nos Demais Módulos#

10.1. Contratos#

Campos: templateId (obrigatório, imutável), customFields (JSON).
Fluxo de criação: selecionar template → preencher formulário (3 camadas, todas vindas do próprio template) → validação contra snapshot do template.
O frontend monta o formulário a partir do próprio GET /contract-templates/:templateId — não há mais endpoint /schema separado. O template já carrega o snapshot autocontido das camadas 1, 2 e 3.

10.2. Importação#

Payload API ganha templateId por contrato.
Planilha: campos customizados como colunas extras, identificados por key, validados contra o template.

10.3. Histórico#

Alterações em customFields registradas como customFields.{key}.
Modificado em 2026-06-02 15:00:36
Página anterior
Contratos
Próxima página
Pagamentos
Built with