Perguntas Pedido/Orçamento (EmitirCupom)

Mais
1 mês 2 horas atrás #165 por Emerson
Pedido/Orçamento (EmitirCupom) foi criado por Emerson
API WSG1/SFI — Pedidos / Orçamentos (EmitirCupom)
Documentação técnica dos endpoints Datasnap REST do ERP SFI (WSG1) usados para criar e consultar pedidos/orçamentos, com base na implementação de referência do app PowerSales (pack_eres_cupom).




1. Visão geral
  • Base URL:
    http://{host_sfi}/Datasnap/rest/
  • Autenticação: HTTP Basic Auth (usuário/senha do vendedor/terminal logado)
  • Header:
    Accept: application/json
    /
    Content-Type: application/json
  • Formato: JSON (request e response)

Importante: o ERP SFI, nesta API, não expõe endpoints de listagem geral de pedidos, cancelamento ou alteração de status. O CRUD disponível é limitado a:
  • Criar pedido/orçamento — POST TOrdemServico/EmitirCupom/{caixa} (mesmo endpoint também é usado para "atualizar", reenviando com o pedidoID existente)
  • Consultar pedido/orçamento por ID — GET TVendas/BuscarOrcamento/{pedido}
  • Reimprimir pedido — GET TVendas/ImprimePedido/{id}
Não há "excluir"/"cancelar" no ERP: o cancelamento de um pedido ainda não enviado é tratado localmente pelo app (remoção do rascunho), sem chamada ao SFI.




2. Criar / Emitir pedido (orçamento)

POST
/Datasnap/rest/TOrdemServico/EmitirCupom/{caixa}
ParâmetroTipoObrigatórioDescrição
caixaintegersimID do caixa/terminal vinculado à sessão do vendedor logado (segmento posicional na URL).

O mesmo endpoint serve tanto para criar (envia pedidoID: -1) quanto para reenviar/atualizar um pedido (envia o pedidoID já existente).

2.1. Body da requisição (schema completo)
Campo (JSON)TipoDescrição
osnumberNúmero da OS de origem, se houver (0 se avulso).
pedidoIDnumber-1 para criar; ID existente para atualizar.
transacaoDescicaostring(sic — chave vem com esse nome no payload) Descrição da transação.
dataFinalizacaoOCstringData de finalização (ordem de compra), ISO 8601.
ehOrcamentobooleantrue = orçamento; false = pedido/cupom concluído.
classePedidostringClasse do pedido (ex.: "ORCAMENTO").
situacaonumberCódigo de situação do pedido.
concluidobooleanIndica se o pedido foi concluído/finalizado.
tipostringTipo do pedido.
valorItensnumberSubtotal (soma dos itens, sem desconto/acréscimo).
lat / lonnumberCoordenadas de geolocalização do lançamento.
empresaobjectDados da empresa emissora (objeto aninhado).
transacaoDefstringCódigo da transação financeira.
tipoPedidoDefstringTipo de pedido padrão.
tipoOrigReqstringOrigem da requisição.
orcamentoIDnumberID do orçamento de origem, se convertendo orçamento → pedido.
caixanumberCaixa/terminal (mesmo valor do path).
serie / especie / numerostringIdentificação fiscal do documento (preenchido pelo ERP na resposta).
clientenumberID do cliente no SFI (idcli).
cOOnumberContador de Ordem de Operação (cupom fiscal).
filialnumberFilial de origem.
vendedornumberID do vendedor (idven).
nomeVendedor / nomeFantasiaVendedorstringNome do vendedor.
formaPgtostringForma de pagamento.
md5stringHash de integridade (uso interno do ERP).
numeroDAV / numeroPVstringNúmero de documento auxiliar de venda / pedido de venda.
obsstringObservações livres.
data / dataBase / dataEmissao / dataEntregastring (ISO 8601)Datas do pedido.
valornumberTotal do pedido (itens + acréscimo − desconto).
descontonumberPercentual de desconto.
valorDescontonumberValor de desconto em R$.
acrescimonumberPercentual de acréscimo.
valorAcrescimoManualnumberAcréscimo lançado manualmente, em R$.
trocaTabelabooleanIndica troca manual de tabela de preço.
pedidoOrigemnumberID do pedido de origem (fusão/duplicação).
deletaPedidoOrigembooleanSe true, remove o pedido de origem ao confirmar.
truncarbooleanTrunca casas decimais em vez de arredondar.
regimeTributariostringRegime tributário do emitente.
condicaoPagamentonumberID da condição de pagamento.
descontoEscalonadoAgrupadobooleanUso de desconto escalonado agrupado.
tabelaPrecoIDnumberID da tabela de preço aplicada.
opFinanceirastringOperação financeira.
contaEstoque / contaEstoqueDnumberConta de estoque (crédito/débito).
agenteIDnumberAgente financeiro/banco.
entregaidnumberID do endereço de entrega.
tipoFretestringTipo de frete (CIF/FOB etc).
indicadorConsumo / indicadorPresencastringIndicadores fiscais (NF-e/NFC-e).
toTalizarTributosstring(sic) Flag de totalização de tributos.
uFCliente / uFEmpresastringUF do cliente / da empresa.
vendedorPoliticaDescontonumberID da política de desconto do vendedor.
usarVendedororigPoliticaDescontoboolean(sic) Usa política de desconto do vendedor de origem.
profissionalnumberProfissional/técnico vinculado.
contaSubstitutanumberConta contábil substituta.
cPFConsumidor / nomeConsumidorstringCPF/nome do consumidor final (cupom sem cliente cadastrado).
transacaoIDNovostringID da nova transação, quando aplicável.
numeroReservanumberNúmero de reserva de estoque vinculada.
usuarioDescnumberUsuário que autorizou o desconto.
valorTaxanumberValor de taxa adicional (cartão, etc).
supervisornumberID do supervisor que autorizou a operação.
serieSAT / chaveDfe / cNPJEmitentestringDados fiscais (SAT/NFC-e).
codigoAnteriorstringCódigo anterior, para migração/histórico.
tstringtabelaPrecoID repetido como string.
placastringPlaca do veículo vinculado ao pedido (contexto de OS).
cer / ere / ciunumber/stringCampos internos do ERP (não documentados pelo fornecedor).
veiculoobject|nullDados do veículo, quando aplicável.
pagamentoIDnumberID do pagamento vinculado.
mensagem1..mensagem5stringMensagens livres impressas no cupom.
fisco1..fisco5stringCampos fiscais adicionais.
operadorstringOperador de caixa.
enderecoEntrega / enderecoClienteobjectVer seção 2.3 (schema de endereço).
itensarrayLista de itens do pedido. Ver seção 2.2.
pgtosarrayLista de formas de pagamento/parcelas. Ver seção 2.4.
consumidorobject{ "nome", "cpf", "codClie" } — dados do consumidor final.

2.2. Item do pedido (itens)
CampoTipoObrigatórioDescrição
itemIDnumbersim (0 para novo)ID do item (0 = novo item).
numOrdnumbersimOrdem sequencial do item na lista (1, 2, 3...).
produtostringsimCódigo do produto no SFI (mesmo idpro usado na carga de Produtos), enviado como string.
descricaostringnãoDescrição do produto.
quantidadenumbersimQuantidade do item.
preco / precoOriginalnumbersimPreço unitário aplicado / preço de tabela original.
valorBrutonumbernãoPreço unitário × quantidade, sem desconto.
valor_Contabilnumbernão(sic) Valor contábil do item (preço líquido × quantidade).
descontos / valorDescontonumbernãoPercentual / valor de desconto do item.
descontoManualbooleannãoDesconto lançado manualmente.
acrescimos / valorAcrescimonumbernãoPercentual / valor de acréscimo do item.
acrescimoManualbooleannãoAcréscimo lançado manualmente.
promocaobooleannãoIndica se o preço veio de uma promoção.
tabelaPreco / tabelaPrecoIDstring / numbernãoTabela de preço usada no item.
situacaostringnãoSituação do item (ex.: esNormal).
unidadestringnãoUnidade de medida.
agrupamentostringnãoFlag de agrupamento de itens.
faixaPreconumbernãoFaixa de preço aplicada.
vendedorIdnumbernãoVendedor responsável pelo item.
nCM / cFOP / eAN / eX_IPIstringnãoDados fiscais do item.
iCMS / cOFINS / pIS / iPI / iIobjectnãoBlocos de tributação do item (estrutura interna do ERP).

Demais campos do item (contaEstoque, seguro, frete, comissao, bico, gradeId, fator, formula, md5, tributacao, etc.) são campos internos do SFI, mantidos como 0/"" quando não utilizados pelo app cliente.

2.3. Endereço (enderecoEntrega / enderecoCliente)
{
  "logradouro": "Rua X",
  "numero": "10",
  "complemento": "",
  "bairro": "Centro",
  "cidade": "São Paulo",
  "uF": "SP",
  "cEP": "01000000",
  "idcli": 0,
  "idctt": 0,
  "vendedor": 0,
  "email": "",
  "cpf_cnpj": "",
  "fone": "",
  "obs": "",
  "nome": "",
  "usuario": "",
  "novo": 0,
  "env_nfe": "",
  "env_spo": ""
}

2.4. Pagamento (item de pgtos)
{
  "opFin": "LC",
  "valor": 350.90,
  "valorRecebido": 350.90,
  "descricao": "Lcto Contábil",
  "finalizacao": 1,
  "index": 1,
  "parcela": 1,
  "vencimento": "2026-08-20T10:00:00.000",
  "modalidade": "",
  "agente": "",
  "banco": "",
  "emissaoID": 0
}




3. Exemplo de payload de request (criação)
{
  "os": 0,
  "pedidoID": -1,
  "ehOrcamento": true,
  "classePedido": "ORCAMENTO",
  "concluido": true,
  "valorItens": 350.90,
  "valor": 333.40,
  "desconto": 5,
  "valorDesconto": 17.50,
  "acrescimo": 0,
  "caixa": 1,
  "cliente": 4521,
  "vendedor": 10,
  "nomeVendedor": "João Silva",
  "formaPgto": "DINHEIRO",
  "condicaoPagamento": 1,
  "tabelaPrecoID": 3,
  "opFinanceira": "01",
  "cPFConsumidor": "12345678900",
  "nomeConsumidor": "Cliente Teste",
  "data": "2026-08-20T10:00:00.000",
  "dataBase": "2026-08-20T10:00:00.000",
  "itens": [
    {
      "itemID": 0,
      "numOrd": 1,
      "produto": "1234",
      "descricao": "Produto Teste",
      "quantidade": 2,
      "preco": 50.00,
      "precoOriginal": 50.00,
      "valorBruto": 100.00,
      "valor_Contabil": 100.00,
      "descontos": 0,
      "valorDesconto": 0,
      "descontoManual": false,
      "acrescimos": 0,
      "valorAcrescimo": 0,
      "acrescimoManual": false,
      "promocao": false,
      "tabelaPrecoID": 3,
      "unidade": "UN",
      "agrupamento": "",
      "faixaPreco": 0,
      "vendedorId": 10
    }
  ],
  "pgtos": [
    {
      "opFin": "LC",
      "valor": 333.40,
      "valorRecebido": 333.40,
      "descricao": "Lcto Contábil",
      "finalizacao": 1,
      "index": 1,
      "parcela": 1,
      "vencimento": "2026-08-20T10:00:00.000"
    }
  ],
  "consumidor": { "nome": "Cliente Teste", "cpf": "12345678900", "codClie": 4521 }
}




4. Resposta (response)

A resposta vem embrulhada em uma chave de nível raiz que indica sucesso ou falha da operação.

4.1. Sucesso
{
  "sucesso": {
    "pedidoID": 123456,
    "cliente": 4521,
    "valor": 333.40,
    "situacao": 0,
    "numero": "000123",
    "serie": "1"
  }
}

Observação: alguns campos podem retornar em variantes com nomes internos do ERP (lowercase/snake_case), por exemplo pedidoid em vez de pedidoID, contaid em vez de cliente, vendedorid em vez de vendedor, valor_contabil em vez de valor, condicaoid em vez de condicaoPagamento, tabela_preco em vez de tabelaPrecoID, op_financeira em vez de opFinanceira, nomecliente em vez de nomeConsumidor. Um cliente de integração deve aceitar ambas as formas.

4.2. Falha
{
  "falha": {
    "detalhe": "Integer overflow"
  }
}

O ERP retorna mensagens de erro pouco padronizadas em falha.detalhe — apenas o caso "Integer overflow" é conhecido (ocorre quando a quantidade de parcelas excede o permitido); os demais devem ser tratados como texto livre vindo do ERP.

4.3. Erro genérico
{
  "erro": "mensagem de erro do Datasnap"
}




5. Consultar pedido/orçamento

GET
/Datasnap/rest/TVendas/BuscarOrcamento/{pedido}
ParâmetroTipoObrigatórioDescrição
pedidointegersimID do pedido/orçamento (pedidoID) retornado na criação.

Usado logo após o POST EmitirCupom ter sucesso, para obter o objeto completo do pedido já persistido no ERP (mesmo schema descrito na seção 2.1).




6. Reimprimir pedido

GET
/Datasnap/rest/TVendas/ImprimePedido/{id}
ParâmetroTipoObrigatórioDescrição
idintegersimID do pedido a ser reimpresso.

Retorna os dados formatados para reimpressão do cupom/comprovante.




7. Endpoints auxiliares (necessários antes de criar um pedido)

Para montar corretamente o payload da seção 2 (tabela de preço, condição de pagamento, opção financeira etc.), o app consulta previamente estes endpoints. Sem eles, campos como tabelaPrecoID, condicaoPagamento e opFinanceira ficam zerados e o ERP tende a rejeitar o pedido.
FinalidadeMétodoEndpoint
Dados primários (tabela de preço, tipo de pedido, cliente)GETTCadastroGeral/BuscarTransacoesPrimarias/{codigoVendedor}/{codigoCliente}
Configuração de parcelamento/pagamentoGETTVendas/configuracaoPagamento
Finalização — Transação financeiraGETTVendas/BuscaFinalizacaoTF/{usaPrazoMedio}/{codCliente}/{condicaoID}/{agenteID}/{modalidadeID}/{opFinanceira}/{tipo}/{transacao}
Finalização — Condição de pagamentoGETTVendas/BuscaFinalizacaoCondicao/{codCliente}/{agenteID}/{modalidadeID}/{opFinanceira}/{tf}/{tipo}/{transacao}
Finalização — Opção financeiraGETTVendas/BuscaFinalizacaoOpFinanceira/{codCliente}/{condicaoID}/{agenteID}/{modalidadeID}/{tf}/{tipo}/{transacao}
Finalização — AgenteGETTVendas/BuscaFinalizacaoAgente/{codCliente}/{condicaoID}/{modalidadeID}/{opFinanceira}/{tf}/{tipo}/{transacao}
Finalização — ModalidadeGETTVendas/FinalizacaoModalidade/{codCliente}/{condicaoID}/{agenteID}/{opFinanceira}/{tf}/{tipo}/{transacao}
Política de acréscimoGETTVendas/PoliticaAcrescimo/{cliente}/{vendedor}/{tabela}/{condicao}/{data}
Política de descontoGETTVendas/ConfgPoliticaDesconto
Faixas de preçoGETTVendas/%22BuscarFaixasdePrecos%22
Descontos por faixaGETTVendas/%22BuscarDescontosPorFaixa%22
Login de vendedor p/ desconto maiorGETTCadastroGeral/LoginVendedores/{usuario}/{senha}
Parâmetros gerais do sistemaGETTCadastroGeral/Parametros




8. O que NÃO existe nesta API
OperaçãoSituação
Listar todos os pedidosNão há endpoint remoto — só consulta individual por ID (BuscarOrcamento).
Cancelar pedido no ERPNão há endpoint. Cancelamento de um pedido ainda não enviado é apenas local (remoção do rascunho no app cliente).
Alterar status via PUT/PATCHNão existe verbo de atualização parcial. A única forma de "atualizar" é reenviar o pedido completo via POST EmitirCupom com o pedidoID já existente.
Excluir (DELETE)Não utilizado neste fluxo.




9. Erros e validações
SituaçãoComportamento
Sem conexão com a internetO pedido é salvo em uma fila local (offline) para reenvio posterior — o app não chega a chamar o SFI.
Resposta com chave "erro"Tratada como erro genérico do Datasnap; a mensagem é repassada como está.
Resposta com chave "falha"Erro de regra de negócio do ERP. Mensagem em falha.detalhe (texto livre, salvo o caso conhecido "Integer overflow" = limite de parcelas excedido).
Carrinho/itens vazioNão há validação client-side — o payload é enviado com itens: [] e a rejeição, se houver, vem do próprio ERP.
Cliente novo (ainda não cadastrado no SFI)O cliente é cadastrado primeiro em endpoint separado de cadastro, e só então o pedido é enviado com o idcli retornado.



Documento gerado a partir da implementação de referência do app PowerSales (pack_eres_cupom / pack_modelos). O client HTTP de baixo nível (pacote pack_clientweb_http) não estava disponível para inspeção direta; a autenticação Basic Auth foi inferida pela configuração padrão do adaptador (EncodedType.basic_auth).
 

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.104 segundos
Topo