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:
PED1— cabeçalho do pedido ou ordem de compra (pessoa, tipo de movimento, condição/forma de pagamento, datas, status).PED2— itens (produto, quantidade, unidade, preço de compra).
A distinção entre pedido de venda e ordem de compra é feita pelo campo PED1.CF_TIPO:
| CF_TIPO | Significado |
|---|---|
F | Ordem de compra — operação de entrada. A pessoa é o fornecedor. Gera contas a pagar. Esta página trata deste caso. |
C | Pedido 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>
<host>— endereço do servidor que hospeda a API.<porta>— porta de comunicação configurada no servidor.<token>— token de identificação (userToken) fornecido pela equipe responsável pela API.
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.
| Item | Valor |
|---|---|
| Endpoint único | /root/integrador |
| Verbo HTTP | PATCH (padrão, obrigatório para gravação). POST/GET são alternativas apenas para leitura. |
| Autenticação | Header ou query param userToken. |
| Operação real | Campo "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 SQL | Objetos | Uso nesta página |
|---|---|---|---|
GET | Consulta (SELECT) | TABLE, VIEW, FUNCTION, PROCEDURE RESULT | Passos 2 e 7 |
POST | Inserção (INSERT) | TABLE | Passos 3 e 4 (PED1, PED2) |
PUT | Atualização (UPDATE) | TABLE | Passo 6 (fechar a O.C.) |
PATCH | Executar procedure | PROCEDURE, FUNCTION | Passo 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:
- Criar o cabeçalho (
method: POSTemPED1) comPE_STATUS = 0(cadeado aberto, editável). - Inserir os itens (
method: POSTemPED2), um por produto. - Calcular a ordem (
method: PATCHna procedurePRC_CALCULAPEDIDO) — apura impostos, valores dos itens, totais e o financeiro. - Fechar o cabeçalho (
method: PUTemPED1) alterandoPE_STATUSpara1(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:
- Verbos de escrita nos objetos. Os métodos
POST,PUTePATCHprecisam estar habilitados para os objetosPED1,PED2e para a procedurePRC_CALCULAPEDIDOna sua chave de API. Sem isso, as requisições de escrita não são aceitas. - Permissão de usuário para fechar o cadeado. O usuário vinculado ao
userTokenprecisa ter o nível de acessoSpaComFecharCadeadoOrdComp1(fechar) e, se for reabrir,SpaComAbrirCadeadoOrdComp1(abrir). A validação é a mesma da tela do ERP.
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:
| Cadastro | Campo em PED1/PED2 | Observação |
|---|---|---|
Fornecedor (CLIFOR1) | CF_COD | Pessoa do tipo fornecedor, cadastro completo e ativo. Ver página Cadastro de Pessoas. |
Tipo de Movimento (TMOV) | TM_COD | Deve 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_COD | Cada item aponta para um produto cadastrado, obrigatoriamente com NCM. |
Condição de Pagamento (PRAZO) | PZ_COD | Validada para o tipo F. |
Forma de Pagamento (FORPAG) | FP_COD | Validada para o tipo F. |
Carteira de Cobrança (PORTA) | PT_COD | Referência de portador. |
Local de Estoque (LOCEST) | LE_COD | Precisa estar ativo; é onde a mercadoria dará entrada. |
Centro de Custo (SETOR) | ST_COD | Validado na inclusão. |
Comprador (VEND) | VD_COD | Na O.C., o campo VD_COD representa o comprador. Precisa estar ativo. |
Transportadora (TRANS) | TR_COD | Obrigató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:
| Campo | Descrição |
|---|---|
FL_COD | Código da empresa/filial. |
CF_TIPO | Fixo "F" para ordem de compra. |
PE_COD | Código da O.C. obtido no Passo 2. |
CF_COD | Código do fornecedor (pessoa). |
TM_COD | Tipo de movimento (entrada/compra). Campo central: dirige documento, estoque, preço e tributação. |
VD_COD | Comprador. |
PZ_COD | Condição de pagamento. |
FP_COD | Forma de pagamento. |
PT_COD | Carteira de cobrança / portador. |
LE_COD | Local de estoque de entrada. |
ST_COD | Centro de custo. |
TR_COD | Transportadora. |
PE_DAT | Data 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:
PE_ID— sequencial único (maior + 1).PE_STATUS— uma O.C. nunca é incluída fechada; na inclusão o valor é forçado para0(aberto), mesmo que você envie outro valor.CF_COD2eCF_COD3— quando nulos, recebem o próprioCF_COD.PE_CTRLESTOQUEePE_USAPRECOCHEIO— derivados do tipo de movimento (TM_COD).PE_USERCTRL,PE_DATPRO,PE_STATUSDATA— usuário e datas de controle.TBP_COD(tabela de preço) ePE_CLAUSULA(modelo padrão de O.C.) — quando não informados.
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
| Campo | Descrição |
|---|---|
FL_COD, CF_TIPO, PE_COD | Iguais aos do cabeçalho (CF_TIPO = "F"). |
PD_COD | Código do produto. |
PE_QTDCONV | Quantidade na unidade operacional (a "quantidade" que o usuário digitaria). |
PE_UNICONV | Unidade dessa quantidade. Se omitida, assume a unidade de compra do produto. |
PE_PRCCONVCHEIO | Preç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
PE_ITM— número do item; auto-incrementado (maior item da O.C. + 1) quando enviado como0ou omitido.TM_COD2— tipo de movimento do item; herda oTM_CODdo cabeçalho quando não informado.PD_CODNCM— NCM do produto (erro se o produto não tiver NCM).PE_PRCSUG,PE_PRCBASE,TBP_COD,FAT_COD— preço sugerido/base e fator, buscados na tabela de preços.- Unidades e quantidades derivadas:
PE_UNI(para compra, assume a unidade de compra do produto),PE_UNIEST,PE_FATOR,PE_FATCONV,PE_QTD,PE_QTDEST,PE_PRC,PE_SALQTD.
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âmetro | Descrição |
|---|---|
VFL_COD | Código da empresa (igual ao FL_COD da O.C.). |
VCF_TIPO | "F" para ordem de compra. |
VPE_COD | Código da O.C. (PE_COD). |
VOP | Opcional. 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:
- Permissão de cadeado — o usuário do
userTokenprecisa do acessoSpaComFecharCadeadoOrdComp1. - Recálculo automático — se a O.C. estiver pendente (
PE_TOT_CALCULADO = 0), o servidor chamaPRC_CALCULAPEDIDO. - Validação de crédito / limite da pessoa — conforme cadastro do fornecedor.
- Liberação da ordem de compra — regras de liberação de compra são executadas.
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.
- Totais da O.C. — consulte a tabela
PEDT(porFL_COD,CF_TIPO,PE_COD) para ver total bruto, líquido, impostos e o indicadorPE_TOT_CALCULADO. - Cabeçalho —
GETemPED1confirmaPE_STATUSe demais campos resolvidos pelo servidor. - Itens —
GETemPED2filtrado peloPE_CODmostra as quantidades, unidades e valores calculados. - Próximo código (Passo 2) — recuperar o maior
PE_CODatual (comCF_TIPO = 'F') antes de uma nova inclusão.
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:
- Tipo de movimento incompatível com
CF_TIPO = 'F', ou tipo de documento de ajuste/complementar (não permitido). - Comprador, local de estoque ou fornecedor inativos.
- Condição/forma de pagamento inválida para o tipo de operação.
- Produto sem NCM.
- Chave primária duplicada (
PE_CODjá usado — ver concorrência no Passo 2). - No fechamento: usuário sem permissão de cadeado (
SpaComFecharCadeadoOrdComp1).
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:
- Financeiro (contas a pagar) — a O.C. gera os títulos a pagar ao fornecedor, conforme a condição e a forma de pagamento. Consulte a página Contas a Pagar/Receber para o ciclo de lançamento e baixa de títulos.
- Estoque — quando o tipo de movimento controla estoque, os itens geram saldo pendente de entrada no local de estoque informado; a entrada efetiva ocorre na conferência/recebimento.
- Fornecedor — o
CF_CODé a contraparte obrigatória. Ver Cadastro de Pessoas.
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.