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.