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:
PED1— cabeçalho do pedido ou ordem de compra (pessoa, tipo de movimento, condição/forma de pagamento, datas, status).PED2— itens do pedido (produto, quantidade, unidade, preço, descontos).
A distinção entre pedido de venda e ordem de compra é feita pelo campo PED1.CF_TIPO:
| CF_TIPO | Significado |
|---|---|
C | Pedido de venda — operação de saída. A pessoa é o cliente. Gera contas a receber. Esta página trata deste caso. |
F | Ordem 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>
<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 o pedido) |
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 um pedido de venda 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 o pedido (
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 (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:
- 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 acessoSpaComFecharCadeadoPedido1(fechar) e, se for reabrir,SpaComAbrirCadeadoPedido1(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 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:
| Cadastro | Campo em PED1/PED2 | Observação |
|---|---|---|
Cliente (CLIFOR1) | CF_COD | Pessoa do tipo cliente, cadastro completo e ativo. Ver página Cadastro de Pessoas. |
Tipo de Movimento (TMOV) | TM_COD | Deve 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_COD | Cada item aponta para um produto cadastrado, obrigatoriamente com NCM. |
Condição de Pagamento (PRAZO) | PZ_COD | Validada para o tipo C. |
Forma de Pagamento (FORPAG) | FP_COD | Validada para o tipo C. |
Carteira de Cobrança (PORTA) | PT_COD | Pode ter restrição por cliente. |
Local de Estoque (LOCEST) | LE_COD | Precisa estar ativo. |
Centro de Custo (SETOR) | ST_COD | Validado na inclusão. |
Vendedor / Representante (VEND) | VD_COD | Precisa estar ativo. Pode haver controle de carteira de clientes. |
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 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:
| Campo | Descrição |
|---|---|
FL_COD | Código da empresa/filial. |
CF_TIPO | Fixo "C" para pedido de venda. |
PE_COD | Código do pedido obtido no Passo 2. |
CF_COD | Código do cliente (pessoa). |
TM_COD | Tipo de movimento (saída/venda). Campo central: dirige documento, estoque, preço e tributação. |
VD_COD | Vendedor / representante. |
PZ_COD | Condição de pagamento. |
FP_COD | Forma de pagamento. |
PT_COD | Carteira de cobrança. |
LE_COD | Local de estoque. |
ST_COD | Centro de custo. |
TR_COD | Transportadora. |
PE_DAT | Data 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:
PE_ID— sequencial único (maior + 1).PE_STATUS— um pedido nunca é incluído fechado; 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),PE_OBS(observação padrão do cliente) ePE_CLAUSULA— quando não informados.
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
| Campo | Descrição |
|---|---|
FL_COD, CF_TIPO, PE_COD | Iguais aos do cabeçalho (CF_TIPO = "C"). |
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 venda do produto. |
PE_PRCCONVCHEIO | Preç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
PE_ITM— número do item; auto-incrementado (maior item do pedido + 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,PE_UNIEST,PE_FATOR,PE_FATCONV,PE_QTD,PE_QTDEST,PE_PRC,PE_SALQTD.
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âmetro | Descrição |
|---|---|
VFL_COD | Código da empresa (igual ao FL_COD do pedido). |
VCF_TIPO | "C" para pedido de venda. |
VPE_COD | Código do pedido (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": "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:
- Permissão de cadeado — o usuário do
userTokenprecisa do acessoSpaComFecharCadeadoPedido1. - Recálculo automático — se o pedido estiver pendente (
PE_TOT_CALCULADO = 0), o servidor chamaPRC_CALCULAPEDIDO. - Validação de crédito do cliente — limites e situação cadastral.
- Faturamento mínimo — se a condição de pagamento exigir valor mínimo, o total líquido é conferido.
- Liberação do pedido — regras de liberação comercial são executadas.
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.
- Totais do pedido — 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 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 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:
- Tipo de movimento incompatível com
CF_TIPO = 'C', ou tipo de documento de ajuste/complementar (não permitido em pedido). - Vendedor, local de estoque ou cliente inativos.
- Condição/forma de pagamento inválida para o tipo de operação.
- Cliente com inadimplência ou fora da carteira do vendedor (regra específica de venda).
- Produto sem NCM, ou desconto acima do máximo permitido.
- Chave primária duplicada (
PE_CODjá usado — ver concorrência no Passo 2). - No fechamento: usuário sem permissão de cadeado, crédito insuficiente ou faturamento abaixo do mínimo.
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:
- Financeiro (contas a receber) — o pedido de venda gera os títulos a receber do cliente, 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 (reserva) no local de estoque informado.
- Cliente — 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 ordens de compra (CF_TIPO = 'F'), consulte a página Ordem de Compra.