Gravação de Pedidos de Venda (PED1 / PED2) — Documentação Complementar

Sequência operacional para criar pedidos de venda (CF_TIPO = 'C') 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 um pedido de venda completo — cabeçalho, itens, cálculo e fechamento — via API.

Um pedido reside em duas tabelas principais do banco:

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

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

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

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 o pedido)
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 um pedido de venda 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 o pedido (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 (Pedido de Venda) — 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 pedidos 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 um pedido, 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
Cliente (CLIFOR1)CF_CODPessoa do tipo cliente, cadastro completo e ativo. Ver página Cadastro de Pessoas.
Tipo de Movimento (TMOV)TM_CODDeve ser um tipo de saída/venda compatível com CF_TIPO = 'C'. Define o tipo de documento, controle de estoque, preço e tributação. Ex.: S001.
Produto (PROD)PD_CODCada item aponta para um produto cadastrado, obrigatoriamente com NCM.
Condição de Pagamento (PRAZO)PZ_CODValidada para o tipo C.
Forma de Pagamento (FORPAG)FP_CODValidada para o tipo C.
Carteira de Cobrança (PORTA)PT_CODPode ter restrição por cliente.
Local de Estoque (LOCEST)LE_CODPrecisa estar ativo.
Centro de Custo (SETOR)ST_CODValidado na inclusão.
Vendedor / Representante (VEND)VD_CODPrecisa estar ativo. Pode haver controle de carteira de clientes.
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 do pedido (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 = 'C') + 1

Recupere esse máximo com uma consulta prévia (method: GET) sobre PED1. 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 pedidos 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 "C" para pedido de venda.
PE_CODCódigo do pedido obtido no Passo 2.
CF_CODCódigo do cliente (pessoa).
TM_CODTipo de movimento (saída/venda). Campo central: dirige documento, estoque, preço e tributação.
VD_CODVendedor / representante.
PZ_CODCondição de pagamento.
FP_CODForma de pagamento.
PT_CODCarteira de cobrança.
LE_CODLocal de estoque.
ST_CODCentro de custo.
TR_CODTransportadora.
PE_DATData de emissão do pedido.

Campos preenchidos automaticamente pelo servidor

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

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 do pedido)

{
    "method": "POST",
    "objectType": "TABLE",
    "objectName": "PED1",
    "dataFields": [
        { "name": "FL_COD",    "value": 1 },
        { "name": "CF_TIPO",   "value": "C" },
        { "name": "PE_COD",    "value": 99 },
        { "name": "CF_COD",    "value": 150 },
        { "name": "TM_COD",    "value": "S001" },
        { "name": "VD_COD",    "value": 26 },
        { "name": "PZ_COD",    "value": 30 },
        { "name": "FP_COD",    "value": 1001 },
        { "name": "PT_COD",    "value": 1001 },
        { "name": "LE_COD",    "value": 1 },
        { "name": "ST_COD",    "value": 5 },
        { "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 = "C").
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 venda do produto.
PE_PRCCONVCHEIOPreço unitário "cheio" na unidade informada. Opcional: se omitido, o sistema sugere o preço da tabela de preços.

Campos preenchidos automaticamente pelo servidor

Validações de preço/desconto no item (tipo C). Para pedidos de venda, a inclusão do item aplica a rotina de desconto máximo/mínimo e, se a empresa usar composição de desconto, o preço não pode ficar abaixo do sugerido. Documentos e certificados do cliente/produto também são validados. Descontos podem ser enviados via PE_PDCCHEIO (%) ou PE_VDCCHEIO (valor).

Exemplo — POST PED2 (um item)

{
    "method": "POST",
    "objectType": "TABLE",
    "objectName": "PED2",
    "dataFields": [
        { "name": "FL_COD",          "value": 1 },
        { "name": "CF_TIPO",         "value": "C" },
        { "name": "PE_COD",          "value": 99 },
        { "name": "PD_COD",          "value": 120 },
        { "name": "PE_UNICONV",      "value": "KG" },
        { "name": "PE_QTDCONV",      "value": "1000" },
        { "name": "PE_PRCCONVCHEIO", "value": "100.00" }
    ]
}

Repita a requisição, alterando PD_COD/quantidade/preço, para cada produto do pedido. Cada inclusão marca o pedido 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 o pedido: apura os impostos e valores de cada item, totaliza o cabeçalho (tabela PEDT) e gera o financeiro.

Parâmetros

ParâmetroDescrição
VFL_CODCódigo da empresa (igual ao FL_COD do pedido).
VCF_TIPO"C" para pedido de venda.
VPE_CODCódigo do pedido (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": "C" },
        { "name": "VPE_COD",  "value": 99 }
    ]
}

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

Por que chamar explicitamente? O fechamento do pedido (Passo 6) também recalcula automaticamente quando o pedido 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 o pedido ainda aberto e editável, e garante que o fechamento valide o crédito do cliente sobre valores já apurados.

Com o pedido calculado e conferido, 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 C)

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

Exemplo — PUT PED1 (fechar o pedido)

{
    "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": "C" },
        { "type": "field", "name": "PE_COD",  "key": true, "value": 99 }
    ]
}

Reabrir um pedido fechado (PE_STATUS 1 → 0) exige o acesso SpaComAbrirCadeadoPedido1 e é bloqueado quando o pedido já foi liberado ou possui nota fiscal de troca vinculada.

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 pedidos 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 um pedido de venda:

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 Pedido de Venda 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) do pedido de venda 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 ordens de compra (CF_TIPO = 'F'), consulte a página Ordem de Compra.