From 164708891b0aa7533e089ab2249405cc8b09ed58 Mon Sep 17 00:00:00 2001 From: JohnVanderson Date: Fri, 8 May 2026 13:58:36 -0300 Subject: [PATCH] fix(legacy): RecepcaoEventoCancelamentoAsync popular descEvento via Descricao() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Alinha o metodo legado com o upstream ZeusAutomacao/DFe.NET master, que popula descEvento explicitamente via tipoEventoCancelamento.Descricao() (linhas 640-650 do upstream). Antes, fork dependia de side-effect do setter de nProt em detEvento (removido no refactor PR #78 ao alinhar detEvento.cs com upstream). Sem descEvento, schema XSD e110111_v1.00 rejeita com cStat 493: "Rejeicao: Evento nao atende o Schema XML especifico (Elemento: envEvento/evento[1]/infEvento/detEvento/nProt)" — descEvento e o primeiro elemento da sequence, e validador encontra nProt no lugar errado. Usa NFeTipoEvento.TeNfeCancelamento.Descricao() (retorna "Cancelamento" via [Description] attribute) pra ficar identico ao upstream. Outros consumers da lib que usavam RecepcaoEventoCancelamentoAsync estavam quebrando silenciosamente. Apps que constroem o detEvento manualmente (ex: nfeio-product-invoice via CreateEventToCancel) ja faziam fix proprio fora da lib. --- NFe.Servicos/ServicosNFe.cs | 48 ++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/NFe.Servicos/ServicosNFe.cs b/NFe.Servicos/ServicosNFe.cs index ae43d7dba..7c4ac92df 100644 --- a/NFe.Servicos/ServicosNFe.cs +++ b/NFe.Servicos/ServicosNFe.cs @@ -929,10 +929,34 @@ private async Task RecepcaoEventoEAssinaAsync(long idlote /// /// /// - /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + /// Retorna um objeto da classe com o retorno do serviço public Task RecepcaoEventoCancelamentoAsync(long idlote, int sequenciaEvento, string protocoloAutorizacao, string chaveNFe, string justificativa, string cpfcnpj) { + return RecepcaoEventoCancelamentoAsync(NFeTipoEvento.TeNfeCancelamento, idlote, sequenciaEvento, + protocoloAutorizacao, chaveNFe, justificativa, cpfcnpj); + } + + /// + /// Envia um evento do tipo "Cancelamento por substituição" + /// + /// Retorna um objeto da classe com o retorno do serviço + public Task RecepcaoEventoCancelamentoPorSubstituicaoAsync(long idlote, int sequenciaEvento, + string protocoloAutorizacao, string chaveNFe, string justificativa, string cpfcnpj, Estado ufAutor, string versaoAplicativo, string chaveNfeSubstituta) + { + return RecepcaoEventoCancelamentoAsync(NFeTipoEvento.TeNfeCancelamentoSubstituicao, idlote, sequenciaEvento, + protocoloAutorizacao, chaveNFe, justificativa, cpfcnpj, ufAutor, TipoAutor.taEmpresaEmitente, versaoAplicativo, chaveNfeSubstituta); + } + + private Task RecepcaoEventoCancelamentoAsync(NFeTipoEvento tipoEventoCancelamento, long idlote, + int sequenciaEvento, string protocoloAutorizacao, string chaveNFe, string justificativa, string cpfcnpj, + Estado? ufAutor = null, TipoAutor? tipoAutor = null, string versaoAplicativo = null, string chaveNfeSubstituta = null) + { + if (!NFeTipoEventoUtils.NFeTipoEventoCancelamento.Contains(tipoEventoCancelamento)) + throw new Exception(string.Format("Informe um dos seguintes tipos de eventos: {0}", + string.Join(", ", + NFeTipoEventoUtils.NFeTipoEventoCancelamento.Select(n => n.Descricao())))); + var versaoServico = ServicoNFe.RecepcaoEventoCancelmento.VersaoServicoParaString( _cFgServico.VersaoRecepcaoEventoCceCancelamento); @@ -941,36 +965,32 @@ public Task RecepcaoEventoCancelamentoAsync(long idlote, { nProt = protocoloAutorizacao, versao = versaoServico, - xJust = justificativa + xJust = justificativa, + descEvento = tipoEventoCancelamento.Descricao(), + cOrgaoAutor = ufAutor, + tpAutor = tipoAutor, + verAplic = versaoAplicativo, + chNFeRef = chaveNfeSubstituta }; - var infEvento = new infEventoEnv { cOrgao = _cFgServico.cUF, tpAmb = _cFgServico.tpAmb, chNFe = chaveNFe, dhEvento = DateTime.Now, - tpEvento = NFeTipoEvento.TeNfeCancelamento, + tpEvento = tipoEventoCancelamento, nSeqEvento = sequenciaEvento, verEvento = versaoServico, detEvento = detEvento }; - if (cpfcnpj.Length == 11) infEvento.CPF = cpfcnpj; else infEvento.CNPJ = cpfcnpj; - var evento = new evento - { - versao = versaoServico, - infEvento = infEvento - }; + var evento = new evento { versao = versaoServico, infEvento = infEvento }; - return RecepcaoEventoEAssinaAsync(idlote, new List - { - evento - }, ServicoNFe.RecepcaoEventoCancelmento); + return RecepcaoEventoEAssinaAsync(idlote, new List { evento }, ServicoNFe.RecepcaoEventoCancelmento); } ///