Objetivo
A API permite criar modelos de aprovação utilizados nos processos do ContractPlus.
Por meio da requisição, é possível definir:
- A empresa em que o modelo será utilizado;
- O local de aprovação;
- A data de início da vigência;
- O tipo de funcionamento do modelo;
- As faixas de valores;
- As consultas condicionais;
- As sequências de aprovação;
- Os usuários aprovadores;
- As configurações adicionais de cada nível.
A API realiza a criação da estrutura completa do modelo de aprovação em uma única operação, incluindo faixas, sequências e aprovadores.
Quando algum elemento da estrutura for inválido, a operação deverá ser rejeitada integralmente, sem manter registros parciais.
Aplicação da API
A API pode ser utilizada para criar modelos de aprovação relacionados aos locais disponíveis no ContractPlus, como:
- Contrato;
- Medição;
- Aditivo do contrato;
- Cotação de compra;
- Distrato do contrato;
- Documentos da medição;
- Alteração contratual.
O local em que o modelo será aplicado é definido pelo campo placeId.
placeId | Local de aprovação |
|---|---|
1 | Contrato |
3 | Medição |
5 | Aditivo do Contrato |
7 | Cotação de Compra |
8 | Distrato do Contrato |
9 | Documentos da Medição |
10 | Alteração Contratual |
Endpoint
POST /api/approvalPattern
Autenticação
A requisição exige autenticação válida.
O token deve ser enviado no cabeçalho:
Authorization: Bearer {{token}}
Quando a requisição for enviada sem autenticação, a API deverá retornar:
401 Unauthorized
Nenhum modelo ou registro relacionado deverá ser criado.
Cabeçalhos
Content-Type: application/json Authorization: Bearer {{token}}
Estrutura da requisição
Exemplo de modelo com um nível de aprovação
{ "companyId": 1, "placeId": 3, "effectiveDate": "2026-08-10", "flags": { "isAuto": false, "hasRange": false, "hasQuery": false, "hasSeq": true }, "ranges": [ { "description": "Faixa padrão", "sequences": [ { "level": 1, "name": "Nível de Aprovação Padrão", "useSignProvider": false, "allowApproveLower": false, "users": [ { "userName": "usuario.aprovador" } ] } ] } ] }
Campos do modelo
Estrutura principal
Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
companyId | Inteiro | Sim | Identificador da empresa em que o modelo será criado. |
placeId | Inteiro | Sim | Identificador do local de aprovação. |
effectiveDate | Data | Sim | Data de início da vigência do modelo. |
flags | Objeto | Sim | Define o tipo e o comportamento do modelo. |
ranges | Array | Condicional | Contém as faixas, condições e sequências do modelo. |
Os campos companyId e placeId precisam identificar registros válidos.
A ausência desses campos deverá impedir a criação do modelo.
O corpo da requisição também não poderá conter apenas empresa, local e vigência. É necessário informar uma estrutura coerente com o tipo de modelo selecionado, evitando a criação de modelos vazios ou inutilizáveis.
Objeto flags
Campo | Tipo | Descrição |
|---|---|---|
isAuto | Booleano | Indica se o modelo realizará aprovação automática. |
hasRange | Booleano | Indica se o modelo utiliza intervalos de valores. |
hasQuery | Booleano | Indica se o modelo utiliza consulta para determinar o fluxo. |
hasSeq | Booleano | Indica se o modelo utiliza sequência de aprovação. |
As flags devem ser coerentes com o conteúdo informado em ranges.
Objeto ranges
Cada item do array representa uma faixa ou condição de aprovação.
Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
description | Texto | Recomendado | Descrição da faixa ou condição. |
anyValue | Booleano | Condicional | Indica se a faixa considera qualquer valor (Quando esta propriedade estiver marcada como true, o modelo não poderá ter mais de uma sequencia) |
initialValue | Decimal | Condicional | Valor inicial da faixa. |
endValue | Decimal | Condicional | Valor final da faixa. |
approvalRangeTypeId | Inteiro | Condicional | Define a ação da faixa: sequência, aprovação ou reprovação. |
approvalByQuery | Booleano | Condicional | Indica que a faixa utiliza uma consulta. |
query | Texto em Base64 | Condicional | Consulta utilizada para determinar a aprovação. |
contractTypeId | Inteiro | Condicional | Tipo de contrato relacionado à condição. |
sequences | Array | Condicional | Sequências de aprovação vinculadas à faixa. |
Formato do campo query
Quando o modelo de aprovação utilizar consulta, o conteúdo do campo query deverá ser enviado no formato Base64.
A instrução SQL não deve ser enviada diretamente em seu formato original.
Essa codificação é necessária devido a limitações de compatibilidade no envio e processamento de consultas SQL em texto puro, especialmente quando a instrução possuir:
- Aspas simples ou duplas;
- Quebras de linha;
- Caracteres especiais;
- Operadores;
- Parênteses;
- Nomes de campos ou tabelas entre aspas;
- Diferenças de sintaxe entre bancos SQL e SAP HANA.
O servidor deverá receber o conteúdo codificado e realizar o tratamento necessário durante a criação do modelo.
Objeto sequences
Cada item representa um nível da aprovação.
Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
sequenceId | Inteiro | Condicional | Identificador ou ordem da sequência dentro da faixa. |
level | Inteiro | Sim | Nível de aprovação. |
name | Texto | Sim | Descrição do nível. |
useSignProvider | Booleano | Não | Indica se o nível utiliza provedor de assinatura (Disponível apenas para modelos de aprovação de contratos) |
allowApproveLower | Booleano | Não | Indica se o aprovador poderá aprovar sequências inferiores. |
users | Array | Sim | Usuários responsáveis pela aprovação no nível. |
Cada sequência deve possuir ao menos um aprovador.
O mesmo sequenceId não deverá ser repetido dentro da mesma faixa.
Objeto users
Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
userName | Texto | Sim | Nome de usuário do aprovador cadastrado no SAP Business One. |
O usuário informado precisa existir no cadastro de usuários do SAP Business One.
Quando um usuário inexistente for informado, a criação deverá ser bloqueada.
Exemplo:
{ "Success": false, "PatternId": 0, "Message": "Usuário não encontrado: usuario.inexistente" }
Tipos de modelo
Modelo com sequência de aprovação
Utilizado quando o documento deverá ser encaminhado a um ou mais aprovadores.
Configuração esperada:
"flags": { "hasSeq": true }
O modelo deverá possuir:
- Ao menos uma faixa ou estrutura de agrupamento;
- Ao menos uma sequência;
- Ao menos um aprovador em cada sequência.
Exemplo:
{ "companyId": 1, "placeId": 1, "effectiveDate": "2026-08-10", "flags": { "hasSeq": true }, "ranges": [ { "description": "Faixa padrão", "sequences": [ { "level": 1, "name": "Aprovação gerencial", "useSignProvider": false, "allowApproveLower": false, "users": [ { "userName": "usuario.aprovador" } ] } ] } ] }
Modelo automático
Utilizado quando o documento deverá ser aprovado automaticamente.
{ "companyId": 1, "placeId": 3, "effectiveDate": "2026-08-10", "flags": { "isAuto": true }, "ranges": [] }
Nesse formato, não é necessário informar sequências ou aprovadores.
A criação de modelos automáticos sem faixas e sem sequências foi validada com sucesso.
Modelo por intervalo de valores
Utilizado quando o comportamento da aprovação depende do valor do documento.
{ "companyId": 1, "placeId": 3, "effectiveDate": "2026-08-10", "flags": { "hasRange": true }, "ranges": [ { "description": "Reprovação automática", "approvalRangeTypeId": 2, "initialValue": 0, "endValue": 4999.99, "sequences": [] }, { "description": "Aprovação automática", "approvalRangeTypeId": 1, "initialValue": 5000, "endValue": 100000, "sequences": [] }, { "description": "Aprovação por sequência", "approvalRangeTypeId": 0, "initialValue": 100000.01, "endValue": 10000000, "sequences": [ { "level": 1, "name": "Aprovação da diretoria", "users": [ { "userName": "usuario.aprovador" } ] } ] } ] }
Tipos de ação da faixa
approvalRangeTypeId | Comportamento |
|---|---|
0 | Encaminhar para sequência de aprovação |
1 | Aprovar automaticamente |
2 | Reprovar automaticamente |
Faixa para qualquer valor
Quando anyValue estiver habilitado, a faixa será aplicada independentemente do valor do documento.
{ "description": "Qualquer valor", "anyValue": true "sequences": [ { "level": 1, "name": "Aprovação padrão", "users": [ { "userName": "usuario.aprovador" } ] } ] }
Modelo por consulta
Utilizado quando o fluxo de aprovação depender do resultado de uma consulta.
Configuração esperada:
"flags": { "hasQuery": true }
Codificação obrigatória da consulta
A consulta SQL deverá ser convertida para Base64 antes de ser incluída no campo query.
Exemplo de consulta original:
SELECT CASE WHEN T0."result" > 0 THEN 1 ELSE 0 END AS "result" FROM ( SELECT COUNT(T0."Id") AS "result" FROM "IV_C1_Contract" T0 WHERE T0."Id" = @documentId AND T0."CardCode" = 'FORN01') T0
A consulta acima deverá ser codificada e enviada como uma string Base64:
{ "query": "U0VMRUNUIENBU0UgV0hFTiBUMC4icmVzdWx0IiA+IDAgVEhFTiAxIEVMU0UgMCBFTkQgQVMgInJlc3VsdCIuLi4=" }
O valor apresentado é apenas ilustrativo. A string deve ser gerada a partir da consulta completa que será utilizada no modelo.
Exemplo de modelo por consulta
{ "companyId": 1, "placeId": 1, "effectiveDate": "2026-08-10", "flags": { "hasQuery": true }, "ranges": [ { "description": "Fornecedor", "approvalByQuery": true, "query": "U0VMRUNUIENBU0UgV0hFTiBUMC4icmVzdWx0IiA+IDAgVEhFTiAxIEVMU0UgMCBFTkQgQVMgInJlc3VsdCIuLi4=","contractTypeId": 1, "sequences": [ { "level": 1, "name": "Aprovação de fornecedor", "useSignProvider": false, "allowApproveLower": false, "users": [ { "userName": "usuario.aprovador" } ] } ] } ] }
Quando hasQuery ou approvalByQuery estiver habilitado:
- O campo
querydeverá ser preenchido; - A consulta deverá estar codificada em Base64;
- Não deverá ser enviada uma instrução SQL em texto puro;
- A string Base64 deverá representar uma consulta válida e compatível com o banco utilizado.
- Não deverá ser enviada a propriedade "contractTypeId" quando o "placeId" for igual a 8 (Distrato)
Caso o campo esteja vazio ou ausente:
{ "Success": false, "PatternId": 0, "Message": "Exige que a instrução SQL seja informada" }
Múltiplos aprovadores no mesmo nível
Uma mesma sequência pode possuir vários usuários aprovadores.
"users": [ { "userName": "aprovador.1" }, { "userName": "aprovador.2" }, { "userName": "aprovador.3" } ]
Todos os usuários serão vinculados ao mesmo nível de aprovação.
Múltiplas faixas e sequências
O modelo poderá possuir:
- Múltiplas faixas;
- Diferentes tipos de contrato;
- Diferentes consultas em Base64;
- Uma ou mais sequências por faixa;
- Um ou mais aprovadores por sequência.
Cada faixa é avaliada de acordo com sua própria configuração.
{ "companyId": 1, "placeId": 8, "effectiveDate": "2026-08-10", "flags": { "hasQuery": true }, "ranges": [ { "description": "Fornecedor", "approvalByQuery": true, "query": "U0VMRUNUIENBU0UgV0hFTiBUMC4icmVzdWx0IiA+IDAgVEhFTiAxIEVMU0UgMCBFTkQgQVMgInJlc3VsdCIuLi4=", "sequences": [ { "level": 1, "name": "Aprovação de fornecedor", "users": [ { "userName": "aprovador.fornecedor" } ] } ] }, { "description": "Cliente", "approvalByQuery": true, "query": "U0VMRUNUIENBU0UgV0hFTiBUMC4icmVzdWx0IiA+IDAgVEhFTiAxIEVMU0UgMCBFTkQgQVMgInJlc3VsdCIuLi4=", "sequences": [ { "level": 1, "name": "Aprovação de cliente", "users": [ { "userName": "aprovador.cliente" } ] } ] } ] }
Resposta de sucesso
Status esperado
200 OK
Corpo
{ "Success": true, "PatternId": 605, "Message": "Modelo de aprovação criado com sucesso" }
Campo | Descrição |
|---|---|
Success | Indica se a operação foi concluída com sucesso. |
PatternId | Identificador gerado para o novo modelo. |
Message | Mensagem descritiva da operação. |
O PatternId é gerado pelo servidor e pode ser utilizado posteriormente em operações de consulta, edição, exclusão e duplicação.
Validações da API
Empresa, local e vigência obrigatórios
Os campos abaixo são obrigatórios:
{ "companyId": 1, "placeId": 3,"effectiveDate": "2026-01-12" }
A ausência ou invalidade desses campos deverá impedir a criação.
Vigência do modelo
O campo effectiveDate determina o início da vigência.
Para a mesma combinação de empresa e local de aprovação, a nova data não deverá ser anterior à última vigência cadastrada.
O comportamento esperado é bloquear a inclusão e retornar mensagem equivalente a:
Vigência não deve ser menor que a última vigência informada. Empresa: {{companyId}} Local de Aprovação: {{placeId}}
Faixa obrigatória
Quando hasRange estiver habilitado, o array ranges deverá possuir ao menos um item.
{ "Success": false, "PatternId": 0, "Message": "O modelo exige ao menos uma faixa de aprovação" }
Sequência obrigatória
Quando hasSeq estiver habilitado, cada faixa configurada para aprovação por sequência deverá possuir ao menos uma sequência.
{ "Success": false, "PatternId": 0, "Message": "Cada faixa deve possuir ao menos uma sequência" }
Aprovador obrigatório
Cada sequência deve possuir ao menos um usuário.
{ "Success": false, "PatternId": 0, "Message": "Cada sequência deve possuir ao menos um aprovador" }
Usuário inexistente
O userName deve corresponder a um usuário cadastrado no SAP Business One.
{ "Success": false, "PatternId": 0, "Message": "Usuário não encontrado: usuario.inexistente" }
Intervalo de valores inválido
initialValue não poderá ser maior que endValue.
{ "Success": false, "PatternId": 0, "Message": "O Valor Inicial de uma faixa não pode ser maior que o Valor Final" }
Consulta obrigatória e codificada
Quando o modelo utilizar consulta:
querynão poderá estar vazio;- O conteúdo deverá estar em Base64;
- O valor deverá representar uma instrução SQL válida;
- O texto SQL original não deverá ser enviado diretamente.
Exemplo inválido:
{ "approvalByQuery": true, "query": "" }
Resposta:
{ "Success": false, "PatternId": 0, "Message": "Exige que a instrução SQL seja informada" }
Sequência duplicada
O mesmo sequenceId não deverá ser informado mais de uma vez dentro da mesma faixa.
A criação deverá ser rejeitada sem persistir o modelo.
Tipos de dados inválidos
Campos numéricos, booleanos, datas, objetos e coleções devem respeitar seus respectivos tipos.
{ "Success": false, "PatternId": 0, "Message": "A estrutura de dados informada está incorreta, valide-a e tente novamente" }
Estrutura incompleta
A API deverá rejeitar corpos que poderiam criar modelos vazios.
Exemplo inválido:
{ "companyId": 1, "placeId": 3, "effectiveDate": "2026-08-10" }
A operação não deverá retornar sucesso nem persistir qualquer modelo.
Integridade da operação
A criação deve ser transacional.
Caso um erro seja identificado em qualquer parte da estrutura:
- O modelo principal não deverá ser salvo;
- As faixas não deverão ser salvas;
- As sequências não deverão ser salvas;
- Os aprovadores não deverão ser vinculados;
- Nenhum registro parcial deverá permanecer na base.
Por exemplo, se os dados principais estiverem corretos, mas uma sequência não possuir aprovadores, toda a operação deverá ser desfeita.
Pontos de atenção
companyId,placeIdeeffectiveDatedevem ser válidos.- A estrutura enviada deve ser coerente com as flags selecionadas.
- Modelos automáticos não exigem faixas, sequências ou aprovadores.
- Quando
hasRangeestiver habilitado, ao menos uma faixa deve ser informada. - Quando
hasSeqestiver habilitado, cada faixa aplicável deve possuir uma sequência. - Cada sequência deve possuir ao menos um aprovador.
- Os usuários informados precisam existir no SAP Business One.
- Os usuários não podem ser repetidos dentro do mesmo modelo, independente do nível de aprovação.
- Quando
hasQueryestiver habilitado, a consulta deve ser informada. - Consultas devem ser enviadas obrigatoriamente em formato Base64.
- Consultas SQL em texto puro não devem ser informadas no campo
query. - A codificação Base64 evita problemas de compatibilidade com caracteres, aspas, quebras de linha e sintaxe SQL.
- O valor inicial de uma faixa não pode ser maior que o valor final.
- O mesmo identificador de sequência não deve ser repetido dentro da mesma faixa.
- O servidor é responsável por gerar o
PatternId. - Nenhuma estrutura parcial deve ser persistida em caso de erro.
- A vigência deve respeitar os modelos já cadastrados para a mesma empresa e local.
- O modelo criado pode ser consultado posteriormente na tela Modelo de Aprovação do ContractPlus.