From d7c88336003a7545afc95302e3683f6c2ac9e2e3 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Wed, 19 Aug 2026 11:10:54 -0300 Subject: [PATCH 1/6] =?UTF-8?q?permitindo=20cnpj=20alfanum=C3=A9rico=20no?= =?UTF-8?q?=20resEvento=20da=20consulta=20de=20distribui=C3=A7=C3=A3o=20de?= =?UTF-8?q?=20DFe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs b/NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs index 02503adad..711680958 100644 --- a/NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs +++ b/NFe.Classes/Servicos/DistribuicaoDFe/Schemas/resEvento.cs @@ -24,9 +24,9 @@ public class resEvento public string cOrgao { get; set; } /// - /// D04 - CNPJ do Emitente + /// D04 - CNPJ do Emitente (Alfanumérico apartir da NT2014.002_v1.40 - WsNFeDistribuicaoDFe - julho de 2026) /// - public ulong CNPJ { get; set; } + public string CNPJ { get; set; } /// /// D05 - CPF do Emitente From de82df75d24b9574d7f0af3b9956fcf076c9e373 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Tue, 1 Sep 2026 12:12:56 -0300 Subject: [PATCH 2/6] =?UTF-8?q?Adicionando=20novos=20eventos=20da=20reform?= =?UTF-8?q?a=20tribut=C3=A1rio=20a=20classe=20ServicosNFe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Classes/Servicos/Evento/detEvento.cs | 177 ++- NFe.Classes/Servicos/Evento/detEventoTipos.cs | 96 +- NFe.Classes/Servicos/Evento/gConsumo.cs | 45 + NFe.Classes/Servicos/Evento/gConsumoComb.cs | 45 + .../Servicos/Evento/gControleEstoque.cs | 25 +- .../Evento/gControleEstoqueConsumo.cs | 28 + .../Evento/gControleEstoqueConsumoComb.cs | 28 + .../Evento/gControleEstoqueImobilizacao.cs | 28 + .../gControleEstoqueItemNaoFornecido.cs | 28 + NFe.Classes/Servicos/Evento/gCredPresOper.cs | 46 + .../Servicos/Evento/gCredPresTributo.cs | 34 + NFe.Classes/Servicos/Evento/gCredito.cs | 39 + NFe.Classes/Servicos/Evento/gImobilizacao.cs | 45 + .../Servicos/Evento/gItemNaoFornecido.cs | 45 + NFe.Classes/Servicos/Evento/gPerecimento.cs | 6 +- .../Servicos/Tipos/NFeServicosTipos.cs | 184 ++- NFe.Servicos/ServicoNfeFactory.cs | 16 + NFe.Servicos/ServicosNFe.cs | 1056 ++++++++++++++++- NFe.Utils/ConfiguracaoServico.cs | 19 +- NFe.Utils/Enderecos/Enderecador.cs | 40 +- NFe.Utils/Validacao/Validador.cs | 59 +- 21 files changed, 2068 insertions(+), 21 deletions(-) create mode 100644 NFe.Classes/Servicos/Evento/gConsumo.cs create mode 100644 NFe.Classes/Servicos/Evento/gConsumoComb.cs create mode 100644 NFe.Classes/Servicos/Evento/gControleEstoqueConsumo.cs create mode 100644 NFe.Classes/Servicos/Evento/gControleEstoqueConsumoComb.cs create mode 100644 NFe.Classes/Servicos/Evento/gControleEstoqueImobilizacao.cs create mode 100644 NFe.Classes/Servicos/Evento/gControleEstoqueItemNaoFornecido.cs create mode 100644 NFe.Classes/Servicos/Evento/gCredPresOper.cs create mode 100644 NFe.Classes/Servicos/Evento/gCredPresTributo.cs create mode 100644 NFe.Classes/Servicos/Evento/gCredito.cs create mode 100644 NFe.Classes/Servicos/Evento/gImobilizacao.cs create mode 100644 NFe.Classes/Servicos/Evento/gItemNaoFornecido.cs diff --git a/NFe.Classes/Servicos/Evento/detEvento.cs b/NFe.Classes/Servicos/Evento/detEvento.cs index e5902f390..6dfceb368 100644 --- a/NFe.Classes/Servicos/Evento/detEvento.cs +++ b/NFe.Classes/Servicos/Evento/detEvento.cs @@ -1,9 +1,10 @@ -using System; +using System; using System.Collections.Generic; using System.Xml.Serialization; using DFe.Classes.Entidades; using DFe.Utils; using NFe.Classes.Informacoes.Identificacao.Tipos; +using NFe.Classes.Servicos.Tipos; using Shared.NFe.Classes.Servicos.Evento; namespace NFe.Classes.Servicos.Evento @@ -137,6 +138,21 @@ public bool ShouldSerializeItensAverbados() } #endregion + #region Cancelamento de Evento + + /// + /// P23 - Código do evento autorizado a ser cancelado. Por este evento poderão ser cancelados todos os + /// Eventos previstos na NT 2025.002, exceto o próprio Evento de Cancelamento (110001). + /// + public NFeTipoEvento? tpEventoAut { get; set; } + + public bool ShouldSerializetpEventoAut() + { + return tpEventoAut.HasValue; + } + + #endregion + #region Cancelamento Insucesso/Comprovante de Entrega NFe /// @@ -297,10 +313,10 @@ public bool ShouldSerializedetPag() #endregion - #region Perecimento, perda, roubo ou furto durante o transporte + #region Perecimento, perda, roubo ou furto durante o transporte (112130 e 211124) /// - /// Informações por item da Nota de Fornecimento para o evento 112130. + /// Informações por item da Nota de Fornecimento (evento 112130) ou da Nota de Aquisição (evento 211124). /// [XmlElement("gPerecimento")] public List gPerecimento { get; set; } @@ -312,5 +328,158 @@ public bool ShouldSerializegPerecimento() } #endregion + + #region Informação de efetivo pagamento integral para liberar crédito presumido do adquirente (112110) + + /// + /// P23 - Indicador de efetiva quitação do pagamento integral da operação referente à NF-e referenciada. + /// + public IndicadorQuitacao? indQuitacao { get; set; } + + public bool ShouldSerializeindQuitacao() + { + return indQuitacao.HasValue; + } + + #endregion + + #region Importação em ALC/ZFM não convertida em isenção (112120) + + /// + /// P23 - Informações por item da NF-e de importação. + /// + [XmlElement("gConsumo")] + public List gConsumo { get; set; } + + public bool ShouldSerializegConsumo() + { + return gConsumo != null && + gConsumo.Count > 0; + } + + #endregion + + #region Fornecimento não realizado com pagamento antecipado (112140) + + /// + /// P23 - Informações por item da Nota de Pagamento antecipado. + /// + [XmlElement("gItemNaoFornecido")] + public List gItemNaoFornecido { get; set; } + + public bool ShouldSerializegItemNaoFornecido() + { + return gItemNaoFornecido != null && + gItemNaoFornecido.Count > 0; + } + + #endregion + + #region Solicitação de Apropriação de crédito presumido (211110) + + /// + /// P23 - Informações de crédito presumido por item. + /// + [XmlElement("gCredPresOper")] + public List gCredPresOper { get; set; } + + public bool ShouldSerializegCredPresOper() + { + return gCredPresOper != null && + gCredPresOper.Count > 0; + } + + #endregion + + #region Aceite de débito na apuração / Manifestação sobre transferência de crédito (211128, 212110 e 212120) + + /// + /// P23 - Indicador de concordância/aceitação. + /// + public IndicadorAceitacao? indAceitacao { get; set; } + + public bool ShouldSerializeindAceitacao() + { + return indAceitacao.HasValue; + } + + #endregion + + #region Imobilização de Item (211130) + + /// + /// P23 - Informações de itens integrados ao ativo imobilizado. + /// + [XmlElement("gImobilizacao")] + public List gImobilizacao { get; set; } + + public bool ShouldSerializegImobilizacao() + { + return gImobilizacao != null && + gImobilizacao.Count > 0; + } + + #endregion + + #region Solicitação de Apropriação de Crédito de Combustível (211140) + + /// + /// P23 - Informações de consumo de combustíveis. + /// + [XmlElement("gConsumoComb")] + public List gConsumoComb { get; set; } + + public bool ShouldSerializegConsumoComb() + { + return gConsumoComb != null && + gConsumoComb.Count > 0; + } + + #endregion + + #region Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente (211150) + + /// + /// P23 - Informações de crédito. + /// + [XmlElement("gCredito")] + public List gCredito { get; set; } + + public bool ShouldSerializegCredito() + { + return gCredito != null && + gCredito.Count > 0; + } + + #endregion + + #region Manifestação do Fisco sobre Pedido de Transferência de Crédito (412120 e 412130) + + /// + /// P23 - Indicador de deferimento do valor de transferência para a empresa que emitiu a nota referenciada. + /// + public IndicadorDeferimento? indDeferimento { get; set; } + + /// + /// P24 - Motivo da manifestação do fisco. + /// + public MotivoDeferimento? cMotivo { get; set; } + + /// + /// P25 - Descrição do motivo da manifestação do fisco. + /// + public string xMotivo { get; set; } + + public bool ShouldSerializeindDeferimento() + { + return indDeferimento.HasValue; + } + + public bool ShouldSerializecMotivo() + { + return cMotivo.HasValue; + } + + #endregion } -} \ No newline at end of file +} diff --git a/NFe.Classes/Servicos/Evento/detEventoTipos.cs b/NFe.Classes/Servicos/Evento/detEventoTipos.cs index 01f952652..45e793f6a 100644 --- a/NFe.Classes/Servicos/Evento/detEventoTipos.cs +++ b/NFe.Classes/Servicos/Evento/detEventoTipos.cs @@ -1,4 +1,4 @@ -using System.ComponentModel; +using System.ComponentModel; using System.Xml.Serialization; namespace NFe.Classes.Servicos.Evento @@ -11,6 +11,7 @@ namespace NFe.Classes.Servicos.Evento /// 3 - Empresa; /// 5 - Fisco; /// 6 - RFB; + /// 8 - Empresa Sucessora; /// 9 - Outros Órgãos. /// public enum TipoAutor @@ -50,6 +51,13 @@ public enum TipoAutor [XmlEnum("6")] taRFB = 6, + /// + /// 8 - Empresa Sucessora + /// + [Description("Empresa Sucessora")] + [XmlEnum("8")] + taEmpresaSucessora = 8, + /// /// 9 - Outros Órgãos /// @@ -96,4 +104,88 @@ public enum MotivoInsucesso [XmlEnum("4")] Outros = 4 } -} \ No newline at end of file + + /// + /// Indicador de efetiva quitação do pagamento integral da operação referente à NF-e referenciada. + /// Nota: + /// 1 - Quitado; + /// + public enum IndicadorQuitacao + { + /// + /// 1 - Quitado + /// + [Description("Quitado")] + [XmlEnum("1")] + Quitado = 1 + } + + /// + /// Indicador de aceitação. + /// Nota: + /// 0 - Não Aceite; + /// 1 - Aceite; + /// + public enum IndicadorAceitacao + { + /// + /// 0 - Não Aceite + /// + [Description("Não Aceite")] + [XmlEnum("0")] + NaoAceite = 0, + + /// + /// 1 - Aceite + /// + [Description("Aceite")] + [XmlEnum("1")] + Aceite = 1 + } + + /// + /// Indicador de deferimento do fisco sobre o pedido de transferência de crédito. + /// Nota: + /// 0 - Não Aceite; + /// 1 - Aceite; + /// + public enum IndicadorDeferimento + { + /// + /// 0 - Não Aceite + /// + [Description("Não Aceite")] + [XmlEnum("0")] + NaoAceite = 0, + + /// + /// 1 - Aceite + /// + [Description("Aceite")] + [XmlEnum("1")] + Aceite = 1 + } + + /// + /// Motivo da manifestação do fisco sobre o pedido de transferência de crédito. + /// Nota: + /// 1 - Falta de manifestação de todas as sucessoras; + /// 2 - Outros; + /// + public enum MotivoDeferimento + { + /// + /// 1 - Falta de manifestação de todas as sucessoras + /// + [Description("Falta de manifestação de todas as sucessoras")] + [XmlEnum("1")] + FaltaManifestacaoSucessoras = 1, + + /// + /// 2 - Outros + /// + [Description("Outros")] + [XmlEnum("2")] + Outros = 2 + } +} diff --git a/NFe.Classes/Servicos/Evento/gConsumo.cs b/NFe.Classes/Servicos/Evento/gConsumo.cs new file mode 100644 index 000000000..1eea5d4aa --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gConsumo.cs @@ -0,0 +1,45 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações por item da NF-e de importação para o evento 112120. + /// + public class gConsumo + { + private decimal _vIBS; + private decimal _vCBS; + + /// + /// P24 - Corresponde ao atributo nItem do elemento det da NF-e de importação. + /// + [XmlAttribute("nItem")] + public int nItem { get; set; } + + /// + /// P25 - Valor do IBS correspondente à quantidade que não atendeu aos requisitos para a conversão em isenção. + /// + [XmlElement("vIBS")] + public decimal vIBS + { + get { return _vIBS.Arredondar(2); } + set { _vIBS = value.Arredondar(2); } + } + + /// + /// P26 - Valor da CBS correspondente à quantidade que não atendeu aos requisitos para a conversão em isenção. + /// + [XmlElement("vCBS")] + public decimal vCBS + { + get { return _vCBS.Arredondar(2); } + set { _vCBS = value.Arredondar(2); } + } + + /// + /// P27 - Informações de quantidade de estoque influenciadas pelo evento. + /// + [XmlElement("gControleEstoque")] + public gControleEstoqueConsumo gControleEstoque { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gConsumoComb.cs b/NFe.Classes/Servicos/Evento/gConsumoComb.cs new file mode 100644 index 000000000..5c01d7a2f --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gConsumoComb.cs @@ -0,0 +1,45 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de consumo de combustíveis para o evento 211140. + /// + public class gConsumoComb + { + private decimal _vIBS; + private decimal _vCBS; + + /// + /// P24 - Corresponde ao atributo nItem do elemento det do documento referenciado. + /// + [XmlAttribute("nItem")] + public int nItem { get; set; } + + /// + /// P25 - Valor do IBS relativo ao consumo de combustível na nota de aquisição. + /// + [XmlElement("vIBS")] + public decimal vIBS + { + get { return _vIBS.Arredondar(2); } + set { _vIBS = value.Arredondar(2); } + } + + /// + /// P26 - Valor da CBS relativo ao consumo de combustível na nota de aquisição. + /// + [XmlElement("vCBS")] + public decimal vCBS + { + get { return _vCBS.Arredondar(2); } + set { _vCBS = value.Arredondar(2); } + } + + /// + /// P27 - Informações de quantidade por item. + /// + [XmlElement("gControleEstoque")] + public gControleEstoqueConsumoComb gControleEstoque { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gControleEstoque.cs b/NFe.Classes/Servicos/Evento/gControleEstoque.cs index d9b436fb4..b4ae068b2 100644 --- a/NFe.Classes/Servicos/Evento/gControleEstoque.cs +++ b/NFe.Classes/Servicos/Evento/gControleEstoque.cs @@ -3,13 +3,14 @@ namespace NFe.Classes.Servicos.Evento { /// - /// Informações de quantidade de estoque influenciadas pelo evento 112130. + /// Informações de quantidade de estoque influenciadas pelos eventos 112130 e 211124. /// public class gControleEstoque { private decimal _qPerecimento; - private decimal _vIBS; - private decimal _vCBS; + private decimal? _vIBS; + private decimal? _vCBS; + /// /// Quantidade objeto de roubo, perda, furto ou perecimento. /// @@ -28,22 +29,34 @@ public decimal qPerecimento /// /// Valor do crédito IBS referente às aquisições a ser estornado. + /// Obrigatório no evento 112130 e não informado no evento 211124. /// [XmlElement("vIBS")] public decimal vIBS { - get { return _vIBS.Arredondar(2); } + get { return _vIBS.GetValueOrDefault(); } set { _vIBS = value.Arredondar(2); } } /// /// Valor do crédito CBS referente às aquisições a ser estornado. + /// Obrigatório no evento 112130 e não informado no evento 211124. /// [XmlElement("vCBS")] public decimal vCBS { - get { return _vCBS.Arredondar(2); } + get { return _vCBS.GetValueOrDefault(); } set { _vCBS = value.Arredondar(2); } } + + public bool ShouldSerializevIBS() + { + return _vIBS.HasValue; + } + + public bool ShouldSerializevCBS() + { + return _vCBS.HasValue; + } } -} \ No newline at end of file +} diff --git a/NFe.Classes/Servicos/Evento/gControleEstoqueConsumo.cs b/NFe.Classes/Servicos/Evento/gControleEstoqueConsumo.cs new file mode 100644 index 000000000..02dbdca8c --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gControleEstoqueConsumo.cs @@ -0,0 +1,28 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de quantidade de estoque influenciadas pelo evento 112120. + /// + public class gControleEstoqueConsumo + { + private decimal _qtde; + + /// + /// P28 - Informar a quantidade que não atendeu os requisitos para a conversão em isenção. + /// + [XmlElement("qtde")] + public decimal qtde + { + get { return _qtde.Arredondar(4); } + set { _qtde = value.Arredondar(4); } + } + + /// + /// P29 - Informar a unidade relativa ao campo gConsumo. + /// + [XmlElement("unidade")] + public string unidade { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gControleEstoqueConsumoComb.cs b/NFe.Classes/Servicos/Evento/gControleEstoqueConsumoComb.cs new file mode 100644 index 000000000..8e38cac2f --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gControleEstoqueConsumoComb.cs @@ -0,0 +1,28 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de quantidade por item influenciadas pelo evento 211140. + /// + public class gControleEstoqueConsumoComb + { + private decimal _qComb; + + /// + /// P28 - Informar a quantidade de consumo do item. + /// + [XmlElement("qComb")] + public decimal qComb + { + get { return _qComb.Arredondar(4); } + set { _qComb = value.Arredondar(4); } + } + + /// + /// P29 - Informar a unidade relativa ao campo qComb. + /// + [XmlElement("uComb")] + public string uComb { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gControleEstoqueImobilizacao.cs b/NFe.Classes/Servicos/Evento/gControleEstoqueImobilizacao.cs new file mode 100644 index 000000000..d34b903e8 --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gControleEstoqueImobilizacao.cs @@ -0,0 +1,28 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de quantidade de estoque influenciadas pelo evento 211130. + /// + public class gControleEstoqueImobilizacao + { + private decimal _qImobilizado; + + /// + /// P28 - Informar a quantidade do item a ser imobilizado. + /// + [XmlElement("qImobilizado")] + public decimal qImobilizado + { + get { return _qImobilizado.Arredondar(4); } + set { _qImobilizado = value.Arredondar(4); } + } + + /// + /// P29 - Informar a unidade relativa ao campo qImobilizado. + /// + [XmlElement("uImobilizado")] + public string uImobilizado { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gControleEstoqueItemNaoFornecido.cs b/NFe.Classes/Servicos/Evento/gControleEstoqueItemNaoFornecido.cs new file mode 100644 index 000000000..79e15fae0 --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gControleEstoqueItemNaoFornecido.cs @@ -0,0 +1,28 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de quantidade de estoque influenciadas pelo evento 112140. + /// + public class gControleEstoqueItemNaoFornecido + { + private decimal _qNaoFornecida; + + /// + /// P28 - Informar a quantidade que não foi fornecida e teve o imposto antecipado. + /// + [XmlElement("qNaoFornecida")] + public decimal qNaoFornecida + { + get { return _qNaoFornecida.Arredondar(4); } + set { _qNaoFornecida = value.Arredondar(4); } + } + + /// + /// P29 - Informar a unidade relativa ao campo qNaoFornecida. + /// + [XmlElement("uNaoFornecida")] + public string uNaoFornecida { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gCredPresOper.cs b/NFe.Classes/Servicos/Evento/gCredPresOper.cs new file mode 100644 index 000000000..59048c865 --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gCredPresOper.cs @@ -0,0 +1,46 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de crédito presumido por item para o evento 211110. + /// + public class gCredPresOper + { + private decimal _vBCCredPres; + + /// + /// P24 - Corresponde ao atributo nItem do elemento det do documento referenciado. + /// + [XmlAttribute("nItem")] + public int nItem { get; set; } + + /// + /// P25 - Valor da base de cálculo do item. + /// + [XmlElement("vBCCredPres")] + public decimal vBCCredPres + { + get { return _vBCCredPres.Arredondar(2); } + set { _vBCCredPres = value.Arredondar(2); } + } + + /// + /// P25a - Código de Classificação do Crédito presumido, conforme tabela cCredPres (Anexo IV). + /// + [XmlElement("cCredPres")] + public string cCredPres { get; set; } + + /// + /// P26 - Grupo de Informações do Crédito Presumido do IBS. + /// + [XmlElement("gIBSCredPres")] + public gCredPresTributo gIBSCredPres { get; set; } + + /// + /// P30 - Grupo de Informações do Crédito Presumido da CBS. + /// + [XmlElement("gCBSCredPres")] + public gCredPresTributo gCBSCredPres { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gCredPresTributo.cs b/NFe.Classes/Servicos/Evento/gCredPresTributo.cs new file mode 100644 index 000000000..6f13f9b21 --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gCredPresTributo.cs @@ -0,0 +1,34 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Grupo de informações do crédito presumido do IBS (gIBSCredPres) ou da CBS (gCBSCredPres) + /// para o evento 211110. + /// + public class gCredPresTributo + { + private decimal _pCredPres; + private decimal _vCredPres; + + /// + /// Percentual do Crédito Presumido. + /// + [XmlElement("pCredPres")] + public decimal pCredPres + { + get { return _pCredPres.Arredondar(4); } + set { _pCredPres = value.Arredondar(4); } + } + + /// + /// Valor do Crédito Presumido. + /// + [XmlElement("vCredPres")] + public decimal vCredPres + { + get { return _vCredPres.Arredondar(2); } + set { _vCredPres = value.Arredondar(2); } + } + } +} diff --git a/NFe.Classes/Servicos/Evento/gCredito.cs b/NFe.Classes/Servicos/Evento/gCredito.cs new file mode 100644 index 000000000..bb52258b7 --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gCredito.cs @@ -0,0 +1,39 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de crédito por item para o evento 211150. + /// + public class gCredito + { + private decimal _vCredIBS; + private decimal _vCredCBS; + + /// + /// P24 - Corresponde ao atributo nItem do elemento det do documento referenciado. + /// + [XmlAttribute("nItem")] + public int nItem { get; set; } + + /// + /// P25 - Valor da solicitação de crédito a ser apropriado de IBS. + /// + [XmlElement("vCredIBS")] + public decimal vCredIBS + { + get { return _vCredIBS.Arredondar(2); } + set { _vCredIBS = value.Arredondar(2); } + } + + /// + /// P26 - Valor da solicitação de crédito a ser apropriado de CBS. + /// + [XmlElement("vCredCBS")] + public decimal vCredCBS + { + get { return _vCredCBS.Arredondar(2); } + set { _vCredCBS = value.Arredondar(2); } + } + } +} diff --git a/NFe.Classes/Servicos/Evento/gImobilizacao.cs b/NFe.Classes/Servicos/Evento/gImobilizacao.cs new file mode 100644 index 000000000..c2d88c21a --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gImobilizacao.cs @@ -0,0 +1,45 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de itens integrados ao ativo imobilizado para o evento 211130. + /// + public class gImobilizacao + { + private decimal _vIBS; + private decimal _vCBS; + + /// + /// P24 - Corresponde ao atributo nItem do elemento det do documento referenciado. + /// + [XmlAttribute("nItem")] + public int nItem { get; set; } + + /// + /// P25 - Valor do IBS relativo à imobilização. + /// + [XmlElement("vIBS")] + public decimal vIBS + { + get { return _vIBS.Arredondar(2); } + set { _vIBS = value.Arredondar(2); } + } + + /// + /// P26 - Valor da CBS relativo à imobilização. + /// + [XmlElement("vCBS")] + public decimal vCBS + { + get { return _vCBS.Arredondar(2); } + set { _vCBS = value.Arredondar(2); } + } + + /// + /// P27 - Informações de quantidade de estoque influenciadas pelo evento. + /// + [XmlElement("gControleEstoque")] + public gControleEstoqueImobilizacao gControleEstoque { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gItemNaoFornecido.cs b/NFe.Classes/Servicos/Evento/gItemNaoFornecido.cs new file mode 100644 index 000000000..8e74b6cac --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gItemNaoFornecido.cs @@ -0,0 +1,45 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações por item da Nota de Pagamento antecipado para o evento 112140. + /// + public class gItemNaoFornecido + { + private decimal _vIBS; + private decimal _vCBS; + + /// + /// P24 - Corresponde ao atributo nItem do elemento det do documento referenciado. + /// + [XmlAttribute("nItem")] + public int nItem { get; set; } + + /// + /// P25 - Valor do IBS na nota de débito de pagamento antecipado correspondente à quantidade que não foi fornecida. + /// + [XmlElement("vIBS")] + public decimal vIBS + { + get { return _vIBS.Arredondar(2); } + set { _vIBS = value.Arredondar(2); } + } + + /// + /// P26 - Valor da CBS na nota de débito de pagamento antecipado correspondente à quantidade que não foi fornecida. + /// + [XmlElement("vCBS")] + public decimal vCBS + { + get { return _vCBS.Arredondar(2); } + set { _vCBS = value.Arredondar(2); } + } + + /// + /// P27 - Informações de quantidade de estoque influenciadas pelo evento. + /// + [XmlElement("gControleEstoque")] + public gControleEstoqueItemNaoFornecido gControleEstoque { get; set; } + } +} diff --git a/NFe.Classes/Servicos/Evento/gPerecimento.cs b/NFe.Classes/Servicos/Evento/gPerecimento.cs index 13d4975f4..23e2d3d08 100644 --- a/NFe.Classes/Servicos/Evento/gPerecimento.cs +++ b/NFe.Classes/Servicos/Evento/gPerecimento.cs @@ -3,7 +3,7 @@ namespace NFe.Classes.Servicos.Evento { /// - /// Informações por item da Nota de Fornecimento para o evento 112130. + /// Informações por item da Nota de Fornecimento (evento 112130) ou da Nota de Aquisição (evento 211124). /// public class gPerecimento { @@ -16,7 +16,7 @@ public class gPerecimento public int nItem { get; set; } /// - /// Valor do IBS na Nota de Fornecimento correspondente à quantidade objeto de roubo, perda, furto ou perecimento. + /// Valor do IBS na Nota de Fornecimento/Aquisição correspondente à quantidade objeto de roubo, perda, furto ou perecimento. /// [XmlElement("vIBS")] public decimal vIBS @@ -26,7 +26,7 @@ public decimal vIBS } /// - /// Valor da CBS na Nota de Fornecimento correspondente à quantidade objeto de roubo, perda, furto ou perecimento. + /// Valor da CBS na Nota de Fornecimento/Aquisição correspondente à quantidade objeto de roubo, perda, furto ou perecimento. /// [XmlElement("vCBS")] public decimal vCBS diff --git a/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs b/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs index 1b5498eec..9f82cd771 100644 --- a/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs +++ b/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.ComponentModel; using System.Xml.Serialization; @@ -56,6 +56,76 @@ public enum ServicoNFe /// RecepcaoEventoPerecimentoTransporteNFe, + /// + /// serviço destinado à recepção de mensagem do Evento de Cancelamento de Evento (NT 2025.002 - Reforma Tributária) + /// + RecepcaoEventoCancelamentoEventoNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Informação de efetivo pagamento integral para liberar crédito presumido do adquirente + /// + RecepcaoEventoPagamentoIntegralNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Importação em ALC/ZFM não convertida em isenção + /// + RecepcaoEventoImportacaoAlcZfmNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Fornecimento não realizado com pagamento antecipado + /// + RecepcaoEventoFornecimentoNaoRealizadoNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de crédito presumido + /// + RecepcaoEventoApropriacaoCredPresumidoNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Perecimento, Perda, Roubo ou Furto durante o Transporte contratado pelo adquirente + /// + RecepcaoEventoPerecimentoTransporteAdquirenteNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Aceite de débito na apuração por emissão de nota de crédito + /// + RecepcaoEventoAceiteDebitoNotaCreditoNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Imobilização de Item + /// + RecepcaoEventoImobilizacaoItemNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de Crédito de Combustível + /// + RecepcaoEventoApropriacaoCreditoCombustivelNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente + /// + RecepcaoEventoApropriacaoCreditoBensServicosNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// + RecepcaoEventoManifestacaoTransfCredIBSNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Manifestação sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// + RecepcaoEventoManifestacaoTransfCredCBSNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// + RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe, + + /// + /// serviço destinado à recepção de mensagem do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// + RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe, + /// /// serviço destinado à recepção de mensagem do Evento de Manifestação do destinatário da NF-e /// @@ -161,6 +231,20 @@ public enum IndicadorSincronizacao /// 110750 - Conciliação Financeira da NF-e /// 110751 - Cancelamento Conciliação Financeira da NF-e /// 112130 - Perecimento, perda, roubo ou furto durante o transporte contratado pelo fornecedor (Extravio de Transporte) + /// 110001 - Cancelamento de Evento + /// 112110 - Informação de efetivo pagamento integral para liberar crédito presumido do adquirente + /// 112120 - Importação em ALC/ZFM não convertida em isenção + /// 112140 - Fornecimento não realizado com pagamento antecipado + /// 211110 - Solicitação de Apropriação de crédito presumido + /// 211124 - Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente + /// 211128 - Aceite de débito na apuração por emissão de nota de crédito + /// 211130 - Imobilização de Item + /// 211140 - Solicitação de Apropriação de Crédito de Combustível + /// 211150 - Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente + /// 212110 - Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// 212120 - Manifestação sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// 412120 - Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// 412130 - Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão /// 210200 – Confirmação da Operação /// 210210 – Ciência da Emissão /// 210220 – Desconhecimento da Operação @@ -245,6 +329,104 @@ public enum NFeTipoEvento [XmlEnum("112130")] TeNfePerecimentoTransporteNFe = 112130, + /// + /// 110001 - Cancelamento de Evento + /// + [Description("Cancelamento de Evento")] + [XmlEnum("110001")] + TeNfeCancelamentoEvento = 110001, + + /// + /// 112110 - Informação de efetivo pagamento integral para liberar crédito presumido do adquirente + /// + [Description("Informação de efetivo pagamento integral para liberar crédito presumido do adquirente")] + [XmlEnum("112110")] + TeNfePagamentoIntegralNFe = 112110, + + /// + /// 112120 - Importação em ALC/ZFM não convertida em isenção + /// + [Description("Importação em ALC/ZFM não convertida em isenção")] + [XmlEnum("112120")] + TeNfeImportacaoAlcZfmNFe = 112120, + + /// + /// 112140 - Fornecimento não realizado com pagamento antecipado + /// + [Description("Fornecimento não realizado com pagamento antecipado")] + [XmlEnum("112140")] + TeNfeFornecimentoNaoRealizadoNFe = 112140, + + /// + /// 211110 - Solicitação de Apropriação de crédito presumido + /// + [Description("Solicitação de Apropriação de crédito presumido")] + [XmlEnum("211110")] + TeNfeApropriacaoCredPresumidoNFe = 211110, + + /// + /// 211124 - Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente + /// + [Description("Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente")] + [XmlEnum("211124")] + TeNfePerecimentoTransporteAdquirenteNFe = 211124, + + /// + /// 211128 - Aceite de débito na apuração por emissão de nota de crédito + /// + [Description("Aceite de débito na apuração por emissão de nota de crédito")] + [XmlEnum("211128")] + TeNfeAceiteDebitoNotaCreditoNFe = 211128, + + /// + /// 211130 - Imobilização de Item + /// + [Description("Imobilização de Item")] + [XmlEnum("211130")] + TeNfeImobilizacaoItemNFe = 211130, + + /// + /// 211140 - Solicitação de Apropriação de Crédito de Combustível + /// + [Description("Solicitação de Apropriação de Crédito de Combustível")] + [XmlEnum("211140")] + TeNfeApropriacaoCreditoCombustivelNFe = 211140, + + /// + /// 211150 - Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente + /// + [Description("Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente")] + [XmlEnum("211150")] + TeNfeApropriacaoCreditoBensServicosNFe = 211150, + + /// + /// 212110 - Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// + [Description("Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão")] + [XmlEnum("212110")] + TeNfeManifestacaoTransfCredIBSNFe = 212110, + + /// + /// 212120 - Manifestação sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// + [Description("Manifestação sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão")] + [XmlEnum("212120")] + TeNfeManifestacaoTransfCredCBSNFe = 212120, + + /// + /// 412120 - Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// + [Description("Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão")] + [XmlEnum("412120")] + TeNfeManifestacaoFiscoTransfCredIBSNFe = 412120, + + /// + /// 412130 - Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// + [Description("Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão")] + [XmlEnum("412130")] + TeNfeManifestacaoFiscoTransfCredCBSNFe = 412130, + /// /// 210200 – Confirmação da Operação /// diff --git a/NFe.Servicos/ServicoNfeFactory.cs b/NFe.Servicos/ServicoNfeFactory.cs index 3baba1449..06dad4933 100644 --- a/NFe.Servicos/ServicoNfeFactory.cs +++ b/NFe.Servicos/ServicoNfeFactory.cs @@ -240,6 +240,22 @@ public static INfeServico CriaWsdlOutros(ServicoNFe servico, ConfiguracaoServico case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: return new RecepcaoEvento4SVCAN(url, certificado, cfg.TimeOut); + case ServicoNFe.RecepcaoEventoCancelamentoEventoNFe: + case ServicoNFe.RecepcaoEventoPagamentoIntegralNFe: + case ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe: + case ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe: + case ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe: + case ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe: + case ServicoNFe.RecepcaoEventoImobilizacaoItemNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe: + case ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe: + return new RecepcaoEvento4SVCAN(url, certificado, cfg.TimeOut); + case ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe: case ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe: return new RecepcaoEvento4SVCAN(url, certificado, cfg.TimeOut); diff --git a/NFe.Servicos/ServicosNFe.cs b/NFe.Servicos/ServicosNFe.cs index 6474fdf7e..00ea6685d 100644 --- a/NFe.Servicos/ServicosNFe.cs +++ b/NFe.Servicos/ServicosNFe.cs @@ -1,4 +1,4 @@ -using DFe.Classes.Entidades; +using DFe.Classes.Entidades; using DFe.Classes.Flags; using DFe.Utils; using DFe.Utils.Assinatura; @@ -377,7 +377,21 @@ private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, S ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe, ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe, ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe, - ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe + ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe, + ServicoNFe.RecepcaoEventoCancelamentoEventoNFe, + ServicoNFe.RecepcaoEventoPagamentoIntegralNFe, + ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe, + ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe, + ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe, + ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe, + ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe, + ServicoNFe.RecepcaoEventoImobilizacaoItemNFe, + ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe, + ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe, + ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe, + ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe, + ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe, + ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe }; if ( !listaEventos.Contains(servicoEvento)) @@ -1279,6 +1293,1044 @@ public RetornoRecepcaoEvento RecepcaoEventoPerecimentoTransporte(int idlote, Lis return retorno; } + /// + /// Recepção do Evento de Cancelamento de Evento + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Código do evento autorizado a ser cancelado + /// Número do Protocolo de Autorização do Evento a ser cancelado + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoCancelamentoEvento(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + NFeTipoEvento tpEventoAut, string nProtEvento, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (tpEventoAut == NFeTipoEvento.TeNfeCancelamentoEvento) + throw new ArgumentException("O próprio Evento de Cancelamento (110001) não pode ser cancelado.", nameof(tpEventoAut)); + + if (string.IsNullOrWhiteSpace(nProtEvento)) + throw new ArgumentException("Informe o protocolo do evento a ser cancelado.", nameof(nProtEvento)); + + var versaoServico = + ServicoNFe.RecepcaoEventoCancelamentoEventoNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeCancelamentoEvento.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + verAplic = versaoAplicativo ?? "1.0", + tpEventoAut = tpEventoAut, + nProtEvento = nProtEvento + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeCancelamentoEvento, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoCancelamentoEventoNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Cancelamento de Evento" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoCancelamentoEvento(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoCancelamentoEventoNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Informação de efetivo pagamento integral para liberar crédito presumido do adquirente + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoPagamentoIntegral(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + var versaoServico = + ServicoNFe.RecepcaoEventoPagamentoIntegralNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfePagamentoIntegralNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaEmitente, + verAplic = versaoAplicativo ?? "1.0", + indQuitacao = IndicadorQuitacao.Quitado + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfePagamentoIntegralNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoPagamentoIntegralNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Informação de efetivo pagamento integral para liberar crédito presumido do adquirente" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoPagamentoIntegral(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoPagamentoIntegralNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Importação em ALC/ZFM não convertida em isenção + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Informações por item da NF-e de importação + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoImportacaoAlcZfm(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + List consumos, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (consumos == null || !consumos.Any()) + throw new ArgumentException("Informe ao menos um item para o evento de Importação em ALC/ZFM não convertida em isenção.", nameof(consumos)); + + var versaoServico = + ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeImportacaoAlcZfmNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaEmitente, + verAplic = versaoAplicativo ?? "1.0", + gConsumo = consumos + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeImportacaoAlcZfmNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Importação em ALC/ZFM não convertida em isenção" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoImportacaoAlcZfm(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Fornecimento não realizado com pagamento antecipado + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Informações por item da Nota de Pagamento antecipado + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoFornecimentoNaoRealizado(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + List itensNaoFornecidos, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (itensNaoFornecidos == null || !itensNaoFornecidos.Any()) + throw new ArgumentException("Informe ao menos um item para o evento de Fornecimento não realizado com pagamento antecipado.", nameof(itensNaoFornecidos)); + + var versaoServico = + ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeFornecimentoNaoRealizadoNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaEmitente, + verAplic = versaoAplicativo ?? "1.0", + gItemNaoFornecido = itensNaoFornecidos + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeFornecimentoNaoRealizadoNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Fornecimento não realizado com pagamento antecipado" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoFornecimentoNaoRealizado(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Solicitação de Apropriação de crédito presumido + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Informações de crédito presumido por item + /// Autor do evento. Informar 1=Empresa Emitente ou 2=Empresa Destinatária + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoApropriacaoCredPresumido(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + List creditosPresumidos, TipoAutor tpAutor = TipoAutor.taEmpresaDestinataria, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (creditosPresumidos == null || !creditosPresumidos.Any()) + throw new ArgumentException("Informe ao menos um item para o evento de Solicitação de Apropriação de crédito presumido.", nameof(creditosPresumidos)); + + if (tpAutor != TipoAutor.taEmpresaEmitente && tpAutor != TipoAutor.taEmpresaDestinataria) + throw new ArgumentException("O autor deste evento deve ser 1=Empresa Emitente ou 2=Empresa Destinatária.", nameof(tpAutor)); + + var versaoServico = + ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeApropriacaoCredPresumidoNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = tpAutor, + verAplic = versaoAplicativo ?? "1.0", + gCredPresOper = creditosPresumidos + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeApropriacaoCredPresumidoNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Solicitação de Apropriação de crédito presumido" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoApropriacaoCredPresumido(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Informações por item da Nota de Aquisição. Os campos vIBS e vCBS de gControleEstoque não devem ser informados neste evento + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoPerecimentoTransporteAdquirente(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + List perecimentos, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (perecimentos == null || !perecimentos.Any()) + throw new ArgumentException("Informe ao menos um item para o evento de Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente.", nameof(perecimentos)); + + var versaoServico = + ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfePerecimentoTransporteAdquirenteNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaDestinataria, + verAplic = versaoAplicativo ?? "1.0", + gPerecimento = perecimentos + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfePerecimentoTransporteAdquirenteNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoPerecimentoTransporteAdquirente(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Aceite de débito na apuração por emissão de nota de crédito + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Indicador de concordância com o valor da nota de crédito + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoAceiteDebitoNotaCredito(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + IndicadorAceitacao indAceitacao, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + var versaoServico = + ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeAceiteDebitoNotaCreditoNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaDestinataria, + verAplic = versaoAplicativo ?? "1.0", + indAceitacao = indAceitacao + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeAceiteDebitoNotaCreditoNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Aceite de débito na apuração por emissão de nota de crédito" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoAceiteDebitoNotaCredito(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Imobilização de Item + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Informações de itens integrados ao ativo imobilizado + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoImobilizacaoItem(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + List imobilizacoes, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (imobilizacoes == null || !imobilizacoes.Any()) + throw new ArgumentException("Informe ao menos um item para o evento de Imobilização de Item.", nameof(imobilizacoes)); + + var versaoServico = + ServicoNFe.RecepcaoEventoImobilizacaoItemNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeImobilizacaoItemNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaDestinataria, + verAplic = versaoAplicativo ?? "1.0", + gImobilizacao = imobilizacoes + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeImobilizacaoItemNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoImobilizacaoItemNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Imobilização de Item" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoImobilizacaoItem(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoImobilizacaoItemNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Solicitação de Apropriação de Crédito de Combustível + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Informações de consumo de combustíveis + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoApropriacaoCreditoCombustivel(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + List consumosCombustivel, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (consumosCombustivel == null || !consumosCombustivel.Any()) + throw new ArgumentException("Informe ao menos um item para o evento de Solicitação de Apropriação de Crédito de Combustível.", nameof(consumosCombustivel)); + + var versaoServico = + ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeApropriacaoCreditoCombustivelNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaDestinataria, + verAplic = versaoAplicativo ?? "1.0", + gConsumoComb = consumosCombustivel + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeApropriacaoCreditoCombustivelNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Solicitação de Apropriação de Crédito de Combustível" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoApropriacaoCreditoCombustivel(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Informações de crédito por item + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoApropriacaoCreditoBensServicos(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + List creditos, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (creditos == null || !creditos.Any()) + throw new ArgumentException("Informe ao menos um item para o evento de Solicitação de Apropriação de Crédito para bens e serviços.", nameof(creditos)); + + var versaoServico = + ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeApropriacaoCreditoBensServicosNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaDestinataria, + verAplic = versaoAplicativo ?? "1.0", + gCredito = creditos + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeApropriacaoCreditoBensServicosNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoApropriacaoCreditoBensServicos(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Indicador de aceitação do valor de transferência + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoTransfCredIBS(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + IndicadorAceitacao indAceitacao, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + var versaoServico = + ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeManifestacaoTransfCredIBSNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaSucessora, + verAplic = versaoAplicativo ?? "1.0", + indAceitacao = indAceitacao + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeManifestacaoTransfCredIBSNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoTransfCredIBS(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Manifestação sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Indicador de aceitação do valor de transferência + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoTransfCredCBS(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + IndicadorAceitacao indAceitacao, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + var versaoServico = + ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeManifestacaoTransfCredCBSNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaSucessora, + verAplic = versaoAplicativo ?? "1.0", + indAceitacao = indAceitacao + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeManifestacaoTransfCredCBSNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Manifestação sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoTransfCredCBS(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Indicador de deferimento do valor de transferência + /// Motivo da manifestação do fisco + /// Descrição do motivo da manifestação do fisco + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoFiscoTransfCredIBS(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + IndicadorDeferimento indDeferimento, MotivoDeferimento cMotivo, string xMotivo, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (string.IsNullOrWhiteSpace(xMotivo)) + throw new ArgumentException("Informe a descrição do motivo da manifestação do fisco.", nameof(xMotivo)); + + var versaoServico = + ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeManifestacaoFiscoTransfCredIBSNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taFisco, + verAplic = versaoAplicativo ?? "1.0", + indDeferimento = indDeferimento, + cMotivo = cMotivo, + xMotivo = xMotivo + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeManifestacaoFiscoTransfCredIBSNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoFiscoTransfCredIBS(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + + /// + /// Recepção do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// + /// Nº do lote + /// Sequência do evento + /// CPF/CNPJ do autor do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Indicador de deferimento do valor de transferência + /// Motivo da manifestação do fisco + /// Descrição do motivo da manifestação do fisco + /// Código da UF do autor do evento + /// Versão do aplicativo do autor do evento + /// Data e hora do evento + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoFiscoTransfCredCBS(int idlote, + int sequenciaEvento, string cpfcnpj, string chaveNFe, + IndicadorDeferimento indDeferimento, MotivoDeferimento cMotivo, string xMotivo, + Estado? ufAutor = null, string versaoAplicativo = null, DateTimeOffset? dhEvento = null) + { + if (string.IsNullOrWhiteSpace(xMotivo)) + throw new ArgumentException("Informe a descrição do motivo da manifestação do fisco.", nameof(xMotivo)); + + var versaoServico = + ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoRTC); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfeManifestacaoFiscoTransfCredCBSNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taFisco, + verAplic = versaoAplicativo ?? "1.0", + indDeferimento = indDeferimento, + cMotivo = cMotivo, + xMotivo = xMotivo + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.SVRS, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfeManifestacaoFiscoTransfCredCBSNFe, + 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 retorno = RecepcaoEvento(idlote, new List { evento }, ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe, _cFgServico.VersaoRecepcaoEventoRTC, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// + /// false (padrão) para transmitir os eventos exatamente como vieram, já assinados; true para a biblioteca + /// calcular o Id e assinar cada evento com o certificado desta instância de ServicosNFe, sobrescrevendo o Id + /// que já estiver preenchido. + /// + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoFiscoTransfCredCBS(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe, _cFgServico.VersaoRecepcaoEventoRTC, assinar); + return retorno; + } + /// /// Consulta a situação cadastral, com base na UF/Documento /// O documento pode ser: IE, CNPJ ou CPF diff --git a/NFe.Utils/ConfiguracaoServico.cs b/NFe.Utils/ConfiguracaoServico.cs index 289729482..da1b52f0a 100644 --- a/NFe.Utils/ConfiguracaoServico.cs +++ b/NFe.Utils/ConfiguracaoServico.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.IO; using System.Linq; @@ -32,6 +32,7 @@ public sealed class ConfiguracaoServico : INotifyPropertyChanged private VersaoServico _versaoRecepcaoEventoComprovanteEntrega; private VersaoServico _versaoRecepcaoEventoConciliacaoFinanceira; private VersaoServico _versaoRecepcaoEventoPerecimentoTransporte; + private VersaoServico _versaoRecepcaoEventoRTC; private VersaoServico _versaoRecepcaoEventoEpec; private VersaoServico _versaoRecepcaoEventoManifestacaoDestinatario; private VersaoServico _versaoNfeRecepcao; @@ -209,6 +210,7 @@ private void AtualizaVersoes() VersaoRecepcaoEventoComprovanteEntrega = obterVersao(ServicoNFe.RecepcaoEventoComprovanteEntregaNFe); VersaoRecepcaoEventoConciliacaoFinanceira = obterVersao(ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe); VersaoRecepcaoEventoPerecimentoTransporte = obterVersao(ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe); + VersaoRecepcaoEventoRTC = obterVersao(ServicoNFe.RecepcaoEventoCancelamentoEventoNFe); VersaoRecepcaoEventoEpec = obterVersao(ServicoNFe.RecepcaoEventoEpec); VersaoRecepcaoEventoManifestacaoDestinatario = obterVersao(ServicoNFe.RecepcaoEventoManifestacaoDestinatario); VersaoNfeRecepcao = obterVersao(ServicoNFe.NfeRecepcao); @@ -314,6 +316,21 @@ public VersaoServico VersaoRecepcaoEventoPerecimentoTransporte } } + /// + /// Versão do serviço RecepcaoEvento para os eventos da Reforma Tributária (NT 2025.002), códigos + /// 110001, 112110, 112120, 112140, 211110, 211124, 211128, 211130, 211140, 211150, 212110, 212120, 412120 e 412130 + /// + public VersaoServico VersaoRecepcaoEventoRTC + { + get { return _versaoRecepcaoEventoRTC; } + set + { + if (value == _versaoRecepcaoEventoRTC) return; + _versaoRecepcaoEventoRTC = value; + OnPropertyChanged(); + } + } + /// /// Versão do serviço RecepcaoEvento para Manifestação do destinatário /// diff --git a/NFe.Utils/Enderecos/Enderecador.cs b/NFe.Utils/Enderecos/Enderecador.cs index cd3e59f4b..854756654 100644 --- a/NFe.Utils/Enderecos/Enderecador.cs +++ b/NFe.Utils/Enderecos/Enderecador.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using DFe.Classes.Entidades; @@ -123,6 +123,25 @@ private static List CarregarEnderecosServicos() var eventoPerecimentoTransporteNFe = new[] { ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe }; + // Eventos da Reforma Tributária (NT 2025.002), autorizados na SVRS + var eventosRTC = new[] + { + ServicoNFe.RecepcaoEventoCancelamentoEventoNFe, + ServicoNFe.RecepcaoEventoPagamentoIntegralNFe, + ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe, + ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe, + ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe, + ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe, + ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe, + ServicoNFe.RecepcaoEventoImobilizacaoItemNFe, + ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe, + ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe, + ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe, + ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe, + ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe, + ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe + }; + var hom = TipoAmbiente.Homologacao; var prod = TipoAmbiente.Producao; @@ -1632,6 +1651,10 @@ private static List CarregarEnderecosServicos() //Perecimento, perda, roubo ou furto durante o transporte addServico(eventoPerecimentoTransporteNFe, versao1, TipoAmbiente.Producao, emissao, estado, modelo, "https://nfe.svrs.rs.gov.br/ws/recepcaoevento/recepcaoevento4.asmx"); addServico(eventoPerecimentoTransporteNFe, versao1, TipoAmbiente.Homologacao, emissao, estado, modelo, "https://nfe-homologacao.svrs.rs.gov.br/ws/recepcaoevento/recepcaoevento4.asmx"); + + //Eventos da Reforma Tributária (NT 2025.002) + addServico(eventosRTC, versao1, TipoAmbiente.Producao, emissao, estado, modelo, "https://nfe.svrs.rs.gov.br/ws/recepcaoevento/recepcaoevento4.asmx"); + addServico(eventosRTC, versao1, TipoAmbiente.Homologacao, emissao, estado, modelo, "https://nfe-homologacao.svrs.rs.gov.br/ws/recepcaoevento/recepcaoevento4.asmx"); } } } @@ -1675,6 +1698,21 @@ public static void CarregarEnderecos() return cfgServico.VersaoRecepcaoEventoConciliacaoFinanceira; case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: return cfgServico.VersaoRecepcaoEventoPerecimentoTransporte; + case ServicoNFe.RecepcaoEventoCancelamentoEventoNFe: + case ServicoNFe.RecepcaoEventoPagamentoIntegralNFe: + case ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe: + case ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe: + case ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe: + case ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe: + case ServicoNFe.RecepcaoEventoImobilizacaoItemNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe: + case ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe: + return cfgServico.VersaoRecepcaoEventoRTC; case ServicoNFe.RecepcaoEventoEpec: return cfgServico.VersaoRecepcaoEventoEpec; case ServicoNFe.RecepcaoEventoManifestacaoDestinatario: diff --git a/NFe.Utils/Validacao/Validador.cs b/NFe.Utils/Validacao/Validador.cs index 34f20a35a..2f2c8c02a 100644 --- a/NFe.Utils/Validacao/Validador.cs +++ b/NFe.Utils/Validacao/Validador.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Text; @@ -45,6 +45,21 @@ internal static string ObterArquivoSchema(ServicoNFe servicoNFe, VersaoServico v return "envEventoCancEConf_v1.00.xsd"; case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: return "envEvento_v1.00.xsd"; + case ServicoNFe.RecepcaoEventoCancelamentoEventoNFe: + case ServicoNFe.RecepcaoEventoPagamentoIntegralNFe: + case ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe: + case ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe: + case ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe: + case ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe: + case ServicoNFe.RecepcaoEventoImobilizacaoItemNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe: + case ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe: + case ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe: + case ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe: + return "envEvento_v1.00.xsd"; case ServicoNFe.RecepcaoEventoEpec: return "envEPEC_v1.00.xsd"; case ServicoNFe.RecepcaoEventoManifestacaoDestinatario: @@ -128,6 +143,48 @@ public static string[] Valida(ServicoNFe servicoNFe, VersaoServico versaoServico case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e112130_v1.00.xsd")); break; + case ServicoNFe.RecepcaoEventoCancelamentoEventoNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e110001_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoPagamentoIntegralNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e112110_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoImportacaoAlcZfmNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e112120_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoFornecimentoNaoRealizadoNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e112140_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoApropriacaoCredPresumidoNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e211110_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e211124_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoAceiteDebitoNotaCreditoNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e211128_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoImobilizacaoItemNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e211130_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoApropriacaoCreditoCombustivelNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e211140_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoApropriacaoCreditoBensServicosNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e211150_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoManifestacaoTransfCredIBSNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e212110_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoManifestacaoTransfCredCBSNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e212120_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e412120_v1.00.xsd")); + break; + case ServicoNFe.RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e412130_v1.00.xsd")); + break; } return falhas.ToString().Trim().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); From 13abb7753c0a6e6d5f0ba65c41741f1596e50058 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Tue, 1 Sep 2026 12:13:54 -0300 Subject: [PATCH 3/6] =?UTF-8?q?Atualizando=20xsd=20para=20os=20eventos=20R?= =?UTF-8?q?TC=20novos.=20tiposBasicos=5Fv1.03=20n=C3=A3o=20=C3=A9=20o=20me?= =?UTF-8?q?smo=20da=20SEFAZ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd | 161 ++++--- NFe.AppTeste/Schemas/e211110_v1.00.xsd | 42 +- .../Schemas/leiauteConsSitNFe_v4.00.xsd | 3 +- NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd | 82 ++-- NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd | 2 +- NFe.AppTeste/Schemas/resEvento_v1.01.xsd | 188 ++++---- NFe.AppTeste/Schemas/resNFe_v1.01.xsd | 215 +++++---- NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd | 159 ++++--- NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd | 9 + NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd | 433 +++++++++--------- 10 files changed, 639 insertions(+), 655 deletions(-) diff --git a/NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd b/NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd index d66807e9c..89a68ae75 100644 --- a/NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd +++ b/NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd @@ -1,84 +1,83 @@ - - - - - - Schema de pedido de distribuição de DF-e de interesse - - - - - - + + + + + Schema de pedido de distribuição de DF-e de interesse + + + + + + Identificação do Ambiente: 1 - Produção 2 - Homologação - - - - - - Código da UF do Autor - - - - - - CNPJ do interessado no DF-e - - - - - CPF do interessado no DF-e - - - - - - - Grupo para distribuir DF-e de interesse - - - - - - Último NSU recebido pelo ator. Caso seja informado com zero, ou com um NSU muito antigo, a consulta retornará unicamente as informações resumidas e documentos fiscais eletrônicos que tenham sido recepcionados pelo Ambiente Nacional nos últimos 3 meses. - - - - - - - - Grupo para consultar um DF-e a partir de um NSU específico - - - - - - Número Sequencial Único. Geralmente esta consulta será utilizada quando identificado pelo interessado um NSU faltante. O Web Service retornará o documento ou informará que o NSU não existe no Ambiente Nacional. Assim, esta consulta fechará a lacuna do NSU identificado como faltante. - - - - - - - - Grupo para consultar uma NF-e a partir da chave de acesso - - - - - - Chave de acesso da NF-e a ser consultada - - - - - - - - - - - \ No newline at end of file + + + + + + Código da UF do Autor + + + + + + CNPJ do interessado no DF-e + + + + + CPF do interessado no DF-e + + + + + + + Grupo para distribuir DF-e de interesse + + + + + + Último NSU recebido pelo ator. Caso seja informado com zero, ou com um NSU muito antigo, a consulta retornará unicamente as informações resumidas e documentos fiscais eletrônicos que tenham sido recepcionados pelo Ambiente Nacional nos últimos 3 meses. + + + + + + + + Grupo para consultar um DF-e a partir de um NSU específico + + + + + + Número Sequencial Único. Geralmente esta consulta será utilizada quando identificado pelo interessado um NSU faltante. O Web Service retornará o documento ou informará que o NSU não existe no Ambiente Nacional. Assim, esta consulta fechará a lacuna do NSU identificado como faltante. + + + + + + + + Grupo para consultar uma NF-e a partir da chave de acesso + + + + + + Chave de acesso da NF-e a ser consultada + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211110_v1.00.xsd b/NFe.AppTeste/Schemas/e211110_v1.00.xsd index b89f1cf0e..f486b108c 100644 --- a/NFe.AppTeste/Schemas/e211110_v1.00.xsd +++ b/NFe.AppTeste/Schemas/e211110_v1.00.xsd @@ -31,6 +31,7 @@ + @@ -40,31 +41,31 @@ Versão do Aplicativo que recebeu o Evento - + Informações de crédito presumido por item - + Valor do base de cálculo do item - + + + Código de Classificação do Crédito presumido, conforme tabela cCredPres (Anexo IV) + + + + + + + + + - - - Usar tabela Cred Presumido, para o emitente da nota. - - - - - - - - Percentual do Crédito Presumido @@ -78,20 +79,9 @@ - + - - - Usar tabela Cred Presumido, para o emitente da nota. - - - - - - - - Percentual do Crédito Presumido diff --git a/NFe.AppTeste/Schemas/leiauteConsSitNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteConsSitNFe_v4.00.xsd index a56621542..a43c7e033 100644 --- a/NFe.AppTeste/Schemas/leiauteConsSitNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteConsSitNFe_v4.00.xsd @@ -4,7 +4,6 @@ - @@ -316,7 +315,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd index bb5ec2b02..1f23ffac0 100644 --- a/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd @@ -1,4 +1,4 @@ - + @@ -91,6 +91,40 @@ + + + Grupo de Informação do Provedor de Assinatura e Autorização + + + + + + CNPJ do Provedor de Assinatura e Autorização + + + + + Assinatura RSA do Emitente para DFe gerados por PAA + + + + + + Assinatura digital padrão RSA + Converter o atributo Id do DFe para array de bytes e assinar com a chave privada do RSA com algoritmo SHA1 gerando um valor no formato base64. + + + + + Chave Publica no padrão XML RSA Key + + + + + + + + @@ -99,7 +133,7 @@ - + @@ -332,48 +366,4 @@ - - - diff --git a/NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd index 819597c1a..886e05d0f 100644 --- a/NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd @@ -76,7 +76,7 @@ - + diff --git a/NFe.AppTeste/Schemas/resEvento_v1.01.xsd b/NFe.AppTeste/Schemas/resEvento_v1.01.xsd index 3ac45a4d8..40113c758 100644 --- a/NFe.AppTeste/Schemas/resEvento_v1.01.xsd +++ b/NFe.AppTeste/Schemas/resEvento_v1.01.xsd @@ -1,94 +1,94 @@ - - - - - - - Schema da estrutura XML gerada pelo Ambiente Nacional com o conjunto de informações resumidas de um evento de NF-e - - - - - - Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 91 para identificar o Ambiente Nacional - - - - - - CNPJ do Emitente - - - - - CPF do Emitente - - - - - - Chave de acesso da NF-e - - - - - Data e Hora do Evento, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) - - - - - Tipo do Evento - - - - - - - - - - - Seqüencial do evento para o mesmo tipo de evento. Para maioria dos eventos será 1, nos casos em que possa existir mais de um evento, como é o caso da carta de correção, o autor do evento deve numerar de forma seqüencial - - - - - - - - - - - Descrição do Evento - - - - - - - - - - - Data e hora de autorização do evento no formato AAAA-MM-DDTHH:MM:SSTZD - - - - - Número do Protocolo do evento. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - códiga da UF - 2 posições ano; 10 seqüencial no ano - - - - - - - - - Tipo Versão do leiate resNFe - - - - - - - \ No newline at end of file + + + + + + Schema da estrutura XML gerada pelo Ambiente Nacional com o conjunto de informações resumidas de um evento de NF-e + + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 91 para identificar o Ambiente Nacional + + + + + + +CNPJ do Emitente + + + + + CPF do Emitente + + + + + + Chave de acesso da NF-e + + + + + Data e Hora do Evento, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) + + + + + Tipo do Evento + + + + + + + + + + + Seqüencial do evento para o mesmo tipo de evento. Para maioria dos eventos será 1, nos casos em que possa existir mais de um evento, como é o caso da carta de correção, o autor do evento deve numerar de forma seqüencial + + + + + + + + + + + Descrição do Evento + + + + + + + + + + + Data e hora de autorização do evento no formato AAAA-MM-DDTHH:MM:SSTZD + + + + + Número do Protocolo do evento. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - códiga da UF - 2 posições ano; 10 seqüencial no ano + + + + + + + + + Tipo Versão do leiate resNFe + + + + + + + diff --git a/NFe.AppTeste/Schemas/resNFe_v1.01.xsd b/NFe.AppTeste/Schemas/resNFe_v1.01.xsd index 91d83b0dd..91a9e9e46 100644 --- a/NFe.AppTeste/Schemas/resNFe_v1.01.xsd +++ b/NFe.AppTeste/Schemas/resNFe_v1.01.xsd @@ -1,111 +1,110 @@ - - - - - - - Schema da estrutura XML gerada pelo Ambiente Nacional com o conjunto de informações resumidas de uma NF-e - - - - - - Chave de acesso da NF-e - - - - - - CNPJ do Emitente - - - - - CPF do Emitente - - - - - - Razão Social ou Nome do emitente - - - - - - - - - - - Inscrição Estadual do Emitente - - - - - Data e Hora de emissão do Documento Fiscal (AAAA-MM-DDThh:mm:ssTZD) ex.: 2012-09-01T13:00:00-03:00 - - - - - Tipo do Documento Fiscal (0 - entrada; 1 - saída) - - - - - - - - - - - - Valor Total da NF-e - - - - - Digest Value da NF-e processada. Utilizado para conferir a integridade da NF-e original - - - - - Data e hora de autorização da NF-e, no formato AAAA-MM-DDTHH:MM:SSTZD - - - - - Número do Protocolo de Status da NF-e. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - códiga da UF - 2 posições ano; 10 seqüencial no ano - - - - - + + + + + + Schema da estrutura XML gerada pelo Ambiente Nacional com o conjunto de informações resumidas de uma NF-e + + + + + + Chave de acesso da NF-e + + + + + + CNPJ do Emitente + + + + + CPF do Emitente + + + + + + Razão Social ou Nome do emitente + + + + + + + + + + + Inscrição Estadual do Emitente + + + + + Data e Hora de emissão do Documento Fiscal (AAAA-MM-DDThh:mm:ssTZD) ex.: 2012-09-01T13:00:00-03:00 + + + + + Tipo do Documento Fiscal (0 - entrada; 1 - saída) + + + + + + + + + + + + Valor Total da NF-e + + + + + Digest Value da NF-e processada. Utilizado para conferir a integridade da NF-e original + + + + + Data e hora de autorização da NF-e, no formato AAAA-MM-DDTHH:MM:SSTZD + + + + + Número do Protocolo de Status da NF-e. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - códiga da UF - 2 posições ano; 10 seqüencial no ano + + + + + Situação da NF-e 1-Uso autorizado no momento da consulta; 2-Uso denegado; - - - - - - - - - - - - - - - - - - Tipo Versão do leiate resNFe - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + Tipo Versão do leiate resNFe + + + + + + + diff --git a/NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd b/NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd index 3c4b8fce6..638e08c18 100644 --- a/NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd +++ b/NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd @@ -1,83 +1,82 @@ - - - - - - Schema do resultado do pedido de distribuição de DF-e de interesse - - - - - - + + + + + Schema do resultado do pedido de distribuição de DF-e de interesse + + + + + + Identificação do Ambiente: 1 - Produção 2 - Homologação - - - - - - Versão do Web Service NFeDistribuicaoDFe - - - - - Código do status de processamento da requisição - - - - - Descrição literal do status do processamento da requisição - - - - - Data e Hora de processamento da requisição no formato AAAA-MM-DDTHH:MM:SSTZD - - - - - Último NSU pesquisado no Ambiente Nacional. Se for o caso, o solicitante pode continuar a consulta a partir deste NSU para obter novos resultados. - - - - - Maior NSU existente no Ambiente Nacional para o CNPJ/CPF informado - - - - - Conjunto de informações resumidas e documentos fiscais eletrônicos de interesse da pessoa ou empresa. - - - - - - Informação resumida ou documento fiscal eletrônico de interesse da pessoa ou empresa. O conteúdo desta tag estará compactado no padrão gZip. O tipo do campo é base64Binary. - - - - - - - NSU do documento fiscal - - - - - Identificação do Schema XML que será utilizado para validar o XML existente no conteúdo da tag docZip. Vai identificar o tipo do documento e sua versão. Exemplos: resNFe_v1.00.xsd, procNFe_v3.10.xsd, resEvento_1.00.xsd, procEventoNFe_v1.00.xsd - - - - - - - - - - - - - - \ No newline at end of file + + + + + + Versão do Web Service NFeDistribuicaoDFe + + + + + Código do status de processamento da requisição + + + + + Descrição literal do status do processamento da requisição + + + + + Data e Hora de processamento da requisição no formato AAAA-MM-DDTHH:MM:SSTZD + + + + + Último NSU pesquisado no Ambiente Nacional. Se for o caso, o solicitante pode continuar a consulta a partir deste NSU para obter novos resultados. + + + + + Maior NSU existente no Ambiente Nacional para o CNPJ/CPF informado + + + + + Conjunto de informações resumidas e documentos fiscais eletrônicos de interesse da pessoa ou empresa. + + + + + + Informação resumida ou documento fiscal eletrônico de interesse da pessoa ou empresa. O conteúdo desta tag estará compactado no padrão gZip. O tipo do campo é base64Binary. + + + + + + + NSU do documento fiscal + + + + + Identificação do Schema XML que será utilizado para validar o XML existente no conteúdo da tag docZip. Vai identificar o tipo do documento e sua versão. Exemplos: resNFe_v1.00.xsd, procNFe_v3.10.xsd, resEvento_1.00.xsd, procEventoNFe_v1.00.xsd + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd b/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd index 251f9465d..8b6e23a42 100644 --- a/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd +++ b/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd @@ -895,4 +895,13 @@ acrescentado: + + + Tipo que representa uma chave publica padrão RSA + + + + + + diff --git a/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd b/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd index 8b0d8a135..12c0015f1 100644 --- a/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd +++ b/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd @@ -1,217 +1,216 @@ - - - - - Tipo número sequencial único - - - - - - - - Tipo quantidade de NSU - - - - - - - - - Tipo Versão dos leiautes do Web Service NFeDistribuicaoDFe - - - - - - - - - Tipo Ambiente - - - - - - - - - - Tipo Código da UF da tabela do IBGE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Número do CNPJ - - - - - - - - - - Tipo Número do CPF - - - - - - - - - - Tipo Versão do Aplicativo - - - - - - - - - Tipo Código da Mensagem enviada - - - - - - - - - - Tipo Motivo - - - - - - - - - Tipo string genérico - - - - - - - - - Tipo Chave da Nota Fiscal Eletrônica - - - - - - - - - - Tipo Número do Protocolo de Status - - - - - - - - - - Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) - - - - - - - - - Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO - - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais - - - - - - - \ No newline at end of file + + + + Tipo número sequencial único + + + + + + + + Tipo quantidade de NSU + + + + + + + + + Tipo Versão dos leiautes do Web Service NFeDistribuicaoDFe + + + + + + + + + Tipo Ambiente + + + + + + + + + + Tipo Código da UF da tabela do IBGE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Número do CNPJ + + + + + + + + + + Tipo Número do CPF + + + + + + + + + + Tipo Versão do Aplicativo + + + + + + + + + Tipo Código da Mensagem enviada + + + + + + + + + + Tipo Motivo + + + + + + + + + Tipo string genérico + + + + + + + + + Tipo Chave da Nota Fiscal Eletrônica + + + + + + + + + + Tipo Número do Protocolo de Status + + + + + + + + + + Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) + + + + + + + + + Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO + + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais + + + + + + + From 0c500cc4b3cd95106e4818aa2b98bbb1ac4a18da Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Tue, 1 Sep 2026 12:14:47 -0300 Subject: [PATCH 4/6] Adicionando nova aba para realizar os testes dos novos eventos RTC, no projeto de teste da NFe --- NFe.AppTeste/MainWindow.xaml | 32 ++ NFe.AppTeste/MainWindow.xaml.cs | 685 +++++++++++++++++++++++++++++++- 2 files changed, 716 insertions(+), 1 deletion(-) diff --git a/NFe.AppTeste/MainWindow.xaml b/NFe.AppTeste/MainWindow.xaml index 2f93f66ee..07bbf8b23 100644 --- a/NFe.AppTeste/MainWindow.xaml +++ b/NFe.AppTeste/MainWindow.xaml @@ -998,6 +998,38 @@ Margin="375,260,0,0" VerticalAlignment="Top" Width="177" Click="BtnPerecimentoTransporte_Click" /> + + + [XmlElement("vIBS")] - public decimal vIBS + public decimal? vIBS { get { return _vIBS.GetValueOrDefault(); } - set { _vIBS = value.Arredondar(2); } + set { _vIBS = value?.Arredondar(2); } } /// @@ -43,10 +43,10 @@ public decimal vIBS /// Obrigatório no evento 112130 e não informado no evento 211124. /// [XmlElement("vCBS")] - public decimal vCBS + public decimal? vCBS { get { return _vCBS.GetValueOrDefault(); } - set { _vCBS = value.Arredondar(2); } + set { _vCBS = value?.Arredondar(2); } } public bool ShouldSerializevIBS() From 5473691f64caeae98a20e46142158e4c2b02e589 Mon Sep 17 00:00:00 2001 From: Danilo Breda Date: Sun, 13 Sep 2026 18:27:54 -0300 Subject: [PATCH 6/6] =?UTF-8?q?Ajustes=20de=20revis=C3=A3o=20nos=20eventos?= =?UTF-8?q?=20RTC"=20-m=20"-=20gControleEstoque:=20getter=20nullable=20rea?= =?UTF-8?q?l;=20112130=20envia=200=20quando=20n=C3=A3o=20informado;=202111?= =?UTF-8?q?24=20rejeita=20vIBS/vCBS=20-=20RemoverAcentos=20preserva=20desc?= =?UTF-8?q?Evento=20dos=20eventos=20cujo=20XSD=20exige=20acentua=C3=A7?= =?UTF-8?q?=C3=A3o=20(assinatura=20e=20envio)=20-=20ServicoNFe:=20novos=20?= =?UTF-8?q?servi=C3=A7os=20no=20final=20do=20enum=20para=20manter=20os=20v?= =?UTF-8?q?alores=20num=C3=A9ricos=20-=20Remove=20BOM=20adicionado=20em=20?= =?UTF-8?q?arquivos=20.cs=20existentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.AppTeste/MainWindow.xaml.cs | 2 +- NFe.Classes/Servicos/Evento/detEvento.cs | 2 +- NFe.Classes/Servicos/Evento/detEventoTipos.cs | 2 +- .../Servicos/Evento/gControleEstoque.cs | 12 +- .../Servicos/Tipos/NFeServicosTipos.cs | 120 +++++++++--------- NFe.Servicos/ServicosNFe.cs | 16 ++- NFe.Utils/Assinatura/Assinador.cs | 4 +- NFe.Utils/ConfiguracaoServico.cs | 2 +- NFe.Utils/Enderecos/Enderecador.cs | 2 +- NFe.Utils/Evento/Extevento.cs | 44 +++++++ NFe.Utils/Validacao/Validador.cs | 2 +- 11 files changed, 133 insertions(+), 75 deletions(-) diff --git a/NFe.AppTeste/MainWindow.xaml.cs b/NFe.AppTeste/MainWindow.xaml.cs index 92e17aa55..bdae3e6d3 100644 --- a/NFe.AppTeste/MainWindow.xaml.cs +++ b/NFe.AppTeste/MainWindow.xaml.cs @@ -1,4 +1,4 @@ -using DFe.Classes.Flags; +using DFe.Classes.Flags; using DFe.Utils; using NFe.Classes; using NFe.Classes.Informacoes; diff --git a/NFe.Classes/Servicos/Evento/detEvento.cs b/NFe.Classes/Servicos/Evento/detEvento.cs index 6dfceb368..badf84269 100644 --- a/NFe.Classes/Servicos/Evento/detEvento.cs +++ b/NFe.Classes/Servicos/Evento/detEvento.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Xml.Serialization; using DFe.Classes.Entidades; diff --git a/NFe.Classes/Servicos/Evento/detEventoTipos.cs b/NFe.Classes/Servicos/Evento/detEventoTipos.cs index 45e793f6a..0f92a8c76 100644 --- a/NFe.Classes/Servicos/Evento/detEventoTipos.cs +++ b/NFe.Classes/Servicos/Evento/detEventoTipos.cs @@ -1,4 +1,4 @@ -using System.ComponentModel; +using System.ComponentModel; using System.Xml.Serialization; namespace NFe.Classes.Servicos.Evento diff --git a/NFe.Classes/Servicos/Evento/gControleEstoque.cs b/NFe.Classes/Servicos/Evento/gControleEstoque.cs index 6766ef60b..ba8395d2a 100644 --- a/NFe.Classes/Servicos/Evento/gControleEstoque.cs +++ b/NFe.Classes/Servicos/Evento/gControleEstoque.cs @@ -34,8 +34,8 @@ public decimal qPerecimento [XmlElement("vIBS")] public decimal? vIBS { - get { return _vIBS.GetValueOrDefault(); } - set { _vIBS = value?.Arredondar(2); } + get { return _vIBS.Arredondar(2); } + set { _vIBS = value.Arredondar(2); } } /// @@ -45,18 +45,18 @@ public decimal? vIBS [XmlElement("vCBS")] public decimal? vCBS { - get { return _vCBS.GetValueOrDefault(); } - set { _vCBS = value?.Arredondar(2); } + get { return _vCBS.Arredondar(2); } + set { _vCBS = value.Arredondar(2); } } public bool ShouldSerializevIBS() { - return _vIBS.HasValue; + return vIBS.HasValue; } public bool ShouldSerializevCBS() { - return _vCBS.HasValue; + return vCBS.HasValue; } } } diff --git a/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs b/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs index 9f82cd771..11bc1e717 100644 --- a/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs +++ b/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.ComponentModel; using System.Xml.Serialization; @@ -57,143 +57,145 @@ public enum ServicoNFe RecepcaoEventoPerecimentoTransporteNFe, /// - /// serviço destinado à recepção de mensagem do Evento de Cancelamento de Evento (NT 2025.002 - Reforma Tributária) + /// serviço destinado à recepção de mensagem do Evento de Manifestação do destinatário da NF-e /// - RecepcaoEventoCancelamentoEventoNFe, + RecepcaoEventoManifestacaoDestinatario, /// - /// serviço destinado à recepção de mensagem do Evento de Informação de efetivo pagamento integral para liberar crédito presumido do adquirente + /// serviço destinado à recepção de mensagens de lote de NF-e versão 2.0 /// - RecepcaoEventoPagamentoIntegralNFe, + NfeRecepcao, /// - /// serviço destinado à recepção de mensagem do Evento de Importação em ALC/ZFM não convertida em isenção + /// serviço destinado a retornar o resultado do processamento do lote de NF-e versão 2.0 /// - RecepcaoEventoImportacaoAlcZfmNFe, + NfeRetRecepcao, /// - /// serviço destinado à recepção de mensagem do Evento de Fornecimento não realizado com pagamento antecipado + /// Serviço para consultar o cadastro de contribuintes do ICMS da unidade federada /// - RecepcaoEventoFornecimentoNaoRealizadoNFe, + NfeConsultaCadastro, /// - /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de crédito presumido + /// serviço destinado ao atendimento de solicitações de inutilização de numeração /// - RecepcaoEventoApropriacaoCredPresumidoNFe, + NfeInutilizacao, /// - /// serviço destinado à recepção de mensagem do Evento de Perecimento, Perda, Roubo ou Furto durante o Transporte contratado pelo adquirente + /// serviço destinado ao atendimento de solicitações de consulta da situação atual da NF-e + /// na Base de Dados do Portal da Secretaria de Fazenda Estadual /// - RecepcaoEventoPerecimentoTransporteAdquirenteNFe, + NfeConsultaProtocolo, /// - /// serviço destinado à recepção de mensagem do Evento de Aceite de débito na apuração por emissão de nota de crédito + /// serviço destinado à consulta do status do serviço prestado pelo Portal da Secretaria de Fazenda Estadual /// - RecepcaoEventoAceiteDebitoNotaCreditoNFe, + NfeStatusServico, /// - /// serviço destinado à recepção de mensagem do Evento de Imobilização de Item + /// serviço destinado à recepção de mensagens de lote de NF-e versão 3.10 /// - RecepcaoEventoImobilizacaoItemNFe, + NFeAutorizacao, /// - /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de Crédito de Combustível + /// serviço destinado a retornar o resultado do processamento do lote de NF-e versão 3.10 /// - RecepcaoEventoApropriacaoCreditoCombustivelNFe, + NFeRetAutorizacao, /// - /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente + /// Distribui documentos e informações de interesse do ator da NF-e /// - RecepcaoEventoApropriacaoCreditoBensServicosNFe, + NFeDistribuicaoDFe, /// - /// serviço destinado à recepção de mensagem do Evento de Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// “Serviço de Consulta da Relação de Documentos Destinados” para um determinado CNPJ + /// de destinatário informado na NF-e. /// - RecepcaoEventoManifestacaoTransfCredIBSNFe, + NfeConsultaDest, /// - /// serviço destinado à recepção de mensagem do Evento de Manifestação sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// Serviço destinado ao atendimento de solicitações de download de Notas Fiscais Eletrônicas por seus destinatários /// - RecepcaoEventoManifestacaoTransfCredCBSNFe, + NfeDownloadNF, /// - /// serviço destinado à recepção de mensagem do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + /// Serviço destinado a administração do CSC. /// - RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe, + NfceAdministracaoCSC, + + ConsultaGtin, + + // Serviços da Reforma Tributária (NT 2025.002) ficam no final para não alterar o valor numérico dos membros anteriores /// - /// serviço destinado à recepção de mensagem do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + /// serviço destinado à recepção de mensagem do Evento de Cancelamento de Evento (NT 2025.002 - Reforma Tributária) /// - RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe, + RecepcaoEventoCancelamentoEventoNFe, /// - /// serviço destinado à recepção de mensagem do Evento de Manifestação do destinatário da NF-e + /// serviço destinado à recepção de mensagem do Evento de Informação de efetivo pagamento integral para liberar crédito presumido do adquirente /// - RecepcaoEventoManifestacaoDestinatario, + RecepcaoEventoPagamentoIntegralNFe, /// - /// serviço destinado à recepção de mensagens de lote de NF-e versão 2.0 + /// serviço destinado à recepção de mensagem do Evento de Importação em ALC/ZFM não convertida em isenção /// - NfeRecepcao, + RecepcaoEventoImportacaoAlcZfmNFe, /// - /// serviço destinado a retornar o resultado do processamento do lote de NF-e versão 2.0 + /// serviço destinado à recepção de mensagem do Evento de Fornecimento não realizado com pagamento antecipado /// - NfeRetRecepcao, + RecepcaoEventoFornecimentoNaoRealizadoNFe, /// - /// Serviço para consultar o cadastro de contribuintes do ICMS da unidade federada + /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de crédito presumido /// - NfeConsultaCadastro, + RecepcaoEventoApropriacaoCredPresumidoNFe, /// - /// serviço destinado ao atendimento de solicitações de inutilização de numeração + /// serviço destinado à recepção de mensagem do Evento de Perecimento, Perda, Roubo ou Furto durante o Transporte contratado pelo adquirente /// - NfeInutilizacao, + RecepcaoEventoPerecimentoTransporteAdquirenteNFe, /// - /// serviço destinado ao atendimento de solicitações de consulta da situação atual da NF-e - /// na Base de Dados do Portal da Secretaria de Fazenda Estadual + /// serviço destinado à recepção de mensagem do Evento de Aceite de débito na apuração por emissão de nota de crédito /// - NfeConsultaProtocolo, + RecepcaoEventoAceiteDebitoNotaCreditoNFe, /// - /// serviço destinado à consulta do status do serviço prestado pelo Portal da Secretaria de Fazenda Estadual + /// serviço destinado à recepção de mensagem do Evento de Imobilização de Item /// - NfeStatusServico, + RecepcaoEventoImobilizacaoItemNFe, /// - /// serviço destinado à recepção de mensagens de lote de NF-e versão 3.10 + /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de Crédito de Combustível /// - NFeAutorizacao, + RecepcaoEventoApropriacaoCreditoCombustivelNFe, /// - /// serviço destinado a retornar o resultado do processamento do lote de NF-e versão 3.10 + /// serviço destinado à recepção de mensagem do Evento de Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente /// - NFeRetAutorizacao, + RecepcaoEventoApropriacaoCreditoBensServicosNFe, /// - /// Distribui documentos e informações de interesse do ator da NF-e + /// serviço destinado à recepção de mensagem do Evento de Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão /// - NFeDistribuicaoDFe, + RecepcaoEventoManifestacaoTransfCredIBSNFe, /// - /// “Serviço de Consulta da Relação de Documentos Destinados” para um determinado CNPJ - /// de destinatário informado na NF-e. + /// serviço destinado à recepção de mensagem do Evento de Manifestação sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão /// - NfeConsultaDest, + RecepcaoEventoManifestacaoTransfCredCBSNFe, /// - /// Serviço destinado ao atendimento de solicitações de download de Notas Fiscais Eletrônicas por seus destinatários + /// serviço destinado à recepção de mensagem do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão /// - NfeDownloadNF, + RecepcaoEventoManifestacaoFiscoTransfCredIBSNFe, /// - /// Serviço destinado a administração do CSC. + /// serviço destinado à recepção de mensagem do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão /// - NfceAdministracaoCSC, - - ConsultaGtin + RecepcaoEventoManifestacaoFiscoTransfCredCBSNFe } /// diff --git a/NFe.Servicos/ServicosNFe.cs b/NFe.Servicos/ServicosNFe.cs index 00ea6685d..98bc88f83 100644 --- a/NFe.Servicos/ServicosNFe.cs +++ b/NFe.Servicos/ServicosNFe.cs @@ -1,4 +1,4 @@ -using DFe.Classes.Entidades; +using DFe.Classes.Entidades; using DFe.Classes.Flags; using DFe.Utils; using DFe.Utils.Assinatura; @@ -440,7 +440,7 @@ private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, S #region Valida, Envia os dados e obtém a resposta var xmlEvento = _cFgServico.RemoverAcentos - ? pedEvento.ObterXmlString().RemoverAcentos() + ? pedEvento.ObterXmlString().RemoverAcentosPreservandoDescEvento() : pedEvento.ObterXmlString(); SalvarArquivoXml(idlote + "-ped-eve.xml", xmlEvento); @@ -1244,6 +1244,15 @@ public RetornoRecepcaoEvento RecepcaoEventoPerecimentoTransporte(int idlote, if (perecimentos == null || !perecimentos.Any()) throw new ArgumentException("Informe ao menos um item para o evento de Perecimento, perda, roubo ou furto durante o transporte.", nameof(perecimentos)); + // vIBS e vCBS de gControleEstoque são obrigatórios neste evento: quando não informados, são enviados zerados + foreach (var controleEstoque in perecimentos.Select(p => p.gControleEstoque).Where(g => g != null)) + { + if (!controleEstoque.vIBS.HasValue) + controleEstoque.vIBS = 0; + if (!controleEstoque.vCBS.HasValue) + controleEstoque.vCBS = 0; + } + var versaoServico = ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe.VersaoServicoParaString( _cFgServico.VersaoRecepcaoEventoPerecimentoTransporte); @@ -1686,6 +1695,9 @@ public RetornoRecepcaoEvento RecepcaoEventoPerecimentoTransporteAdquirente(int i if (perecimentos == null || !perecimentos.Any()) throw new ArgumentException("Informe ao menos um item para o evento de Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente.", nameof(perecimentos)); + if (perecimentos.Any(p => p.gControleEstoque != null && (p.gControleEstoque.vIBS.HasValue || p.gControleEstoque.vCBS.HasValue))) + throw new ArgumentException("Os campos vIBS e vCBS de gControleEstoque não devem ser informados no evento de Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente.", nameof(perecimentos)); + var versaoServico = ServicoNFe.RecepcaoEventoPerecimentoTransporteAdquirenteNFe.VersaoServicoParaString( _cFgServico.VersaoRecepcaoEventoRTC); diff --git a/NFe.Utils/Assinatura/Assinador.cs b/NFe.Utils/Assinatura/Assinador.cs index 53032fba0..b16a3f387 100644 --- a/NFe.Utils/Assinatura/Assinador.cs +++ b/NFe.Utils/Assinatura/Assinador.cs @@ -4,7 +4,7 @@ using System.Xml; using DFe.Utils; using DFe.Utils.Assinatura; -using Shared.DFe.Utils; +using NFe.Utils.Evento; using Signature = DFe.Classes.Assinatura.Signature; namespace NFe.Utils.Assinatura @@ -60,7 +60,7 @@ public static Signature ObterAssinatura(T objeto, string id, X509Certificate2 { var documento = new XmlDocument { PreserveWhitespace = true }; var xml = cfgServicoRemoverAcentos - ? FuncoesXml.ClasseParaXmlString(objetoLocal).RemoverAcentos() + ? FuncoesXml.ClasseParaXmlString(objetoLocal).RemoverAcentosPreservandoDescEvento() : FuncoesXml.ClasseParaXmlString(objetoLocal); documento.LoadXml(xml); diff --git a/NFe.Utils/ConfiguracaoServico.cs b/NFe.Utils/ConfiguracaoServico.cs index da1b52f0a..e414b53a9 100644 --- a/NFe.Utils/ConfiguracaoServico.cs +++ b/NFe.Utils/ConfiguracaoServico.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.IO; using System.Linq; diff --git a/NFe.Utils/Enderecos/Enderecador.cs b/NFe.Utils/Enderecos/Enderecador.cs index 854756654..9f6bb5b91 100644 --- a/NFe.Utils/Enderecos/Enderecador.cs +++ b/NFe.Utils/Enderecos/Enderecador.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using DFe.Classes.Entidades; diff --git a/NFe.Utils/Evento/Extevento.cs b/NFe.Utils/Evento/Extevento.cs index 70e3668e5..a61640d1f 100644 --- a/NFe.Utils/Evento/Extevento.cs +++ b/NFe.Utils/Evento/Extevento.cs @@ -1,9 +1,13 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Security.Cryptography.X509Certificates; +using System.Text.RegularExpressions; using DFe.Utils; using NFe.Classes.Servicos.Evento; using NFe.Classes.Servicos.Tipos; using NFe.Utils.Assinatura; +using Shared.DFe.Utils; namespace NFe.Utils.Evento { @@ -57,5 +61,45 @@ public static evento Assina(this evento evento, X509Certificate2 certificadoDigi eventoLocal.Signature = assinatura; return eventoLocal; } + + /// + /// descEvento que o XSD do evento só aceita acentuado, indexados pela forma sem acentos. + /// Os demais eventos (ex.: Carta de Correção, cujo XSD aceita as duas formas) seguem tendo os acentos removidos. + /// + private static readonly Dictionary DescEventoSomenteComAcento = new[] + { + NFeTipoEvento.TeNfeCancConciliacaoFinanceiraNFe, + NFeTipoEvento.TeNfePagamentoIntegralNFe, + NFeTipoEvento.TeNfeImportacaoAlcZfmNFe, + NFeTipoEvento.TeNfeFornecimentoNaoRealizadoNFe, + NFeTipoEvento.TeNfeApropriacaoCredPresumidoNFe, + NFeTipoEvento.TeNfeAceiteDebitoNotaCreditoNFe, + NFeTipoEvento.TeNfeImobilizacaoItemNFe, + NFeTipoEvento.TeNfeApropriacaoCreditoCombustivelNFe, + NFeTipoEvento.TeNfeApropriacaoCreditoBensServicosNFe, + NFeTipoEvento.TeNfeManifestacaoTransfCredIBSNFe, + NFeTipoEvento.TeNfeManifestacaoTransfCredCBSNFe, + NFeTipoEvento.TeNfeManifestacaoFiscoTransfCredIBSNFe, + NFeTipoEvento.TeNfeManifestacaoFiscoTransfCredCBSNFe + }.Select(t => t.Descricao()).ToDictionary(d => d.RemoverAcentos(), d => d); + + /// + /// Remove os acentos do XML, mantendo o descEvento dos eventos cujo XSD só aceita a descrição acentuada + /// (ex.: "Imobilização de Item") + /// + public static string RemoverAcentosPreservandoDescEvento(this string xml) + { + var semAcentos = xml.RemoverAcentos(); + if (string.IsNullOrEmpty(semAcentos) || semAcentos.IndexOf("", StringComparison.Ordinal) < 0) + return semAcentos; + + return Regex.Replace(semAcentos, "([^<]*)", m => + { + string descricao; + return DescEventoSomenteComAcento.TryGetValue(m.Groups[1].Value, out descricao) + ? "" + descricao + "" + : m.Value; + }); + } } } \ No newline at end of file diff --git a/NFe.Utils/Validacao/Validador.cs b/NFe.Utils/Validacao/Validador.cs index 2f2c8c02a..52d258688 100644 --- a/NFe.Utils/Validacao/Validador.cs +++ b/NFe.Utils/Validacao/Validador.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Text;