Exemplo de integração com J-Integra usando SOAP e TWSDLManager via AdvPL

Hoje vou mostrar como fazer uma integração com J-Integra utilizando o protocolo SOAP e a classe TWSDLManager via AdvPL.

Primeiramente jovens, esse exemplo bacanudo foi desenvolvido e disponibilizado pelo grande Edson Santos ( LinkedIn ).

Basicamente, para essa integração funcionar, você deve montar uma string com o conteúdo do XML que será enviado, depois instanciar a classe TWSDLManager em uma variável e fazer o envio das informações.

Com isso, você consegue encaixar ela dentro de pontos de entrada, como por exemplo, o MATA020 (em MVC), na seção MODELCOMMITNTTS.

Abaixo o trecho desenvolvido pelo Edson:


//Pegando a data e hora atual
cData := SubStr(dToS(dDataBase), 1, 4) + "-" + SubStr(dToS(dDataBase), 5, 2) + "-" + SubStr(dToS(dDataBase), 7, 2) //YYYY-MM-DD
cHora := Time()

//Pegando se é um fornecedor ativo
cFornAtivo := Iif(M->A2_MSBLQL == "2 ", "S", "N")

//Pegando a operação (se é inclusão, alteração ou exclusão
cOperacao := ""
If nOper == 3
	cOperacao := "I"
ElseIf nOper == 4
	cOperacao := "A"
ElseIf nOper == 5
	cOperacao := "E"
EndIf

//Zera as variáveis de erro e aviso
cErros := ""
cAvisos := ""
lHouveErro := .F.
cMsgErro := ""
cMsgSuces := ""

//Montando o XML que será enviado
cStringRet += "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' " + CRLF
cStringRet += "xmlns:core='http://localhost.integracao.tst.com.br'>"  + CRLF
cStringRet += "<soapenv:Header/>" + CRLF
cStringRet += "<soapenv:Body>" + CRLF
cStringRet += "<core:mensagem><![CDATA[<Mensagem>" + CRLF
cStringRet +=     "<Cabecalho>" + CRLF
cStringRet +=         "<mensagemID>1</mensagemID>"+ CRLF
cStringRet +=         "<versaoXML>1</versaoXML>"+ CRLF
cStringRet +=         "<identificacaoCliente>" + SM0->M0_CGC + "</identificacaoCliente>"+ CRLF
cStringRet +=         "<servico>CADASTRO_FORNECEDOR</servico>"+ CRLF
cStringRet +=         "<dataHora>" + cData + " " + Alltrim(cHora) + " </dataHora>"+ CRLF
cStringRet +=         "<empresaOrigem>1</empresaOrigem>"+ CRLF
cStringRet +=         "<sistemaOrigem>PROTHEUS</sistemaOrigem>"+ CRLF
cStringRet +=         "<empresaDestino>1</empresaDestino>"+ CRLF
cStringRet +=         "<sistemaDestino>MV</sistemaDestino>"+ CRLF
cStringRet +=         "<usuario></usuario>"+ CRLF
cStringRet +=         "<senha></senha>"+ CRLF
cStringRet +=     "</Cabecalho>" + CRLF
cStringRet +=     "<CadastroFornecedor>" + CRLF
cStringRet +=         "<identificador></identificador>" + CRLF
cStringRet +=         "<idIntegracao></idIntegracao>" + CRLF
cStringRet +=         "<operacao>" + cOperacao + "</operacao>" + CRLF
cStringRet +=         "<empresaOrigem></empresaOrigem>" + CRLF
cStringRet +=         "<codigoFornecedor></codigoFornecedor>" + CRLF
cStringRet +=         "<codigoFornecedorDePara>" + M->A2_COD + M->A2_LOJA + "</codigoFornecedorDePara>" + CRLF
cStringRet +=         "<descFornecedor>FORNECEDOR " + Alltrim(M->A2_NOME) + "</descFornecedor>" + CRLF
cStringRet +=         "<nomeFantasia>" + Alltrim(M->A2_NREDUZ) + "</nomeFantasia>" + CRLF
cStringRet +=         "<tipoClienteFornecedor>" + Alltrim(M->A2_TIPO) + "</tipoClienteFornecedor>" + CRLF
cStringRet +=         "<tipoPessoa>F</tipoPessoa>" + CRLF
cStringRet +=         "<codigoTipoConstEmpresa></codigoTipoConstEmpresa>" + CRLF
cStringRet +=         "<descTipoConstEmpresa></descTipoConstEmpresa>" + CRLF
cStringRet +=         "<cgcCpf>" + Alltrim(M->A2_CGC) + "</cgcCpf>" + CRLF
cStringRet +=         "<inscricaoEstadual>" + Alltrim(M->A2_INSCR) + "</inscricaoEstadual>" + CRLF
cStringRet +=         "<inscricaoMunicipal>" + Alltrim(M->A2_INSCRM) + "</inscricaoMunicipal>" + CRLF
cStringRet +=         "<numeroInss></numeroInss>" + CRLF
cStringRet +=         "<pisPasep></pisPasep>" + CRLF
cStringRet +=         "<qtdDependentes></qtdDependentes>" + CRLF
cStringRet +=         "<ativo>" + cFornAtivo + "</ativo>" + CRLF        
cStringRet +=         "<codigoBanco></codigoBanco>" + CRLF
cStringRet +=         "<nomeBanco></nomeBanco>" + CRLF
cStringRet +=         "<nomeAgencia></nomeAgencia>" + CRLF
cStringRet +=         "<digitoVerificadorAgencia></digitoVerificadorAgencia>" + CRLF
cStringRet +=         "<codigoAgencia></codigoAgencia>" + CRLF
cStringRet +=         "<conta></conta>" + CRLF
cStringRet +=         "<endereco>" + CRLF
cStringRet +=             "<rua>" + Alltrim(M->A2_END) + "</rua>" + CRLF
cStringRet +=             "<numero></numero>" + CRLF
cStringRet +=             "<complemento>" + Alltrim(M->A2_ENDCOMP) + "</complemento>" + CRLF
cStringRet +=             "<cep>" + M->A2_CEP + "</cep>" + CRLF
cStringRet +=             "<bairro>" + Alltrim(M->A2_BAIRRO) + "</bairro>" + CRLF
cStringRet +=             "<cidade>" + Alltrim(M->A2_MUN) + "</cidade>" + CRLF
cStringRet +=             "<codigoCidade>" + M->A2_COD_MUN + "</codigoCidade>" + CRLF
cStringRet +=             "<uf>" + M->A2_EST + "</uf>" + CRLF
cStringRet +=         "</endereco>" + CRLF
cStringRet +=         "<codigoTipoConstEmpresaDePara></codigoTipoConstEmpresaDePara>" + CRLF
cStringRet +=         "<listaContato>" + CRLF
cStringRet +=             "<Contato>" + CRLF
cStringRet +=                 "<operacao>" + cOperacao + "</operacao>" + CRLF //VERIFICAR O TIPO DE ALTERACAO
cStringRet +=                 "<empresaOrigem></empresaOrigem>" + CRLF
cStringRet +=                 "<codigoContato>1</codigoContato>" + CRLF
cStringRet +=                 "<nomeContato>" + Alltrim(M->A2_CONTATO) + "</nomeContato>" + CRLF
cStringRet +=                 "<descContato>" + Alltrim(M->A2_DDD + M->A2_TEL) + "</descContato>    " + CRLF         
cStringRet +=             "</Contato>" + CRLF
cStringRet +=         "</listaContato>" + CRLF
cStringRet +=     "</CadastroFornecedor>" + CRLF
cStringRet += "</Mensagem>]]>"+ CRLF
cStringRet += "</core:mensagem>"+ CRLF
cStringRet += "</soapenv:Body>"+ CRLF
cStringRet += "</soapenv:Envelope>"+ CRLF

//Instancia a classe na variável oWsdl
oWsdl := TWsdlManager():New()

//Define o modo de trabalho como "VERBOSE"
oWsdl:lVerbose := .T.          

//Tenta fazer o parse da URL
lRet := oWsdl:ParseURL("http://localhost:8180/jintegra-core/servicestst/WebservicePadraotst?wsdl") 
If lRet
    
    //Tenta definir a operação
    lRet := oWsdl:SetOperation("processar")
    If ! lRet 
        MsgAlert("Erro SetOperation: " + oWsdl:cError, "Atenção")
        lContinua := .F.
    EndIf
    
    //Se for continuar o processamento
    If lContinua
        //Envia o XML montado
        lRet := oWsdl:SendSoapMsg( cStringRet )
        
        //Se houve falha, exibe a mensagem
        If ! lRet
            MsgAlert("Erro SendSoapMsg: " + oWsdl:cError, "Atenção")
			
        Else
		
            //Pega a resposta do SOAP e transforma em Objeto a resposta
            cMsgRet := oWsdl:GetSoapResponse()
            oLido := XmlParser(cMsgRet, "_", @cErros, @cAvisos)
            
            //Se existir alguma mensagem de Warning, e quiser exibir, basta descomentar a linha do MsgInfo
            If ! Empty(cAvisos)
                //MsgInfo("Aviso(s) ao converter em objeto: " + cAvisos, "Atenção")
            EndIf
			
			//Se existe a tag de erro
            If At('<motivoErro>', cMsgRet) > 0
                cMsgErro := oLido:_S_ENVELOPE:_S_BODY:_NS2_MENSAGEMRETORNO:_MENSAGEM:_MOTIVOERRO:_DESCRICAO:TEXT
                lHouveErro := .T.

            Else
                cMsgSuces := oLido:_S_ENVELOPE:_S_BODY:_NS2_MENSAGEMRETORNO:_MENSAGEM:_SUCESSO:_DESCRICAO:TEXT
                lHouveErro := .F.
            EndIf
			
            //Se houve erro ou deu certo, mostra a mensagem
            If lHouveErro
                MsgStop("Erro na Integração: " + cMsgErro, "Atenção")
            Else    
                MsgInfo("Sucesso na Integração: " + cMsgSuces, "Atenção")
            EndIF                                
        EndIf
    EndIf
	
Else
    MsgAlert("Erro ParseURL: " + oWsdl:cError, "Atenção")
EndIf

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.

Deixe uma resposta

Terminal de Informação