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.