From 119592e7f926608f3edea3724d68e0f648691eee Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Tue, 31 Mar 2026 11:39:03 -0300 Subject: [PATCH 01/71] adicionando Evento Cancelamento Desacordo em CTe.Servicos --- CTe.Classes/Servicos/Evento/detEvento.cs | 1 + .../Servicos/Evento/evCancPrestDesacordo.cs | 18 +++++++ .../Eventos/EventoCancelamentoDesacordo.cs | 47 +++++++++++++++++++ CTe.Servicos/Factory/ClassesFactory.cs | 16 +++++++ 4 files changed, 82 insertions(+) create mode 100644 CTe.Classes/Servicos/Evento/evCancPrestDesacordo.cs create mode 100644 CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs diff --git a/CTe.Classes/Servicos/Evento/detEvento.cs b/CTe.Classes/Servicos/Evento/detEvento.cs index 9a07eeaa2..1a0e2a46f 100644 --- a/CTe.Classes/Servicos/Evento/detEvento.cs +++ b/CTe.Classes/Servicos/Evento/detEvento.cs @@ -11,6 +11,7 @@ public class detEvento [XmlElement("evCancCTe", typeof(evCancCTe), Namespace = "http://www.portalfiscal.inf.br/cte")] [XmlElement("evCCeCTe", typeof(evCCeCTe), Namespace = "http://www.portalfiscal.inf.br/cte")] [XmlElement("evPrestDesacordo", typeof(evPrestDesacordo), Namespace = "http://www.portalfiscal.inf.br/cte")] + [XmlElement("evCancPrestDesacordo", typeof(evCancPrestDesacordo), Namespace = "http://www.portalfiscal.inf.br/cte")] public EventoContainer EventoContainer { get; set; } } } \ No newline at end of file diff --git a/CTe.Classes/Servicos/Evento/evCancPrestDesacordo.cs b/CTe.Classes/Servicos/Evento/evCancPrestDesacordo.cs new file mode 100644 index 000000000..f50233dc4 --- /dev/null +++ b/CTe.Classes/Servicos/Evento/evCancPrestDesacordo.cs @@ -0,0 +1,18 @@ +using System.Xml.Serialization; + +namespace CTe.Classes.Servicos.Evento +{ + [XmlRoot(Namespace = "http://www.portalfiscal.inf.br/cte")] + public class evCancPrestDesacordo : EventoContainer + { + public evCancPrestDesacordo() + { + this.descEvento = "Cancelamento Prestação do Serviço em Desacordo"; + } + + public string descEvento { get; set; } + + public string nProtEvPrestDes { get; set; } + + } +} diff --git a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs new file mode 100644 index 000000000..c41c0547e --- /dev/null +++ b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs @@ -0,0 +1,47 @@ +using CTe.Classes; +using CTe.Classes.Servicos.Evento; +using CTe.Classes.Servicos.Evento.Flags; +using CTe.Servicos.Factory; +using System.Threading.Tasks; + +namespace CTe.Servicos.Eventos +{ + public class EventoCancelamentoDesacordo + { + private readonly int _sequenciaEvento; + private readonly string _cnpj; + private readonly string _chave; + private readonly string _nProtEvPrestDes; + + public eventoCTe EventoEnviado { get; private set; } + public retEventoCTe RetornoSefaz { get; private set; } + + public EventoCancelamentoDesacordo(int sequenciaEvento, string chave, string cnpj, string nProtEvPrestDes) + { + _chave = chave; + _cnpj = cnpj; + _sequenciaEvento = sequenciaEvento; + _nProtEvPrestDes = nProtEvPrestDes; + } + + public retEventoCTe CancelarDesacordo(ConfiguracaoServico configuracaoServico = null) + { + var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); + + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + + return RetornoSefaz; + } + + public async Task CancelarDesacordoAsync(ConfiguracaoServico configuracaoServico = null) + { + var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); + + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + + return RetornoSefaz; + } + } +} diff --git a/CTe.Servicos/Factory/ClassesFactory.cs b/CTe.Servicos/Factory/ClassesFactory.cs index e0bc370e0..0c1268686 100644 --- a/CTe.Servicos/Factory/ClassesFactory.cs +++ b/CTe.Servicos/Factory/ClassesFactory.cs @@ -131,6 +131,22 @@ public static evPrestDesacordo CriaEvPrestDesacordo(string indicadorDesacordo, s return evPrestDesacordo; } + public static evCancPrestDesacordo CriaEvCancPrestDesacordo(string nProtEvPrestDes, ConfiguracaoServico configuracaoServico = null) + { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; + + var evPrestDesacordo = new evCancPrestDesacordo + { + nProtEvPrestDes = nProtEvPrestDes + }; + + if (configServico.cUF == Estado.MT)//sem acentuação issue #1386 + { + evPrestDesacordo.descEvento = "Cancelamento Prestacaoo do Servico em Desacordo"; + } + + return evPrestDesacordo; + } public static enviCTe CriaEnviCTe(int lote, List cteEletronicoList, ConfiguracaoServico configuracaoServico = null) { From bb7e221d16a9e3e6931985517f16de5592e9c697 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Tue, 31 Mar 2026 11:39:32 -0300 Subject: [PATCH 02/71] adicionando teste de cancelamento de desacordo em Program.cs --- CTe.AppTeste.NetCore/Program.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CTe.AppTeste.NetCore/Program.cs b/CTe.AppTeste.NetCore/Program.cs index 6ed940b80..e348f7241 100644 --- a/CTe.AppTeste.NetCore/Program.cs +++ b/CTe.AppTeste.NetCore/Program.cs @@ -111,6 +111,9 @@ private static async void Menu() case 10: await EventoDesacordoCTe(); break; + case 11: + await EventoCancelaDesacordoCTe(); + break; } if (Convert.ToInt32(option) > 0) @@ -370,6 +373,23 @@ private static async Task EventoDesacordoCTe() OnSucessoSync(new RetornoEEnvio(retorno)); } + private static async Task EventoCancelaDesacordoCTe() + { + var config = new ConfiguracaoDao().BuscarConfiguracao(); + //CarregarConfiguracoes(config); + var configuracaoServico = MontarConfiguracoes(config); + + var cnpj = RequisitarInput("CNPJ Tomador"); + var chave = RequisitarInput("Chave CTe"); + var sequenciaEvento = int.Parse(RequisitarInput("Sequencia Evento")); + var nProtEventoDesacordo = RequisitarInput("Número do Protocolo do Evento de Desacordo"); + + var servico = new EventoCancelamentoDesacordo(sequenciaEvento, chave, cnpj, nProtEventoDesacordo); + var retorno = await servico.CancelarDesacordoAsync(configuracaoServico); + + OnSucessoSync(new RetornoEEnvio(retorno)); + } + private static async Task CartaCorrecao() { var config = new ConfiguracaoDao().BuscarConfiguracao(); From f331f15fb949c75b59401b70482710f0ea36d08e Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Tue, 31 Mar 2026 11:40:19 -0300 Subject: [PATCH 03/71] adicionando teste de cancelamento de desacordo na tela WPF de teste --- CTe.AppTeste/CTeTesteModel.cs | 16 ++++++++++++++++ CTe.AppTeste/MainWindow.xaml | 4 +++- CTe.AppTeste/MainWindow.xaml.cs | 5 +++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CTe.AppTeste/CTeTesteModel.cs b/CTe.AppTeste/CTeTesteModel.cs index 3d6da00e5..9b23d463f 100644 --- a/CTe.AppTeste/CTeTesteModel.cs +++ b/CTe.AppTeste/CTeTesteModel.cs @@ -793,6 +793,22 @@ public void EventoDesacordoCTe() OnSucessoSync(new RetornoEEnvio(retorno)); } + public void EventoCancelaDesacordoCTe() + { + var config = new ConfiguracaoDao().BuscarConfiguracao(); + CarregarConfiguracoes(config); + + var cnpj = (InputBoxTuche("CNPJ Tomador")); + var chave = (InputBoxTuche("Chave CTe")); + var sequenciaEvento = int.Parse(InputBoxTuche("Sequencia Evento")); + var nProtEventoDesacordo = InputBoxTuche("Número do Protocolo do Evento de Desacordo"); + + var servico = new EventoCancelamentoDesacordo(sequenciaEvento, chave, cnpj, nProtEventoDesacordo); + var retorno = servico.CancelarDesacordo(); + + OnSucessoSync(new RetornoEEnvio(retorno)); + } + public void CartaCorrecao() { var config = new ConfiguracaoDao().BuscarConfiguracao(); diff --git a/CTe.AppTeste/MainWindow.xaml b/CTe.AppTeste/MainWindow.xaml index f928d0d3c..d576a74b3 100644 --- a/CTe.AppTeste/MainWindow.xaml +++ b/CTe.AppTeste/MainWindow.xaml @@ -228,6 +228,7 @@ + @@ -243,8 +244,9 @@ + - + diff --git a/CTe.AppTeste/MainWindow.xaml.cs b/CTe.AppTeste/MainWindow.xaml.cs index cedf228b6..2f8db0d57 100644 --- a/CTe.AppTeste/MainWindow.xaml.cs +++ b/CTe.AppTeste/MainWindow.xaml.cs @@ -88,6 +88,11 @@ private void EventoDesacordoCTe_Click(object sender, RoutedEventArgs e) _model.EventoDesacordoCTe(); } + private void EventoCancelaDesacordoCTe_Click(object sender, RoutedEventArgs e) + { + _model.EventoCancelaDesacordoCTe(); + } + private void CartaCorrecao_Click(object sender, RoutedEventArgs e) { _model.CartaCorrecao(); From f526bf9607ba02aab848472fa3a44c77486d45a6 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Wed, 1 Apr 2026 12:00:15 -0300 Subject: [PATCH 04/71] =?UTF-8?q?BUG=20-=20consulta=20status=20CTe=20com?= =?UTF-8?q?=20configura=C3=A7=C3=B5es=20nullas=20n=C3=A3o=20=C3=A9=20reali?= =?UTF-8?q?zado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CTe.Servicos/ConsultaStatus/StatusServico.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CTe.Servicos/ConsultaStatus/StatusServico.cs b/CTe.Servicos/ConsultaStatus/StatusServico.cs index 1b55b13a6..5cb13721e 100644 --- a/CTe.Servicos/ConsultaStatus/StatusServico.cs +++ b/CTe.Servicos/ConsultaStatus/StatusServico.cs @@ -28,6 +28,9 @@ public retConsStatServCte ConsultaStatus(ConfiguracaoServico configuracaoServico public retConsStatServCTe ConsultaStatusV4(ConfiguracaoServico configuracaoServico = null) { + if (configuracaoServico == null) + configuracaoServico = ConfiguracaoServico.Instancia; + var consStatServCte = ClassesFactory.CriaConsStatServCTe(configuracaoServico); if (configuracaoServico.IsValidaSchemas) From 00759aa05d2a7652a35e8ca365acd329314bc097 Mon Sep 17 00:00:00 2001 From: Renan de Souza Date: Thu, 2 Apr 2026 16:27:42 -0300 Subject: [PATCH 05/71] =?UTF-8?q?Adicionada=20tag=20vTotDFe=20no=20CT-e=20?= =?UTF-8?q?Outros=20Servi=C3=A7os,=20c=C3=B3digo=20copiado=20do=20CT-e.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recebi rejeição hoje sobre isso em SC: 360 - Rejeição: Total do DFe de preenchimento obrigatório. Parece ser exigido somente quando for informado IBS/CBS. --- .../Informacoes/Impostos/impOs.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CTe.Classes/CTeOutrosServicos/Informacoes/Impostos/impOs.cs b/CTe.Classes/CTeOutrosServicos/Informacoes/Impostos/impOs.cs index 058428168..826049626 100644 --- a/CTe.Classes/CTeOutrosServicos/Informacoes/Impostos/impOs.cs +++ b/CTe.Classes/CTeOutrosServicos/Informacoes/Impostos/impOs.cs @@ -24,5 +24,21 @@ public decimal? vTotTrib public infTribFed infTribFed { get; set; } public IBSCBS IBSCBS { get; set; } + + private decimal? _vTotDFe; + /// + /// O total geral do DFe deverá ser a soma do total da prestação + IBS + CBS + /// vTotDFe = vPrest / vTPrest + gIBSCBS / vIBS + gCBS / vCBS + /// + /// Exceção: Em 2026 não somar IBS e CBS + /// Observação: Implementação futura + /// + public decimal? vTotDFe + { + get { return _vTotDFe.Arredondar(2); } + set { _vTotDFe = value.Arredondar(2); } + } + + public bool vTotDFeSpecified { get { return vTotDFe.HasValue; } } } } \ No newline at end of file From da8e0fe99616601f0f31505980fac5672ad44314 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Thu, 2 Apr 2026 18:16:36 -0300 Subject: [PATCH 06/71] adicionando classe do schema de resCTe --- .../DistribuicaoDFe/Schemas/resCTe.cs | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 CTe.Classes/Servicos/DistribuicaoDFe/Schemas/resCTe.cs diff --git a/CTe.Classes/Servicos/DistribuicaoDFe/Schemas/resCTe.cs b/CTe.Classes/Servicos/DistribuicaoDFe/Schemas/resCTe.cs new file mode 100644 index 000000000..638022f1a --- /dev/null +++ b/CTe.Classes/Servicos/DistribuicaoDFe/Schemas/resCTe.cs @@ -0,0 +1,123 @@ +using DFe.Utils; +using System; +using System.ComponentModel; +using System.Xml.Serialization; + +namespace CTe.Classes.Servicos.DistribuicaoDFe.Schemas +{ + /// + /// Resumo de CT-e retornado no docZip com schema resCTe_v1.03.xsd + /// Ref: NT 2015/002 - CTeDistribuicaoDFe + /// + [Serializable()] + [DesignerCategory("code")] + [XmlType(AnonymousType = true, Namespace = "http://www.portalfiscal.inf.br/cte")] + [XmlRoot(Namespace = "http://www.portalfiscal.inf.br/cte", IsNullable = false)] + public class resCTe + { + /// + /// Chave de acesso do CT-e (44 dígitos) + /// + [XmlElement("chCTe")] + public string chCTe { get; set; } + + /// + /// CNPJ do emitente (14 dígitos) + /// + [XmlElement("CNPJ")] + public string CNPJ { get; set; } + + /// + /// Razão social ou nome do emitente + /// + [XmlElement("xNome")] + public string xNome { get; set; } + + /// + /// Inscrição Estadual do emitente + /// + [XmlElement("IE")] + public string IE { get; set; } + + /// + /// Modal do CT-e + /// + /// 01=Rodoviário + /// 02=Aéreo + /// 03=Aquaviário + /// 04=Ferroviário + /// 05=Dutoviário + /// 06=Multimodal + /// + /// + [XmlElement("modal")] + public string modal { get; set; } + + /// + /// Data e hora de emissão do CT-e + /// + [XmlIgnore] + public DateTimeOffset dhEmi { get; set; } + + [XmlElement(ElementName = "dhEmi")] + public string ProxydhEmi + { + get { return dhEmi.ParaDataHoraStringUtc(); } + set { dhEmi = DateTimeOffset.Parse(value); } + } + + /// + /// Tipo do CT-e + /// + /// 0=CT-e Normal + /// 1=CT-e de Complemento de Valores + /// 2=CT-e de Anulação + /// 3=CT-e de Substituição + /// + /// + [XmlElement("tpCTe")] + public string tpCTe { get; set; } + + /// + /// Digest value da assinatura do CT-e + /// + [XmlElement("digVal")] + public string digVal { get; set; } + + /// + /// Data e hora do recebimento pelo Ambiente Nacional + /// + [XmlIgnore] + public DateTimeOffset dhRecbto { get; set; } + + [XmlElement(ElementName = "dhRecbto")] + public string ProxydhRecbto + { + get { return dhRecbto.ParaDataHoraStringUtc(); } + set { dhRecbto = DateTimeOffset.Parse(value); } + } + + /// + /// Número do protocolo de autorização + /// + [XmlElement("nProt")] + public string nProt { get; set; } + + /// + /// Valor a receber pelo transportador + /// + [XmlElement("vRec")] + public string vRec { get; set; } + + /// + /// Situação do CT-e + /// + /// 100=Autorizado o uso do CT-e + /// 101=Cancelamento de CT-e homologado + /// 110=Uso denegado + /// + /// + [XmlElement("cSitCTe")] + public string cSitCTe { get; set; } + } +} From d48b88924de53c378501c377ee22553b40897f23 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Thu, 2 Apr 2026 18:16:48 -0300 Subject: [PATCH 07/71] limpando codigo --- CTe.Classes/Servicos/DistribuicaoDFe/Schemas/procEventoCTe.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/CTe.Classes/Servicos/DistribuicaoDFe/Schemas/procEventoCTe.cs b/CTe.Classes/Servicos/DistribuicaoDFe/Schemas/procEventoCTe.cs index 88e3fc76d..f894ac9d6 100644 --- a/CTe.Classes/Servicos/DistribuicaoDFe/Schemas/procEventoCTe.cs +++ b/CTe.Classes/Servicos/DistribuicaoDFe/Schemas/procEventoCTe.cs @@ -31,7 +31,5 @@ public class procEventoCTe /// [XmlElement(Namespace = "http://www.portalfiscal.inf.br/cte")] public retEventoCTe retEventoCTe { get; set; } - - } } \ No newline at end of file From 3f8f207169044a71b9dd30f29c1c03602153b554 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Thu, 2 Apr 2026 18:17:38 -0300 Subject: [PATCH 08/71] adicionando referencias dos objetos convertidos de XmlNFe no loteDistDFeInt de CTe --- .../Servicos/DistribuicaoDFe/loteDistDFeInt.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CTe.Classes/Servicos/DistribuicaoDFe/loteDistDFeInt.cs b/CTe.Classes/Servicos/DistribuicaoDFe/loteDistDFeInt.cs index ebb3c44df..4a545663c 100644 --- a/CTe.Classes/Servicos/DistribuicaoDFe/loteDistDFeInt.cs +++ b/CTe.Classes/Servicos/DistribuicaoDFe/loteDistDFeInt.cs @@ -1,3 +1,4 @@ +using CTe.Classes.Servicos.DistribuicaoDFe.Schemas; using System; using System.ComponentModel; using System.Xml.Serialization; @@ -36,5 +37,21 @@ public class loteDistDFeInt /// [XmlText(DataType = "base64Binary")] public byte[] XmlNfe { get; set; } + + #region Objetos possíveis para descompactar o conteúdo do campo XmlNfe, dependendo do valor do campo schema + [XmlIgnore] + public cteProc cteProc { get; set; } + + [XmlIgnore] + public resCTe resCTe { get; set; } + + [XmlIgnore] + public CTeOSDocumento.CTe.CTeOS.Retorno.cteOSProc cteOSProc { get; set; } + + [XmlIgnore] + public Classes.Servicos.DistribuicaoDFe.Schemas.procEventoCTe procEventoCTe { get; set; } + + //TO DO: Adicionar no futuro o procGTVe adicionando na versão 1.04 do schema de distribuição de DFe + #endregion } } \ No newline at end of file From a5ab02d90c344dab38e7e2b391ab3baf99eddfa3 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Thu, 2 Apr 2026 18:18:28 -0300 Subject: [PATCH 09/71] preenchendo as referencias dos objetos de XmlNFe durante a consulta CTeDistribuicaoDFe --- .../ServicoCTeDistribuicaoDFe.cs | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/CTe.Servicos/DistribuicaoDFe/ServicoCTeDistribuicaoDFe.cs b/CTe.Servicos/DistribuicaoDFe/ServicoCTeDistribuicaoDFe.cs index 46924cd21..ef1e6f744 100644 --- a/CTe.Servicos/DistribuicaoDFe/ServicoCTeDistribuicaoDFe.cs +++ b/CTe.Servicos/DistribuicaoDFe/ServicoCTeDistribuicaoDFe.cs @@ -63,27 +63,33 @@ public RetornoCteDistDFeInt CTeDistDFeInteresse(string ufAutor, string documento { for (int i = 0; i < retConsulta.loteDistDFeInt.Length; i++) { - string conteudo = Compressao.Unzip(retConsulta.loteDistDFeInt[i].XmlNfe).RemoverDeclaracaoXml(); + var loteAtual = retConsulta.loteDistDFeInt[i]; + string conteudo = Compressao.Unzip(loteAtual.XmlNfe).RemoverDeclaracaoXml(); string chCTe = string.Empty; if (conteudo.StartsWith("(conteudo); - chCTe = retConteudo.protCTe.infProt.chCTe; + var cteConteudo = FuncoesXml.XmlStringParaClasse(conteudo); + chCTe = cteConteudo.protCTe.infProt.chCTe; + loteAtual.cteProc = cteConteudo; } else if (conteudo.StartsWith("(conteudo); chCTe = procEventoNFeConteudo.eventoCTe.infEvento.chCTe; + loteAtual.procEventoCTe = procEventoNFeConteudo; } else if (conteudo.StartsWith("(conteudo); - chCTe = retConteudo.protCTe.infProt.chCTe; + var cteOSConteudo = FuncoesXml.XmlStringParaClasse(conteudo); + chCTe = cteOSConteudo.protCTe.infProt.chCTe; + loteAtual.cteOSProc = cteOSConteudo; } - else + else if (conteudo.StartsWith("(conteudo); + chCTe = resCTeConteudo.chCTe; + loteAtual.resCTe = resCTeConteudo; } string[] schema = retConsulta.loteDistDFeInt[i].schema.Split('_'); From 172d7fe41a3c366407aca64e78fd9e5d21a45631 Mon Sep 17 00:00:00 2001 From: Henrique Teles Ribeiro Date: Thu, 30 Apr 2026 00:12:26 -0300 Subject: [PATCH 10/71] =?UTF-8?q?Exporta=C3=A7=C3=A3O=20PDF=20do=20fast=20?= =?UTF-8?q?report,=20ajuste=20na=20exporta=C3=A7=C3=A3o=20como=20byte[]=20?= =?UTF-8?q?permitindo=20passar=20a=20inst=C3=A2ncia=20do=20report=20por=20?= =?UTF-8?q?fora=20assim=20como=20a=20exporta=C3=A7=C3=A3o=20via=20arquivo?= =?UTF-8?q?=20e=20stream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Danfe.Fast.Skia/DanfeFastBase.cs | 45 ++++++++++++++++++++++++- NFe.Danfe.OpenFast/DanfeOpenFastBase.cs | 28 +++++++++++++-- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/NFe.Danfe.Fast.Skia/DanfeFastBase.cs b/NFe.Danfe.Fast.Skia/DanfeFastBase.cs index 9c46c64b1..f71781017 100644 --- a/NFe.Danfe.Fast.Skia/DanfeFastBase.cs +++ b/NFe.Danfe.Fast.Skia/DanfeFastBase.cs @@ -19,6 +19,7 @@ public void ExportarPdf(string arquivo) Relatorio.Prepare(); Relatorio.Export(new PDFExport(), arquivo); } + /// /// Converte o DANFE para PDF e copia para o stream /// @@ -37,6 +38,27 @@ public void ExportarPdf(Stream outputStream) } } + /// + /// Converte o DANFE para PDF retorna como byte[] + /// + public byte[] ExportarPdf() + { + using (MemoryStream stream = new MemoryStream()) // Create a stream for the report + { + try + { + Relatorio.Prepare(); + Relatorio.Export(new PDFExport(), stream); + return stream.ToArray(); + } + catch (System.Exception ex) + { + throw ex; + } + } + } + + /// /// Converte o DANFE para PDF e salva-o no caminho/arquivo indicado /// @@ -65,7 +87,28 @@ public void ExportarPdf(Stream outputStream, FastReport.Export.ExportBase export Relatorio.Export(exportBase, outputStream); outputStream.Position = 0; } - + + /// + /// Converte o DANFE para PDF retorna como byte[] + /// + /// Instancia do tipo de exportacao do FastReport + public byte[] ExportarPdf(FastReport.Export.ExportBase exportBase) + { + using (MemoryStream stream = new MemoryStream()) // Create a stream for the report + { + try + { + Relatorio.Prepare(); + Relatorio.Export(exportBase, stream); + return stream.ToArray(); + } + catch (System.Exception ex) + { + throw ex; + } + } + } + public byte[] ExportarHtml() { using (MemoryStream stream = new MemoryStream()) // Create a stream for the report diff --git a/NFe.Danfe.OpenFast/DanfeOpenFastBase.cs b/NFe.Danfe.OpenFast/DanfeOpenFastBase.cs index 8d2ce3d08..1eeaf0b27 100644 --- a/NFe.Danfe.OpenFast/DanfeOpenFastBase.cs +++ b/NFe.Danfe.OpenFast/DanfeOpenFastBase.cs @@ -39,6 +39,26 @@ public void ExportarPdf(Stream outputStream) } } + /// + /// Converte o DANFE para PDF retorna como byte[] + /// + public byte[] ExportarPdf() + { + using (MemoryStream stream = new MemoryStream()) // Create a stream for the report + { + try + { + Relatorio.Prepare(); + Relatorio.Export(new PDFSimpleExport(), stream); + return stream.ToArray(); + } + catch (System.Exception ex) + { + throw ex; + } + } + } + /// /// Converte o DANFE para PDF e salva-o no caminho/arquivo indicado /// @@ -68,14 +88,18 @@ public void ExportarPdf(Stream outputStream, FastReport.Export.ExportBase export outputStream.Position = 0; } - public byte[] ExportarPdf() + /// + /// Converte o DANFE para PDF retorna como byte[] + /// + /// Instancia do tipo de exportacao do FastReport + public byte[] ExportarPdf(FastReport.Export.ExportBase exportBase) { using (MemoryStream stream = new MemoryStream()) // Create a stream for the report { try { Relatorio.Prepare(); - Relatorio.Export(new PDFSimpleExport(), stream); + Relatorio.Export(exportBase, stream); return stream.ToArray(); } catch (System.Exception ex) From f7ad77d6de047c81f89776e48466b5e4768fbb6a Mon Sep 17 00:00:00 2001 From: Elielton Bitencourt Date: Mon, 11 May 2026 09:24:42 -0300 Subject: [PATCH 11/71] =?UTF-8?q?NFeRetrato.frx=20adicionado=20verifica?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20null=20em=20volume=20(est=C3=A1=20gerando?= =?UTF-8?q?=20null=20exception=20em=20vers=C3=B5es=20mais=20atuais=20do=20?= =?UTF-8?q?fast)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Danfe.Base/NFe/NFeRetrato.frx | 62 ++++++++++++++++--------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/NFe.Danfe.Base/NFe/NFeRetrato.frx b/NFe.Danfe.Base/NFe/NFeRetrato.frx index 19d2e8cca..38d27f740 100644 --- a/NFe.Danfe.Base/NFe/NFeRetrato.frx +++ b/NFe.Danfe.Base/NFe/NFeRetrato.frx @@ -73,38 +73,40 @@ namespace FastReport } var vol = Report.GetDataSource("NFe.NFe.infNFe.transp.vol"); - vol.Init(); - int qtdeVol = 0; - - int volumes = 0; - decimal pesoL = 0; - decimal pesoB = 0; - while (vol.HasMoreRows) - { - Memo106.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.esp")); - Memo108.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.marca")); - Memo110.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.nVol")); - - volumes += ((Nullable<int>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.qVol")) ?? 0; - pesoL += ((Nullable<decimal>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.pesoL")) ?? 0M; - pesoB += ((Nullable<decimal>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.pesoB")) ?? 0M; - qtdeVol++; - vol.Next(); - } - - if (qtdeVol >= 1) - { - if (qtdeVol > 1) + if(vol != null){ + vol.Init(); + int qtdeVol = 0; + + int volumes = 0; + decimal pesoL = 0; + decimal pesoB = 0; + while (vol.HasMoreRows) { - Memo106.Text = "VOLUMES"; - Memo108.Text = ""; - Memo110.Text = ""; + Memo106.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.esp")); + Memo108.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.marca")); + Memo110.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.nVol")); + + volumes += ((Nullable<int>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.qVol")) ?? 0; + pesoL += ((Nullable<decimal>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.pesoL")) ?? 0M; + pesoB += ((Nullable<decimal>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.pesoB")) ?? 0M; + qtdeVol++; + vol.Next(); } - - Memo104.Text = volumes.ToString(); - Memo112.Text = FormatNumber(pesoB,3) + " KG"; - Memo114.Text = FormatNumber(pesoL,3) + " KG"; - } + + if (qtdeVol >= 1) + { + if (qtdeVol > 1) + { + Memo106.Text = "VOLUMES"; + Memo108.Text = ""; + Memo110.Text = ""; + } + + Memo104.Text = volumes.ToString(); + Memo112.Text = FormatNumber(pesoB,3) + " KG"; + Memo114.Text = FormatNumber(pesoL,3) + " KG"; + } + } if(Engine.FinalPass) { From cc7f12db27c76fc982f6a4ff24f323fa91aac34b Mon Sep 17 00:00:00 2001 From: Douglas Henrique Ferreira Date: Tue, 19 May 2026 21:50:39 -0300 Subject: [PATCH 12/71] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20URLs=20RN=20(#150?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Alteração URL NFCe Sefaz RN, publicado no dia 18/05/2026: https://www.sefaz.rn.gov.br/materia/atencao-desenvolvedores-nfc-e/ --- NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs b/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs index 3c33a49f6..2d3fe602a 100644 --- a/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs +++ b/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs @@ -90,7 +90,7 @@ private static List CarregarUrls() {Estado.PE, versao3E4, "http://nfce.sefaz.pe.gov.br/nfce/consulta"}, {Estado.PI, versao3E4, "http://www.sefaz.pi.gov.br/nfce/qrcode"}, {Estado.RJ, versao3E4, "https://consultadfe.fazenda.rj.gov.br/consultaNFCe/QRCode"}, - {Estado.RN, versao3E4, "http://nfce.set.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp"}, {Estado.RR, versao3E4, "https://www.sefaz.rr.gov.br/nfce/servlet/qrcode"}, @@ -143,7 +143,7 @@ private static List CarregarUrls() {Estado.PE, versao3E4, "http://nfcehomolog.sefaz.pe.gov.br/nfce-web/consultarNFCe"}, {Estado.PI, versao3E4, "http://webas.sefaz.pi.gov.br/nfceweb-homologacao/consultarNFCe.jsf"}, {Estado.RJ, versao3E4, "https://consultadfe.fazenda.rj.gov.br/consultaNFCe/QRCode"}, - {Estado.RN, versao3E4, "http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://hom.nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp"}, {Estado.RR, versao3E4, "http://200.174.88.103:8080/nfce/servlet/qrcode"}, @@ -195,7 +195,7 @@ private static List CarregarUrls() {Estado.PR, versao3E4, "http://www.fazenda.pr.gov.br"}, {Estado.PI, versao3E4, "http://webas.sefaz.pi.gov.br/nfceweb/consultarNFCe.jsf"}, {Estado.RJ, versao3E4, "http://nfce.fazenda.rj.gov.br/consulta"}, - {Estado.RN, versao3E4, "http://nfce.set.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br"}, {Estado.RR, versao3E4, "https://www.sefaz.rr.gov.br/nfce/servlet/wp_consulta_nfce"}, @@ -231,7 +231,7 @@ private static List CarregarUrls() {Estado.PR, versao3E4, "http://www.fazenda.pr.gov.br"}, {Estado.PI, versao3E4, "http://webas.sefaz.pi.gov.br/nfceweb-homologacao/consultarNFCe.jsf"}, {Estado.RJ, versao3E4, "http://nfce.fazenda.rj.gov.br/consulta"}, - {Estado.RN, versao3E4, "http://nfce.set.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br"}, {Estado.RR, versao3E4, "http://200.174.88.103:8080/nfce/servlet/wp_consulta_nfce"}, @@ -269,7 +269,7 @@ private static List CarregarUrls() {Estado.PE, versao3E4, "nfce.sefaz.pe.gov.br/nfce/consulta"}, {Estado.PI, versao3E4, "www.sefaz.pi.gov.br/nfce/consulta"}, {Estado.RJ, versao3E4, "www.fazenda.rj.gov.br/nfce/consulta"}, - {Estado.RN, versao3E4, "www.set.rn.gov.br/nfce/consulta"}, + {Estado.RN, versao3E4, "www.sefaz.rn.gov.br/nfce/consulta"}, {Estado.RS, versao3E4, "www.sefaz.rs.gov.br/nfce/consulta"}, {Estado.RO, versao3E4, "www.sefin.ro.gov.br/nfce/consulta"}, {Estado.RR, versao3E4, "www.sefaz.rr.gov.br/nfce/consulta"} @@ -544,4 +544,4 @@ public static string ObterUrlQrCode3(this infNFeSupl infNFeSupl, Classes.NFe nfe return string.Concat(url, dadosBase); } } -} \ No newline at end of file +} From 1c6c42f14012555c61652ae0888da11ff64e0264 Mon Sep 17 00:00:00 2001 From: "AO3\\paulo.rodrigues" Date: Wed, 20 May 2026 15:59:11 -0300 Subject: [PATCH 13/71] Inserido campos novos NT 2022.002 v1.30a Icms 90 --- .../Detalhe/Tributacao/Estadual/ICMS90.cs | 154 +++++++++++++++--- 1 file changed, 132 insertions(+), 22 deletions(-) diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs index 69e35f70d..462dcc557 100644 --- a/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs @@ -1,13 +1,16 @@ -using NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual.Tipos; using System.Xml.Serialization; +using hypercubev2.dfe.launch.engine.Domain.Model.NFeSefaz.Informacoes.Detalhe.Tributacao.Estadual.Tipos; -namespace NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual +namespace hypercubev2.dfe.launch.engine.Domain.Model.NFeSefaz.Informacoes.Detalhe.Tributacao.Estadual { public class ICMS90 : ICMSBasico { private decimal? _vBc; private decimal? _pRedBc; private decimal? _pIcms; + private decimal? _vICMSOp; + private decimal? _pDif; + private decimal? _vICMSDif; private decimal? _vIcms; private decimal? _pMvast; private decimal? _pRedBcst; @@ -18,6 +21,9 @@ public class ICMS90 : ICMSBasico private decimal? _vBcfcp; private decimal? _pFcp; private decimal? _vFcp; + private decimal? _pFcpDif; + private decimal? _vFcpDif; + private decimal? _vFcpEfet; private decimal? _vBcfcpst; private decimal? _pFcpst; private decimal? _vFcpst; @@ -62,19 +68,75 @@ public decimal? pRedBC } /// - /// N16 - Alíquota do imposto + /// N14a - Código de Benefício Fiscal na UF aplicado ao item quando houver RBC. /// [XmlElement(Order = 6)] + public string? cBenefRBC { get; set; } + + public bool ShouldSerializecBenefRBC() + { + return !string.IsNullOrWhiteSpace(cBenefRBC); + } + + /// + /// N16 - Alíquota do imposto + /// + [XmlElement(Order = 7)] public decimal? pICMS { get { return _pIcms.Arredondar(4); } set { _pIcms = value.Arredondar(4); } } + /// + /// N16b - Valor do ICMS da Operação + /// + [XmlElement(Order = 8)] + public decimal? vICMSOp + { + get { return _vICMSOp.Arredondar(2); } + set { _vICMSOp = value.Arredondar(2); } + } + + public bool ShouldSerializevICMSOp() + { + return vICMSOp.HasValue; + } + + /// + /// N16c - Percentual do diferimento + /// + [XmlElement(Order = 9)] + public decimal? pDif + { + get { return _pDif.Arredondar(4); } + set { _pDif = value.Arredondar(4); } + } + + public bool ShouldSerializepDif() + { + return pDif.HasValue; + } + + /// + /// N16d - Valor do ICMS diferido + /// + [XmlElement(Order = 10)] + public decimal? vICMSDif + { + get { return _vICMSDif.Arredondar(2); } + set { _vICMSDif = value.Arredondar(2); } + } + + public bool ShouldSerializevICMSDif() + { + return vICMSDif.HasValue; + } + /// /// N17 - Valor do ICMS /// - [XmlElement(Order = 7)] + [XmlElement(Order = 11)] public decimal? vICMS { get { return _vIcms.Arredondar(2); } @@ -85,7 +147,7 @@ public decimal? vICMS /// N17a - Valor da Base de Cálculo do FCP /// Versão 4.00 /// - [XmlElement(Order = 8)] + [XmlElement(Order = 12)] public decimal? vBCFCP { get { return _vBcfcp.Arredondar(2); } @@ -101,7 +163,7 @@ public bool vBCFCPSpecified /// N17b - Percentual do Fundo de Combate à Pobreza (FCP) /// Versão 4.00 /// - [XmlElement(Order = 9)] + [XmlElement(Order = 13)] public decimal? pFCP { get { return _pFcp.Arredondar(4); } @@ -117,7 +179,7 @@ public bool pFCPSpecified /// N17c - Valor do Fundo de Combate à Pobreza (FCP) /// Versão 4.00 /// - [XmlElement(Order = 10)] + [XmlElement(Order = 14)] public decimal? vFCP { get { return _vFcp.Arredondar(2); } @@ -129,16 +191,64 @@ public bool vFCPSpecified get { return vFCP.HasValue; } } + /// + /// N17.4 - Percentual do diferimento do ICMS relativo ao Fundo de Combate à Pobreza (FCP) + /// Grupo opcional N17.2 + /// + [XmlElement(Order = 15)] + public decimal? pFCPDif + { + get { return _pFcpDif.Arredondar(4); } + set { _pFcpDif = value.Arredondar(4); } + } + + public bool ShouldSerializepFCPDif() + { + return pFCPDif.HasValue; + } + + /// + /// N17e - Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP) diferido + /// Grupo opcional N17.2 + /// + [XmlElement(Order = 16)] + public decimal? vFCPDif + { + get { return _vFcpDif.Arredondar(2); } + set { _vFcpDif = value.Arredondar(2); } + } + + public bool ShouldSerializevFCPDif() + { + return vFCPDif.HasValue; + } + + /// + /// N17f - Valor efetivo do ICMS relativo ao Fundo de Combate à Pobreza (FCP) realmente devido + /// Grupo opcional N17.1 + /// + [XmlElement(Order = 17)] + public decimal? vFCPEfet + { + get { return _vFcpEfet.Arredondar(2); } + set { _vFcpEfet = value.Arredondar(2); } + } + + public bool ShouldSerializevFCPEfet() + { + return vFCPEfet.HasValue; + } + /// /// N18 - Modalidade de determinação da BC do ICMS ST /// - [XmlElement(Order = 11)] + [XmlElement(Order = 18)] public DeterminacaoBaseIcmsSt? modBCST { get; set; } /// /// N19 - Percentual da margem de valor Adicionado do ICMS ST /// - [XmlElement(Order = 12)] + [XmlElement(Order = 19)] public decimal? pMVAST { get { return _pMvast.Arredondar(4); } @@ -148,7 +258,7 @@ public decimal? pMVAST /// /// N20 - Percentual da Redução de BC do ICMS ST /// - [XmlElement(Order = 13)] + [XmlElement(Order = 20)] public decimal? pRedBCST { get { return _pRedBcst.Arredondar(4); } @@ -158,7 +268,7 @@ public decimal? pRedBCST /// /// N21 - Valor da BC do ICMS ST /// - [XmlElement(Order = 14)] + [XmlElement(Order = 21)] public decimal? vBCST { get { return _vBcst.Arredondar(2); } @@ -168,7 +278,7 @@ public decimal? vBCST /// /// N22 - Alíquota do imposto do ICMS ST /// - [XmlElement(Order = 15)] + [XmlElement(Order = 22)] public decimal? pICMSST { get { return _pIcmsst.Arredondar(4); } @@ -178,7 +288,7 @@ public decimal? pICMSST /// /// N23 - Valor do ICMS ST /// - [XmlElement(Order = 16)] + [XmlElement(Order = 23)] public decimal? vICMSST { get { return _vIcmsst.Arredondar(2); } @@ -189,7 +299,7 @@ public decimal? vICMSST /// N23a - Valor da Base de Cálculo do FCP retido por Substituição Tributária /// Versão 4.00 /// - [XmlElement(Order = 17)] + [XmlElement(Order = 24)] public decimal? vBCFCPST { get { return _vBcfcpst.Arredondar(2); } @@ -205,7 +315,7 @@ public bool vBCFCPSTSpecified /// N23b - Percentual do FCP retido por Substituição Tributária /// Versão 4.00 /// - [XmlElement(Order = 18)] + [XmlElement(Order = 25)] public decimal? pFCPST { get { return _pFcpst.Arredondar(4); } @@ -221,7 +331,7 @@ public bool pFCPSTSpecified /// N23d - Valor do FCP retido por Substituição Tributária /// Versão 4.00 /// - [XmlElement(Order = 19)] + [XmlElement(Order = 26)] public decimal? vFCPST { get { return _vFcpst.Arredondar(2); } @@ -236,7 +346,7 @@ public bool vFCPSTSpecified /// /// N27a - Valor do ICMS desonerado /// - [XmlElement(Order = 20)] + [XmlElement(Order = 27)] public decimal? vICMSDeson { get { return _vIcmsDeson.Arredondar(2); } @@ -246,21 +356,21 @@ public decimal? vICMSDeson /// /// N28 - Motivo da desoneração do ICMS /// - [XmlElement(Order = 21)] + [XmlElement(Order = 28)] public MotivoDesoneracaoIcms? motDesICMS { get; set; } - + /// /// N28b - Indica se o valor do ICMS desonerado (vICMSDeson) deduz /// do valor do item (vProd). (NT 2023.004) /// - [XmlElement(Order = 22)] + [XmlElement(Order = 29)] public DeduzDesoneracaoNoProduto? indDeduzDeson { get; set; } /// /// N33a - Valor do ICMS- ST desonerado /// Versão 4.00 /// - [XmlElement(Order = 23)] + [XmlElement(Order = 30)] public decimal? vICMSSTDeson { get { return _vICMSSTDeson.Arredondar(2); } @@ -276,7 +386,7 @@ public bool ShouldSerializevICMSSTDeson() /// N33b - Motivo da desoneração do ICMS- ST /// Versão 4.00 /// - [XmlElement(Order = 24)] + [XmlElement(Order = 31)] public MotivoDesoneracaoIcmsSt? motDesICMSST { get; set; } public bool ShouldSerializemotDesICMSST() From 158f6492e41e28d8a4086da7accecee7ed14da5c Mon Sep 17 00:00:00 2001 From: "AO3\\paulo.rodrigues" Date: Wed, 20 May 2026 16:16:11 -0300 Subject: [PATCH 14/71] Ajustado padronizacao --- .../Detalhe/Tributacao/Estadual/ICMS90.cs | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs index 462dcc557..1f1e0376b 100644 --- a/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs @@ -73,11 +73,6 @@ public decimal? pRedBC [XmlElement(Order = 6)] public string? cBenefRBC { get; set; } - public bool ShouldSerializecBenefRBC() - { - return !string.IsNullOrWhiteSpace(cBenefRBC); - } - /// /// N16 - Alíquota do imposto /// @@ -98,11 +93,6 @@ public decimal? vICMSOp set { _vICMSOp = value.Arredondar(2); } } - public bool ShouldSerializevICMSOp() - { - return vICMSOp.HasValue; - } - /// /// N16c - Percentual do diferimento /// @@ -113,11 +103,6 @@ public decimal? pDif set { _pDif = value.Arredondar(4); } } - public bool ShouldSerializepDif() - { - return pDif.HasValue; - } - /// /// N16d - Valor do ICMS diferido /// @@ -202,11 +187,6 @@ public decimal? pFCPDif set { _pFcpDif = value.Arredondar(4); } } - public bool ShouldSerializepFCPDif() - { - return pFCPDif.HasValue; - } - /// /// N17e - Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP) diferido /// Grupo opcional N17.2 @@ -218,11 +198,6 @@ public decimal? vFCPDif set { _vFcpDif = value.Arredondar(2); } } - public bool ShouldSerializevFCPDif() - { - return vFCPDif.HasValue; - } - /// /// N17f - Valor efetivo do ICMS relativo ao Fundo de Combate à Pobreza (FCP) realmente devido /// Grupo opcional N17.1 @@ -234,11 +209,6 @@ public decimal? vFCPEfet set { _vFcpEfet = value.Arredondar(2); } } - public bool ShouldSerializevFCPEfet() - { - return vFCPEfet.HasValue; - } - /// /// N18 - Modalidade de determinação da BC do ICMS ST /// @@ -463,5 +433,35 @@ public bool ShouldSerializeindDeduzDeson() { return indDeduzDeson.HasValue; } + + public bool ShouldSerializecBenefRBC() + { + return !string.IsNullOrWhiteSpace(cBenefRBC); + } + + public bool ShouldSerializevICMSOp() + { + return vICMSOp.HasValue; + } + + public bool ShouldSerializepDif() + { + return pDif.HasValue; + } + + public bool ShouldSerializepFCPDif() + { + return pFCPDif.HasValue; + } + + public bool ShouldSerializevFCPDif() + { + return vFCPDif.HasValue; + } + + public bool ShouldSerializevFCPEfet() + { + return vFCPEfet.HasValue; + } } } \ No newline at end of file From a10b04c7912fdb43f28e74689a891273d59c09aa Mon Sep 17 00:00:00 2001 From: adriano_g3 Date: Thu, 21 May 2026 09:30:52 -0300 Subject: [PATCH 15/71] =?UTF-8?q?Corre=C3=A7=C3=A3o=20do=20Namespace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs index 1f1e0376b..975662ff1 100644 --- a/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/Estadual/ICMS90.cs @@ -1,7 +1,7 @@ +using NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual.Tipos; using System.Xml.Serialization; -using hypercubev2.dfe.launch.engine.Domain.Model.NFeSefaz.Informacoes.Detalhe.Tributacao.Estadual.Tipos; -namespace hypercubev2.dfe.launch.engine.Domain.Model.NFeSefaz.Informacoes.Detalhe.Tributacao.Estadual +namespace NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual { public class ICMS90 : ICMSBasico { @@ -71,7 +71,7 @@ public decimal? pRedBC /// N14a - Código de Benefício Fiscal na UF aplicado ao item quando houver RBC. /// [XmlElement(Order = 6)] - public string? cBenefRBC { get; set; } + public string cBenefRBC { get; set; } /// /// N16 - Alíquota do imposto From 86255cede167a0ddc6b05a8a6be9236ccaaa8aa5 Mon Sep 17 00:00:00 2001 From: "AO3\\paulo.rodrigues" Date: Thu, 21 May 2026 09:39:37 -0300 Subject: [PATCH 16/71] =?UTF-8?q?Incluido=20Pagamento=20Instant=C3=A2neo?= =?UTF-8?q?=20e=20TEF=20-=20"Book=20Transfer"=20no=20meio=20pagamento=20(t?= =?UTF-8?q?Pag)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Classes/Informacoes/Pagamento/pagTipos.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/NFe.Classes/Informacoes/Pagamento/pagTipos.cs b/NFe.Classes/Informacoes/Pagamento/pagTipos.cs index 8fe5d630f..9d2d71357 100644 --- a/NFe.Classes/Informacoes/Pagamento/pagTipos.cs +++ b/NFe.Classes/Informacoes/Pagamento/pagTipos.cs @@ -149,6 +149,20 @@ public enum FormaPagamento [Description("Pagamento eletrônico não informado")] [XmlEnum("22")] fpPagamentoEletronicoNaoInformado = 22, + /// + /// 23 - Pagamento Instantâneo (PIX) - Automático + /// + [Description("Pagamento Instantâneo (PIX) - Automático")] + [XmlEnum("23")] + fpPagamentoInstantaneoPIXAutomatico = 23, + + /// + /// 24 - TEF - "Book Transfer" + /// + [Description("TEF - \"Book Transfer\"")] + [XmlEnum("24")] + fpPagamentoBookTransfer = 24, + /// /// 90 - Sem pagamento /// From ce6e2363c4f1f139793fd155cf6266e6e47500f0 Mon Sep 17 00:00:00 2001 From: adriano_g3 Date: Thu, 21 May 2026 11:29:30 -0300 Subject: [PATCH 17/71] =?UTF-8?q?Corre=C3=A7=C3=A3o=20na=20descricao=20do?= =?UTF-8?q?=20evento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CTe.Servicos/Factory/ClassesFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CTe.Servicos/Factory/ClassesFactory.cs b/CTe.Servicos/Factory/ClassesFactory.cs index 0c1268686..dd2986e59 100644 --- a/CTe.Servicos/Factory/ClassesFactory.cs +++ b/CTe.Servicos/Factory/ClassesFactory.cs @@ -142,7 +142,7 @@ public static evCancPrestDesacordo CriaEvCancPrestDesacordo(string nProtEvPrestD if (configServico.cUF == Estado.MT)//sem acentuação issue #1386 { - evPrestDesacordo.descEvento = "Cancelamento Prestacaoo do Servico em Desacordo"; + evPrestDesacordo.descEvento = "Cancelamento Prestacao do Servico em Desacordo"; } return evPrestDesacordo; From 1f95cbe9e3f412e9e832e1dd96718af60a62bdf9 Mon Sep 17 00:00:00 2001 From: William de Camargo Date: Fri, 22 May 2026 14:23:51 -0300 Subject: [PATCH 18/71] =?UTF-8?q?[feat]=20Inclus=C3=A3o=20do=20valor=20tcR?= =?UTF-8?q?etornoRecusaParcialEntrega=20no=20enumerador=20TipoNFeCredito?= =?UTF-8?q?=20em=20conformidade=20com=20a=20NT=202025.002=20v.1.40=20-=20P?= =?UTF-8?q?ublicada=20em=2020/05/2026?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs index eab2df8de..9c3aa0f7f 100644 --- a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs +++ b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs @@ -252,7 +252,11 @@ public enum TipoNFeCredito [Description("Transferência de crédito na sucessão")] [XmlEnum("05")] - tcTransferenciaCreditoSucessao = 05 + tcTransferenciaCreditoSucessao = 05, + + [Description("Retorno por recusa na entrega ou por não localização do destinatário na tentativa de entrega")] + [XmlEnum("06")] + tcRetornoRecusaParcialEntrega = 06 } public enum TipoNFeDebito From 8e0b64b6c75b706624b6637901ae4482e934174c Mon Sep 17 00:00:00 2001 From: William de Camargo Date: Tue, 2 Jun 2026 08:45:07 -0300 Subject: [PATCH 19/71] [fix] Removido caracter ; do final dos descriptions. --- .../Informacoes/Identificacao/Tipos/ideTipos.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs index d6bcca3b8..aef5ce72b 100644 --- a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs +++ b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs @@ -261,23 +261,23 @@ public enum TipoNFeCredito public enum TipoNFeDebito { - [Description("Transferência de créditos para Cooperativas;")] + [Description("Transferência de créditos para Cooperativas")] [XmlEnum("01")] tdTransferenciaCreditoCooperativa = 01, - [Description("Anulação de Crédito por Saídas Imunes/Isentas;")] + [Description("Anulação de Crédito por Saídas Imunes/Isentas")] [XmlEnum("02")] tdAnulacao = 02, - [Description("Débitos de notas fiscais não processadas na apuração;")] + [Description("Débitos de notas fiscais não processadas na apuração")] [XmlEnum("03")] tdDebitosNaoProcessadas = 03, - [Description("Multa e juros;")] + [Description("Multa e juros")] [XmlEnum("04")] tdMultaJuros = 04, - [Description("Transferência de crédito na sucessão;")] + [Description("Transferência de crédito na sucessão")] [XmlEnum("05")] tdTransferenciaCreditoSucessao = 05, From 0b5e42817e57e610180e5a10fc8a12ca9157b205 Mon Sep 17 00:00:00 2001 From: adriano_g3 Date: Tue, 9 Jun 2026 16:52:11 -0300 Subject: [PATCH 20/71] =?UTF-8?q?As=20novas=20urls=20disponibilizadas=20qu?= =?UTF-8?q?e=20seriam=20a=20partir=20de=2018/05,=20est=C3=A3o=20com=20algu?= =?UTF-8?q?m=20problema.=20Testes=20em=20Produ=C3=A7=C3=A3o=20QrCode=202.0?= =?UTF-8?q?=20e=20em=20Homologa=C3=A7=C3=A3o=20QrCode=202.0=20e=203.0=20-?= =?UTF-8?q?=20todos=20com=20Sucesso:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PRODUÇÃO URL QRCODE..: http://nfce.set.rn.gov.br/consultarNFCe.aspx -> (é a Antiga) URL Consulta: https://nfce.sefaz.rn.gov.br/portalDFE/NFCe/ConsultaNFCe.aspx -> (é a Nova) HOMOLOGAÇÃO URL QRCODE..: http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx -> (é a Antiga) URL Consulta: www.set.rn.gov.br/nfce/consulta -> (é a Antiga) --- .../InformacoesSuplementares/ExtinfNFeSupl.cs | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs b/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs index 2d3fe602a..0a2e5a019 100644 --- a/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs +++ b/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs @@ -90,7 +90,7 @@ private static List CarregarUrls() {Estado.PE, versao3E4, "http://nfce.sefaz.pe.gov.br/nfce/consulta"}, {Estado.PI, versao3E4, "http://www.sefaz.pi.gov.br/nfce/qrcode"}, {Estado.RJ, versao3E4, "https://consultadfe.fazenda.rj.gov.br/consultaNFCe/QRCode"}, - {Estado.RN, versao3E4, "http://nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://nfce.set.rn.gov.br/consultarNFCe.aspx"}, //{Estado.RN, versao3E4, "https://nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp"}, {Estado.RR, versao3E4, "https://www.sefaz.rr.gov.br/nfce/servlet/qrcode"}, @@ -143,7 +143,7 @@ private static List CarregarUrls() {Estado.PE, versao3E4, "http://nfcehomolog.sefaz.pe.gov.br/nfce-web/consultarNFCe"}, {Estado.PI, versao3E4, "http://webas.sefaz.pi.gov.br/nfceweb-homologacao/consultarNFCe.jsf"}, {Estado.RJ, versao3E4, "https://consultadfe.fazenda.rj.gov.br/consultaNFCe/QRCode"}, - {Estado.RN, versao3E4, "http://hom.nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx"}, //{Estado.RN, versao3E4, "https://hom.nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp"}, {Estado.RR, versao3E4, "http://200.174.88.103:8080/nfce/servlet/qrcode"}, @@ -195,7 +195,7 @@ private static List CarregarUrls() {Estado.PR, versao3E4, "http://www.fazenda.pr.gov.br"}, {Estado.PI, versao3E4, "http://webas.sefaz.pi.gov.br/nfceweb/consultarNFCe.jsf"}, {Estado.RJ, versao3E4, "http://nfce.fazenda.rj.gov.br/consulta"}, - {Estado.RN, versao3E4, "http://nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://nfce.set.rn.gov.br/consultarNFCe.aspx"}, //{Estado.RN, versao3E4, "https://nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br"}, {Estado.RR, versao3E4, "https://www.sefaz.rr.gov.br/nfce/servlet/wp_consulta_nfce"}, @@ -231,7 +231,7 @@ private static List CarregarUrls() {Estado.PR, versao3E4, "http://www.fazenda.pr.gov.br"}, {Estado.PI, versao3E4, "http://webas.sefaz.pi.gov.br/nfceweb-homologacao/consultarNFCe.jsf"}, {Estado.RJ, versao3E4, "http://nfce.fazenda.rj.gov.br/consulta"}, - {Estado.RN, versao3E4, "http://nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx"}, //{Estado.RN, versao3E4, "https://hom.nfce.sefaz.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br"}, {Estado.RR, versao3E4, "http://200.174.88.103:8080/nfce/servlet/wp_consulta_nfce"}, @@ -257,22 +257,21 @@ private static List CarregarUrls() { {Estado.AC, versao3E4, "www.sefaznet.ac.gov.br/nfce/consulta"}, {Estado.AL, versao3E4, "www.sefaz.al.gov.br/nfce/consulta"}, - {Estado.AP, versao3E4, "www.sefaz.ap.gov.br/nfce/consulta"}, {Estado.AM, versao3E4, "www.sefaz.am.gov.br/nfce/consulta"}, + {Estado.AP, versao3E4, "www.sefaz.ap.gov.br/nfce/consulta"}, {Estado.CE, versao3E4, "www.sefaz.ce.gov.br/nfce/consulta"}, {Estado.DF, versao3E4, "www.fazenda.df.gov.br/nfce/consulta"}, {Estado.ES, versao3E4, "www.sefaz.es.gov.br/nfce/consulta"}, {Estado.MA, versao3E4, "www.sefaz.ma.gov.br/nfce/consulta"}, {Estado.MS, versao3E4, "http://www.dfe.ms.gov.br/nfce"}, {Estado.PA, versao3E4, "www.sefa.pa.gov.br/nfce/consulta"}, - {Estado.PR, versao3E4, "http://www.fazenda.pr.gov.br/nfce/consulta"}, {Estado.PE, versao3E4, "nfce.sefaz.pe.gov.br/nfce/consulta"}, {Estado.PI, versao3E4, "www.sefaz.pi.gov.br/nfce/consulta"}, + {Estado.PR, versao3E4, "http://www.fazenda.pr.gov.br/nfce/consulta"}, {Estado.RJ, versao3E4, "www.fazenda.rj.gov.br/nfce/consulta"}, - {Estado.RN, versao3E4, "www.sefaz.rn.gov.br/nfce/consulta"}, - {Estado.RS, versao3E4, "www.sefaz.rs.gov.br/nfce/consulta"}, {Estado.RO, versao3E4, "www.sefin.ro.gov.br/nfce/consulta"}, - {Estado.RR, versao3E4, "www.sefaz.rr.gov.br/nfce/consulta"} + {Estado.RR, versao3E4, "www.sefaz.rr.gov.br/nfce/consulta"}, + {Estado.RS, versao3E4, "www.sefaz.rs.gov.br/nfce/consulta"} }; adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsConsultaHomologacaoEProducao2); @@ -285,14 +284,15 @@ private static List CarregarUrls() var urlsConsultaProducao2 = new TupleList { {Estado.BA, versao3E4, "www.sefaz.ba.gov.br/nfce/consulta"}, + {Estado.GO, versao3E4, "www.sefaz.go.gov.br/nfce/consulta"}, + {Estado.MG, versao3E4, "https://portalsped.fazenda.mg.gov.br/portalnfce"}, {Estado.MT, versao3E4, "http://www.sefaz.mt.gov.br/nfce/consultanfce"}, {Estado.PB, versao3E4, "www.receita.pb.gov.br/nfce/consulta"}, + {Estado.RN, versao3E4, "https://nfce.sefaz.rn.gov.br/portalDFE/NFCe/ConsultaNFCe.aspx"}, + {Estado.SC, versao3E4, "https://sat.sef.sc.gov.br/nfce/consulta" }, {Estado.SP, versao3E4, "https://www.nfce.fazenda.sp.gov.br/consulta"}, {Estado.SE, versao3E4, "http://www.nfce.se.gov.br/nfce/consulta"}, - {Estado.GO, versao3E4, "www.sefaz.go.gov.br/nfce/consulta"}, - {Estado.MG, versao3E4, "https://portalsped.fazenda.mg.gov.br/portalnfce"}, - {Estado.TO, versao3E4, "www.sefaz.to.gov.br/nfce/consulta"}, - {Estado.SC, versao3E4, "https://sat.sef.sc.gov.br/nfce/consulta" } + {Estado.TO, versao3E4, "www.sefaz.to.gov.br/nfce/consulta"} }; adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsConsultaProducao2); @@ -304,14 +304,15 @@ private static List CarregarUrls() var urlsConsultaHomologacao2 = new TupleList { {Estado.BA, versao3E4, "http://hinternet.sefaz.ba.gov.br/nfce/consulta"}, + {Estado.GO, versao3E4, "https://nfewebhomolog.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe"}, + {Estado.MG, versao3E4, "https://hportalsped.fazenda.mg.gov.br/portalnfce"}, {Estado.MT, versao3E4, "http://homologacao.sefaz.mt.gov.br/nfce/consultanfce"}, {Estado.PB, versao3E4, "www.receita.pb.gov.br/nfcehom"}, + {Estado.RN, versao3E4, "www.set.rn.gov.br/nfce/consulta"}, + {Estado.SC, versao3E4, "https://hom.sat.sef.sc.gov.br/nfce/consulta" }, {Estado.SP, versao3E4, "https://www.homologacao.nfce.fazenda.sp.gov.br/consulta"}, {Estado.SE, versao3E4, "http://www.hom.nfe.se.gov.br/nfce/consulta"}, - {Estado.GO, versao3E4, "https://nfewebhomolog.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe"}, - {Estado.MG, versao3E4, "https://hportalsped.fazenda.mg.gov.br/portalnfce"}, - {Estado.TO, versao3E4, "http://homologacao.sefaz.to.gov.br/nfce/consulta.jsf" }, - {Estado.SC, versao3E4, "https://hom.sat.sef.sc.gov.br/nfce/consulta" } + {Estado.TO, versao3E4, "http://homologacao.sefaz.to.gov.br/nfce/consulta.jsf" } }; adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsConsultaHomologacao2); From 36b0a9fc804ed381c5568c95f7b4fc9d62bb1793 Mon Sep 17 00:00:00 2001 From: adriano_g3 Date: Tue, 9 Jun 2026 17:21:25 -0300 Subject: [PATCH 21/71] =?UTF-8?q?Adicionado=20nos=20M=C3=A9todos=20para=20?= =?UTF-8?q?Obter=20Certificado=20de=20Reposit=C3=B3rio=20do=20Windows=20o?= =?UTF-8?q?=20argumento=20StoreLocation=20com=20padr=C3=A3o=20CurrentUser,?= =?UTF-8?q?=20deixando=20opcional=20a=20mudan=C3=A7a=20como=20por=20exempl?= =?UTF-8?q?o=20LocalMachine=20onde=20em=20casos=20onde=20esteja=20usando?= =?UTF-8?q?=20API=20ou=20WebService=20via=20IIS=20no=20Windows=20Server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DFe.Utils/Assinatura/CertificadoDigital.cs | 18 +++++++++--------- DFe.Utils/CertificadoDigitalUtils.cs | 4 ++-- DFe.Utils/ConfiguracaoCertificado.cs | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/DFe.Utils/Assinatura/CertificadoDigital.cs b/DFe.Utils/Assinatura/CertificadoDigital.cs index 72271ece1..88d23df8b 100644 --- a/DFe.Utils/Assinatura/CertificadoDigital.cs +++ b/DFe.Utils/Assinatura/CertificadoDigital.cs @@ -19,9 +19,9 @@ public static class CertificadoDigital /// /// /// - public static X509Store ObterX509Store(OpenFlags openFlags) + public static X509Store ObterX509Store(OpenFlags openFlags, StoreLocation storeLocation = StoreLocation.CurrentUser) { - var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); + X509Store store = new X509Store(StoreName.My, storeLocation); store.Open(openFlags); return store; } @@ -56,7 +56,7 @@ private static X509Certificate2 ObterDoArrayBytes(byte[] arrayBytes, string senh { try { - var certificado = new X509Certificate2(arrayBytes, senha, keyStorageFlag); + X509Certificate2 certificado = new X509Certificate2(arrayBytes, senha, keyStorageFlag); return certificado; } catch (Exception ex) @@ -69,12 +69,12 @@ private static X509Certificate2 ObterDoArrayBytes(byte[] arrayBytes, string senh /// Obtém um objeto pelo serial passado no parÂmetro /// /// - private static X509Certificate2 ObterDoRepositorio(string serial, OpenFlags opcoesDeAbertura) + private static X509Certificate2 ObterDoRepositorio(string serial, OpenFlags opcoesDeAbertura, StoreLocation storeLocation = StoreLocation.CurrentUser) { if (string.IsNullOrEmpty(serial)) throw new ArgumentException("O número de série do certificado digital não foi informado!"); X509Certificate2 certificado = null; - var store = ObterX509Store(opcoesDeAbertura); + var store = ObterX509Store(opcoesDeAbertura, storeLocation); try { foreach (var item in store.Certificates) @@ -100,9 +100,9 @@ private static X509Certificate2 ObterDoRepositorio(string serial, OpenFlags opco /// /// /// - private static X509Certificate2 ObterDoRepositorioPassandoPin(string serial, string senha = null) + private static X509Certificate2 ObterDoRepositorioPassandoPin(string serial, string senha = null, StoreLocation storeLocation = StoreLocation.CurrentUser) { - var certificado = ObterDoRepositorio(serial, OpenFlags.ReadOnly); + var certificado = ObterDoRepositorio(serial, OpenFlags.ReadOnly, storeLocation); if (string.IsNullOrEmpty(senha)) return certificado; certificado.DefinirPinParaChavePrivada(senha); return certificado; @@ -154,13 +154,13 @@ private static X509Certificate2 ObterDadosCertificado(ConfiguracaoCertificado co switch (configuracaoCertificado.TipoCertificado) { case TipoCertificado.A1Repositorio: - return ObterDoRepositorio(configuracaoCertificado.Serial, OpenFlags.MaxAllowed); + return ObterDoRepositorio(configuracaoCertificado.Serial, OpenFlags.MaxAllowed, configuracaoCertificado.StoreLocation); case TipoCertificado.A1ByteArray: return ObterDoArrayBytes(configuracaoCertificado.ArrayBytesArquivo, configuracaoCertificado.Senha, configuracaoCertificado.KeyStorageFlags); case TipoCertificado.A1Arquivo: return ObterDeArquivo(configuracaoCertificado.Arquivo, configuracaoCertificado.Senha, configuracaoCertificado.KeyStorageFlags); case TipoCertificado.A3: - return ObterDoRepositorioPassandoPin(configuracaoCertificado.Serial, configuracaoCertificado.Senha); + return ObterDoRepositorioPassandoPin(configuracaoCertificado.Serial, configuracaoCertificado.Senha, configuracaoCertificado.StoreLocation); default: throw new ArgumentOutOfRangeException(); } diff --git a/DFe.Utils/CertificadoDigitalUtils.cs b/DFe.Utils/CertificadoDigitalUtils.cs index 178f71ea8..9b9067c37 100644 --- a/DFe.Utils/CertificadoDigitalUtils.cs +++ b/DFe.Utils/CertificadoDigitalUtils.cs @@ -16,9 +16,9 @@ public class CertificadoDigitalUtils /// Exibe a lista de certificados instalados no PC e devolve o certificado selecionado /// /// - public static X509Certificate2 ListareObterDoRepositorio() + public static X509Certificate2 ListareObterDoRepositorio(StoreLocation storeLocation = StoreLocation.CurrentUser) { - var store = CertificadoDigital.ObterX509Store(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly); + var store = CertificadoDigital.ObterX509Store(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly, storeLocation); var collection = store.Certificates; var fcollection = collection.Find(X509FindType.FindByTimeValid, DateTime.Now, true); var scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Certificados válidos:", "Selecione o certificado que deseja usar", diff --git a/DFe.Utils/ConfiguracaoCertificado.cs b/DFe.Utils/ConfiguracaoCertificado.cs index 2f14e0f61..29d1cdef5 100644 --- a/DFe.Utils/ConfiguracaoCertificado.cs +++ b/DFe.Utils/ConfiguracaoCertificado.cs @@ -28,9 +28,11 @@ public class ConfiguracaoCertificado private string _cacheId; private byte[] _arrayBytesArquivo; private X509KeyStorageFlags _keyStorageFlags; + private StoreLocation _storeLocation; public ConfiguracaoCertificado() { + StoreLocation = StoreLocation.CurrentUser; KeyStorageFlags = X509KeyStorageFlags.MachineKeySet; SignatureMethodSignedXml = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"; DigestMethodReference = "http://www.w3.org/2000/09/xmldsig#sha1"; @@ -162,5 +164,19 @@ public X509KeyStorageFlags KeyStorageFlags _keyStorageFlags = value; } } + + /// + /// + /// + public StoreLocation StoreLocation + { + get { return _storeLocation; } + set + { + if (value == _storeLocation) + return; + _storeLocation = value; + } + } } } \ No newline at end of file From 0b7f8a24bc8080148f1b4efbe0de723cc1d3be38 Mon Sep 17 00:00:00 2001 From: adriano_g3 Date: Mon, 15 Jun 2026 17:13:24 -0300 Subject: [PATCH 22/71] =?UTF-8?q?Adicionado=20Schemas=20para=20Valida?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20CNPJ=20Alfanum=C3=A9rico,=20retirado=20val?= =?UTF-8?q?ida=C3=A7=C3=A3o=20num=C3=A9rica=20de=20propriedades=20CNPJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CTe.Classes/Informacoes/autXML.cs | 22 +- .../Servicos/DistribuicaoDFe/distDFeInt.cs | 26 +- CTe.Classes/Servicos/Evento/dest.cs | 33 +- NFe.AppTeste/MainWindow.xaml.cs | 3 +- .../Schemas/DFeTiposBasicos_v1.00.xsd | 475 +++++++++++++----- .../Schemas/leiauteConsSitNFe_v4.00.xsd | 3 +- NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd | 2 +- NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd | 174 ++++++- NFe.AppTeste/Schemas/nfe_v4.00.xsd | 3 +- NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd | 22 +- NFe.Classes/Informacoes/Destinatario/dest.cs | 46 +- NFe.Classes/Informacoes/Emitente/emit.cs | 23 +- .../Informacoes/Transporte/transporta.cs | 22 +- NFe.Classes/Informacoes/autXML.cs | 22 +- NFe.Classes/Informacoes/entrega.cs | 22 +- NFe.Classes/Informacoes/retirada.cs | 22 +- .../Servicos/ConsultaCadastro/infConsEnv.cs | 33 +- .../Servicos/DistribuicaoDFe/distDFeInt.cs | 22 +- NFe.Classes/Servicos/Evento/dest.cs | 30 +- NFe.Classes/Servicos/Evento/infEventoEnv.cs | 22 +- NFe.Classes/Servicos/Evento/infEventoRet.cs | 22 +- 21 files changed, 696 insertions(+), 353 deletions(-) diff --git a/CTe.Classes/Informacoes/autXML.cs b/CTe.Classes/Informacoes/autXML.cs index b95f446b9..b2972fec9 100644 --- a/CTe.Classes/Informacoes/autXML.cs +++ b/CTe.Classes/Informacoes/autXML.cs @@ -16,13 +16,12 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cpf)) - cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cnpj = value; } } @@ -34,13 +33,12 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cnpj)) - cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cpf = value; } } } diff --git a/CTe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs b/CTe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs index e27dfcf7b..3b6a5c32a 100644 --- a/CTe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs +++ b/CTe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs @@ -38,13 +38,12 @@ public string CNPJ get { return _cNPJ; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(_cPF)) - _cNPJ = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(_cPF)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + _cNPJ = value; } } @@ -56,13 +55,12 @@ public string CPF get { return _cPF; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(_cNPJ)) - _cPF = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(_cNPJ)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + _cPF = value; } } @@ -74,8 +72,6 @@ public string CPF /// /// A09 - Grupo para consultar um DF-e a partir de um NSU específico /// - public consNSU consNSU { get; set; } - - + public consNSU consNSU { get; set; } } } \ No newline at end of file diff --git a/CTe.Classes/Servicos/Evento/dest.cs b/CTe.Classes/Servicos/Evento/dest.cs index 80442024b..e74732b9a 100644 --- a/CTe.Classes/Servicos/Evento/dest.cs +++ b/CTe.Classes/Servicos/Evento/dest.cs @@ -27,13 +27,12 @@ public string CNPJ get { return _cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CPF) & string.IsNullOrEmpty(idEstrangeiro)) - _cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CPF) || !string.IsNullOrEmpty(idEstrangeiro)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); - } + + _cnpj = value; } } @@ -45,13 +44,12 @@ public string CPF get { return _cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CNPJ) & string.IsNullOrEmpty(idEstrangeiro)) - _cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(idEstrangeiro)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); - } + + _cpf = value; } } @@ -63,13 +61,12 @@ public string idEstrangeiro get { return _idEstrangeiro; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CNPJ) & string.IsNullOrEmpty(CPF)) - _idEstrangeiro = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(CPF)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); - } + + _idEstrangeiro = value; } } diff --git a/NFe.AppTeste/MainWindow.xaml.cs b/NFe.AppTeste/MainWindow.xaml.cs index e34e9f67e..8c8204798 100644 --- a/NFe.AppTeste/MainWindow.xaml.cs +++ b/NFe.AppTeste/MainWindow.xaml.cs @@ -1431,7 +1431,8 @@ protected virtual dest GetDestinatario(VersaoServico versao, ModeloDocumento mod { var dest = new dest(versao) { - CNPJ = "99999999000191", + CNPJ = "0ZEN3MS8000127", + //CNPJ = "99999999000191", //CPF = "99999999999", }; dest.xNome = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"; //Obrigatório para NFe e opcional para NFCe diff --git a/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd b/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd index 86da44c50..a5051dd02 100644 --- a/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd +++ b/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd @@ -1,5 +1,5 @@ - + @@ -28,7 +28,16 @@ - + + + Código de Classificação do Crédito Presumido do IBS e da CBS, conforme tabela cCredPres + + + + + + + Tipo Decimal com 15 dígitos, sendo 11 de corpo e 4 decimais @@ -37,7 +46,7 @@ - + Tipo Decimal com 11 inteiros, podendo ter 4 decimais (utilizado em tags opcionais) @@ -46,7 +55,7 @@ - + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais @@ -55,7 +64,7 @@ - + Tipo Decimal com até 3 dígitos inteiros, podendo ter de 2 até 4 decimais @@ -98,6 +107,14 @@ + + + Tipo Indicador de Doação + + + + + Grupo de informações da Tributação da NFCom @@ -109,7 +126,17 @@ + + + Indica se a operação é de doação + + + + + Informado conforme indicador no cClassTrib + + @@ -123,7 +150,37 @@ + + + Indica se a operação é de doação + + + + + + Informado conforme indicador no cClassTrib + + + + + + + Grupo de informações da Tributação da NFAg + + + + + Código Situação Tributária do IBS/CBS + + + + + + + Informado conforme indicador no cClassTrib + + @@ -137,7 +194,13 @@ + + + + Informado conforme indicador no cClassTrib + + @@ -151,7 +214,13 @@ + + + + Informado conforme indicador no cClassTrib + + @@ -165,6 +234,11 @@ + + + Indica se a operação é de doação + + @@ -182,11 +256,16 @@ + + + Indica se a operação é de doação + + - Informar essa opção da Choice para Monofasia + Informar essa opção da Choice para Monofasia (CST 620) @@ -194,10 +273,54 @@ Informar essa opção da Choice para o CST 800 + + + Informar essa opção da Choice para o CST 811 + + - + - Classificação de acordo com o art. 450, § 1º, da LC 214/25 para o cálculo do crédito presumido na ZFM + Informado conforme indicador no cClassTrib + + + + + + Crédito Presumido da Operação. Informado conforme indicador no cClassTrib. + + + + + Classificação de acordo com o art. 450, § 1º, da LC 214/25 para o cálculo do crédito presumido na ZFM. Informado conforme indicador no cClassTrib. + + + + + + + + Grupo de informações da Tributação da NFGas + + + + + Código Situação Tributária do IBS/CBS + + + + + + + + + Informar essa opção da Choice para Monofasia + + + + + + Informado conforme indicador no cClassTrib @@ -214,17 +337,17 @@ - + Valor do BC - + Alíquota do Imposto Seletivo (percentual) - + Alíquota do Imposto Seletivo (por valor) @@ -241,13 +364,13 @@ - + Quantidade com abse no campo uTrib informado - + Valor do Imposto Seletivo calculado @@ -260,7 +383,7 @@ Grupo de informações de totais do Imposto Seletivo - + Valor Total do Imposto Seletivo @@ -272,7 +395,7 @@ Grupo de informações de totais da CBS/IBS - + Total Base de Calculo @@ -289,17 +412,17 @@ - + Total do Diferimento - + Total de devoluções de tributos - + Valor total do IBS Estadual @@ -313,17 +436,17 @@ - + Total do Diferimento - + Total de devoluções de tributos - + Valor total do IBS Municipal @@ -331,21 +454,11 @@ - + Valor total do IBS - - - Total do Crédito Presumido - - - - - Total do Crédito Presumido Condição Suspensiva - - @@ -355,29 +468,38 @@ - + Total do Diferimento - + Total de devoluções de tributos - + Valor total da CBS - + + + + + + Totalização do estorno de crédito + + + + - Total do Crédito Presumido + Valor total do IBS estornado - + - Total do Crédito Presumido Condição Suspensiva + Valor total da CBS estornada @@ -390,7 +512,7 @@ Grupo de informações de totais da CBS/IBS com monofasia - + Total Base de Calculo @@ -407,17 +529,17 @@ - + Total do Diferimento - + Total de devoluções de tributos - + Valor total do IBS Estadual @@ -431,17 +553,17 @@ - + Total do Diferimento - + Total de devoluções de tributos - + Valor total do IBS Municipal @@ -449,17 +571,17 @@ - + Valor total do IBS - + Total do Crédito Presumido - + Total do Crédito Presumido Condição Suspensiva @@ -473,27 +595,27 @@ - + Total do Diferimento - + Total de devoluções de tributos - + Valor total da CBS - + Total do Crédito Presumido - + Total do Crédito Presumido Condição Suspensiva @@ -508,32 +630,32 @@ - + Valor total do IBS monofásico - + Valor total da CBS monofásica - + Valor total do IBS monofásico sujeito a retenção - + Valor total da CBS monofásica sujeita a retenção - + Valor do IBS monofásico retido anteriormente - + Valor da CBS monofásica retida anteriormente @@ -541,6 +663,25 @@ + + + Totalização do estorno de crédito + + + + + + Valor total do IBS estornado + + + + + Valor total da CBS estornada + + + + + @@ -557,27 +698,27 @@ - + Quantidade tributada na monofasia - + Alíquota ad rem do IBS - + Alíquota ad rem da CBS - + Valor do IBS monofásico - + Valor da CBS monofásica @@ -591,27 +732,27 @@ - + Quantidade tributada sujeita a retenção. - + Alíquota ad rem do IBS sujeito a retenção - + Valor do IBS monofásico sujeito a retenção - + Alíquota ad rem da CBS sujeita a retenção - + Valor da CBS monofásica sujeita a retenção @@ -625,27 +766,27 @@ - + Quantidade tributada retida anteriormente - + Alíquota ad rem do IBS retido anteriormente - + Valor do IBS retido anteriormente - + Alíquota ad rem da CBS retida anteriormente - + Valor da CBS retida anteriormente @@ -659,22 +800,22 @@ - + Percentual do diferimento do imposto monofásico - + Valor do IBS monofásico diferido - + Percentual do diferimento do imposto monofásico - + Valor da CBS monofásica diferida @@ -682,12 +823,12 @@ - + Total de IBS monofásico do item - + Total da CBS monofásica do item @@ -702,7 +843,7 @@ IBS / CBS - + Valor do BC @@ -714,9 +855,9 @@ - + - Aliquota do IBS de competência das UF + Aliquota do IBS de competência das UF (em percentual) @@ -734,7 +875,7 @@ Grupo de campos da redução de aliquota - + Valor do IBS de competência das UF @@ -748,9 +889,9 @@ - + - Aliquota do IBS Municipal + Aliquota do IBS Municipal (em percentual) @@ -768,7 +909,7 @@ Grupo de campos da redução de aliquota - + Valor do IBS Municipal @@ -776,7 +917,7 @@ - + Valor do IBS @@ -788,9 +929,9 @@ - + - Aliquota da CBS + Aliquota da CBS (em percentual) @@ -808,7 +949,7 @@ Grupo de campos da redução de aliquota - + Valor da CBS @@ -821,16 +962,6 @@ Grupo de informações da Tributação Regular. Informar como seria a tributação caso não cumprida a condição resolutória/suspensiva. Exemplo 1: Art. 442, §4. Operações com ZFM e ALC. Exemplo 2: Operações com suspensão do tributo. - - - Grupo de Informações do Crédito Presumido referente ao IBS, quando aproveitado pelo emitente do documento. - - - - - Grupo de Informações do Crédito Presumido referente a CBS, quando aproveitado pelo emitente do documento. - - Grupo de informações da composição do valor do IBS e da CBS em compras governamental @@ -843,14 +974,14 @@ Tipo Redução Base de Cálculo - + Percentual de redução de aliquota do cClassTrib - + - Aliquota Efetiva que será aplicada a Base de Calculo + Aliquota Efetiva que será aplicada a Base de Calculo (em percentual) @@ -860,23 +991,18 @@ Tipo Crédito Presumido - - - Usar tabela Cred Presumido, para o emitente da nota. - - - + Percentual do Crédito Presumido - + Valor do Crédito Presumido - + Valor do Crédito Presumido Condição Suspensiva, preencher apenas para cCredPres que possui indicação de Condição Suspensiva @@ -889,12 +1015,12 @@ Tipo Diferimento - + Percentual do diferimento - + Valor do diferimento @@ -906,7 +1032,7 @@ Tipo Devolução Tributo - + Valor do tributo devolvido. No fornecimento de energia elétrica, água, esgoto e gás natural e em outras hipóteses definidas no regulamento @@ -930,37 +1056,37 @@ gás natural e em outras hipóteses definidas no regulamento Informar qual seria o cClassTrib caso não cumprida a condição resolutória/suspensiva - + Alíquota do IBS da UF Informar como seria a Alíquota caso não cumprida a condição resolutória/suspensiva - + Valor do IBS da UF Informar como seria o valor do Tributo caso não cumprida a condição resolutória/suspensiva - + Alíquota do IBS do Município Informar como seria a Alíquota caso não cumprida a condição resolutória/suspensiva - + Valor do IBS do Município Informar como seria o valor do Tributo caso não cumprida a condição resolutória/suspensiva - + Alíquota da CBS Informar como seria a Alíquota caso não cumprida a condição resolutória/suspensiva - + Valor da CBS Informar como seria o valor do Tributo caso não cumprida a condição resolutória/suspensiva @@ -973,20 +1099,20 @@ gás natural e em outras hipóteses definidas no regulamento Tipo Tributação Compra Governamental - - + + Valor que seria devido a UF, sem aplicação do Art. 473. da LC 214/2025 - - + + Valor que seria devido ao município, sem aplicação do Art. 473. da LC 214/2025 - - + + Valor que seria devido a CBS, sem aplicação do Art. 473. da LC 214/2025 @@ -1008,9 +1134,9 @@ gás natural e em outras hipóteses definidas no regulamento 4=Municípios - + - Percentual de redução de aliquota em compra goverrnamental + Percentual de redução de aliquota em compra governamental @@ -1030,9 +1156,9 @@ gás natural e em outras hipóteses definidas no regulamento 4=Municípios - + - Percentual de redução de aliquota em compra goverrnamental + Percentual de redução de aliquota em compra governamental @@ -1049,23 +1175,102 @@ gás natural e em outras hipóteses definidas no regulamento Tipo Transferência de Crédito - + Valor do IBS a ser transferido - + Valor da CBS a ser transferida + + + Tipo Estorno de Crédito + + + + + Valor do IBS a ser estornado + + + + + Valor da CBS a ser estornada + + + + + + + Ano e mês referência do período de apuração (AAAA-MM) + + + + + + + + Tipo Ajuste de Competência + + + + + Ano e mês referência do período de apuração (AAAA-MM) + + + + + Valor do IBS + + + + + Valor da CBS + + + + + + + Tipo Crédito Presumido da Operação + + + + + Valor da Base de Cálculo do Crédito Presumido da Operação + + + + + Código de Classificação do Crédito Presumido do IBS e da CBS + + + + + Grupo de Informações do Crédito Presumido referente ao IBS, quando aproveitado pelo emitente do documento. + + + + + Grupo de Informações do Crédito Presumido referente a CBS, quando aproveitado pelo emitente do documento. + + + + Tipo Informações do crédito presumido de IBS para fornecimentos a partir da ZFM + + + Ano e mês referência do período de apuração (AAAA-MM) + + Classificação de acordo com o art. 450, § 1º, da LC 214/25 para o cálculo do crédito presumido na ZFM @@ -1078,7 +1283,7 @@ OBS: Percentuais definidos no art. 450, § 1º, da LC 214/25 para o cálculo do - + Valor do crédito presumido calculado sobre o saldo devedor apurado 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/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/leiauteNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd index 12d2c07dc..9409ba120 100644 --- a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd @@ -94,6 +94,11 @@ SCAN 900-999 Data e Hora da saída ou de entrada da mercadoria / produto (AAAA-MM-DDTHH:mm:ssTZD) + + + Data da previsão de entrega ou disponibilização do bem (AAAA-MM-DD) + + Tipo do Documento Fiscal (0 - entrada; 1 - saída) @@ -269,7 +274,8 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e 1 - emissão de NF-e avulsa pelo Fisco; 2 - emissão de NF-e avulsa, pelo contribuinte com seu certificado digital, através do site do Fisco; -3- emissão de NF-e pelo contribuinte com aplicativo fornecido pelo Fisco. +3 - emissão de NF-e pelo contribuinte com aplicativo fornecido pelo Fisco; +4 - emissão de NF-e por Provedor de Assinatura e Autorização - PAA. @@ -502,7 +508,7 @@ Preencher com "2B", quando se tratar de Cupom Fiscal emitido por máqu - + Chave de acesso da NF-e de antecipação de pagamento @@ -993,6 +999,11 @@ Formato ”CFOP9999”. + + + Classificação para subapuração do IBS na ZFM + + Código EX TIPI (3 posições) @@ -2551,13 +2562,15 @@ ambiente. - Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros;12-Fomento agropecuário + Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros; 10=Deficiente Condutor (Convênio ICMS 38/12); 11=Deficiente Não Condutor (Convênio ICMS 38/12); 12-Fomento agropecuário + + @@ -3391,11 +3404,39 @@ Informar o motivo da desoneração: Percentual de redução da BC + + + Código de Benefício Fiscal na UF aplicado ao item quando houver RBC. + + + + + + + + Alíquota do ICMS + + + + Valor do ICMS da Operação + + + + + Percentual do diferemento + + + + + Valor do ICMS da diferido + + + Valor do ICMS @@ -3418,6 +3459,23 @@ Informar o motivo da desoneração: + + + + Percentual do diferimento do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP) diferido. + + + + + Valor efetivo do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + @@ -3565,12 +3623,14 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o Tributação pelo ICMS 10 - Tributada e com cobrança do ICMS por substituição tributária; +20 – Redução de base de cálculo 90 – Outros. + @@ -3689,6 +3749,43 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o Sigla da UF para qual é devido o ICMS ST da operação. + + + Grupo desoneração + + + + Valor do ICMS de desoneração + + + + + Motivo da desoneração do ICMS:9-Outros;10=Deficiente Condutor (Convênio ICMS 38/12) 11=Deficiente Não Condutor (Convênio ICMS 38/12) + + + + + + + + + + + + + Indica se o valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd): +0=Valor do ICMS desonerado (vICMSDeson) não deduz do valor do item (vProd) / total da NF-e; +1=Valor do ICMS desonerado (vICMSDeson) deduz do valor do item (vProd) / total da NF-e. + + + + + + + + + + @@ -6477,6 +6574,40 @@ tipo de ato concessório: + + + 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 + + + + + + + + @@ -6489,7 +6620,7 @@ tipo de ato concessório: - + @@ -6515,15 +6646,15 @@ tipo de ato concessório: - + - + - + - + - + @@ -7345,7 +7476,15 @@ alterado para tamanho variavel 1-4. (NT2011/004) - Tipo de Nota de Débito: 01=Transferência de créditos para Cooperativas; 02=Anulação de Crédito por Saídas Imunes/Isentas; 03=Débitos de notas fiscais não processadas na apuração; 04=Multa e juros; 05=Transferência de crédito de sucessão); 06=Pagamento antecipado; 07=Perda em estoque + Tipo de Nota de Débito: + 01=Transferência de créditos para Cooperativas; + 02=Anulação de Crédito por Saídas Imunes/Isentas; + 03=Débitos de notas fiscais não processadas na apuração; + 04=Multa e juros; + 05=Transferência de crédito na sucessão; + 06=Pagamento antecipado; + 07=Perda em estoque; + 08=Desenquadramento do SN; @@ -7356,16 +7495,26 @@ alterado para tamanho variavel 1-4. (NT2011/004) + - Tipo de Nota de Crédito: 01=Multa e juros; 02=Apropriação de crédito presumido de IBS sobre o saldo devedor na ZFM (art. 450, § 1º, LC 214/25) + Tipo de Nota de Crédito: + 01=Multa e juros; + 02=Apropriação de crédito presumido de IBS sobre o saldo devedor na ZFM (art. 450, § 1º, LC 214/25); + 03=Retorno por recusa na entrega ou por não localização do destinatário na tentativa de entrega; + 04=Redução de valores; + 05=Transferência de crédito na sucessão; + + + + @@ -7378,6 +7527,7 @@ alterado para tamanho variavel 1-4. (NT2011/004) + @@ -7554,4 +7704,4 @@ alterado para tamanho variavel 1-4. (NT2011/004) - \ No newline at end of file + diff --git a/NFe.AppTeste/Schemas/nfe_v4.00.xsd b/NFe.AppTeste/Schemas/nfe_v4.00.xsd index 4fe917aea..5b2eb0810 100644 --- a/NFe.AppTeste/Schemas/nfe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/nfe_v4.00.xsd @@ -1,4 +1,5 @@ + @@ -6,4 +7,4 @@ Nota Fiscal Eletrônica - + \ No newline at end of file diff --git a/NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd b/NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd index dfabc3366..4445319c9 100644 --- a/NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd +++ b/NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd @@ -1,4 +1,5 @@ + @@ -52,7 +53,7 @@ - + @@ -92,7 +93,7 @@ - + @@ -102,7 +103,7 @@ - + @@ -112,7 +113,7 @@ - + @@ -521,7 +522,7 @@ - + @@ -595,4 +596,13 @@ - + + + Tipo que representa uma chave publica padrão RSA + + + + + + + \ No newline at end of file diff --git a/NFe.Classes/Informacoes/Destinatario/dest.cs b/NFe.Classes/Informacoes/Destinatario/dest.cs index df6e40e78..8132cf7e3 100644 --- a/NFe.Classes/Informacoes/Destinatario/dest.cs +++ b/NFe.Classes/Informacoes/Destinatario/dest.cs @@ -1,15 +1,15 @@ +using DFe.Classes.Flags; using System; using System.Xml.Serialization; -using DFe.Classes.Flags; -using NFe.Classes.Servicos.Tipos; namespace NFe.Classes.Informacoes.Destinatario { public class dest { - private const string ErroCpfCnpjPreenchidos = "Somente preencher um dos campos: CNPJ ou CPF, para um objeto do tipo dest!"; + private const string ErroCpfCnpjIdEstrangeiroPreenchidos = "Somente preencher um dos campos: CNPJ, CPF ou idEstrangeiro, para um objeto do tipo dest!"; private string cnpj; private string cpf; + private string _idEstrangeiro; private readonly VersaoServico _versao; /// @@ -34,13 +34,12 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cpf)) - cnpj = value; - else - { - throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cpf) || !string.IsNullOrEmpty(idEstrangeiro)) + throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); + + cnpj = value; } } @@ -52,20 +51,31 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cnpj)) - cpf = value; - else - { - throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cnpj) || !string.IsNullOrEmpty(idEstrangeiro)) + throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); + + cpf = value; } } /// /// E03a - Identificador do destinatário, em caso de comprador estrangeiro /// - public string idEstrangeiro { get; set; } + public string idEstrangeiro + { + get { return _idEstrangeiro; } + set + { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(CPF)) + throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); + + _idEstrangeiro = value; + } + } /// /// E04 - Razão Social ou nome do destinatário diff --git a/NFe.Classes/Informacoes/Emitente/emit.cs b/NFe.Classes/Informacoes/Emitente/emit.cs index 130fd1cea..3d85aa7f6 100644 --- a/NFe.Classes/Informacoes/Emitente/emit.cs +++ b/NFe.Classes/Informacoes/Emitente/emit.cs @@ -17,14 +17,12 @@ public string CNPJ get { return _cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(_cpf)) - _cnpj = Regex.Match(value, @"\d+").Value; - - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(_cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + _cnpj = value; } } @@ -36,13 +34,12 @@ public string CPF get { return _cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(_cnpj)) - _cpf = Regex.Match(value, @"\d+").Value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(_cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + _cpf = value; } } diff --git a/NFe.Classes/Informacoes/Transporte/transporta.cs b/NFe.Classes/Informacoes/Transporte/transporta.cs index 301c59e0e..6ed5f97d1 100644 --- a/NFe.Classes/Informacoes/Transporte/transporta.cs +++ b/NFe.Classes/Informacoes/Transporte/transporta.cs @@ -16,13 +16,12 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cpf)) - cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cnpj = value; } } @@ -34,13 +33,12 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cnpj)) - cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cpf = value; } } diff --git a/NFe.Classes/Informacoes/autXML.cs b/NFe.Classes/Informacoes/autXML.cs index 1fca847ad..d0e16ac0b 100644 --- a/NFe.Classes/Informacoes/autXML.cs +++ b/NFe.Classes/Informacoes/autXML.cs @@ -16,13 +16,12 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cpf)) - cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cnpj = value; } } @@ -34,13 +33,12 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cnpj)) - cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cpf = value; } } } diff --git a/NFe.Classes/Informacoes/entrega.cs b/NFe.Classes/Informacoes/entrega.cs index bd9d4372c..b9ca42d80 100644 --- a/NFe.Classes/Informacoes/entrega.cs +++ b/NFe.Classes/Informacoes/entrega.cs @@ -17,13 +17,12 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cpf)) - cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cnpj = value; } } @@ -35,13 +34,12 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cnpj)) - cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cpf = value; } } diff --git a/NFe.Classes/Informacoes/retirada.cs b/NFe.Classes/Informacoes/retirada.cs index 6b190f784..b5268890f 100644 --- a/NFe.Classes/Informacoes/retirada.cs +++ b/NFe.Classes/Informacoes/retirada.cs @@ -17,13 +17,12 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cpf)) - cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cnpj = value; } } @@ -35,13 +34,12 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cnpj)) - cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cpf = value; } } diff --git a/NFe.Classes/Servicos/ConsultaCadastro/infConsEnv.cs b/NFe.Classes/Servicos/ConsultaCadastro/infConsEnv.cs index d342db4f9..5ae1f4072 100644 --- a/NFe.Classes/Servicos/ConsultaCadastro/infConsEnv.cs +++ b/NFe.Classes/Servicos/ConsultaCadastro/infConsEnv.cs @@ -33,13 +33,12 @@ public string IE get { return _ie; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CNPJ) & string.IsNullOrEmpty(CPF)) - _ie = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(CPF)) throw new ArgumentException(ErroCpfCnpjIePreenchidos); - } + + _ie = value; } } @@ -52,13 +51,12 @@ public string CNPJ get { return _cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CPF) & string.IsNullOrEmpty(IE)) - _cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CPF) || !string.IsNullOrEmpty(IE)) throw new ArgumentException(ErroCpfCnpjIePreenchidos); - } + + _cnpj = value; } } @@ -71,13 +69,12 @@ public string CPF get { return _cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CNPJ) & string.IsNullOrEmpty(IE)) - _cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(IE)) throw new ArgumentException(ErroCpfCnpjIePreenchidos); - } + + _cpf = value; } } } diff --git a/NFe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs b/NFe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs index 9954fdeab..c2352deac 100644 --- a/NFe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs +++ b/NFe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs @@ -38,13 +38,12 @@ public string CNPJ get { return _cNPJ; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(_cPF)) - _cNPJ = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(_cPF)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + _cNPJ = value; } } @@ -56,13 +55,12 @@ public string CPF get { return _cPF; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(_cNPJ)) - _cPF = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(_cNPJ)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + _cPF = value; } } diff --git a/NFe.Classes/Servicos/Evento/dest.cs b/NFe.Classes/Servicos/Evento/dest.cs index 3a84c0b8d..8c93b51d7 100644 --- a/NFe.Classes/Servicos/Evento/dest.cs +++ b/NFe.Classes/Servicos/Evento/dest.cs @@ -26,13 +26,12 @@ public string CNPJ get { return _cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CPF) & string.IsNullOrEmpty(idEstrangeiro)) - _cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CPF) || !string.IsNullOrEmpty(idEstrangeiro)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); - } + + _cnpj = value; } } @@ -44,13 +43,12 @@ public string CPF get { return _cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CNPJ) & string.IsNullOrEmpty(idEstrangeiro)) - _cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(idEstrangeiro)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); - } + + _cpf = value; } } @@ -63,12 +61,10 @@ public string idEstrangeiro set { if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(CNPJ) & string.IsNullOrEmpty(CPF)) - _idEstrangeiro = value; - else - { + if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(CPF)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); - } + + _idEstrangeiro = value; } } diff --git a/NFe.Classes/Servicos/Evento/infEventoEnv.cs b/NFe.Classes/Servicos/Evento/infEventoEnv.cs index acbcee2aa..8371af591 100644 --- a/NFe.Classes/Servicos/Evento/infEventoEnv.cs +++ b/NFe.Classes/Servicos/Evento/infEventoEnv.cs @@ -37,13 +37,12 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cpf)) - cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cnpj = value; } } @@ -55,13 +54,12 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cnpj)) - cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cpf = value; } } diff --git a/NFe.Classes/Servicos/Evento/infEventoRet.cs b/NFe.Classes/Servicos/Evento/infEventoRet.cs index 51d3eebbd..8fc1fbabe 100644 --- a/NFe.Classes/Servicos/Evento/infEventoRet.cs +++ b/NFe.Classes/Servicos/Evento/infEventoRet.cs @@ -78,13 +78,12 @@ public string CNPJDest get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cpf)) - cnpj = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cnpj = value; } } @@ -96,13 +95,12 @@ public string CPFDest get { return cpf; } set { - if (string.IsNullOrEmpty(value)) return; - if (string.IsNullOrEmpty(cnpj)) - cpf = value; - else - { + if (string.IsNullOrEmpty(value)) + return; + if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - } + + cpf = value; } } From 784e8916d5b471fcf1b303a8df941ffb4967593d Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Fri, 19 Jun 2026 17:37:16 -0300 Subject: [PATCH 23/71] =?UTF-8?q?consertando=20bug=20de=20n=C3=A3o=20preen?= =?UTF-8?q?chimento=20de=20configuracaoServico=20nos=20eventos=20de=20desa?= =?UTF-8?q?cordo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs | 10 ++++++---- CTe.Servicos/Eventos/EventoDesacordo.cs | 12 ++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs index c41c0547e..72aafacc0 100644 --- a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs @@ -26,20 +26,22 @@ public EventoCancelamentoDesacordo(int sequenciaEvento, string chave, string cnp public retEventoCTe CancelarDesacordo(ConfiguracaoServico configuracaoServico = null) { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); - RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); return RetornoSefaz; } public async Task CancelarDesacordoAsync(ConfiguracaoServico configuracaoServico = null) { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); - RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); return RetornoSefaz; } diff --git a/CTe.Servicos/Eventos/EventoDesacordo.cs b/CTe.Servicos/Eventos/EventoDesacordo.cs index 9daa0e0f5..0eb0ea6b7 100644 --- a/CTe.Servicos/Eventos/EventoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoDesacordo.cs @@ -28,21 +28,21 @@ public EventoDesacordo(int sequenciaEvento, string chave, string cnpj, string in public retEventoCTe Discordar(ConfiguracaoServico configuracaoServico = null) { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configuracaoServico); - RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configuracaoServico); - + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); return RetornoSefaz; } public async Task DiscordarAsync(ConfiguracaoServico configuracaoServico = null) { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configuracaoServico); - RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configuracaoServico); - + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); return RetornoSefaz; } } From d0b7da620daeec08c1f0845d4067d9c54e2a6f44 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Mon, 22 Jun 2026 14:29:50 -0300 Subject: [PATCH 24/71] =?UTF-8?q?removendo=20uso=20de=20long.parse=20na=20?= =?UTF-8?q?formata=C3=A7=C3=A3o=20de=20CPF=20e=20CNPJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Danfe.Base/NFCe/NFCe.frx | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/NFe.Danfe.Base/NFCe/NFCe.frx b/NFe.Danfe.Base/NFCe/NFCe.frx index 411252337..dfe5dcbc1 100644 --- a/NFe.Danfe.Base/NFCe/NFCe.frx +++ b/NFe.Danfe.Base/NFCe/NFCe.frx @@ -40,12 +40,26 @@ namespace FastReport if(Report.GetDataSource("NFCe.NFe.infNFe.pag.detPag").RowCount != 0 && Report.GetColumnValue("NFCe.NFe.infNFe.pag.detPag.tPag") != null) txtDescDetPagto.Text = ((FormaPagamento)Report.GetColumnValue("NFCe.NFe.infNFe.pag.detPag.tPag")).Descricao(); } + + private string formatTxtCnpj(string cnpj){ + if (string.IsNullOrEmpty(cnpj) || cnpj.Length != 14) + return cnpj; + + return cnpj.Insert(2, ".").Insert(6, ".").Insert(10, "/").Insert(15, "-"); + } + + private string formatTxtCpf(string cpf){ + if (string.IsNullOrEmpty(cpf) || cpf.Length != 11) + return cpf; + + return cpf.Insert(3, ".").Insert(7, ".").Insert(11, "-"); + } private void txtEmitCnpj_BeforePrint(object sender, EventArgs e) { var cnpj = (string)Report.GetColumnValue("NFCe.NFe.infNFe.emit.CNPJ"); if (!string.IsNullOrEmpty(cnpj)) - txtEmitCnpj.Text = "CNPJ: " + String.Format(@"{0:00\.000\.000\/0000\-00}", long.Parse(cnpj)); + txtEmitCnpj.Text = "CNPJ: " + formatTxtCnpj(cnpj); } private void memChaveNfe_BeforePrint(object sender, EventArgs e) @@ -91,8 +105,8 @@ namespace FastReport var cnpj = (String)Report.GetColumnValue("NFCe.NFe.infNFe.dest.CNPJ"); var cpf = (String)Report.GetColumnValue("NFCe.NFe.infNFe.dest.CPF"); var idEstrangeiro = (String)Report.GetColumnValue("NFCe.NFe.infNFe.dest.idEstrangeiro"); - if ( !String.IsNullOrEmpty(cnpj)) documentoDest = "CNPJ: " + String.Format(@"{0:00\.000\.000\/0000\-00}", long.Parse(cnpj)) + " "; - if ( !String.IsNullOrEmpty(cpf)) documentoDest = "CPF: " + String.Format(@"{0:000\.000\.000\-00}", long.Parse(cpf)) + " "; + if ( !String.IsNullOrEmpty(cnpj)) documentoDest = "CNPJ: " + formatTxtCnpj(cnpj) + " "; + if ( !String.IsNullOrEmpty(cpf)) documentoDest = "CPF: " + formatTxtCpf(cpf) + " "; if ( !String.IsNullOrEmpty(idEstrangeiro)) documentoDest = "Id. Estrangeiro: " + idEstrangeiro + " "; return documentoDest; } From 3ce5cb079a318c2ab858e273f3c51d5faa505a9a Mon Sep 17 00:00:00 2001 From: Filipe Moreira <54115686+filipe-moreira@users.noreply.github.com> Date: Sun, 28 Jun 2026 15:42:19 -0300 Subject: [PATCH 25/71] fix(mdfe): MDFeInfEvento aceita MDFeConfiguracao via construtor Resolve uso incorreto em ambientes multi-tenant / DI. A classe capturava VersaoServico lendo do singleton "MDFeConfiguracao.Instancia" no construtor, ignorando o cfgMdfe passado pelo caller. Em sistemas com Dependency Injection (Scoped), o singleton nao e configurado por design, e a primeira chamada a ServicoMDFeEvento quebrava com "Versao invalida do mdf-e". Obs: construtor sem args continua delegando para MDFeConfiguracao.Instancia. --- MDFe.Classes/Informacoes/Evento/MDFeInfEvento.cs | 10 +++++++++- MDFe.Servicos/EventosMDFe/FactoryEvento.cs | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/MDFe.Classes/Informacoes/Evento/MDFeInfEvento.cs b/MDFe.Classes/Informacoes/Evento/MDFeInfEvento.cs index 51a7b2549..5ed0b6209 100644 --- a/MDFe.Classes/Informacoes/Evento/MDFeInfEvento.cs +++ b/MDFe.Classes/Informacoes/Evento/MDFeInfEvento.cs @@ -14,7 +14,15 @@ namespace MDFe.Classes.Informacoes.Evento public class MDFeInfEvento { [XmlIgnore] - private readonly VersaoServico _versaoServico = MDFeConfiguracao.Instancia.VersaoWebService.VersaoLayout; + private readonly VersaoServico _versaoServico; + + public MDFeInfEvento() : this(null) { } + + public MDFeInfEvento(MDFeConfiguracao cfgMdfe) + { + var config = cfgMdfe ?? MDFeConfiguracao.Instancia; + _versaoServico = config.VersaoWebService.VersaoLayout; + } [XmlAttribute(AttributeName = "Id")] public string Id { get; set; } diff --git a/MDFe.Servicos/EventosMDFe/FactoryEvento.cs b/MDFe.Servicos/EventosMDFe/FactoryEvento.cs index fae1817b5..769120db8 100644 --- a/MDFe.Servicos/EventosMDFe/FactoryEvento.cs +++ b/MDFe.Servicos/EventosMDFe/FactoryEvento.cs @@ -15,7 +15,7 @@ public static MDFeEventoMDFe CriaEvento(MDFeEletronico MDFe, MDFeTipoEvento tipo var eventoMDFe = new MDFeEventoMDFe { Versao = config.VersaoWebService.VersaoLayout, - InfEvento = new MDFeInfEvento + InfEvento = new MDFeInfEvento(config) { Id = "ID" + (long)tipoEvento + MDFe.Chave() + sequenciaEvento.ToString("D2"), TpAmb = config.VersaoWebService.TipoAmbiente, From a7fb48e8c7a501cda3d1f96989c3f905c3d76d8d Mon Sep 17 00:00:00 2001 From: Nathalia Tesch Date: Wed, 1 Jul 2026 15:37:39 -0300 Subject: [PATCH 26/71] NFe: adiciona suporte ao evento 112130 --- NFe.AppTeste/NFe.AppTeste.csproj | 68 + NFe.AppTeste/Schemas/e110001_v1.00.xsd | 75 + NFe.AppTeste/Schemas/e112110_v1.00.xsd | 69 + NFe.AppTeste/Schemas/e112120_v1.00 .xsd | 107 + NFe.AppTeste/Schemas/e112130_v1.00.xsd | 119 ++ NFe.AppTeste/Schemas/e112140_v1.00.xsd | 107 + NFe.AppTeste/Schemas/e112150_v1.00.xsd | 63 + NFe.AppTeste/Schemas/e211110_v1.00.xsd | 134 ++ NFe.AppTeste/Schemas/e211120_v1.00.xsd | 124 ++ NFe.AppTeste/Schemas/e211124_v1.00.xsd | 107 + NFe.AppTeste/Schemas/e211128_v1.00.xsd | 69 + NFe.AppTeste/Schemas/e211130_v1.00.xsd | 107 + NFe.AppTeste/Schemas/e211140_v1.00.xsd | 107 + NFe.AppTeste/Schemas/e211150_v1.00.xsd | 85 + NFe.AppTeste/Schemas/e212110_v1.00.xsd | 70 + NFe.AppTeste/Schemas/e212120_v1.00.xsd | 69 + NFe.AppTeste/Schemas/e412120_v1.00.xsd | 88 + NFe.AppTeste/Schemas/e412130_v1.00.xsd | 88 + NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd | 1766 +++++++++-------- NFe.Classes/Servicos/Evento/detEvento.cs | 16 + .../Servicos/Evento/gControleEstoque.cs | 34 + NFe.Classes/Servicos/Evento/gPerecimento.cs | 34 + .../Servicos/Tipos/NFeServicosTipos.cs | 13 + NFe.Servicos/ServicoNfeFactory.cs | 3 + NFe.Servicos/ServicosNFe.cs | 78 +- NFe.Utils/ConfiguracaoServico.cs | 17 +- NFe.Utils/Enderecos/Enderecador.cs | 16 +- NFe.Utils/Validacao/Validador.cs | 2 + 28 files changed, 2759 insertions(+), 876 deletions(-) create mode 100644 NFe.AppTeste/Schemas/e110001_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e112110_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e112120_v1.00 .xsd create mode 100644 NFe.AppTeste/Schemas/e112130_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e112140_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e112150_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e211110_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e211120_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e211124_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e211128_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e211130_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e211140_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e211150_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e212110_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e212120_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e412120_v1.00.xsd create mode 100644 NFe.AppTeste/Schemas/e412130_v1.00.xsd create mode 100644 NFe.Classes/Servicos/Evento/gControleEstoque.cs create mode 100644 NFe.Classes/Servicos/Evento/gPerecimento.cs diff --git a/NFe.AppTeste/NFe.AppTeste.csproj b/NFe.AppTeste/NFe.AppTeste.csproj index 6aab8a2c4..4994ed83c 100644 --- a/NFe.AppTeste/NFe.AppTeste.csproj +++ b/NFe.AppTeste/NFe.AppTeste.csproj @@ -1161,6 +1161,10 @@ Designer Always + + Designer + Always + Designer Always @@ -1219,6 +1223,26 @@ Designer Always + + Designer + Always + + + Designer + Always + + + Designer + Always + + + Designer + Always + + + Designer + Always + Designer Always @@ -1235,6 +1259,42 @@ Designer Always + + Designer + Always + + + Designer + Always + + + Designer + Always + + + Designer + Always + + + Designer + Always + + + Designer + Always + + + Designer + Always + + + Designer + Always + + + Designer + Always + Designer Always @@ -1251,6 +1311,14 @@ Designer Always + + Designer + Always + + + Designer + Always + Designer Always diff --git a/NFe.AppTeste/Schemas/e110001_v1.00.xsd b/NFe.AppTeste/Schemas/e110001_v1.00.xsd new file mode 100644 index 000000000..caa326693 --- /dev/null +++ b/NFe.AppTeste/Schemas/e110001_v1.00.xsd @@ -0,0 +1,75 @@ + + + + + + + Informações do Cancelamento de evento + + + + + + Informar “Cancelamento de Evento" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do evento autorizado a ser cancelado + + + + + + + + + + + + + + + + + + + + + + + + + Informar o número do Protocolo de Autorização do Evento a ser cancelado + + + + + + Versão do leiaute do evento + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e112110_v1.00.xsd b/NFe.AppTeste/Schemas/e112110_v1.00.xsd new file mode 100644 index 000000000..01ea2c5de --- /dev/null +++ b/NFe.AppTeste/Schemas/e112110_v1.00.xsd @@ -0,0 +1,69 @@ + + + + + + + Informações do Evento de Informação de efetivo pagamento integral para liberar crédito presumido do adquirente + + + + + + Descrição do Evento de Informação de efetivo pagamento integral para liberar crédito presumido do adquirente + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 1=Empresa emitente + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Indicador de efetiva quitação do pagamento integral referente a NFe referenciada. + Valor deve ser igual a "1" + + + + + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e112120_v1.00 .xsd b/NFe.AppTeste/Schemas/e112120_v1.00 .xsd new file mode 100644 index 000000000..763f76d70 --- /dev/null +++ b/NFe.AppTeste/Schemas/e112120_v1.00 .xsd @@ -0,0 +1,107 @@ + + + + + + + Informações do Evento de Importação em ALC/ZFM não convertida em isenção + + + + + + Descrição do evento: "Importação em ALC/ZFM não convertida em isenção" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 1=Empresa emitente + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações de itens integrados ao ativo imobilizado + + + + + + Valor do IBS correspondente à quantidade que não atendeu aos requisitos para a conversão em isenção + + + + + Valor do CBS correspondente à quantidade que não atendeu aos requisitos para a conversão em isenção + + + + + + + + Informar a quantidade que não atendeu os requisitos para a conversão em isenção + + + + + Informar a unidade relativa ao campo gConsumo + + + + + + + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e112130_v1.00.xsd b/NFe.AppTeste/Schemas/e112130_v1.00.xsd new file mode 100644 index 000000000..9c489f0ed --- /dev/null +++ b/NFe.AppTeste/Schemas/e112130_v1.00.xsd @@ -0,0 +1,119 @@ + + + + + + + Informações do Evento de Perecimento, perda, roubo ou furto durante o transporte contratado pelo fornecedor + + + + + + Descrição do evento: "Perecimento, perda, roubo ou furto durante o transporte contratado pelo fornecedor"" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 1=Empresa emitente + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações por item da Nota de Fornecimento + + + + + + Valor do IBS na Nota de Fornecimento correspondente à quantidade que foi objeto de roubo, perda, furto ou perecimento. + + + + + Valor da CBS na Nota de Fornecimento correspondente à quantidade que foi objeto de roubo, perda, furto ou perecimento. + + + + + + + + Informar a quantidade que foi objeto de roubo, perda, furto ou perecimento + + + + + Informar a unidade relativa ao campo qPerecimento + + + + + + + + + + + + Valor do crédito IBS referente às aquisições a ser estornado correspondente à quantidade que foi objeto de roubo, perda, furto ou perecimento + + + + + Valor do crédito CBS referente às aquisições a ser estornado correspondente à quantidade que foi objeto de roubo, perda, furto ou perecimento + + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e112140_v1.00.xsd b/NFe.AppTeste/Schemas/e112140_v1.00.xsd new file mode 100644 index 000000000..4a7dbf149 --- /dev/null +++ b/NFe.AppTeste/Schemas/e112140_v1.00.xsd @@ -0,0 +1,107 @@ + + + + + + + Informações do Evento de Fornecimento não realizado com pagamento antecipado + + + + + + "Descrição do evento: "Fornecimento não realizado com pagamento antecipado" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 1=Empresa emitente + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações por item da Nota de Fornecimento + + + + + + Valor do IBS na nota de débito de pagamento antecipado correspondente à quantidade que não foi fornecida + + + + + Valor da CBS na nota de débito de pagamento antecipado correspondente à quantidade que não foi fornecida. + + + + + + + + Informar a quantidade que não foi fornecida e teve o imposto antecipado + + + + + Informar a unidade relativa ao campo qNaoFornecida + + + + + + + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e112150_v1.00.xsd b/NFe.AppTeste/Schemas/e112150_v1.00.xsd new file mode 100644 index 000000000..1738ea88a --- /dev/null +++ b/NFe.AppTeste/Schemas/e112150_v1.00.xsd @@ -0,0 +1,63 @@ + + + + + + + Informações do Evento de Atualização da Data de Previsão de Entrega + + + + + + Descrição do evento: "Atualização da Data de Previsão de Entrega" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 1=Empresa emitente + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Data da previsão de entrega ou disponibilização do bem. + + + + + + + Versão do leiaute do evento + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211110_v1.00.xsd b/NFe.AppTeste/Schemas/e211110_v1.00.xsd new file mode 100644 index 000000000..b89f1cf0e --- /dev/null +++ b/NFe.AppTeste/Schemas/e211110_v1.00.xsd @@ -0,0 +1,134 @@ + + + + + + + Informações do Evento de Solicitação de Apropriação de crédito presumido + + + + + + Descrição do Evento de Solicitação de Apropriação de crédito presumido + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 2=Empresa destinatario + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações de crédito presumido por item + + + + + + Valor do base de cálculo do item + + + + + + + + Usar tabela Cred Presumido, para o emitente da nota. + + + + + + + + + + + Percentual do Crédito Presumido + + + + + Valor do Crédito Presumido + + + + + + + + + + + Usar tabela Cred Presumido, para o emitente da nota. + + + + + + + + + + + Percentual do Crédito Presumido + + + + + Valor do Crédito Presumido + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do evento de Irregularidade Fiscal + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211120_v1.00.xsd b/NFe.AppTeste/Schemas/e211120_v1.00.xsd new file mode 100644 index 000000000..f72fdb085 --- /dev/null +++ b/NFe.AppTeste/Schemas/e211120_v1.00.xsd @@ -0,0 +1,124 @@ + + + + + + + Informações do Evento de Destinação de item para consumo pessoal + + + + + + Descrição do Evento de Destinação de item para consumo pessoal + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Caso NF-e de Importação, informar 1=Empresa Emitente. + Demais casos, informar 2=Empresa destinatária + + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações por item da NF-e de Aquisição + + + + + + Valor do IBS na nota de aquisição correspondente à quantidade destinada a uso e consumo pessoal + + + + + Valor da CBS na nota de aquisição correspondente à quantidade destinada a uso e consumo pessoal + + + + + + + + Informar a quantidade para consumo de pessoa física + + + + + Informar a unidade relativa ao campo gConsumo + + + + + + + + + + + + + + + + + Informar a chave da nota (NFe ou NFCe) emitida para o fornecimento nos casos em que a legislação obriga a emissão de documento fiscal. + + + + + Corresponde ao atributo “nItem” do elemento “det” do documento referenciado + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211124_v1.00.xsd b/NFe.AppTeste/Schemas/e211124_v1.00.xsd new file mode 100644 index 000000000..2a7ae4d8a --- /dev/null +++ b/NFe.AppTeste/Schemas/e211124_v1.00.xsd @@ -0,0 +1,107 @@ + + + + + + + Informações do Evento de Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente + + + + + + Descrição do evento: “Perecimento, perda, roubo ou furto durante o transporte contratado pelo adquirente" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 2=Empresa destinataria + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações por item da Nota de Aquisição + + + + + + Valor do IBS na nota de aquisição correspondente à quantidade destinada a uso e consumo pessoal + + + + + Valor da CBS na nota de aquisição correspondente à quantidade destinada a uso e consumo pessoal + + + + + + + + Informar a quantidade que foi objeto de roubo, perda, furto ou perecimento + + + + + Informar a unidade relativa ao campo qPerecimento + + + + + + + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211128_v1.00.xsd b/NFe.AppTeste/Schemas/e211128_v1.00.xsd new file mode 100644 index 000000000..dd4b2bb5e --- /dev/null +++ b/NFe.AppTeste/Schemas/e211128_v1.00.xsd @@ -0,0 +1,69 @@ + + + + + + + Informações do Evento de Aceite de débito na apuração por emissão de nota de crédito + + + + + + Descrição do evento: "Aceite de débito na apuração por emissão de nota de crédito" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 2=Empresa destinataria + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Indicador de concordância com o valor da nota de crédito que lançaram IBS e CBS na apuração assistida. Valores: 0 = não aceite; 1 = aceite. + + + + + + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211130_v1.00.xsd b/NFe.AppTeste/Schemas/e211130_v1.00.xsd new file mode 100644 index 000000000..8bc4d9462 --- /dev/null +++ b/NFe.AppTeste/Schemas/e211130_v1.00.xsd @@ -0,0 +1,107 @@ + + + + + + + Informações do Evento de Imobilização de Item + + + + + + Descrição do Evento de Imobilização de Item + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 2=Empresa Destinataria + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações de itens integrados ao ativo imobilizado + + + + + + Valor do IBS relativo à imobilização + + + + + Valor da CBS relativo à imobilização + + + + + + + + Informar a quantidade do item a ser imobilizado + + + + + Informar a unidade relativa ao campo qImobilizado + + + + + + + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211140_v1.00.xsd b/NFe.AppTeste/Schemas/e211140_v1.00.xsd new file mode 100644 index 000000000..92fd6d9c3 --- /dev/null +++ b/NFe.AppTeste/Schemas/e211140_v1.00.xsd @@ -0,0 +1,107 @@ + + + + + + + Informações do Evento de Solicitação de Apropriação de Crédito de Combustível + + + + + + Descrição do Evento de Solicitação de Apropriação de Crédito de Combustível + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 2=Empresa Destinataria + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações de consumo de combustíveis + + + + + + Valor do IBS relativo ao consumo de combustível na nota de aquisição + + + + + Valor da CBS relativo ao consumo de combustível na nota de aquisição + + + + + + + + Informar a quantidade de consumo do item + + + + + Informar a unidade relativa ao campo qComb + + + + + + + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do evento de Irregularidade Fiscal + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e211150_v1.00.xsd b/NFe.AppTeste/Schemas/e211150_v1.00.xsd new file mode 100644 index 000000000..816efb2cc --- /dev/null +++ b/NFe.AppTeste/Schemas/e211150_v1.00.xsd @@ -0,0 +1,85 @@ + + + + + + + Informações do Evento de Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente + + + + + + Descrição do evento: "Solicitação de Apropriação de Crédito para bens e serviços que dependem de atividade do adquirente" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 2=Empresa Destinataria + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações de crédito + + + + + + Valor da solicitação de crédito a ser apropriado de IBS + + + + + Valor da solicitação de crédito a ser apropriado de CBS + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do evento de Irregularidade Fiscal + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e212110_v1.00.xsd b/NFe.AppTeste/Schemas/e212110_v1.00.xsd new file mode 100644 index 000000000..3130ee3df --- /dev/null +++ b/NFe.AppTeste/Schemas/e212110_v1.00.xsd @@ -0,0 +1,70 @@ + + + + + + + Informações do Evento de Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão + + + + + + Descrição do evento: "Manifestação sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 8=Empresa sucessora. + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco; 6=RFB; 8= Empresa sucessora; 9=Outros Órgãos. + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Indicador de aceitação do valor de transferência para a empresa que emitiu a nota referenciada. + Valores: 0=Não Aceite; 1=Aceite. + + + + + + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e212120_v1.00.xsd b/NFe.AppTeste/Schemas/e212120_v1.00.xsd new file mode 100644 index 000000000..cb4fe4667 --- /dev/null +++ b/NFe.AppTeste/Schemas/e212120_v1.00.xsd @@ -0,0 +1,69 @@ + + + + + + + Informações do Evento de Manifestação sobre Pedido de Transferência de Créditode CBS em Operação de Sucessão + + + + + + Descrição do evento: "Manifestação sobre Pedido de Transferência de Créditode CBS em Operação de Sucessão" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 8=Empresa sucessora. + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Indicador de aceitação do valor de transferência para a empresa que emitiu a nota referenciada. + Valores: 0=Não Aceite; 1=Aceite. + + + + + + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e412120_v1.00.xsd b/NFe.AppTeste/Schemas/e412120_v1.00.xsd new file mode 100644 index 000000000..85593c893 --- /dev/null +++ b/NFe.AppTeste/Schemas/e412120_v1.00.xsd @@ -0,0 +1,88 @@ + + + + + + + Informações do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operações de Sucessão + + + + + + "Descrição do evento: Manifestação do Fisco sobre Pedido de Transferência de Crédito de IBS em Operação de Sucessão" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 5=Fisco + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Indicador de aceitação do valor de transferência para a empresa que emitiu a nota referenciada.Valores: 0=Não Aceite; 1=Aceite. + + + + + + + + + + + + 1–Falta de manifestação de todas as sucessoras; 2 – Outros. + + + + + + + + + + + + + + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/e412130_v1.00.xsd b/NFe.AppTeste/Schemas/e412130_v1.00.xsd new file mode 100644 index 000000000..b96755fe0 --- /dev/null +++ b/NFe.AppTeste/Schemas/e412130_v1.00.xsd @@ -0,0 +1,88 @@ + + + + + + + Informações do Evento de Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão + + + + + + Descrição do evento: "Manifestação do Fisco sobre Pedido de Transferência de Crédito de CBS em Operação de Sucessão" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 5=Fisco + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Indicador de aceitação do valor de transferência para a empresa que emitiu a nota referenciada.Valores: 0=Não Aceite; 1=Aceite. + + + + + + + + + + + + 1–Falta de manifestação de todas as sucessoras; 2 – Outros. + + + + + + + + + + + + + + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd b/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd index c967c195b..1f9c9904b 100644 --- a/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd +++ b/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd @@ -1,4 +1,5 @@ - + + @@ -8,873 +9,898 @@ - - - Tipo Código da UF da tabela do IBGE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Código do Município da tabela do IBGE - - - - - - - - - Tipo Chave da Nota Fiscal Eletrônica - - - - - - - - - Tipo Número do Protocolo de Status - - - - - - - - - Tipo Número do Recibo do envio de lote de NF-e - - - - - - - - - Tipo Código da Mensagem enviada - - - - - - - - - Tipo Número do CNPJ - - - - - - - - - Tipo Número do CNPJ tmanho varíavel (3-14) - - - - - - - - - Tipo Número do CNPJ Opcional - - - - - - - - - - Tipo Número do CPF - - - - - - - - - Tipo Número do CPF de tamanho variável (3-11) - - - - - - - - - Tipo Decimal com 5 dígitos, sendo 3 de corpo e 2 decimais - - - - - - - - - Tipo Decimal com 5 dígitos, sendo 3 de corpo e 2 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 11 dígitos, sendo 8 de corpo e 3 decimais - - - - - - - - - Tipo Decimal com 11 dígitos, sendo 8 de corpo e 3 decimais utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 12 dígitos, sendo 8 de corpo e 4decimais - - - - - - - - - Tipo Decimal com 12 dígitos, sendo 8 de corpo e 4 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 11 de corpo e 4 decimais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 11 de corpo e 4 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 12 de corpo e 3 decimais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 12 de corpo e 3 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 16 dígitos, sendo 12 de corpo e 4 decimais - - - - - - - - - Tipo Decimal com 16 dígitos, sendo 12 de corpo e 4 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Decimal com até 21 dígitos, sendo 11 de corpo e até 10 decimais // aperfeiçoamento v2.0 - - - - - - - - - Tipo Decimal com até 15 dígitos, sendo 11 de corpo e até 4 decimais // aperfeiçoamento v2.0 - - - - - - - - - Tipo Inscrição Estadual do Destinatário // alterado para aceitar vazio ou ISENTO - maio/2010 v2.0 - - - - - - - - - Tipo Inscrição Estadual do ST // acrescentado EM 24/10/08 - - - - - - - - - Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO - - - - - - - - - Tipo Modelo Documento Fiscal - - - - - - - - - Tipo Número do Documento Fiscal - - - - - - - - - Tipo Série do Documento Fiscal - - - - - - - - - - Tipo Código do Pais - // PL_005d - 11/08/09 - eliminado: - 4235-LEBUAN, ILHAS - - acrescentado: - 7200 SAO TOME E PRINCIPE, ILHAS, - 8958 ZONA DO CANAL DO PANAMA - 9903 PROVISAO DE NAVIOS E AERONAVES - 9946 A DESIGNAR - 9950 BANCOS CENTRAIS - 9970 ORGANIZACOES INTERNACIONAIS - // PL_005b - 24/10/08 - // Acrescentado: - 4235 - LEBUAN,ILHAS - 4885 - MAYOTTE (ILHAS FRANCESAS) - // NT2011/004 - acrescentado a tabela de paises - //PL_006t - 21/03/2014 - acrescentado: - 5780 - Palestina - 7600 - Sudão do Sul - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Sigla da UF - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Sigla da UF de emissor // acrescentado em 24/10/08 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Ambiente - - - - - - - - - - Tipo Versão do Aplicativo - - - - - - - - - Tipo Motivo - - - - - - - - - Tipo Justificativa - - - - - - - - - Tipo Serviço solicitado - - - - - - Tipo ano - - - - - - - - - Tipo temp médio em segundos - - - - - - - - - Tipo string genérico - - - - - - - - - Tipo data AAAA-MM-DD - - - - - - - - - Tipo hora HH:MM:SS // tipo acrescentado na v2.0 - - - - - - - - - Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) - - - - - - - - - - - - - - - Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Decimal com até 15 dígitos, sendo 11 de corpo e até 4 decimais, aceitando valores negativos - - - - - - - - - Coordenada geográfica Latitude - - - - - - - - Coordenada geográfica Longitude - - - - - + + + Tipo Código da UF da tabela do IBGE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo correspondente ao atributo “nItem” + + + + + + + + + Tipo Código do Município da tabela do IBGE + + + + + + + + + Tipo Chave da Nota Fiscal Eletrônica + + + + + + + + + Tipo Número do Protocolo de Status + + + + + + + + + Tipo Número do Recibo do envio de lote de NF-e + + + + + + + + + Tipo Código da Mensagem enviada + + + + + + + + + Tipo Número do CNPJ + + + + + + + + + Tipo Número do CNPJ tmanho varíavel (3-14) + + + + + + + + + Tipo Número do CNPJ Opcional + + + + + + + + + + Tipo Número do CPF + + + + + + + + + Tipo Número do CPF de tamanho variável (3-11) + + + + + + + + + Tipo Decimal com 5 dígitos, sendo 3 de corpo e 2 decimais + + + + + + + + + Tipo Decimal com 5 dígitos, sendo 3 de corpo e 2 decimais, utilizado em tags opcionais + + + + + + + + + Tipo Decimal com 11 dígitos, sendo 8 de corpo e 3 decimais + + + + + + + + + Tipo Decimal com 11 dígitos, sendo 8 de corpo e 3 decimais utilizado em tags opcionais + + + + + + + + + Tipo Decimal com 12 dígitos, sendo 8 de corpo e 4decimais + + + + + + + + + Tipo Decimal com 12 dígitos, sendo 8 de corpo e 4 decimais, utilizado em tags opcionais + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 11 de corpo e 4 decimais + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 11 de corpo e 4 decimais, utilizado em tags opcionais + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 12 de corpo e 3 decimais + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 12 de corpo e 3 decimais, utilizado em tags opcionais + + + + + + + + + Tipo Decimal com 16 dígitos, sendo 12 de corpo e 4 decimais + + + + + + + + + Tipo Decimal com 16 dígitos, sendo 12 de corpo e 4 decimais, utilizado em tags opcionais + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais, utilizado em tags opcionais + + + + + + + + + Tipo Decimal com até 21 dígitos, sendo 11 de corpo e até 10 decimais // aperfeiçoamento v2.0 + + + + + + + + + Tipo Decimal com até 15 dígitos, sendo 11 de corpo e até 4 decimais // aperfeiçoamento v2.0 + + + + + + + + + Tipo Inscrição Estadual do Destinatário // alterado para aceitar vazio ou ISENTO - maio/2010 v2.0 + + + + + + + + + Tipo Inscrição Estadual do ST // acrescentado EM 24/10/08 + + + + + + + + + Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO + + + + + + + + + Tipo Modelo Documento Fiscal + + + + + + + + + Tipo Número do Documento Fiscal + + + + + + + + + Tipo Série do Documento Fiscal + + + + + + + + + Tipo Código do Pais +// PL_005d - 11/08/09 +eliminado: + 4235-LEBUAN, ILHAS - +acrescentado: +7200 SAO TOME E PRINCIPE, ILHAS, +8958 ZONA DO CANAL DO PANAMA +9903 PROVISAO DE NAVIOS E AERONAVES +9946 A DESIGNAR +9950 BANCOS CENTRAIS +9970 ORGANIZACOES INTERNACIONAIS + // PL_005b - 24/10/08 + // Acrescentado: + 4235 - LEBUAN,ILHAS + 4885 - MAYOTTE (ILHAS FRANCESAS) +// NT2011/004 + acrescentado a tabela de paises +//PL_006t - 21/03/2014 +acrescentado: +5780 - Palestina +7600 - Sudão do Sul + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Sigla da UF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Sigla da UF de emissor // acrescentado em 24/10/08 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Ambiente + + + + + + + + + + Tipo Versão do Aplicativo + + + + + + + + + Tipo Motivo + + + + + + + + + Tipo Justificativa + + + + + + + + + Tipo Serviço solicitado + + + + + + Tipo ano + + + + + + + + + Tipo temp médio em segundos + + + + + + + + + Tipo string genérico + + + + + + + + + Tipo data AAAA-MM-DD + + + + + + + + + Tipo hora HH:MM:SS // tipo acrescentado na v2.0 + + + + + + + + + Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) + + + + + + + + + Tipo Decimal com até 3 dígitos inteiros, podendo ter de 2 até 4 decimais + + + + + + + + + Tipo Decimal com até 15 dígitos, sendo 11 de corpo e até 4 decimais, aceitando valores negativos + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais + + + + + + + + + + + + + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Coordenada geográfica Latitude + + + + + + + + Coordenada geográfica Longitude + + + + + diff --git a/NFe.Classes/Servicos/Evento/detEvento.cs b/NFe.Classes/Servicos/Evento/detEvento.cs index 19ef29e83..e5902f390 100644 --- a/NFe.Classes/Servicos/Evento/detEvento.cs +++ b/NFe.Classes/Servicos/Evento/detEvento.cs @@ -296,5 +296,21 @@ public bool ShouldSerializedetPag() } #endregion + + #region Perecimento, perda, roubo ou furto durante o transporte + + /// + /// Informações por item da Nota de Fornecimento para o evento 112130. + /// + [XmlElement("gPerecimento")] + public List gPerecimento { get; set; } + + public bool ShouldSerializegPerecimento() + { + return gPerecimento != null && + gPerecimento.Count > 0; + } + + #endregion } } \ No newline at end of file diff --git a/NFe.Classes/Servicos/Evento/gControleEstoque.cs b/NFe.Classes/Servicos/Evento/gControleEstoque.cs new file mode 100644 index 000000000..24cdbf988 --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gControleEstoque.cs @@ -0,0 +1,34 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações de quantidade de estoque influenciadas pelo evento 112130. + /// + public class gControleEstoque + { + /// + /// Quantidade objeto de roubo, perda, furto ou perecimento. + /// + [XmlElement("qPerecimento")] + public decimal qPerecimento { get; set; } + + /// + /// Unidade relativa ao campo qPerecimento. + /// + [XmlElement("uPerecimento")] + public string uPerecimento { get; set; } + + /// + /// Valor do crédito IBS referente às aquisições a ser estornado. + /// + [XmlElement("vIBS")] + public decimal vIBS { get; set; } + + /// + /// Valor do crédito CBS referente às aquisições a ser estornado. + /// + [XmlElement("vCBS")] + public decimal vCBS { get; set; } + } +} \ No newline at end of file diff --git a/NFe.Classes/Servicos/Evento/gPerecimento.cs b/NFe.Classes/Servicos/Evento/gPerecimento.cs new file mode 100644 index 000000000..af66a70ad --- /dev/null +++ b/NFe.Classes/Servicos/Evento/gPerecimento.cs @@ -0,0 +1,34 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Servicos.Evento +{ + /// + /// Informações por item da Nota de Fornecimento para o evento 112130. + /// + public class gPerecimento + { + /// + /// Corresponde ao atributo nItem do elemento det da NF-e. + /// + [XmlAttribute("nItem")] + public int nItem { get; set; } + + /// + /// Valor do IBS na Nota de Fornecimento correspondente à quantidade objeto de roubo, perda, furto ou perecimento. + /// + [XmlElement("vIBS")] + public decimal vIBS { get; set; } + + /// + /// Valor da CBS na Nota de Fornecimento correspondente à quantidade objeto de roubo, perda, furto ou perecimento. + /// + [XmlElement("vCBS")] + public decimal vCBS { get; set; } + + /// + /// Informações de quantidade de estoque influenciadas pelo evento. + /// + [XmlElement("gControleEstoque")] + public gControleEstoque gControleEstoque { get; set; } + } +} \ No newline at end of file diff --git a/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs b/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs index c50f4ac8d..1b5498eec 100644 --- a/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs +++ b/NFe.Classes/Servicos/Tipos/NFeServicosTipos.cs @@ -51,6 +51,11 @@ public enum ServicoNFe /// RecepcaoEventoCancConciliacaoFinanceiraNFe, + /// + /// serviço destinado à recepção de mensagem do Evento de Perecimento, Perda, Roubo ou Furto durante o Transporte + /// + RecepcaoEventoPerecimentoTransporteNFe, + /// /// serviço destinado à recepção de mensagem do Evento de Manifestação do destinatário da NF-e /// @@ -155,6 +160,7 @@ public enum IndicadorSincronizacao /// 110193 - Cancelamento Insucesso na Entrega da NF-e /// 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) /// 210200 – Confirmação da Operação /// 210210 – Ciência da Emissão /// 210220 – Desconhecimento da Operação @@ -232,6 +238,13 @@ public enum NFeTipoEvento [XmlEnum("110751")] TeNfeCancConciliacaoFinanceiraNFe = 110751, + /// + /// 112130 - Perecimento, perda, roubo ou furto durante o transporte contratado pelo fornecedor (Extravio de Transporte) + /// + [Description("Perecimento, perda, roubo ou furto durante o transporte contratado pelo fornecedor")] + [XmlEnum("112130")] + TeNfePerecimentoTransporteNFe = 112130, + /// /// 210200 – Confirmação da Operação /// diff --git a/NFe.Servicos/ServicoNfeFactory.cs b/NFe.Servicos/ServicoNfeFactory.cs index 50e418b22..8f8ac3825 100644 --- a/NFe.Servicos/ServicoNfeFactory.cs +++ b/NFe.Servicos/ServicoNfeFactory.cs @@ -237,6 +237,9 @@ public static INfeServico CriaWsdlOutros(ServicoNFe servico, ConfiguracaoServico case ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe: return new RecepcaoEvento4AN(url, certificado, cfg.TimeOut); + case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: + return new RecepcaoEvento4AN(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 832acea44..fa023a061 100644 --- a/NFe.Servicos/ServicosNFe.cs +++ b/NFe.Servicos/ServicosNFe.cs @@ -360,7 +360,7 @@ public RetornoNfeInutilizacao NfeInutilizacao(inutNFe pedInutilizacao) /// /// /// - /// Tipo de serviço do evento: valores válidos: RecepcaoEventoCancelmento, RecepcaoEventoCartaCorrecao, RecepcaoEventoEpec e RecepcaoEventoManifestacaoDestinatario + /// Tipo de serviço do evento. /// Versão do serviço para o evento /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, ServicoNFe servicoEvento, VersaoServico versaoEvento, bool assinar) @@ -376,7 +376,8 @@ private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, S ServicoNFe.RecepcaoEventoComprovanteEntregaNFe, ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe, ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe, - ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe + ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe, + ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe }; if ( !listaEventos.Contains(servicoEvento)) @@ -390,7 +391,7 @@ private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, S var ws = CriarServico(servicoEvento); - if (_cFgServico.VersaoRecepcaoEventoCceCancelamento != VersaoServico.Versao400) + if (versaoEvento != VersaoServico.Versao400) { ws.nfeCabecMsg = new nfeCabecMsg { @@ -431,7 +432,7 @@ private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List eventos, S SalvarArquivoXml(idlote + "-ped-eve.xml", xmlEvento); if (_cFgServico.ValidarSchemas) - Validador.Valida(servicoEvento, _cFgServico.VersaoRecepcaoEventoCceCancelamento, xmlEvento, cfgServico: _cFgServico); + Validador.Valida(servicoEvento, versaoEvento, xmlEvento, cfgServico: _cFgServico); var dadosEvento = new XmlDocument(); dadosEvento.LoadXml(xmlEvento); @@ -1091,6 +1092,74 @@ public RetornoRecepcaoEvento RecepcaoEventoCancConciliacaoFinanceira(int idlote, return retorno; } + /// + /// Recepção do Evento de Perecimento, perda, roubo ou furto durante o transporte contratado pelo fornecedor + /// + /// 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 Fornecimento + /// 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 RecepcaoEventoPerecimentoTransporte(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.", nameof(perecimentos)); + + var versaoServico = + ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe.VersaoServicoParaString( + _cFgServico.VersaoRecepcaoEventoPerecimentoTransporte); + + var detEvento = new detEvento + { + versao = versaoServico, + descEvento = NFeTipoEvento.TeNfePerecimentoTransporteNFe.Descricao(), + cOrgaoAutor = ufAutor ?? _cFgServico.cUF, + tpAutor = TipoAutor.taEmpresaEmitente, + verAplic = versaoAplicativo ?? "1.0", + gPerecimento = perecimentos + }; + + var infEvento = new infEventoEnv + { + cOrgao = Estado.AN, + tpAmb = _cFgServico.tpAmb, + chNFe = chaveNFe, + dhEvento = dhEvento ?? DateTime.Now, + tpEvento = NFeTipoEvento.TeNfePerecimentoTransporteNFe, + 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.RecepcaoEventoPerecimentoTransporteNFe, _cFgServico.VersaoRecepcaoEventoPerecimentoTransporte, true); + return retorno; + } + + /// + /// Envia eventos do tipo "Perecimento, perda, roubo ou furto durante o transporte" já assinados. + /// + /// Nº do lote + /// Eventos já montados e assinados + /// Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento + public RetornoRecepcaoEvento RecepcaoEventoPerecimentoTransporte(int idlote, List eventos) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe, _cFgServico.VersaoRecepcaoEventoPerecimentoTransporte, false); + return retorno; + } + /// /// Consulta a situação cadastral, com base na UF/Documento /// O documento pode ser: IE, CNPJ ou CPF @@ -1099,6 +1168,7 @@ public RetornoRecepcaoEvento RecepcaoEventoCancConciliacaoFinanceira(int idlote, /// Tipo de documento a ser consultado /// Documento a ser consultado /// Retorna um objeto da classe RetornoNfeConsultaCadastro com o retorno do serviço NfeConsultaCadastro + public RetornoNfeConsultaCadastro NfeConsultaCadastro(string uf, ConsultaCadastroTipoDocumento tipoDocumento, string documento) { var versaoServico = ServicoNFe.NfeConsultaCadastro.VersaoServicoParaString(_cFgServico.VersaoNfeConsultaCadastro); diff --git a/NFe.Utils/ConfiguracaoServico.cs b/NFe.Utils/ConfiguracaoServico.cs index 27c687f18..289729482 100644 --- a/NFe.Utils/ConfiguracaoServico.cs +++ b/NFe.Utils/ConfiguracaoServico.cs @@ -31,6 +31,7 @@ public sealed class ConfiguracaoServico : INotifyPropertyChanged private VersaoServico _versaoRecepcaoEventoInsucessoEntrega; private VersaoServico _versaoRecepcaoEventoComprovanteEntrega; private VersaoServico _versaoRecepcaoEventoConciliacaoFinanceira; + private VersaoServico _versaoRecepcaoEventoPerecimentoTransporte; private VersaoServico _versaoRecepcaoEventoEpec; private VersaoServico _versaoRecepcaoEventoManifestacaoDestinatario; private VersaoServico _versaoNfeRecepcao; @@ -205,9 +206,9 @@ private void AtualizaVersoes() if (enderecosMaisecentes.Any()) { VersaoRecepcaoEventoCceCancelamento = obterVersao(ServicoNFe.RecepcaoEventoCancelmento); - VersaoRecepcaoEventoInsucessoEntrega = obterVersao(ServicoNFe.RecepcaoEventoInsucessoEntregaNFe); VersaoRecepcaoEventoComprovanteEntrega = obterVersao(ServicoNFe.RecepcaoEventoComprovanteEntregaNFe); VersaoRecepcaoEventoConciliacaoFinanceira = obterVersao(ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe); + VersaoRecepcaoEventoPerecimentoTransporte = obterVersao(ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe); VersaoRecepcaoEventoEpec = obterVersao(ServicoNFe.RecepcaoEventoEpec); VersaoRecepcaoEventoManifestacaoDestinatario = obterVersao(ServicoNFe.RecepcaoEventoManifestacaoDestinatario); VersaoNfeRecepcao = obterVersao(ServicoNFe.NfeRecepcao); @@ -299,6 +300,20 @@ public VersaoServico VersaoRecepcaoEventoConciliacaoFinanceira } } + /// + /// Versão do serviço RecepcaoEvento para Perecimento, Perda, Roubo ou Furto durante o Transporte + /// + public VersaoServico VersaoRecepcaoEventoPerecimentoTransporte + { + get { return _versaoRecepcaoEventoPerecimentoTransporte; } + set + { + if (value == _versaoRecepcaoEventoPerecimentoTransporte) return; + _versaoRecepcaoEventoPerecimentoTransporte = 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 ec1dd8cdd..5fc741fbb 100644 --- a/NFe.Utils/Enderecos/Enderecador.cs +++ b/NFe.Utils/Enderecos/Enderecador.cs @@ -121,6 +121,8 @@ private static List CarregarEnderecosServicos() var eventoCceCanc = new[] { ServicoNFe.RecepcaoEventoCartaCorrecao, ServicoNFe.RecepcaoEventoCancelmento }; + var eventoPerecimentoTransporteNFe = new[] { ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe }; + var hom = TipoAmbiente.Homologacao; var prod = TipoAmbiente.Producao; @@ -1553,8 +1555,13 @@ private static List CarregarEnderecosServicos() if (estado != Estado.CE & !svanEstados.Contains(estado)) addServico(new[] { ServicoNFe.NfeDownloadNF }, versao2E3, hom, TipoEmissao.teNormal, estado, modelo, "https://hom.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx"); if (modelo != ModeloDocumento.NFCe) + { addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, hom, TipoEmissao.teNormal, estado, modelo, "https://hom1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); + // Perecimento, perda, roubo ou furto durante o transporte + addServico(eventoPerecimentoTransporteNFe, versao1, hom, TipoEmissao.teNormal, estado, modelo, "https://hom1.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx"); + } + // Comprovante de Entrega addServico(new[] { ServicoNFe.RecepcaoEventoComprovanteEntregaNFe, ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe }, versao1, hom, TipoEmissao.teNormal, estado, modelo, "https://hom1.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx"); } @@ -1585,7 +1592,12 @@ private static List CarregarEnderecosServicos() if (estado != Estado.CE & !svanEstados.Contains(estado)) addServico(new[] { ServicoNFe.NfeDownloadNF }, versao2E3, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx"); if (modelo != ModeloDocumento.NFCe) - addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); + { + addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); + + // Perecimento, perda, roubo ou furto durante o transporte + addServico(eventoPerecimentoTransporteNFe, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx"); + } // Comprovante de Entrega addServico(new[] { ServicoNFe.RecepcaoEventoComprovanteEntregaNFe, ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx"); @@ -1660,6 +1672,8 @@ public static void CarregarEnderecos() case ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe: case ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe: return cfgServico.VersaoRecepcaoEventoConciliacaoFinanceira; + case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: + return cfgServico.VersaoRecepcaoEventoPerecimentoTransporte; case ServicoNFe.RecepcaoEventoEpec: return cfgServico.VersaoRecepcaoEventoEpec; case ServicoNFe.RecepcaoEventoManifestacaoDestinatario: diff --git a/NFe.Utils/Validacao/Validador.cs b/NFe.Utils/Validacao/Validador.cs index c49e00fff..56245f0e1 100644 --- a/NFe.Utils/Validacao/Validador.cs +++ b/NFe.Utils/Validacao/Validador.cs @@ -42,6 +42,8 @@ internal static string ObterArquivoSchema(ServicoNFe servicoNFe, VersaoServico v return "envEventoEConf_v1.00.xsd"; case ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe: return "envEventoCancEConf_v1.00.xsd"; + case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: + return "envEvento_v1.00.xsd"; case ServicoNFe.RecepcaoEventoEpec: return "envEPEC_v1.00.xsd"; case ServicoNFe.RecepcaoEventoManifestacaoDestinatario: From c029eced2889ad2a5ea8121cacb524d9ec5f7427 Mon Sep 17 00:00:00 2001 From: Roberto Alves Date: Mon, 6 Jul 2026 16:46:26 -0300 Subject: [PATCH 27/71] feat: emitir com cnpj alfanumerico --- DFe.Testes/DFe.Testes.csproj | 2 + DFe.Testes/Gerais/ChaveFiscalTestes.cs | 261 +++++++++++ DFe.Testes/Gerais/CnpjFiscalTestes.cs | 128 ++++++ DFe.Testes/Gerais/Code128HibridoTestes.cs | 252 ++++++++++ .../DanfePdfClownChaveAlfanumericaTestes.cs | 76 +++ DFe.Testes/Gerais/FormatadorDanfeTestes.cs | 77 ++++ DFe.Utils/ChaveFiscal.cs | 32 +- DFe.Utils/CnpjFiscal.cs | 73 +++ NFe.AppTeste/MainWindow.xaml.cs | 11 +- .../Schemas-sem-vIBS/eventoEPEC_v1.00.xsd | 2 +- .../Schemas-sem-vIBS/leiauteCCe_v1.00.xsd | 2 +- .../leiauteConfRecebto_v1.00.xsd | 2 +- .../leiauteConsSitNFe_v4.00.xsd | 2 +- .../Schemas-sem-vIBS/leiauteEPEC_v1.00.xsd | 2 +- .../leiauteEventoAtorInteressado_v1.00.xsd | 2 +- .../leiauteEventoCancEConf_v1.00.xsd | 2 +- .../leiauteEventoCancEntregaNFe_v1.00.xsd | 2 +- .../leiauteEventoCancInsucessoNFe_v1.00.xsd | 2 +- .../leiauteEventoCancNFe_v1.00.xsd | 2 +- .../leiauteEventoCancSubst_v1.00.xsd | 2 +- .../leiauteEventoEConf_v1.00.xsd | 2 +- .../leiauteEventoEntregaNFe_v1.00.xsd | 2 +- .../leiauteEventoInsucessoNFe_v1.00.xsd | 2 +- .../Schemas-sem-vIBS/leiauteEvento_v1.00.xsd | 2 +- .../Schemas-sem-vIBS/leiauteInutNFe_v4.00.xsd | 2 +- .../Schemas-sem-vIBS/tiposBasico_v1.03.xsd | 8 +- .../tiposBasico_v1.03_OPENSSL.xsd | 8 +- .../Schemas-sem-vIBS/tiposBasico_v4.00.xsd | 8 +- .../Schemas-sem-vIBS/tiposDistDFe_v1.01.xsd | 4 +- .../Schemas/DFeTiposBasicos_v1.00.xsd | 397 ++++++++++++++-- NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd | 161 ++++--- NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd | 2 +- NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd | 2 +- .../Schemas/leiauteConfRecebto_v1.00.xsd | 2 +- NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd | 2 +- .../leiauteEventoAtorInteressado_v1.00.xsd | 2 +- .../Schemas/leiauteEventoCancEConf_v1.00.xsd | 2 +- .../leiauteEventoCancEntregaNFe_v1.00.xsd | 2 +- .../leiauteEventoCancInsucessoNFe_v1.00.xsd | 2 +- .../Schemas/leiauteEventoCancNFe_v1.00.xsd | 2 +- .../Schemas/leiauteEventoCancSubst_v1.00.xsd | 2 +- .../Schemas/leiauteEventoEConf_v1.00.xsd | 2 +- .../Schemas/leiauteEventoEntregaNFe_v1.00.xsd | 2 +- .../leiauteEventoInsucessoNFe_v1.00.xsd | 2 +- NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd | 38 +- NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd | 102 +++-- 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 | 31 +- .../Schemas/tiposBasico_v1.03_OPENSSL.xsd | 17 +- NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd | 2 +- NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd | 433 +++++++++--------- NFe.Danfe.PdfClown/Elementos/Barcode128C.cs | 35 +- NFe.Danfe.PdfClown/Tools/Code128Hibrido.cs | 149 ++++++ NFe.Danfe.PdfClown/Tools/Formatador.cs | 3 +- .../ExtinfNFeSuplChaveAlfanumericaTestes.cs | 82 ++++ 57 files changed, 2237 insertions(+), 773 deletions(-) create mode 100644 DFe.Testes/Gerais/ChaveFiscalTestes.cs create mode 100644 DFe.Testes/Gerais/CnpjFiscalTestes.cs create mode 100644 DFe.Testes/Gerais/Code128HibridoTestes.cs create mode 100644 DFe.Testes/Gerais/DanfePdfClownChaveAlfanumericaTestes.cs create mode 100644 DFe.Testes/Gerais/FormatadorDanfeTestes.cs create mode 100644 DFe.Utils/CnpjFiscal.cs create mode 100644 NFe.Danfe.PdfClown/Tools/Code128Hibrido.cs create mode 100644 NFe.Utils.Testes/ExtinfNFeSuplChaveAlfanumericaTestes.cs diff --git a/DFe.Testes/DFe.Testes.csproj b/DFe.Testes/DFe.Testes.csproj index e1974af04..225cd4bb7 100644 --- a/DFe.Testes/DFe.Testes.csproj +++ b/DFe.Testes/DFe.Testes.csproj @@ -17,8 +17,10 @@ + + diff --git a/DFe.Testes/Gerais/ChaveFiscalTestes.cs b/DFe.Testes/Gerais/ChaveFiscalTestes.cs new file mode 100644 index 000000000..4d761043b --- /dev/null +++ b/DFe.Testes/Gerais/ChaveFiscalTestes.cs @@ -0,0 +1,261 @@ +using System; +using DFe.Classes.Entidades; +using DFe.Classes.Flags; +using DFe.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace DFe.Testes.Gerais +{ + /// + /// Testes da chave de acesso do DF-e cobrindo o fluxo antigo (CNPJ 100% numérico) + /// e o novo fluxo com CNPJ alfanumérico da NT Conjunta 2025.001 + /// + [TestClass] + public class ChaveFiscalTestes + { + //Chave real de NFC-e homologação (CNPJ numérico) usada como âncora de regressão do fluxo antigo + private const string ChaveNumericaReal = "23190811820016000167650010000000221100000227"; + + //Vetor ouro da NT: NFe de GO, emitida em 07/2025 pelo CNPJ alfanumérico de teste da Receita PC3D315K000193 + private const string ChaveAlfanumericaOuro = "522507PC3D315K000193550010000000011000000018"; + + #region Fluxo novo - CNPJ alfanumérico + + [TestMethod] + public void ObterChave_ComCnpjAlfanumerico_GeraAChaveDoVetorOuro() + { + // Arrange + var dataEmissao = new DateTimeOffset(2025, 7, 15, 10, 0, 0, TimeSpan.FromHours(-3)); + + // Act + var dados = ChaveFiscal.ObterChave(Estado.GO, dataEmissao, "PC3D315K000193", ModeloDocumento.NFe, 1, 1, 1, 1); + + // Assert + Assert.AreEqual(ChaveAlfanumericaOuro, dados.Chave); + Assert.AreEqual((byte)8, dados.DigitoVerificador); + } + + [TestMethod] + public void ObterChave_ComCnpjAlfanumerico_ChaveTemLayoutCorreto() + { + var dados = ChaveFiscal.ObterChave(Estado.GO, new DateTime(2025, 7, 15), "PC3D315K000193", ModeloDocumento.NFe, 1, 1, 1, 1); + + Assert.AreEqual(44, dados.Chave.Length); + Assert.AreEqual("52", dados.Chave.Substring(0, 2), "cUF"); + Assert.AreEqual("2507", dados.Chave.Substring(2, 4), "AAMM"); + Assert.AreEqual("PC3D315K000193", dados.Chave.Substring(6, 14), "CNPJ"); + Assert.AreEqual("55", dados.Chave.Substring(20, 2), "modelo"); + } + + [TestMethod] + public void ChaveValida_ComChaveAlfanumericaDoVetorOuro_RetornaVerdadeiro() + { + Assert.IsTrue(ChaveFiscal.ChaveValida(ChaveAlfanumericaOuro)); + } + + [TestMethod] + [DataRow("0")] + [DataRow("1")] + [DataRow("5")] + [DataRow("9")] + public void ChaveValida_ComChaveAlfanumericaComDvErrado_RetornaFalso(string dvErrado) + { + var chaveComDvErrado = ChaveAlfanumericaOuro.Substring(0, 43) + dvErrado; + + Assert.IsFalse(ChaveFiscal.ChaveValida(chaveComDvErrado)); + } + + [TestMethod] + public void ObterChave_ComVariosCnpjsAlfanumericos_DvIgualAoDaImplementacaoDeReferenciaDaNT() + { + // Arrange - bases alfanuméricas com DVs calculados pela regra oficial de CNPJ + var basesCnpj = new[] { "12ABC34501DE", "PC3D315K0001", "A1B2C3D4E5F6", "ZZZZZZZZZZZZ", "0000000000AB", "H9J8K7L6M5N4" }; + var ufs = new[] { Estado.GO, Estado.SP, Estado.CE, Estado.RS, Estado.AM, Estado.DF }; + var modelos = new[] { ModeloDocumento.NFe, ModeloDocumento.NFCe }; + + for (var i = 0; i < basesCnpj.Length; i++) + { + var cnpj = basesCnpj[i] + CnpjFiscal.ObterDigitosVerificadores(basesCnpj[i]); + + foreach (var modelo in modelos) + { + // Act + var dados = ChaveFiscal.ObterChave(ufs[i], new DateTime(2026, 7, 1), cnpj, modelo, i + 1, 1000 + i, 1, 77000 + i); + + // Assert + var dvReferencia = CalcularDvReferenciaNt(dados.Chave.Substring(0, 43)); + Assert.AreEqual(dvReferencia, (int)dados.DigitoVerificador, "CNPJ {0}, modelo {1}", cnpj, modelo); + Assert.IsTrue(ChaveFiscal.ChaveValida(dados.Chave), "ChaveValida deveria aceitar {0}", dados.Chave); + } + } + } + + [TestMethod] + public void ObterChave_ComCnpjAlfanumericoMinusculo_LancaArgumentException() + { + Assert.ThrowsException(() => + ChaveFiscal.ObterChave(Estado.GO, new DateTime(2025, 7, 15), "pc3d315k000193", ModeloDocumento.NFe, 1, 1, 1, 1)); + } + + [TestMethod] + [DataRow(':')] + [DataRow(';')] + [DataRow('<')] + [DataRow('=')] + [DataRow('>')] + [DataRow('?')] + [DataRow('@')] + public void ObterChave_ComCaractereEntreDigitosELetras_LancaArgumentException(char caractereInvalido) + { + //os caracteres ASCII 58 a 64 ficam entre '9' e 'A' e produziriam DV errado sem erro se aceitos + var cnpjInvalido = "PC3D315K0001" + caractereInvalido + "3"; + + Assert.ThrowsException(() => + ChaveFiscal.ObterChave(Estado.GO, new DateTime(2025, 7, 15), cnpjInvalido, ModeloDocumento.NFe, 1, 1, 1, 1)); + } + + [TestMethod] + public void ChaveValida_ComLetraMinusculaNaChave_LancaArgumentException() + { + var chaveComMinuscula = "522507pC3D315K000193550010000000011000000018"; + + Assert.ThrowsException(() => ChaveFiscal.ChaveValida(chaveComMinuscula)); + } + + #endregion + + #region Fluxo antigo - CNPJ numérico (regressão) + + [TestMethod] + public void ObterChave_ComCnpjNumerico_GeraChaveRealConhecida() + { + // Arrange - componentes da chave real de homologação (NFC-e do CE, 08/2019) + var dataEmissao = new DateTimeOffset(2019, 8, 10, 12, 0, 0, TimeSpan.FromHours(-3)); + + // Act + var dados = ChaveFiscal.ObterChave(Estado.CE, dataEmissao, "11820016000167", ModeloDocumento.NFCe, 1, 22, 1, 10000022); + + // Assert + Assert.AreEqual(ChaveNumericaReal, dados.Chave); + Assert.AreEqual((byte)7, dados.DigitoVerificador); + } + + [TestMethod] + public void ChaveValida_ComChaveNumericaRealConhecida_RetornaVerdadeiro() + { + Assert.IsTrue(ChaveFiscal.ChaveValida(ChaveNumericaReal)); + } + + [TestMethod] + public void ChaveValida_ComChaveNumericaComDvErrado_RetornaFalso() + { + var chaveComDvErrado = ChaveNumericaReal.Substring(0, 43) + "9"; + + Assert.IsFalse(ChaveFiscal.ChaveValida(chaveComDvErrado)); + } + + [TestMethod] + public void ObterChave_ComVariosCnpjsNumericos_DvIdenticoAoAlgoritmoLegado() + { + // Arrange - regressão: para chave 100% numérica o DV novo deve ser idêntico ao da implementação antiga + var cnpjs = new[] { "11222333000181", "00000000000191", "11444777000161", "99999999999999", "00000000000000", "12345678000195" }; + var ufs = new[] { Estado.SP, Estado.GO, Estado.CE, Estado.RS, Estado.MG, Estado.BA }; + + for (var i = 0; i < cnpjs.Length; i++) + { + foreach (var modelo in new[] { ModeloDocumento.NFe, ModeloDocumento.NFCe }) + { + // Act + var dados = ChaveFiscal.ObterChave(ufs[i], new DateTime(2024, 12, 31), cnpjs[i], modelo, 883 + i, 999999990 + i, 2, 10000000 - i); + + // Assert + var dvLegado = CalcularDvAlgoritmoLegado(dados.Chave.Substring(0, 43)); + Assert.AreEqual(dvLegado, dados.DigitoVerificador.ToString(), "CNPJ {0}, modelo {1}", cnpjs[i], modelo); + Assert.IsTrue(ChaveFiscal.ChaveValida(dados.Chave)); + } + } + } + + [TestMethod] + public void ObterChave_ComCpfDe11Posicoes_PreencheComZerosAEsquerda() + { + // Act + var dados = ChaveFiscal.ObterChave(Estado.SP, new DateTime(2026, 7, 1), "12345678901", ModeloDocumento.NFe, 1, 123, 1, 55555); + + // Assert + Assert.AreEqual(44, dados.Chave.Length); + Assert.AreEqual("00012345678901", dados.Chave.Substring(6, 14)); + Assert.IsTrue(ChaveFiscal.ChaveValida(dados.Chave)); + } + + #endregion + + #region Validação do documento do emitente + + [TestMethod] + [DataRow("PC3D315K0001", DisplayName = "12 posições - base de CNPJ truncada")] + [DataRow("1122233300018", DisplayName = "13 posições")] + [DataRow("112223330001811", DisplayName = "15 posições")] + [DataRow("1234567890", DisplayName = "10 posições")] + public void ObterChave_ComDocumentoDeComprimentoInvalido_LancaArgumentException(string documento) + { + //um CNPJ truncado não pode virar silenciosamente uma chave bem-formada porém errada + Assert.ThrowsException(() => + ChaveFiscal.ObterChave(Estado.GO, new DateTime(2026, 7, 1), documento, ModeloDocumento.NFe, 1, 1, 1, 1)); + } + + [TestMethod] + public void ObterChave_ComDocumentoVazio_LancaArgumentException() + { + Assert.ThrowsException(() => + ChaveFiscal.ObterChave(Estado.GO, new DateTime(2026, 7, 1), "", ModeloDocumento.NFe, 1, 1, 1, 1)); + } + + [TestMethod] + public void ObterChave_ComDocumentoNulo_LancaArgumentException() + { + Assert.ThrowsException(() => + ChaveFiscal.ObterChave(Estado.GO, new DateTime(2026, 7, 1), null, ModeloDocumento.NFe, 1, 1, 1, 1)); + } + + #endregion + + /// + /// Implementação de referência do Anexo II da NT Conjunta 2025.001, portada para C# + /// + private static int CalcularDvReferenciaNt(string chave43) + { + var soma = 0; + var peso = 2; + for (var i = chave43.Length - 1; i >= 0; i--) + { + soma += (chave43[i] - '0') * peso; + peso = peso == 9 ? 2 : peso + 1; + } + var dv = 11 - soma % 11; + return dv >= 10 ? 0 : dv; + } + + /// + /// Algoritmo do DV como era antes da correção (só funciona com dígitos), + /// usado para garantir que chaves numéricas não sofreram regressão + /// + private static string CalcularDvAlgoritmoLegado(string chave43) + { + var soma = 0; + var peso = 2; + for (var i = chave43.Length - 1; i != -1; i--) + { + var ch = Convert.ToInt32(chave43[i].ToString()); + soma += ch * peso; + if (peso < 9) + peso += 1; + else + peso = 2; + } + var mod = soma % 11; + var dv = mod == 0 || mod == 1 ? 0 : 11 - mod; + return dv.ToString(); + } + } +} diff --git a/DFe.Testes/Gerais/CnpjFiscalTestes.cs b/DFe.Testes/Gerais/CnpjFiscalTestes.cs new file mode 100644 index 000000000..a91b7240c --- /dev/null +++ b/DFe.Testes/Gerais/CnpjFiscalTestes.cs @@ -0,0 +1,128 @@ +using System; +using DFe.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace DFe.Testes.Gerais +{ + /// + /// Testes do cálculo de dígitos verificadores e validação de CNPJ, + /// cobrindo CNPJs numéricos (fluxo antigo) e alfanuméricos (NT Conjunta 2025.001) + /// + [TestClass] + public class CnpjFiscalTestes + { + #region ObterDigitosVerificadores - vetores ouro + + [TestMethod] + [DataRow("112223330001", "81", DisplayName = "Base numérica")] + [DataRow("12ABC34501DE", "35", DisplayName = "Exemplo da NT Conjunta 2025.001")] + [DataRow("PC3D315K0001", "93", DisplayName = "CNPJ de teste da Receita Federal")] + [DataRow("000000000000", "00", DisplayName = "Base zerada - o DV confere, o bloqueio é do Valido")] + public void ObterDigitosVerificadores_ComBaseDe12Posicoes_RetornaDvsEsperados(string baseCnpj, string dvsEsperados) + { + Assert.AreEqual(dvsEsperados, CnpjFiscal.ObterDigitosVerificadores(baseCnpj)); + } + + [TestMethod] + [DataRow("000000000001", "91", DisplayName = "Banco do Brasil")] + [DataRow("114447770001", "61", DisplayName = "CNPJ numérico clássico de testes")] + [DataRow("123456780001", "95", DisplayName = "CNPJ numérico sequencial")] + public void ObterDigitosVerificadores_ComBasesNumericasHistoricas_MantemComportamentoAntigo(string baseCnpj, string dvsEsperados) + { + Assert.AreEqual(dvsEsperados, CnpjFiscal.ObterDigitosVerificadores(baseCnpj)); + } + + #endregion + + #region ObterDigitosVerificadores - entradas inválidas + + [TestMethod] + [DataRow("pc3d315k0001", DisplayName = "Minúsculas")] + [DataRow("12ABC34501D", DisplayName = "11 posições")] + [DataRow("12ABC34501DEF", DisplayName = "13 posições")] + [DataRow("12ABC34501D@", DisplayName = "Caractere @ (ASCII 64)")] + [DataRow("12ABC34501D:", DisplayName = "Caractere : (ASCII 58)")] + [DataRow("12.ABC.345/01", DisplayName = "Com máscara")] + [DataRow("", DisplayName = "Vazia")] + public void ObterDigitosVerificadores_ComBaseInvalida_LancaArgumentException(string baseCnpj) + { + Assert.ThrowsException(() => CnpjFiscal.ObterDigitosVerificadores(baseCnpj)); + } + + [TestMethod] + public void ObterDigitosVerificadores_ComBaseNula_LancaArgumentNullException() + { + Assert.ThrowsException(() => CnpjFiscal.ObterDigitosVerificadores(null)); + } + + #endregion + + #region Valido - CNPJs aceitos + + [TestMethod] + [DataRow("11222333000181", DisplayName = "Numérico do vetor ouro")] + [DataRow("12ABC34501DE35", DisplayName = "Alfanumérico do exemplo da NT")] + [DataRow("PC3D315K000193", DisplayName = "Alfanumérico de teste da Receita")] + [DataRow("00000000000191", DisplayName = "Numérico clássico - Banco do Brasil")] + [DataRow("11444777000161", DisplayName = "Numérico clássico de testes")] + public void Valido_ComCnpjCorreto_RetornaVerdadeiro(string cnpj) + { + Assert.IsTrue(CnpjFiscal.Valido(cnpj)); + } + + #endregion + + #region Valido - CNPJs rejeitados + + [TestMethod] + public void Valido_ComCnpjZerado_RetornaFalso() + { + //o DV do CNPJ zerado confere, mas a NT veda o seu uso + Assert.IsFalse(CnpjFiscal.Valido("00000000000000")); + } + + [TestMethod] + [DataRow("11222333000182", DisplayName = "Numérico com DV errado")] + [DataRow("12ABC34501DE36", DisplayName = "Alfanumérico com segundo DV errado")] + [DataRow("12ABC34501DE45", DisplayName = "Alfanumérico com primeiro DV errado")] + [DataRow("PC3D315K000139", DisplayName = "Alfanumérico com DVs trocados")] + public void Valido_ComDvIncorreto_RetornaFalso(string cnpj) + { + Assert.IsFalse(CnpjFiscal.Valido(cnpj)); + } + + [TestMethod] + [DataRow("pc3d315k000193", DisplayName = "Minúsculas")] + [DataRow("PC3D315K00019", DisplayName = "13 posições")] + [DataRow("PC3D315K0001935", DisplayName = "15 posições")] + [DataRow("12ABC34501DEA5", DisplayName = "Letra na posição dos DVs")] + [DataRow("12ABC34501D:93", DisplayName = "Caractere : (ASCII 58)")] + [DataRow("12ABC34501D@93", DisplayName = "Caractere @ (ASCII 64)")] + [DataRow("11.222.333/0001-81", DisplayName = "Com máscara")] + [DataRow("", DisplayName = "Vazio")] + [DataRow(null, DisplayName = "Nulo")] + public void Valido_ComFormatoInvalido_RetornaFalso(string cnpj) + { + Assert.IsFalse(CnpjFiscal.Valido(cnpj)); + } + + #endregion + + #region Coerência entre ObterDigitosVerificadores e Valido + + [TestMethod] + public void Valido_ComDvsCalculadosPelaPropriaClasse_RetornaVerdadeiro() + { + var bases = new[] { "112223330001", "12ABC34501DE", "PC3D315K0001", "A1B2C3D4E5F6", "ZZZZZZZZZZZZ", "0000000000AB", "999999999999" }; + + foreach (var baseCnpj in bases) + { + var cnpj = baseCnpj + CnpjFiscal.ObterDigitosVerificadores(baseCnpj); + + Assert.IsTrue(CnpjFiscal.Valido(cnpj), "O CNPJ {0} deveria ser válido", cnpj); + } + } + + #endregion + } +} diff --git a/DFe.Testes/Gerais/Code128HibridoTestes.cs b/DFe.Testes/Gerais/Code128HibridoTestes.cs new file mode 100644 index 000000000..9696207ba --- /dev/null +++ b/DFe.Testes/Gerais/Code128HibridoTestes.cs @@ -0,0 +1,252 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NFe.Danfe.PdfClown.Tools; + +namespace DFe.Testes.Gerais +{ + /// + /// Testes do codificador CODE-128 híbrido (subconjuntos C e A) da seção 6 da NT Conjunta 2025.001, + /// usado no código de barras da chave de acesso do DANFE + /// + [TestClass] + public class Code128HibridoTestes + { + private const byte StartC = 105; + private const byte TrocaParaCodeA = 101; + private const byte TrocaParaCodeC = 99; + private const byte Stop = 106; + + #region Exemplos literais da NT Conjunta 2025.001 - seção 6 + + [TestMethod] + public void ObterSimbolos_ExemploLiteralDaNT_5225AB83() + { + // Arrange - sequência completa dada pela NT: start, dados, DV 30 e stop + var esperado = new byte[] { 105, 52, 25, 101, 33, 34, 99, 83, 30, 106 }; + + // Act + var simbolos = Code128Hibrido.ObterSimbolos("5225AB83"); + + // Assert + CollectionAssert.AreEqual(esperado, simbolos); + } + + [TestMethod] + public void ObterSimbolos_ExemploLiteralDaNT_123A() + { + // Arrange - "12" em Code C, troca para o Code A (101), '3' (19) e 'A' (33) no Code A + var dadosEsperados = new byte[] { 105, 12, 101, 19, 33 }; + + // Act + var simbolos = Code128Hibrido.ObterSimbolos("123A"); + + // Assert + CollectionAssert.AreEqual(dadosEsperados, simbolos.Take(5).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + #endregion + + #region Chave de acesso com CNPJ alfanumérico + + [TestMethod] + public void ObterSimbolos_ChaveDeAcessoAlfanumericaDoVetorOuro_CodificaConformeAsRegrasDaNT() + { + // Arrange + //6 dígitos iniciais em Code C (3 pares); letras e corridas curtas do CNPJ no Code A; + //corrida final de 30 dígitos de volta ao Code C (15 pares) + var dadosEsperados = new byte[] + { + 105, //Start C + 52, 25, 7, //"522507" + 101, //troca para Code A + 48, 35, //'P' 'C' + 19, //'3' (corrida de 1 dígito fica no Code A) + 36, //'D' + 19, 17, 21, //'3' '1' '5' (corrida de 3 dígitos fica no Code A) + 43, //'K' + 99, //volta ao Code C (corrida final par) + 0, 1, 93, 55, 0, 10, 0, 0, 0, 1, 10, 0, 0, 0, 18 + }; + + // Act + var simbolos = Code128Hibrido.ObterSimbolos("522507PC3D315K000193550010000000011000000018"); + + // Assert + CollectionAssert.AreEqual(dadosEsperados, simbolos.Take(dadosEsperados.Length).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + #endregion + + #region Regressão - conteúdo 100% numérico deve gerar exatamente o CODE-128 C puro + + [TestMethod] + public void ObterSimbolos_ComChavesNumericas_IdenticoAoCode128CPuroDaImplementacaoAntiga() + { + var chavesNumericas = new[] + { + "23190811820016000167650010000000221100000227", + "11222333000181112223330001811122233300018111", + "00000000000000000000000000000000000000000000", + "99999999999999999999999999999999999999999999", + "35150300822602000124550010009923461099234656" + }; + + foreach (var chave in chavesNumericas) + { + // Act + var simbolos = Code128Hibrido.ObterSimbolos(chave); + + // Assert + CollectionAssert.AreEqual(CodificarCode128CPuroLegado(chave), simbolos, "Divergência na chave {0}", chave); + } + } + + #endregion + + #region Regras de troca de subconjunto + + [TestMethod] + public void ObterSimbolos_ComLetraInicial_TrocaParaCodeAAposOStartC() + { + var simbolos = Code128Hibrido.ObterSimbolos("A"); + + CollectionAssert.AreEqual(new byte[] { StartC, TrocaParaCodeA, 33 }, simbolos.Take(3).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + [TestMethod] + public void ObterSimbolos_CorridaDe4DigitosEntreLetras_VoltaAoCodeC() + { + //"AB" no Code A, "1234" volta ao Code C (2 pares), "CD" troca novamente para o Code A + var simbolos = Code128Hibrido.ObterSimbolos("AB1234CD"); + + CollectionAssert.AreEqual(new byte[] { StartC, TrocaParaCodeA, 33, 34, TrocaParaCodeC, 12, 34, TrocaParaCodeA, 35, 36 }, simbolos.Take(10).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + [TestMethod] + public void ObterSimbolos_CorridaDe3DigitosEntreLetras_PermaneceNoCodeA() + { + //corrida curta (menos de 4 dígitos) não justifica a troca + var simbolos = Code128Hibrido.ObterSimbolos("AB123C"); + + CollectionAssert.AreEqual(new byte[] { StartC, TrocaParaCodeA, 33, 34, 17, 18, 19, 35 }, simbolos.Take(8).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + [TestMethod] + public void ObterSimbolos_CorridaImparDe5DigitosAntesDeLetra_UltimoDigitoFicaNoCodeA() + { + //"12345" antes de letra: pares "12" "34" no Code C e o dígito ímpar '5' fica no Code A + var simbolos = Code128Hibrido.ObterSimbolos("AB12345C"); + + CollectionAssert.AreEqual(new byte[] { StartC, TrocaParaCodeA, 33, 34, TrocaParaCodeC, 12, 34, TrocaParaCodeA, 21, 35 }, simbolos.Take(10).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + [TestMethod] + public void ObterSimbolos_CorridaFinalParDe2Digitos_VoltaAoCodeC() + { + //final com quantidade par de dígitos volta ao Code C, como no exemplo 5225AB83 da NT + var simbolos = Code128Hibrido.ObterSimbolos("AB12"); + + CollectionAssert.AreEqual(new byte[] { StartC, TrocaParaCodeA, 33, 34, TrocaParaCodeC, 12 }, simbolos.Take(6).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + [TestMethod] + public void ObterSimbolos_CorridaFinalImparDe3Digitos_PermaneceNoCodeA() + { + var simbolos = Code128Hibrido.ObterSimbolos("AB123"); + + CollectionAssert.AreEqual(new byte[] { StartC, TrocaParaCodeA, 33, 34, 17, 18, 19 }, simbolos.Take(7).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + [TestMethod] + public void ObterSimbolos_CorridaFinalImparDe5Digitos_PrimeiroDigitoNoCodeAEDemaisNoCodeC() + { + //corrida final ímpar de 4+ dígitos: um dígito fica no Code A para a parte restante ser par + var simbolos = Code128Hibrido.ObterSimbolos("AB12345"); + + CollectionAssert.AreEqual(new byte[] { StartC, TrocaParaCodeA, 33, 34, 17, TrocaParaCodeC, 23, 45 }, simbolos.Take(8).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + [TestMethod] + public void ObterSimbolos_NumericoImpar_ParesNoCodeCEUltimoDigitoNoCodeA() + { + var simbolos = Code128Hibrido.ObterSimbolos("123"); + + CollectionAssert.AreEqual(new byte[] { StartC, 12, TrocaParaCodeA, 19 }, simbolos.Take(4).ToArray()); + AssertDigitoVerificadorEStop(simbolos); + } + + #endregion + + #region Entradas inválidas + + [TestMethod] + [DataRow("")] + [DataRow(null)] + public void ObterSimbolos_ComCodigoVazioOuNulo_LancaArgumentException(string codigo) + { + Assert.ThrowsException(() => Code128Hibrido.ObterSimbolos(codigo)); + } + + [TestMethod] + [DataRow("12a4", DisplayName = "Letra minúscula")] + [DataRow("12-4", DisplayName = "Hífen")] + [DataRow("12 34", DisplayName = "Espaço")] + [DataRow("12@34", DisplayName = "Caractere @")] + public void ObterSimbolos_ComCaractereForaDeDigitosELetrasMaiusculas_LancaArgumentException(string codigo) + { + Assert.ThrowsException(() => Code128Hibrido.ObterSimbolos(codigo)); + } + + #endregion + + /// + /// Confere as duas últimas posições da sequência: o DV módulo 103 + /// (soma ponderada com o start valendo peso 1) e o símbolo de Stop (106) + /// + private static void AssertDigitoVerificadorEStop(byte[] simbolos) + { + Assert.AreEqual(Stop, simbolos[simbolos.Length - 1], "O último símbolo deve ser o Stop (106)"); + + var soma = (int)simbolos[0]; + for (var i = 1; i < simbolos.Length - 2; i++) + soma += i * simbolos[i]; + + Assert.AreEqual((byte)(soma % 103), simbolos[simbolos.Length - 2], "Dígito verificador módulo 103 incorreto"); + } + + /// + /// Comportamento da implementação antiga (Barcode128C do DANFE PdfClown): Start C, + /// dados aos pares, DV módulo 103 e Stop - referência de regressão para conteúdo numérico + /// + private static byte[] CodificarCode128CPuroLegado(string codigo) + { + var codeBytes = new List { 105 }; + + for (var i = 0; i < codigo.Length; i += 2) + codeBytes.Add(byte.Parse(codigo.Substring(i, 2))); + + var cd = 105; + for (var i = 1; i < codeBytes.Count; i++) + { + cd += i * codeBytes[i]; + cd %= 103; + } + + codeBytes.Add((byte)cd); + codeBytes.Add(106); + + return codeBytes.ToArray(); + } + } +} diff --git a/DFe.Testes/Gerais/DanfePdfClownChaveAlfanumericaTestes.cs b/DFe.Testes/Gerais/DanfePdfClownChaveAlfanumericaTestes.cs new file mode 100644 index 000000000..1599753fa --- /dev/null +++ b/DFe.Testes/Gerais/DanfePdfClownChaveAlfanumericaTestes.cs @@ -0,0 +1,76 @@ +using System; +using System.IO; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NFe.Danfe.PdfClown; +using NFe.Danfe.PdfClown.Modelo; + +namespace DFe.Testes.Gerais +{ + /// + /// Smoke test do DANFE PdfClown: o PDF deve ser gerado com o código de barras CODE-128 híbrido + /// tanto para chave 100% numérica (fluxo antigo) quanto para chave com CNPJ alfanumérico + /// + [TestClass] + public class DanfePdfClownChaveAlfanumericaTestes + { + private static DanfeViewModel CriarViewModelMinimo(string chaveAcesso) + { + var model = new DanfeViewModel + { + ChaveAcesso = chaveAcesso, + NfNumero = 1, + NfSerie = 1, + TipoNF = 1, + TipoAmbiente = 2, + DataHoraEmissao = new DateTime(2025, 7, 15), + NaturezaOperacao = "VENDA", + ProtocoloAutorizacao = "352250000000001 15/07/2025 10:00:00" + }; + + model.Emitente.RazaoSocial = "EMITENTE DE TESTE LTDA"; + model.Emitente.CnpjCpf = chaveAcesso.Substring(6, 14); + model.Emitente.EnderecoLogadrouro = "RUA DE TESTE"; + model.Emitente.EnderecoNumero = "1"; + model.Emitente.EnderecoBairro = "CENTRO"; + model.Emitente.Municipio = "GOIANIA"; + model.Emitente.EnderecoUf = "GO"; + model.Emitente.EnderecoCep = "74000000"; + + model.Destinatario.RazaoSocial = "DESTINATARIO DE TESTE"; + model.Destinatario.CnpjCpf = "11222333000181"; + model.Destinatario.EnderecoLogadrouro = "AVENIDA DE TESTE"; + model.Destinatario.EnderecoNumero = "2"; + model.Destinatario.EnderecoBairro = "CENTRO"; + model.Destinatario.Municipio = "GOIANIA"; + model.Destinatario.EnderecoUf = "GO"; + model.Destinatario.EnderecoCep = "74000001"; + + return model; + } + + [TestMethod] + [DataRow("522507PC3D315K000193550010000000011000000018", DisplayName = "Chave com CNPJ alfanumérico")] + [DataRow("23190811820016000167650010000000221100000227", DisplayName = "Chave numérica (regressão)")] + public void Gerar_DanfeComChave_ProduzPdf(string chaveAcesso) + { + // Arrange + var model = CriarViewModelMinimo(chaveAcesso); + + using (var danfe = new DanfeDoc(model)) + { + // Act + danfe.Gerar(); + + using (var ms = new MemoryStream()) + { + danfe.Salvar(ms); + + // Assert - PDF gerado, não vazio e com o cabeçalho %PDF + var bytes = ms.ToArray(); + Assert.IsTrue(bytes.Length > 1000, "O PDF gerado está vazio ou pequeno demais ({0} bytes)", bytes.Length); + Assert.AreEqual("%PDF", System.Text.Encoding.ASCII.GetString(bytes, 0, 4)); + } + } + } + } +} diff --git a/DFe.Testes/Gerais/FormatadorDanfeTestes.cs b/DFe.Testes/Gerais/FormatadorDanfeTestes.cs new file mode 100644 index 000000000..f98d60239 --- /dev/null +++ b/DFe.Testes/Gerais/FormatadorDanfeTestes.cs @@ -0,0 +1,77 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NFe.Danfe.PdfClown.Tools; + +namespace DFe.Testes.Gerais +{ + /// + /// Testes da formatação de CNPJ, CPF e chave de acesso do DANFE (PdfClown), + /// cobrindo documentos numéricos (fluxo antigo) e o CNPJ alfanumérico da NT Conjunta 2025.001 + /// + [TestClass] + public class FormatadorDanfeTestes + { + #region FormatarCnpj + + [TestMethod] + [DataRow("11222333000181", "11.222.333/0001-81", DisplayName = "CNPJ numérico")] + [DataRow("00000000000191", "00.000.000/0001-91", DisplayName = "CNPJ numérico com zeros")] + [DataRow("12ABC34501DE35", "12.ABC.345/01DE-35", DisplayName = "CNPJ alfanumérico da NT")] + [DataRow("PC3D315K000193", "PC.3D3.15K/0001-93", DisplayName = "CNPJ alfanumérico de teste da Receita")] + public void FormatarCnpj_ComCnpjSemMascara_AplicaAMascaraPosicional(string cnpj, string esperado) + { + Assert.AreEqual(esperado, Formatador.FormatarCnpj(cnpj)); + } + + [TestMethod] + [DataRow("11.222.333/0001-81", "11.222.333/0001-81", DisplayName = "Numérico já com máscara")] + [DataRow("12.ABC.345/01DE-35", "12.ABC.345/01DE-35", DisplayName = "Alfanumérico já com máscara")] + public void FormatarCnpj_ComCnpjJaFormatado_MantemAMascara(string cnpj, string esperado) + { + Assert.AreEqual(esperado, Formatador.FormatarCnpj(cnpj)); + } + + [TestMethod] + [DataRow("12abc34501de35", DisplayName = "Minúsculas não formatam")] + [DataRow("12ABC34501DEA5", DisplayName = "Letra nos DVs não formata")] + [DataRow("123", DisplayName = "Curto demais não formata")] + public void FormatarCnpj_ComConteudoForaDoPadrao_DevolveOTextoOriginal(string cnpj) + { + Assert.AreEqual(cnpj, Formatador.FormatarCnpj(cnpj)); + } + + #endregion + + #region FormatarCpfCnpj + + [TestMethod] + [DataRow("12345678901", "123.456.789-01", DisplayName = "CPF continua com máscara de CPF")] + [DataRow("11222333000181", "11.222.333/0001-81", DisplayName = "CNPJ numérico")] + [DataRow("12ABC34501DE35", "12.ABC.345/01DE-35", DisplayName = "CNPJ alfanumérico")] + public void FormatarCpfCnpj_EscolheAMascaraCorreta(string documento, string esperado) + { + Assert.AreEqual(esperado, Formatador.FormatarCpfCnpj(documento)); + } + + #endregion + + #region FormatarChaveAcesso + + [TestMethod] + public void FormatarChaveAcesso_ComChaveAlfanumerica_AgrupaDeQuatroEmQuatro() + { + var formatada = Formatador.FormatarChaveAcesso("522507PC3D315K000193550010000000011000000018"); + + Assert.AreEqual("5225 07PC 3D31 5K00 0193 5500 1000 0000 0110 0000 0018", formatada); + } + + [TestMethod] + public void FormatarChaveAcesso_ComChaveNumerica_AgrupaDeQuatroEmQuatro() + { + var formatada = Formatador.FormatarChaveAcesso("23190811820016000167650010000000221100000227"); + + Assert.AreEqual("2319 0811 8200 1600 0167 6500 1000 0000 2211 0000 0227", formatada); + } + + #endregion + } +} diff --git a/DFe.Utils/ChaveFiscal.cs b/DFe.Utils/ChaveFiscal.cs index f8a200231..e5ef555fa 100644 --- a/DFe.Utils/ChaveFiscal.cs +++ b/DFe.Utils/ChaveFiscal.cs @@ -24,11 +24,24 @@ public class ChaveFiscal /// Retorna um objeto com os dados da chave de acesso public static DadosChaveFiscal ObterChave(Estado ufEmitente, DateTimeOffset dataEmissao, string cnpjEmitente, ModeloDocumento modelo, int serie, long numero, int tipoEmissao, int cNf) { + if (string.IsNullOrEmpty(cnpjEmitente)) + throw new ArgumentException("O CNPJ/CPF do emitente deve ser informado.", "cnpjEmitente"); + + // NT Conjunta 2025.001: o CNPJ pode ser alfanumérico ([A-Z0-9]{12}[0-9]{2}) e ocupa 14 posições na chave. + // Somente CPF (11 posições) é completado com zeros à esquerda; qualquer outro comprimento seria um + // documento truncado e geraria uma chave bem-formada porém errada. + var documentoEmitente = cnpjEmitente.Length == 11 ? cnpjEmitente.PadLeft(14, '0') : cnpjEmitente; + + if (documentoEmitente.Length != 14) + throw new ArgumentException( + string.Format("O documento do emitente deve ter 14 posições (CNPJ) ou 11 posições (CPF); o valor informado \"{0}\" tem {1}.", cnpjEmitente, cnpjEmitente.Length), + "cnpjEmitente"); + var chave = new StringBuilder(); chave.Append(((int)ufEmitente).ToString("D2")) .Append(dataEmissao.ToString("yyMM")) - .Append(cnpjEmitente) + .Append(documentoEmitente) .Append(((int)modelo).ToString("D2")) .Append(serie.ToString("D3")) .Append(numero.ToString("D9")) @@ -57,7 +70,7 @@ private static string ObterDigitoVerificador(string chave) //percorrendo cada caractere da chave da direita para esquerda para fazer os cálculos com o peso for (var i = chave.Length - 1; i != -1; i--) { - var ch = Convert.ToInt32(chave[i].ToString()); + var ch = ObterValorDoCaractere(chave[i]); soma += ch*peso; //sempre que for 9 voltamos o peso a 2 if (peso < 9) @@ -77,6 +90,21 @@ private static string ObterDigitoVerificador(string chave) return dv.ToString(); } + /// + /// Obtém o valor numérico de um caractere da chave para o cálculo do dígito verificador, + /// conforme a NT Conjunta 2025.001: valor = código ASCII - 48 ('0'-'9' => 0 a 9; 'A'-'Z' => 17 a 42) + /// + private static int ObterValorDoCaractere(char caractere) + { + // A chave admite somente dígitos e letras maiúsculas; qualquer outro caractere + // (minúsculas, símbolos, ASCII 58-64) produziria um DV errado sem nenhum erro. + if ((caractere < '0' || caractere > '9') && (caractere < 'A' || caractere > 'Z')) + throw new ArgumentException( + string.Format("Caractere inválido na chave do DF-e: '{0}'. São aceitos somente dígitos (0-9) e letras maiúsculas (A-Z).", caractere)); + + return caractere - '0'; + } + /// /// Informa se a chave de um DF-e é válida /// diff --git a/DFe.Utils/CnpjFiscal.cs b/DFe.Utils/CnpjFiscal.cs new file mode 100644 index 000000000..27bbd6b5a --- /dev/null +++ b/DFe.Utils/CnpjFiscal.cs @@ -0,0 +1,73 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; + +namespace DFe.Utils +{ + /// + /// Classe com métodos para tratamento do CNPJ, incluindo o CNPJ alfanumérico da NT Conjunta 2025.001 + /// (12 posições [A-Z0-9] + 2 dígitos verificadores numéricos) + /// + public static class CnpjFiscal + { + private static readonly Regex FormatoCnpj = new Regex("^[A-Z0-9]{12}[0-9]{2}$", RegexOptions.Compiled); + private static readonly Regex FormatoBaseCnpj = new Regex("^[A-Z0-9]{12}$", RegexOptions.Compiled); + + /// + /// Calcula os dois dígitos verificadores para as 12 primeiras posições de um CNPJ, + /// conforme a NT Conjunta 2025.001: módulo 11 sobre o valor de cada caractere (código ASCII - 48), + /// com pesos de 2 a 9 aplicados da direita para a esquerda + /// + /// 12 primeiras posições do CNPJ ([A-Z0-9]{12}) + /// Os dois dígitos verificadores, ex.: "93" + public static string ObterDigitosVerificadores(string cnpjBase) + { + if (cnpjBase == null) + throw new ArgumentNullException("cnpjBase"); + + if (!FormatoBaseCnpj.IsMatch(cnpjBase)) + throw new ArgumentException( + string.Format("A base do CNPJ deve ter 12 posições contendo somente dígitos e letras maiúsculas; valor informado: \"{0}\".", cnpjBase), + "cnpjBase"); + + var dv1 = CalcularDigito(cnpjBase); + var dv2 = CalcularDigito(cnpjBase + dv1); + + return string.Concat(dv1, dv2); + } + + /// + /// Informa se um CNPJ de 14 posições é válido: formato [A-Z0-9]{12}[0-9]{2}, + /// dígitos verificadores corretos e diferente do CNPJ zerado (vedado pela NT Conjunta 2025.001) + /// + /// CNPJ com 14 posições, sem máscara + public static bool Valido(string cnpj) + { + if (string.IsNullOrEmpty(cnpj) || !FormatoCnpj.IsMatch(cnpj)) + return false; + + //CNPJ zerado tem dígitos verificadores que conferem, mas é vedado + if (cnpj.All(c => c == '0')) + return false; + + return cnpj.Substring(12, 2) == ObterDigitosVerificadores(cnpj.Substring(0, 12)); + } + + private static int CalcularDigito(string valor) + { + var soma = 0; + var peso = 2; + + //pesos de 2 a 9, aplicados da direita para a esquerda + for (var i = valor.Length - 1; i != -1; i--) + { + //NT Conjunta 2025.001: valor do caractere = código ASCII - 48 ('0'-'9' => 0 a 9; 'A'-'Z' => 17 a 42) + soma += (valor[i] - '0') * peso; + peso = peso == 9 ? 2 : peso + 1; + } + + var resto = soma % 11; + return resto < 2 ? 0 : 11 - resto; + } + } +} diff --git a/NFe.AppTeste/MainWindow.xaml.cs b/NFe.AppTeste/MainWindow.xaml.cs index 8c8204798..00dcd25e4 100644 --- a/NFe.AppTeste/MainWindow.xaml.cs +++ b/NFe.AppTeste/MainWindow.xaml.cs @@ -1973,14 +1973,11 @@ private void BtnAdminCsc_Click(object sender, RoutedEventArgs e) throw new Exception("O Identificador do tipo de operação deve ser um número inteiro entre 1 e 3!"); //raizCnpj - var raizCnpj = Funcoes.InpuBox(this, "Administração do CSC", "Raiz do CNPJ do contribuinte que está efetuando a consulta (oito primeiros dígitos do CNPJ):"); + var raizCnpj = Funcoes.InpuBox(this, "Administração do CSC", "Raiz do CNPJ do contribuinte que está efetuando a consulta (oito primeiras posições do CNPJ):"); if (string.IsNullOrEmpty(raizCnpj)) throw new Exception("A Raiz do CNPJ do contribuinte deve ser informada!"); - long l; - var longo = long.TryParse(raizCnpj, out l); - if (!longo) - throw new Exception("A Raiz do CNPJ do contribuinte deve conter apenas números!"); - if (raizCnpj.Length != 8) - throw new Exception("A Raiz do CNPJ do contribuinte deve conter 8 caracteres!"); + //NT Conjunta 2025.001: o CNPJ pode ser alfanumérico nas 12 primeiras posições + if (!System.Text.RegularExpressions.Regex.IsMatch(raizCnpj, "^[0-9A-Z]{8}$")) + throw new Exception("A Raiz do CNPJ do contribuinte deve conter 8 caracteres, apenas números e letras maiúsculas!"); var idCsc = ""; var codigoCsc = ""; diff --git a/NFe.AppTeste/Schemas-sem-vIBS/eventoEPEC_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/eventoEPEC_v1.00.xsd index 3562cc9eb..5524009ff 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/eventoEPEC_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/eventoEPEC_v1.00.xsd @@ -213,7 +213,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteCCe_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteCCe_v1.00.xsd index 4cd45988d..beff945c0 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteCCe_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteCCe_v1.00.xsd @@ -151,7 +151,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteConfRecebto_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteConfRecebto_v1.00.xsd index 44581e874..3a610a676 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteConfRecebto_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteConfRecebto_v1.00.xsd @@ -138,7 +138,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteConsSitNFe_v4.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteConsSitNFe_v4.00.xsd index a56621542..8672a6761 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteConsSitNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteConsSitNFe_v4.00.xsd @@ -316,7 +316,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEPEC_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEPEC_v1.00.xsd index 132be27b9..746689377 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEPEC_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEPEC_v1.00.xsd @@ -139,7 +139,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoAtorInteressado_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoAtorInteressado_v1.00.xsd index 6eeb536ed..8b2ccfa2d 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoAtorInteressado_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoAtorInteressado_v1.00.xsd @@ -173,7 +173,7 @@ Outros valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco; - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancEConf_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancEConf_v1.00.xsd index 710d25def..47e963bca 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancEConf_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancEConf_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancEntregaNFe_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancEntregaNFe_v1.00.xsd index 17a5396c5..c3b05d07a 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancEntregaNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancEntregaNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancInsucessoNFe_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancInsucessoNFe_v1.00.xsd index 0bde4345e..cfbf265f3 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancInsucessoNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancInsucessoNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancNFe_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancNFe_v1.00.xsd index bf0d09a8b..719fdeaab 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancNFe_v1.00.xsd @@ -127,7 +127,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancSubst_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancSubst_v1.00.xsd index ce7b2c3db..b41416032 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancSubst_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoCancSubst_v1.00.xsd @@ -155,7 +155,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoEConf_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoEConf_v1.00.xsd index fe9d449d5..530897c85 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoEConf_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoEConf_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoEntregaNFe_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoEntregaNFe_v1.00.xsd index a7d70d798..be38d6aa2 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoEntregaNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoEntregaNFe_v1.00.xsd @@ -90,7 +90,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoInsucessoNFe_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoInsucessoNFe_v1.00.xsd index 9ab61fe47..3b7915676 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoInsucessoNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEventoInsucessoNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEvento_v1.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEvento_v1.00.xsd index f1e023fed..e02813f96 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteEvento_v1.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteEvento_v1.00.xsd @@ -99,7 +99,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/leiauteInutNFe_v4.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/leiauteInutNFe_v4.00.xsd index 819597c1a..886e05d0f 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/leiauteInutNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/leiauteInutNFe_v4.00.xsd @@ -76,7 +76,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v1.03.xsd b/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v1.03.xsd index c967c195b..06f4c6147 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v1.03.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v1.03.xsd @@ -58,7 +58,7 @@ - + @@ -94,7 +94,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v1.03_OPENSSL.xsd b/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v1.03_OPENSSL.xsd index 851a822ba..142dd55b2 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v1.03_OPENSSL.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v1.03_OPENSSL.xsd @@ -59,7 +59,7 @@ - + @@ -95,7 +95,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -114,7 +114,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v4.00.xsd b/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v4.00.xsd index dfabc3366..4ead3c532 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v4.00.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/tiposBasico_v4.00.xsd @@ -52,7 +52,7 @@ - + @@ -92,7 +92,7 @@ - + @@ -102,7 +102,7 @@ - + @@ -112,7 +112,7 @@ - + diff --git a/NFe.AppTeste/Schemas-sem-vIBS/tiposDistDFe_v1.01.xsd b/NFe.AppTeste/Schemas-sem-vIBS/tiposDistDFe_v1.01.xsd index 8b0d8a135..1aa75ec7d 100644 --- a/NFe.AppTeste/Schemas-sem-vIBS/tiposDistDFe_v1.01.xsd +++ b/NFe.AppTeste/Schemas-sem-vIBS/tiposDistDFe_v1.01.xsd @@ -116,7 +116,7 @@ - + @@ -173,7 +173,7 @@ - + diff --git a/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd b/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd index a5051dd02..d204e4061 100644 --- a/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd +++ b/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd @@ -1,6 +1,16 @@ + + + Tipo Chave de Documento Fiscal Eletrônico + + + + + + + Tipo string genérico @@ -55,6 +65,24 @@ + + + Tipo CNPJ Base + + + + + + + + + Tipo CNPJ + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais @@ -81,6 +109,23 @@ + + + + + + + Tipo de Receita Bruta do SN + + + + + + + + + + @@ -93,6 +138,8 @@ + + @@ -115,6 +162,14 @@ + + + Ano e mês referência do período de apuração (AAAA-MM) + + + + + Grupo de informações da Tributação da NFCom @@ -163,6 +218,26 @@ + + + Grupo de informações da Tributação da NFGas + + + + + Código Situação Tributária do IBS/CBS + + + + + + + + Informado conforme indicador no cClassTrib + + + + Grupo de informações da Tributação da NFAg @@ -240,7 +315,7 @@ - + @@ -262,7 +337,7 @@ - + Informar essa opção da Choice para Monofasia (CST 620) @@ -298,33 +373,6 @@ - - - Grupo de informações da Tributação da NFGas - - - - - Código Situação Tributária do IBS/CBS - - - - - - - - - Informar essa opção da Choice para Monofasia - - - - - - Informado conforme indicador no cClassTrib - - - - Grupo de informações do Imposto Seletivo @@ -347,7 +395,7 @@ Alíquota do Imposto Seletivo (percentual) - + Alíquota do Imposto Seletivo (por valor) @@ -949,6 +997,152 @@ Grupo de campos da redução de aliquota + + + Grupo de operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + Grupo de informações para identificação de operações em áreas incentivadas (ALC/ZFM) com alíquota zero da CBS, conforme arts. 451 e 466 da LC 214/2025, quando fornecedor e destinatário estiverem nessas áreas, distinguindo a existência de processo aprovado na Suframa. + + + + + Valor da CBS + + + + + + + + Grupo de informações da Tributação Regular. Informar como seria a tributação caso não cumprida a condição resolutória/suspensiva. Exemplo 1: Art. 442, §4. Operações com ZFM e ALC. Exemplo 2: Operações com suspensão do tributo. + + + + + Grupo de informações da composição do valor do IBS e da CBS em compras governamental + + + + + + + Tipo CBS IBS Completo NFe + + + + IBS / CBS + + + + Valor do BC + + + + + + Grupo de informações do IBS na UF + + + + + + Aliquota do IBS de competência das UF (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Valor do IBS de competência das UF + + + + + + + + Grupo de Informações do IBS no Município + + + + + + Aliquota do IBS Municipal (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Valor do IBS Municipal + + + + + + + + Valor do IBS + + + + + + Grupo de Tributação da CBS + + + + + + Aliquota da CBS (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Grupo de operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + Grupo de informações para identificação de operações em áreas incentivadas (ALC/ZFM) com alíquota zero da CBS, conforme arts. 451 e 466 da LC 214/2025, quando fornecedor e destinatário estiverem nessas áreas, distinguindo a existência de processo aprovado na Suframa. + + Valor da CBS @@ -1032,10 +1226,14 @@ Tipo Devolução Tributo + + + Percentual de devolução do tributo, conforme LC 214/25 art. 118. + + - Valor do tributo devolvido. No fornecimento de energia elétrica, água, esgoto e -gás natural e em outras hipóteses definidas no regulamento + Valor do tributo devolvido ("cashback" de desconto na própria Nota Fiscal / Fatura) @@ -1131,7 +1329,9 @@ gás natural e em outras hipóteses definidas no regulamento 1=União 2=Estados 3=Distrito Federal -4=Municípios +4=Municípios +5=Consórcio Público +6=Comitê Gestor do IBS @@ -1139,6 +1339,29 @@ gás natural e em outras hipóteses definidas no regulamento Percentual de redução de aliquota em compra governamental + + + Tipo da operação com ente governamental: +1 – Fornecimento com pagamento posterior; + +2 - Recebimento do pagamento com fornecimento já realizado; + +3 – Fornecimento com pagamento já realizado; + +4 – Recebimento do pagamento com fornecimento posterior; + + + + + Chave de acesso do documento fiscal anterior. + +Deverá ser informado para tpOperGov 2 e 3 e vedado para os tipos 1 e 4. + +No caso do tpOperGov 2 aceitará apenas uma chave referenciada, no tipo 3 poderá aceitar múltiplas chaves + +Obs: a chave de acesso deverá ser de um emitente com o mesmo CNPJ base + + @@ -1153,19 +1376,49 @@ gás natural e em outras hipóteses definidas no regulamento 1=União 2=Estados 3=Distrito Federal -4=Municípios +4=Municípios +5=Consórcio Público +6=Comitê Gestor do IBS - Percentual de redução de aliquota em compra governamental + Percentual de redução de alíquota em compra governamental Tipo da operação com ente governamental: -1 - Fornecimento -2 - Recebimento do Pagamento +1 – Fornecimento com pagamento posterior; +2 - Recebimento do pagamento com fornecimento já realizado; +3 – Fornecimento com pagamento já realizado; +4 – Recebimento do pagamento com fornecimento posterior; + + + + + Chave de acesso do documento fiscal anterior. + +Deverá ser informado para tpOperGov 2 e 3 e vedado para os tipos 1 e 4. + +No caso do tpOperGov 2 aceitará apenas uma chave referenciada, no tipo 3 poderá aceitar múltiplas chaves + +Obs: a chave de acesso deverá ser de um emitente com o mesmo CNPJ base + + + + + + + Tipo Pagamento que ocorre em DFe emitdo anteriormente + Informado para abater as parcelas de antecipação de pagamento, conforme art. 10 §4 + + + + + Chave de acesso do documento fiscal de antecipação de pagamento + +Obs: esse DFe deverá ter o indAntecipacaoPgto marcado no grupo ide @@ -1187,6 +1440,68 @@ gás natural e em outras hipóteses definidas no regulamento + + + Tipo Operações em areas incentivadas com CBS Zero + + + + + Percentual efetivo sem a redução + Alíquota efetiva de referência da CBS aplicável à operação fora de áreas ou regimes incentivados. + + + + + Valor efetivo sem a redução + Valor da CBS calculado para a operação fora de áreas ou regimes incentivado + + + + + + + Tipo Operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + + + + + Tipo de aplicação da alíquota zero da CBS. + + + + + + + + + + + + Número do processo na Suframa para o item +comercializado. + + + + + + + + + + + Percentual efetivo sem a redução + Alíquota efetiva de referência da CBS aplicável à operação fora de áreas ou regimes incentivados. + + + + + Valor efetivo sem a redução + Valor da CBS calculado para a operação fora de áreas ou regimes incentivado + + + + Tipo Estorno de Crédito @@ -1204,14 +1519,6 @@ gás natural e em outras hipóteses definidas no regulamento - - - Ano e mês referência do período de apuração (AAAA-MM) - - - - - Tipo Ajuste de Competência 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/eventoEPEC_v1.00.xsd b/NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd index 3562cc9eb..5524009ff 100644 --- a/NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd +++ b/NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd @@ -213,7 +213,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd index 4cd45988d..beff945c0 100644 --- a/NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd @@ -151,7 +151,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteConfRecebto_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteConfRecebto_v1.00.xsd index 44581e874..3a610a676 100644 --- a/NFe.AppTeste/Schemas/leiauteConfRecebto_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteConfRecebto_v1.00.xsd @@ -138,7 +138,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd index 132be27b9..746689377 100644 --- a/NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd @@ -139,7 +139,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoAtorInteressado_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoAtorInteressado_v1.00.xsd index 6eeb536ed..8b2ccfa2d 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoAtorInteressado_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoAtorInteressado_v1.00.xsd @@ -173,7 +173,7 @@ Outros valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco; - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancEConf_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancEConf_v1.00.xsd index 710d25def..47e963bca 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancEConf_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancEConf_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancEntregaNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancEntregaNFe_v1.00.xsd index 17a5396c5..c3b05d07a 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancEntregaNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancEntregaNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancInsucessoNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancInsucessoNFe_v1.00.xsd index 0bde4345e..cfbf265f3 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancInsucessoNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancInsucessoNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancNFe_v1.00.xsd index bf0d09a8b..719fdeaab 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancNFe_v1.00.xsd @@ -127,7 +127,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancSubst_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancSubst_v1.00.xsd index ce7b2c3db..b41416032 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancSubst_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancSubst_v1.00.xsd @@ -155,7 +155,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoEConf_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoEConf_v1.00.xsd index fe9d449d5..530897c85 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoEConf_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoEConf_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoEntregaNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoEntregaNFe_v1.00.xsd index a7d70d798..be38d6aa2 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoEntregaNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoEntregaNFe_v1.00.xsd @@ -90,7 +90,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoInsucessoNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoInsucessoNFe_v1.00.xsd index 9ab61fe47..3b7915676 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoInsucessoNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoInsucessoNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd index f1e023fed..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 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd index 9409ba120..e27ed6a87 100644 --- a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd @@ -1,23 +1,5 @@ - - - - - - - - - - - - - - - - - - @@ -73,10 +55,7 @@ - Série do Documento Fiscal -série normal 0-889 -Avulsa Fisco 890-899 -SCAN 900-999 + Série do Documento Fiscal @@ -132,13 +111,19 @@ SCAN 900-999 Informar o município de ocorrência do fato gerador do fato gerador do IBS / CBS. -Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do estabelecimento) ”, e não tiver endereço do destinatário (Grupo: E05) ou local de entrega (Grupo: G01). +Campo preenchido somente quando "indPres = 5 (Operação presencial, fora do estabelecimento)", e não estiver preenchido o endereço do destinatário (grupo: E05) nem o local de entrega (grupo: G01). - Formato de impressão do DANFE (0-sem DANFE;1-DANFe Retrato; 2-DANFe Paisagem;3-DANFe Simplificado; - 4-DANFe NFC-e;5-DANFe NFC-e em mensagem eletrônica) + Formato de impressão do DANFE: +0 - Sem DANFE; +1 - DANFE Retrato; +2 - DANFE Paisagem; +3 - DANFE Simplificado; +4 - DANFE NFC-e; +5 - DANFE NFC-e em mensagem eletrônica; +6 - DANFE Simplificado Tipo 2 (nas condições do Ajuste SINIEF 13/26). @@ -149,20 +134,21 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e + - Forma de emissão da NF-e + Forma de emissão da NF-e: 1 - Normal; -2 - Contingência FS -3 - Regime Especial NFF (NT 2021.002) -4 - Contingência DPEC -5 - Contingência FSDA -6 - Contingência SVC - AN -7 - Contingência SVC - RS -9 - Contingência off-line NFC-e +2 - Contingência FS; +3 - Regime Especial NFF (NT 2021.002); +4 - Contingência DPEC; +5 - Contingência FSDA; +6 - Contingência SVC - AN; +7 - Contingência SVC - RS; +9 - Contingência off-line da NFC-e e da NF-e com DANFE Simplificado Tipo 2. @@ -209,13 +195,7 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e - Tipo de Nota de Débito: -01=Transferência de créditos para Cooperativas; -02=Anulação de Crédito por Saídas Imunes/Isentas; -03=Débitos de notas fiscais não processadas na apuração; -04=Multa e juros; -05=Transferência de crédito de sucessão. - + Tipo de Nota de Débito @@ -237,8 +217,14 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e - Indicador de presença do comprador no estabelecimento comercial no momento da oepração - (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação presencial;2-Não presencial, internet;3-Não presencial, teleatendimento;4-NFC-e entrega em domicílio;5-Operação presencial, fora do estabelecimento;9-Não presencial, outros) + Indicador de presença do comprador no estabelecimento comercial no momento da oepração: +0 - Não se aplica (ex.: Nota Fiscal complementar ou de ajuste); +1 - Operação presencial; +2 - Operação não presencial, internet; +3 - Operação não presencial, teleatendimento; +4 - Operação não presencial com NFC-e e NFe com DANFE Simplificado Tipo 2 (com entrega); +5 - Operação presencial, fora do estabelecimento; +9 - Operação não presencial, outros. @@ -267,6 +253,17 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e + + + Código indicador do local da operação de fornecimento + + + + + + + + Processo de emissão utilizado com a seguinte codificação: @@ -620,6 +617,17 @@ Este campo será obrigatoriamente preenchido com: + + + Inscrição do emitente na Suframa + + + + + + + + @@ -6654,7 +6662,7 @@ tipo de ato concessório: - + @@ -6728,7 +6736,7 @@ tipo de ato concessório: Descrição literal do status do serviço solicitado. - + Código da Mensagem. @@ -6747,7 +6755,7 @@ tipo de ato concessório: - + @@ -7483,7 +7491,7 @@ alterado para tamanho variavel 1-4. (NT2011/004) 04=Multa e juros; 05=Transferência de crédito na sucessão; 06=Pagamento antecipado; - 07=Perda em estoque; + 07=Perda em estoque (Perecimento, Perda, Furto, Roubo); 08=Desenquadramento do SN; @@ -7506,6 +7514,7 @@ alterado para tamanho variavel 1-4. (NT2011/004) 03=Retorno por recusa na entrega ou por não localização do destinatário na tentativa de entrega; 04=Redução de valores; 05=Transferência de crédito na sucessão; + 06=Retorno por recusa parcial na entrega; @@ -7515,6 +7524,7 @@ alterado para tamanho variavel 1-4. (NT2011/004) + 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 1f9c9904b..592056fcc 100644 --- a/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd +++ b/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd @@ -1,13 +1,4 @@ - - - - - - - - - @@ -68,7 +59,7 @@ - + @@ -95,7 +86,8 @@ - + + @@ -104,16 +96,16 @@ - + - Tipo Número do CNPJ tmanho varíavel (3-14) + Tipo Número do CNPJ - + @@ -123,7 +115,7 @@ - + @@ -903,4 +895,13 @@ acrescentado: + + + Tipo que representa uma chave publica padrão RSA + + + + + + diff --git a/NFe.AppTeste/Schemas/tiposBasico_v1.03_OPENSSL.xsd b/NFe.AppTeste/Schemas/tiposBasico_v1.03_OPENSSL.xsd index 851a822ba..dd9796056 100644 --- a/NFe.AppTeste/Schemas/tiposBasico_v1.03_OPENSSL.xsd +++ b/NFe.AppTeste/Schemas/tiposBasico_v1.03_OPENSSL.xsd @@ -59,7 +59,7 @@ - + @@ -95,7 +95,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -813,4 +813,13 @@ acrescentado: + + + Tipo que representa uma chave publica padrão RSA + + + + + + diff --git a/NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd b/NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd index 4445319c9..5fe029e97 100644 --- a/NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd +++ b/NFe.AppTeste/Schemas/tiposBasico_v4.00.xsd @@ -98,7 +98,7 @@ - Tipo Número do CNPJ tmanho varíavel (3-14) + Tipo Número do CNPJ 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 + + + + + + + diff --git a/NFe.Danfe.PdfClown/Elementos/Barcode128C.cs b/NFe.Danfe.PdfClown/Elementos/Barcode128C.cs index 524688bad..6ab3d5132 100644 --- a/NFe.Danfe.PdfClown/Elementos/Barcode128C.cs +++ b/NFe.Danfe.PdfClown/Elementos/Barcode128C.cs @@ -1,6 +1,7 @@ using System.Drawing; using System.Text.RegularExpressions; using NFe.Danfe.PdfClown.Graphics; +using NFe.Danfe.PdfClown.Tools; namespace NFe.Danfe.PdfClown.Elementos { @@ -144,12 +145,13 @@ public Barcode128C(string code, Estilo estilo, float largura = 75F) : base(estil throw new ArgumentException("O código não pode ser vazio.", "code"); } - if (!Regex.IsMatch(code, @"^\d+$")) + // NT Conjunta 2025.001: a chave de acesso pode conter letras maiúsculas nas posições do CNPJ + if (!Regex.IsMatch(code, "^[0-9A-Z]+$")) { - throw new ArgumentException("O código deve apenas conter digítos numéricos.", "code"); + throw new ArgumentException("O código deve apenas conter digítos numéricos e letras maiúsculas.", "code"); } - if (code.Length % 2 != 0) + if (Regex.IsMatch(code, @"^\d+$") && code.Length % 2 != 0) { Code = "0" + code; } @@ -163,35 +165,14 @@ public Barcode128C(string code, Estilo estilo, float largura = 75F) : base(estil private void DrawBarcode(RectangleF rect, Gfx gfx) { + byte[] codeBytes = Code128Hibrido.ObterSimbolos(this.Code); - List codeBytes = new List(); - - codeBytes.Add(105); - - for (int i = 0; i < this.Code.Length; i += 2) - { - byte b = byte.Parse(this.Code.Substring(i, 2)); - codeBytes.Add(b); - } - - // Calcular dígito verificador - int cd = 105; - - for (int i = 1; i < codeBytes.Count; i++) - { - cd += i * codeBytes[i]; - cd %= 103; - } - - codeBytes.Add((byte)cd); - codeBytes.Add(106); - - float n = codeBytes.Count * 11 + 2; + float n = codeBytes.Length * 11 + 2; float w = rect.Width / n; float x = 0; - for (int i = 0; i < codeBytes.Count; i++) + for (int i = 0; i < codeBytes.Length; i++) { byte[] pt = Barcode128C.Dic[codeBytes[i]]; diff --git a/NFe.Danfe.PdfClown/Tools/Code128Hibrido.cs b/NFe.Danfe.PdfClown/Tools/Code128Hibrido.cs new file mode 100644 index 000000000..e48f23d6f --- /dev/null +++ b/NFe.Danfe.PdfClown/Tools/Code128Hibrido.cs @@ -0,0 +1,149 @@ +using System.Text.RegularExpressions; + +namespace NFe.Danfe.PdfClown.Tools +{ + /// + /// Codificador CODE-128 híbrido (subconjuntos C e A) conforme a seção 6 da NT Conjunta 2025.001, + /// para o código de barras da chave de acesso com CNPJ alfanumérico. + /// Regras: inicia com Start C (105); alterna para o Code A (código 101) nos caracteres não numéricos; + /// retorna ao Code C (código 99) em corridas de 4 ou mais dígitos ou em corrida final com quantidade + /// par de dígitos; dígito ímpar remanescente antes de uma letra fica no Code A. + /// Conteúdo 100% numérico produz exatamente a sequência do CODE-128 C puro. + /// + public static class Code128Hibrido + { + private const byte StartC = 105; + private const byte TrocaParaCodeA = 101; + private const byte TrocaParaCodeC = 99; + private const byte Stop = 106; + + /// + /// Obtém a sequência completa de símbolos CODE-128 (Start C, dados com as trocas de subconjunto, + /// dígito verificador módulo 103 e Stop) para um conteúdo composto por dígitos e letras maiúsculas. + /// + /// Conteúdo a codificar ([0-9A-Z]+), ex.: chave de acesso de 44 posições + /// Símbolos CODE-128, um valor (0-106) por posição + public static byte[] ObterSimbolos(string codigo) + { + if (string.IsNullOrEmpty(codigo)) + throw new ArgumentException("O código não pode ser vazio.", nameof(codigo)); + + if (!Regex.IsMatch(codigo, "^[0-9A-Z]+$")) + throw new ArgumentException("O código deve conter somente dígitos (0-9) e letras maiúsculas (A-Z).", nameof(codigo)); + + var simbolos = new List { StartC }; + var emCodeC = true; + var i = 0; + + while (i < codigo.Length) + { + var corrida = TamanhoCorridaDeDigitos(codigo, i); + + if (corrida == 0) + { + //caractere não numérico: garante o Code A e codifica a letra + if (emCodeC) + { + simbolos.Add(TrocaParaCodeA); + emCodeC = false; + } + + simbolos.Add(ValorCodeA(codigo[i])); + i++; + continue; + } + + var corridaFinal = i + corrida == codigo.Length; + + if (emCodeC) + { + //em Code C codifica os dígitos aos pares; o dígito ímpar remanescente fica no Code A + for (var p = 0; p < corrida / 2; p++) + { + simbolos.Add(ValorCodeC(codigo, i)); + i += 2; + } + + if (corrida % 2 == 1) + { + simbolos.Add(TrocaParaCodeA); + emCodeC = false; + simbolos.Add(ValorCodeA(codigo[i])); + i++; + } + } + else if (corrida >= 4 || (corridaFinal && corrida % 2 == 0)) + { + //retorna ao Code C para a parte com quantidade par de dígitos + if (corrida % 2 == 1 && corridaFinal) + { + //corrida final ímpar de 4+ dígitos: o primeiro dígito fica no Code A para a parte restante ser par + simbolos.Add(ValorCodeA(codigo[i])); + i++; + corrida--; + } + + simbolos.Add(TrocaParaCodeC); + emCodeC = true; + + for (var p = 0; p < corrida / 2; p++) + { + simbolos.Add(ValorCodeC(codigo, i)); + i += 2; + } + + //corrida ímpar antes de letra: o dígito remanescente é codificado no Code A na próxima iteração + } + else + { + //corrida curta (1 a 3 dígitos) que não justifica a troca: codifica os dígitos no próprio Code A + for (var d = 0; d < corrida; d++) + { + simbolos.Add(ValorCodeA(codigo[i])); + i++; + } + } + } + + simbolos.Add(ObterDigitoVerificador(simbolos)); + simbolos.Add(Stop); + + return simbolos.ToArray(); + } + + /// + /// Dígito verificador módulo 103: soma ponderada dos símbolos, com o start valendo peso 1 + /// e cada símbolo de dados o peso da sua posição + /// + private static byte ObterDigitoVerificador(List simbolos) + { + var soma = (int)simbolos[0]; + + for (var i = 1; i < simbolos.Count; i++) + soma += i * simbolos[i]; + + return (byte)(soma % 103); + } + + private static int TamanhoCorridaDeDigitos(string codigo, int inicio) + { + var fim = inicio; + + while (fim < codigo.Length && codigo[fim] >= '0' && codigo[fim] <= '9') + fim++; + + return fim - inicio; + } + + private static byte ValorCodeC(string codigo, int posicao) + { + return (byte)((codigo[posicao] - '0') * 10 + (codigo[posicao + 1] - '0')); + } + + private static byte ValorCodeA(char caractere) + { + //no Code A os caracteres ASCII 32-95 valem ASCII - 32 ('0'-'9' => 16-25; 'A'-'Z' => 33-58) + return (byte)(caractere - 32); + } + } +} diff --git a/NFe.Danfe.PdfClown/Tools/Formatador.cs b/NFe.Danfe.PdfClown/Tools/Formatador.cs index 20b01c532..4b1069b61 100644 --- a/NFe.Danfe.PdfClown/Tools/Formatador.cs +++ b/NFe.Danfe.PdfClown/Tools/Formatador.cs @@ -22,7 +22,8 @@ static Formatador() public const string FormatoNumeroNF = @"000\.000\.000"; public const string CEP = @"^(\d{5})\-?(\d{3})$"; - public const string CNPJ = @"^(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})\-?(\d{2})$"; + //NT Conjunta 2025.001: CNPJ alfanumérico - 12 posições [A-Z0-9] e 2 dígitos verificadores numéricos, com a mesma máscara posicional + public const string CNPJ = @"^([A-Z\d]{2})\.?([A-Z\d]{3})\.?([A-Z\d]{3})\/?([A-Z\d]{4})\-?(\d{2})$"; public const string CPF = @"^(\d{3})\.?(\d{3})\.?(\d{3})\-?(\d{2})$"; public const string Telefone = @"^\(?(\d{2})\)?\s*(\d{4,5})\s*\-?\s*(\d{4})$"; diff --git a/NFe.Utils.Testes/ExtinfNFeSuplChaveAlfanumericaTestes.cs b/NFe.Utils.Testes/ExtinfNFeSuplChaveAlfanumericaTestes.cs new file mode 100644 index 000000000..f4b3fda9e --- /dev/null +++ b/NFe.Utils.Testes/ExtinfNFeSuplChaveAlfanumericaTestes.cs @@ -0,0 +1,82 @@ +using System; +using DFe.Classes.Entidades; +using DFe.Classes.Flags; +using NFe.Classes; +using NFe.Classes.Informacoes; +using NFe.Classes.Informacoes.Identificacao; +using NFe.Classes.Informacoes.Identificacao.Tipos; +using NFe.Classes.Informacoes.Total; +using NFe.Utils.InformacoesSuplementares; +using Xunit; + +namespace NFe.Utils.Testes +{ + /// + /// Testes do QR-Code da NFC-e com chave de acesso contendo CNPJ alfanumérico (NT Conjunta 2025.001) + /// + public class ExtinfNFeSuplChaveAlfanumericaTestes + { + //NFC-e de GO com o CNPJ alfanumérico de teste da Receita (PC3D315K000193); DV da chave = 0 + private const string ChaveAlfanumerica = "522507PC3D315K000193650010000000011000000010"; + + private static Classes.NFe CriarNfce(string chave) + { + return new Classes.NFe + { + infNFe = new infNFe + { + Id = "NFe" + chave, + versao = "4.00", + ide = new ide + { + tpAmb = TipoAmbiente.Homologacao, + cUF = Estado.GO, + tpEmis = TipoEmissao.teNormal, + dhEmi = new DateTimeOffset(2025, 7, 15, 10, 0, 0, TimeSpan.FromHours(-3)) + }, + total = new total + { + ICMSTot = new ICMSTot { vNF = 10.50m } + } + } + }; + } + + [Fact] + public void ObterUrlQrCode2_ComChaveAlfanumerica_MontaAUrlComAChaveSemConversaoNumerica() + { + // Arrange + var nfce = CriarNfce(ChaveAlfanumerica); + + // Act + var url = new infNFeSupl().ObterUrlQrCode(nfce, VersaoQrCode.QrCodeVersao2, "000001", "CSC-DE-TESTE"); + + // Assert + Assert.Contains(ChaveAlfanumerica, url); + + //formato dos parâmetros: chave|versão do QR-Code|ambiente|idCsc|hash SHA-1 + var parametros = url.Substring(url.IndexOf("p=", StringComparison.Ordinal) + 2).Split('|'); + Assert.Equal(5, parametros.Length); + Assert.Equal(ChaveAlfanumerica, parametros[0]); + Assert.Equal("2", parametros[1]); + Assert.Equal("2", parametros[2]); + Assert.Equal("1", parametros[3]); + Assert.Equal(40, parametros[4].Trim().Length); + } + + [Fact] + public void ObterUrlQrCode2_ComChaveNumerica_MantemComportamentoAntigo() + { + // Arrange + var nfce = CriarNfce("23190811820016000167650010000000221100000227"); + + // Act + var url = new infNFeSupl().ObterUrlQrCode(nfce, VersaoQrCode.QrCodeVersao2, "000001", "CSC-DE-TESTE"); + + // Assert + var parametros = url.Substring(url.IndexOf("p=", StringComparison.Ordinal) + 2).Split('|'); + Assert.Equal("23190811820016000167650010000000221100000227", parametros[0]); + Assert.Equal(40, parametros[4].Trim().Length); + } + } +} From d7ac7715a8d90e2ac690a44d9051074a9e88e483 Mon Sep 17 00:00:00 2001 From: Guilherme Trevizani Date: Tue, 7 Jul 2026 13:59:01 -0300 Subject: [PATCH 28/71] =?UTF-8?q?fix:=20url=20produ=C3=A7=C3=A3o=20NFeDist?= =?UTF-8?q?ribuicaoDFe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Utils/Enderecos/Enderecador.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NFe.Utils/Enderecos/Enderecador.cs b/NFe.Utils/Enderecos/Enderecador.cs index 5fc741fbb..16eb185d7 100644 --- a/NFe.Utils/Enderecos/Enderecador.cs +++ b/NFe.Utils/Enderecos/Enderecador.cs @@ -1593,7 +1593,7 @@ private static List CarregarEnderecosServicos() addServico(new[] { ServicoNFe.NfeDownloadNF }, versao2E3, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx"); if (modelo != ModeloDocumento.NFCe) { - addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); + addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); // Perecimento, perda, roubo ou furto durante o transporte addServico(eventoPerecimentoTransporteNFe, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx"); @@ -1773,4 +1773,4 @@ into g } } -} \ No newline at end of file +} From 3ef9dfb2926b04f7d035669750378a6b0fb82743 Mon Sep 17 00:00:00 2001 From: Nathalia Tesch Date: Wed, 8 Jul 2026 14:39:55 -0300 Subject: [PATCH 29/71] =?UTF-8?q?NFe:=20corrige=20endere=C3=A7amento=20e?= =?UTF-8?q?=20schema=20do=20evento=20112130?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Servicos/ServicoNfeFactory.cs | 2 +- NFe.Servicos/ServicosNFe.cs | 2 +- NFe.Utils/Enderecos/Enderecador.cs | 10 ++++------ NFe.Utils/Validacao/Validador.cs | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/NFe.Servicos/ServicoNfeFactory.cs b/NFe.Servicos/ServicoNfeFactory.cs index 8f8ac3825..3baba1449 100644 --- a/NFe.Servicos/ServicoNfeFactory.cs +++ b/NFe.Servicos/ServicoNfeFactory.cs @@ -238,7 +238,7 @@ public static INfeServico CriaWsdlOutros(ServicoNFe servico, ConfiguracaoServico return new RecepcaoEvento4AN(url, certificado, cfg.TimeOut); case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: - return new RecepcaoEvento4AN(url, certificado, cfg.TimeOut); + return new RecepcaoEvento4SVCAN(url, certificado, cfg.TimeOut); case ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe: case ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe: diff --git a/NFe.Servicos/ServicosNFe.cs b/NFe.Servicos/ServicosNFe.cs index fa023a061..e6f4534ca 100644 --- a/NFe.Servicos/ServicosNFe.cs +++ b/NFe.Servicos/ServicosNFe.cs @@ -1127,7 +1127,7 @@ public RetornoRecepcaoEvento RecepcaoEventoPerecimentoTransporte(int idlote, var infEvento = new infEventoEnv { - cOrgao = Estado.AN, + cOrgao = Estado.SVRS, tpAmb = _cFgServico.tpAmb, chNFe = chaveNFe, dhEvento = dhEvento ?? DateTime.Now, diff --git a/NFe.Utils/Enderecos/Enderecador.cs b/NFe.Utils/Enderecos/Enderecador.cs index 5fc741fbb..4ef206332 100644 --- a/NFe.Utils/Enderecos/Enderecador.cs +++ b/NFe.Utils/Enderecos/Enderecador.cs @@ -1557,9 +1557,6 @@ private static List CarregarEnderecosServicos() if (modelo != ModeloDocumento.NFCe) { addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, hom, TipoEmissao.teNormal, estado, modelo, "https://hom1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); - - // Perecimento, perda, roubo ou furto durante o transporte - addServico(eventoPerecimentoTransporteNFe, versao1, hom, TipoEmissao.teNormal, estado, modelo, "https://hom1.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx"); } // Comprovante de Entrega @@ -1594,9 +1591,6 @@ private static List CarregarEnderecosServicos() if (modelo != ModeloDocumento.NFCe) { addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); - - // Perecimento, perda, roubo ou furto durante o transporte - addServico(eventoPerecimentoTransporteNFe, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx"); } // Comprovante de Entrega @@ -1631,6 +1625,10 @@ private static List CarregarEnderecosServicos() //Conciliação Financeira NFe addServico(new[] { ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe, ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe }, versao1, TipoAmbiente.Producao, emissao, estado, modelo, "https://nfe.svrs.rs.gov.br/ws/recepcaoevento/recepcaoevento4.asmx"); addServico(new[] { ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe, ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe }, versao1, TipoAmbiente.Homologacao, emissao, estado, modelo, "https://nfe-homologacao.svrs.rs.gov.br/ws/recepcaoevento/recepcaoevento4.asmx"); + + //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"); } } } diff --git a/NFe.Utils/Validacao/Validador.cs b/NFe.Utils/Validacao/Validador.cs index 56245f0e1..7b9e3ed10 100644 --- a/NFe.Utils/Validacao/Validador.cs +++ b/NFe.Utils/Validacao/Validador.cs @@ -43,7 +43,7 @@ internal static string ObterArquivoSchema(ServicoNFe servicoNFe, VersaoServico v case ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe: return "envEventoCancEConf_v1.00.xsd"; case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: - return "envEvento_v1.00.xsd"; + return "envEventoNFe_v9.99.xsd"; case ServicoNFe.RecepcaoEventoEpec: return "envEPEC_v1.00.xsd"; case ServicoNFe.RecepcaoEventoManifestacaoDestinatario: From 3b305d6d779f60f9ec701e7a0a9260354d44114f Mon Sep 17 00:00:00 2001 From: Douglas Henrique Ferreira Date: Mon, 13 Jul 2026 08:33:40 -0300 Subject: [PATCH 30/71] Update NFe service URL for NFeDistribuicaoDFe --- NFe.Utils/Enderecos/Enderecador.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NFe.Utils/Enderecos/Enderecador.cs b/NFe.Utils/Enderecos/Enderecador.cs index b20c4fec9..cd3e59f4b 100644 --- a/NFe.Utils/Enderecos/Enderecador.cs +++ b/NFe.Utils/Enderecos/Enderecador.cs @@ -1590,7 +1590,7 @@ private static List CarregarEnderecosServicos() addServico(new[] { ServicoNFe.NfeDownloadNF }, versao2E3, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx"); if (modelo != ModeloDocumento.NFCe) { - addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); + addServico(new[] { ServicoNFe.NFeDistribuicaoDFe }, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"); // Perecimento, perda, roubo ou furto durante o transporte addServico(eventoPerecimentoTransporteNFe, versao1, prod, TipoEmissao.teNormal, estado, modelo, "https://www.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx"); From d4826e771fb3226f3794824a06121e1b41a8ff07 Mon Sep 17 00:00:00 2001 From: Roberto Alves Date: Mon, 13 Jul 2026 09:23:00 -0300 Subject: [PATCH 31/71] fix: atualizando schemas --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0daa0dbf5..a086ac265 100644 --- a/.gitignore +++ b/.gitignore @@ -284,3 +284,4 @@ build/ # End of https://www.gitignore.io/api/visualstudio *.dll /Bredas.SharedKernel/novo.sql +/CLAUDE.md From 6ee5cecf44c77bcc36538c043d18db2e167384c6 Mon Sep 17 00:00:00 2001 From: Roberto Alves Date: Mon, 13 Jul 2026 09:23:08 -0300 Subject: [PATCH 32/71] fix: atualizando schemas --- NFe.AppTeste/NFe.AppTeste.csproj | 3 + NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd | 161 +++---- NFe.AppTeste/Schemas/e112120_v1.00.xsd | 107 +++++ NFe.AppTeste/Schemas/eventoEPEC_v0.01.xsd | 36 ++ NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd | 2 +- NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd | 38 +- .../Schemas/leiauteConfRecebto_v1.00.xsd | 39 +- .../Schemas/leiauteConsSitNFe_v4.00.xsd | 3 +- NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd | 38 +- .../leiauteEventoAtorInteressado_v1.00.xsd | 2 +- .../Schemas/leiauteEventoCancEConf_v1.00.xsd | 2 +- .../leiauteEventoCancEntregaNFe_v1.00.xsd | 2 +- .../leiauteEventoCancInsucessoNFe_v1.00.xsd | 2 +- .../Schemas/leiauteEventoCancNFe_v1.00.xsd | 2 +- .../Schemas/leiauteEventoCancSubst_v1.00.xsd | 2 +- .../Schemas/leiauteEventoEConf_v1.00.xsd | 2 +- .../Schemas/leiauteEventoEntregaNFe_v1.00.xsd | 2 +- .../leiauteEventoInsucessoNFe_v1.00.xsd | 2 +- NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd | 82 ++-- NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd | 2 +- NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd | 2 +- .../Schemas/leiauteRemIndus_v1.00.xsd | 38 ++ .../leiauteSuframaInternaliza_v1.00.xsd | 37 ++ .../Schemas/leiauteSuframaVistoria_v1.00.xsd | 37 ++ NFe.AppTeste/Schemas/resEvento_v1.01.xsd | 188 ++++---- NFe.AppTeste/Schemas/resNFe_v1.01.xsd | 215 ++++----- NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd | 159 +++---- .../Schemas/retEnvCancelPProrrogNFe_v1.0.xsd | 36 ++ NFe.AppTeste/Schemas/retEnvFiscoNFe_v1.0.xsd | 36 ++ NFe.AppTeste/Schemas/retEventoEPEC_v0.01.xsd | 36 ++ NFe.AppTeste/Schemas/retPProrrogNFe_v1.0.xsd | 37 ++ NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd | 43 +- NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd | 433 +++++++++--------- 33 files changed, 1172 insertions(+), 654 deletions(-) create mode 100644 NFe.AppTeste/Schemas/e112120_v1.00.xsd diff --git a/NFe.AppTeste/NFe.AppTeste.csproj b/NFe.AppTeste/NFe.AppTeste.csproj index 4994ed83c..d998b00fa 100644 --- a/NFe.AppTeste/NFe.AppTeste.csproj +++ b/NFe.AppTeste/NFe.AppTeste.csproj @@ -1231,6 +1231,9 @@ Designer Always + + Designer + Designer Always diff --git a/NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd b/NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd index 89a68ae75..d66807e9c 100644 --- a/NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd +++ b/NFe.AppTeste/Schemas/distDFeInt_v1.01.xsd @@ -1,83 +1,84 @@ - - - - - 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 - - - - - - - - - - - + + + + + + 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 diff --git a/NFe.AppTeste/Schemas/e112120_v1.00.xsd b/NFe.AppTeste/Schemas/e112120_v1.00.xsd new file mode 100644 index 000000000..763f76d70 --- /dev/null +++ b/NFe.AppTeste/Schemas/e112120_v1.00.xsd @@ -0,0 +1,107 @@ + + + + + + + Informações do Evento de Importação em ALC/ZFM não convertida em isenção + + + + + + Descrição do evento: "Importação em ALC/ZFM não convertida em isenção" + + + + + + + + + + Código do Órgão Autor do Evento. Informar o Código da UF para este Evento. + + + + + Informar 1=Empresa emitente + Valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco;6=RFB; 9=Outros Órgãos; + + + + + + + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Informações de itens integrados ao ativo imobilizado + + + + + + Valor do IBS correspondente à quantidade que não atendeu aos requisitos para a conversão em isenção + + + + + Valor do CBS correspondente à quantidade que não atendeu aos requisitos para a conversão em isenção + + + + + + + + Informar a quantidade que não atendeu os requisitos para a conversão em isenção + + + + + Informar a unidade relativa ao campo gConsumo + + + + + + + + + + + + + + + Corresponde ao atributo “nItem” do elemento “det” da NF-e de importação + + + + + + + + Versão do leiaute do evento + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/eventoEPEC_v0.01.xsd b/NFe.AppTeste/Schemas/eventoEPEC_v0.01.xsd index 115faae4e..a60bc09d6 100644 --- a/NFe.AppTeste/Schemas/eventoEPEC_v0.01.xsd +++ b/NFe.AppTeste/Schemas/eventoEPEC_v0.01.xsd @@ -227,5 +227,41 @@ + + + + Tipo Código de orgão (UF da tabela do IBGE + 91 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd b/NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd index 5524009ff..3562cc9eb 100644 --- a/NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd +++ b/NFe.AppTeste/Schemas/eventoEPEC_v1.00.xsd @@ -213,7 +213,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd index beff945c0..bc4732373 100644 --- a/NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteCCe_v1.00.xsd @@ -151,7 +151,7 @@ - + @@ -379,4 +379,40 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/leiauteConfRecebto_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteConfRecebto_v1.00.xsd index 3a610a676..096a29009 100644 --- a/NFe.AppTeste/Schemas/leiauteConfRecebto_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteConfRecebto_v1.00.xsd @@ -138,7 +138,7 @@ - + @@ -366,4 +366,41 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 90 SUFRAMA + 91 - RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/leiauteConsSitNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteConsSitNFe_v4.00.xsd index a43c7e033..a56621542 100644 --- a/NFe.AppTeste/Schemas/leiauteConsSitNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteConsSitNFe_v4.00.xsd @@ -4,6 +4,7 @@ + @@ -315,7 +316,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd index 746689377..97b000e7d 100644 --- a/NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEPEC_v1.00.xsd @@ -139,7 +139,7 @@ - + @@ -420,4 +420,40 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 91 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/leiauteEventoAtorInteressado_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoAtorInteressado_v1.00.xsd index 8b2ccfa2d..6eeb536ed 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoAtorInteressado_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoAtorInteressado_v1.00.xsd @@ -173,7 +173,7 @@ Outros valores: 1=Empresa Emitente, 2=Empresa destinatária; 3=Empresa; 5=Fisco; - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancEConf_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancEConf_v1.00.xsd index 47e963bca..710d25def 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancEConf_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancEConf_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancEntregaNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancEntregaNFe_v1.00.xsd index c3b05d07a..17a5396c5 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancEntregaNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancEntregaNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancInsucessoNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancInsucessoNFe_v1.00.xsd index cfbf265f3..0bde4345e 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancInsucessoNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancInsucessoNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancNFe_v1.00.xsd index 719fdeaab..bf0d09a8b 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancNFe_v1.00.xsd @@ -127,7 +127,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoCancSubst_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoCancSubst_v1.00.xsd index b41416032..ce7b2c3db 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoCancSubst_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoCancSubst_v1.00.xsd @@ -155,7 +155,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoEConf_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoEConf_v1.00.xsd index 530897c85..fe9d449d5 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoEConf_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoEConf_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoEntregaNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoEntregaNFe_v1.00.xsd index be38d6aa2..a7d70d798 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoEntregaNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoEntregaNFe_v1.00.xsd @@ -90,7 +90,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEventoInsucessoNFe_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEventoInsucessoNFe_v1.00.xsd index 3b7915676..9ab61fe47 100644 --- a/NFe.AppTeste/Schemas/leiauteEventoInsucessoNFe_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEventoInsucessoNFe_v1.00.xsd @@ -91,7 +91,7 @@ - + diff --git a/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd index 1f23ffac0..bb5ec2b02 100644 --- a/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteEvento_v1.00.xsd @@ -1,4 +1,4 @@ - + @@ -91,40 +91,6 @@ - - - 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 - - - - - - - - @@ -133,7 +99,7 @@ - + @@ -366,4 +332,48 @@ + + + diff --git a/NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteInutNFe_v4.00.xsd index 886e05d0f..819597c1a 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/leiauteNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd index e27ed6a87..9e86de93b 100644 --- a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd @@ -6662,7 +6662,7 @@ tipo de ato concessório: - + diff --git a/NFe.AppTeste/Schemas/leiauteRemIndus_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteRemIndus_v1.00.xsd index 39b802127..fb2cce7fb 100644 --- a/NFe.AppTeste/Schemas/leiauteRemIndus_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteRemIndus_v1.00.xsd @@ -341,4 +341,42 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/leiauteSuframaInternaliza_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteSuframaInternaliza_v1.00.xsd index 46e149487..99e020eb7 100644 --- a/NFe.AppTeste/Schemas/leiauteSuframaInternaliza_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteSuframaInternaliza_v1.00.xsd @@ -602,4 +602,41 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/leiauteSuframaVistoria_v1.00.xsd b/NFe.AppTeste/Schemas/leiauteSuframaVistoria_v1.00.xsd index 821a6b13d..0515ae9ca 100644 --- a/NFe.AppTeste/Schemas/leiauteSuframaVistoria_v1.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteSuframaVistoria_v1.00.xsd @@ -608,4 +608,41 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NFe.AppTeste/Schemas/resEvento_v1.01.xsd b/NFe.AppTeste/Schemas/resEvento_v1.01.xsd index 40113c758..3ac45a4d8 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 - - - - - - - + + + + + + + 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 diff --git a/NFe.AppTeste/Schemas/resNFe_v1.01.xsd b/NFe.AppTeste/Schemas/resNFe_v1.01.xsd index 91a9e9e46..91d83b0dd 100644 --- a/NFe.AppTeste/Schemas/resNFe_v1.01.xsd +++ b/NFe.AppTeste/Schemas/resNFe_v1.01.xsd @@ -1,110 +1,111 @@ - - - - - - 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 - - - - - - - + + + + + + + + + + + + + + + + + + Tipo Versão do leiate resNFe + + + + + + + \ No newline at end of file diff --git a/NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd b/NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd index 638e08c18..3c4b8fce6 100644 --- a/NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd +++ b/NFe.AppTeste/Schemas/retDistDFeInt_v1.01.xsd @@ -1,82 +1,83 @@ - - - - - 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 - - - - - - - - - - - - - - + + + + + + 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 diff --git a/NFe.AppTeste/Schemas/retEnvCancelPProrrogNFe_v1.0.xsd b/NFe.AppTeste/Schemas/retEnvCancelPProrrogNFe_v1.0.xsd index 3181aef5d..596c2cbff 100644 --- a/NFe.AppTeste/Schemas/retEnvCancelPProrrogNFe_v1.0.xsd +++ b/NFe.AppTeste/Schemas/retEnvCancelPProrrogNFe_v1.0.xsd @@ -192,4 +192,40 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 91 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/NFe.AppTeste/Schemas/retEnvFiscoNFe_v1.0.xsd b/NFe.AppTeste/Schemas/retEnvFiscoNFe_v1.0.xsd index 5258b5c8a..115c29c89 100644 --- a/NFe.AppTeste/Schemas/retEnvFiscoNFe_v1.0.xsd +++ b/NFe.AppTeste/Schemas/retEnvFiscoNFe_v1.0.xsd @@ -195,4 +195,40 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 91 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/NFe.AppTeste/Schemas/retEventoEPEC_v0.01.xsd b/NFe.AppTeste/Schemas/retEventoEPEC_v0.01.xsd index e07d05e29..374da239f 100644 --- a/NFe.AppTeste/Schemas/retEventoEPEC_v0.01.xsd +++ b/NFe.AppTeste/Schemas/retEventoEPEC_v0.01.xsd @@ -168,4 +168,40 @@ + + + Tipo Código de orgão (UF da tabela do IBGE + 91 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/NFe.AppTeste/Schemas/retPProrrogNFe_v1.0.xsd b/NFe.AppTeste/Schemas/retPProrrogNFe_v1.0.xsd index 5d6d7f915..e470ad2cd 100644 --- a/NFe.AppTeste/Schemas/retPProrrogNFe_v1.0.xsd +++ b/NFe.AppTeste/Schemas/retPProrrogNFe_v1.0.xsd @@ -193,4 +193,41 @@ + + + + Tipo Código de orgão (UF da tabela do IBGE + 91 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd b/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd index 592056fcc..251f9465d 100644 --- a/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd +++ b/NFe.AppTeste/Schemas/tiposBasico_v1.03.xsd @@ -1,4 +1,13 @@ + + + + + + + + + @@ -59,7 +68,7 @@ - + @@ -86,8 +95,7 @@ - - + @@ -96,16 +104,16 @@ - + - Tipo Número do CNPJ + Tipo Número do CNPJ tmanho varíavel (3-14) - + @@ -115,7 +123,7 @@ - + @@ -778,7 +786,7 @@ acrescentado: - + @@ -817,15 +825,6 @@ acrescentado: - - - Tipo Decimal com até 15 dígitos, sendo 11 de corpo e até 4 decimais, aceitando valores negativos - - - - - - Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais @@ -877,6 +876,7 @@ acrescentado: + @@ -895,13 +895,4 @@ 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 12c0015f1..8b0d8a135 100644 --- a/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd +++ b/NFe.AppTeste/Schemas/tiposDistDFe_v1.01.xsd @@ -1,216 +1,217 @@ - - - - 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 - - - - - - - + + + + + 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 From afa50f8182daf90ea9f798d5413c5b21470ba8eb Mon Sep 17 00:00:00 2001 From: "tiago.ferrari" Date: Thu, 23 Jul 2026 14:10:03 -0300 Subject: [PATCH 33/71] =?UTF-8?q?Realizado=20a=20inclus=C3=A3o=20do=20novo?= =?UTF-8?q?=20tipo=20de=20impress=C3=A3o=20de=20danfe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Informacoes/Identificacao/Tipos/ideTipos.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs index aef5ce72b..01e066188 100644 --- a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs +++ b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs @@ -158,7 +158,14 @@ public enum TipoImpressao /// [Description("DANFe NFC-e em mensagem eletrônica")] [XmlEnum("5")] - tiMsgEletronica = 5 + tiMsgEletronica = 5, + + /// + /// 6 - DANFe Simplificado Tipo 2 + /// + [Description("DANFe Simplificado Tipo 2")] + [XmlEnum("6")] + tiSimplificadoTp2 = 6 } /// @@ -536,7 +543,6 @@ public enum refMod modelo2 = 2 } - public enum TipoEnteGov { [Description("União")] From ee4a4ebbcb0ae1782f21b47afc123ee6a900ecdc Mon Sep 17 00:00:00 2001 From: Douglas Henrique Ferreira Date: Thu, 23 Jul 2026 16:31:28 -0300 Subject: [PATCH 34/71] CM (#173) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Correções validações dos schemas e tamanho dos campos do perecimento - Criação do botão para testes de envio de perecimento Co-authored-by: Douglas H. Ferreira --- NFe.AppTeste/MainWindow.xaml | 2 + NFe.AppTeste/MainWindow.xaml.cs | 82 +++++++++++++++++++ .../Servicos/Evento/gControleEstoque.cs | 21 ++++- NFe.Classes/Servicos/Evento/gPerecimento.cs | 14 +++- NFe.Utils/Validacao/Validador.cs | 35 +++++++- 5 files changed, 145 insertions(+), 9 deletions(-) diff --git a/NFe.AppTeste/MainWindow.xaml b/NFe.AppTeste/MainWindow.xaml index a928de43b..2f93f66ee 100644 --- a/NFe.AppTeste/MainWindow.xaml +++ b/NFe.AppTeste/MainWindow.xaml @@ -994,6 +994,8 @@ Margin="10,260,0,0" VerticalAlignment="Top" Width="177" Click="BtnConciliacaoFinanceira_Click" /> public class gControleEstoque { + private decimal _qPerecimento; + private decimal _vIBS; + private decimal _vCBS; /// /// Quantidade objeto de roubo, perda, furto ou perecimento. /// [XmlElement("qPerecimento")] - public decimal qPerecimento { get; set; } + public decimal qPerecimento + { + get { return _qPerecimento.Arredondar(4); } + set { _qPerecimento = value.Arredondar(4); } + } /// /// Unidade relativa ao campo qPerecimento. @@ -23,12 +30,20 @@ public class gControleEstoque /// Valor do crédito IBS referente às aquisições a ser estornado. /// [XmlElement("vIBS")] - public decimal vIBS { get; set; } + public decimal vIBS + { + get { return _vIBS.Arredondar(2); } + set { _vIBS = value.Arredondar(2); } + } /// /// Valor do crédito CBS referente às aquisições a ser estornado. /// [XmlElement("vCBS")] - public decimal vCBS { get; set; } + public decimal vCBS + { + get { return _vCBS.Arredondar(2); } + set { _vCBS = value.Arredondar(2); } + } } } \ No newline at end of file diff --git a/NFe.Classes/Servicos/Evento/gPerecimento.cs b/NFe.Classes/Servicos/Evento/gPerecimento.cs index af66a70ad..13d4975f4 100644 --- a/NFe.Classes/Servicos/Evento/gPerecimento.cs +++ b/NFe.Classes/Servicos/Evento/gPerecimento.cs @@ -7,6 +7,8 @@ namespace NFe.Classes.Servicos.Evento /// public class gPerecimento { + private decimal _vIBS; + private decimal _vCBS; /// /// Corresponde ao atributo nItem do elemento det da NF-e. /// @@ -17,13 +19,21 @@ public class gPerecimento /// Valor do IBS na Nota de Fornecimento correspondente à quantidade objeto de roubo, perda, furto ou perecimento. /// [XmlElement("vIBS")] - public decimal vIBS { get; set; } + public decimal vIBS + { + get { return _vIBS.Arredondar(2); } + set { _vIBS = value.Arredondar(2); } + } /// /// Valor da CBS na Nota de Fornecimento correspondente à quantidade objeto de roubo, perda, furto ou perecimento. /// [XmlElement("vCBS")] - public decimal vCBS { get; set; } + public decimal vCBS + { + get { return _vCBS.Arredondar(2); } + set { _vCBS = value.Arredondar(2); } + } /// /// Informações de quantidade de estoque influenciadas pelo evento. diff --git a/NFe.Utils/Validacao/Validador.cs b/NFe.Utils/Validacao/Validador.cs index 7b9e3ed10..34f20a35a 100644 --- a/NFe.Utils/Validacao/Validador.cs +++ b/NFe.Utils/Validacao/Validador.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Xml; +using System.Xml.Linq; using System.Xml.Schema; using DFe.Classes.Flags; using DFe.Utils; @@ -43,7 +44,7 @@ internal static string ObterArquivoSchema(ServicoNFe servicoNFe, VersaoServico v case ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe: return "envEventoCancEConf_v1.00.xsd"; case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: - return "envEventoNFe_v9.99.xsd"; + return "envEvento_v1.00.xsd"; case ServicoNFe.RecepcaoEventoEpec: return "envEPEC_v1.00.xsd"; case ServicoNFe.RecepcaoEventoManifestacaoDestinatario: @@ -115,13 +116,39 @@ public static void Valida(ServicoNFe servicoNFe, VersaoServico versaoServico, st public static string[] Valida(ServicoNFe servicoNFe, VersaoServico versaoServico, string stringXml, bool loteNfe = true, string pathSchema = null) { - StringBuilder falhas = new StringBuilder(); - if (!Directory.Exists(pathSchema)) throw new Exception("Diretório de Schemas não encontrado: \n" + pathSchema); string arquivoSchema = Path.Combine(pathSchema, ObterArquivoSchema(servicoNFe, versaoServico, stringXml, loteNfe)); + var falhas = ValidaXmlContraSchema(stringXml, arquivoSchema); + + switch (servicoNFe) + { + case ServicoNFe.RecepcaoEventoPerecimentoTransporteNFe: + falhas = ValidaDetEvento(stringXml, Path.Combine(pathSchema, "e112130_v1.00.xsd")); + break; + } + + return falhas.ToString().Trim().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + } + + private static StringBuilder ValidaDetEvento(string stringXml, string arquivoSchema) + { + var detEventos = from d in XDocument.Parse(stringXml).Descendants() + where d.Name.LocalName == "detEvento" + select d; + StringBuilder sb = new StringBuilder(); + foreach (var detEvento in detEventos) + sb.AppendLine(ValidaXmlContraSchema(detEvento.ToString(), arquivoSchema).ToString()); + + return sb; + } + + private static StringBuilder ValidaXmlContraSchema(string stringXml, string arquivoSchema) + { + StringBuilder falhas = new StringBuilder(); + // Define o tipo de validação XmlReaderSettings cfg = new XmlReaderSettings { @@ -179,7 +206,7 @@ public static string[] Valida(ServicoNFe servicoNFe, VersaoServico versaoServico if (falhas.Length > 0) throw new ValidacaoSchemaException($"Ocorreu o seguinte erro durante a validação XML: {Environment.NewLine}{falhas}", stringXml); - return falhas.ToString().Trim().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + return falhas; } } } \ No newline at end of file From 69ce9f021c23eaf464c56e8f40c84577196c57f4 Mon Sep 17 00:00:00 2001 From: felixsevero Date: Thu, 23 Jul 2026 16:32:46 -0300 Subject: [PATCH 35/71] =?UTF-8?q?Corre=C3=A7=C3=A3o=20nos=20valores=20de?= =?UTF-8?q?=20CSTIPI=20(#174)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tributacao/Federal/Tipos/IPITipos.cs | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/Tipos/IPITipos.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/Tipos/IPITipos.cs index 3bad3cf8c..461c7274f 100644 --- a/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/Tipos/IPITipos.cs +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/Tipos/IPITipos.cs @@ -26,97 +26,97 @@ public enum CSTIPI /// [Description("Entrada com recuperação de crédito")] [XmlEnum("00")] - ipi00, - - /// - /// 49 - Outras entradas - /// - [Description("Outras entradas")] - [XmlEnum("49")] - ipi49, - - /// - /// 50 - Saída tributada - /// - [Description("Saída tributada")] - [XmlEnum("50")] - ipi50, - - /// - /// 99 - Outras saídas - /// - [Description("Outras saídas")] - [XmlEnum("99")] - ipi99, + ipi00 = 0, /// /// 01 - Entrada tributada com alíquota zero /// [Description("Entrada tributada com alíquota zero")] [XmlEnum("01")] - ipi01, + ipi01 = 1, /// /// 02 - Entrada isenta /// [Description("Entrada isenta")] [XmlEnum("02")] - ipi02, + ipi02 = 2, /// /// 03 - Entrada não-tributada /// [Description("Entrada não-tributada")] [XmlEnum("03")] - ipi03, + ipi03 = 3, /// /// 04 - Entrada imune /// [Description("Entrada imune")] [XmlEnum("04")] - ipi04, + ipi04 = 4, /// /// 05 - Entrada com suspensão /// [Description("Entrada com suspensão")] [XmlEnum("05")] - ipi05, + ipi05 = 5, + + /// + /// 49 - Outras entradas + /// + [Description("Outras entradas")] + [XmlEnum("49")] + ipi49 = 49, + + /// + /// 50 - Saída tributada + /// + [Description("Saída tributada")] + [XmlEnum("50")] + ipi50 = 50, /// /// 51 - Saída tributada com alíquota zero /// [Description("Saída tributada com alíquota zero")] [XmlEnum("51")] - ipi51, + ipi51 = 51, /// /// 52 - Saída isenta /// [Description("Saída isenta")] [XmlEnum("52")] - ipi52, + ipi52 = 52, /// /// 53 - Saída não-tributada /// [Description("Saída não-tributada")] [XmlEnum("53")] - ipi53, + ipi53 = 53, /// /// 54 - Saída imune /// [Description("Saída imune")] [XmlEnum("54")] - ipi54, + ipi54 = 54, /// /// 55 - Saída com suspensão /// [Description("Saída com suspensão")] [XmlEnum("55")] - ipi55 + ipi55 = 55, + + /// + /// 99 - Outras saídas + /// + [Description("Outras saídas")] + [XmlEnum("99")] + ipi99 = 99 } } \ No newline at end of file From 5a41a1605f6925b65170fb1340660a9e637b4f4a Mon Sep 17 00:00:00 2001 From: Guilherme Trevizani Date: Thu, 23 Jul 2026 16:35:02 -0300 Subject: [PATCH 36/71] feat: add Regime Especial NFF ao tpEmis CTe (#176) --- CTe.Classes/Informacoes/Tipos/tpEmis.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CTe.Classes/Informacoes/Tipos/tpEmis.cs b/CTe.Classes/Informacoes/Tipos/tpEmis.cs index 9ed27afbb..b84e58091 100644 --- a/CTe.Classes/Informacoes/Tipos/tpEmis.cs +++ b/CTe.Classes/Informacoes/Tipos/tpEmis.cs @@ -5,6 +5,7 @@ namespace CTe.Classes.Informacoes.Tipos /// /// Forma de emissão da CT-e /// 1 - Emissão normal (não em contingência) + /// 3 - Regime Especial NFF /// 4 - Contingência EPEC pela SVC /// 5 - Contingência FS-DA, com impressão do DANFE em formulário de segurança /// 7 - Contingência SVC-RS (SEFAZ Virtual de Contingência do RS) @@ -14,6 +15,8 @@ public enum tpEmis { [XmlEnum("1")] teNormal = 1, + [XmlEnum("3")] + teNFF = 3, [XmlEnum("4")] teEPEC = 4, [XmlEnum("5")] @@ -23,4 +26,4 @@ public enum tpEmis [XmlEnum("8")] teSVCSP = 8 } -} \ No newline at end of file +} From 27f48a9040e3ad186a23146ab9e46395e483dffd Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Mon, 27 Jul 2026 17:21:17 -0300 Subject: [PATCH 37/71] permitindo definir o cOrgao diferente do configurado na ConfiguracaoServico nos eventos de desacordo e cancelamento de desacordo --- CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs | 10 +++++----- CTe.Servicos/Eventos/EventoDesacordo.cs | 8 ++++---- CTe.Servicos/Eventos/FactoryEvento.cs | 4 ++-- CTe.Servicos/Eventos/ServicoController.cs | 9 +++++---- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs index 72aafacc0..e3e943c04 100644 --- a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs @@ -24,23 +24,23 @@ public EventoCancelamentoDesacordo(int sequenciaEvento, string chave, string cnp _nProtEvPrestDes = nProtEvPrestDes; } - public retEventoCTe CancelarDesacordo(ConfiguracaoServico configuracaoServico = null) + public retEventoCTe CancelarDesacordo(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); - RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); return RetornoSefaz; } - public async Task CancelarDesacordoAsync(ConfiguracaoServico configuracaoServico = null) + public async Task CancelarDesacordoAsync(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); return RetornoSefaz; diff --git a/CTe.Servicos/Eventos/EventoDesacordo.cs b/CTe.Servicos/Eventos/EventoDesacordo.cs index 0eb0ea6b7..2737b4ad1 100644 --- a/CTe.Servicos/Eventos/EventoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoDesacordo.cs @@ -26,22 +26,22 @@ public EventoDesacordo(int sequenciaEvento, string chave, string cnpj, string in _observacao = observacao; } - public retEventoCTe Discordar(ConfiguracaoServico configuracaoServico = null) + public retEventoCTe Discordar(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); return RetornoSefaz; } - public async Task DiscordarAsync(ConfiguracaoServico configuracaoServico = null) + public async Task DiscordarAsync(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); return RetornoSefaz; } diff --git a/CTe.Servicos/Eventos/FactoryEvento.cs b/CTe.Servicos/Eventos/FactoryEvento.cs index 5a21be8c0..8f7a53b76 100644 --- a/CTe.Servicos/Eventos/FactoryEvento.cs +++ b/CTe.Servicos/Eventos/FactoryEvento.cs @@ -18,7 +18,7 @@ public static eventoCTe CriaEvento(CTeEletronico cte, CTeTipoEvento cTeTipoEvent return CriaEvento(cTeTipoEvento, sequenciaEvento, cte.Chave(), cte.infCte.emit.CNPJ, container, configServico); } - public static eventoCTe CriaEvento(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, ConfiguracaoServico configuracaoServico = null) + public static eventoCTe CriaEvento(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? cOrgao = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; @@ -39,7 +39,7 @@ public static eventoCTe CriaEvento(CTeTipoEvento cTeTipoEvento, int sequenciaEve { tpAmb = configServico.tpAmb, CNPJ = cnpj, - cOrgao = configServico.cUF, + cOrgao = cOrgao ?? configServico.cUF, chCTe = chave, dhEvento = DateTimeOffset.Now, nSeqEvento = sequenciaEvento, diff --git a/CTe.Servicos/Eventos/ServicoController.cs b/CTe.Servicos/Eventos/ServicoController.cs index b37bdcd2b..62c821e15 100644 --- a/CTe.Servicos/Eventos/ServicoController.cs +++ b/CTe.Servicos/Eventos/ServicoController.cs @@ -33,10 +33,10 @@ public async Task ExecutarAsync(CteEletronico cte, int sequenciaEv return await ExecutarAsync(cTeTipoEvento, sequenciaEvento, cte.Chave(), cte.infCte.emit.CNPJ, container, configServico); } - public retEventoCTe Executar(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, ConfiguracaoServico configuracaoServico = null) + public retEventoCTe Executar(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? cOrgao = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - var evento = FactoryEvento.CriaEvento(cTeTipoEvento, sequenciaEvento, chave, cnpj, container, configServico); + var evento = FactoryEvento.CriaEvento(cTeTipoEvento, sequenciaEvento, chave, cnpj, container, configServico, cOrgao); evento.Assina(configServico); if (configuracaoServico.IsValidaSchemas) @@ -68,11 +68,12 @@ public async Task ExecutarAsync(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, - ConfiguracaoServico configuracaoServico = null) + ConfiguracaoServico configuracaoServico = null, + DFe.Classes.Entidades.Estado? cOrgao = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - var evento = FactoryEvento.CriaEvento(cTeTipoEvento, sequenciaEvento, chave, cnpj, container, configServico); + var evento = FactoryEvento.CriaEvento(cTeTipoEvento, sequenciaEvento, chave, cnpj, container, configServico, cOrgao); evento.Assina(configServico); if (configServico.IsValidaSchemas) From c1b925ac045768919e80490401dd9829e9cfff9a Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Mon, 27 Jul 2026 18:01:14 -0300 Subject: [PATCH 38/71] removendo dependencia de UrlHelper com a classe ConfiguracaoServico --- CTe.Servicos/Enderecos/Helpers/UrlHelper.cs | 95 ++++++++++++--------- 1 file changed, 55 insertions(+), 40 deletions(-) diff --git a/CTe.Servicos/Enderecos/Helpers/UrlHelper.cs b/CTe.Servicos/Enderecos/Helpers/UrlHelper.cs index d8257563f..4017777a7 100644 --- a/CTe.Servicos/Enderecos/Helpers/UrlHelper.cs +++ b/CTe.Servicos/Enderecos/Helpers/UrlHelper.cs @@ -9,36 +9,51 @@ namespace CTe.Servicos.Enderecos.Helpers { public class UrlHelper { - public static UrlCTe ObterUrlServico(ConfiguracaoServico configuracaoServico = null) + /// + /// Obtem a url de Serviço. Por padrão pega as informações de ConfiguracaoServico, mas pode ser customizada individualmente. Motivo: em alguns casos a url de destino de um evento de CTe pode seguir as informações do xml e não da empresa emissora / com certificado ativo + /// + /// + /// + /// + /// + /// + /// + /// + public static UrlCTe ObterUrlServico(ConfiguracaoServico configuracaoServico = null, tpEmis? tipoEmissao = null , TipoAmbiente? tipoAmbiente = null, Estado? ufRecepcao = null, versao? versaoLayout = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - switch (configServico.tpAmb) + var _tpEmissao = tipoEmissao ?? configServico.TipoEmissao; + var _tpAmb = tipoAmbiente ?? configServico.tpAmb; + var _cUF = ufRecepcao ?? configServico.cUF; + var _versao = versaoLayout ?? configServico.VersaoLayout; + + switch (_tpAmb) { case TipoAmbiente.Homologacao: - if (configServico.TipoEmissao == tpEmis.teSVCRS) + if (_tpEmissao == tpEmis.teSVCRS) { - return UrlHomologacaoSvrs(configServico); + return UrlHomologacaoSvrs(_versao); } - if (configServico.TipoEmissao == tpEmis.teSVCSP) + if (_tpEmissao == tpEmis.teSVCSP) { - return UrlHomologacaoSvcsp(configServico); + return UrlHomologacaoSvcsp(_versao); } - return UrlHomologacao(configServico); + return UrlHomologacao(_cUF, _versao); case TipoAmbiente.Producao: - if (configServico.TipoEmissao == tpEmis.teSVCRS) + if (_tpEmissao == tpEmis.teSVCRS) { - return UrlProducaoSvrs(configServico); + return UrlProducaoSvrs(_versao); } - if (configServico.TipoEmissao == tpEmis.teSVCSP) + if (_tpEmissao == tpEmis.teSVCSP) { - return UrlProducaoSvcsp(configServico); + return UrlProducaoSvcsp(_versao); } - return UrlProducao(configServico); + return UrlProducao(_cUF, _versao); } throw new InvalidOperationException("Tipo Ambiente inválido"); @@ -51,17 +66,17 @@ public static string ObterUrlQrCode(ConfiguracaoServico configuracaoServico = nu switch (configServico.tpAmb) { case TipoAmbiente.Homologacao: - return UrlHomologacao(configServico).QrCode; + return UrlHomologacao(configServico.cUF, configServico.VersaoLayout).QrCode; case TipoAmbiente.Producao: - return UrlProducao(configServico).QrCode; + return UrlProducao(configServico.cUF, configServico.VersaoLayout).QrCode; } throw new InvalidOperationException("Tipo Ambiente inválido"); } - private static UrlCTe UrlProducaoSvcsp(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlProducaoSvcsp(versao VersaoLayout) { - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -86,9 +101,9 @@ private static UrlCTe UrlProducaoSvcsp(ConfiguracaoServico configuracaoServico) }; } - private static UrlCTe UrlHomologacaoSvcsp(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlHomologacaoSvcsp(versao VersaoLayout) { - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -113,9 +128,9 @@ private static UrlCTe UrlHomologacaoSvcsp(ConfiguracaoServico configuracaoServic }; } - private static UrlCTe UrlHomologacaoSvrs(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlHomologacaoSvrs(versao VersaoLayout) { - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -141,9 +156,9 @@ private static UrlCTe UrlHomologacaoSvrs(ConfiguracaoServico configuracaoServico }; } - private static UrlCTe UrlProducaoSvrs(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlProducaoSvrs(versao VersaoLayout) { - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -169,12 +184,12 @@ private static UrlCTe UrlProducaoSvrs(ConfiguracaoServico configuracaoServico) }; } - private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlProducao(Estado UFRecepcao, versao VersaoLayout) { - switch (configuracaoServico.cUF) + switch (UFRecepcao) { case Estado.MT: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -200,7 +215,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = "https://www1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.MS: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -226,7 +241,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = "https://www1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.MG: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -252,7 +267,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = "https://www1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.PR: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -278,7 +293,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = "https://www1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.SP: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -326,7 +341,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) case Estado.SE: case Estado.TO: case Estado.RS: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -357,7 +372,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) case Estado.AP: case Estado.PE: case Estado.RR: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -389,12 +404,12 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) } - private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlHomologacao(Estado UFRecepcao, versao VersaoLayout) { - switch (configuracaoServico.cUF) + switch (UFRecepcao) { case Estado.MT: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -421,7 +436,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = @"https://hom1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.MS: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -445,7 +460,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = @"https://hom1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.MG: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -471,7 +486,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = @"https://hom1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.PR: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -512,7 +527,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = @"https://hom1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.SP: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -555,7 +570,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) case Estado.SC: case Estado.SE: case Estado.TO: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -586,7 +601,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) case Estado.AP: case Estado.PE: case Estado.RR: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { From 31524a07688485ccf4a23291c2045e8113111816 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Mon, 27 Jul 2026 18:01:59 -0300 Subject: [PATCH 39/71] permitindo informar uma UF customizada nos eventos de desacordo e cancelamento de desacordo --- CTe.Servicos/Eventos/EventoDesacordo.cs | 16 ++++++++++++++-- CTe.Servicos/Eventos/ServicoController.cs | 4 ++-- CTe.Servicos/Factory/WsdlFactory.cs | 17 +++++++++-------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/CTe.Servicos/Eventos/EventoDesacordo.cs b/CTe.Servicos/Eventos/EventoDesacordo.cs index 2737b4ad1..78171255a 100644 --- a/CTe.Servicos/Eventos/EventoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoDesacordo.cs @@ -26,23 +26,35 @@ public EventoDesacordo(int sequenciaEvento, string chave, string cnpj, string in _observacao = observacao; } + /// + /// Gera o evento de desacordo de CTe + /// + /// + /// Sempre considera a UF que gerou o xml. Ento a empresa pode estar configurada para uma UF X e gerar o desacordo de um xml gerando na UF Y, sendo o evento, portando, enviado para UF Y + /// public retEventoCTe Discordar(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); - RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); return RetornoSefaz; } + /// + /// Gera o evento de cancelamento de desacordo de CTe + /// + /// + /// Sempre considera a UF que gerou o xml. Ento a empresa pode estar configurada para uma UF X e gerar o cancelmaento para um xml gerado na UF Y, sendo o evento, portando, enviado para UF Y + /// public async Task DiscordarAsync(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); - RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); return RetornoSefaz; } } diff --git a/CTe.Servicos/Eventos/ServicoController.cs b/CTe.Servicos/Eventos/ServicoController.cs index 62c821e15..f24f38699 100644 --- a/CTe.Servicos/Eventos/ServicoController.cs +++ b/CTe.Servicos/Eventos/ServicoController.cs @@ -48,13 +48,13 @@ public retEventoCTe Executar(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, s if (evento.versao == versao.ve200 || evento.versao == versao.ve300) { - var webService = WsdlFactory.CriaWsdlCteEvento(configServico); + var webService = WsdlFactory.CriaWsdlCteEvento(configServico, ufUrl: cOrgao); retornoXml = webService.cteRecepcaoEvento(evento.CriaXmlRequestWs()); } if (evento.versao == versao.ve400) { - var webService = WsdlFactory.CriaWsdlCteEventoV4(configServico); + var webService = WsdlFactory.CriaWsdlCteEventoV4(configServico, ufUrl: cOrgao); retornoXml = webService.cteRecepcaoEvento(evento.CriaXmlRequestWs()); } diff --git a/CTe.Servicos/Factory/WsdlFactory.cs b/CTe.Servicos/Factory/WsdlFactory.cs index a424abef3..86f63109e 100644 --- a/CTe.Servicos/Factory/WsdlFactory.cs +++ b/CTe.Servicos/Factory/WsdlFactory.cs @@ -14,6 +14,7 @@ using CTe.Wsdl.Evento.V4; using CTe.Wsdl.Recepcao.Sincrono; using System.Security.Cryptography.X509Certificates; +using DFe.Classes.Entidades; namespace CTe.Servicos.Factory { @@ -90,22 +91,22 @@ public static CteRecepcaoSincronoOSV4 CriaWsdlCteRecepcaoSincronoOSV4(Configurac return new CteRecepcaoSincronoOSV4(configuracaoWsdl); } - public static CteRecepcaoEvento CriaWsdlCteEvento(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) + public static CteRecepcaoEvento CriaWsdlCteEvento(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null, Estado? ufUrl = null) { - var url = UrlHelper.ObterUrlServico(configuracaoServico).CteRecepcaoEvento; + var url = UrlHelper.ObterUrlServico(configuracaoServico, ufRecepcao: ufUrl).CteRecepcaoEvento; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado, ufUrl); return new CteRecepcaoEvento(configuracaoWsdl); } - public static CteRecepcaoEventoV4 CriaWsdlCteEventoV4(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) + public static CteRecepcaoEventoV4 CriaWsdlCteEventoV4(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null, Estado? ufUrl = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - var url = UrlHelper.ObterUrlServico(configServico).CteRecepcaoEvento; + var url = UrlHelper.ObterUrlServico(configServico, ufRecepcao: ufUrl).CteRecepcaoEvento; - var configuracaoWsdl = CriaConfiguracao(url, configServico, certificado); + var configuracaoWsdl = CriaConfiguracao(url, configServico, certificado, ufUrl); return new CteRecepcaoEventoV4(configuracaoWsdl); } @@ -121,11 +122,11 @@ public static CTeDistDFeInteresse CriaWsdlCTeDistDFeInteresse(ConfiguracaoServic } - private static WsdlConfiguracao CriaConfiguracao(string url, ConfiguracaoServico configuracaoServico, X509Certificate2 certificado) + private static WsdlConfiguracao CriaConfiguracao(string url, ConfiguracaoServico configuracaoServico, X509Certificate2 certificado, Estado? ufUrl = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - var codigoEstado = configServico.cUF.GetCodigoIbgeEmString(); + var codigoEstado = ufUrl.HasValue ? ufUrl.Value.GetCodigoIbgeEmString() : configServico.cUF.GetCodigoIbgeEmString(); var certificadoDigital = certificado ?? configServico.X509Certificate2; var versaoEmString = configServico.VersaoLayout.GetString(); var timeOut = configServico.TimeOut; From f69cd66640675b35a6e6ef84b2dbda34945bf51b Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Tue, 28 Jul 2026 10:21:38 -0300 Subject: [PATCH 40/71] ajustando teste CTe para permitir uso de certificado A1 em arquivo --- CTe.AppTeste/CTeTesteModel.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CTe.AppTeste/CTeTesteModel.cs b/CTe.AppTeste/CTeTesteModel.cs index 9b23d463f..b446bf08a 100644 --- a/CTe.AppTeste/CTeTesteModel.cs +++ b/CTe.AppTeste/CTeTesteModel.cs @@ -569,9 +569,10 @@ private static void CarregarConfiguracoes(Configuracao config) { var configuracaoCertificado = new ConfiguracaoCertificado { + TipoCertificado = TipoCertificado.A1Arquivo, Arquivo = config.CertificadoDigital.CaminhoArquivo, - TipoCertificado = TipoCertificado.A1Repositorio, ManterDadosEmCache = config.CertificadoDigital.ManterEmCache, + Senha = config.CertificadoDigital.Senha, Serial = config.CertificadoDigital.NumeroDeSerie }; From 13bbd2db358cfad4fc2ad105d192e0f4b2d66c53 Mon Sep 17 00:00:00 2001 From: Thiago Batista Date: Tue, 28 Jul 2026 10:33:20 -0300 Subject: [PATCH 41/71] permitindo ExecutarAsync com uma UF customizada --- CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs | 2 +- CTe.Servicos/Eventos/ServicoController.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs index e3e943c04..f4040a0d2 100644 --- a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs @@ -41,7 +41,7 @@ public async Task CancelarDesacordoAsync(ConfiguracaoServico confi var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); - RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); return RetornoSefaz; } diff --git a/CTe.Servicos/Eventos/ServicoController.cs b/CTe.Servicos/Eventos/ServicoController.cs index f24f38699..fc55f579c 100644 --- a/CTe.Servicos/Eventos/ServicoController.cs +++ b/CTe.Servicos/Eventos/ServicoController.cs @@ -81,7 +81,7 @@ public async Task ExecutarAsync(CTeTipoEvento cTeTipoEvento, evento.SalvarXmlEmDisco(configServico); - var webService = WsdlFactory.CriaWsdlCteEvento(configServico); + var webService = WsdlFactory.CriaWsdlCteEvento(configServico, ufUrl: cOrgao); var retornoXml = await webService.cteRecepcaoEventoAsync(evento.CriaXmlRequestWs()); var retorno = retEventoCTe.LoadXml(retornoXml.OuterXml, evento); From 7ff19746db0867f43eb7d269fd2aca482b309dea Mon Sep 17 00:00:00 2001 From: "tiago.ferrari" Date: Tue, 28 Jul 2026 15:51:32 -0300 Subject: [PATCH 42/71] Implementado DanfeSimplificada Tipo 2 --- NFe.Danfe.AppTeste.Fast/MainWindow.xaml | 2 + NFe.Danfe.AppTeste.Fast/MainWindow.xaml.cs | 108 +- NFe.Danfe.Base/NFe.Danfe.Base.csproj | 6 + NFe.Danfe.Base/NFe/ConfiguracaoDanfeNfe.cs | 2 +- NFe.Danfe.Base/NFe/NFeSimplificadoTipo2.frx | 1198 +++++++++++++++++ .../NFe/DanfeFrSimplificadoTipo2.cs | 30 + Shared.NFe.Danfe/DanfeSharedHelper.cs | 188 ++- 7 files changed, 1506 insertions(+), 28 deletions(-) create mode 100644 NFe.Danfe.Base/NFe/NFeSimplificadoTipo2.frx create mode 100644 NFe.Danfe.Fast/NFe/DanfeFrSimplificadoTipo2.cs diff --git a/NFe.Danfe.AppTeste.Fast/MainWindow.xaml b/NFe.Danfe.AppTeste.Fast/MainWindow.xaml index cbd75fdf1..36f02701b 100644 --- a/NFe.Danfe.AppTeste.Fast/MainWindow.xaml +++ b/NFe.Danfe.AppTeste.Fast/MainWindow.xaml @@ -217,6 +217,8 @@ VerticalAlignment="Top" Width="120" Click="BtnNfceDanfe_Click" Margin="5,10,5,0" /> + - + diff --git a/CTe.AppTeste/MainWindow.xaml.cs b/CTe.AppTeste/MainWindow.xaml.cs index 6f1511e49..0f847b006 100644 --- a/CTe.AppTeste/MainWindow.xaml.cs +++ b/CTe.AppTeste/MainWindow.xaml.cs @@ -120,6 +120,11 @@ private void EventoDesacordoCTe_Click(object sender, RoutedEventArgs e) _model.EventoDesacordoCTe(); } + private void EventoCancelaDesacordoCTe_Click(object sender, RoutedEventArgs e) + { + _model.EventoCancelaDesacordoCTe(); + } + private void CartaCorrecao_Click(object sender, RoutedEventArgs e) { _model.CartaCorrecao(); diff --git a/CTe.Classes/Servicos/Evento/detEvento.cs b/CTe.Classes/Servicos/Evento/detEvento.cs index 17c3d2563..e840e81d3 100644 --- a/CTe.Classes/Servicos/Evento/detEvento.cs +++ b/CTe.Classes/Servicos/Evento/detEvento.cs @@ -44,6 +44,7 @@ public class detEvento [XmlElement("evCancCTe", typeof(evCancCTe), Namespace = "http://www.portalfiscal.inf.br/cte")] [XmlElement("evCCeCTe", typeof(evCCeCTe), Namespace = "http://www.portalfiscal.inf.br/cte")] [XmlElement("evPrestDesacordo", typeof(evPrestDesacordo), Namespace = "http://www.portalfiscal.inf.br/cte")] + [XmlElement("evCancPrestDesacordo", typeof(evCancPrestDesacordo), Namespace = "http://www.portalfiscal.inf.br/cte")] public EventoContainer EventoContainer { get; set; } } } \ No newline at end of file diff --git a/CTe.Classes/Servicos/Evento/evCancPrestDesacordo.cs b/CTe.Classes/Servicos/Evento/evCancPrestDesacordo.cs new file mode 100644 index 000000000..f50233dc4 --- /dev/null +++ b/CTe.Classes/Servicos/Evento/evCancPrestDesacordo.cs @@ -0,0 +1,18 @@ +using System.Xml.Serialization; + +namespace CTe.Classes.Servicos.Evento +{ + [XmlRoot(Namespace = "http://www.portalfiscal.inf.br/cte")] + public class evCancPrestDesacordo : EventoContainer + { + public evCancPrestDesacordo() + { + this.descEvento = "Cancelamento Prestação do Serviço em Desacordo"; + } + + public string descEvento { get; set; } + + public string nProtEvPrestDes { get; set; } + + } +} diff --git a/CTe.Servicos/ConsultaStatus/StatusServico.cs b/CTe.Servicos/ConsultaStatus/StatusServico.cs index 296f79b6b..d1c8063d2 100644 --- a/CTe.Servicos/ConsultaStatus/StatusServico.cs +++ b/CTe.Servicos/ConsultaStatus/StatusServico.cs @@ -61,6 +61,9 @@ public retConsStatServCte ConsultaStatus(ConfiguracaoServico configuracaoServico public retConsStatServCTe ConsultaStatusV4(ConfiguracaoServico configuracaoServico = null) { + if (configuracaoServico == null) + configuracaoServico = ConfiguracaoServico.Instancia; + var consStatServCte = ClassesFactory.CriaConsStatServCTe(configuracaoServico); if (configuracaoServico.IsValidaSchemas) diff --git a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs new file mode 100644 index 000000000..c41c0547e --- /dev/null +++ b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs @@ -0,0 +1,47 @@ +using CTe.Classes; +using CTe.Classes.Servicos.Evento; +using CTe.Classes.Servicos.Evento.Flags; +using CTe.Servicos.Factory; +using System.Threading.Tasks; + +namespace CTe.Servicos.Eventos +{ + public class EventoCancelamentoDesacordo + { + private readonly int _sequenciaEvento; + private readonly string _cnpj; + private readonly string _chave; + private readonly string _nProtEvPrestDes; + + public eventoCTe EventoEnviado { get; private set; } + public retEventoCTe RetornoSefaz { get; private set; } + + public EventoCancelamentoDesacordo(int sequenciaEvento, string chave, string cnpj, string nProtEvPrestDes) + { + _chave = chave; + _cnpj = cnpj; + _sequenciaEvento = sequenciaEvento; + _nProtEvPrestDes = nProtEvPrestDes; + } + + public retEventoCTe CancelarDesacordo(ConfiguracaoServico configuracaoServico = null) + { + var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); + + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + + return RetornoSefaz; + } + + public async Task CancelarDesacordoAsync(ConfiguracaoServico configuracaoServico = null) + { + var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); + + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + + return RetornoSefaz; + } + } +} diff --git a/CTe.Servicos/Factory/ClassesFactory.cs b/CTe.Servicos/Factory/ClassesFactory.cs index 03492279d..646c6428e 100644 --- a/CTe.Servicos/Factory/ClassesFactory.cs +++ b/CTe.Servicos/Factory/ClassesFactory.cs @@ -164,6 +164,22 @@ public static evPrestDesacordo CriaEvPrestDesacordo(string indicadorDesacordo, s return evPrestDesacordo; } + public static evCancPrestDesacordo CriaEvCancPrestDesacordo(string nProtEvPrestDes, ConfiguracaoServico configuracaoServico = null) + { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; + + var evPrestDesacordo = new evCancPrestDesacordo + { + nProtEvPrestDes = nProtEvPrestDes + }; + + if (configServico.cUF == Estado.MT)//sem acentuação issue #1386 + { + evPrestDesacordo.descEvento = "Cancelamento Prestacao do Servico em Desacordo"; + } + + return evPrestDesacordo; + } public static enviCTe CriaEnviCTe(int lote, List cteEletronicoList, ConfiguracaoServico configuracaoServico = null) { From cb8a7975353f228fa997c607aab7a002f7eb4630 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 14:38:44 -0300 Subject: [PATCH 52/71] feat(NFe): adiciona tpNFCredito 06 - retorno por recusa parcial na entrega MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Conforme NT 2025.002 v1.40, publicada em 20/05/2026. Adaptado em relação ao original: o enumerador na DFe.NET é TpNotaCredito (no fork, TipoNFeCredito) e a descrição do 06 foi corrigida — o fork replicou por engano o texto do valor 03. Portado de Hercules-NET/ZeusFiscal: - PR #155 (728013d3: 1f95cbe9, 8e0b64b6) --- .../Informacoes/Identificacao/Tipos/ideTipos.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs index 065164a7e..10aea881a 100644 --- a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs +++ b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs @@ -591,7 +591,8 @@ public enum TpNotaDebito /// 02 - Apropriação de crédito presumido de IBS sobre o saldo devedor na ZFM (art. 450, § 1º, LC 214/25) /// 03 - Retorno por recusa na entrega ou por não localização do destinatário na tentativa de entrega /// 04 - Redução de valores - /// 05 - Transferência de crédito na sucessão; + /// 05 - Transferência de crédito na sucessão + /// 06 - Retorno por recusa parcial na entrega /// public enum TpNotaCredito { @@ -611,9 +612,13 @@ public enum TpNotaCredito [XmlEnum("04")] ReducaoDeValores, - [Description("Transferência de crédito na sucessão;")] + [Description("Transferência de crédito na sucessão")] [XmlEnum("05")] - TfCreditoSucessao + TfCreditoSucessao, + + [Description("Retorno por recusa parcial na entrega")] + [XmlEnum("06")] + RetornoPorRecusaParcialNaEntrega } /// From 7bae658961e8f880030436d1005e54cbe6abc42f Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 15:24:43 -0300 Subject: [PATCH 53/71] =?UTF-8?q?fix(NFe):=20corrige=20URL=20de=20homologa?= =?UTF-8?q?=C3=A7=C3=A3o=20do=20QR=20Code=202.0/3.0=20do=20RN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Portado de Hercules-NET/ZeusFiscal: - PR #150 (cc7f12db) - PR #157 (02596fa9: 0b5e4281) --- NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs b/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs index df249a72b..28d21870e 100644 --- a/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs +++ b/NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs @@ -264,7 +264,7 @@ private static List CarregarUrls() {Estado.PR, versao3E4, "http://www.fazenda.pr.gov.br"}, {Estado.PI, versao3E4, "http://webas.sefaz.pi.gov.br/nfceweb-homologacao/consultarNFCe.jsf"}, {Estado.RJ, versao3E4, "http://nfce.fazenda.rj.gov.br/consulta"}, - {Estado.RN, versao3E4, "http://nfce.set.rn.gov.br/consultarNFCe.aspx"}, + {Estado.RN, versao3E4, "http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx"}, {Estado.RS, versao3E4, "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"}, {Estado.RO, versao3E4, "http://www.nfce.sefin.ro.gov.br"}, {Estado.RR, versao3E4, "http://200.174.88.103:8080/nfce/servlet/wp_consulta_nfce"}, @@ -302,7 +302,6 @@ private static List CarregarUrls() {Estado.PE, versao3E4, "nfce.sefaz.pe.gov.br/nfce/consulta"}, {Estado.PI, versao3E4, "www.sefaz.pi.gov.br/nfce/consulta"}, {Estado.RJ, versao3E4, "www.fazenda.rj.gov.br/nfce/consulta"}, - {Estado.RN, versao3E4, "www.set.rn.gov.br/nfce/consulta"}, {Estado.RS, versao3E4, "www.sefaz.rs.gov.br/nfce/consulta"}, {Estado.RO, versao3E4, "www.sefin.ro.gov.br/nfce/consulta"}, {Estado.RR, versao3E4, "www.sefaz.rr.gov.br/nfce/consulta"} @@ -320,6 +319,7 @@ private static List CarregarUrls() {Estado.BA, versao3E4, "www.sefaz.ba.gov.br/nfce/consulta"}, {Estado.MT, versao3E4, "http://www.sefaz.mt.gov.br/nfce/consultanfce"}, {Estado.PB, versao3E4, "www.receita.pb.gov.br/nfce/consulta"}, + {Estado.RN, versao3E4, "https://nfce.sefaz.rn.gov.br/portalDFE/NFCe/ConsultaNFCe.aspx"}, {Estado.SP, versao3E4, "https://www.nfce.fazenda.sp.gov.br/consulta"}, {Estado.SE, versao3E4, "http://www.nfce.se.gov.br/nfce/consulta"}, {Estado.GO, versao3E4, "www.sefaz.go.gov.br/nfce/consulta"}, @@ -339,6 +339,7 @@ private static List CarregarUrls() {Estado.BA, versao3E4, "http://hinternet.sefaz.ba.gov.br/nfce/consulta"}, {Estado.MT, versao3E4, "http://homologacao.sefaz.mt.gov.br/nfce/consultanfce"}, {Estado.PB, versao3E4, "www.receita.pb.gov.br/nfcehom"}, + {Estado.RN, versao3E4, "www.set.rn.gov.br/nfce/consulta"}, {Estado.SP, versao3E4, "https://www.homologacao.nfce.fazenda.sp.gov.br/consulta"}, {Estado.SE, versao3E4, "http://www.hom.nfe.se.gov.br/nfce/consulta"}, {Estado.GO, versao3E4, "https://nfewebhomolog.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe"}, From 3816c894dda0d7818a1050b0fd855cedc76d8cc0 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 15:33:43 -0300 Subject: [PATCH 54/71] =?UTF-8?q?feat(DFe.Utils):=20adiciona=20StoreLocati?= =?UTF-8?q?on=20opcional=20na=20busca=20de=20certificado=20no=20reposit?= =?UTF-8?q?=C3=B3rio=20do=20Windows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Portado de Hercules-NET/ZeusFiscal: - PR #158 (06745ca1: 36b0a9fc) --- DFe.Utils/Assinatura/CertificadoDigital.cs | 18 +++++++++--------- DFe.Utils/CertificadoDigitalUtils.cs | 4 ++-- DFe.Utils/ConfiguracaoCertificado.cs | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/DFe.Utils/Assinatura/CertificadoDigital.cs b/DFe.Utils/Assinatura/CertificadoDigital.cs index 8104d944d..7f29bcbe0 100644 --- a/DFe.Utils/Assinatura/CertificadoDigital.cs +++ b/DFe.Utils/Assinatura/CertificadoDigital.cs @@ -52,9 +52,9 @@ public static class CertificadoDigital /// /// /// - public static X509Store ObterX509Store(OpenFlags openFlags) + public static X509Store ObterX509Store(OpenFlags openFlags, StoreLocation storeLocation = StoreLocation.CurrentUser) { - var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); + X509Store store = new X509Store(StoreName.My, storeLocation); store.Open(openFlags); return store; } @@ -89,7 +89,7 @@ private static X509Certificate2 ObterDoArrayBytes(byte[] arrayBytes, string senh { try { - var certificado = new X509Certificate2(arrayBytes, senha, keyStorageFlag); + X509Certificate2 certificado = new X509Certificate2(arrayBytes, senha, keyStorageFlag); return certificado; } catch (Exception ex) @@ -102,12 +102,12 @@ private static X509Certificate2 ObterDoArrayBytes(byte[] arrayBytes, string senh /// Obtém um objeto pelo serial passado no parÂmetro /// /// - private static X509Certificate2 ObterDoRepositorio(string serial, OpenFlags opcoesDeAbertura) + private static X509Certificate2 ObterDoRepositorio(string serial, OpenFlags opcoesDeAbertura, StoreLocation storeLocation = StoreLocation.CurrentUser) { if (string.IsNullOrEmpty(serial)) throw new ArgumentException("O número de série do certificado digital não foi informado!"); X509Certificate2 certificado = null; - var store = ObterX509Store(opcoesDeAbertura); + var store = ObterX509Store(opcoesDeAbertura, storeLocation); try { foreach (var item in store.Certificates) @@ -133,9 +133,9 @@ private static X509Certificate2 ObterDoRepositorio(string serial, OpenFlags opco /// /// /// - private static X509Certificate2 ObterDoRepositorioPassandoPin(string serial, string senha = null) + private static X509Certificate2 ObterDoRepositorioPassandoPin(string serial, string senha = null, StoreLocation storeLocation = StoreLocation.CurrentUser) { - var certificado = ObterDoRepositorio(serial, OpenFlags.ReadOnly); + var certificado = ObterDoRepositorio(serial, OpenFlags.ReadOnly, storeLocation); if (string.IsNullOrEmpty(senha)) return certificado; certificado.DefinirPinParaChavePrivada(senha); return certificado; @@ -187,13 +187,13 @@ private static X509Certificate2 ObterDadosCertificado(ConfiguracaoCertificado co switch (configuracaoCertificado.TipoCertificado) { case TipoCertificado.A1Repositorio: - return ObterDoRepositorio(configuracaoCertificado.Serial, OpenFlags.MaxAllowed); + return ObterDoRepositorio(configuracaoCertificado.Serial, OpenFlags.MaxAllowed, configuracaoCertificado.StoreLocation); case TipoCertificado.A1ByteArray: return ObterDoArrayBytes(configuracaoCertificado.ArrayBytesArquivo, configuracaoCertificado.Senha, configuracaoCertificado.KeyStorageFlags); case TipoCertificado.A1Arquivo: return ObterDeArquivo(configuracaoCertificado.Arquivo, configuracaoCertificado.Senha, configuracaoCertificado.KeyStorageFlags); case TipoCertificado.A3: - return ObterDoRepositorioPassandoPin(configuracaoCertificado.Serial, configuracaoCertificado.Senha); + return ObterDoRepositorioPassandoPin(configuracaoCertificado.Serial, configuracaoCertificado.Senha, configuracaoCertificado.StoreLocation); default: throw new ArgumentOutOfRangeException(); } diff --git a/DFe.Utils/CertificadoDigitalUtils.cs b/DFe.Utils/CertificadoDigitalUtils.cs index 178f71ea8..9b9067c37 100644 --- a/DFe.Utils/CertificadoDigitalUtils.cs +++ b/DFe.Utils/CertificadoDigitalUtils.cs @@ -16,9 +16,9 @@ public class CertificadoDigitalUtils /// Exibe a lista de certificados instalados no PC e devolve o certificado selecionado /// /// - public static X509Certificate2 ListareObterDoRepositorio() + public static X509Certificate2 ListareObterDoRepositorio(StoreLocation storeLocation = StoreLocation.CurrentUser) { - var store = CertificadoDigital.ObterX509Store(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly); + var store = CertificadoDigital.ObterX509Store(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly, storeLocation); var collection = store.Certificates; var fcollection = collection.Find(X509FindType.FindByTimeValid, DateTime.Now, true); var scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Certificados válidos:", "Selecione o certificado que deseja usar", diff --git a/DFe.Utils/ConfiguracaoCertificado.cs b/DFe.Utils/ConfiguracaoCertificado.cs index 158e28bf5..48b735db1 100644 --- a/DFe.Utils/ConfiguracaoCertificado.cs +++ b/DFe.Utils/ConfiguracaoCertificado.cs @@ -61,9 +61,11 @@ public class ConfiguracaoCertificado private string _cacheId; private byte[] _arrayBytesArquivo; private X509KeyStorageFlags _keyStorageFlags; + private StoreLocation _storeLocation; public ConfiguracaoCertificado() { + StoreLocation = StoreLocation.CurrentUser; KeyStorageFlags = X509KeyStorageFlags.MachineKeySet; SignatureMethodSignedXml = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"; DigestMethodReference = "http://www.w3.org/2000/09/xmldsig#sha1"; @@ -195,5 +197,19 @@ public X509KeyStorageFlags KeyStorageFlags _keyStorageFlags = value; } } + + /// + /// + /// + public StoreLocation StoreLocation + { + get { return _storeLocation; } + set + { + if (value == _storeLocation) + return; + _storeLocation = value; + } + } } } From 7e9153b1800aba98b28dd1e901092c4bad057be4 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 15:46:48 -0300 Subject: [PATCH 55/71] =?UTF-8?q?fix(CTe):=20corrige=20n=C3=A3o=20preenchi?= =?UTF-8?q?mento=20de=20ConfiguracaoServico=20nos=20eventos=20de=20desacor?= =?UTF-8?q?do?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Portado de Hercules-NET/ZeusFiscal: - PR #163 (d787b140: 784e8916) --- CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs | 10 ++++++---- CTe.Servicos/Eventos/EventoDesacordo.cs | 12 ++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs index c41c0547e..72aafacc0 100644 --- a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs @@ -26,20 +26,22 @@ public EventoCancelamentoDesacordo(int sequenciaEvento, string chave, string cnp public retEventoCTe CancelarDesacordo(ConfiguracaoServico configuracaoServico = null) { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); - RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); return RetornoSefaz; } public async Task CancelarDesacordoAsync(ConfiguracaoServico configuracaoServico = null) { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); - RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configuracaoServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); return RetornoSefaz; } diff --git a/CTe.Servicos/Eventos/EventoDesacordo.cs b/CTe.Servicos/Eventos/EventoDesacordo.cs index d2cef837a..9670f8de0 100644 --- a/CTe.Servicos/Eventos/EventoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoDesacordo.cs @@ -61,21 +61,21 @@ public EventoDesacordo(int sequenciaEvento, string chave, string cnpj, string in public retEventoCTe Discordar(ConfiguracaoServico configuracaoServico = null) { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configuracaoServico); - RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configuracaoServico); - + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); return RetornoSefaz; } public async Task DiscordarAsync(ConfiguracaoServico configuracaoServico = null) { + var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configuracaoServico); - RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configuracaoServico); - + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); return RetornoSefaz; } } From 4df4669f3e22284c8f925f59f7a1e67a814485c9 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 15:56:28 -0300 Subject: [PATCH 56/71] =?UTF-8?q?fix(NFe.Danfe):=20adiciona=20verifica?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20null=20em=20volume=20no=20NFeRetrato.frx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Evita null exception em versões mais atuais do FastReport. Portado de Hercules-NET/ZeusFiscal: - PR #149 (b5a413bd: f7ad77d6) --- NFe.Danfe.Base/NFe/NFeRetrato.frx | 62 ++++++++++++++++--------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/NFe.Danfe.Base/NFe/NFeRetrato.frx b/NFe.Danfe.Base/NFe/NFeRetrato.frx index 19d2e8cca..38d27f740 100644 --- a/NFe.Danfe.Base/NFe/NFeRetrato.frx +++ b/NFe.Danfe.Base/NFe/NFeRetrato.frx @@ -73,38 +73,40 @@ namespace FastReport } var vol = Report.GetDataSource("NFe.NFe.infNFe.transp.vol"); - vol.Init(); - int qtdeVol = 0; - - int volumes = 0; - decimal pesoL = 0; - decimal pesoB = 0; - while (vol.HasMoreRows) - { - Memo106.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.esp")); - Memo108.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.marca")); - Memo110.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.nVol")); - - volumes += ((Nullable<int>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.qVol")) ?? 0; - pesoL += ((Nullable<decimal>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.pesoL")) ?? 0M; - pesoB += ((Nullable<decimal>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.pesoB")) ?? 0M; - qtdeVol++; - vol.Next(); - } - - if (qtdeVol >= 1) - { - if (qtdeVol > 1) + if(vol != null){ + vol.Init(); + int qtdeVol = 0; + + int volumes = 0; + decimal pesoL = 0; + decimal pesoB = 0; + while (vol.HasMoreRows) { - Memo106.Text = "VOLUMES"; - Memo108.Text = ""; - Memo110.Text = ""; + Memo106.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.esp")); + Memo108.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.marca")); + Memo110.Text = ((String)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.nVol")); + + volumes += ((Nullable<int>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.qVol")) ?? 0; + pesoL += ((Nullable<decimal>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.pesoL")) ?? 0M; + pesoB += ((Nullable<decimal>)Report.GetColumnValue("NFe.NFe.infNFe.transp.vol.pesoB")) ?? 0M; + qtdeVol++; + vol.Next(); } - - Memo104.Text = volumes.ToString(); - Memo112.Text = FormatNumber(pesoB,3) + " KG"; - Memo114.Text = FormatNumber(pesoL,3) + " KG"; - } + + if (qtdeVol >= 1) + { + if (qtdeVol > 1) + { + Memo106.Text = "VOLUMES"; + Memo108.Text = ""; + Memo110.Text = ""; + } + + Memo104.Text = volumes.ToString(); + Memo112.Text = FormatNumber(pesoB,3) + " KG"; + Memo114.Text = FormatNumber(pesoL,3) + " KG"; + } + } if(Engine.FinalPass) { From 87dd9fb6af72f506ec80cc583a2f3b7ed248872b Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 16:22:31 -0300 Subject: [PATCH 57/71] =?UTF-8?q?fix(NFe):=20corrige=20valores=20expl?= =?UTF-8?q?=C3=ADcitos=20do=20enum=20CSTIPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING: quem persistia o enum como inteiro precisa migrar — valores antes implícitos (posição no enum) agora são explícitos. Portado de Hercules-NET/ZeusFiscal: - PR #174 (69ce9f02) --- .../Tributacao/Federal/Tipos/IPITipos.cs | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/Tipos/IPITipos.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/Tipos/IPITipos.cs index b6d87d258..c318df8bb 100644 --- a/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/Tipos/IPITipos.cs +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/Tipos/IPITipos.cs @@ -58,97 +58,97 @@ public enum CSTIPI /// [Description("Entrada com recuperação de crédito")] [XmlEnum("00")] - ipi00, - - /// - /// 49 - Outras entradas - /// - [Description("Outras entradas")] - [XmlEnum("49")] - ipi49, - - /// - /// 50 - Saída tributada - /// - [Description("Saída tributada")] - [XmlEnum("50")] - ipi50, - - /// - /// 99 - Outras saídas - /// - [Description("Outras saídas")] - [XmlEnum("99")] - ipi99, + ipi00 = 0, /// /// 01 - Entrada tributada com alíquota zero /// [Description("Entrada tributada com alíquota zero")] [XmlEnum("01")] - ipi01, + ipi01 = 1, /// /// 02 - Entrada isenta /// [Description("Entrada isenta")] [XmlEnum("02")] - ipi02, + ipi02 = 2, /// /// 03 - Entrada não-tributada /// [Description("Entrada não-tributada")] [XmlEnum("03")] - ipi03, + ipi03 = 3, /// /// 04 - Entrada imune /// [Description("Entrada imune")] [XmlEnum("04")] - ipi04, + ipi04 = 4, /// /// 05 - Entrada com suspensão /// [Description("Entrada com suspensão")] [XmlEnum("05")] - ipi05, + ipi05 = 5, + + /// + /// 49 - Outras entradas + /// + [Description("Outras entradas")] + [XmlEnum("49")] + ipi49 = 49, + + /// + /// 50 - Saída tributada + /// + [Description("Saída tributada")] + [XmlEnum("50")] + ipi50 = 50, /// /// 51 - Saída tributada com alíquota zero /// [Description("Saída tributada com alíquota zero")] [XmlEnum("51")] - ipi51, + ipi51 = 51, /// /// 52 - Saída isenta /// [Description("Saída isenta")] [XmlEnum("52")] - ipi52, + ipi52 = 52, /// /// 53 - Saída não-tributada /// [Description("Saída não-tributada")] [XmlEnum("53")] - ipi53, + ipi53 = 53, /// /// 54 - Saída imune /// [Description("Saída imune")] [XmlEnum("54")] - ipi54, + ipi54 = 54, /// /// 55 - Saída com suspensão /// [Description("Saída com suspensão")] [XmlEnum("55")] - ipi55 + ipi55 = 55, + + /// + /// 99 - Outras saídas + /// + [Description("Outras saídas")] + [XmlEnum("99")] + ipi99 = 99 } } \ No newline at end of file From 7c8ff378ba715bfdfa2d215f14dacbdb637d2050 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 16:27:17 -0300 Subject: [PATCH 58/71] feat(CTe): adiciona Regime Especial NFF ao enum tpEmis Portado de Hercules-NET/ZeusFiscal: - PR #176 (5a41a160) --- CTe.Classes/Informacoes/Tipos/tpEmis.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CTe.Classes/Informacoes/Tipos/tpEmis.cs b/CTe.Classes/Informacoes/Tipos/tpEmis.cs index 154f06900..32554c433 100644 --- a/CTe.Classes/Informacoes/Tipos/tpEmis.cs +++ b/CTe.Classes/Informacoes/Tipos/tpEmis.cs @@ -36,6 +36,7 @@ namespace CTe.Classes.Informacoes.Tipos /// /// Forma de emissão da CT-e /// 1 - Emissão normal (não em contingência) + /// 3 - Regime Especial NFF /// 4 - Contingência EPEC pela SVC /// 5 - Contingência FS-DA, com impressão do DANFE em formulário de segurança /// 7 - Contingência SVC-RS (SEFAZ Virtual de Contingência do RS) @@ -45,6 +46,8 @@ public enum tpEmis { [XmlEnum("1")] teNormal = 1, + [XmlEnum("3")] + teNFF = 3, [XmlEnum("4")] teEPEC = 4, [XmlEnum("5")] @@ -54,4 +57,4 @@ public enum tpEmis [XmlEnum("8")] teSVCSP = 8 } -} \ No newline at end of file +} From 8b59b57e047971ec60749f58fecfb7dc0098c97e Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 16:41:39 -0300 Subject: [PATCH 59/71] feat(NFe): adiciona tpImp 6 - DANFe Simplificado Tipo 2 Portado de Hercules-NET/ZeusFiscal: - PR #179 (27cf5694: afa50f81) --- NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs index 10aea881a..d281cbcb7 100644 --- a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs +++ b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs @@ -191,7 +191,14 @@ public enum TipoImpressao /// [Description("DANFe NFC-e em mensagem eletrônica")] [XmlEnum("5")] - tiMsgEletronica = 5 + tiMsgEletronica = 5, + + /// + /// 6 - DANFe Simplificado Tipo 2 + /// + [Description("DANFe Simplificado Tipo 2")] + [XmlEnum("6")] + tiSimplificadoTp2 = 6 } /// From 7102e4f3b7d3ea378977a4646b2e176f0a25f5cd Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 16:53:25 -0300 Subject: [PATCH 60/71] =?UTF-8?q?feat(NFe):=20permite=20transmitir=20event?= =?UTF-8?q?os=20e=20inutiliza=C3=A7=C3=B5es=20j=C3=A1=20assinados=20fora?= =?UTF-8?q?=20da=20biblioteca?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Portado de Hercules-NET/ZeusFiscal: - PR #182 (6102dd78: 21a226f6) --- DFe.Testes/Gerais/ObterIdTestes.cs | 61 ++++++++++++++ NFe.Servicos/ServicosNFe.cs | 119 +++++++++++++++++++++++++++ NFe.Utils/Evento/Extevento.cs | 18 ++++ NFe.Utils/Inutilizacao/ExtinutNFe.cs | 32 +++++++ 4 files changed, 230 insertions(+) create mode 100644 DFe.Testes/Gerais/ObterIdTestes.cs diff --git a/DFe.Testes/Gerais/ObterIdTestes.cs b/DFe.Testes/Gerais/ObterIdTestes.cs new file mode 100644 index 000000000..2733d6e47 --- /dev/null +++ b/DFe.Testes/Gerais/ObterIdTestes.cs @@ -0,0 +1,61 @@ +using DFe.Classes.Entidades; +using DFe.Classes.Flags; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NFe.Classes.Servicos.Tipos; +using NFe.Utils.Evento; +using NFe.Utils.Inutilizacao; + +namespace DFe.Testes.Gerais +{ + /// + /// Vetores ouro do Id assinável de evento (infEvento/@Id) e de inutilização (infInut/@Id). + /// + /// Esses Ids também são calculados internamente pelos métodos que assinam (ServicosNFe). Se o formato + /// divergir, o digest da assinatura não bate e o SEFAZ rejeita — por isso os valores esperados aqui são + /// literais do layout, e não o resultado do próprio método. + /// + /// + [TestClass] + public class ObterIdTestes + { + /// Chave de NF-e (modelo 55) com CNPJ alfanumérico, conforme NT Conjunta 2025.001 + private const string ChaveNFe = "522507PC3D315K000193550010000000011000000018"; + + /// Chave de NFC-e (modelo 65), 100% numérica + private const string ChaveNFCe = "23190811820016000167650010000000221100000227"; + + private const string CnpjNumerico = "11820016000167"; + private const string CnpjAlfanumerico = "PC3D315K000193"; + + [TestMethod] + [DataRow(NFeTipoEvento.TeNfeCancelamento, ChaveNFe, 1, "ID110111" + ChaveNFe + "01", + DisplayName = "Cancelamento, chave com CNPJ alfanumérico")] + [DataRow(NFeTipoEvento.TeNfeCartaCorrecao, ChaveNFe, 2, "ID110110" + ChaveNFe + "02", + DisplayName = "Carta de Correção, 2ª sequência")] + [DataRow(NFeTipoEvento.TeMdCienciaDaOperacao, ChaveNFCe, 1, "ID210210" + ChaveNFCe + "01", + DisplayName = "Ciência da Operação, chave numérica")] + [DataRow(NFeTipoEvento.TeMdCienciaDaOperacao, ChaveNFCe, 11, "ID210210" + ChaveNFCe + "11", + DisplayName = "Sequência com 2 dígitos não recebe zero à esquerda")] + public void ObterIdEvento_SegueOLayout(NFeTipoEvento tpEvento, string chNFe, int nSeqEvento, string esperado) + { + Assert.AreEqual(esperado, Extevento.ObterId(tpEvento, chNFe, nSeqEvento)); + } + + [TestMethod] + [DataRow(ModeloDocumento.NFe, CnpjNumerico, 1, 1, 10, + "ID3525" + CnpjNumerico + "55" + "001" + "000000001" + "000000010", + DisplayName = "NF-e, modelo 55")] + [DataRow(ModeloDocumento.NFCe, CnpjNumerico, 1, 1, 10, + "ID3525" + CnpjNumerico + "65" + "001" + "000000001" + "000000010", + DisplayName = "NFC-e, modelo 65")] + [DataRow(ModeloDocumento.NFe, CnpjAlfanumerico, 12, 5, 5, + "ID3525" + CnpjAlfanumerico + "55" + "012" + "000000005" + "000000005", + DisplayName = "CNPJ alfanumérico, faixa de um número só")] + public void ObterIdInutilizacao_SegueOLayout(ModeloDocumento modelo, string cnpj, int serie, + int numeroInicial, int numeroFinal, string esperado) + { + Assert.AreEqual(esperado, + ExtinutNFe.ObterId(Estado.SP, 25, cnpj, modelo, serie, numeroInicial, numeroFinal)); + } + } +} diff --git a/NFe.Servicos/ServicosNFe.cs b/NFe.Servicos/ServicosNFe.cs index 0aaafb209..13f0be433 100644 --- a/NFe.Servicos/ServicosNFe.cs +++ b/NFe.Servicos/ServicosNFe.cs @@ -855,6 +855,23 @@ public RetornoRecepcaoEvento RecepcaoEventoManifestacaoDestinatario(int idlote, return retorno; } + /// + /// Envia eventos do tipo "Manifestação do destinatário" já assinado. + /// + /// + /// + /// + /// 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. + /// + /// + public RetornoRecepcaoEvento RecepcaoEventoManifestacaoDestinatario(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoManifestacaoDestinatario, _cFgServico.VersaoRecepcaoEventoManifestacaoDestinatario, assinar); + return retorno; + } + /// /// Envia um evento do tipo "EPEC" /// @@ -996,6 +1013,23 @@ public RetornoRecepcaoEvento RecepcaoEventoInsucessoEntrega(int idlote, return retorno; } + /// + /// Envia eventos do tipo "Insucesso na Entrega da NF-e" já assinado. + /// + /// + /// + /// + /// 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. + /// + /// + public RetornoRecepcaoEvento RecepcaoEventoInsucessoEntrega(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoInsucessoEntregaNFe, _cFgServico.VersaoRecepcaoEventoInsucessoEntrega, assinar); + return retorno; + } + /// /// Serviço para cancelamento insucesso na entrega /// @@ -1048,6 +1082,23 @@ public RetornoRecepcaoEvento RecepcaoEventoCancInsucessoEntrega(int idlote, return retorno; } + /// + /// Envia eventos do tipo "Cancelamento do Insucesso na Entrega da NF-e" já assinado. + /// + /// + /// + /// + /// 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. + /// + /// + public RetornoRecepcaoEvento RecepcaoEventoCancInsucessoEntrega(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoCancInsucessoEntregaNFe, _cFgServico.VersaoRecepcaoEventoInsucessoEntrega, assinar); + return retorno; + } + /// /// Recepção do Evento de Comprovante de Entrega /// @@ -1117,6 +1168,23 @@ public RetornoRecepcaoEvento RecepcaoEventoComprovanteEntrega(int idlote, return retorno; } + /// + /// Envia eventos do tipo "Comprovante de Entrega da NF-e" já assinado. + /// + /// + /// + /// + /// 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. + /// + /// + public RetornoRecepcaoEvento RecepcaoEventoComprovanteEntrega(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoComprovanteEntregaNFe, _cFgServico.VersaoRecepcaoEventoComprovanteEntrega, assinar); + return retorno; + } + /// /// Serviço para cancelamento comprovante de entrega /// @@ -1170,6 +1238,23 @@ public RetornoRecepcaoEvento RecepcaoEventoCancComprovanteEntrega(int idlote, return retorno; } + /// + /// Envia eventos do tipo "Cancelamento do Comprovante de Entrega da NF-e" já assinado. + /// + /// + /// + /// + /// 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. + /// + /// + public RetornoRecepcaoEvento RecepcaoEventoCancComprovanteEntrega(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoCancComprovanteEntregaNFe, _cFgServico.VersaoRecepcaoEventoComprovanteEntrega, assinar); + return retorno; + } + /// /// Recepção do Evento de Conciliação Financeira @@ -1221,6 +1306,23 @@ public RetornoRecepcaoEvento RecepcaoEventoConciliacaoFinanceira(int idlote, return retorno; } + /// + /// Envia eventos do tipo "Conciliação Financeira da NF-e" já assinado. + /// + /// + /// + /// + /// 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. + /// + /// + public RetornoRecepcaoEvento RecepcaoEventoConciliacaoFinanceira(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoConciliacaoFinanceiraNFe, _cFgServico.VersaoRecepcaoEventoConciliacaoFinanceira, assinar); + return retorno; + } + /// /// Serviço para cancelamento Conciliação Financeira /// @@ -1348,6 +1450,23 @@ public RetornoRecepcaoEvento RecepcaoEventoSolicitacaoDeApropriacaoDeCreditoPres return retornoRecepcaoEvento; } + /// + /// Envia eventos do tipo "Cancelamento da Conciliação Financeira da NF-e" já assinado. + /// + /// + /// + /// + /// 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. + /// + /// + public RetornoRecepcaoEvento RecepcaoEventoCancConciliacaoFinanceira(int idlote, List eventos, bool assinar = false) + { + var retorno = RecepcaoEvento(idlote, eventos, ServicoNFe.RecepcaoEventoCancConciliacaoFinanceiraNFe, _cFgServico.VersaoRecepcaoEventoConciliacaoFinanceira, assinar); + return retorno; + } + /// /// Serviço para evento destinação de item para consumo pessoal /// diff --git a/NFe.Utils/Evento/Extevento.cs b/NFe.Utils/Evento/Extevento.cs index 95ad2764d..b5fa718ec 100644 --- a/NFe.Utils/Evento/Extevento.cs +++ b/NFe.Utils/Evento/Extevento.cs @@ -34,6 +34,7 @@ using System.Security.Cryptography.X509Certificates; using DFe.Utils; using NFe.Classes.Servicos.Evento; +using NFe.Classes.Servicos.Tipos; using NFe.Utils.Assinatura; namespace NFe.Utils.Evento @@ -50,6 +51,23 @@ public static string ObterXmlString(this evento pedEvento) return FuncoesXml.ClasseParaXmlString(pedEvento); } + /// + /// Obtém o Id de um evento (infEvento/@Id): literal "ID" + tpEvento + chNFe + nSeqEvento com 2 dígitos + /// + /// Uso opcional, para quando o evento for montado fora da biblioteca — por exemplo, para assinar com o + /// certificado numa máquina cliente e depois transmitir com a sobrecarga que recebe o evento já + /// assinado. Os métodos que assinam internamente continuam calculando o Id sozinhos. + /// + /// + /// Código do evento + /// Chave de acesso da NF-e vinculada ao evento + /// Sequencial do evento para o mesmo tipo de evento + /// Retorna o conteúdo do atributo infEvento/@Id + public static string ObterId(NFeTipoEvento tpEvento, string chNFe, int nSeqEvento) + { + return "ID" + ((int)tpEvento) + chNFe + nSeqEvento.ToString().PadLeft(2, '0'); + } + /// /// Assina um objeto evento /// diff --git a/NFe.Utils/Inutilizacao/ExtinutNFe.cs b/NFe.Utils/Inutilizacao/ExtinutNFe.cs index 9b0dab15b..db0b09cf5 100644 --- a/NFe.Utils/Inutilizacao/ExtinutNFe.cs +++ b/NFe.Utils/Inutilizacao/ExtinutNFe.cs @@ -32,6 +32,8 @@ /********************************************************************************/ using System; using System.Security.Cryptography.X509Certificates; +using DFe.Classes.Entidades; +using DFe.Classes.Flags; using DFe.Utils; using NFe.Classes.Servicos.Inutilizacao; using NFe.Utils.Assinatura; @@ -61,6 +63,36 @@ public static string ObterXmlString(this inutNFe pedInutilizacao) return FuncoesXml.ClasseParaXmlString(pedInutilizacao); } + /// + /// Obtém o Id de um pedido de inutilização (infInut/@Id): literal "ID" + cUF + ano com 2 dígitos + CNPJ + + /// modelo + série com 3 dígitos + número inicial e número final com 9 dígitos + /// + /// Uso opcional, para quando o pedido for montado fora da biblioteca — por exemplo, para assinar com o + /// certificado numa máquina cliente e depois transmitir com já feito, via a + /// sobrecarga que recebe o inutNFe pronto. O método que assina internamente continua calculando o Id + /// sozinho. + /// + /// + /// Código da UF do solicitante + /// Ano de inutilização da numeração + /// CNPJ do emitente + /// Modelo do documento + /// Série + /// Número inicial a ser inutilizado + /// Número final a ser inutilizado + /// Retorna o conteúdo do atributo infInut/@Id + public static string ObterId(Estado cUF, int ano, string cnpj, ModeloDocumento modelo, int serie, + int numeroInicial, int numeroFinal) + { + var numId = string.Concat((int)cUF, ano.ToString("D2"), + cnpj, (int)modelo, + serie.ToString().PadLeft(3, '0'), + numeroInicial.ToString().PadLeft(9, '0'), + numeroFinal.ToString().PadLeft(9, '0')); + + return "ID" + numId; + } + /// /// Assina um objeto inutNFe /// From e2a24a4270db0bf5ddfeec7e1005bd9f4c18d7d7 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 17:08:26 -0300 Subject: [PATCH 61/71] =?UTF-8?q?feat(MDFe):=20adiciona=20sobrecargas=20pa?= =?UTF-8?q?ra=20emiss=C3=A3o=20de=20eventos=20sem=20o=20MDFeEletronico=20c?= =?UTF-8?q?ompleto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modificado em relação ao original: MDFeComandoPagamentoOperacao usa os tipos MDFeInfViagens/MDFeInfPag da DFe.NET no lugar de infViagens/infPag do fork. Portado de Hercules-NET/ZeusFiscal: - PR #177 (f7061dc7) --- .../Contratos/IServicoController.cs | 2 ++ MDFe.Servicos/EventosMDFe/EventoCancelar.cs | 7 ++++ .../EventosMDFe/EventoEncerramento.cs | 7 ++++ .../EventosMDFe/EventoInclusaoCondutor.cs | 10 ++++-- .../EventosMDFe/EventoInclusaoDFe.cs | 8 ++++- .../EventosMDFe/EventoPagamentoOperacao.cs | 13 ++++--- MDFe.Servicos/EventosMDFe/FactoryEvento.cs | 35 +++++++++++++++++++ .../EventosMDFe/MDFeComandoCancelamento.cs | 11 ++++++ .../EventosMDFe/MDFeComandoEncerramento.cs | 14 ++++++++ .../EventosMDFe/MDFeComandoEvento.cs | 18 ++++++++++ .../MDFeComandoInclusaoCondutor.cs | 11 ++++++ .../EventosMDFe/MDFeComandoInclusaoDFe.cs | 16 +++++++++ .../MDFeComandoPagamentoOperacao.cs | 15 ++++++++ .../EventosMDFe/ServicoController.cs | 17 +++++++++ .../EventosMDFe/ServicoMDFeEvento.cs | 25 +++++++++++++ 15 files changed, 200 insertions(+), 9 deletions(-) create mode 100644 MDFe.Servicos/EventosMDFe/MDFeComandoCancelamento.cs create mode 100644 MDFe.Servicos/EventosMDFe/MDFeComandoEncerramento.cs create mode 100644 MDFe.Servicos/EventosMDFe/MDFeComandoEvento.cs create mode 100644 MDFe.Servicos/EventosMDFe/MDFeComandoInclusaoCondutor.cs create mode 100644 MDFe.Servicos/EventosMDFe/MDFeComandoInclusaoDFe.cs create mode 100644 MDFe.Servicos/EventosMDFe/MDFeComandoPagamentoOperacao.cs diff --git a/MDFe.Servicos/EventosMDFe/Contratos/IServicoController.cs b/MDFe.Servicos/EventosMDFe/Contratos/IServicoController.cs index 161ea4685..4f523579b 100644 --- a/MDFe.Servicos/EventosMDFe/Contratos/IServicoController.cs +++ b/MDFe.Servicos/EventosMDFe/Contratos/IServicoController.cs @@ -42,5 +42,7 @@ namespace MDFe.Servicos.EventosMDFe.Contratos public interface IServicoController { MDFeRetEventoMDFe Executar(MDFeEletronico mdfe, byte sequenciaEvento, MDFeEventoContainer eventoContainer, MDFeTipoEvento tipoEvento, MDFeConfiguracao cfgMdfe = null); + + MDFeRetEventoMDFe Executar(MDFeComandoEvento comando, MDFeEventoContainer eventoContainer, MDFeTipoEvento tipoEvento, MDFeConfiguracao cfgMdfe = null); } } \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/EventoCancelar.cs b/MDFe.Servicos/EventosMDFe/EventoCancelar.cs index 4a9f55e5c..b74350df5 100644 --- a/MDFe.Servicos/EventosMDFe/EventoCancelar.cs +++ b/MDFe.Servicos/EventosMDFe/EventoCancelar.cs @@ -51,5 +51,12 @@ public MDFeRetEventoMDFe MDFeEventoCancelar(MDFeEletronico mdfe, byte sequenciaE return retorno; } + + public MDFeRetEventoMDFe MDFeEventoCancelar(MDFeComandoCancelamento comando, MDFeConfiguracao cfgMdfe = null) + { + var config = cfgMdfe ?? MDFeConfiguracao.Instancia; + var evento = ClassesFactory.CriaEvCancMDFe(comando.Protocolo, comando.Justificativa); + return new ServicoController().Executar(comando, evento, MDFeTipoEvento.Cancelamento, config); + } } } \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/EventoEncerramento.cs b/MDFe.Servicos/EventosMDFe/EventoEncerramento.cs index e7de8b41c..1ae049cba 100644 --- a/MDFe.Servicos/EventosMDFe/EventoEncerramento.cs +++ b/MDFe.Servicos/EventosMDFe/EventoEncerramento.cs @@ -63,5 +63,12 @@ public MDFeRetEventoMDFe MDFeEventoEncerramento(MDFeEletronico mdfe, Estado esta return retorno; } + + public MDFeRetEventoMDFe MDFeEventoEncerramento(MDFeComandoEncerramento comando, MDFeConfiguracao cfgMdfe = null) + { + var config = cfgMdfe ?? MDFeConfiguracao.Instancia; + var evento = ClassesFactory.CriaEvEncMDFe(comando.EstadoEncerramento, comando.CodigoMunicipioEncerramento, comando.Protocolo); + return new ServicoController().Executar(comando, evento, MDFeTipoEvento.Encerramento, config); + } } } \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/EventoInclusaoCondutor.cs b/MDFe.Servicos/EventosMDFe/EventoInclusaoCondutor.cs index 32d640724..c3798ff2a 100644 --- a/MDFe.Servicos/EventosMDFe/EventoInclusaoCondutor.cs +++ b/MDFe.Servicos/EventosMDFe/EventoInclusaoCondutor.cs @@ -46,10 +46,14 @@ public MDFeRetEventoMDFe MDFeEventoIncluirCondutor(MDFeEletronico mdfe, byte seq var config = cfgMdfe ?? MDFeConfiguracao.Instancia; var incluirCodutor = ClassesFactory.CriaEvIncCondutorMDFe(nome, cpf); + return new ServicoController().Executar(mdfe, sequenciaEvento, incluirCodutor, MDFeTipoEvento.InclusaoDeCondutor, config); + } - var retorno = new ServicoController().Executar(mdfe, sequenciaEvento, incluirCodutor, MDFeTipoEvento.InclusaoDeCondutor, config); - - return retorno; + public MDFeRetEventoMDFe MDFeEventoIncluirCondutor(MDFeComandoInclusaoCondutor comando, MDFeConfiguracao cfgMdfe = null) + { + var config = cfgMdfe ?? MDFeConfiguracao.Instancia; + var evento = ClassesFactory.CriaEvIncCondutorMDFe(comando.Nome, comando.CpfCondutor); + return new ServicoController().Executar(comando, evento, MDFeTipoEvento.InclusaoDeCondutor, config); } } } \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/EventoInclusaoDFe.cs b/MDFe.Servicos/EventosMDFe/EventoInclusaoDFe.cs index 9dd35c33c..953f86882 100644 --- a/MDFe.Servicos/EventosMDFe/EventoInclusaoDFe.cs +++ b/MDFe.Servicos/EventosMDFe/EventoInclusaoDFe.cs @@ -49,8 +49,14 @@ public MDFeRetEventoMDFe MDFeEventoIncluirDFe(MDFeEletronico mdfe, byte sequenci var config = cfgMdfe ?? MDFeConfiguracao.Instancia; var inclusao = ClassesFactory.CriaEvIncDFeMDFe(protocolo, codigoMunicipioCarregamento, nomeMunicipioCarregamento, informacoesDocumentos); - return new ServicoController().Executar(mdfe, sequenciaEvento, inclusao, MDFeTipoEvento.InclusaoDFe, config); } + + public MDFeRetEventoMDFe MDFeEventoIncluirDFe(MDFeComandoInclusaoDFe comando, MDFeConfiguracao cfgMdfe = null) + { + var config = cfgMdfe ?? MDFeConfiguracao.Instancia; + var evento = ClassesFactory.CriaEvIncDFeMDFe(comando.Protocolo, comando.CodigoMunicipioCarregamento, comando.NomeMunicipioCarregamento, comando.InformacoesDocumentos); + return new ServicoController().Executar(comando, evento, MDFeTipoEvento.InclusaoDFe, config); + } } } \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/EventoPagamentoOperacao.cs b/MDFe.Servicos/EventosMDFe/EventoPagamentoOperacao.cs index 26e27ef71..21ba82430 100644 --- a/MDFe.Servicos/EventosMDFe/EventoPagamentoOperacao.cs +++ b/MDFe.Servicos/EventosMDFe/EventoPagamentoOperacao.cs @@ -47,15 +47,18 @@ public MDFeRetEventoMDFe MDFeEventoPagamentoOperacao(Classes.Informacoes.MDFe md { var config = cfgMdfe ?? MDFeConfiguracao.Instancia; - var eventoPagamento = ClassesFactory.CriaEvPagtoOperMDFe( - protocolo, - infViagens, - infPagamentos - ); + var eventoPagamento = ClassesFactory.CriaEvPagtoOperMDFe(protocolo, infViagens, infPagamentos); var retorno = new ServicoController().Executar(mdfe, sequencia, eventoPagamento, MDFeTipoEvento.PagamentoOperacaoMDFe, config); return retorno; } + + public MDFeRetEventoMDFe MDFeEventoPagamentoOperacao(MDFeComandoPagamentoOperacao comando, MDFeConfiguracao cfgMdfe = null) + { + var config = cfgMdfe ?? MDFeConfiguracao.Instancia; + var evento = ClassesFactory.CriaEvPagtoOperMDFe(comando.Protocolo, comando.InfViagens, comando.Pagamentos); + return new ServicoController().Executar(comando, evento, MDFeTipoEvento.PagamentoOperacaoMDFe, config); + } } } \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/FactoryEvento.cs b/MDFe.Servicos/EventosMDFe/FactoryEvento.cs index f566c4bf0..35611c777 100644 --- a/MDFe.Servicos/EventosMDFe/FactoryEvento.cs +++ b/MDFe.Servicos/EventosMDFe/FactoryEvento.cs @@ -78,5 +78,40 @@ public static MDFeEventoMDFe CriaEvento(MDFeEletronico MDFe, MDFeTipoEvento tipo return eventoMDFe; } + + public static MDFeEventoMDFe CriaEvento(MDFeComandoEvento comando, MDFeTipoEvento tipoEvento, MDFeEventoContainer evento, MDFeConfiguracao cfgMdfe = null) + { + var config = cfgMdfe ?? MDFeConfiguracao.Instancia; + var eventoMDFe = new MDFeEventoMDFe + { + Versao = config.VersaoWebService.VersaoLayout, + InfEvento = new MDFeInfEvento + { + Id = "ID" + (long)tipoEvento + comando.Chave + comando.SequenciaEvento.ToString("D2"), + TpAmb = config.VersaoWebService.TipoAmbiente, + COrgao = comando.UfEmitente, + ChMDFe = comando.Chave, + DetEvento = new MDFeDetEvento + { + VersaoServico = config.VersaoWebService.VersaoLayout, + EventoContainer = evento + }, + DhEvento = DateTime.Now, + NSeqEvento = comando.SequenciaEvento, + TpEvento = tipoEvento + } + }; + + eventoMDFe.InfEvento.CNPJ = comando.CnpjEmitente; + + if (!string.IsNullOrEmpty(comando.CpfEmitente)) + { + eventoMDFe.InfEvento.CPF = comando.CpfEmitente; + } + + eventoMDFe.Assinar(config); + + return eventoMDFe; + } } } \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/MDFeComandoCancelamento.cs b/MDFe.Servicos/EventosMDFe/MDFeComandoCancelamento.cs new file mode 100644 index 000000000..ffb14c310 --- /dev/null +++ b/MDFe.Servicos/EventosMDFe/MDFeComandoCancelamento.cs @@ -0,0 +1,11 @@ +namespace MDFe.Servicos.EventosMDFe +{ + /// + /// Dados para emitir o evento de cancelamento de MDFe. + /// + public class MDFeComandoCancelamento : MDFeComandoEvento + { + public string Protocolo { get; set; } + public string Justificativa { get; set; } + } +} \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/MDFeComandoEncerramento.cs b/MDFe.Servicos/EventosMDFe/MDFeComandoEncerramento.cs new file mode 100644 index 000000000..91c165bb9 --- /dev/null +++ b/MDFe.Servicos/EventosMDFe/MDFeComandoEncerramento.cs @@ -0,0 +1,14 @@ +using DFe.Classes.Entidades; + +namespace MDFe.Servicos.EventosMDFe +{ + /// + /// Dados para emitir o evento de encerramento de MDFe. + /// + public class MDFeComandoEncerramento : MDFeComandoEvento + { + public string Protocolo { get; set; } + public Estado EstadoEncerramento { get; set; } + public long CodigoMunicipioEncerramento { get; set; } + } +} \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/MDFeComandoEvento.cs b/MDFe.Servicos/EventosMDFe/MDFeComandoEvento.cs new file mode 100644 index 000000000..7830caeb6 --- /dev/null +++ b/MDFe.Servicos/EventosMDFe/MDFeComandoEvento.cs @@ -0,0 +1,18 @@ +using DFe.Classes.Entidades; + +namespace MDFe.Servicos.EventosMDFe +{ + /// + /// Base abstrata com os dados mínimos necessários + /// para emitir um evento de MDFe sem depender + /// do objeto "" completo. + /// + public abstract class MDFeComandoEvento + { + public string Chave { get; set; } + public Estado UfEmitente { get; set; } + public string CnpjEmitente { get; set; } + public string CpfEmitente { get; set; } + public byte SequenciaEvento { get; set; } + } +} \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/MDFeComandoInclusaoCondutor.cs b/MDFe.Servicos/EventosMDFe/MDFeComandoInclusaoCondutor.cs new file mode 100644 index 000000000..116bc9d24 --- /dev/null +++ b/MDFe.Servicos/EventosMDFe/MDFeComandoInclusaoCondutor.cs @@ -0,0 +1,11 @@ +namespace MDFe.Servicos.EventosMDFe +{ + /// + /// Dados para emitir o evento de inclusão de condutor no MDFe. + /// + public class MDFeComandoInclusaoCondutor : MDFeComandoEvento + { + public string Nome { get; set; } + public string CpfCondutor { get; set; } + } +} \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/MDFeComandoInclusaoDFe.cs b/MDFe.Servicos/EventosMDFe/MDFeComandoInclusaoDFe.cs new file mode 100644 index 000000000..706a0e341 --- /dev/null +++ b/MDFe.Servicos/EventosMDFe/MDFeComandoInclusaoDFe.cs @@ -0,0 +1,16 @@ +using MDFe.Classes.Informacoes.Evento.CorpoEvento; +using System.Collections.Generic; + +namespace MDFe.Servicos.EventosMDFe +{ + /// + /// Dados para emitir o evento de inclusão de DF-e no MDFe. + /// + public class MDFeComandoInclusaoDFe : MDFeComandoEvento + { + public string Protocolo { get; set; } + public string CodigoMunicipioCarregamento { get; set; } + public string NomeMunicipioCarregamento { get; set; } + public List InformacoesDocumentos { get; set; } + } +} \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/MDFeComandoPagamentoOperacao.cs b/MDFe.Servicos/EventosMDFe/MDFeComandoPagamentoOperacao.cs new file mode 100644 index 000000000..bef01c113 --- /dev/null +++ b/MDFe.Servicos/EventosMDFe/MDFeComandoPagamentoOperacao.cs @@ -0,0 +1,15 @@ +using MDFe.Classes.Informacoes; +using System.Collections.Generic; + +namespace MDFe.Servicos.EventosMDFe +{ + /// + /// Dados para emitir o evento de pagamento de operação de transporte. + /// + public class MDFeComandoPagamentoOperacao : MDFeComandoEvento + { + public string Protocolo { get; set; } + public MDFeInfViagens InfViagens { get; set; } + public List Pagamentos { get; set; } + } +} \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/ServicoController.cs b/MDFe.Servicos/EventosMDFe/ServicoController.cs index 72bf4a0c7..5a32c60f0 100644 --- a/MDFe.Servicos/EventosMDFe/ServicoController.cs +++ b/MDFe.Servicos/EventosMDFe/ServicoController.cs @@ -67,5 +67,22 @@ public MDFeRetEventoMDFe Executar(MDFeEletronico mdfe, byte sequenciaEvento, MDF return retorno; } + + public MDFeRetEventoMDFe Executar(MDFeComandoEvento comando, MDFeEventoContainer eventoContainer, MDFeTipoEvento tipoEvento, MDFeConfiguracao cfgMdfe = null) + { + var config = cfgMdfe ?? MDFeConfiguracao.Instancia; + var evento = FactoryEvento.CriaEvento(comando, tipoEvento, eventoContainer, config); + + evento.ValidarSchema(config); + evento.SalvarXmlEmDisco(comando.Chave, config); + + var webService = WsdlFactory.CriaWsdlMDFeRecepcaoEvento(config); + var retornoXml = webService.mdfeRecepcaoEvento(evento.CriaXmlRequestWs()); + + var retorno = MDFeRetEventoMDFe.LoadXml(retornoXml.OuterXml, evento); + retorno.SalvarXmlEmDisco(comando.Chave, config); + + return retorno; + } } } \ No newline at end of file diff --git a/MDFe.Servicos/EventosMDFe/ServicoMDFeEvento.cs b/MDFe.Servicos/EventosMDFe/ServicoMDFeEvento.cs index 653dae482..78b9a3fa1 100644 --- a/MDFe.Servicos/EventosMDFe/ServicoMDFeEvento.cs +++ b/MDFe.Servicos/EventosMDFe/ServicoMDFeEvento.cs @@ -54,6 +54,11 @@ public MDFeRetEventoMDFe MDFeEventoIncluirCondutor( return eventoIncluirCondutor.MDFeEventoIncluirCondutor(mdfe, sequenciaEvento, nome, cpf, config); } + public MDFeRetEventoMDFe MDFeEventoIncluirCondutor(MDFeComandoInclusaoCondutor cmd, MDFeConfiguracao cfgMdfe = null) + { + return new EventoInclusaoCondutor().MDFeEventoIncluirCondutor(cmd, cfgMdfe); + } + public MDFeRetEventoMDFe MDFeEventoIncluirDFe( MDFeEletronica mdfe, byte sequenciaEvento, string protocolo, string codigoMunicipioCarregamento, string nomeMunicipioCarregamento, List informacoesDocumentos, @@ -66,6 +71,11 @@ public MDFeRetEventoMDFe MDFeEventoIncluirDFe( return eventoIncluirDFe.MDFeEventoIncluirDFe(mdfe, sequenciaEvento, protocolo, codigoMunicipioCarregamento, nomeMunicipioCarregamento, informacoesDocumentos, config); } + public MDFeRetEventoMDFe MDFeEventoIncluirDFe(MDFeComandoInclusaoDFe cmd, MDFeConfiguracao cfgMdfe = null) + { + return new EventoInclusaoDFe().MDFeEventoIncluirDFe(cmd, cfgMdfe); + } + public MDFeRetEventoMDFe MDFeEventoEncerramentoMDFeEventoEncerramento(MDFeEletronica mdfe, byte sequenciaEvento, string protocolo, MDFeConfiguracao cfgMdfe = null) { var config = cfgMdfe ?? MDFeConfiguracao.Instancia; @@ -85,6 +95,11 @@ public MDFeRetEventoMDFe MDFeEventoEncerramentoMDFeEventoEncerramento(MDFeEletro return eventoEncerramento.MDFeEventoEncerramento(mdfe, estadoEncerramento, codigoMunicipioEncerramento, sequenciaEvento, protocolo, config); } + public MDFeRetEventoMDFe MDFeEventoEncerramentoMDFeEventoEncerramento(MDFeComandoEncerramento cmd, MDFeConfiguracao cfgMdfe = null) + { + return new EventoEncerramento().MDFeEventoEncerramento(cmd, cfgMdfe); + } + public MDFeRetEventoMDFe MDFeEventoCancelar(MDFeEletronica mdfe, byte sequenciaEvento, string protocolo, string justificativa, MDFeConfiguracao cfgMdfe = null) { @@ -95,6 +110,11 @@ public MDFeRetEventoMDFe MDFeEventoCancelar(MDFeEletronica mdfe, byte sequenciaE return eventoCancelamento.MDFeEventoCancelar(mdfe, sequenciaEvento, protocolo, justificativa, config); } + public MDFeRetEventoMDFe MDFeEventoCancelar(MDFeComandoCancelamento cmd, MDFeConfiguracao cfgMdfe = null) + { + return new EventoCancelar().MDFeEventoCancelar(cmd, cfgMdfe); + } + public MDFeRetEventoMDFe MDFeEventoPagamentoOperacaoTransporte(MDFeEletronica mdfe, byte sequenciaEvneto, string protocolo, MDFeInfViagens infViagens, List infPagamentos, MDFeConfiguracao cfgMdfe = null) { @@ -105,5 +125,10 @@ public MDFeRetEventoMDFe MDFeEventoPagamentoOperacaoTransporte(MDFeEletronica md return eventoPagamentoOperacao.MDFeEventoPagamentoOperacao(mdfe, sequenciaEvneto, protocolo, infViagens, infPagamentos, config); } + + public MDFeRetEventoMDFe MDFeEventoPagamentoOperacaoTransporte(MDFeComandoPagamentoOperacao cmd, MDFeConfiguracao cfgMdfe = null) + { + return new EventoPagamentoOperacao().MDFeEventoPagamentoOperacao(cmd, cfgMdfe); + } } } \ No newline at end of file From 6a7a0167004df47a5c9199705891305653b51939 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Wed, 12 Aug 2026 17:36:29 -0300 Subject: [PATCH 62/71] feat(CTe): permite cOrgao e UF customizados nos eventos de desacordo Portado de Hercules-NET/ZeusFiscal: - PR #180 (8d7de760: 27f48a90, c1b925ac, 31524a07, 13bbd2db) --- CTe.Servicos/Enderecos/Helpers/UrlHelper.cs | 95 +++++++++++-------- .../Eventos/EventoCancelamentoDesacordo.cs | 12 +-- CTe.Servicos/Eventos/EventoDesacordo.cs | 24 +++-- CTe.Servicos/Eventos/FactoryEvento.cs | 4 +- CTe.Servicos/Eventos/ServicoController.cs | 16 ++-- CTe.Servicos/Factory/WsdlFactory.cs | 17 ++-- 6 files changed, 98 insertions(+), 70 deletions(-) diff --git a/CTe.Servicos/Enderecos/Helpers/UrlHelper.cs b/CTe.Servicos/Enderecos/Helpers/UrlHelper.cs index 827cd2a1e..9eab9ceee 100644 --- a/CTe.Servicos/Enderecos/Helpers/UrlHelper.cs +++ b/CTe.Servicos/Enderecos/Helpers/UrlHelper.cs @@ -42,36 +42,51 @@ namespace CTe.Servicos.Enderecos.Helpers { public class UrlHelper { - public static UrlCTe ObterUrlServico(ConfiguracaoServico configuracaoServico = null) + /// + /// Obtem a url de Serviço. Por padrão pega as informações de ConfiguracaoServico, mas pode ser customizada individualmente. Motivo: em alguns casos a url de destino de um evento de CTe pode seguir as informações do xml e não da empresa emissora / com certificado ativo + /// + /// + /// + /// + /// + /// + /// + /// + public static UrlCTe ObterUrlServico(ConfiguracaoServico configuracaoServico = null, tpEmis? tipoEmissao = null , TipoAmbiente? tipoAmbiente = null, Estado? ufRecepcao = null, versao? versaoLayout = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - switch (configServico.tpAmb) + var _tpEmissao = tipoEmissao ?? configServico.TipoEmissao; + var _tpAmb = tipoAmbiente ?? configServico.tpAmb; + var _cUF = ufRecepcao ?? configServico.cUF; + var _versao = versaoLayout ?? configServico.VersaoLayout; + + switch (_tpAmb) { case TipoAmbiente.Homologacao: - if (configServico.TipoEmissao == tpEmis.teSVCRS) + if (_tpEmissao == tpEmis.teSVCRS) { - return UrlHomologacaoSvrs(configServico); + return UrlHomologacaoSvrs(_versao); } - if (configServico.TipoEmissao == tpEmis.teSVCSP) + if (_tpEmissao == tpEmis.teSVCSP) { - return UrlHomologacaoSvcsp(configServico); + return UrlHomologacaoSvcsp(_versao); } - return UrlHomologacao(configServico); + return UrlHomologacao(_cUF, _versao); case TipoAmbiente.Producao: - if (configServico.TipoEmissao == tpEmis.teSVCRS) + if (_tpEmissao == tpEmis.teSVCRS) { - return UrlProducaoSvrs(configServico); + return UrlProducaoSvrs(_versao); } - if (configServico.TipoEmissao == tpEmis.teSVCSP) + if (_tpEmissao == tpEmis.teSVCSP) { - return UrlProducaoSvcsp(configServico); + return UrlProducaoSvcsp(_versao); } - return UrlProducao(configServico); + return UrlProducao(_cUF, _versao); } throw new InvalidOperationException("Tipo Ambiente inválido"); @@ -84,17 +99,17 @@ public static string ObterUrlQrCode(ConfiguracaoServico configuracaoServico = nu switch (configServico.tpAmb) { case TipoAmbiente.Homologacao: - return UrlHomologacao(configServico).QrCode; + return UrlHomologacao(configServico.cUF, configServico.VersaoLayout).QrCode; case TipoAmbiente.Producao: - return UrlProducao(configServico).QrCode; + return UrlProducao(configServico.cUF, configServico.VersaoLayout).QrCode; } throw new InvalidOperationException("Tipo Ambiente inválido"); } - private static UrlCTe UrlProducaoSvcsp(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlProducaoSvcsp(versao VersaoLayout) { - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -119,9 +134,9 @@ private static UrlCTe UrlProducaoSvcsp(ConfiguracaoServico configuracaoServico) }; } - private static UrlCTe UrlHomologacaoSvcsp(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlHomologacaoSvcsp(versao VersaoLayout) { - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -146,9 +161,9 @@ private static UrlCTe UrlHomologacaoSvcsp(ConfiguracaoServico configuracaoServic }; } - private static UrlCTe UrlHomologacaoSvrs(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlHomologacaoSvrs(versao VersaoLayout) { - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -174,9 +189,9 @@ private static UrlCTe UrlHomologacaoSvrs(ConfiguracaoServico configuracaoServico }; } - private static UrlCTe UrlProducaoSvrs(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlProducaoSvrs(versao VersaoLayout) { - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -202,12 +217,12 @@ private static UrlCTe UrlProducaoSvrs(ConfiguracaoServico configuracaoServico) }; } - private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlProducao(Estado UFRecepcao, versao VersaoLayout) { - switch (configuracaoServico.cUF) + switch (UFRecepcao) { case Estado.MT: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -233,7 +248,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = "https://www1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.MS: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -259,7 +274,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = "https://www1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.MG: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -285,7 +300,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = "https://www1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.PR: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -311,7 +326,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = "https://www1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.SP: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -359,7 +374,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) case Estado.SE: case Estado.TO: case Estado.RS: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -390,7 +405,7 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) case Estado.AP: case Estado.PE: case Estado.RR: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -422,12 +437,12 @@ private static UrlCTe UrlProducao(ConfiguracaoServico configuracaoServico) } - private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) + private static UrlCTe UrlHomologacao(Estado UFRecepcao, versao VersaoLayout) { - switch (configuracaoServico.cUF) + switch (UFRecepcao) { case Estado.MT: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -454,7 +469,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = @"https://hom1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.MS: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -478,7 +493,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = @"https://hom1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.MG: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -504,7 +519,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = @"https://hom1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.PR: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -545,7 +560,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) CTeDistribuicaoDFe = @"https://hom1.cte.fazenda.gov.br/CTeDistribuicaoDFe/CTeDistribuicaoDFe.asmx" }; case Estado.SP: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -588,7 +603,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) case Estado.SC: case Estado.SE: case Estado.TO: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { @@ -619,7 +634,7 @@ private static UrlCTe UrlHomologacao(ConfiguracaoServico configuracaoServico) case Estado.AP: case Estado.PE: case Estado.RR: - if (configuracaoServico.VersaoLayout == versao.ve400) + if (VersaoLayout == versao.ve400) { return new UrlCTe { diff --git a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs index 72aafacc0..f4040a0d2 100644 --- a/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoCancelamentoDesacordo.cs @@ -24,24 +24,24 @@ public EventoCancelamentoDesacordo(int sequenciaEvento, string chave, string cnp _nProtEvPrestDes = nProtEvPrestDes; } - public retEventoCTe CancelarDesacordo(ConfiguracaoServico configuracaoServico = null) + public retEventoCTe CancelarDesacordo(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); - RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); return RetornoSefaz; } - public async Task CancelarDesacordoAsync(ConfiguracaoServico configuracaoServico = null) + public async Task CancelarDesacordoAsync(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoCancelaDiscordar = ClassesFactory.CriaEvCancPrestDesacordo(_nProtEvPrestDes); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); - RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.CancelamentoPrestacaodoServicoemDesacordo, _sequenciaEvento, _chave, _cnpj, eventoCancelaDiscordar, configServico, orgaoEmissor); return RetornoSefaz; } diff --git a/CTe.Servicos/Eventos/EventoDesacordo.cs b/CTe.Servicos/Eventos/EventoDesacordo.cs index 9670f8de0..429d5d766 100644 --- a/CTe.Servicos/Eventos/EventoDesacordo.cs +++ b/CTe.Servicos/Eventos/EventoDesacordo.cs @@ -59,23 +59,35 @@ public EventoDesacordo(int sequenciaEvento, string chave, string cnpj, string in _observacao = observacao; } - public retEventoCTe Discordar(ConfiguracaoServico configuracaoServico = null) + /// + /// Gera o evento de desacordo de CTe + /// + /// + /// Sempre considera a UF que gerou o xml. Então a empresa pode estar configurada para uma UF X e gerar o desacordo de um xml gerando na UF Y, sendo o evento, portando, enviado para UF Y + /// + public retEventoCTe Discordar(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); - RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); + RetornoSefaz = new ServicoController().Executar(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); return RetornoSefaz; } - public async Task DiscordarAsync(ConfiguracaoServico configuracaoServico = null) + /// + /// Gera o evento de cancelamento de desacordo de CTe + /// + /// + /// Sempre considera a UF que gerou o xml. Então a empresa pode estar configurada para uma UF X e gerar o cancelamento para um xml gerado na UF Y, sendo o evento, portanto, enviado para UF Y + /// + public async Task DiscordarAsync(ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? orgaoEmissor = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var eventoDiscordar = ClassesFactory.CriaEvPrestDesacordo(_indicadorDesacordo, _observacao); - EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); - RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico); + EventoEnviado = FactoryEvento.CriaEvento(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); + RetornoSefaz = await new ServicoController().ExecutarAsync(CTeTipoEvento.Desacordo, _sequenciaEvento, _chave, _cnpj, eventoDiscordar, configServico, orgaoEmissor); return RetornoSefaz; } } diff --git a/CTe.Servicos/Eventos/FactoryEvento.cs b/CTe.Servicos/Eventos/FactoryEvento.cs index f862794e2..465732105 100644 --- a/CTe.Servicos/Eventos/FactoryEvento.cs +++ b/CTe.Servicos/Eventos/FactoryEvento.cs @@ -51,7 +51,7 @@ public static eventoCTe CriaEvento(CTeEletronico cte, CTeTipoEvento cTeTipoEvent return CriaEvento(cTeTipoEvento, sequenciaEvento, cte.Chave(), cte.infCte.emit.CNPJ, container, configServico); } - public static eventoCTe CriaEvento(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, ConfiguracaoServico configuracaoServico = null) + public static eventoCTe CriaEvento(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? cOrgao = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; @@ -72,7 +72,7 @@ public static eventoCTe CriaEvento(CTeTipoEvento cTeTipoEvento, int sequenciaEve { tpAmb = configServico.tpAmb, CNPJ = cnpj, - cOrgao = configServico.cUF, + cOrgao = cOrgao ?? configServico.cUF, chCTe = chave, dhEvento = DateTimeOffset.Now, nSeqEvento = sequenciaEvento, diff --git a/CTe.Servicos/Eventos/ServicoController.cs b/CTe.Servicos/Eventos/ServicoController.cs index 5e319f335..f937bc08d 100644 --- a/CTe.Servicos/Eventos/ServicoController.cs +++ b/CTe.Servicos/Eventos/ServicoController.cs @@ -66,10 +66,10 @@ public async Task ExecutarAsync(CteEletronico cte, int sequenciaEv return await ExecutarAsync(cTeTipoEvento, sequenciaEvento, cte.Chave(), cte.infCte.emit.CNPJ, container, configServico); } - public retEventoCTe Executar(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, ConfiguracaoServico configuracaoServico = null) + public retEventoCTe Executar(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, ConfiguracaoServico configuracaoServico = null, DFe.Classes.Entidades.Estado? cOrgao = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - var evento = FactoryEvento.CriaEvento(cTeTipoEvento, sequenciaEvento, chave, cnpj, container, configServico); + var evento = FactoryEvento.CriaEvento(cTeTipoEvento, sequenciaEvento, chave, cnpj, container, configServico, cOrgao); evento.Assina(configServico); if (configServico.IsValidaSchemas) @@ -81,13 +81,13 @@ public retEventoCTe Executar(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, s if (evento.versao == versao.ve200 || evento.versao == versao.ve300) { - var webService = WsdlFactory.CriaWsdlCteEvento(configServico); + var webService = WsdlFactory.CriaWsdlCteEvento(configServico, ufUrl: cOrgao); retornoXml = webService.cteRecepcaoEvento(evento.CriaXmlRequestWs()); } if (evento.versao == versao.ve400) { - var webService = WsdlFactory.CriaWsdlCteEventoV4(configServico); + var webService = WsdlFactory.CriaWsdlCteEventoV4(configServico, ufUrl: cOrgao); retornoXml = webService.cteRecepcaoEvento(evento.CriaXmlRequestWs()); } @@ -101,11 +101,12 @@ public async Task ExecutarAsync(CTeTipoEvento cTeTipoEvento, int sequenciaEvento, string chave, string cnpj, EventoContainer container, - ConfiguracaoServico configuracaoServico = null) + ConfiguracaoServico configuracaoServico = null, + DFe.Classes.Entidades.Estado? cOrgao = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - var evento = FactoryEvento.CriaEvento(cTeTipoEvento, sequenciaEvento, chave, cnpj, container, configServico); + var evento = FactoryEvento.CriaEvento(cTeTipoEvento, sequenciaEvento, chave, cnpj, container, configServico, cOrgao); evento.Assina(configServico); if (configServico.IsValidaSchemas) @@ -123,10 +124,9 @@ public async Task ExecutarAsync(CTeTipoEvento cTeTipoEvento, if (evento.versao == versao.ve400) { - var webService = WsdlFactory.CriaWsdlCteEventoV4(configServico); + var webService = WsdlFactory.CriaWsdlCteEventoV4(configServico, ufUrl: cOrgao); retornoXml = await webService.cteRecepcaoEventoAsync(evento.CriaXmlRequestWs()); } - var retorno = retEventoCTe.LoadXml(retornoXml.OuterXml, evento); retorno.SalvarXmlEmDisco(configServico); diff --git a/CTe.Servicos/Factory/WsdlFactory.cs b/CTe.Servicos/Factory/WsdlFactory.cs index fb633d0e2..cc0bd4591 100644 --- a/CTe.Servicos/Factory/WsdlFactory.cs +++ b/CTe.Servicos/Factory/WsdlFactory.cs @@ -47,6 +47,7 @@ using CTe.Wsdl.Evento.V4; using CTe.Wsdl.Recepcao.Sincrono; using System.Security.Cryptography.X509Certificates; +using DFe.Classes.Entidades; namespace CTe.Servicos.Factory { @@ -123,22 +124,22 @@ public static CteRecepcaoSincronoOSV4 CriaWsdlCteRecepcaoSincronoOSV4(Configurac return new CteRecepcaoSincronoOSV4(configuracaoWsdl); } - public static CteRecepcaoEvento CriaWsdlCteEvento(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) + public static CteRecepcaoEvento CriaWsdlCteEvento(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null, Estado? ufUrl = null) { - var url = UrlHelper.ObterUrlServico(configuracaoServico).CteRecepcaoEvento; + var url = UrlHelper.ObterUrlServico(configuracaoServico, ufRecepcao: ufUrl).CteRecepcaoEvento; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado, ufUrl); return new CteRecepcaoEvento(configuracaoWsdl); } - public static CteRecepcaoEventoV4 CriaWsdlCteEventoV4(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) + public static CteRecepcaoEventoV4 CriaWsdlCteEventoV4(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null, Estado? ufUrl = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - var url = UrlHelper.ObterUrlServico(configServico).CteRecepcaoEvento; + var url = UrlHelper.ObterUrlServico(configServico, ufRecepcao: ufUrl).CteRecepcaoEvento; - var configuracaoWsdl = CriaConfiguracao(url, configServico, certificado); + var configuracaoWsdl = CriaConfiguracao(url, configServico, certificado, ufUrl); return new CteRecepcaoEventoV4(configuracaoWsdl); } @@ -154,11 +155,11 @@ public static CTeDistDFeInteresse CriaWsdlCTeDistDFeInteresse(ConfiguracaoServic } - private static WsdlConfiguracao CriaConfiguracao(string url, ConfiguracaoServico configuracaoServico, X509Certificate2 certificado) + private static WsdlConfiguracao CriaConfiguracao(string url, ConfiguracaoServico configuracaoServico, X509Certificate2 certificado, Estado? ufUrl = null) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; - var codigoEstado = configServico.cUF.GetCodigoIbgeEmString(); + var codigoEstado = ufUrl.HasValue ? ufUrl.Value.GetCodigoIbgeEmString() : configServico.cUF.GetCodigoIbgeEmString(); var certificadoDigital = certificado ?? configServico.X509Certificate2; var versaoEmString = configServico.VersaoLayout.GetString(); var timeOut = configServico.TimeOut; From c90fbbbc61548ce7e1add1848454942eda8a2030 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Thu, 13 Aug 2026 10:31:21 -0300 Subject: [PATCH 63/71] feat(NFe.Danfe): adiciona DANFE NF-e Simplificado Tipo 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adaptado em relação ao original: o .frx é declarado como em vez do usado no fork, senão não é copiado para o output e o FrxFileHelper.TryGetFrxFile falha em runtime. Portado de Hercules-NET/ZeusFiscal: - PR #181 (61d81b22: 7ff19746, 80376e39) - PR #187 (d4238431: 7e776974) --- NFe.Danfe.AppTeste.Fast/MainWindow.xaml | 2 + NFe.Danfe.AppTeste.Fast/MainWindow.xaml.cs | 113 +- NFe.Danfe.Base/Enumns.cs | 34 + NFe.Danfe.Base/NFe.Danfe.Base.csproj | 4 + .../ConfiguracaoDanfeNfeSimplificadoTipo2.cs | 156 +++ NFe.Danfe.Base/NFe/NFeSimplificadoTipo2.frx | 1234 +++++++++++++++++ .../NFe/DanfeFrSimplificadoTipo2.cs | 31 + Shared.NFe.Danfe/DanfeSharedHelper.cs | 192 ++- 8 files changed, 1741 insertions(+), 25 deletions(-) create mode 100644 NFe.Danfe.Base/NFe/ConfiguracaoDanfeNfeSimplificadoTipo2.cs create mode 100644 NFe.Danfe.Base/NFe/NFeSimplificadoTipo2.frx create mode 100644 NFe.Danfe.Fast/NFe/DanfeFrSimplificadoTipo2.cs diff --git a/NFe.Danfe.AppTeste.Fast/MainWindow.xaml b/NFe.Danfe.AppTeste.Fast/MainWindow.xaml index cbd75fdf1..36f02701b 100644 --- a/NFe.Danfe.AppTeste.Fast/MainWindow.xaml +++ b/NFe.Danfe.AppTeste.Fast/MainWindow.xaml @@ -217,6 +217,8 @@ VerticalAlignment="Top" Width="120" Click="BtnNfceDanfe_Click" Margin="5,10,5,0" /> public class MDFeComandoInclusaoDFe : MDFeComandoEvento - { - public string Protocolo { get; set; } + { + public string Protocolo { get; set; } public string CodigoMunicipioCarregamento { get; set; } public string NomeMunicipioCarregamento { get; set; } public List InformacoesDocumentos { get; set; } diff --git a/MDFe.Servicos/EventosMDFe/MDFeComandoPagamentoOperacao.cs b/MDFe.Servicos/EventosMDFe/MDFeComandoPagamentoOperacao.cs index bef01c113..5e3615fd1 100644 --- a/MDFe.Servicos/EventosMDFe/MDFeComandoPagamentoOperacao.cs +++ b/MDFe.Servicos/EventosMDFe/MDFeComandoPagamentoOperacao.cs @@ -7,7 +7,7 @@ namespace MDFe.Servicos.EventosMDFe /// Dados para emitir o evento de pagamento de operação de transporte. /// public class MDFeComandoPagamentoOperacao : MDFeComandoEvento - { + { public string Protocolo { get; set; } public MDFeInfViagens InfViagens { get; set; } public List Pagamentos { get; set; } diff --git a/NFe.Classes/Informacoes/Destinatario/dest.cs b/NFe.Classes/Informacoes/Destinatario/dest.cs index 17289b4fe..8c9cd5fec 100644 --- a/NFe.Classes/Informacoes/Destinatario/dest.cs +++ b/NFe.Classes/Informacoes/Destinatario/dest.cs @@ -67,11 +67,11 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(cpf) || !string.IsNullOrEmpty(idEstrangeiro)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); - + cnpj = value; } } @@ -84,7 +84,7 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(cnpj) || !string.IsNullOrEmpty(idEstrangeiro)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); diff --git a/NFe.Classes/Informacoes/Emitente/emit.cs b/NFe.Classes/Informacoes/Emitente/emit.cs index 637dc4fc9..fdd7b8abf 100644 --- a/NFe.Classes/Informacoes/Emitente/emit.cs +++ b/NFe.Classes/Informacoes/Emitente/emit.cs @@ -67,7 +67,7 @@ public string CPF get { return _cpf; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(_cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); diff --git a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs index d281cbcb7..73d2160d6 100644 --- a/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs +++ b/NFe.Classes/Informacoes/Identificacao/Tipos/ideTipos.cs @@ -148,6 +148,7 @@ public enum DestinoOperacao /// 3 - DANFe Simplificado; /// 4 - DANFe NFC-e; /// 5 - DANFe NFC-e em mensagem eletrônica + /// 6 - DANFe Simplificado Tipo 2 /// public enum TipoImpressao { @@ -192,7 +193,7 @@ public enum TipoImpressao [Description("DANFe NFC-e em mensagem eletrônica")] [XmlEnum("5")] tiMsgEletronica = 5, - + /// /// 6 - DANFe Simplificado Tipo 2 /// @@ -622,7 +623,7 @@ public enum TpNotaCredito [Description("Transferência de crédito na sucessão")] [XmlEnum("05")] TfCreditoSucessao, - + [Description("Retorno por recusa parcial na entrega")] [XmlEnum("06")] RetornoPorRecusaParcialNaEntrega diff --git a/NFe.Classes/Informacoes/Transporte/transporta.cs b/NFe.Classes/Informacoes/Transporte/transporta.cs index e276d0354..fdca1caa0 100644 --- a/NFe.Classes/Informacoes/Transporte/transporta.cs +++ b/NFe.Classes/Informacoes/Transporte/transporta.cs @@ -52,7 +52,7 @@ public string CNPJ return; if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - + cnpj = value; } } @@ -65,7 +65,7 @@ public string CPF get { return cpf; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); diff --git a/NFe.Classes/Informacoes/autXML.cs b/NFe.Classes/Informacoes/autXML.cs index 2bf435629..335d01b0d 100644 --- a/NFe.Classes/Informacoes/autXML.cs +++ b/NFe.Classes/Informacoes/autXML.cs @@ -69,7 +69,7 @@ public string CPF return; if (!string.IsNullOrEmpty(cnpj)) throw new ArgumentException(ErroCpfCnpjPreenchidos); - + cpf = value; } } diff --git a/NFe.Classes/Servicos/ConsultaCadastro/infConsEnv.cs b/NFe.Classes/Servicos/ConsultaCadastro/infConsEnv.cs index d9c1a7b65..6cf172235 100644 --- a/NFe.Classes/Servicos/ConsultaCadastro/infConsEnv.cs +++ b/NFe.Classes/Servicos/ConsultaCadastro/infConsEnv.cs @@ -65,11 +65,11 @@ public string IE get { return _ie; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(CPF)) throw new ArgumentException(ErroCpfCnpjIePreenchidos); - + _ie = value; } } @@ -101,7 +101,7 @@ public string CPF get { return _cpf; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(IE)) throw new ArgumentException(ErroCpfCnpjIePreenchidos); diff --git a/NFe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs b/NFe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs index 224d804a2..5ad92bd01 100644 --- a/NFe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs +++ b/NFe.Classes/Servicos/DistribuicaoDFe/distDFeInt.cs @@ -88,7 +88,7 @@ public string CPF get { return _cPF; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(_cNPJ)) throw new ArgumentException(ErroCpfCnpjPreenchidos); diff --git a/NFe.Classes/Servicos/Evento/dest.cs b/NFe.Classes/Servicos/Evento/dest.cs index abb49c7be..7e6c820ae 100644 --- a/NFe.Classes/Servicos/Evento/dest.cs +++ b/NFe.Classes/Servicos/Evento/dest.cs @@ -58,7 +58,7 @@ public string CNPJ get { return _cnpj; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(CPF) || !string.IsNullOrEmpty(idEstrangeiro)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); @@ -75,7 +75,7 @@ public string CPF get { return _cpf; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(CNPJ) || !string.IsNullOrEmpty(idEstrangeiro)) throw new ArgumentException(ErroCpfCnpjIdEstrangeiroPreenchidos); diff --git a/NFe.Classes/Servicos/Evento/infEventoEnv.cs b/NFe.Classes/Servicos/Evento/infEventoEnv.cs index ada4dce6d..9c0b79ac1 100644 --- a/NFe.Classes/Servicos/Evento/infEventoEnv.cs +++ b/NFe.Classes/Servicos/Evento/infEventoEnv.cs @@ -69,7 +69,7 @@ public string CNPJ get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); diff --git a/NFe.Classes/Servicos/Evento/infEventoRet.cs b/NFe.Classes/Servicos/Evento/infEventoRet.cs index d4114b7ca..f33ee61f9 100644 --- a/NFe.Classes/Servicos/Evento/infEventoRet.cs +++ b/NFe.Classes/Servicos/Evento/infEventoRet.cs @@ -110,7 +110,7 @@ public string CNPJDest get { return cnpj; } set { - if (string.IsNullOrEmpty(value)) + if (string.IsNullOrEmpty(value)) return; if (!string.IsNullOrEmpty(cpf)) throw new ArgumentException(ErroCpfCnpjPreenchidos); From 86d54820d0725b5d3fa0cccd9cfeed04561513b5 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Fri, 14 Aug 2026 09:17:18 -0300 Subject: [PATCH 69/71] =?UTF-8?q?Alterado=20para=20exibir=20o=20relat?= =?UTF-8?q?=C3=B3rio=20ao=20inv=C3=A9s=20do=20design?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.Danfe.AppTeste.Fast/MainWindow.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NFe.Danfe.AppTeste.Fast/MainWindow.xaml.cs b/NFe.Danfe.AppTeste.Fast/MainWindow.xaml.cs index 3cffd4da9..877d993fe 100644 --- a/NFe.Danfe.AppTeste.Fast/MainWindow.xaml.cs +++ b/NFe.Danfe.AppTeste.Fast/MainWindow.xaml.cs @@ -344,9 +344,9 @@ private void BtnNFeSimplificado_Click(object sender, RoutedEventArgs e) desenvolvedor: "NOME DA SOFTWARE HOUSE", arquivoRelatorio: string.Empty); - //danfe.Visualizar(); + danfe.Visualizar(); //danfe.Imprimir(); - danfe.ExibirDesign(); + //danfe.ExibirDesign(); //danfe.ExportarPdf(@"d:\teste.pdf"); #endregion Abre a visualização do relatório para impressão From 10f5a4937d3d88cd7d32a92c473751741ea4bc52 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Fri, 14 Aug 2026 09:21:25 -0300 Subject: [PATCH 70/71] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20dos=20Schemas=20p?= =?UTF-8?q?ara=20o=20pacote=20Schemas=20XML=20NF-e=20-=20010d=5Fv.1.03=20C?= =?UTF-8?q?NPJ=20Alfanum=C3=A9rico-=20NT=202026.004.v.1.01-=20(Publicado?= =?UTF-8?q?=20em=2010/07/2026)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd index 8c6ade56e..cbfd17242 100644 --- a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd @@ -6633,7 +6633,7 @@ tipo de ato concessório: - + From 70f880cfe16481430294d6abef43623c9327d295 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Fri, 14 Aug 2026 10:00:41 -0300 Subject: [PATCH 71/71] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20dos=20schemas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NFe.AppTeste/MainWindow.xaml.cs | 2 +- .../Schemas/DFeTiposBasicos_v1.00.xsd | 397 ++++++++++++++++-- NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd | 77 +++- .../Detalhe/Tributacao/Federal/IS.cs | 4 +- 4 files changed, 409 insertions(+), 71 deletions(-) diff --git a/NFe.AppTeste/MainWindow.xaml.cs b/NFe.AppTeste/MainWindow.xaml.cs index 0a6af5d0c..38b287f21 100644 --- a/NFe.AppTeste/MainWindow.xaml.cs +++ b/NFe.AppTeste/MainWindow.xaml.cs @@ -2107,7 +2107,7 @@ protected virtual det GetDetalhe(int i, CRT crt, ModeloDocumento modelo) { qTrib = 1, uTrib = "PC", - pISEspec = 0, + adRemIS = 0, pIS = 0, vIS = 0, cClassTribIS = "000001", diff --git a/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd b/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd index a5051dd02..d204e4061 100644 --- a/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd +++ b/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd @@ -1,6 +1,16 @@ + + + Tipo Chave de Documento Fiscal Eletrônico + + + + + + + Tipo string genérico @@ -55,6 +65,24 @@ + + + Tipo CNPJ Base + + + + + + + + + Tipo CNPJ + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais @@ -81,6 +109,23 @@ + + + + + + + Tipo de Receita Bruta do SN + + + + + + + + + + @@ -93,6 +138,8 @@ + + @@ -115,6 +162,14 @@ + + + Ano e mês referência do período de apuração (AAAA-MM) + + + + + Grupo de informações da Tributação da NFCom @@ -163,6 +218,26 @@ + + + Grupo de informações da Tributação da NFGas + + + + + Código Situação Tributária do IBS/CBS + + + + + + + + Informado conforme indicador no cClassTrib + + + + Grupo de informações da Tributação da NFAg @@ -240,7 +315,7 @@ - + @@ -262,7 +337,7 @@ - + Informar essa opção da Choice para Monofasia (CST 620) @@ -298,33 +373,6 @@ - - - Grupo de informações da Tributação da NFGas - - - - - Código Situação Tributária do IBS/CBS - - - - - - - - - Informar essa opção da Choice para Monofasia - - - - - - Informado conforme indicador no cClassTrib - - - - Grupo de informações do Imposto Seletivo @@ -347,7 +395,7 @@ Alíquota do Imposto Seletivo (percentual) - + Alíquota do Imposto Seletivo (por valor) @@ -949,6 +997,152 @@ Grupo de campos da redução de aliquota + + + Grupo de operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + Grupo de informações para identificação de operações em áreas incentivadas (ALC/ZFM) com alíquota zero da CBS, conforme arts. 451 e 466 da LC 214/2025, quando fornecedor e destinatário estiverem nessas áreas, distinguindo a existência de processo aprovado na Suframa. + + + + + Valor da CBS + + + + + + + + Grupo de informações da Tributação Regular. Informar como seria a tributação caso não cumprida a condição resolutória/suspensiva. Exemplo 1: Art. 442, §4. Operações com ZFM e ALC. Exemplo 2: Operações com suspensão do tributo. + + + + + Grupo de informações da composição do valor do IBS e da CBS em compras governamental + + + + + + + Tipo CBS IBS Completo NFe + + + + IBS / CBS + + + + Valor do BC + + + + + + Grupo de informações do IBS na UF + + + + + + Aliquota do IBS de competência das UF (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Valor do IBS de competência das UF + + + + + + + + Grupo de Informações do IBS no Município + + + + + + Aliquota do IBS Municipal (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Valor do IBS Municipal + + + + + + + + Valor do IBS + + + + + + Grupo de Tributação da CBS + + + + + + Aliquota da CBS (em percentual) + + + + + Grupo de campos do Diferimento + + + + + Grupo de Informações da devolução de tributos + + + + + Grupo de campos da redução de aliquota + + + + + Grupo de operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + Grupo de informações para identificação de operações em áreas incentivadas (ALC/ZFM) com alíquota zero da CBS, conforme arts. 451 e 466 da LC 214/2025, quando fornecedor e destinatário estiverem nessas áreas, distinguindo a existência de processo aprovado na Suframa. + + Valor da CBS @@ -1032,10 +1226,14 @@ Tipo Devolução Tributo + + + Percentual de devolução do tributo, conforme LC 214/25 art. 118. + + - Valor do tributo devolvido. No fornecimento de energia elétrica, água, esgoto e -gás natural e em outras hipóteses definidas no regulamento + Valor do tributo devolvido ("cashback" de desconto na própria Nota Fiscal / Fatura) @@ -1131,7 +1329,9 @@ gás natural e em outras hipóteses definidas no regulamento 1=União 2=Estados 3=Distrito Federal -4=Municípios +4=Municípios +5=Consórcio Público +6=Comitê Gestor do IBS @@ -1139,6 +1339,29 @@ gás natural e em outras hipóteses definidas no regulamento Percentual de redução de aliquota em compra governamental + + + Tipo da operação com ente governamental: +1 – Fornecimento com pagamento posterior; + +2 - Recebimento do pagamento com fornecimento já realizado; + +3 – Fornecimento com pagamento já realizado; + +4 – Recebimento do pagamento com fornecimento posterior; + + + + + Chave de acesso do documento fiscal anterior. + +Deverá ser informado para tpOperGov 2 e 3 e vedado para os tipos 1 e 4. + +No caso do tpOperGov 2 aceitará apenas uma chave referenciada, no tipo 3 poderá aceitar múltiplas chaves + +Obs: a chave de acesso deverá ser de um emitente com o mesmo CNPJ base + + @@ -1153,19 +1376,49 @@ gás natural e em outras hipóteses definidas no regulamento 1=União 2=Estados 3=Distrito Federal -4=Municípios +4=Municípios +5=Consórcio Público +6=Comitê Gestor do IBS - Percentual de redução de aliquota em compra governamental + Percentual de redução de alíquota em compra governamental Tipo da operação com ente governamental: -1 - Fornecimento -2 - Recebimento do Pagamento +1 – Fornecimento com pagamento posterior; +2 - Recebimento do pagamento com fornecimento já realizado; +3 – Fornecimento com pagamento já realizado; +4 – Recebimento do pagamento com fornecimento posterior; + + + + + Chave de acesso do documento fiscal anterior. + +Deverá ser informado para tpOperGov 2 e 3 e vedado para os tipos 1 e 4. + +No caso do tpOperGov 2 aceitará apenas uma chave referenciada, no tipo 3 poderá aceitar múltiplas chaves + +Obs: a chave de acesso deverá ser de um emitente com o mesmo CNPJ base + + + + + + + Tipo Pagamento que ocorre em DFe emitdo anteriormente + Informado para abater as parcelas de antecipação de pagamento, conforme art. 10 §4 + + + + + Chave de acesso do documento fiscal de antecipação de pagamento + +Obs: esse DFe deverá ter o indAntecipacaoPgto marcado no grupo ide @@ -1187,6 +1440,68 @@ gás natural e em outras hipóteses definidas no regulamento + + + Tipo Operações em areas incentivadas com CBS Zero + + + + + Percentual efetivo sem a redução + Alíquota efetiva de referência da CBS aplicável à operação fora de áreas ou regimes incentivados. + + + + + Valor efetivo sem a redução + Valor da CBS calculado para a operação fora de áreas ou regimes incentivado + + + + + + + Tipo Operações em áreas incentivadas (ALC/ZFM) - CBS (alíquota zero) + + + + + Tipo de aplicação da alíquota zero da CBS. + + + + + + + + + + + + Número do processo na Suframa para o item +comercializado. + + + + + + + + + + + Percentual efetivo sem a redução + Alíquota efetiva de referência da CBS aplicável à operação fora de áreas ou regimes incentivados. + + + + + Valor efetivo sem a redução + Valor da CBS calculado para a operação fora de áreas ou regimes incentivado + + + + Tipo Estorno de Crédito @@ -1204,14 +1519,6 @@ gás natural e em outras hipóteses definidas no regulamento - - - Ano e mês referência do período de apuração (AAAA-MM) - - - - - Tipo Ajuste de Competência diff --git a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd index cbfd17242..9e86de93b 100644 --- a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd @@ -111,13 +111,19 @@ Informar o município de ocorrência do fato gerador do fato gerador do IBS / CBS. -Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do estabelecimento) ”, e não tiver endereço do destinatário (Grupo: E05) ou local de entrega (Grupo: G01). +Campo preenchido somente quando "indPres = 5 (Operação presencial, fora do estabelecimento)", e não estiver preenchido o endereço do destinatário (grupo: E05) nem o local de entrega (grupo: G01). - Formato de impressão do DANFE (0-sem DANFE;1-DANFe Retrato; 2-DANFe Paisagem;3-DANFe Simplificado; - 4-DANFe NFC-e;5-DANFe NFC-e em mensagem eletrônica) + Formato de impressão do DANFE: +0 - Sem DANFE; +1 - DANFE Retrato; +2 - DANFE Paisagem; +3 - DANFE Simplificado; +4 - DANFE NFC-e; +5 - DANFE NFC-e em mensagem eletrônica; +6 - DANFE Simplificado Tipo 2 (nas condições do Ajuste SINIEF 13/26). @@ -128,20 +134,21 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e + - Forma de emissão da NF-e + Forma de emissão da NF-e: 1 - Normal; -2 - Contingência FS -3 - Regime Especial NFF (NT 2021.002) -4 - Contingência DPEC -5 - Contingência FSDA -6 - Contingência SVC - AN -7 - Contingência SVC - RS -9 - Contingência off-line NFC-e +2 - Contingência FS; +3 - Regime Especial NFF (NT 2021.002); +4 - Contingência DPEC; +5 - Contingência FSDA; +6 - Contingência SVC - AN; +7 - Contingência SVC - RS; +9 - Contingência off-line da NFC-e e da NF-e com DANFE Simplificado Tipo 2. @@ -188,13 +195,7 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e - Tipo de Nota de Débito: -01=Transferência de créditos para Cooperativas; -02=Anulação de Crédito por Saídas Imunes/Isentas; -03=Débitos de notas fiscais não processadas na apuração; -04=Multa e juros; -05=Transferência de crédito de sucessão. - + Tipo de Nota de Débito @@ -216,8 +217,14 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e - Indicador de presença do comprador no estabelecimento comercial no momento da oepração - (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação presencial;2-Não presencial, internet;3-Não presencial, teleatendimento;4-NFC-e entrega em domicílio;5-Operação presencial, fora do estabelecimento;9-Não presencial, outros) + Indicador de presença do comprador no estabelecimento comercial no momento da oepração: +0 - Não se aplica (ex.: Nota Fiscal complementar ou de ajuste); +1 - Operação presencial; +2 - Operação não presencial, internet; +3 - Operação não presencial, teleatendimento; +4 - Operação não presencial com NFC-e e NFe com DANFE Simplificado Tipo 2 (com entrega); +5 - Operação presencial, fora do estabelecimento; +9 - Operação não presencial, outros. @@ -246,6 +253,17 @@ Campo preenchido somente quando “indPres = 5 (Operação presencial, fora do e + + + Código indicador do local da operação de fornecimento + + + + + + + + Processo de emissão utilizado com a seguinte codificação: @@ -599,6 +617,17 @@ Este campo será obrigatoriamente preenchido com: + + + Inscrição do emitente na Suframa + + + + + + + + @@ -6707,7 +6736,7 @@ tipo de ato concessório: Descrição literal do status do serviço solicitado. - + Código da Mensagem. @@ -6726,7 +6755,7 @@ tipo de ato concessório: - + @@ -7462,7 +7491,7 @@ alterado para tamanho variavel 1-4. (NT2011/004) 04=Multa e juros; 05=Transferência de crédito na sucessão; 06=Pagamento antecipado; - 07=Perda em estoque; + 07=Perda em estoque (Perecimento, Perda, Furto, Roubo); 08=Desenquadramento do SN; @@ -7485,6 +7514,7 @@ alterado para tamanho variavel 1-4. (NT2011/004) 03=Retorno por recusa na entrega ou por não localização do destinatário na tentativa de entrega; 04=Redução de valores; 05=Transferência de crédito na sucessão; + 06=Retorno por recusa parcial na entrega; @@ -7494,6 +7524,7 @@ alterado para tamanho variavel 1-4. (NT2011/004) + diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/IS.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/IS.cs index 951d93b15..06ad15da1 100644 --- a/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/IS.cs +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/Federal/IS.cs @@ -80,7 +80,7 @@ public decimal pIS /// UB07 - Alíquota específica por unidade de medida apropriada (em percentual) /// [XmlElement(Order = 5)] - public decimal? pISEspec + public decimal? adRemIS { get => _pIsEspec.Arredondar(4); set => _pIsEspec = value.Arredondar(4); @@ -112,6 +112,6 @@ public decimal vIS set => _vIs = value.Arredondar(2); } - public bool ShouldSerializepISEspec() => pISEspec.HasValue; + public bool ShouldSerializeadRemIS() => adRemIS.HasValue; } } \ No newline at end of file