Função para rastrear informações em Transportadoras via AdvPL

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.

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.

6 Responses

  1. William Santos disse:

    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.

  2. Wanderson disse:

    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.

  3. Daniel Martins disse:

    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!!

Deixe uma resposta para Dan Atilio (Daniel Atilio)Cancelar resposta

Terminal de Informação