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