Gravação de Ordens de Compra (PED1 / PED2) — Documentação Complementar

Sequência operacional para criar ordens de compra (CF_TIPO = 'F') via API do ERP Spalla

1. Introdução


Esta página é uma documentação complementar ao dicionário automático da API do ERP Spalla. Seu propósito é descrever a ordem operacional em que o integrador externo (ou um agente de IA) deve executar as chamadas para gravar uma ordem de compra completa — cabeçalho, itens, cálculo e fechamento — via API.

Uma ordem de compra reside nas mesmas duas tabelas de um pedido:

A distinção entre pedido de venda e ordem de compra é feita pelo campo PED1.CF_TIPO:

CF_TIPOSignificado
FOrdem de compra — operação de entrada. A pessoa é o fornecedor. Gera contas a pagar. Esta página trata deste caso.
CPedido de venda — operação de saída. A pessoa é o cliente. Gera contas a receber. Consulte a página Pedido de Venda.

Escopo desta página. Todos os exemplos usam CF_TIPO = "F". O fluxo de gravação de pedido de venda (CF_TIPO = "C") é idêntico na sequência de passos, mudando o tipo de movimento e algumas validações — está descrito na página irmã Pedido de Venda.

Esta página não substitui o dicionário oficial da sua instância. Todos os detalhes técnicos — lista completa de campos, tipos de dados, obrigatoriedade e estrutura de retorno — estão no dicionário oficial e devem ser consultados lá.

2. Onde encontrar o dicionário oficial da sua API


Cada empresa que opera o ERP Spalla expõe o seu próprio dicionário automático em um endereço próprio. Para acessá-lo, abra no navegador a URL no formato abaixo, substituindo os placeholders pelos valores da sua instância:

https://<host>:<porta>/root/dicionario?userToken=<token>

O dicionário oficial é a fonte autoritativa para a lista de campos de PED1 e PED2, seus tipos, obrigatoriedade e a lista de objetos e verbos liberados para a sua API.

3. Como a API funciona


A API do Spalla utiliza um conceito diferente do REST tradicional. Todas as requisições são enviadas para um único endpoint, e a operação real no banco de dados não é determinada pelo verbo HTTP, e sim por um campo "method" dentro do corpo JSON.

ItemValor
Endpoint único/root/integrador
Verbo HTTPPATCH (padrão, obrigatório para gravação). POST/GET são alternativas apenas para leitura.
AutenticaçãoHeader ou query param userToken.
Operação realCampo "method" dentro do corpo JSON.

O campo "method" do corpo aceita os seguintes valores, cada um com o tipo de objeto a que se aplica:

method (no corpo)Operação SQLObjetosUso nesta página
GETConsulta (SELECT)TABLE, VIEW, FUNCTION, PROCEDURE RESULTPassos 2 e 7
POSTInserção (INSERT)TABLEPassos 3 e 4 (PED1, PED2)
PUTAtualização (UPDATE)TABLEPasso 6 (fechar a O.C.)
PATCHExecutar procedurePROCEDURE, FUNCTIONPasso 5 (calcular)

Não confunda os dois níveis. O verbo HTTP da requisição é sempre PATCH (para gravação); o "verbo" que define a operação no banco é o campo "method" do JSON. Uma inclusão em PED1 é uma requisição HTTP PATCH cujo corpo contém "method": "POST".

4. Visão geral do fluxo


A gravação de uma ordem de compra segue quatro operações via API, sempre nesta ordem, precedidas pelos cadastros de retaguarda:

  1. Criar o cabeçalho (method: POST em PED1) com PE_STATUS = 0 (cadeado aberto, editável).
  2. Inserir os itens (method: POST em PED2), um por produto.
  3. Calcular a ordem (method: PATCH na procedure PRC_CALCULAPEDIDO) — apura impostos, valores dos itens, totais e o financeiro.
  4. Fechar o cabeçalho (method: PUT em PED1) alterando PE_STATUS para 1 (cadeado fechado, concluído).

Toda inclusão e alteração via API passa pelas mesmas regras de validação aplicadas quando a operação é feita pela tela do ERP (Ordem de Compra) — as validações são executadas no servidor e atuam igualmente em todos os canais de entrada.

5. Diagrama de execução


Convenção visual: azul (Retaguarda do ERP) · verde (Via API).

6. Aviso sobre liberação na retaguarda


Atenção — liberações necessárias na retaguarda.

A gravação de ordens de compra via API depende de duas liberações controladas na retaguarda do ERP pela operação responsável pela API:

A lista de verbos efetivamente liberados aparece no próprio dicionário oficial da sua instância.

Antes de gravar uma ordem de compra, os cadastros abaixo precisam existir no ERP, porque são referenciados pelo cabeçalho (PED1) ou pelos itens (PED2) e validados pelo servidor na inclusão:

CadastroCampo em PED1/PED2Observação
Fornecedor (CLIFOR1)CF_CODPessoa do tipo fornecedor, cadastro completo e ativo. Ver página Cadastro de Pessoas.
Tipo de Movimento (TMOV)TM_CODDeve ser um tipo de entrada/compra compatível com CF_TIPO = 'F'. Define o tipo de documento, controle de estoque, preço e tributação. Ex.: E001.
Produto (PROD)PD_CODCada item aponta para um produto cadastrado, obrigatoriamente com NCM.
Condição de Pagamento (PRAZO)PZ_CODValidada para o tipo F.
Forma de Pagamento (FORPAG)FP_CODValidada para o tipo F.
Carteira de Cobrança (PORTA)PT_CODReferência de portador.
Local de Estoque (LOCEST)LE_CODPrecisa estar ativo; é onde a mercadoria dará entrada.
Centro de Custo (SETOR)ST_CODValidado na inclusão.
Comprador (VEND)VD_CODNa O.C., o campo VD_COD representa o comprador. Precisa estar ativo.
Transportadora (TRANS)TR_CODObrigatória; use o código da transportadora padrão quando não houver frete.

Esses cadastros são mantidos pela operação dentro do próprio ERP. Para conhecer os objetos exatos e as chaves de referência aceitas, consulte o dicionário oficial da sua instância.

O código da ordem de compra (PE_COD) compõe a chave primária de PED1 junto com FL_COD (empresa) e CF_TIPO, e deve ser informado pelo integrador na criação. O ERP não gera esse código em uma sequence dedicada — a regra é: o próximo código livre é o maior PE_COD existente, para a mesma empresa e tipo, mais 1.

próximo PE_COD = MAX(PE_COD em PED1 onde FL_COD = empresa e CF_TIPO = 'F') + 1

Recupere esse máximo com uma consulta prévia (method: GET) sobre PED1. Note o filtro CF_TIPO = 'F': pedidos de venda e ordens de compra têm numeração independente. A forma exata de pedir o agregado está no dicionário oficial, na entrada do objeto PED1.

Cuidado com concorrência. Com múltiplos integradores criando O.C. simultaneamente, dois processos podem obter o mesmo "próximo código" e o segundo POST falhar por violação de chave primária. Serialize a sequência consultar o próximo código → enviar o POST, ou trate o erro de chave duplicada e tente novamente com o próximo código.

Não confunda com PE_ID. A coluna PE_ID (sequencial único global) é preenchida automaticamente pelo servidor, no momento da inclusão — não a envie. Quem você calcula e envia é o PE_COD.

Com o PE_COD livre obtido, inclua o cabeçalho por uma requisição com "method": "POST" sobre a tabela PED1.

Campos obrigatórios (não preenchidos automaticamente)

Os campos abaixo são NOT NULL e não têm preenchimento automático — precisam vir no corpo da requisição:

CampoDescrição
FL_CODCódigo da empresa/filial.
CF_TIPOFixo "F" para ordem de compra.
PE_CODCódigo da O.C. obtido no Passo 2.
CF_CODCódigo do fornecedor (pessoa).
TM_CODTipo de movimento (entrada/compra). Campo central: dirige documento, estoque, preço e tributação.
VD_CODComprador.
PZ_CODCondição de pagamento.
FP_CODForma de pagamento.
PT_CODCarteira de cobrança / portador.
LE_CODLocal de estoque de entrada.
ST_CODCentro de custo.
TR_CODTransportadora.
PE_DATData de emissão da O.C.

Campos preenchidos automaticamente pelo servidor

Não é necessário enviar os campos abaixo; o servidor os resolve na inclusão:

Campos opcionais úteis à O.C.: PE_NOTAS (observações/notas da ordem de compra) e PE_PAGFRT (tipo de frete).

Sobre PE_STATUS. Envie 0 explicitamente por clareza, mas saiba que o servidor força 0 em qualquer INSERT. O fechamento (valor 1) só ocorre depois, via PUT (Passo 6), após o cálculo. Legenda: 0 = cadeado aberto (em edição) · 1 = cadeado fechado (concluído).

Exemplo — POST PED1 (cabeçalho da O.C.)

{
    "method": "POST",
    "objectType": "TABLE",
    "objectName": "PED1",
    "dataFields": [
        { "name": "FL_COD",    "value": 1 },
        { "name": "CF_TIPO",   "value": "F" },
        { "name": "PE_COD",    "value": 33 },
        { "name": "CF_COD",    "value": 107 },
        { "name": "TM_COD",    "value": "E001" },
        { "name": "VD_COD",    "value": 2 },
        { "name": "PZ_COD",    "value": 30 },
        { "name": "FP_COD",    "value": 1004 },
        { "name": "PT_COD",    "value": 1001 },
        { "name": "LE_COD",    "value": 1 },
        { "name": "ST_COD",    "value": 3 },
        { "name": "TR_COD",    "value": 1 },
        { "name": "PE_DAT",    "value": "2026-07-18" },
        { "name": "PE_STATUS", "value": 0 }
    ]
}

Valores ilustrativos. Os códigos acima são exemplos. Use os cadastros da sua instância. A lista completa e autoritativa de campos de PED1 está no dicionário oficial.

Com o cabeçalho criado, inclua um POST em PED2 para cada produto. A chave do item é (FL_COD, CF_TIPO, PE_COD, PE_ITM, PD_COD), e deve apontar para o cabeçalho recém-criado.

Campos que você informa

CampoDescrição
FL_COD, CF_TIPO, PE_CODIguais aos do cabeçalho (CF_TIPO = "F").
PD_CODCódigo do produto.
PE_QTDCONVQuantidade na unidade operacional (a "quantidade" que o usuário digitaria).
PE_UNICONVUnidade dessa quantidade. Se omitida, assume a unidade de compra do produto.
PE_PRCCONVCHEIOPreço unitário de compra na unidade informada. Opcional: se omitido, o sistema sugere o preço da tabela de preços de compra.

Campos preenchidos automaticamente pelo servidor

Diferenças da compra. Na O.C. não se aplicam as validações de desconto máximo/mínimo, inadimplência ou carteira de clientes (exclusivas da venda). O campo CO_COD (coleta de preços) pode ser vinculado ao item quando a compra deriva de uma cotação. Documentos e certificados do fornecedor/produto continuam sendo validados.

Exemplo — POST PED2 (um item)

{
    "method": "POST",
    "objectType": "TABLE",
    "objectName": "PED2",
    "dataFields": [
        { "name": "FL_COD",          "value": 1 },
        { "name": "CF_TIPO",         "value": "F" },
        { "name": "PE_COD",          "value": 33 },
        { "name": "PD_COD",          "value": 120 },
        { "name": "PE_UNICONV",      "value": "KG" },
        { "name": "PE_QTDCONV",      "value": "500" },
        { "name": "PE_PRCCONVCHEIO", "value": "42.50" }
    ]
}

Repita a requisição, alterando PD_COD/quantidade/preço, para cada produto da ordem. Cada inclusão marca a O.C. como pendente de cálculo (o total só é apurado no Passo 5).

Após inserir todos os itens, execute a procedure PRC_CALCULAPEDIDO por uma requisição com "method": "PATCH". É esse cálculo que consolida a O.C.: apura os impostos e valores de cada item, totaliza o cabeçalho (tabela PEDT) e gera o financeiro (contas a pagar).

Parâmetros

ParâmetroDescrição
VFL_CODCódigo da empresa (igual ao FL_COD da O.C.).
VCF_TIPO"F" para ordem de compra.
VPE_CODCódigo da O.C. (PE_COD).
VOPOpcional. 0 (padrão) = calcula itens e totais; 1 = calcula somente os totais.

Exemplo — PATCH PRC_CALCULAPEDIDO

{
    "method": "PATCH",
    "objectType": "PROCEDURE",
    "objectName": "PRC_CALCULAPEDIDO",
    "params": [
        { "name": "VFL_COD",  "value": 1 },
        { "name": "VCF_TIPO", "value": "F" },
        { "name": "VPE_COD",  "value": 33 }
    ]
}

Ao final, a procedure marca a O.C. como calculada (PEDT.PE_TOT_CALCULADO = 1) e dispara a geração/verificação do financeiro.

Por que chamar explicitamente? O fechamento da O.C. (Passo 6) também recalcula automaticamente quando está pendente. Ainda assim, chamar PRC_CALCULAPEDIDO de forma explícita antes de fechar é a boa prática: permite conferir os totais (Passo 7) com a O.C. ainda aberta e editável.

Com a O.C. calculada e conferida, feche o cabeçalho por uma requisição com "method": "PUT" sobre PED1, alterando PE_STATUS de 0 para 1 (cadeado fechado / concluído).

Regras do PUT. Envie apenas o campo a alterar em dataFields (não inclua campos de chave primária ali) e identifique o registro no where, marcando cada campo da chave primária (FL_COD, CF_TIPO, PE_COD) com "key": true.

O que o fechamento dispara (tipo F)

A transição de PE_STATUS 0 → 1 aciona, no servidor, uma sequência de validações e rotinas:

Diferente do pedido de venda, a O.C. não aplica a checagem de faturamento mínimo nem as regras de inadimplência/carteira de clientes.

Exemplo — PUT PED1 (fechar a O.C.)

{
    "method": "PUT",
    "objectType": "TABLE",
    "objectName": "PED1",
    "dataFields": [
        { "name": "PE_STATUS", "value": 1 }
    ],
    "where": [
        { "type": "field", "name": "FL_COD",  "key": true, "value": 1 },
        { "type": "field", "name": "CF_TIPO", "key": true, "value": "F" },
        { "type": "field", "name": "PE_COD",  "key": true, "value": 33 }
    ]
}

Reabrir uma O.C. fechada (PE_STATUS 1 → 0) exige o acesso SpaComAbrirCadeadoOrdComp1 e é bloqueado quando a O.C. já foi liberada.

Use requisições com "method": "GET" para conferir o resultado. O verbo de leitura é geralmente liberado mesmo quando os verbos de escrita são restritos.

Os parâmetros aceitos na consulta (fields, where, orderBy, limit, offset) e a estrutura de retorno estão descritos no dicionário oficial.

Validações e erros


As validações aplicadas à gravação de ordens de compra são as regras de negócio do ERP Spalla, executadas no servidor — integridade referencial e as validações próprias de PED1/PED2. Quando uma regra é violada, a mensagem original gerada pelo servidor é retornada no corpo da resposta da API.

Situações comuns que geram erro na inclusão de uma ordem de compra:

O integrador deve tratar a mensagem de erro retornada. As mensagens são definidas pela instalação do ERP e podem variar entre clientes; por isso, esta página não lista mensagens específicas.

Dica — identificar a tabela e o campo a partir da interface do ERP


Atalho para inspeção visual. Ao operar a tela de Ordem de Compra diretamente pela interface do ERP, pressione Ctrl + Alt + Shift + H. O sistema altera o título da janela indicando que o modo de identificação está ativo. A partir daí, ao parar o mouse sobre qualquer campo da tela, aparece um hintbox mostrando o nome da tabela e da coluna do banco às quais aquele campo está vinculado. É a forma mais rápida de mapear quais colunas de PED1/PED2 correspondem a cada campo da tela — e correlacioná-las com as chaves do JSON da API.

Relação com estoque e financeiro


O cálculo (Passo 5) e o fechamento (Passo 6) da ordem de compra desdobram-se em outros módulos do ERP:

Onde aprofundar


Esta página é um guia operacional — descreve o que fazer e em que ordem. Para como exatamente montar cada requisição (lista completa de campos de PED1/PED2, tipos de dado, obrigatoriedade, parâmetros da procedure e formato de datas/números), a fonte autoritativa é o dicionário oficial da sua instância, em https://<host>:<porta>/root/dicionario?userToken=<token>.

O dicionário é gerado dinamicamente a partir do banco de dados da própria instalação, refletindo sempre o estado atual da API liberada para aquela chave. Para a gravação de pedidos de venda (CF_TIPO = 'C'), consulte a página Pedido de Venda.