Hoje vou mostrar como fazer a integração do Protheus com Transportadoras.
Algumas vezes, precisamos consultar rastreios de pacotes e produtos, e algumas transportadoras disponibilizam recursos para isso.
A maioria delas, não conta com API, então como realizar a consulta?
Nesse exemplo abaixo, o que fizemos foi pegar a página da transportadora, e ao carregar a página, executar comandos em javascript para preencher automaticamente os campos.
Então, o usuário ele vai ver uma tela de parâmetros com o número do pedido, e ao informar, automaticamente será carregado a página da transportadora com os dados preenchidos via javascript.
Segue o código abaixo:
//Bibliotecas
#Include "Totvs.ch"
#Include "TopConn.ch"
/*/{Protheus.doc} zTransp
Função para consultar pedidos em transportadoras
@type Function
@author Atilio
@since 25/11/2019
@version 1.0
/*/
User Function zTransp()
Local aArea := GetArea()
Local cPedido := SC5->C5_NUM
Local aPergs := {}
//Adiciona os parametros para a pergunta
aAdd(aPergs, {1, "Pedido", cPedido, "", ".T.", "SC5", ".T.", 80, .T.})
//Mostra uma pergunta com parambox para filtrar o subgrupo
If ParamBox(aPergs, "Informe os parametros", , , , , , , , , .F., .F.)
fMontaBusca()
EndIf
RestArea(aArea)
Return
Static Function fMontaBusca()
Local cUrl := ""
Local cQry := ""
Local cEmissao := ""
//Tamanho da janela
Private aTamanho := MsAdvSize()
Private nJanLarg := aTamanho[5]
Private nJanAltu := aTamanho[6]
//Navegador Internet
Private oWebChannel
Private nPort
Private oWebEngine
Private aComandos := {}
//Faz a consulta do pedido e da transportadora
cQry := " SELECT " + CRLF
cQry += " C5_NUM, " + CRLF
cQry += " C5_TRANSP, " + CRLF
cQry += " C5_NOTA, " + CRLF
cQry += " C5_EMISSAO, " + CRLF
cQry += " A1_CGC, " + CRLF
cQry += " F2_CHVNFE " + CRLF
cQry += " FROM " + CRLF
cQry += " " + RetSQLName('SC5') + " SC5 " + CRLF
cQry += " INNER JOIN " + RetSQLName('SA1') + " SA1 ON ( " + CRLF
cQry += " A1_FILIAL = '" + FWxFilial('SA1') + "' " + CRLF
cQry += " AND A1_COD = C5_CLIENTE " + CRLF
cQry += " AND A1_LOJA = C5_LOJACLI " + CRLF
cQry += " AND SA1.D_E_L_E_T_ = ' ' " + CRLF
cQry += " ) " + CRLF
cQry += " INNER JOIN " + RetSQLName('SF2') + " SF2 ON ( " + CRLF
cQry += " F2_FILIAL = '" + FWxFilial('SF2') + "' " + CRLF
cQry += " AND F2_DOC = C5_NOTA " + CRLF
cQry += " AND F2_SERIE = C5_SERIE " + CRLF
cQry += " AND SF2.D_E_L_E_T_ = ' ' " + CRLF
cQry += " ) " + CRLF
cQry += " WHERE " + CRLF
cQry += " C5_FILIAL = '" + FWxFilial('SC5') + "' " + CRLF
cQry += " AND C5_NUM = '" + MV_PAR01 + "' " + CRLF
cQry += " AND SC5.D_E_L_E_T_ = ' ' " + CRLF
TCQuery cQry New Alias "QRY_PED"
//Se houver dados
If ! QRY_PED->(EoF())
// - Rodonaves
If QRY_PED->C5_TRANSP == "000512"
cUrl := "https://cliente.rte.com.br/Tracking/"
aAdd(aComandos, 'document.getElementById("cpfcnpj").value = "' + QRY_PED->A1_CGC + '"; ')
aAdd(aComandos, 'document.getElementById("documentNumber").value = "' + QRY_PED->C5_NOTA + '"; ')
// - Transportadora Americana
ElseIf QRY_PED->C5_TRANSP == "000520"
cEmissao := SubStr(QRY_PED->C5_EMISSAO, 7, 2) + "/" + SubStr(QRY_PED->C5_EMISSAO, 5, 2) + "/" + SubStr(QRY_PED->C5_EMISSAO, 1, 4)
cUrl := "https://www.tanet.com.br/rastrear-encomenda/5/"
aAdd(aComandos, 'document.getElementById("cpf_cnpj").value = "' + QRY_PED->A1_CGC + '"; ')
aAdd(aComandos, 'document.getElementById("nota_fiscal").value = "' + QRY_PED->C5_NOTA + '"; ')
aAdd(aComandos, 'document.getElementById("data_emissao").value = "' + cEmissao + '"; ')
// - Braspress
ElseIf QRY_PED->C5_TRANSP == "000670"
cUrl := "https://www.braspress.com/acesso-rapido/rastreie-sua-encomenda/"
u_MsgLog("Atenção", "Preencha CNPJ [" + QRY_PED->A1_CGC + "] e NF [" + cValToChar(Val(QRY_PED->C5_NOTA)) + "]")
// - Setex do Brasil
ElseIf QRY_PED->C5_TRANSP == "001569"
cUrl := "http://www.setexdobrasil.com.br/#track"
aAdd(aComandos, 'document.getElementById("accessKey").value = "' + QRY_PED->F2_CHVNFE + '";')
aAdd(aComandos, 'document.getElementById("sendAcessKeyButton").click();')
EndIf
//Se tiver a URL preenchida
If ! Empty(cUrl)
DEFINE DIALOG oDlg TITLE "Pesquisa de Transportadora" FROM 000,000 TO nJanAltu,nJanLarg PIXEL
// Prepara o conector WebSocket
oWebChannel := TWebChannel():New()
nPort := oWebChannel::connect()
// Cria componente
oWebEngine := TWebEngine():New(oDlg, 0, 0, 100, 100,, nPort)
oWebEngine:bLoadFinished := {|self,url| fRodaScript(url) }
oWebEngine:navigate(cUrl)
oWebEngine:Align := CONTROL_ALIGN_ALLCLIENT
ACTIVATE DIALOG oDlg CENTERED
Else
MsgStop("URL da Transportadora nao encontrada!" + CRLF + "Disponivel apenas para Rodonaves, Americana, Braspress e Setex!", "Atencao")
EndIf
Else
MsgStop("Dados do pedido nao encontrados!", "Atencao")
EndIf
QRY_PED->(DbCloseArea())
Return
Static Function fRodaScript(cUrl)
Local nAtual := 0
//Percorre os comandos
For nAtual := 1 To Len(aComandos)
oWebEngine:runJavaScript(aComandos[nAtual])
Next
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa Tarde, no meu caso, eu precisaria pegar a informação de uma página: document.getElementById(‘main’).getAttribute(‘src’).
Utilizando oWebEngine:runJavaScript(“alert(document.getElementById(‘main’).getAttribute(‘src’));”), retorna o que preciso, mas é somente um alert, no caso, eu precisa passar esse retorno para uma variável.
É possível utilizando o TWebEngine?
Obrigado
Bom dia.
Depende, em Javascript, você pode criar variáveis e armazenar, por exemplo, var = document.geEle….
Porém, conforme a documentação oficial das classes, você “não tem acesso” a pegar essas variáveis em Javascript e voltar elas para o AdvPL.
Pode ser que tenha algum método, ai seria interessante abrir um chamado na TOTVS questionando, ou se você quiser ver alguma outra alternativa, uma ideia seria, você criar a variável em Javascript, e ver se é possível gravar isso em algum arquivo txt no S.O., ai via AdvPL, você iria ler esse arquivo txt, é uma gambiarra, mas pode dar certo.
Boa Tarde Daniel tudo bem, voce tem algum exemplo desta conexão twebchannel usando paginas html com conexão no banco de dados?
Bom dia Wanderson, tudo joia graças a Deus e você?
Infelizmente não temos um exemplo pronto de TWebChannel consumindo uma página WEB com conexão com banco de dados.
Vamos adicionar aqui na nossa lista de sugestões.
Um grande abraço.
Bom dia Daniel!! Meus parabens por todo o conteúdo, estou iniciando na area do advpl e voce tem muita informação, tudo de qualidade!!
Bom dia xará, tudo joia?
Opa bem vindo ao mundo Protheus.
Obrigado pelo comentário e feedback, é muita generosidade e bondade sua.
Um grande abraço.