CadastroFornecedor
CRUD de fornecedor (tabela SA2) via MVC do
MATA020, encapsulado pelo wrapper U_MT020MVC
(src/lib/MAT/MT020MVC.prw). Identificador externo é CNPJ
(14 dígitos) ou CPF (11 dígitos); a chave técnica
(A2_COD/A2_LOJA) é gerada pelo Protheus no POST
via GetSXENum + Soma1 + ConfirmSX8.
https://erpapi.jetme.com.br/api/99/01
Empresa 99 · Filial 01
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).
Convenções
Identificador externo. Todas as rotas /WsFornecedor/{cgc}
aceitam apenas dígitos — 14 (CNPJ) ou 11 (CPF). Pontuação
(., /, -) é rejeitada com 400. A chave
interna A2_COD/A2_LOJA não é exposta como
identificador externo; use /_byid?tipo=recno|msuid&valor=…
quando precisar buscar por ela.
Pessoa Física / Jurídica. O endpoint distingue PF/PJ via
A2_PFISICA ("F" ou "J"). O tradicional
A2_PESSOA aparece no FornecedorPayload do OpenAPI
por compatibilidade, mas não está no allowlist da rev9 em
diante — o campo foi removido do FormModel do SA2 neste
ambiente. O parser ignora A2_PESSOA silenciosamente;
envie sempre A2_PFISICA.
Município & UF. A2_COD_MUN é opcional
mas, quando presente, dispara o X3 valid que faz seek na CC2
pela ordem 1 (UF + nome). O payload precisa carregar
A2_EST + A2_MUN + A2_COD_MUN de
forma coerente — caso contrário o MsExecAuto responde 422.
Para evitar o lookup, omita A2_COD_MUN.
Counter SX8 dessincronizado. Testes que abortaram antes
do ConfirmSX8 podem deixar "buracos" no contador. O endpoint
aplica workaround (rev15): após GetSXENum, executa
Soma1 em loop enquanto a combinação A2_COD+A2_LOJA
já existir em SA2. Comportamento transparente para o consumidor,
mas pode produzir saltos numéricos visíveis na sequência.
Paginação e delta-sync. /_list usa
page/pageSize (default 50, máx
500). Para sincronização incremental, alterne para
orderBy=recno e use since/cursor
conforme o nextCursor retornado (rev24).
Bloqueio TOTVS (A2_MSBLQL / A2_MSBLQD).
A partir da rev25, o WSSA2 respeita o gate de bloqueio
padrão TOTVS via U_C980Blq("SA2"). Em registro bloqueado,
o PUT retorna 422 a menos que o payload
toque exclusivamente os campos de bloqueio (caminho
de desbloqueio). Bloqueio fica ativo quando A2_MSBLQL="1"
ou dDataBase > A2_MSBLQD.
Polaridade do par MSBLQL/MSBLQD varia por tabela. Na
SA2, A2_MSBLQL="1" é Inativo (bloqueado)
e "2" é Ativo (default). Sempre confirmar no SX3
antes de replicar a polaridade em outros endpoints.
Fornecedor
CRUD por CNPJ/CPFDescrição
Retorna o fornecedor pesquisado pelo CGC (CNPJ 14 dígitos ou CPF 11 dígitos).
Aplica filtro de filial (xFilial("SA2")) e respeita o whitelist
de CAMPOS_GET definido no .prw. O parâmetro
opcional fields reduz o conjunto de campos retornados.
A resposta inclui sempre recno; msuid e
msuidt aparecem quando os campos correspondentes
existem no dicionário (resolvido via U_RestCamposOpc).
Path parameter
^\d{11}$|^\d{14}$.Query parameters
CAMPOS_GET.Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199?fields=A2_COD,A2_NOME,A2_CGC,A2_EST Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: Fornecedor }.Descrição
Inclui um fornecedor novo via MATA020 em modo 3
(MODEL_OPERATION_INSERT). A chave técnica
A2_COD/A2_LOJA é gerada pelo Protheus
(GetSXENum + Soma1 + ConfirmSX8) —
o cliente passa apenas o CGC no path.
- Whitelist de campos: ver
FornecedorPayload. - Loja default
"01"quando o payload não força outra. A2_PESSOAé silenciosamente ignorado (rev9); useA2_PFISICA.
Path parameter
^\d{11}$|^\d{14}$.Request body
CAMPOS_ALLOW. Schema completo em
FornecedorPayload.
POST https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "A2_NOME": "TESTE_REST FORNECEDOR LTDA", "A2_NREDUZ": "TESTE REST", "A2_END": "RUA TESTE 100", "A2_BAIRRO": "CENTRO", "A2_EST": "SP", "A2_TIPO": "J", "A2_PFISICA": "J" }
POST https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "A2_NOME": "TESTE_REST FORNECEDOR LTDA", "A2_NREDUZ": "TESTE REST", "A2_END": "RUA TESTE 100", "A2_BAIRRO": "CENTRO", "A2_EST": "SP", "A2_MUN": "AGUAS DA PRATA", "A2_COD_MUN": "00402", "A2_TIPO": "J", "A2_PFISICA": "J" }
Respostas
CrudResponse com data = chave técnica gerada (A2_COD/A2_LOJA).MsExecAuto do MATA020 rejeitou (campos fora do whitelist, enums inválidos, X3 valid de A2_COD_MUN, etc). Tier: business-error.Descrição
Altera campos do fornecedor via MATA020 em modo
4 (MODEL_OPERATION_UPDATE). Aceita qualquer
subconjunto do whitelist CAMPOS_ALLOW. Campos fora do
allowlist são silenciosamente ignorados.
Restrições. A chave técnica
(A2_COD/A2_LOJA) e a chave de negócio
(A2_CGC) não podem ser alteradas via PUT — o seek é
feito pelo CGC do path e o MVC bloqueia mudança da PK.
Bloqueio TOTVS. Em registro bloqueado por
A2_MSBLQL="1" ou dDataBase > A2_MSBLQD,
o PUT retorna 422 a menos que o
payload toque exclusivamente A2_MSBLQL/A2_MSBLQD
(caminho de desbloqueio).
A2_MSBLQL:"1"= Inativo,"2"= Ativo (default).A2_MSBLQD: data ISOYYYY-MM-DDou string vazia.- Helper backend:
U_C980Blq("SA2").
Path parameter
Request body
PUT https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "A2_NOME": "TESTE REST FORNECEDOR ALTERADO", "A2_NREDUZ": "TESTE REST", "A2_END": "RUA TESTE 200", "A2_BAIRRO": "CENTRO ALT", "A2_DDD": "011", "A2_TEL": "999999999", "A2_EMAIL": "teste@example.com" }
PUT https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "A2_TIPO": "X" }
PUT https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "A2_MSBLQL": "2" }
PUT https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "A2_MSBLQL": "1", "A2_MSBLQD": "2026-12-31" }
PUT https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "A2_MSBLQL": "2", "A2_MSBLQD": "" }
Respostas
CrudResponse.A2_MSBLQL/A2_MSBLQD. Tier: business-error.Descrição
Exclui o fornecedor via MATA020 em modo 5
(MODEL_OPERATION_DELETE). O MsExecAuto do
MATA020 rejeita exclusão quando há dependências (títulos a pagar
em aberto, itens de cotação/pedido vinculados).
Path parameter
Chamada de exemplo
DELETE https://erpapi.jetme.com.br/api/99/01/WsFornecedor/99999999000199 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
CrudResponse.Descrição
Busca o fornecedor por id técnico — útil para integrações que persistem
a chave interna (recno) ou o identificador universal
(msuid) e querem reconfirmar o registro sem reconstruir o CGC.
Retorna o mesmo schema Fornecedor do GET por CGC.
Busca por tipo=msuid exige que o dicionário do SA2
tenha o campo A2_MSUID. Em ambiente sem essa coluna o
endpoint responde 501.
Query parameters
recnomsuidtipo=recno, string quando tipo=msuid).Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsFornecedor/_byid?tipo=recno&valor=1234 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsFornecedor/_byid?tipo=msuid&valor=9f7a3e2c4b8d1a0e Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: Fornecedor }.tipo/valor ausentes ou tipo fora do enum.msuid requer índice/coluna não disponível no ambiente (A2_MSUID ausente).Listagem
Listagem paginada e typeaheadDescrição
Lista fornecedores com filtros por cod, nome
(prefix normalizado, sem acento) ou cgc (prefix). Suporta
dois modos de ordenação:
orderBy=chave(default) — paginação porpage/pageSize.orderBy=recno— delta-sync, usasince/cursorcomnextCursorretornado (rev24).
Query parameters
A2_COD exato (índice 1).CAMPOS_GET.1, mínimo 1).50, máx 500).chave.chaverecnoorderBy=recno).nextCursor de página anterior.Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsFornecedor/_list?nome=TESTE&page=1&pageSize=50 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsFornecedor/_list?orderBy=recno&since=0&pageSize=200 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
data (array de Fornecedor), page, pageSize, count, opcionalmente nextCursor.orderBy inválido, pageSize > 500).Descrição
Busca rápida (typeahead) para autocomplete de UI. Retorna uma lista
enxuta (cod, loja, cgc,
nome, recno, msuid,
msuidt) — não devolve o schema completo de
Fornecedor.
Query parameters
prefix.prefixcontains10, máx 25).Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsFornecedor/_search?q=teste&match=prefix&limit=10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
success, count, data[] com cod/loja/cgc/nome/recno/msuid/msuidt.q ausente ou < 2 caracteres, match fora do enum.Schemas
Definições canônicas — campos com origemSX3 rastreável
/{cgc}, /_list,
/_byid). Inclui chave técnica (A2_COD/A2_LOJA)
e dados cadastrais. Campos efetivamente retornados dependem de
CAMPOS_GET e do filtro fields. Os ids técnicos
(recno/msuid/msuidt) são anexados
por fAddTec após o registro estar posicionado.
GetSXENum)."01").JFOXRF) ou Jurídica (J).FJpertence("12"), default "2". "1"=Inativo (bloqueado), "2"=Ativo (liberado).12RecNo() do AdvPL). Sempre presente.A2_MSUID. Presente apenas se o campo existir no dicionário.A2_MSUIDT associado ao msuid. Mesma condição de presença.POST e PUT. Whitelist
definida em CAMPOS_ALLOW no .prw; campos
fora do whitelist são silenciosamente descartados pelo parser. Quando
A2_COD_MUN é informado, o X3 valid faz seek na
CC2 usando A2_EST + A2_MUN — os
três campos precisam estar coerentes.
Em
PUT sobre fornecedor bloqueado, o payload
deve conter apenas A2_MSBLQL e/ou
A2_MSBLQD — qualquer outro campo provoca 422
(caminho de desbloqueio).
A2_EST e A2_COD_MUN nas validações.CC2 por UF + nome). Omitir quando não há certeza do código — o cadastro funciona sem ele."105" = Brasil).A2_PESSOA do allowlist).FJJ=Jurídico nacional, F=Físico, O=Outros, X=Exterior, R=Rural.JFOXRpertence("12"), default "2"): "1"=Inativo, "2"=Ativo. MsExecAuto do MATA020 rejeita valores fora do domínio.12YYYY-MM-DD ou vazia (limpa a data). Bloqueio fica ativo enquanto dDataBase > A2_MSBLQD.FormModel do SA2 neste ambiente. Use A2_PFISICA.FJA2_EST diretamente.A2_MUN diretamente.data traz
a chave técnica gerada (POST) ou string vazia (PUT/DELETE).
true em respostas de sucesso.A2_COD/A2_LOJA). Em PUT/DELETE pode ser string vazia ou objeto auxiliar.U_RestErro
(RestUtils.prw). data pode conter o token
interno da causa (ex: mensagem do NomeAutoLog) para
tratamento programático, quando aplicável.
false em erros.MsExecAuto).Cenários
Catálogo de combinações de payload reconhecidas pelos métodos de mutação. Cada cenário compartilha o mesmo schema da operação mas demonstra um uso típico distinto. Tier semântico no slug (-minimo, -com-*, -desbloqueio, etc); endpoint no type-pill.
A2_TIPO="J",
A2_PFISICA omitido (default vazio).
Quando usar: fornecedor PJ comum, sem endereço detalhado, sem dados fiscais especiais.
J = Jurídica.A2_COD_MUN). Útil quando o fornecedor é
recém-cadastrado em integração com base SIAFI/IBGE.
X
(Exportação). Útil para fornecedores estrangeiros com
regime fiscal diferenciado.
X = Exportação.A2_MSBLQL=1. Único PUT permitido em registro
bloqueado é alterar o par A2_MSBLQL/A2_MSBLQD.
2 = Ativo (libera o registro).A2_MSBLQD (data
a partir da qual o fornecedor passa a ser bloqueado).
Bloqueio ativo quando dDataBase > A2_MSBLQD.
YYYY-MM-DD.A2_MSBLQD (string vazia), removendo o
bloqueio programado. Usado quando a programação prévia
foi cancelada.
"".