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:
Nisso o usuário tem as opções de aprovar ou reprovar, conforme print abaixo:
Por fim, é exibido o resultado conforme o que o usuário definiu.
E em AdvPL, como que funciona então?
- É 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)
- No carregamento da mensagem, é montado as opções e acionado o envio (EnvList abaixo)
- 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.



O Jader, da ConnectZap, é gente boíssima e excelente profissional!
Bom dia Paulo, tudo joia?
Concordo plenamente.
Jader é muito gente boa.
Obrigado pelo comentário.
Tenha uma ótima e abençoada terça feira.
Um forte abraço.
Bom dia Dan.
No parâmetro aOpcoes que vai ser passado as opções de execução do REST?
Bom dia Thiago, tudo joia?
Perdão, agora que vi, que o exemplo estava cortando a parte do aOpcoes.
Subi novamente o fonte.
Tenha uma ótima e abençoada terça feira.
Um forte abraço.