LocalEstoque
CRUD de locais de estoque (armazéns) — tabela NNR — via
wrapper sobre a rotina padrão AGRA045 (FwModel/MsExecAuto).
O identificador externo é o próprio código do armazém
(NNR_CODIGO, 2 caracteres). Grids de usuários autorizados
(SGQUSER) e de produtos vinculados (SGQPROD)
são aceitos opcionalmente no POST e PUT.
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. O código do armazém
(NNR_CODIGO, máx 2 caracteres) é o próprio
identificador na URL: /WsNNR/{codigo}. Não há chave
interna separada — a rota plural /WsNNR/ sem código
retorna a lista da filial.
Filial. Todas as rotas aceitam ?filial=
opcional (default "01"). A URL /api/99/01 já
fixa empresa/filial no path do AppServer, mas o query param
filial permite alternar dentro do escopo da empresa quando
o ambiente compartilha o cadastro entre filiais.
Bloqueio TOTVS — só NNR_MSBLQL. Nesta
base, a tabela NNR expõe somente o flag de bloqueio
("1" = Bloqueado, "2" = Liberado, default). O
campo NNR_MSBLQD (data de bloqueio) não existe no
SX3, ao contrário de outras tabelas TOTVS — portanto não há
"caminho de desbloqueio" baseado em vigência aqui, apenas bloqueio
manual via flag.
Contrato planejado (padrão WsSA1):
em armazém bloqueado, o PUT deve aceitar
exclusivamente Bloqueado (caminho de
desbloqueio); payload tocando Descricao ou grids responde
422. DELETE em armazém bloqueado também
deve ser rejeitado pelo MVC.
PEN — wrapper pendente (2026-05-14). O wrapper
U_AG045Exc/U_AG045MVC hoje só grava
NNR_MSBLQL="2" como default na inclusão; não lê
Bloqueado no payload nem aplica o gate em PUT/DELETE.
Esta seção documenta o contrato alvo, validado via
test-local-estoque.sh (passo 4b PEN).
Grids opcionais. No POST, omitir
Usuarios/Produtos grava o registro sem grids.
No PUT: omitir mantém o conteúdo atual;
enviar array vazio [] limpa o grid; enviar
itens substitui o conteúdo (não há merge incremental).
FwModel direto. O wrapper U_AG045MVC
monta o model nativo do AGRA045 (não usa MsExecAuto
legado) — comportamento validado para release ≥ 12.1.27. Em
Op=DELETE, o wrapper pula SetValue nos campos
(caso contrário o FwLoadModel rejeita a deleção). Ver
Vinculação com o ERP para o caminho do fonte.
LocalEstoque
CRUD por código do armazémDescrição
Retorna todos os locais de estoque da filial corrente em uma única
lista (não há paginação — o cadastro de armazéns é tipicamente
pequeno). Para consultar um único local, use a rota irmã
/WsNNR/{codigo}.
Query parameters
"01").Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsNNR/ Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: { total, locais[] } } — itens em LocalEstoqueItem.Descrição
Retorna os dados do local de estoque identificado por
{codigo} (NNR_CODIGO, 2 caracteres). A
resposta traz codigo, descricao e
bloqueado; grids SGQUSER/SGQPROD
não são serializados nesta versão.
Path parameter
Query parameters
"01").Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsNNR/10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: LocalEstoqueItem }.Descrição
Inclui um novo local de estoque via AGRA045 em modo
3 (MODEL_OPERATION_INSERT). O cliente
informa o código (NNR_CODIGO) — não há geração
automática por GetSXENum aqui. Grids
Usuarios (SGQUSER) e Produtos
(SGQPROD) são opcionais.
- Schema completo do body:
LocalEstoqueRequest. - Tentativa de incluir código já existente retorna
422.
Request body
POST https://erpapi.jetme.com.br/api/99/01/WsNNR/ Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "Filial": "01", "Codigo": "10", "Descricao": "ARMAZEM 10", "Bloqueado": "2" }
POST https://erpapi.jetme.com.br/api/99/01/WsNNR/ Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "Filial": "01", "Codigo": "10", "Descricao": "ARMAZEM 10", "Bloqueado": "2", "Usuarios": [ { "Usuario": "000000" } ], "Produtos": [ { "Produto": "0000001000" } ] }
Respostas
data.codigo = código do armazém criado.AGRA045 rejeitou a operação (ex: código já existente, valor inválido em Bloqueado). Tier: business-error.Descrição
Altera o local de estoque via AGRA045 em modo
4 (MODEL_OPERATION_UPDATE). Apenas os
campos informados no body são alterados — campos omitidos mantêm
o valor atual.
Comportamento dos grids no PUT:
- Omitir
Usuarios/Produtos→ mantém o conteúdo atual. - Enviar
[]→ limpa o grid. - Enviar itens → substitui o grid (não há merge).
Bloqueado="1"bloqueia;"2"libera (não há vigência).
Path parameter
Query parameters
"01").Request body
LocalEstoquePutRequest.
PUT https://erpapi.jetme.com.br/api/99/01/WsNNR/10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "Descricao": "ARMAZEM 10 REVISADO" }
PUT https://erpapi.jetme.com.br/api/99/01/WsNNR/10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "Bloqueado": "1" }
PUT https://erpapi.jetme.com.br/api/99/01/WsNNR/10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "NNR_MSBLQL": "2" }
PUT https://erpapi.jetme.com.br/api/99/01/WsNNR/10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "Usuarios": [], "Produtos": [] }
Respostas
RespostaSucesso.AGRA045 rejeitou a alteração (validação de domínio, restrição de negócio) ou registro bloqueado (NNR_MSBLQL="1") com payload tocando campo fora do caminho de desbloqueio — só Bloqueado permitido. Tier: business-error. PEN: gate de bloqueio ainda não implementado.Descrição
Exclui o local de estoque via AGRA045 em modo
5 (MODEL_OPERATION_DELETE). O
AGRA045 rejeita exclusão de armazém com estoque em
uso (saldo, movimentações ativas) — caso em que a resposta é
422. O wrapper U_AG045MVC pula
SetValue nos campos quando a operação é DELETE
(necessário para o FwLoadModel persistir a deleção).
Path parameter
Query parameters
"01").Chamada de exemplo
DELETE https://erpapi.jetme.com.br/api/99/01/WsNNR/10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
RespostaSucesso.AGRA045 rejeita. Tier: business-error.Schemas
Definições canônicas — campos com origemSX3 rastreável
/ em data.locais[],
/{codigo} em data). Apenas campos cabeçalho —
grids SGQUSER/SGQPROD não são retornados.
"1"=Bloqueado, "2"=Liberado (default).12POST /WsNNR/. Filial,
Codigo e Descricao são obrigatórios; grids
Usuarios/Produtos são opcionais.
"01"). Máx 2 caracteres."2". "1"=Bloqueado, "2"=Liberado.12SGQUSER). Ver ItemUsuario.SGQPROD). Ver ItemProduto.PUT /WsNNR/{codigo}. Todos os campos
são opcionais — omitir mantém o valor atual; em grids, omitir mantém
o conteúdo e [] limpa.
"1"=Bloqueado, "2"=Liberado. Omitir = mantém atual.12SGQUSER. Omitir = mantém atual. [] = limpa grid.SGQPROD. Omitir = mantém atual. [] = limpa grid.SGQUSER (usuários/grupos autorizados a operar no armazém).
SGQPROD (produtos/grupos vinculados ao armazém).
data objeto, ver RespostaInclusao no
openapi.yaml).
true em respostas de sucesso."Local de estoque 10 alterado com sucesso.").{ codigo: NNR_CODIGO }. Em PUT/DELETE é string vazia.data pode trazer
detalhe técnico (log do MsExecAuto/NomeAutoLog)
quando aplicável.
false em erros.MsExecAuto).