Exemplo de Cadastro de Pedido de Venda Com PHSYS API

Revisão de 10h26min de 11 de dezembro de 2025 por Endrio.korb (discussão | contribs) (Criou página com '==='''Conceito'''=== O endpoint '''C_PHCadastrarPedido''' é um exemplo de '''Script Específico''' criado para demonstrar como funciona o processo de integração utilizando...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)

Conceito

O endpoint C_PHCadastrarPedido é um exemplo de Script Específico criado para demonstrar como funciona o processo de integração utilizando a PHSYS API. Ele não faz parte dos recursos nativos do sistema, servindo apenas como modelo de implementação para ilustrar:

  • Como receber dados em formato JSON
  • Como interpretar o conteúdo enviado
  • Como executar operações internas utilizando classes e procedimentos do PH Server
  • Como retornar mensagens personalizadas ao cliente
Modelo de Integração Personalizado

Este endpoint executa diretamente o procedimento interno C_PHCadastrarPedido, onde o desenvolvedor implementa o tratamento da requisição. O body já deve conter exclusivamente os dados esperados pelo procedimento, uma vez que o endpoint sabe previamente qual método será executado.

No processamento interno:

  • O sistema lê o JSON enviado.
  • Inicia uma transação por pedido.
  • Cria o registro em PEDIDOS.
  • Cadastra os itens em PEDIDOITENS.
  • Retorna mensagem de sucesso ou erro.

Parâmetros fixos podem ser definidos no cadastro do endpoint e serão enviados automaticamente ao procedimento.

Como Realizar a Requisição

A chamada ao endpoint C_PHCadastrarPedido deve ser realizada utilizando o método HTTP POST, enviando o conteúdo em formato JSON no corpo da requisição (body).

Cabeçalhos Necessários

A requisição deve incluir o seguinte cabeçalho:

Content-Type: application/json

Esse cabeçalho informa ao servidor que o conteúdo enviado é um JSON válido.

Estrutura da Requisição

A URL deve seguir o padrão:

http://<servidor>:<porta>/api/C_PHCadastrarPedido

Exemplo típico:

http://localhost:211/api/C_PHCadastrarPedido

Corpo da Requisição (Body)

O body deve conter uma lista de pedidos, mesmo que seja apenas um. Cada pedido deve incluir os campos obrigatórios e a lista de itens.

Exemplo:

[
  {
    "TipoPedido": "12",
    "Pessoa": "1",
    "CondicaoPagamento": "1",
    "Itens": [
      {
        "Produto": "Mouse",
        "Quantidade": "1",
        "ValorUnitario": "100"
      }
    ]
  }
]

Exemplo de Envio utilizando Curl

curl -X POST "http://localhost:211/api/C_PHCadastrarPedido" ^
     -H "Content-Type: application/json" ^
     -d "[
           {
             \"TipoPedido\": \"12\",
             \"Pessoa\": \"1\",
             \"CondicaoPagamento\": \"1\",
             \"Itens\": [
               {
                 \"Produto\": \"Mouse\",
                 \"Quantidade\": \"1\",
                 \"ValorUnitario\": \"100\"
               }
             ]
           }
         ]"

Exemplos de Validações

Antes de executar o procedimento interno, a API valida:

  • Se o JSON está corretamente formatado
  • Se todos os campos obrigatórios foram enviados
  • Se os itens possuem produtos existentes no cadastro
  • Se quantidades e valores são numéricos

Erros de validação retornam automaticamente na resposta.

Resposta da Requisição

O retorno é definido pelo parâmetro:

ParamByName('Result').AsString := <texto ou JSON>;

Exemplos de Resposta

Sucesso:

Pedido 12345 cadastrado com sucesso

Erro:

Erro ao cadastrar pedido: Não foi localizado o produto Mouse

Exemplo de Script

procedure C_PHCadastrarPedido;
var
  JsonObj: TPHJson;
  PedObj: TPHServerClass;
  I: Integer;
  Msg: String;
begin
  JsonObj := TPHJson.Create;
  try
    JsonObj.LerJson(GetBody);

    PedObj := NewPHServerClass('PEDIDOS');
    try
      SetFiliaisCorrente('1');

      { Percorre cada Json e cadastra cada pedido }
      for I := 0 to JsonObj.Count - 1 do
      begin
        IniciarTransacao;
        try
          PedObj.NovoRegistro;
          PedObj.CampoDoNome('EMPRESA').AsInteger           := 1;
          PedObj.CampoDoNome('TIPOPEDIDO').AsInteger        := StrToInt(JsonObj.Linha(I).ElementoDoNome('TipoPedido').Texto);
          PedObj.CampoDoNome('PESSOA').AsInteger            := StrToInt(JsonObj.Linha(I).ElementoDoNome('Pessoa').Texto);
          PedObj.CampoDoNome('CONDICAOPAGAMENTO').AsInteger := StrToInt(JsonObj.Linha(I).ElementoDoNome('CondicaoPagamento').Texto);
          PedObj.Salvar;

          CadastrarItensPedido(PedObj, JsonObj.Linha(I).ElementoDoNome('Itens'));

          Msg := 'Pedido ' + PedObj.CampoDoNome('NUMERO').AsString + ' cadastrado com sucesso';

          ConfirmarTransacao;
        except
          CancelarTransacao;
          Msg := 'Erro ao cadastrar pedido: ' + MensagemErro;
        end;
      end;
    finally
      PedObj.Free;
    end;
  finally
    JsonObj.Free;
  end;

  { Preenche o retorno }
  ParamByName('Result').AsString := Msg;
end;

procedure CadastrarItensPedido(PedidoObj: TPHServerClass; JsonItem: TPHJson);
var
  PedItemObj: TPHServerClass;
  I: Integer;
begin
  PedItemObj := NewPHServerClass('PEDIDOITENS');
  PedItemObj.SetProp('GerarInfoFiscal', True);
  PedItemObj.SetProp('GerarRetencoes', True);
  PedItemObj.SetProp('GerarMovEst', True);

  { Percorre o JSON e cadastra cada item no sistema }
  for I := 0 to JsonItem.Count - 1 do
  begin
    try
      PedItemObj.NovoRegistro;
      PedItemObj.CampoDoNome('PEDIDO').AsLargeInt     := PedidoObj.ID;
      PedItemObj.CampoDoNome('SITUACAO').AsString     := PedidoObj.CampoDoNome('SITUACAO').AsString;
      PedItemObj.CampoDoNome('ITEM').AsLargeInt       := RetornaIDProduto(JsonItem.Linha(I).ElementoDoNome('Produto').Texto);
      PedItemObj.CampoDoNome('TIPODOCUMENTO').AsFloat := 118;
      PedItemObj.CampoDoNome('UNIDADE').AsLargeInt    := 1;
      PedItemObj.CampoDoNome('QUANTIDADE').AsFloat    := StrToFloat(JsonItem.Linha(I).ElementoDoNome('Quantidade').Texto);
      PedItemObj.CampoDoNome('VALORUNITARIO').AsFloat := StrToFloat(JsonItem.Linha(I).ElementoDoNome('ValorUnitario').Texto);
      PedItemObj.Salvar;
    finally
      PedItemObj.Free;
    end;
  end;
end;

function RetornaIDProduto(ProdutoNome: String): LargeInt;
var
  Q: TPHQuery;
begin
  { Realiza a busca do produto com base no nome informado no JSON }
  Q := NewPHQuery;
  try
    Q.Add('SELECT ID ' +
          'FROM PRODUTOS ' +
          'WHERE NOME = :PRO ' +
          'AND ORIGEM = ''1'' ');
    Q.ParamByName('PRO').AsString := UpperCase(ProdutoNome);
    Q.Open;

    if not Q.Vazia then
      Result := Q.FieldByName('ID').AsLargeInt
    else
      ErroValidacao('Não foi localizado o produto ' + ProdutoNome);
  finally
    Q.Free;
  end;
end;

begin
end.