diff --git a/NFe.Classes/Servicos/Evento/Informacoes/ItemConsumo/DFeReferenciado.cs b/NFe.Classes/Servicos/Evento/Informacoes/ItemConsumo/DFeReferenciado.cs
index ec594cd51..35903c113 100644
--- a/NFe.Classes/Servicos/Evento/Informacoes/ItemConsumo/DFeReferenciado.cs
+++ b/NFe.Classes/Servicos/Evento/Informacoes/ItemConsumo/DFeReferenciado.cs
@@ -39,10 +39,10 @@ public class DFeReferenciado
/// P31 - Informa a chave da nota (NFe ou NFCe) emitida para o fornecimento nos casos em que a legislação obriga a emissão de documento fiscal.
///
public string chaveAcesso { get; set; }
-
+
///
- /// P32 - Corresponde ao “nItem” do DFeReferenciado
+ /// P32 - Corresponde ao "nItem" do DFeReferenciado.
///
- public int nItemDFeRef { get; set; }
+ public int nItem { get; set; }
}
-}
\ No newline at end of file
+}
diff --git a/NFe.Classes/Servicos/Evento/Informacoes/ItemConsumo/gConsumo.cs b/NFe.Classes/Servicos/Evento/Informacoes/ItemConsumo/gConsumo.cs
index 6e8090b18..31209ee6d 100644
--- a/NFe.Classes/Servicos/Evento/Informacoes/ItemConsumo/gConsumo.cs
+++ b/NFe.Classes/Servicos/Evento/Informacoes/ItemConsumo/gConsumo.cs
@@ -1,4 +1,4 @@
-/********************************************************************************/
+/********************************************************************************/
/* Projeto: Biblioteca ZeusNFe */
/* Biblioteca C# para emissão de Nota Fiscal Eletrônica - NFe e Nota Fiscal de */
/* Consumidor Eletrônica - NFC-e (http://www.nfe.fazenda.gov.br) */
@@ -31,10 +31,7 @@
/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */
/********************************************************************************/
-using System;
-using System.Linq;
using System.Xml.Serialization;
-using NFe.Classes.Servicos.Tipos;
namespace NFe.Classes.Servicos.Evento.Informacoes.ItemConsumo
{
@@ -43,96 +40,41 @@ public class gConsumo
private decimal _vIbs;
private decimal _vCbs;
- public gConsumo(NFeTipoEvento nFeTipoEvento)
- {
- var eventosPermitidos = new[]
- {
- NFeTipoEvento.TeNfeDestinacaoDeItemParaConsumoPessoal,
- NFeTipoEvento.TeNfeImportacaoEmAlcZfmNaoConvertidaEmIsencao
- };
-
- if (!eventosPermitidos.Contains(nFeTipoEvento))
- throw new ArgumentException($"Não é permitido instanciar gConsumo com o evento {nFeTipoEvento}.", nameof(nFeTipoEvento));
-
- if (nFeTipoEvento == NFeTipoEvento.TeNfeDestinacaoDeItemParaConsumoPessoal)
- _serializarValorIbsECbsComoAtributo = true;
- }
-
- private gConsumo() { } // Construtor sem parâmetros necessário apenas para o XmlSerializer
-
///
- /// P24 - Corresponde ao atributo “nItem” do elemento “det” da NF-e de aquisição
+ /// P24 - Corresponde ao atributo "nItem" do elemento "det" da NF-e de aquisição
///
[XmlAttribute("nItem")]
public int nItem { get; set; }
-
+
///
/// P25 - Valor do IBS na nota de aquisição correspondente à quantidade destinada a uso e consumo pessoal
///
- [XmlIgnore]
public decimal vIBS
{
get => _vIbs.Arredondar(2);
set => _vIbs = value.Arredondar(2);
}
-
- [XmlAttribute("vIBS")]
- public decimal vIBS_AsAttribute
- {
- get => vIBS;
- set => vIBS = value;
- }
- [XmlElement("vIBS")]
- public decimal vIBS_AsElement
- {
- get => vIBS;
- set => vIBS = value;
- }
-
///
/// P26 - Valor da CBS na nota de aquisição correspondente à quantidade destinada a uso e consumo pessoal
///
- [XmlIgnore]
public decimal vCBS
{
get => _vCbs.Arredondar(2);
set => _vCbs = value.Arredondar(2);
}
- [XmlAttribute("vCBS")]
- public decimal vCBS_AsAttribute
- {
- get => vCBS;
- set => vCBS = value;
- }
-
- [XmlElement("vCBS")]
- public decimal vCBS_AsElement
- {
- get => vCBS;
- set => vCBS = value;
- }
-
///
/// P27 - Informações de quantidade de estoque influenciadas pelo evento
///
[XmlElement(ElementName = "gControleEstoque")]
public gControleEstoque gControleEstoque { get; set; }
-
+
///
- /// P30 - Informações por item da NF-e de Uso e Consumo Pessoal
+ /// P30 - Informações por item da NF-e de Uso e Consumo Pessoal.
+ /// Usado apenas pelo evento e211120 (Destinação de item para consumo pessoal).
+ /// XSD do e112120 (AlcZfm) não declara este elemento — propriedade fica null nesse caso.
///
public DFeReferenciado DFeReferenciado { get; set; }
-
- private bool _serializarValorIbsECbsComoAtributo { get; }
-
- public bool ShouldSerializevCBS_AsAttribute() => _serializarValorIbsECbsComoAtributo;
-
- public bool ShouldSerializevCBS_AsElement() => !_serializarValorIbsECbsComoAtributo;
-
- public bool ShouldSerializevIBS_AsAttribute() => _serializarValorIbsECbsComoAtributo;
-
- public bool ShouldSerializevIBS_AsElement() => !_serializarValorIbsECbsComoAtributo;
}
-}
\ No newline at end of file
+}
diff --git a/NFe.Classes/Servicos/Evento/detEvento.cs b/NFe.Classes/Servicos/Evento/detEvento.cs
index cac724a97..4747bcce3 100644
--- a/NFe.Classes/Servicos/Evento/detEvento.cs
+++ b/NFe.Classes/Servicos/Evento/detEvento.cs
@@ -1,4 +1,4 @@
-/********************************************************************************/
+/********************************************************************************/
/* Projeto: Biblioteca ZeusNFe */
/* Biblioteca C# para emissão de Nota Fiscal Eletrônica - NFe e Nota Fiscal de */
/* Consumidor Eletrônica - NFC-e (http://www.nfe.fazenda.gov.br) */
@@ -45,9 +45,24 @@
using NFe.Classes.Servicos.Evento.Informacoes.ItemNaoFornecido;
using NFe.Classes.Servicos.Evento.Informacoes.Perecimento;
+// =====================================================================================
+// Alinhado com upstream ZeusAutomacao/DFe.NET master.
+// Divergencias intencionais do fork:
+// 1. dest property usa tipo `detEventoDest` (upstream usa `dest`).
+// Motivo: ServicosNFe.cs:1122 (handlers EPEC) instancia `new detEventoDest`.
+// Trocar para `dest` quebraria o build sem refactor coordenado.
+// 2. Region "Averbação para Exportação" (itensAverbados) ausente.
+// Motivo: classe `itensAverbados` nao existe neste fork.
+// 3. Region "Conciliação Financeira" (detPagEvento) ausente.
+// Motivo: classe `detPagEvento` nao existe neste fork.
+// Demais regions/properties espelham upstream em ordem e shape, garantindo merges
+// futuros mais limpos.
+// =====================================================================================
namespace NFe.Classes.Servicos.Evento
{
+ [XmlRoot(Namespace = "http://www.portalfiscal.inf.br/nfe")]
+ [XmlType(Namespace = "http://www.portalfiscal.inf.br/nfe")]
public class detEvento
{
///
@@ -62,102 +77,13 @@ public class detEvento
///
public string descEvento { get; set; }
- #region Cancelamento
-
- private string _nprot;
-
- ///
- /// HP20 - Informar o número do Protocolo de Autorização da NF-e a ser Cancelada.
- ///
- public string nProt
- {
- get { return _nprot; }
- set
- {
- if (string.IsNullOrEmpty(value)) return;
- descEvento = "Cancelamento";
- LimpaDadosCartaCorrecao();
- LimpaDadosEpec();
- _nprot = value;
- }
- }
-
- private string _xjust;
-
- ///
- /// HP21 - Informar a justificativa do cancelamento
- ///
- public string xJust
- {
- get { return _xjust; }
- set
- {
- if (string.IsNullOrEmpty(value)) return;
- descEvento = "Cancelamento";
- LimpaDadosCartaCorrecao();
- LimpaDadosEpec();
- _xjust = value;
- }
- }
-
- #endregion
-
- #region Carta de Correção
-
- private string _xcorrecao;
-
- ///
- /// HP20 - Correção a ser considerada, texto livre. A correção mais recente substitui as anteriores.
- ///
- public string xCorrecao
- {
- get { return _xcorrecao; }
- set
- {
- if (string.IsNullOrEmpty(value)) return;
- LimpaDadosCancelamento();
- LimpaDadosEpec();
- _xcorrecao = value;
- }
- }
-
- private string _xconduso;
-
- ///
- /// HP20a - Condições de uso da Carta de Correção
- ///
- public string xCondUso
- {
- get { return _xconduso; }
- set
- {
- if (string.IsNullOrEmpty(value)) return;
- _xconduso = value;
- }
- }
-
- #endregion
-
#region EPEC
- private Estado? _cOrgaoAutor;
-
///
/// P20 - Código do Órgão do Autor do Evento.
/// Nota: Informar o código da UF do Emitente para este evento.
///
- public Estado? cOrgaoAutor
- {
- get { return _cOrgaoAutor; }
- set
- {
- if (value == null) return;
- descEvento = "EPEC";
- LimpaDadosCancelamento();
- LimpaDadosCartaCorrecao();
- _cOrgaoAutor = value;
- }
- }
+ public Estado? cOrgaoAutor { get; set; }
///
/// P21 - Informar "1=Empresa Emitente" para este evento.
@@ -200,6 +126,8 @@ public string ProxyDhEmi
///
/// P26
///
+ // Divergencia intencional vs upstream: tipo `detEventoDest` em vez de `dest`.
+ // Ver cabecalho do arquivo.
public detEventoDest dest { get; set; }
public bool ShouldSerializecOrgaoAutor()
@@ -217,43 +145,238 @@ public bool ShouldSerializetpNF()
return tpNF.HasValue;
}
- private void LimpaDadosCancelamento()
+ #endregion
+
+ #region Cancelamento
+
+ ///
+ /// HP20 - Informar o número do Protocolo de Autorização da NF-e a ser Cancelada.
+ ///
+ public string nProt { get; set; }
+
+ ///
+ /// HP21 - Informar a justificativa do cancelamento
+ ///
+ public string xJust { get; set; }
+
+ #endregion
+
+ #region Cancelamento por substituição
+
+ ///
+ /// P31 - Chave de acesso da NF-e substituta da NF-e a ser cancelada
+ ///
+ public string chNFeRef { get; set; }
+
+ #endregion
+
+ // [DIVERGENCIA] Region "Averbação para Exportação" (itensAverbados) omitida
+ // — classe itensAverbados ausente neste fork.
+
+ #region RFC - Cancelamento Evento
+
+ ///
+ /// P23 - Código do evento autorizado a ser cancelado
+ ///
+ public string tpEventoAut {get; set;}
+
+ #endregion
+
+ #region Cancelamento Insucesso/Comprovante de Entrega NFe/ Cancelamento Evento
+
+ ///
+ /// P22 - Informar o número do Protocolo de Autorização do
+ /// Evento da NF-e a que se refere este cancelamento.
+ ///
+ public string nProtEvento { get; set; }
+
+ #endregion
+
+ #region Insucesso NFe
+ [XmlIgnore]
+ public DateTimeOffset? dhTentativaEntrega { get; set; }
+
+ ///
+ /// Proxy para dhTentativaEntrega no formato AAAA-MM-DDThh:mm:ssTZD (UTC - Universal Coordinated Time)
+ ///
+ [XmlElement(ElementName = "dhTentativaEntrega")]
+ public string ProxyDhTentativaEntrega
{
- nProt = "";
- xJust = "";
+ get { return dhTentativaEntrega.ParaDataHoraStringUtc(); }
+ set { dhTentativaEntrega = DateTimeOffset.Parse(value); }
}
- private void LimpaDadosCartaCorrecao()
+ ///
+ /// P31 - Número da tentativa de entrega que não teve sucesso
+ ///
+ public int? nTentativa { get; set; }
+
+ ///
+ /// P32 - Motivo do insucesso
+ ///
+ public MotivoInsucesso? tpMotivo { get; set; }
+
+ ///
+ /// P33 - Justificativa do motivo do insucesso. Informar apenas para tpMotivo =
+ ///
+ public string xJustMotivo { get; set; }
+
+ ///
+ /// P33 - Latitude do ponto de entrega
+ ///
+ public decimal? latGPS { get; set; }
+
+ ///
+ /// P34 - Longitude do ponto de entrega
+ ///
+ public decimal? longGPS { get; set; }
+
+ ///
+ /// P35 - Hash SHA-1, no formato Base64, resultante da concatenação de: Chave de Acesso da NF-e + Base64
+ /// da imagem capturada na tentativa da entrega(ex: imagem capturada da assinatura eletrônica, digital do recebedor, foto, etc).
+ ///
+ public string hashTentativaEntrega { get; set; }
+
+ ///
+ /// Data e hora da geração do hash da tentativa de entrega. Formato AAAA-MMDDThh:mm:ssTZD.
+ ///
+ [XmlIgnore]
+ public DateTimeOffset? dhHashTentativaEntrega { get; set; }
+
+ ///
+ /// Proxy para dhHashTentativaEntrega no formato AAAA-MM-DDThh:mm:ssTZD (UTC - Universal Coordinated Time)
+ ///
+ [XmlElement(ElementName = "dhHashTentativaEntrega")]
+ public string ProxyDhHashTentativaEntrega
+ {
+ get { return dhHashTentativaEntrega.ParaDataHoraStringUtc(); }
+ set { dhHashTentativaEntrega = DateTimeOffset.Parse(value); }
+ }
+
+ public bool ShouldSerializenTentativa()
+ {
+ return nTentativa.HasValue;
+ }
+
+ public bool ShouldSerializetpMotivo()
+ {
+ return tpMotivo.HasValue;
+ }
+
+ public bool ShouldSerializelatGPS()
+ {
+ return latGPS.HasValue;
+ }
+
+ public bool ShouldSerializelongGPS()
+ {
+ return longGPS.HasValue;
+ }
+
+ #endregion
+
+ #region Comprovante Entrega NFe
+
+ ///
+ /// P30 - Data e hora do final da entrega
+ ///
+ [XmlIgnore]
+ public DateTimeOffset? dhEntrega { get; set; }
+
+ ///
+ /// Proxy para dhEntrega no formato AAAA-MM-DDThh:mm:ssTZD (UTC - Universal Coordinated Time)
+ ///
+ [XmlElement(ElementName = "dhEntrega")]
+ public string ProxyDhEntrega
+ {
+ get { return dhEntrega.ParaDataHoraStringUtc(); }
+ set { dhEntrega = DateTimeOffset.Parse(value); }
+ }
+
+ ///
+ /// P31 - Número do documento de identificação da pessoa que assinou o Comprovante de Entrega da NF-e/>
+ ///
+ public string nDoc { get; set; }
+
+ ///
+ /// P32 - Nome da pessoa que assinou o Comprovante de Entrega da NF-e/>
+ ///
+ public string xNome { get; set; }
+
+ ///
+ /// P35 - Hash SHA-1, no formato Base64, resultante da concatenação de: Chave de Acesso da NF-e + Base64
+ /// da imagem capturada do Comprovante de Entrega da NFe (ex: imagem capturada da assinatura eletrônica, digital do recebedor, foto, etc).
+ ///
+ public string hashComprovante { get; set; }
+
+ ///
+ /// P36 - Data e hora da geração do hash da tentativa de entrega. Formato AAAA-MMDDThh:mm:ssTZD.
+ ///
+ [XmlIgnore]
+ public DateTimeOffset? dhHashComprovante { get; set; }
+
+ ///
+ /// Proxy para dhHashComprovante no formato AAAA-MM-DDThh:mm:ssTZD (UTC - Universal Coordinated Time)
+ ///
+ [XmlElement(ElementName = "dhHashComprovante")]
+ public string ProxyDhHashComprovante
{
- xCorrecao = "";
- xCondUso = "";
+ get { return dhHashComprovante.ParaDataHoraStringUtc(); }
+ set { dhHashComprovante = DateTimeOffset.Parse(value); }
}
- private void LimpaDadosEpec()
+ #endregion
+
+ // [DIVERGENCIA] Region "Conciliação Financeira" (detPag/detPagEvento) omitida
+ // — classe detPagEvento ausente neste fork.
+
+ #region Ator Interessado NFe
+ ///
+ /// P23 - Pessoas autorizadas a acessar o XML da NF-e
+ ///
+ [XmlElement("autXML")]
+ public List autXML { get; set; }
+
+ ///
+ /// P26 - 0 = Não permite;
+ /// 1 = Permite o transportador autorizado pelo
+ /// emitente ou destinatário autorizar outros
+ /// transportadores para ter acesso ao download da
+ /// NF-e
+ ///
+ public TipoAutorizacao? tpAutorizacao { get; set; }
+
+ public bool ShouldSerializetpAutorizacao()
{
- cOrgaoAutor = null;
- tpAutor = null;
- verAplic = null;
- dhEmi = null;
- tpNF = null;
- IE = null;
- dest = null;
- //vNF = null;
- //vICMS = null;
- //vST = null;
+ return tpAutorizacao != null;
}
#endregion
-
- #region Eventos para a apuração do IBS e da CBS
- #region Informação de efetivo pagamento integral para liberar crédito presumido do adquirente
+ #region Carta de Correção
+
+ ///
+ /// HP20 - Correção a ser considerada, texto livre. A correção mais recente substitui as anteriores.
+ ///
+ public string xCorrecao { get; set; }
+
+ ///
+ /// HP20a - Condições de uso da Carta de Correção.
+ /// P27 - Condição de uso do tipo de autorização para o transportador.
+ ///
+ public string xCondUso { get; set; }
+
+ #endregion
+
+ #region Eventos para a apuração do IBS e da CBS
+
+ #region Informação de efetivo pagamento integral para liberar crédito presumido do adquirente
///
/// P23 - Indicador de efetiva quitação do pagamento integral da operação referente a NFe referenciada
///
public IndicadorDeQuitacaoDoPagamento? indQuitacao { get; set; }
-
+
public bool ShouldSerializeindQuitacao()
{
return indQuitacao.HasValue;
@@ -268,7 +391,7 @@ public bool ShouldSerializeindQuitacao()
///
[XmlElement("gCredPres")]
public List gCredPres { get; set; }
-
+
public bool ShouldSerializegCredPres()
{
return gCredPres != null;
@@ -287,7 +410,7 @@ public bool ShouldSerializegCredPres()
///
[XmlElement("gConsumo")]
public List gConsumo { get; set; }
-
+
public bool ShouldSerializegConsumo() => gConsumo != null;
#endregion
@@ -321,7 +444,7 @@ public bool ShouldSerializegImobilizacao()
{
return gImobilizacao != null;
}
-
+
#endregion
#region Solicitação de Apropriação de Crédito de Combustível
@@ -331,7 +454,7 @@ public bool ShouldSerializegImobilizacao()
///
[XmlElement("gConsumoComb")]
public List gConsumoComb { get; set; }
-
+
public bool ShouldSerializegConsumoComb()
{
return gConsumoComb != null;
@@ -351,7 +474,7 @@ public bool ShouldSerializegCredito()
{
return gCredito != null;
}
-
+
#endregion
#region Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operações de Sucessão | Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operações de Sucessão
@@ -367,39 +490,30 @@ public bool ShouldSerializeindDeferimento()
{
return indDeferimento != null;
}
-
+
///
/// P24 - Motivo deferimento
///
public MotivoDeferimento? cMotivo { get; set; }
-
+
public bool ShouldSerializecMotivo()
{
return cMotivo != null;
}
-
+
///
/// P24 - Descrição deferimento
///
public string xMotivo { get; set; }
-
- #endregion
-
- #region Cancelamento Evento
- ///
- /// P23 - Código do evento autorizado a ser cancelado
- ///
- public string tpEventoAut {get; set;}
-
#endregion
#region Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente
///
- /// P23 - Informações por item da Nota de Aquisição
+ /// P23 - Informações por item da Nota de Aquisição
/// (Evento: perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente).
- /// P23 - Informações por item da Nota de Fornecimento
+ /// P23 - Informações por item da Nota de Fornecimento
/// (Evento: perecimento, perda, roubo ou furto durante o transporte contratado pelo fornecedor).
///
[XmlElement("gPerecimento")]
@@ -443,4 +557,4 @@ public string ProxydPrevEntrega
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/NFe.Servicos/ServicosNFe.cs b/NFe.Servicos/ServicosNFe.cs
index 9cdfd7948..ae43d7dba 100644
--- a/NFe.Servicos/ServicosNFe.cs
+++ b/NFe.Servicos/ServicosNFe.cs
@@ -262,7 +262,7 @@ private INfeServico CriarServico(ServicoNFe servico, string proxyAddress = null)
case ServicoNFe.RecepcaoEventoCartaCorrecao:
case ServicoNFe.RecepcaoEventoCancelmento:
case ServicoNFe.RecepcaoEventoManifestacaoDestinatario:
- if (IsSvanNFe4())
+ if (IsSvanNFe4())
return new RecepcaoEvento4SVAN(url, _certificado, _cFgServico.TimeOut);
if (_cFgServico.VersaoRecepcaoEventoCceCancelamento == VersaoServico.Versao400)
@@ -270,6 +270,17 @@ private INfeServico CriarServico(ServicoNFe servico, string proxyAddress = null)
return new RecepcaoEvento(url, _certificado, _cFgServico.TimeOut);
+ // NT 2025.002-RTC — eventos de apuração IBS/CBS (escopo emitente).
+ // SVRS reutiliza o mesmo SOAP RecepcaoEvento4; muda apenas a URL e o payload (XSDs novos).
+ case ServicoNFe.RecepcaoEventoCancelamentoDeEvento:
+ case ServicoNFe.RecepcaoEventoImportacaoEmAlcZfmNaoConvertidaEmIsencao:
+ case ServicoNFe.RecepcaoEventoPerecimentoPerdaRouboOuFurtoDuranteOTransporteContratadoPeloFornecedor:
+ case ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoComPagamentoAntecipado:
+ case ServicoNFe.RecepcaoEventoAtualizacaoDataPrevisaoDeEntrega:
+ case ServicoNFe.RecepcaoEventoDestinacaoDeItemParaConsumoPessoal:
+ case ServicoNFe.RecepcaoEventoInformacaoDeEfetivoPagamentoIntegralParaLiberarCreditoPresumidoDoAdquirente:
+ return new RecepcaoEvento4(url, _certificado, _cFgServico.TimeOut);
+
case ServicoNFe.NfeConsultaCadastro:
return new CadConsultaCadastro4(url, _certificado, _cFgServico.TimeOut, proxyAddress);
@@ -707,6 +718,16 @@ public async Task RecepcaoEventoAsync(long idlote, List RecepcaoEventoEpecAsync(long idlote, int sequ
var detevento = new detEvento
{
versao = versaoServico,
+ // descEvento explicito — antes era setado por side-effect do setter de
+ // cOrgaoAutor; setter agora e auto-property para nao sobrescrever
+ // descEvento dos eventos NT 2025.002-RTC.
+ descEvento = NFeTipoEvento.TeNfceEpec.Descricao(),
cOrgaoAutor = nfe.infNFe.ide.cUF,
tpAutor = TipoAutor.taEmpresaEmitente,
verAplic = veraplic,
@@ -1940,9 +1965,18 @@ public async Task RecepcaoEventoCancelamentoDeEvento(int
var versaoServicoRecepcao = _cFgServico.VersaoRecepcaoEventosDeApuracaoDoIbsECbs;
var versaoServicoRecepcaoString = servicoNfe.VersaoServicoParaString(versaoServicoRecepcao);
- var detalheEvento = ObterDetalhesEvento(versaoServicoRecepcaoString, versaoAplicativo, nfeTipoEvento, ufAutor, tipoAutor);
- detalheEvento.tpEventoAut = tpEventoAut;
- detalheEvento.nProt = nProtEvento;
+ // XSD e110001_v1.00 declara apenas: descEvento, cOrgaoAutor, verAplic, tpEventoAut, nProtEvento.
+ // ObterDetalhesEvento injeta tpAutor (nao declarado neste XSD) e quebra schema.
+ // Alinhado com upstream ZeusAutomacao/DFe.NET master.
+ var detalheEvento = new detEvento
+ {
+ versao = versaoServicoRecepcaoString,
+ descEvento = nfeTipoEvento.Descricao(),
+ cOrgaoAutor = ufAutor ?? _cFgServico.cUF,
+ verAplic = versaoAplicativo ?? "1.0",
+ tpEventoAut = tpEventoAut,
+ nProtEvento = nProtEvento
+ };
var informacoesEventoEnv = ObterInformacoesEventoEnv(sequenciaEvento, chaveNFe, cpfCnpj, versaoServicoRecepcaoString, cOrgao: Estado.SVRS, dataHoraEvento, nfeTipoEvento, detalheEvento);
var evento = ObterEvento(versaoServicoRecepcaoString, informacoesEventoEnv);
diff --git a/NFe.Utils/Validacao/Validador.cs b/NFe.Utils/Validacao/Validador.cs
index 80e25ef92..a00fbbeb2 100644
--- a/NFe.Utils/Validacao/Validador.cs
+++ b/NFe.Utils/Validacao/Validador.cs
@@ -129,40 +129,47 @@ internal static string ObterArquivoSchema(ServicoNFe servicoNFe, VersaoServico v
return "distDFeInt_v1.01.xsd"; // "distDFeInt_v1.00.xsd";
case ServicoNFe.ConsultaGtin:
return "consGTIN_v1.00.xsd";
+ // NT 2025.002-RTC — eventos de apuração IBS/CBS. Pattern do upstream
+ // (ZeusAutomacao/DFe.NET master): quando chamado pelo `RecepcaoEventoAsync`
+ // (loteNfe=true, default) valida o envelope genérico envEvento_v1.00.xsd;
+ // quando explicitamente chamado com loteNfe=false, valida o detEvento
+ // interno contra o schema específico de cada tipo. Sem isso a validação
+ // local lança "envEvento element is not declared" porque o schema interno
+ // não define o root.
case ServicoNFe.RecepcaoEventoInformacaoDeEfetivoPagamentoIntegralParaLiberarCreditoPresumidoDoAdquirente:
- return "e112110_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e112110_v1.00.xsd";
case ServicoNFe.RecepcaoEventoSolicitacaoDeApropriacaoDeCreditoPresumido:
- return "e211110_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e211110_v1.00.xsd";
case ServicoNFe.RecepcaoEventoDestinacaoDeItemParaConsumoPessoal:
- return "e211120_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e211120_v1.00.xsd";
case ServicoNFe.RecepcaoEventoAceiteDeDebitoNaApuracaoPorEmissaoDeNotaDeCredito:
- return "e211128_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e211128_v1.00.xsd";
case ServicoNFe.RecepcaoEventoImobilizacaoDeItem:
- return "e211130_v1.00.xsd ";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e211130_v1.00.xsd";
case ServicoNFe.RecepcaoEventoSolicitacaoDeApropriacaoDeCreditoDeCombustivel:
- return "e211140_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e211140_v1.00.xsd";
case ServicoNFe.RecepcaoEventoSolicitacaoDeApropriacaoDeCreditoParaBensEServicosQueDependemDeAtividadeDoAdquirente:
- return "e211150_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e211150_v1.00.xsd";
case ServicoNFe.RecepcaoEventoManifestacaoSobrePedidoDeTransferenciaDeCreditoDeIbsEmOperacoesDeSucessao:
- return "e212110.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e212110_v1.00.xsd";
case ServicoNFe.RecepcaoEventoManifestacaoSobrePedidoDeTransferenciaDeCreditoDeCbsEmOperacoesDeSucessao:
- return "e212120_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e212120_v1.00.xsd";
case ServicoNFe.RecepcaoEventoManifestacaoDoFiscoSobrePedidoDeTransferenciaDeCreditoDeIbsEmOperacoesDeSucessao:
- return "e412120_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e412120_v1.00.xsd";
case ServicoNFe.RecepcaoEventoManifestacaoDoFiscoSobrePedidoDeTransferenciaDeCreditoDeCbsEmOperacoesDeSucessao:
- return "e412130_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e412130_v1.00.xsd";
case ServicoNFe.RecepcaoEventoCancelamentoDeEvento:
- return "e110001_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e110001_v1.00.xsd";
case ServicoNFe.RecepcaoEventoImportacaoEmAlcZfmNaoConvertidaEmIsencao:
- return "e112120_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e112120_v1.00.xsd";
case ServicoNFe.RecepcaoEventoPerecimentoPerdaRouboOuFurtoDuranteOTransporteContratadoPeloAdquirente:
- return "e211124_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e211124_v1.00.xsd";
case ServicoNFe.RecepcaoEventoPerecimentoPerdaRouboOuFurtoDuranteOTransporteContratadoPeloFornecedor:
- return "e112130_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e112130_v1.00.xsd";
case ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoComPagamentoAntecipado:
- return "e112140_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e112140_v1.00.xsd";
case ServicoNFe.RecepcaoEventoAtualizacaoDataPrevisaoDeEntrega:
- return "e112150_v1.00.xsd";
+ return loteNfe ? "envEvento_v1.00.xsd" : "e112150_v1.00.xsd";
}
return null;
}