CompensacaoCarteira (FINA450)
Endpoint REST para compensar e estornar
movimentos entre as carteiras de uma mesma entidade — títulos a
receber em SE1 contra títulos a pagar em SE2
— via rotina automática FINA450 (MsExecAuto).
Adota o padrão Tier 3 com verbo no path
(_compensar e _estornar) porque o
FINA450 não opera sobre uma chave natural única — a
operação age sobre conjuntos de chaves (compensar) ou sobre
um título SE2 posicionado pré-execução (estornar). O
verbo no path torna a intenção explícita sem precisar diferenciar via
body.
FINA450 compensa o valor total dos títulos selecionados. Não há suporte a compensação parcial — se os valores não baterem, o título de saldo permanece em aberto e segue o fluxo financeiro normal.Endpoint OAuth2
Sem credenciais? Você pode pegar o token rodando
./src/scripts/get-token.sh na biblioteca e
colar o access_token aqui no campo de refresh
(ou clique em "Logout" para limpar e voltar ao fake).
Vinculação com o ERP
Convenções
Verbo no path (Tier 3). O endpoint usa POST
com verbo explícito na URL (_compensar, _estornar)
em vez do CRUD convencional. Motivo: o FINA450 não opera
sobre uma chave natural de SE1 ou SE2 — compensar age sobre
conjuntos de chaves passadas via AUTARECCHAVE/AUTAPAGCHAVE;
estornar exige um SE2 posicionado. POST + verbo torna a
intenção explícita sem ambiguidade de payload.
Compensação apenas TOTAL. A rotina automática FINA450 compensa o valor total dos títulos selecionados. Não há caminho para compensação parcial — se a somatória dos SE1 não bate com a somatória dos SE2, o título de maior valor permanece em aberto com saldo residual. Para compensar parcialmente, é necessário criar títulos auxiliares antes da chamada.
Mesmo clifor em cliente e fornecedor.
O FINA450 mapeia AUTCCLI450 e
AUTCFOR450 com o mesmo código de
clifor/loja — o par precisa existir
simultaneamente em SA1 e SA2. Cenário típico:
empresa que é cliente e fornecedor da mesma matriz (compensação entre
carteiras de um único parceiro comercial).
Multi-filial via afilcomp. Quando os
títulos vêm de filiais diferentes, o servidor coleta as filiais
durante a montagem das chaves e envia AUTAFILCOMP
populado para o FINA450. Para forçar uma filial específica (ou para
desambiguar quando há múltiplas), informe afilcomp no
payload (formato: string única do TamSX3 de
E1_FILIAL/E2_FILIAL).
Trilha SE5 com E5_TIPODOC=CP. Cada
compensação gera 2 ou mais lançamentos em SE5 (um por
par SE1/SE2 envolvido), todos com E5_TIPODOC="CP". O
/_list aplica esse filtro implicitamente. Use /_byid
para inspecionar um lançamento específico via recno.
Estorno requer chave SE2 do título de compensação.
O /_estornar não desfaz a operação via "compensação id":
requer as 5 partes da chave do SE2 gerado pela compensação
(prefixo, numero, tipo,
clifor, loja). O endpoint faz DbSeek
+ FINA450 op=5.
CompensacaoCarteira
Compensação e estorno entre carteiras (verbo no path)FINA450 op=3)
Descrição
Recebe arrays de RECNOs SE1 (a receber) e SE2 (a pagar)
do mesmo cliente/fornecedor e dispara o
FINA450 op=3. O servidor monta internamente as chaves
AUTARECCHAVE e AUTAPAGCHAVE no formato
documentado pela TDN.
Cabeçalho do payload define os filtros: dataInicial /
dataLimite (vencimento real), valorLimite
(teto da compensação), moeda, debcred
(1 = normais, 2 = crédito), titFuturo (inclui títulos
com emissão posterior à data base).
Para multi-filial: se os títulos vêm de filiais diferentes, o
servidor detecta automaticamente; informe afilcomp
para forçar.
Request body
CompensarRequest.
AUTNLIM450). 0 = sem limite. Default 0.POST https://erpapi.jetme.com.br/api/99/01/WsCompCart/_compensar Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "dataInicial": "2026-05-01", "dataLimite": "2026-05-31", "valorLimite": 10000, "clifor": "FIN001", "loja": "01", "moeda": 1, "debcred": 1, "titFuturo": false, "titulosSE1": [12345], "titulosSE2": [54321] }
Respostas
data = CompResposta (clifor, loja, totalSE1, totalSE2, valorLimite).clifor/loja vazios, arrays SE1 e SE2 ambos vazios. Tier: validation-error.FINA450 — clifor não cadastrado como cliente E fornecedor, títulos com baixa parcial, somatórias não batem (compensação parcial não suportada), parâmetro debcred incompatível com tipos dos títulos. Tier: business-error.FINA450 op=5)
Descrição
Posiciona o SE2 envolvido na compensação (o
FINA450 op=5 não recebe arrays — precisa de um
registro SE2 posicionado pré-execução) e dispara o
estorno. O endpoint faz o DbSeek a partir dos 5 campos
chave informados no payload.
O estorno desfaz a baixa, devolvendo os títulos originais SE1/SE2 ao estado aberto.
Request body
EstornarRequest.
NF ou customizado).POST https://erpapi.jetme.com.br/api/99/01/WsCompCart/_estornar Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "prefixo": "TST", "numero": "PAG300000", "tipo": "NF", "clifor": "000001", "loja": "00" }
Respostas
data = EstornoResposta. Títulos originais SE1/SE2 voltam ao estado aberto.FINA450 — título não é de compensação, compensação já estornada, movimentação subsequente. Tier: business-error.Descrição
Busca um lançamento SE5 da compensação por
RecNo() (sempre disponível) ou E5_MSUID
(quando o dicionário expõe). O recno retorna no
/_list.
Query parameters
recnomsuidtipo=recno; string GUID para tipo=msuid.Cenario
Exemplo da requisicao (cenario ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsCompCart/_byid?tipo=recno&valor=98765 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: MovCompensacao }.tipo/valor ausentes ou fora do enum.msuid requer E5_MSUID no dicionário.Listagem
Movimentos SE5 do tipo compensação (E5_TIPODOC=CP)
Descrição
Pagina sobre a SE5 filtrando apenas movimentos do
tipo compensação (E5_TIPODOC=CP):
orderBy=natural(default) — paginação por offset.orderBy=recno— paginação por keyset (cursor/nextCursor) para sync incremental.
Query parameters
CAMPOS_GET.1).50, máx 500).natural.naturalrecnoRecNo() < since.orderBy=recno, retoma após este RecNo.Cenario
Exemplo da requisicao (cenario ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsCompCart/_list?pageSize=10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
data (array de MovCompensacao), orderBy, pageSize, count, opcionalmente page ou nextCursor.Schemas
Definições canônicas — campos com origemSX3 rastreável
RECNOs SE1/SE2.
Pelo menos um dos arrays precisa ter elementos. Compensação é
sempre pelo valor total.
AUTDVENINI450). Formato ISO YYYY-MM-DD.AUTDVENFIM450).AUTNLIM450). 0 = sem limite. Default 0.AUTCCLI450) e fornecedor (AUTCFOR450) — mesma entidade.AUTCLJCLI/AUTCLJFOR).AUTCMOEDA450). Default 1 (R$).1 = títulos normais (NF/DP/BOL); 2 = títulos de crédito (RA/PA/NCC/NDF). Default 1.12false.titulosSE2 tiver elementos.titulosSE1 tiver elementos.SE2 do título gerado pela
compensação (não o título original). O FINA450 op=5
exige SE2 posicionado antes da chamada — o endpoint
faz o DbSeek.
NF ou customizado).SE5 da compensação (E5_TIPODOC="CP").
Cada compensação gera 2 ou mais lançamentos — um por par
SE1/SE2 envolvido.
YYYYMMDD)."CP" (compensação).E5_MSUID.POST /_compensar bem-sucedido — retorna o
total de títulos envolvidos e a entidade compensada.
POST /_estornar bem-sucedido.
message traz
a mensagem do NomeAutoLog do FINA450.
false em erros.Cenários
Catálogo de combinações reconhecidas. Tier semântico no slug; endpoint notype-pill.
clifor/loja. FINA450 op=3
gera os lançamentos SE5 com E5_TIPODOC=CP.
Quando usar: baixa cruzada entre cliente e fornecedor da mesma entidade. Para multi-filial, informe
afilcomp ou confie na detecção automática.
SE2
do título de compensação via DbSeek e chama
FINA450 op=5. Títulos SE1/SE2 originais voltam ao
estado aberto.
Quando usar: reverter operação errada ou que precisou ser desfeita por regra de negócio.
SE5 filtrando E5_TIPODOC="CP".
Default orderBy=natural; alterne para orderBy=recno
+ cursor para delta-sync.
SE5 específico via tipo=recno.
O recno vem do /_list. Atenção: é o
recno do lançamento SE5, não do título
original SE1/SE2.
Pendências conhecidas (rev1)
Compensação apenas TOTAL. O FINA450 não
suporta compensação parcial — se a somatória dos SE1 não bate
exatamente com a somatória dos SE2, o título de maior valor permanece
em aberto com saldo residual. Para compensar parcialmente, é necessário
criar títulos auxiliares antes da chamada. Não há plano de implementar
partição automática enquanto a rotina automática não expuser o
caminho oficial.
Estorno por chave SE2, não por compensação id. O
/_estornar exige as 5 partes da chave do SE2
gerado pela compensação — não há "id da operação" rastreável.
Consumidores devem persistir a chave (prefixo,
numero, tipo, clifor,
loja) no momento do /_compensar para usar
depois.
Mesmo clifor em SA1 + SA2. O FINA450
mapeia cliente e fornecedor com o mesmo código. Se a base
tem cadastros separados (cliente com código X, fornecedor com código
Y), a compensação não funciona via este endpoint — só serve para
entidades duplas (cliente + fornecedor da mesma matriz).
Multi-filial: detecção automática vs explícita. Quando
os títulos vêm de filiais diferentes, o servidor detecta automaticamente
e popula AUTAFILCOMP. Em casos ambíguos (ex.: titulares
espalhados por 3+ filiais com regras de matriz), a detecção pode não
escolher o que o usuário espera — preferir o campo afilcomp
explícito no payload.
Sentinela do smoke test depende de cadastro FIN001.
O test-compensacao-carteira.sh usa o cliente FIN001
da documentação oficial da TDN. Em ambientes que não têm esse cadastro
duplicado em SA1+SA2, substituir por entidade real da base antes de
rodar. Documentado no README do endpoint.
Bloqueio MSBLQL/MSBLQD não aplicado. A SE1/SE2 não
expõem MSBLQL/MSBLQD no cabeçalho do título; o bloqueio relevante está
em SA1/SA2 (cliente/fornecedor) e é enforced
pelo próprio FINA450. Não há contrato adicional a aplicar
no endpoint.