Exemplo de Cadastro de Pedido de Venda Com PHSYS API
Introdução
Imagine que você queira cadastrar pedidos no PHERP a partir de outro sistema, aplicativo ou integração externa. Para isso, você pode criar um Script Específico e configura-lo nos parâmetros de um endpoint na PHSYS API. O exemplo abaixo, chamado C_PHCadastrarPedido, demonstra justamente como esse processo funciona: recebendo dados em JSON, interpretando as informações enviadas, criando o pedido, cadastrando os itens e retornando mensagens 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.
Modelo Integração
Parâmetros
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.