PC SOFT
ONLINE REPOSITORY
FOR WINDEVWEBDEV AND WINDEV MOBILE

Home |  | Sign in | English US
[DLL Unimake.DFe] Gerando e enviando XML de eventos encerramento/cancelamento do MDFe e desserializando XML do MDFe.
Published by Wandrey
in the category Various
New features



Description
No 12º episódio do Wandrey Descomplica sobre a DLL Unimake.DFe, aprendemos:

- Criar e enviar o XML de evento de encerramento do MDFe.
- Criar e enviar o XML de evento de cancelamento do MDFe.
- Desserializar do XML do MDFe pronto (Para aqueles que já possuem o XML do MDFe pronto, abordaremos técnicas que permitem transformar o XML em um objeto de forma eficaz, economizando tempo e recursos.)

A seguir, apresento o código em WINDEV para realizar as tarefas descritas acima.

Como criar e enviar o XML de evento de encerramento do MDFe:

```
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao
oConfiguracao.TipoDfe = 4 //4=MDFe
oConfiguracao.CertificadoSenha = "12345678"
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"

//Criar tag Evento
oEventoMDFe is Unimake.Business.DFe.XML.MDFe.EventoMDFe
oEventoMDFe.Versao = "3.00"

//Criar tag DetEventoEncMDFe
oDetEventoEncMDFe is Unimake.Business.DFe.XML.MDFe.DetEventoEncMDFe
oDetEventoEncMDFe.VersaoEvento = "3.00"
oDetEventoEncMDFe.NProt = "141200000007987"
oDetEventoEncMDFe.CMun = 3106200
oDetEventoEncMDFe.CUF = 41
oDetEventoEncMDFe.DtEnc = SysDateTime()

//Criar tag InfEvento
oInfEvento is Unimake.Business.DFe.XML.MDFe.InfEvento

//Adicionar a tag DetEventoEncMDFe dentro da Tag DetEvento
oInfEvento.DetEvento = oDetEventoEncMDFe

//Atualizar propriedades da oInfEvento
//IMPORTANTE: Atualização da propriedade TpEvento deve acontecer depois que o DetEvento recebeu o oDetEventoCanc para que funcione sem erro
oInfEvento.COrgao = 41 // UFBrasil.PR
oInfEvento.ChMDFe = "41200210859283000185570010000005671227070615"
oInfEvento.CNPJ = "10859283000185"
oInfEvento.DhEvento = SysDateTime()
oInfEvento.TpEvento = 110112 // TipoEventoNFe.Encerramento ###
oInfEvento.NSeqEvento = 1
oInfEvento.TpAmb = 2 // TipoAmbiente.Homologacao

//Adicionar a tag InfEvento dentro da tag Evento
oEventoMDFe.InfEvento = oInfEvento

//Resgatar algumas informações do XML partindo do objeto criado
EDT_RetornoWSString = "<versao>: " + oEventoMDFe.Versao + CR
EDT_RetornoWSString += "<chMDFe>: " + oEventoMDFe.InfEvento.ChMDFe + CR

oDetEvento is Unimake.Business.DFe.XML.MDFe.DetEventoEncMDFe <- oEventoMDFe.InfEvento.DetEvento
EDT_RetornoWSString += "<nProt>: " + oDetEvento.NProt + CR + CR

WHEN EXCEPTION IN
//Consumir o serviço
oRecepcaoEvento is Unimake.Business.DFe.Servicos.MDFe.RecepcaoEvento
oRecepcaoEvento.Executar(oEventoMDFe, oConfiguracao)

eventoAssinado is string = oRecepcaoEvento.GetConteudoXMLAssinado()
EDT_RetornoWSString += "XML Assinado: " + CR + eventoAssinado + CR + CR

// Gravar o XML assinado no HD
fDelete("d:\testenfe\EncerramentoMDFe.xml")
fSaveText("d:\testenfe\EncerramentoMDFe.xml", eventoAssinado)

//Ver retorno da SEFAZ
EDT_RetornoWSString += "XML Retornado: " + CR + oRecepcaoEvento.RetornoWSString + CR + CR

//Ver o conteúdo da tag CStat e XMotivo
EDT_RetornoWSString += "CStat do Lote Retornado: " + oRecepcaoEvento.Result.InfEvento.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRecepcaoEvento.Result.InfEvento.XMotivo + CR + CR

IF oRecepcaoEvento.Result.InfEvento.CStat = 135 // Recebido pelo Sistema de Registro de Eventos, com vinculação do evento no respetivo MDFe
oRecepcaoEvento.GravarXmlDistribuicao("d:\testenfe") //Grava o XML de distribuição

EDT_RetornoWSString += "String do XML de distribuição do evento:" + CR + CR
EDT_RetornoWSString += oRecepcaoEvento.ProcEventoMDFeResult.GerarXMLString() + CR + CR
ELSE
//Rejeitado
END
DO
Info(ExceptionInfo(errFullDetails)) //Ele também pega o conteúdo da Exception do lado do C#, importante envolver o código em Try/Catch
END
```

Como criar e enviar o XML de evento de cancelamento do MDFe:

```
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao
oConfiguracao.TipoDfe = 4 //4=MDFe
oConfiguracao.CertificadoSenha = "12345678"
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"

//Criar tag Evento
oEventoMDFe is Unimake.Business.DFe.XML.MDFe.EventoMDFe
oEventoMDFe.Versao = "3.00"

//Criar tag DetEventoCanc
oDetEventoCanc is Unimake.Business.DFe.XML.MDFe.DetEventoCanc
oDetEventoCanc.VersaoEvento = "3.00"
oDetEventoCanc.NProt = "141200000007987"
oDetEventoCanc.XJust = "Justificativa para cancelamento do MDFe de teste"

//Criar tag InfEvento
oInfEvento is Unimake.Business.DFe.XML.MDFe.InfEvento

//Adicionar a tag DetEventoCanc dentro da Tag DetEvento
oInfEvento.DetEvento = oDetEventoCanc

//Atualizar propriedades da oInfEvento
//IMPORTANTE: Atualização da propriedade TpEvento deve acontecer depois que o DetEvento recebeu o oDetEventoCanc para que funcione sem erro
oInfEvento.COrgao = 41 // UFBrasil.PR
oInfEvento.ChMDFe = "41200210859283000185570010000005671227070615"
oInfEvento.CNPJ = "10859283000185"
oInfEvento.DhEvento = SysDateTime()
oInfEvento.TpEvento = 110111 // TipoEventoNFe.Cancelamento
oInfEvento.NSeqEvento = 1
oInfEvento.TpAmb = 2 // TipoAmbiente.Homologacao

//Adicionar a tag InfEvento dentro da tag Evento
oEventoMDFe.InfEvento = oInfEvento

//Resgatar algumas informações do XML partindo do objeto criado
EDT_RetornoWSString = "<versao>: " + oEventoMDFe.Versao + CR
EDT_RetornoWSString += "<chMDFe>: " + oEventoMDFe.InfEvento.ChMDFe + CR

oDetEvento is Unimake.Business.DFe.XML.MDFe.DetEventoEncMDFe <- oEventoMDFe.InfEvento.DetEvento
EDT_RetornoWSString += "<nProt>: " + oDetEvento.NProt + CR + CR

WHEN EXCEPTION IN
//Consumir o serviço
oRecepcaoEvento is Unimake.Business.DFe.Servicos.MDFe.RecepcaoEvento
oRecepcaoEvento.Executar(oEventoMDFe, oConfiguracao)

eventoAssinado is string = oRecepcaoEvento.GetConteudoXMLAssinado()
EDT_RetornoWSString += "XML Assinado: " + CR + eventoAssinado + CR + CR

// Gravar o XML assinado no HD
fDelete("d:\testenfe\CancelamentoMDFe.xml")
fSaveText("d:\testenfe\CancelamentoMDFe.xml", eventoAssinado)

//Ver retorno da SEFAZ
EDT_RetornoWSString += "XML Retornado: " + CR + oRecepcaoEvento.RetornoWSString + CR + CR

//Ver o conteúdo da tag CStat e XMotivo
EDT_RetornoWSString += "CStat do Lote Retornado: " + oRecepcaoEvento.Result.InfEvento.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRecepcaoEvento.Result.InfEvento.XMotivo + CR + CR

IF oRecepcaoEvento.Result.InfEvento.CStat = 135 // Recebido pelo Sistema de Registro de Eventos, com vinculação do evento no respetivo MDFe
oRecepcaoEvento.GravarXmlDistribuicao("d:\testenfe") //Grava o XML de distribuição

EDT_RetornoWSString += "String do XML de distribuição do evento:" + CR + CR
EDT_RetornoWSString += oRecepcaoEvento.ProcEventoMDFeResult.GerarXMLString() + CR + CR
ELSE
//Rejeitado
END
DO
Info(ExceptionInfo(errFullDetails)) //Ele também pega o conteúdo da Exception do lado do C#, importante envolver o código em Try/Catch
END

```

Como desserializar do XML do MDFe pronto (Para aqueles que já possuem o XML do MDFe pronto, abordaremos técnicas que permitem transformar o XML em um objeto de forma eficaz, economizando tempo e recursos.):

```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.TipoDFe = TipoDFe.MDFe
oConfiguracao.TipoEmissao = TipoEmissao.Normal
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"

// Criar o XML do MDFe
oMDFe is Unimake.Business.DFe.XML.MDFe.MDFe

//Desserializar o XML para criar o objeto a partir de um arquivo no HD
oMDFe <- oMDFe.LoadFromFile("D:\testenfe\41230306117473000150580010000008611017220670-mdfe.xml")

//Desserializar o XML para criar o objeto a partir da string do XML
//xmlMDFe is string=floadtext("D:\testenfe\41240306117473000150580010000008611017220672-mdfe.xml")
//oMDFe <- oMDFe.LoadFromXML(xmlMDFe)

//Recuperar algumas informações do objeto da NFe

EDT_RetornoWSString = "<chMDFe> " + oMDFe.InfMDFe.Chave + CR
EDT_RetornoWSString += "<cMDF> " + oMDFe.InfMDFe.Ide.CMDF + CR
EDT_RetornoWSString += "<nMDF> " + oMDFe.InfMDFe.Ide.NMDF + CR

WHEN EXCEPTION IN
//Consumir o serviço
oAutorizacaoSinc is Unimake.Business.DFe.Servicos.MDFe.AutorizacaoSinc()
oAutorizacaoSinc.SetXMLConfiguracao(oMDFe, oConfiguracao)

//Pode-se gravar o conteudo do XML assinado na base de dados antes do envio, caso queira recuperar para futuro tratamento, isso da garantias
xmlMDFeAssinado is string = oAutorizacaoSinc.GetConteudoMDFeAssinado()

// Demonstrar o XML do CTe assinado na tela
EDT_RetornoWSString += "XML CTe assinado: " + CR + CR + xmlMDFeAssinado + CR + CR

// Gravar o XML assinado no HD antes de enviar
chaveMDFe is string = oMDFe.InfMDFe.Chave
fDelete("d:\testenfe\" + chaveMDFe + "-mdfe.xml")
fSaveText("d:\testenfe\" + chaveMDFe + "-mdfe.xml", xmlMDFeAssinado)

oAutorizacaoSinc.Executar(oMDFe, oConfiguracao)

//Ver a string do XML retornado pela SEFAZ
EDT_RetornoWSString += "Retorno do webservice: " + CR + CR + oAutorizacaoSinc.RetornoWSString + CR + CR

EDT_RetornoWSString += "<cStat Lote> " + oAutorizacaoSinc.Result.CStat + CR
EDT_RetornoWSString += "<xMotivo Lote>" + oAutorizacaoSinc.Result.XMotivo + CR + CR

IF oAutorizacaoSinc.Result.CStat = 104 // 104 = Lote processado com sucesso
EDT_RetornoWSString += "<cStat MDFe> " + oAutorizacaoSinc.Result.ProtMDFe.InfProt.CStat + CR
EDT_RetornoWSString += "<xMotivo MDFe>" + oAutorizacaoSinc.Result.ProtMDFe.InfProt.XMotivo + CR + CR

IF oAutorizacaoSinc.Result.ProtMDFe.InfProt.CStat = 100 // MDFe autorizado
//Gravar o XML de distribuição do CTe no HD, se preferir assim.
oAutorizacaoSinc.GravarXmlDistribuicao("d:\testenfe")

//Pegar a string do XML de distribuição para gravar na base de dados, se preferir assim.
stringXmlDistribuicao is string = oAutorizacaoSinc.GetMDFeProcResults(oMDFe.InfMDFe.Chave)

EDT_RetornoWSString += "XML de Distribuição: " + CR + CR + stringXmlDistribuicao
ELSE
//MDFe rejeitado, fazer devidos tratamentos
END
ELSE
//MDFe rejeitado, fazer devidos tratamentos
END

Info("FIM")
DO
Info(ExceptionInfo(errFullDetails)) //Ele também pega o conteúdo da Exception do lado do C#, importante envolver o código em Try/Catch
END
```

Para uma explicação mais detalhada do conteúdo deste post, confira o vídeo no seguinte link:
https://www.youtube.com/watch?v=4b_lWj2lQzU
Illustrations, screen shots
none
none
User reviews
(To evaluate this resource, click 'Write a review')
No review or comment? Be the first one!