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 Dan.
No parâmetro aOpcoes que vai ser passado as opções de execução do REST?