No 6º episódio do Wandrey Descomplica sobre a DLL Unimake.DFe, aprendemos:
- Como gerar o XML do evento de cancelamento da NFe/NFCe e enviar para a SEFAZ;
- Como gerar o XML de evento de CCe da NFe/NFCe e enviar para a SEFAZ.
A seguir, apresento o código em WINDEV para realizar as tarefas descritas acima.
Envio do XML de evento de cancelamento da NFe:
```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.TipoDFe = TipoDFe.NFe
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"
//Criar tag EnvEvento
oEnvEvento is Unimake.Business.DFe.XML.NFe.EnvEvento
oEnvEvento.Versao = "1.00"
oEnvEvento.IdLote = "000000000000001"
//-------------------------------------------------
//Criar tags do evento sequencia 1
//-------------------------------------------------
//Criar tag Evento
oEvento is Unimake.Business.DFe.XML.NFe.Evento
oEvento.Versao = "1.00"
//Criar tag DetEventoCanc
oDetEventoCanc is Unimake.Business.DFe.XML.NFe.DetEventoCanc
oDetEventoCanc.Versao = "1.00"
oDetEventoCanc.NProt = "141190000660363"
oDetEventoCanc.XJust = "Justificativa para cancelamento da NFe de teste"
//Criar tag InfEvento
oInfEvento is Unimake.Business.DFe.XML.NFe.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 = UFBrasil.PR
oInfEvento.ChNFe = "41191006117473000150550010000579281779843610"
oInfEvento.CNPJ = "06117473000150"
oInfEvento.DhEvento = SysDateTime()
oInfEvento.TpEvento = 110111 //TipoEventoNFe.Cancelamento
oInfEvento.NSeqEvento = 1
oInfEvento.VerEvento = "1.00"
oInfEvento.TpAmb = 2 //TipoAmbiente.Homologacao
//Adicionar a tag InfEvento dentro da tag Evento
oEvento.InfEvento = oInfEvento
//Adicionar a tag Evento dentro da tag EnvEvento
oEnvEvento.AddEvento(oEvento)
EDT_RetornoWSString = "Versao schema: " + oEnvEvento.Versao + CR
EDT_RetornoWSString += "LOTE: " + oEnvEvento.IdLote + CR
EDT_RetornoWSString += "Qtde eventos: " + oEnvEvento.GetEventoCount + CR + CR
WHEN EXCEPTION IN
//Consumir o serviço
oRecepcaoEvento is Unimake.Business.DFe.Servicos.NFe.RecepcaoEvento
oRecepcaoEvento.Executar(oEnvEvento, oConfiguracao)
eventoAssinado is string = oRecepcaoEvento.GetConteudoXMLAssinado()
EDT_RetornoWSString += "XML Assinado: " + CR + eventoAssinado + CR + CR
// Gravar o XML assinado no HD
fDelete("d:\testenfe\CancelamentoNFe.xml")
fSaveText("d:\testenfe\CancelamentoNFe.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.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRecepcaoEvento.Result.XMotivo + CR + CR
IF oRecepcaoEvento.Result.CStat = 128 //128 = Lote de evento processado com sucesso.
//Como pode existir vários eventos no XML (Caso da carta de correção que posso enviar várias sequencias de evento)
//é necessário fazer um loop para ver a autorização de cada um deles
FOR I = 1 TO oRecepcaoEvento.Result.GetRetEventoCount
oRetEvento is Unimake.Business.DFe.XML.NFe.RetEvento <- oRecepcaoEvento.Result.GetRetEvento(I - 1)
EDT_RetornoWSString += "CStat do evento " + I + ": " + oRetEvento.InfEvento.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRetEvento.InfEvento.XMotivo
SWITCH oRetEvento.InfEvento.CStat
CASE 135 // Evento homologado com vinculação da respectiva NFe
CASE 136 // Evento homologado sem vinculação com À respectiva NFe (SEFAZ não encontrou À NFe na base dela)
CASE 155 // Evento de Cancelamento homologado fora DO prazo permitido para cancelamento
// Grava o XML de distribuição
oRecepcaoEvento.GravarXmlDistribuicao("tmp\testenfe") // Grava o XML de distribuição
OTHER CASE
// Evento rejeitado
// Realizar as ações necessárias
END
END
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
```
Envio do XML de evento de cancelamento da NFCe:
```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.TipoDFe = TipoDFe.NFCe //###
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"
//Criar tag EnvEvento
oEnvEvento is Unimake.Business.DFe.XML.NFe.EnvEvento
oEnvEvento.Versao = "1.00"
oEnvEvento.IdLote = "000000000000001"
//-------------------------------------------------
//Criar tags do evento sequencia 1
//-------------------------------------------------
//Criar tag Evento
oEvento is Unimake.Business.DFe.XML.NFe.Evento
oEvento.Versao = "1.00"
//Criar tag DetEventoCanc
oDetEventoCanc is Unimake.Business.DFe.XML.NFe.DetEventoCanc
oDetEventoCanc.Versao = "1.00"
oDetEventoCanc.NProt = "141190000660363"
oDetEventoCanc.XJust = "Justificativa para cancelamento da NFe de teste"
//Criar tag InfEvento
oInfEvento is Unimake.Business.DFe.XML.NFe.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 = UFBrasil.PR
oInfEvento.ChNFe = "41191006117473000150550010000579281779843610"
oInfEvento.CNPJ = "06117473000150"
oInfEvento.DhEvento = SysDateTime()
oInfEvento.TpEvento = 110111 //TipoEventoNFe.Cancelamento
oInfEvento.NSeqEvento = 1
oInfEvento.VerEvento = "1.00"
oInfEvento.TpAmb = 2 //TipoAmbiente.Homologacao
//Adicionar a tag InfEvento dentro da tag Evento
oEvento.InfEvento = oInfEvento
//Adicionar a tag Evento dentro da tag EnvEvento
oEnvEvento.AddEvento(oEvento)
EDT_RetornoWSString = "Versao schema: " + oEnvEvento.Versao + CR
EDT_RetornoWSString += "LOTE: " + oEnvEvento.IdLote + CR
EDT_RetornoWSString += "Qtde eventos: " + oEnvEvento.GetEventoCount + CR + CR
WHEN EXCEPTION IN
//Consumir o serviço
oRecepcaoEvento is Unimake.Business.DFe.Servicos.NFCe.RecepcaoEvento //###
oRecepcaoEvento.Executar(oEnvEvento, oConfiguracao)
eventoAssinado is string = oRecepcaoEvento.GetConteudoXMLAssinado()
EDT_RetornoWSString += "XML Assinado: " + CR + eventoAssinado + CR + CR
// Gravar o XML assinado no HD
fDelete("d:\testenfe\CancelamentoNFCe.xml") //###
fSaveText("d:\testenfe\CancelamentoNFCe.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.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRecepcaoEvento.Result.XMotivo + CR + CR
IF oRecepcaoEvento.Result.CStat = 128 //128 = Lote de evento processado com sucesso.
//Como pode existir vários eventos no XML (Caso da carta de correção que posso enviar várias sequencias de evento)
//é necessário fazer um loop para ver a autorização de cada um deles
FOR I = 1 TO oRecepcaoEvento.Result.GetRetEventoCount
oRetEvento is Unimake.Business.DFe.XML.NFe.RetEvento <- oRecepcaoEvento.Result.GetRetEvento(I - 1)
EDT_RetornoWSString += "CStat do evento " + I + ": " + oRetEvento.InfEvento.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRetEvento.InfEvento.XMotivo
SWITCH oRetEvento.InfEvento.CStat
CASE 135 // Evento homologado com vinculação da respectiva NFe
CASE 136 // Evento homologado sem vinculação com À respectiva NFe (SEFAZ não encontrou À NFe na base dela)
CASE 155 // Evento de Cancelamento homologado fora DO prazo permitido para cancelamento
// Grava o XML de distribuição
oRecepcaoEvento.GravarXmlDistribuicao("tmp\testenfe") // Grava o XML de distribuição
OTHER CASE
// Evento rejeitado
// Realizar as ações necessárias
END
END
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
```
Envio do XML de evento de carta de correção da NFe:
```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.TipoDFe = TipoDFe.NFe
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"
//Criar tag EnvEvento
oEnvEvento is Unimake.Business.DFe.XML.NFe.EnvEvento
oEnvEvento.Versao = "1.00"
oEnvEvento.IdLote = "000000000000001"
//-------------------------------------------------
//Criar tags do evento sequencia 1
//-------------------------------------------------
//Criar tag Evento
oEvento is Unimake.Business.DFe.XML.NFe.Evento
oEvento.Versao = "1.00"
//Criar tag DetEventoCCE ###
oDetEventoCCE is Unimake.Business.DFe.XML.NFe.DetEventoCCE
oDetEventoCCE.Versao = "1.00"
oDetEventoCCE.XCorrecao = "CFOP errada, CFOP correta do produto 10 e 5602"
//Criar tag InfEvento
oInfEvento is Unimake.Business.DFe.XML.NFe.InfEvento
//Adicionar a tag DetEventoCCE dentro da Tag DetEvento
oInfEvento.DetEvento = oDetEventoCCE //###
//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 = UFBrasil.PR
oInfEvento.ChNFe = "41191006117473000150550010000579281779843610"
oInfEvento.CNPJ = "06117473000150"
oInfEvento.DhEvento = SysDateTime()
oInfEvento.TpEvento = 110110 //TipoEventoNFe.CartaCorrecao
oInfEvento.NSeqEvento = 1
oInfEvento.VerEvento = "1.00"
oInfEvento.TpAmb = 2 //TipoAmbiente.Homologacao
//Adicionar a tag InfEvento dentro da tag Evento
oEvento.InfEvento = oInfEvento
//Adicionar a tag Evento dentro da tag EnvEvento
oEnvEvento.AddEvento(oEvento)
//-------------------------------------------------
//Criar tags do evento sequencia 2
//-------------------------------------------------
//Criar tag Evento
oEvento2 is Unimake.Business.DFe.XML.NFe.Evento
oEvento2.Versao = "1.00"
//Criar tag DetEventoCCE ###
oDetEventoCCE2 is Unimake.Business.DFe.XML.NFe.DetEventoCCE
oDetEventoCCE2.Versao = "1.00"
oDetEventoCCE2.XCorrecao = "CFOP errada, CFOP correta do produto 10 e 5602"
//Criar tag InfEvento
oInfEvento2 is Unimake.Business.DFe.XML.NFe.InfEvento
//Adicionar a tag DetEventoCCE dentro da Tag DetEvento
oInfEvento2.DetEvento = oDetEventoCCE2 //###
//Atualizar propriedades da oInfEvento
//IMPORTANTE: Atualização da propriedade TpEvento deve acontecer depois que o DetEvento recebeu o oDetEventoCanc para que funcione sem erro
oInfEvento2.COrgao = UFBrasil.PR
oInfEvento2.ChNFe = "41191006117473000150550010000579281779843610"
oInfEvento2.CNPJ = "06117473000150"
oInfEvento2.DhEvento = SysDateTime()
oInfEvento2.TpEvento = 110110 //TipoEventoNFe.CartaCorrecao
oInfEvento2.NSeqEvento = 2
oInfEvento2.VerEvento = "1.00"
oInfEvento2.TpAmb = 2 //TipoAmbiente.Homologacao
//Adicionar a tag InfEvento dentro da tag Evento
oEvento2.InfEvento = oInfEvento2
//Adicionar a tag Evento dentro da tag EnvEvento
oEnvEvento.AddEvento(oEvento2)
EDT_RetornoWSString = "Versao schema: " + oEnvEvento.Versao + CR
EDT_RetornoWSString += "LOTE: " + oEnvEvento.IdLote + CR
EDT_RetornoWSString += "Qtde eventos: " + oEnvEvento.GetEventoCount + CR + CR
FOR I = 1 TO oEnvEvento.GetEventoCount
oTagEvento is Unimake.Business.DFe.XML.NFe.Evento <- oEnvEvento.GetEvento(I - 1)
EDT_RetornoWSString += "SEQUENCIA EVENTO: " + oTagEvento.InfEvento.NSeqEvento + CR
END
WHEN EXCEPTION IN
//Consumir o serviço
oRecepcaoEvento is Unimake.Business.DFe.Servicos.NFe.RecepcaoEvento
oRecepcaoEvento.Executar(oEnvEvento, oConfiguracao)
eventoAssinado is string = oRecepcaoEvento.GetConteudoXMLAssinado()
EDT_RetornoWSString += "XML Assinado: " + CR + eventoAssinado + CR + CR
// Gravar o XML assinado no HD
fDelete("d:\testenfe\CartaCorrecaoNFe.xml")
fSaveText("d:\testenfe\CartaCorrecaoNFe.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.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRecepcaoEvento.Result.XMotivo + CR + CR
IF oRecepcaoEvento.Result.CStat = 128 //128 = Lote de evento processado com sucesso.
//Como pode existir vários eventos no XML (Caso da carta de correção que posso enviar várias sequencias de evento)
//é necessário fazer um loop para ver a autorização de cada um deles
FOR I = 1 TO oRecepcaoEvento.Result.GetRetEventoCount
oRetEvento is Unimake.Business.DFe.XML.NFe.RetEvento <- oRecepcaoEvento.Result.GetRetEvento(I - 1)
EDT_RetornoWSString += "CStat do evento " + I + ": " + oRetEvento.InfEvento.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRetEvento.InfEvento.XMotivo
SWITCH oRetEvento.InfEvento.CStat
CASE 135 // Evento homologado com vinculação da respectiva NFe
CASE 136 // Evento homologado sem vinculação com À respectiva NFe (SEFAZ não encontrou À NFe na base dela)
CASE 155 // Evento de Cancelamento homologado fora DO prazo permitido para cancelamento
// Grava o XML de distribuição
oRecepcaoEvento.GravarXmlDistribuicao("tmp\testenfe") // Grava o XML de distribuição
OTHER CASE
// Evento rejeitado
// Realizar as ações necessárias
END
END
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
```
Para uma explicação mais detalhada do conteúdo deste post, confira o vídeo no seguinte link:
https://www.youtube.com/watch?v=VQPiUf2eSbQ