EstruturaProdutoMVC
CRUD de Estrutura de Produto (Bill of Materials — tabela
SG1) via rotina automática PCPA200
(módulo SIGAPCP / NEWPCP). É a variante MVC do
EstruturaProduto
(MATA200), recomendada para ambientes com NEWPCP ativo
(Protheus 12.1.27+). Modelo 2: cabeçalho do produto pai + array de
itens cobrindo todos os componentes em todos os níveis (PA → PI →
MP). PUT trabalha em modo delta — cada item declara
_acao ∈ incluir | alterar | excluir.
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
Quando usar este endpoint vs. EstruturaProduto.
Use o WsSG1Nw (este, PCPA200) quando o cliente tem
NEWPCP ativo e nenhuma (ou pouca) customização
via PE no MATA200. Mantenha o WsSG1
(MATA200) em ambientes com PCP clássico ou PE pesado sem
equivalente liberado no NEWPCP. Nunca aponte os dois
para o mesmo SG1 simultaneamente. Veja
PCPA200-TDN.md no diretório do endpoint para a
tabela completa de PEs e histórico de descontinuação do
MATA200 (31/08/2022).
Identificador externo. Todas as rotas usam
{produto} = G1_COD (produto pai), até
15 caracteres. O endpoint faz PadR para o
tamanho de TamSX3("G1_COD") antes do DbSeek.
A chave real da requisição em POST/PUT é o
cabecalho.G1_COD do body — o path param funciona como
placeholder visual obrigatório do roteador.
Modelo 2 — cabeçalho + itens em todos os níveis.
O cabeçalho descreve o produto pai (quantidade base e flags de
revisão). O array itens carrega todos os componentes
em todos os níveis da estrutura — para uma árvore
PA → PI → MP, o consumidor envia tanto os itens de PA (G1_COD=PA,
G1_COMP=PI/MP) quanto os de PI (G1_COD=PI, G1_COMP=MP). Quando
omitido, itens[].G1_COD defaulta para
cabecalho.G1_COD.
POST recusa duplicata. O endpoint pré-valida
existência: se já há registros em SG1 para o
G1_COD informado, retorna 409 Conflict
com mensagem orientando uso de PUT. O modo 3 do
PCPA200 nunca é acionado neste caso.
PUT é delta — não substituição total.
Cada item carrega _acao ∈ "incluir" |
"alterar" | "excluir" (default
"incluir"). Para alterar e
excluir, a fachada injeta LINPOS
automaticamente apontando para
G1_COD+G1_COMP+G1_TRT; para excluir,
também adiciona AUTDELETA="S". Componentes não
enviados permanecem como estão na grade — diferente do PUT do
WsSG1 (MATA200), que faz replace.
Flags de revisão (ATUREVSB1,
AUTREVPAI). ATUREVSB1 em
"S" faz o PCPA200 propagar a alteração para
B1_REVATU / B1_UREV em SB1;
em "N" (default), apenas SG1 muda.
AUTREVPAI é a revisão do pai e só se aplica em
modo 4 (alteração); 3 caracteres, padded em branco. O
comportamento depende de MV_REVAUT.
Recálculo de níveis (NIVALT).
Default "S" — recalcula a estrutura ao gravar
(consistente, porém mais caro). Em carga em massa considere
"N" e dispare o recálculo dedicado depois. Em
DELETE o endpoint fixa NIVALT="S" no
cabeçalho mínimo passado ao PCPA200.
Datas de vigência. G1_INI e
G1_FIM no payload aceitam string no formato
AAAAMMDD ou YYYY-MM-DD (o endpoint
remove os hífens antes do SToD). Quando ausentes,
aplica os defaults TDN: G1_INI = 01/01/2000 e
G1_FIM = 31/12/2049.
DELETE não atualiza SB1. Comportamento da
rotina PCPA200: a exclusão integral da estrutura (modo 5)
não propaga para B1_REVATU /
B1_UREV, mesmo com revisão automática ligada.
Detalhe na TDN seção 4.3.3.
Tuplas com 3º elemento Nil.
O wrapper U_PC200Exc monta cabeçalho e itens como
tuplas { campo, valor, Nil } conforme exige a
PCPA200. Diferente do MATA200, este 3º slot é obrigatório
mesmo quando vazio.
Estrutura
CRUD por produto pai (G1_COD) via PCPA200Descrição
Retorna a estrutura completa do produto pai informado:
data.produto (eco do código) e
data.itens[] (todos os componentes em todos os
níveis). Aplica filtro de filial (xFilial("SG1"))
e usa o whitelist CAMPOS_ITEM_GET definido no
.prw:
G1_COD|G1_COMP|G1_TRT|G1_QUANT|G1_PERDA|G1_INI|G1_FIM|G1_REVINI|G1_REVFIM.
Se o DbSeek em SG1 falha — ou
posiciona mas não retorna nenhuma linha sob o mesmo
G1_COD + filial — o endpoint responde
404 com mensagem editorial
("Estrutura não encontrada." / "Estrutura sem componentes.").
Path parameter
PadR para o tamanho do SX3 antes do DbSeek.Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsSG1Nw/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success, message, data: { produto, itens[] } }. Veja EstruturaConsulta.G1_COD; para listagem use /WsSG1Nw/_list. Tier: validation-error.Descrição
Inclui uma nova estrutura via PCPA200 em modo
3 (insert completo). O endpoint:
- Pré-valida que não existe estrutura prévia em
SG1para oG1_COD— caso contrário retorna 409. - Valida produto pai e cada componente em
SB1— 422 se ausente. - Aplica defaults:
NIVALT="S",ATUREVSB1="N",G1_TRT=Space(3),G1_PERDA=0,G1_INI=01/01/2000,G1_FIM=31/12/2049. - Quando
itens[].G1_CODestá vazio, defaulta paracabecalho.G1_COD. - Repassa para
U_PC200Exc, que invocaMsExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,aItem,3)sob transação.
Exceções não tratadas viram 500 com mensagem editorial
"Erro interno: …"; stack completo em
console_rest.log.
Path parameter
cabecalho.G1_COD do body.Request body
cabecalho (produto pai
+ flags de revisão) + array itens com 1+
componentes em todos os níveis. Schema completo em
PayloadInclusao.
POST https://erpapi.jetme.com.br/api/99/01/WsSG1Nw/INCLUIR/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "cabecalho": { "G1_COD": "PA001", "G1_QUANT": 5, "ATUREVSB1": "N", "NIVALT": "S" }, "itens": [ { "G1_COD": "PA001", "G1_COMP": "MP001", "G1_QUANT": 1 }, { "G1_COD": "PA001", "G1_COMP": "MP002", "G1_QUANT": 2 } ] }
POST https://erpapi.jetme.com.br/api/99/01/WsSG1Nw/INCLUIR/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "cabecalho": { "G1_COD": "PA001", "G1_QUANT": 5, "ATUREVSB1": "N", "NIVALT": "S" }, "itens": [ { "G1_COD": "PA001", "G1_COMP": "MP001", "G1_TRT": "", "G1_QUANT": 1, "G1_PERDA": 0, "G1_INI": "20000101", "G1_FIM": "20491231" }, { "G1_COD": "PA001", "G1_COMP": "PI001", "G1_QUANT": 1 }, { "G1_COD": "PI001", "G1_COMP": "MP003", "G1_QUANT": 3 } ] }
Respostas
RespOk com data.produto = código do produto pai.cabecalho ou itens faltando, G1_COD ausente. Tier: validation-error.PUT em vez disso. Tier: business-error.SB1, G1_QUANT ≤ 0 no cabeçalho, ou rejeição do MsExecAuto (unidade incompatível, regra de negócio NEWPCP, MV_NEGESTR bloqueia quantidade negativa, etc). Tier: business-error.console_rest.log.Descrição
Altera a estrutura via PCPA200 em modo
4 (delta). O endpoint verifica que a estrutura
existe (DbSeek em SG1) antes de
invocar a rotina automática; caso contrário, 404.
Delta por item. Cada item declara
_acao ∈ "incluir" |
"alterar" | "excluir" (default
"incluir"). A fachada injeta automaticamente:
LINPOS = "G1_COD+G1_COMP+G1_TRT"com os 3 valores correspondentes paraalterareexcluir;AUTDELETA = "S"adicional paraexcluir.
Componentes não enviados permanecem na
grade (diferente do PUT do WsSG1/MATA200, que faz replace
total). Para alterações exclusivamente em campos do
cabeçalho do pai (ex: G1_QUANT base, revisão),
ainda é necessário enviar o array itens com
pelo menos uma linha — o validador rejeita
itens vazio em modo 4.
Path parameter
SG1 (caso contrário 404).Request body
PUT https://erpapi.jetme.com.br/api/99/01/WsSG1Nw/ALTERAR/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "cabecalho": { "G1_COD": "PA001", "G1_QUANT": 5, "ATUREVSB1": "S", "NIVALT": "S" }, "itens": [ { "G1_COD": "PA001", "G1_COMP": "MP001", "G1_TRT": "", "G1_QUANT": 10, "_acao": "alterar" }, { "G1_COD": "PA001", "G1_COMP": "MP002", "G1_TRT": "", "_acao": "excluir" }, { "G1_COD": "PA001", "G1_COMP": "PI003", "G1_QUANT": 5 } ] }
PUT https://erpapi.jetme.com.br/api/99/01/WsSG1Nw/ALTERAR/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Content-Type: application/json Accept: application/json { "cabecalho": { "G1_COD": "PA001", "G1_QUANT": 5, "ATUREVSB1": "S", "AUTREVPAI": "A01", "NIVALT": "S" }, "itens": [ { "G1_COD": "PA001", "G1_COMP": "MP001", "G1_TRT": "", "G1_QUANT": 10, "G1_PERDA": 3.5, "_acao": "alterar" } ] }
Respostas
RespOk com data.produto.SB1, item alvo do _acao="alterar" sem LINPOS resolvido, validação PCPA200 falhou (revisão, datas, regra NEWPCP). Tier: business-error.Descrição
Remove integralmente a estrutura do produto pai (todos os
componentes em todos os níveis) via PCPA200
em modo 5. O endpoint posiciona SG1
em xFilial+G1_COD antes de chamar o wrapper,
e monta apenas o cabeçalho mínimo
(G1_COD + NIVALT="S") — itens
são ignorados pela rotina em modo 5.
Não atualiza SB1. Por design do PCPA200,
a exclusão não altera B1_REVATU /
B1_UREV mesmo com revisão automática ligada
(TDN seção 4.3.3). Para uma árvore PA → PI → MP, o
consumidor deve chamar DELETE em cada nível,
do mais alto para o mais baixo — o endpoint não percorre
filhos automaticamente.
Path parameter
Chamada de exemplo
DELETE https://erpapi.jetme.com.br/api/99/01/WsSG1Nw/EXCLUIR/PA001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, message } — sem bloco data.G1_COD). Tier: validation-error.MsExecAuto (estrutura referenciada por OP, planejamento, etc). Tier: business-error.Recover Using).Listagem
Produtos-pai com estrutura cadastradaDescrição
Lista produtos-pai distintos (1 linha por G1_COD)
com estrutura cadastrada em SG1. Aplica filtro de
filial e suporta prefixo de G1_COD via query
param cod (usado em DbSeek(.T.)
para posicionar o início do scan).
Paginação simples via page / pageSize;
não há cursor / delta-sync nesta versão. A resposta atual
traz apenas o código do produto pai — para detalhar uma
estrutura específica, encadeie com
GET /WsSG1Nw/{produto}.
Query parameters
G1_COD — usado em DbSeek(.T.) para posicionar o início do scan (filtro server-side).1).Chamada de exemplo
GET https://erpapi.jetme.com.br/api/99/01/WsSG1Nw/_list?cod=PA&pageSize=10 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsSG1Nw/_list?page=2&pageSize=50 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
Schemas
Definições canônicas — campos com origemSX3 rastreável
PUT /WsSG1Nw/ALTERAR/{produto}.
Composição idêntica ao PayloadInclusao
(allOf), porém cada item pode declarar a propriedade
extra _acao ∈ incluir | alterar | excluir
que decide o comportamento do PCPA200 modo 4. Campos do cabeçalho
específicos do modo 4 (AUTREVPAI) também só fazem
sentido aqui.
{ campo, valor, Nil } para a PCPA200.
SB1.nQuant ≤ 0 retorna 422.SB1 (B1_REVATU/B1_UREV).SNMV_REVAUT."S") ou não ("N"). Em DELETE, fixado em "S" pelo endpoint.SNG1_COD aqui pode diferir do
cabecalho.G1_COD para declarar sub-níveis
(intermediários). Quando ausente, o endpoint o iguala ao
cabecalho.G1_COD.
SB1 — validado antes do PCPA200; ausência retorna 422.LINPOS no PUT delta.MV_NEGESTR=.T..AAAAMMDD ou YYYY-MM-DD; conversão interna via SToD após remover hífens.G1_INI.alterar/excluir disparam injeção automática de LINPOS (e AUTDELETA="S" em exclusão).incluiralterarexcluirGET /WsSG1Nw/{produto} em
data.itens[]. Whitelist
CAMPOS_ITEM_GET definido no .prw.
Datas serializadas como AAAAMMDD via
DToS.
AAAAMMDD).AAAAMMDD).ATUREVSB1="S").GET /WsSG1Nw/{produto}.
data.itens[] traz todos os componentes em todos
os níveis encontrados em SG1, na ordem natural
do índice 1 (filial + G1_COD).
true em respostas 200.G1_COD consultado, trimmed.ItemRetorno.GET /WsSG1Nw/_list —
uma linha por produto-pai distinto. Não traz componentes;
para detalhar a estrutura, chame
GET /WsSG1Nw/{produto} com o G1_COD
retornado.
DELETE
omite o bloco data (envelope simples só com
success + message).
true em respostas de sucesso.cabecalho.G1_COD) — presente em POST e PUT, ausente em DELETE.message traz o
motivo em linguagem editorial; em 422 carrega o retorno do
MsExecAuto via U_PC200Exc (lendo
NomeAutoLog()) quando aplicável.
false em erros.