SaldosIniciais
CRUD de saldos iniciais de estoque (tabela SB9) via rotina
automática MATA220 encapsulada em MsExecAuto.
Identificador externo é a chave composta B9_COD +
B9_LOCAL (produto + armazém); como
MATA220 não tem MVC público, o caminho oficial é
MsExecAuto puro embrulhado em U_MT220Exc.
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
Chave externa composta. Todas as rotas
/WsSB9/{produto}/{local} exigem os dois segmentos
(produto + armazém). A chave é lida pelos dois últimos
segmentos de aURLParms — penúltimo é
B9_COD, último é B9_LOCAL. Campos
omitidos no path retornam 400.
Whitelist de payload. POST/PUT aceitam apenas os
campos de CAMPOS_ALLOW: B9_QINI,
B9_VINI1..5, B9_DATA, B9_LOTECTL,
B9_NUMLOTE, B9_DTVALID. B9_COD e
B9_LOCAL vêm sempre do path — se enviados no body são
ignorados silenciosamente.
Formato de datas. B9_DATA e
B9_DTVALID usam string AAAAMMDD (ex:
"20260507"). Não é ISO YYYY-MM-DD; o
MsExecAuto do MATA220 espera o formato
compactado.
Tipagem do payload. Quantidades e valores
(B9_QINI, B9_VINI1..5) viajam como
número no JSON; o wrapper preserva o tipo numérico
no array do MsExecAuto. No GET, são retornados como
string via cValToChar — clientes que
consomem o GET devem fazer parseFloat antes de exibir.
Listagem e paginação. /_list usa
page/pageSize (default 50, máx
500). Aceita filtros opcionais cod (prefix de
B9_COD) e loc (prefix de B9_LOCAL,
válido somente quando cod também é informado).
Lote (B9_LOTECTL) fora da chave. Na
revisão rev1, o lote é aceito no payload mas não compõe o
path. Endpoints filhos com rastro ativo (produto controlado por lote)
devem usar a mesma combinação B9_COD + B9_LOCAL
e diferenciar pelo conteúdo do B9_LOTECTL. Expansão do
path para incluir o lote ficou fora do escopo desta revisão.
SaldoInicial
CRUD por (B9_COD, B9_LOCAL)Descrição
Retorna o saldo inicial pesquisado pela chave composta
B9_COD + B9_LOCAL. Aplica filtro de
filial (xFilial("SB9")) e respeita o whitelist
CAMPOS_GET definido no .prw. O parâmetro
opcional fields reduz o conjunto de campos retornados.
Path parameters
TamSx3("B9_COD"), geralmente 15).SBE).Query parameters
CAMPOS_GET; campo não permitido devolve 400.Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsSB9/ZZ_TEST_001/01 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsSB9/ZZ_TEST_001/01?fields=B9_COD,B9_LOCAL,B9_QINI,B9_VINI1 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: Saldo }.TamSx3. Tier: validation-error.Descrição
Inclui um saldo inicial via MATA220 em modo
3 (inclusão). Antes da execução, o endpoint faz
DbSeek defensivo para impedir reinclusão: se a
combinação já existe, retorna 409.
B9_CODeB9_LOCALvêm do path; o payload só carrega quantidade, valor e atributos opcionais.- Whitelist completa em
SaldoPayload. - Pré-requisito: produto existe em
SB1e armazém existe emSBE.
Path parameters
Request body
CAMPOS_ALLOW. Schema completo em
SaldoPayload.
POST https://erpapi.jetme.com.br/api/99/01/WsSB9/ZZ_TEST_001/01 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B9_QINI": 30, "B9_VINI1": 1500.00, "B9_DATA": "20260507" }
POST https://erpapi.jetme.com.br/api/99/01/WsSB9/ZZ_TEST_001/01 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B9_QINI": 120, "B9_VINI1": 8400.50, "B9_DATA": "20260507", "B9_LOTECTL": "LOTE_2026A", "B9_NUMLOTE": "001", "B9_DTVALID": "20271231" }
Respostas
CrudResponse com data contendo a chave composta gravada (B9_COD/B9_LOCAL).TamSx3 ou body JSON vazio/ausente. Tier: validation-error.PUT. Tier: business-error.MATA220 (produto inexistente em SB1, armazém inexistente em SBE, data fora de domínio, etc). Tier: business-error.Descrição
Altera campos do saldo inicial via MATA220 em modo
4 (alteração). Antes da execução, o endpoint posiciona
a tabela SB9 com DbSeek no par
B9_COD/B9_LOCAL — sem isso o
MsExecAuto rejeita.
- Aceita qualquer subconjunto do whitelist
CAMPOS_ALLOW. - Não há semântica de bloqueio na
SB9— o cadastro de saldos iniciais é técnico, não administrativo.
Path parameters
Request body
CAMPOS_ALLOW. Campos omitidos preservam o valor atual.
PUT https://erpapi.jetme.com.br/api/99/01/WsSB9/ZZ_TEST_001/01 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B9_QINI": 50, "B9_VINI1": 2750.50, "B9_DATA": "20260507" }
PUT https://erpapi.jetme.com.br/api/99/01/WsSB9/ZZ_TEST_001/01 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B9_VINI1": 2800.00, "B9_VINI2": 560.00, "B9_VINI3": 3200.00 }
Respostas
CrudResponse.MsExecAuto (campos fora do whitelist, valores fora de domínio). Tier: business-error.Descrição
Exclui o saldo inicial via MATA220 em modo
5 (exclusão). O endpoint posiciona a tabela com
DbSeek antes da chamada e devolve 404
se a chave não existir.
Atenção operacional. Exclusão de saldo inicial em produção pode invalidar o cálculo de custo médio histórico — use com cautela. Em ambientes de homologação, o cleanup pelo smoke test é seguro.
Path parameters
Chamada de exemplo
DELETE https://erpapi.jetme.com.br/api/99/01/WsSB9/ZZ_TEST_001/01 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
CrudResponse com mensagem editorial.MATA220 rejeitou a exclusão (existem movimentos posteriores, regra interna). Tier: business-error.Listagem
Listagem paginada e typeaheadDescrição
Lista saldos iniciais com filtros opcionais por cod
(prefix de B9_COD) e loc (prefix de
B9_LOCAL, válido somente quando cod
também é informado). Usa o índice 1 (B9_FILIAL + B9_COD +
B9_LOCAL) e paginação por page/pageSize.
- Sem filtro: percorre toda a SB9 a partir do início — use
pageSizebaixo. - Com
codeloc:codaplica via seek/exit;locfiltra na varredura.
Query parameters
B9_COD (índice 1).B9_LOCAL. Só faz sentido com cod informado.CAMPOS_GET.1, mínimo 1).50, máx 500).Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsSB9/_list?page=1&pageSize=50 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsSB9/_list?cod=ZZ_TEST&loc=01&pageSize=200 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
fields).Descrição
Busca rápida (typeahead) por prefix de B9_COD para
autocomplete de UI. Retorna uma lista enxuta (cod,
local, qini) — não devolve o schema
completo de Saldo. Tem limite de varredura
interno (SEARCH_SCAN_CAP = 2000) para impedir
degradação em buckets grandes.
Query parameters
B9_COD. Mínimo 2 caracteres.10, máx 25).Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsSB9/_search?q=ZZ&limit=10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
success, count, data[] com cod/local/qini.q ausente ou < 2 caracteres.Schemas
Definições canônicas — campos com origemSX3 rastreável
/{produto}/{local} e
/_list). Campos efetivamente retornados dependem de
CAMPOS_GET e do filtro fields. Valores
numéricos vêm serializados como string (cValToChar).
cValToChar.cValToChar.AAAAMMDD.AAAAMMDD.POST e PUT. Whitelist
definida em CAMPOS_ALLOW no .prw. Os campos
de chave (B9_COD, B9_LOCAL) vêm do path e
são ignorados se vierem no body. Valores monetários e quantidades
viajam como número JSON; datas como string
AAAAMMDD.
AAAAMMDD (ex: "20260507").B1_RASTRO="L".AAAAMMDD.data traz
a chave composta gravada (POST/PUT) ou string vazia (DELETE).
true em respostas de sucesso."Saldo inicial incluido com sucesso.").B9_COD + B9_LOCAL + opcionalmente B9_QINI. Em DELETE, string vazia.data pode conter o token
interno da causa (ex: log do NomeAutoLog do MATA220) para
tratamento programático, quando aplicável.
false em erros.MsExecAuto do MATA220).