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.