Manuais
PHC GO Como criar um add-on (template)
 

Cenário


Quando preenchemos o código postal é necessário preencher a localidade do mesmo, na ficha dos clientes ou de fornecedores.

Neste tópcio, iremos mostrar dois exemplos de como criar esta funcionalidade, aproveitando uma API pública de códigos postais e construindo um add-on simples utilizável a aprtir plano Corporate, e uma versão mais avançada do add-on, utilizável a partir do plano Advanced:
 
  1. Add-on Simples (plano Corporate) - Para o ecrã de clientes, vamos criar uma regra de negócio Ao Sincronizar com todo o código.

  2. Add-on Avançado (plano Advanced) - Para o ecrã de fornecedores criamos uma regra de negócio Ao Sincronizar que chama uma função na biblioteca de servidor com a chamada à API de códigos postais mais genérica.

    Esta estratégia de desenvolvimento é útil para evitar a duplicação de código e assim tornar o add-on mais fácil de manter. Esta estratégia apenas será possível a partir do plano Advanced.

 
Com este exemplo irá conhecer várias funcionalidades, entre as quais destacamos:
 
  1. Para o add-on simples (plano Corporate)
     
    • Como reagir ao preenchimento de um campo num mainform
    • Como chamar uma API externa e interpretar o seu resultado
    • Como converter um JSON para um array de objetos
    • Como usar uma regra de negócio do tipo Ao Sincronizar

  2. Para o add-on avançado (plano Advanced)
     
    • Como usar a biblioteca de servidor
    • Como chamar funções da biblioteca de servidor, dentro de uma regra de negócio

 

Como configurar


Para o add-on simples (plano Corporate)


  • Entidade: Clientes

  • Tipo código: Ao sincronizar

  • Código:

 
' valida se há alguma coisa alterada
Select Case changedItems.First.baseType
' valida se o objeto alterado foi a entidade de clientes, cujo nome na base de dados é Cl e daí o ClVO. Pode consultar o nome na base de dados de cada entidade no dicionário de dados
Case GetType(ClVO)
' cria um objeto do tipo ClVO vazio
Dim item as ClVO = Nothing

'identifica se o campo CODPOST foi alterado
Dim itemChanged = changedItems.getChangedItemByField(item, "codpost")

'se foi alterado então vamos analisar o conteudo
If itemChanged IsNot Nothing then

' numa regra de negócio do tipo "AoSincronizar" o objeto masterVO contém os dados do registo alterado. Neste caso vamos validar se o utilizador já preencheu 7 ou 8 digitos
if masterVO.codpost.trim.length>=7 and masterVO.codpost.trim.length<=8
dim mcodpost as string=""
if masterVO.codpost.trim.length=7 and masterVO.codpost.substring(4,1)<>"-"
mcodpost= masterVO.codpost.trim
else
if masterVO.codpost.trim.length=8 and masterVO.codpost.substring(4,1)="-"
mcodpost=masterVO.codpost.substring(0,4)+masterVO.codpost.substring(5,3)
end if
end if

' vamos chamar a API de códigos postais PT API - https://www.duminio.com/ptcp/ para obter os dados do código introduzido
Dim url = String.Format("https://api.duminio.com/ptcp/v2/ptapi610813c4d15a62.33494622/"+mcodpost.trim)
Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
request.Method = WebRequestMethods.Http.Get
request.ContentType = "application/x-www-form-urlencoded"

'colocamos a resposta numa variável
Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
If response IsNot Nothing Then

Dim responseContent = New StreamReader(response.GetResponseStream()).ReadToEnd()
' se a resposta é curta signifca que deu erro ou o código postal introduzido não foi encontrado
if responseContent.tostring.length<80
listMsg.Add(New MsgInfo("Código postal inválido ou serviço desligado. Deve ser no formato XXXXYYY ou XXXX-YYY." ))
else

'se a resposta é válida, dado que a resposta é em JSON criamos um objeto, arrays de objetos, com todos os dados da resposta
Dim webObj = fastJSON.JSON.ToObject(Of Object)(responseContent)

If webObj IsNot Nothing Then
' da resposta retiramos o valor do item Localidade do primeiro objeto
dim local = webObj(0).item("Localidade")
If local IsNot Nothing Then
listMsg.Add(New MsgInfo("Localidade atualizada para «"+local+"»"))
' com o masterVO atualizamos o campo da localidade
masterVO.local=local.tostring
' e colocamos o código postal no formato correto caso tenha sido introduzido com 7 digitos
masterVO.codpost=mcodpost.substring(0,4)+"-"+mcodpost.substring(4,3)
end if
end if
end if
end if
end if
end if
end select

 
Por último, basta adicionar esta regra ao seu add-on para que esta funcionalidade fique ativada no ecrã de clientes.
 
 

Para o add-on avançado (plano Advanced)


Inicialmente, deve ser criado na bilioteca de servidor, o código da função genérica:
 
  • Nome: codpost

  • Código: Código genérico que retorna a localidade de um dado código postal
     
     
    ' todas as bibliotecas devem estar dentro de uma "Class"
    class codpost

    ' função que vai retornar a localidade de um código postal
    public shared function codpost(mcodpost as string) as string

    ' variável com a localidade
    dim retval as string=""

    ' valida o tamonho do texto escrito, se já é um código postal com o tamanho certo. Pode ser 7 digitos seguidos ou 8 digitos com o traço a seguir aos 4 primeiros
    if mcodpost.trim.length=7 and mcodpost.substring(4,1)<>"-"
    mcodpost=mcodpost.trim
    else
    if mcodpost.trim.length=8 and mcodpost.substring(4,1)="-"
    mcodpost=mcodpost.substring(0,4)+mcodpost.substring(5,3)
    end if
    end if

    ' vamos chamar a API de códigos postais PT API - https://www.duminio.com/ptcp/ para obter os dados do código introduzido
    Dim url = String.Format("https://api.duminio.com/ptcp/v2/ptapi610813c4d15a62.33494622/"+mcodpost.trim)
    Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
    request.Method = WebRequestMethods.Http.Get
    request.ContentType = "application/x-www-form-urlencoded"

    'colocamos a resposta numa variável
    Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)

    If response IsNot Nothing Then

    Dim responseContent = New StreamReader(response.GetResponseStream()).ReadToEnd()
    ' se a resposta é curta significa que deu erro ou o código postal introduzido não foi encontrado
    if responseContent.tostring.length<80
    retval="ERR"
    else

    'se a resposta é válida, dado que a resposta é em JSON criamos um objeto, arrays de objetos, com todos os dados da resposta
    Dim webObj = fastJSON.JSON.ToObject(Of Object)(responseContent)

    If webObj IsNot Nothing Then
    ' da resposta retiramos o valor do item Localidade do primeiro objeto
    dim local = webObj(0).item("Localidade")
    If local IsNot Nothing Then
    retval=local.tostring
    end if
    end if
    end if
    end if

    return retval
    end function
    end class

 
Depois de guradadas as alterações efetudas, este código estará pronto a ser chamado através de uma regra de negócio no ecrã de fornecedores. Para criar esta regra de negócio, deve navegar até às Regras de negócio, e criar um registo com as seguintes características:
 
  • Entidade: Fornecedores

  • Tipo de Código: Ao Sincronizar
     
     
            ' valida se há alguma coisa alterada
    Select Case changedItems.First.baseType
    ' valida se o objeto alterado foi a entidade de fornecedores, cujo nome na base de dados é Fl e daí o FlVO. Pode consultar o nome na base de dados de cada entidade no dicionário de dados

    Case GetType(FlVO) ' cria um objeto do tipo FlVO vazio
    Dim item as FlVO = Nothing

    'identifica se o campo CODPOST foi alterado
    Dim itemChanged = changedItems.getChangedItemByField(item, "codpost")

    'se foi alterado então vamos analisar o conteudo
    If itemChanged IsNot Nothing then
    ' numa regra de negócio do tipo "AoSincronizar" o objeto masterVO contém os dados do registo alterado. Neste caso vamos validar se o utilizador já preencheu 7 ou 8 digitos
    if masterVO.codpost.trim.length>=7 and masterVO.codpost.trim.length<=8
    ' vamos correr a biblioteca de servidor que chama a API a partir de um código postal
    dim mlocal as string = u8882_Space.codpost.codpost(masterVO.codpost.trim)
    ' se a resposta for ERR significa que algo correu mal
    If mlocal="ERR"
    ' adicionamos uma mensagem para informar o utilizador
    listMsg.Add(New MsgInfo("Código postal inválido ou serviço desligado. Deve ser no formato XXXXYYY ou XXXX-YYY." ))
    else
    ' se a função da biblioteca retornou um valor então vamos preencher
    if mlocal<>""
    ' adicionamos uma mensagem para informar o utilizador do sucesso da operação
    listMsg.Add(New MsgInfo("Localidade atualizada para «"+mlocal+"»"))
    ' com o masterVO atualizamos o campo da localidade
    masterVO.local=mlocal
    ' e colocamos o código postal no formato correto caso tenha sido introduzido com 7 digitos
    if masterVO.codpost.trim.length=7
    masterVO.codpost=masterVO.codpost.substring(0,4)+"-"+masterVO.codpost.substring(4,3)
    end if
    end if
    end if
    end if
    end if
    end select

 
Ao seu add-on (cujo plano mínimo tem de ser o plano Advanced), pode adicionar a regra de negócio e a biblioteca de servidor, e com isto ter esta funcionalidade a funcionar no ecrã de fornecedores.

Com esta estratégia, poderiamos agora, criar regras para qualquer ecrã que tenha os campos de código postal e localidade, usando sempre a mesma função genérica que está na biblioteca, ao invés de ter que repetir todo esse código.
 
 

 

Resultado


Com estes dois tipos de add-on, pode analisar a melhor estratégia de desenvolvimento e ainda obter esta funcionalidade de, usando uma API pública, preencher automaticamente a localidade do código postal, poupando assim esse tempo de digitação aos seus utilizadores.