ComplementoProduto
CRUD do complemento de produto (tabela SB5) via
MsExecAuto de MATA180. Relação 1:1 com
SB1 — o complemento existe sempre amarrado a um
produto já cadastrado. O identificador externo é
B5_COD (o mesmo código do produto, validado contra
SB1 em todas as operações de escrita).
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
Identificador externo. Todas as rotas
/WsComplementoProduto/{cod} esperam o código do
produto (B1_COD / B5_COD) —
o complemento é 1:1 com SB1 e não tem chave própria.
O endpoint normaliza o valor com PadR no tamanho do SX3
antes do DbSeek; o cliente pode passar trimado.
Pré-condição de produto (POST/PUT). Antes de qualquer
MsExecAuto, o endpoint valida que SB1 tem o
produto. Produto inexistente retorna 422 com mensagem
"Produto X nao encontrado em SB1". Crie o produto via
CadastroProduto antes de complementar.
Unicidade 1:1. POST em produto que já
tem complemento retorna 409. Para alterar campos do
complemento, use PUT. Para zerar e recriar, sequencie
DELETE + POST.
Bloqueio TOTVS (B5_MSBLQL / B5_MSBLQD).
Em registro bloqueado, o PUT só aceita payload que toque
exclusivamente os campos de bloqueio (caminho de desbloqueio);
qualquer outro campo retorna 422 com motivo explícito.
B5_MSBLQL="1" é Inativo, "2" é Ativo (default SX3).
B5_MSBLQD compara contra dDataBase — registro
fica bloqueado enquanto dDataBase > B5_MSBLQD.
Formato de datas. B5_MSBLQD no payload
aceita string ISO YYYY-MM-DD ou string vazia (limpa a data);
conversão interna usa sToD(StrTran(…, "-", "")). No GET o
campo ainda não é serializado — CAMPOS_GET
exclui B5_MSBLQD até que U_RestMontaRegistro
tenha o serializador Date-aware (tarefa transversal).
Paginação e delta-sync. /_list usa
page/pageSize (default 50, máx
500). Para sincronização incremental, alterne para
orderBy=recno e use cursor conforme o
nextCursor retornado.
Campos opcionais do SB5. Nem toda empresa expõe
todos os campos do dicionário (B5_CEMETIN, B5_AUTOFAB,
B5_USOPRO, etc). O endpoint usa fCpsAtv
(FieldPos > 0) para filtrar a lista antes de chamar
U_RestMontaRegistro; fProcCrud também
consulta GetSx3Cache e pula campos sem definição.
Complemento
CRUD por código de produtoDescrição
Retorna o complemento pesquisado pelo código do produto. Aplica
filtro de filial (xFilial("SB5")) e respeita o whitelist
CAMPOS_GET filtrado por FieldPos > 0 — em
empresas que não têm um campo opcional, ele simplesmente não aparece
no retorno.
Path parameter
B1_COD). Será preenchido à direita com espaços até TamSX3("B5_COD")[1].Query parameters
CAMPOS_GET.Cenarios
Exemplo da requisicao (cenario ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001?fields=B5_COD,B5_CEME,B5_GARANT Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: Complemento }.Descrição
Inclui um complemento via MATA180 em modo 3
(MODEL_OPERATION_INSERT). A chave do complemento é o
próprio B5_COD = B1_COD — não há
GetSXENum; o produto precisa existir previamente em
SB1 (pré-check obrigatório).
- Whitelist de campos: ver
ComplementoPayload. - Relação 1:1 — se já existir complemento para o produto, retorna 409.
Path parameter
SB1.Request body
CAMPOS_ALLOW. Schema completo em
ComplementoPayload.
POST https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B5_CEME": "TESTE_REST descricao tecnica complementar do produto", "B5_OBSERV": "TESTE_REST observacao gerada pelo smoke test", "B5_USOPRO": "Uso interno - TESTE_REST", "B5_GARANT": "12 meses" }
POST https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B5_CEME": "Descricao tecnica completa do produto PA001", "B5_CEMETIN": "Full technical description of product PA001", "B5_OBSERV": "Observacoes operacionais e de manuseio", "B5_CARACT": "Caracteristicas fisico-quimicas", "B5_FORMUL": "Formulacao registrada", "B5_AUTOFAB": "N", "B5_USOPRO": "Producao interna", "B5_GARANT": "24 meses", "B5_PESO": 1.25, "B5_TOTGOR": 5.4, "B5_TOTGORS": 2.1, "B5_TOTGORT": 0.3, "B5_COR": "VERMELHO", "B5_ALTURA": 12.5, "B5_MODELO": "MOD-2026-A", "B5_MARCA": "Marca Comercial Exemplo" }
Respostas
CrudResponse com data = ComplementoRef (filial + cod + ids técnicos).cod. Tier: validation-error.SB1 ou MsExecAuto do MATA180 rejeitou o payload. Tier: business-error.Descrição
Altera campos do complemento via MATA180 em modo
4 (MODEL_OPERATION_UPDATE). Aceita qualquer
subconjunto do whitelist CAMPOS_ALLOW.
Bloqueio TOTVS. Em registro bloqueado por
B5_MSBLQL="1" ou dDataBase > B5_MSBLQD,
o PUT retorna 422 a menos que o payload toque
exclusivamente B5_MSBLQL/B5_MSBLQD
(caminho de desbloqueio).
B5_MSBLQL:"1"= Inativo,"2"= Ativo (default).B5_MSBLQD: string ISOYYYY-MM-DDou vazia (limpa).
Path parameter
Request body
PUT https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B5_CEME": "TESTE_REST descricao ALTERADA pelo PUT", "B5_OBSERV": "TESTE_REST observacao ALTERADA pelo smoke test", "B5_GARANT": "24 meses" }
PUT https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B5_MSBLQL": "2" }
PUT https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B5_MSBLQL": "1", "B5_MSBLQD": "2026-12-31" }
PUT https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "B5_MSBLQL": "2", "B5_MSBLQD": "" }
Respostas
CrudResponse.cod. Tier: validation-error.MsExecAuto do MATA180) ou registro bloqueado com payload tocando campos fora do par B5_MSBLQL/B5_MSBLQD. Tier: business-error.Descrição
Exclui o complemento via MATA180 em modo 5
(MODEL_OPERATION_DELETE). O SB1 não é tocado —
só o registro do SB5 é removido. MsExecAuto
do MATA180 rejeita exclusão em registro bloqueado pelo
par B5_MSBLQL/B5_MSBLQD.
Path parameter
Cenario
Exemplo da requisicao (cenario ativo)
DELETE https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
CrudResponse.cod. Tier: validation-error.MsExecAuto do MATA180. Tier: business-error.Descrição
Busca o complemento 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 código do produto.
Query parameters
recnomsuidtipo=recno, string quando tipo=msuid).Cenarios
Exemplo da requisicao (cenario ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/_byid?tipo=recno&valor=1234 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/_byid?tipo=msuid&valor=9f7a3e2c4b8d1a0e Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: Complemento }.tipo/valor ausentes ou tipo fora do enum.msuid requer o campo B5_MSUID presente neste ambiente.Listagem
Listagem paginada com delta-syncDescrição
Lista complementos com filtro opcional por cod. Suporta
dois modos de ordenação:
orderBy=chave(default) — paginação porpage/pageSizesobre o índice 1 (B5_FILIAL+B5_COD).orderBy=recno— delta-sync keyset; usecursorcom onextCursorretornado para avançar.
Não há endpoint _search dedicado — o complemento é
identificado pelo próprio código do produto, então a busca por
texto/typeahead vive em
CadastroProduto
(B1_DESC).
Query parameters
PadR).CAMPOS_GET.1, mínimo 1). Válido apenas com orderBy=chave.50, máx 500).chave.chaverecnoorderBy=chave para delta-sync simplificado).nextCursor de página anterior (modo recno).Cenarios
Exemplo da requisicao (cenario ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/_list?page=1&pageSize=50 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsComplementoProduto/_list?orderBy=recno&cursor=0&pageSize=200 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
data (array de Complemento), orderBy, pageSize, count, page (chave) ou nextCursor (recno).fields com campo não permitido).Schemas
Definições canônicas — campos com origemSX3 rastreável
/{cod}, /_list,
/_byid). Inclui filial, chave (B5_COD),
campos descritivos e flag de bloqueio. B5_MSBLQD ainda
não é serializado (Date pendente em U_RestMontaRegistro).
Campos efetivamente retornados dependem de CAMPOS_GET
filtrado por FieldPos > 0 e do parâmetro fields.
SB1.B1_COD)."24 meses").pertence("12"), default "2". "1"=Inativo (bloqueado), "2"=Ativo.12B5_MSUID existe no dicionário).msuid.POST e PUT. Whitelist
definida em CAMPOS_ALLOW no .prw. Em
PUT sobre complemento bloqueado, o payload deve conter
apenas B5_MSBLQL e/ou B5_MSBLQD —
qualquer outro campo provoca 422. Campos ausentes no SX3 da empresa
são silenciosamente ignorados pelo parser (GetSx3Cache vazio).
pertence("12"), default "2"): "1"=Inativo, "2"=Ativo. MsExecAuto do MATA180 rejeita valores fora do domínio.12YYYY-MM-DD ou vazia (limpa a data). Bloqueio fica ativo enquanto dDataBase > B5_MSBLQD.data do
CrudResponse (POST/PUT). Combina filial + código + ids
técnicos sem repetir o payload inteiro.
xFilial("SB5") trimado.data
traz um ComplementoRef
em POST/PUT (chave + ids técnicos do registro afetado), ou string
vazia em DELETE.
true em respostas de sucesso.ComplementoRef com filial + cod + ids técnicos. Em DELETE pode ser string vazia.data pode conter o token
interno da causa (ex: mensagem do NomeAutoLog do
MsExecAuto de MATA180) para tratamento
programático, quando aplicável.
false em erros.MsExecAuto).Cenarios
Combinacoes documentadas (1 por example doopenapi.yaml)
B5_COD (igual ao B1_COD). Retorna whitelist completo de CAMPOS_GET.fields=; util em mobile.B5_CEME, B5_OBSERV, B5_USOPRO, B5_GARANT). Pre-condicao: produto existir em SB1. Tier happy-path-minimal.B5_CEMETIN) e indicadores de auto-fabricacao (B5_AUTOFAB) / formula (B5_FORMUL). Tier happy-path-realistic.B5_MSBLQL="2" e/ou B5_MSBLQD="" e aceito (qualquer outro campo dispara 422).B5_MSBLQL="1" + B5_MSBLQD ISO futura.B5_MSBLQD="" para zerar a vigencia. Combinavel com mudanca de B5_MSBLQL.MATA180 op=5. Falha 422 em complemento bloqueado.recno da SB5 — caminho recomendado.B5_MSUID no SX3. Ver Pendencias.page/pageSize em orderBy=chave. Default 50, max 500.recno; cliente itera via nextCursor.Pendências conhecidas (rev5)
Campos físico/nutricional dependentes do SX3 da empresa (rev5). Os campos B5_PESO, B5_TOTGOR, B5_TOTGORS, B5_TOTGORT, B5_COR, B5_ALTURA, B5_MODELO e B5_MARCA precisam estar criados no dicionário da empresa-alvo para que o round-trip seja persistido. Ambientes sem esses campos: o parser ignora silenciosamente no payload (GetSx3Cache vazio) e o GET filtra via FieldPos > 0 — não há erro, mas o dado não trafega. Cadastro no SX3 é feito externamente (Configurador TOTVS), fora do escopo deste endpoint.
B5_MSBLQD nao serializado no GET. O whitelist CAMPOS_GET exclui B5_MSBLQD ate que U_RestMontaRegistro tenha serializador Date-aware. Tarefa transversal, fora do escopo do endpoint.
GET _byid?tipo=msuid condicional ao SX3. Quando o ambiente nao expoe B5_MSUID no SX3, a chamada retorna 501. Workaround: usar tipo=recno.
Sem _search dedicado. O complemento e identificado pelo proprio codigo do produto; typeahead por descricao deve usar CadastroProduto.
Campos opcionais variam por empresa. B5_CEMETIN, B5_AUTOFAB, B5_USOPRO etc nem sempre existem no SX3 — o endpoint filtra silenciosamente via FieldPos > 0. Se um campo no payload nao existe na empresa, ele e ignorado.
Sem validacao de produto bloqueado em SB1. O endpoint valida apenas existencia (DbSeek); produto em SB1 com B1_MSBLQL="1" nao impede inclusao/alteracao de complemento.