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)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

2 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.

Deixe uma resposta