Criar processo de autorizações no WhatsApp via AdvPL

No artigo de hoje, vamos demonstrar como customizar um processo de autorizações no WhatsApp usando AdvPL / TLPP no Protheus.

Imagina ter um cenário, onde você precisa solicitar uma autorização de um departamento ou usuário, por exemplo, autorizar a descarregamento de uma carga que chegou na empresa.

Pensando nisso, o pessoal da ConnectZap desenvolveu uma solução que facilitou esse processo integrando o WhatsApp com Protheus.

O primeiro passo é solicitar a autorização do usuário, conforme print abaixo:

Mensagem solicitando aprovação

Mensagem solicitando aprovação

Nisso o usuário tem as opções de aprovar ou reprovar, conforme print abaixo:

Respostas para selecionar

Respostas para selecionar

Por fim, é exibido o resultado conforme o que o usuário definiu.

Mensagem de conclusão após resposta

Mensagem de conclusão após resposta

E em AdvPL, como que funciona então?

  1. É feito uma função, que pode ser acionada dentro de algum ponto de entrada ou tela, que manda a mensagem para um número do WhatsApp (ZapCarga abaixo)
  2. No carregamento da mensagem, é montado as opções e acionado o envio (EnvList abaixo)
  3. Por fim, é acionado a integração no endpoint “/sendList” via verbo POST (ListZap abaixo)

Abaixo o código fonte disponibilizado pelo pessoal da ConnectZap:

#Include 'Protheus.ch'

User Function ZapCarga()
Local ctelefone := "5521992584067"
Local cCarga    := "0003852"
Local cIdMsg    := ""

    RpcSetEnv( "01","0101")

    //Use essa variavel cIdMsg para gravar no registro da carga a ser descarregada
    //Quando a pessoa Aprovar/Reprovar, este Id de mensagem chegará no Json (Serviço Rest) para você posicionar na Carga e efetuar o processo seguinte. 
    cIdMsg := EnvList(ctelefone, cCarga)
    

Return

Static Function EnvList(ctelefone, cCarga)
Local aLinha  := {}
Local aOpcoes := {}
Local cMsg    := ""
Local oJson
Local nStatus
Local cMsgID


    cMsg := "Prezado(a) Cooperado/Produtor Rural,\n"
    cMsg +="Solicitamos sua autorização para realizar o descarregamento.\n\n"
    cMsg +="\ud83c\udff7\ufe0f *Carga/ticket:* "+Alltrim(cCarga)+"\n"
    cMsg +="\ud83d\uddd3\ufe0f *Data de Envio:* "+DTOC(Date())+" - "+SubStr(Time(),1,5)+"\n\n"
    cMsg +="Aguardamos seu retorno para prosseguir com o processo.\n\n"


    aLinha := {}
    AADD(aLinha, {"title", "\u2705 Aprovar"})
    aAdd(aLinha, {"description",  "Após a sua aprovação, o processo de liberação de carga dará sequencia."})
    aAdd(aLinha, {"rowId",  "sim"})
    AADD(aOpcoes, ArrToJson(aLinha))

    aLinha := {}
    AADD(aLinha, {"title", "\u274c Reprovar"})
    aAdd(aLinha, {"description",  "Com sua reprovação, o processo de liberação de carga será interrompido."})
    aAdd(aLinha, {"rowId",  "nao"})
    AADD(aOpcoes, ArrToJson(aLinha))

    oJson := U_LISTZAP(ctelefone , "\ud83d\udcdd DESCARREGAMENTO \ud83d\ude9a", cMsg, "Clique para Aprovar", "Carga "+Alltrim(cCarga), aOpcoes,'Equipe de Recepção – Cooperativa Agropecuária XYZ')

    nStatus := oJson:GetJsonObject('Status'):GetJsonObject('status')
    cMsgID  := oJson:GetJsonObject('Status'):GetJsonObject('msgID')

    If nStatus == 200
        Return cMsgID
    EndIf

Return ""



User Function LISTZAP(cCelular , ctitulo, cMsg, cBotTxt, cSubTit, aOpcoes, cRodape)
Local nTimeOut := 120
Local aHeadOut := {}
Local cHeadRet := ""
Local cPostParms:= ""
Local cURL  := SUPERGETMV("MV_ZAPURL", .T., "https://api.connectzap.com.br/sistema")
Local oJs
Local oJsList
Local oJsSecao
Local oLinhas
Local aSection:= {}
Local cSection:= ""
Local cLinhas := ""
Local nLinha
Local oRetorno
Local cErro := ""
Default cSession := Alltrim(SUPERGETMV("MV_SESSAO", .T., "SEUTOKENAQUI"))

    cUrl    += "/sendList"
        
    aadd(aHeadOut,'Accept: application/json')
    aadd(aHeadOut,'Content-Type: application/json')

    oJs := JsonObject():New()
    oJs['SessionName'] := cSession
    oJs['phonefull'] := cCelular


    oJsList := JsonObject():New()
    oJsList['title'] := ctitulo
    oJsList['description'] := cMsg
    oJsList['buttonText'] := cBotTxt
    oJsList['listType'] := 'PRODUCT_LIST'

    oJsSecao := JsonObject():New()

    oLinhas := JsonObject():New()


    AADD(aSection, {"title", cSubTit})

    cLinhas := "["

    For nLinha := 1 to Len(aOpcoes)
        If nLinha > 1
            cLinhas += ","
        EndIf
        
        cLinhas += aOpcoes[nLinha]

    Next nLinha

    cLinhas += "]"

    AADD(aSection, {"rows", cLinhas})
    

    //Transforma o Array em uma String JSON
    cSection := ArrToJson(aSection)


    oJsList['sections'] := "xsections"


    oJsList['footerText'] := cRodape


    oJs['listMessage'] := oJsList
    cPostParms := oJs:tojson()

    cPostParms := Replace(Replace(cPostParms, 'xsections', '['+cSection+']'),'"[','[')
    cPostParms := Replace(cPostParms,'}"','}')
    cPostParms := Replace(cPostParms,']"',']')
    Freeobj(oJs)

    cPostParms := EncodeUTF8(cPostParms)

    cPostParms := STRTRAN(cPostParms,'\\','\')
    cReturn := HttpPost(cUrl,,cPostParms,nTimeOut,aHeadOut,@cHeadRet)

    oRetorno := JsonObject():New()
    cErro := oRetorno:FromJson(cReturn)
    If !Empty(cErro)
        FWAlertError("Falha ao converter texto para Objeto JSON: " + CRLF + cErro, "Conversão JSON")
    EndIf

Return oRetorno

Se você tiver interesse, saiba mais sobre a ConnectZap nesse link: https://connectzap.com.br/api/

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Paulo Roberto disse:

    O Jader, da ConnectZap, é gente boíssima e excelente profissional!

  2. Thiago Rasmussen disse:

    Bom dia Dan.

    No parâmetro aOpcoes que vai ser passado as opções de execução do REST?

Deixe uma resposta

Terminal de Informação