Exemplo de Cadastro de Produto Com PHSYS API

Introdução

Este exemplo descreve como cadastrar produtos no sistema PHERP utilizando a PHSYS API. Por meio de um Script Específico, você pode integrar outro sistema, aplicativo ou serviço externo ao PHERP, facilitando o envio de dados para cadastrar novos produtos de forma automatizada.

A integração é realizada via o endpoint C_CadastrarProduto, onde você envia os dados no formato JSON e o sistema interpreta essas informações para cadastrar o produto no PHERP.

Modelo de Integração PHSys

Neste modelo de integração, o endpoint da PHSys API não possui um procedimento fixo associado. Em vez disso, ele interpreta o JSON enviado no corpo da requisição e executa exatamente o procedimento e o script informados nos parâmetros.Ou seja, o endpoint atua como um “executor genérico”: ele lê o conteúdo do JSON, identifica os campo:

PHSProcedimento → procedimento interno que será executado

PHSScriptNome → script específico registrado no PHERP e então o servidor executa o procedimento solicitado.

No exemplo apresentado, o procedimento informado é C_CadastrarProduto, responsável por realizar o cadastro de produtos dentro do PHERP. Assim, o JSON precisa incluir todos os parâmetros necessários para essa operação, como nome, referência, unidade, dimensões, etc.

Este modelo de integração foi utilizado a exigência do token de autenticação para garantir a segurança da comunicação porém o mesmo não é necessário. O processo foi dividido em duas etapas: geração do token e requisição de cadastro.

Modelo Integração

Imagem do modelo de integração

Como Realizar a Requisição do Token

Antes de realizar a requisição para o endpoint de cadastro de produtos, é necessário gerar um token de acesso. Esse token é utilizado para autenticar a requisição de cadastro e deve ser incluído nos cabeçalhos da requisição.

A URL deve seguir o padrão:

http://<servidor>:<porta>/api/auth/token

Exemplo típico:

http://localhost:211/api/auth/token

Corpo da Requisição (Body)

Envia-se o client_id e client_secret para obter o token de autenticação:

{"client_id":"client_id",
 "client_secret":"client_secret"}

Exemplo de Envio utilizando Curl para Geração do Token

Para solicitar o token de autenticação, utilize o comando abaixo:

curl -X POST "http://localhost:211/api/auth/token" ^
     -H "Content-Type: application/json" ^
     -d "{ 
           \"client_id\": \"client_id\", 
           \"client_secret\": \"client_secret\" 
         }"

Resposta da Requisição

A resposta incluirá o access_token, que deverá ser usado nas requisições subsequentes para autenticação:

{
    "access_token": "token",
    "token_type": "Bearer",
    "expires_in": 900
}

Como Realizar a Requisição do EndPoit

Após gerar o token, você pode realizar a requisição para o endpoint de cadastro de produtos. O token gerado deve ser incluído no cabeçalho da requisição.

Cabeçalhos Necessários

A requisição deve incluir o cabeçalho Content-Type: application/json e o cabeçalho Authorization com o valor Bearer <token>.

Content-Type: application/json
Authorization: Bearer <token>

Estrutura da Requisição

A URL deve seguir o padrão:

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

Exemplo típico:

http://localhost:211/api/C_CadastrarProduto

Corpo da Requisição (Body)

O corpo da requisição deve conter um JSON com os parâmetros necessários para cadastrar o produto:

{ 
   "Classe":"TPHSProcScript", 
   "Procedimento":"Executar",
   "Parametros":[{
           "Nome":"PHSProcedimento",
           "Tipo":"string",
           "Valor":"C_CadastrarProduto"
       },
       {
           "Nome":"PHSScriptNome",
           "Tipo":"string",
           "Valor":"C_CadastrarProduto"
       },
       {
           "Nome":"Nome",
           "Tipo":"string",
           "Valor":"Computador"  
       },
       {
           "Nome":"Unidade",
           "Tipo":"integer",
           "Valor": 1  
       },
       {
           "Nome":"Referencia",
           "Tipo":"string",
           "Valor": "1234" 
       },
       {
           "Nome":"Comprimento",
           "Tipo":"float",
           "Valor": "30" 
       },
       {
           "Nome":"Largura",
           "Tipo":"float",
           "Valor": "15" 
       }           
   ]
}

Exemplo de Envio utilizando Curl

Para testar a requisição usando curl, o comando seria o seguinte:

curl -X POST "http://localhost:211/api/C_CadastrarProduto" ^
     -H "Content-Type: application/json" ^
     -H "Authorization: Bearer <token>" ^
     -d "{
           \"Classe\": \"TPHSProcScript\",
           \"Procedimento\": \"Executar\",
           \"Parametros\": [
             {\"Nome\": \"PHSProcedimento\", \"Tipo\": \"string\", \"Valor\": \"C_CadastrarProduto\"},
             {\"Nome\": \"PHSScriptNome\", \"Tipo\": \"string\", \"Valor\": \"C_CadastrarProduto\"},
             {\"Nome\": \"Nome\", \"Tipo\": \"string\", \"Valor\": \"Computador\"},
             {\"Nome\": \"Unidade\", \"Tipo\": \"integer\", \"Valor\": 1},
             {\"Nome\": \"Referencia\", \"Tipo\": \"string\", \"Valor\": \"1234\"},
             {\"Nome\": \"Comprimento\", \"Tipo\": \"float\", \"Valor\": 30},
             {\"Nome\": \"Largura\", \"Tipo\": \"float\", \"Valor\": 15}
           ]
         }"

Resposta da Requisição

A resposta da requisição dependerá do sucesso ou falha do procedimento. Se o cadastro for bem-sucedido, o ID do produto recém-cadastrado será retornado:

Resposta de Sucesso
{
  "ID_Produto": "159"
}
Resposta de Erro
{
  "Erro": "Produto com referência 1234 já cadastrado"
}

Exemplo de Script

Aqui está o script de exemplo que será executado no PHERP para realizar o cadastro do produto:

procedure C_CadastrarProduto;
var
  ProdutoObj:TPHServerClass;
  Q:TPHQuery;    
begin
  IniciarTransacao;
  try
    Q := NewPHQuery;                                                  
    try
      { Verifica se o Produto já Está Cadastrado }
      Q.Add('SELECT ID '+
            'FROM PRODUTOS '+
            'WHERE CODIGOREFERENCIA = :REF');
      Q.ParamByName('REF').AsString := ParamByName('Referencia').AsString;
      Q.Open;
  
      if (Q.Vazia) then
      begin                    
        ProdutoObj := NewPHServerClass('PRODUTOS');
        try
          ProdutoObj.NovoRegistro;
  
          { Preenchidos Através dos Parâmetros Presentes no Body da Requisição }            
          ProdutoObj.CampoDoNome('NOME').AsString             := ParamByName('NOME').AsString;
          ProdutoObj.CampoDoNome('CODIGOREFERENCIA').AsString := ParamByName('REFERENCIA').AsString;
          ProdutoObj.CampoDoNome('UNIDADEVENDA').AsInteger    := ParamByName('UNIDADE').AsInteger;
          ProdutoObj.CampoDoNome('UNIDADECOMPRA').AsInteger   := ParamByName('UNIDADE').AsInteger;          
          ProdutoObj.CampoDoNome('COMPRIMENTO').AsFloat       := ParamByName('COMPRIMENTO').AsFloat;
          ProdutoObj.CampoDoNome('LARGURA').AsFloat           := ParamByName('LARGURA').AsFloat;        
  
          { Preenchimento de Forma Fixa }  
          ProdutoObj.CampoDoNome('PERFILESTOQUE').AsInteger       := 11;
          ProdutoObj.CampoDoNome('NCM').AsInteger                 := 9875;
          ProdutoObj.CampoDoNome('CLASSIFICACAOORIGEM').AsInteger := 1;
  
          ProdutoObj.Salvar;
  
          ParamByName('Result').AsString := '{"ID_Produto":"'+IntToStr(ProdutoObj.CampoDoNome('ID').AsLargeInt)+'"}';                
        finally
          ProdutoObj.Free;
        end;                  
      end;

      ConfirmarTransacao;
    finally
      Q.Free;                  
    end;      
  except
    CancelarTransacao;

    ParamByName('Result').AsString := '{"Erro":"'+MensagemErro+'"}';
  end;          
end;

begin

end.