From 88b5e07a089c1799887f6d042e41542fd67f670a Mon Sep 17 00:00:00 2001 From: silvairls Date: Thu, 18 Apr 2024 10:54:19 -0300 Subject: [PATCH] =?UTF-8?q?Cria=C3=A7=C3=A3o=20do=20atributo=20personaliza?= =?UTF-8?q?do=20"[TString]"=20o=20qual=20deve=20ser=20utilizado=20para=20d?= =?UTF-8?q?ecorar=20todas=20as=20proriedades=20referentes=20=C3=A0s=20tags?= =?UTF-8?q?=20do=20xml=20do=20tipo=20"TString".=20Com=20o=20objetivo=20de?= =?UTF-8?q?=20corrigir=20automaticamente=20os=20dados=20destas=20proprieda?= =?UTF-8?q?des,=20evitando=20a=20falha=20de=20schema=20"O=20valor=20'@@@'?= =?UTF-8?q?=20=C3=A9=20inv=C3=A1lido=20dependendo=20do=20tipo=20de=20dados?= =?UTF-8?q?=20'String'".=20J=C3=A1=20inclui=20a=20anota=C3=A7=C3=A3o=20em?= =?UTF-8?q?=20alguns=20atributos,=20mas=20ser=C3=A1=20necess=C3=A1rio=20in?= =?UTF-8?q?cluir=20nos=20demais.=20S=C3=A3o=20centenas.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DFe.Utils/Attributes/TStringAttribute.cs | 35 +++++++ NFe.AppTeste.NetCore/Program.cs | 16 +-- NFe.Classes/Informacoes/Destinatario/dest.cs | 2 + .../Informacoes/Destinatario/enderDest.cs | 7 ++ NFe.Classes/Informacoes/Identificacao/ide.cs | 4 + NFe.Classes/Informacoes/_baseNFe.cs | 98 +++++++++++++++++++ NFe.Classes/Informacoes/infNFe.cs | 2 +- 7 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 DFe.Utils/Attributes/TStringAttribute.cs create mode 100644 NFe.Classes/Informacoes/_baseNFe.cs diff --git a/DFe.Utils/Attributes/TStringAttribute.cs b/DFe.Utils/Attributes/TStringAttribute.cs new file mode 100644 index 000000000..bf0eec89a --- /dev/null +++ b/DFe.Utils/Attributes/TStringAttribute.cs @@ -0,0 +1,35 @@ +using System; +using System.Text.RegularExpressions; + +namespace DFe.Utils.Attributes +{ + /// + /// Indica que esta propriedade, corresponde ao tipo 'TString' (Tipo string genérico), do schema da NF-e ([!-ÿ]{1}[ -ÿ]{0,}[!-ÿ]{1}|[!-ÿ]{1}) + /// + /// + /// Utilize este atributo, para forçar a correção dos dados enviados nesta propriedade + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public class TStringAttribute : Attribute + { + /// + /// Remove caracteres inválidos, de acordo com o tipo: TString (Tipo string genérico) do arquivo 'tiposBasico_v4.00.xsd' + /// + /// + /// + public static string CorrigirValor(string valor) + { + // Qualquer string que comece e termine com um ou mais caracteres no intervalo de ! (33) a ÿ (255) ou espaços em branco. + var regex = new Regex(@"[^!-ÿ\s]+"); + + // Substitui todos os caracteres que não correspondem ao padrão por uma string vazia, + // removendo todos os caracteres inválidos + valor = regex.Replace(valor, ""); + + // Remove espaços no início e no final da string + valor = valor.Trim(); + + return valor; + } + } +} \ No newline at end of file diff --git a/NFe.AppTeste.NetCore/Program.cs b/NFe.AppTeste.NetCore/Program.cs index 76a820068..a13c9d079 100644 --- a/NFe.AppTeste.NetCore/Program.cs +++ b/NFe.AppTeste.NetCore/Program.cs @@ -537,6 +537,8 @@ private static infNFe GetInf(int numero, ModeloDocumento modelo, VersaoServico v infNFe.infAdic = new infAdic() { infCpl = "Troco: 10,00" }; //Susgestão para impressão do troco em NFCe } + infNFe.ExecutarCorrecaoDeDados(infNFe); + return infNFe; } @@ -545,7 +547,7 @@ private static ide GetIdentificacao(int numero, ModeloDocumento modelo, VersaoSe ide ide = new ide { cUF = _configuracoes.EnderecoEmitente.UF, - natOp = "VENDA", + natOp = " VENDA ", mod = modelo, serie = 1, nNF = numero, @@ -556,7 +558,7 @@ private static ide GetIdentificacao(int numero, ModeloDocumento modelo, VersaoSe cNF = "1234", tpAmb = _configuracoes.CfgServico.tpAmb, finNFe = FinalidadeNFe.fnNormal, - verProc = "3.000" + verProc = " 3.000 " }; if (ide.tpEmis != TipoEmissao.teNormal) @@ -649,7 +651,7 @@ private static dest GetDestinatario(VersaoServico versao, ModeloDocumento modelo CNPJ = "99999999000191", //CPF = "99999999999", }; - dest.xNome = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"; //Obrigatório para NFe e opcional para NFCe + dest.xNome = " NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL "; //Obrigatório para NFe e opcional para NFCe dest.enderDest = GetEnderecoDestinatario(); //Obrigatório para NFe e opcional para NFCe //if (versao == VersaoServico.Versao200) @@ -668,15 +670,15 @@ private static enderDest GetEnderecoDestinatario() { enderDest enderDest = new enderDest { - xLgr = "RUA ...", + xLgr = " RUA ...", nro = "S/N", - xBairro = "CENTRO", + xBairro = " CENTRO ", cMun = 2802908, - xMun = "ITABAIANA", + xMun = " ITABAIANA ", UF = "SE", CEP = "49500000", cPais = 1058, - xPais = "BRASIL" + xPais = " BRASIL " }; return enderDest; } diff --git a/NFe.Classes/Informacoes/Destinatario/dest.cs b/NFe.Classes/Informacoes/Destinatario/dest.cs index 3cb1a1f73..6292c9c23 100644 --- a/NFe.Classes/Informacoes/Destinatario/dest.cs +++ b/NFe.Classes/Informacoes/Destinatario/dest.cs @@ -33,6 +33,7 @@ using System; using System.Xml.Serialization; using DFe.Classes.Flags; +using DFe.Utils.Attributes; using NFe.Classes.Servicos.Tipos; namespace NFe.Classes.Informacoes.Destinatario @@ -102,6 +103,7 @@ public string CPF /// /// E04 - Razão Social ou nome do destinatário /// + [TString] public string xNome { get; set; } /// diff --git a/NFe.Classes/Informacoes/Destinatario/enderDest.cs b/NFe.Classes/Informacoes/Destinatario/enderDest.cs index 197401c30..489b95c00 100644 --- a/NFe.Classes/Informacoes/Destinatario/enderDest.cs +++ b/NFe.Classes/Informacoes/Destinatario/enderDest.cs @@ -31,6 +31,7 @@ /* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */ /********************************************************************************/ +using DFe.Utils.Attributes; using System; using System.Linq; @@ -43,21 +44,25 @@ public class enderDest /// /// E06 - Logradouro /// + [TString] public string xLgr { get; set; } /// /// E07 - Número /// + [TString] public string nro { get; set; } /// /// E08 - Complemento /// + [TString] public string xCpl { get; set; } /// /// E09 - Bairro /// + [TString] public string xBairro { get; set; } /// @@ -69,6 +74,7 @@ public class enderDest /// /// E11 - Nome do município, informar EXTERIOR para operações com o exterior. /// + [TString] public string xMun { get; set; } /// @@ -107,6 +113,7 @@ public string CEP /// E15 - Nome do País /// Brasil ou BRASIL /// + [TString] public string xPais { get; set; } /// diff --git a/NFe.Classes/Informacoes/Identificacao/ide.cs b/NFe.Classes/Informacoes/Identificacao/ide.cs index d9248d505..aa1899ae8 100644 --- a/NFe.Classes/Informacoes/Identificacao/ide.cs +++ b/NFe.Classes/Informacoes/Identificacao/ide.cs @@ -37,6 +37,7 @@ using DFe.Classes.Entidades; using DFe.Classes.Flags; using DFe.Utils; +using DFe.Utils.Attributes; using NFe.Classes.Informacoes.Identificacao.Tipos; namespace NFe.Classes.Informacoes.Identificacao @@ -56,6 +57,7 @@ public class ide /// /// B04 - Descrição da Natureza da Operação /// + [TString] public string natOp { get; set; } /// @@ -220,6 +222,7 @@ public bool indIntermedSpecified /// /// B27 - versão do aplicativo utilizado no processo de emissão /// + [TString] public string verProc { get; set; } /// @@ -244,6 +247,7 @@ public string ProxydhCont /// /// B29 - Informar a Justificativa da entrada /// + [TString] public string xJust { get; set; } /// diff --git a/NFe.Classes/Informacoes/_baseNFe.cs b/NFe.Classes/Informacoes/_baseNFe.cs new file mode 100644 index 000000000..5ecbeae47 --- /dev/null +++ b/NFe.Classes/Informacoes/_baseNFe.cs @@ -0,0 +1,98 @@ +/********************************************************************************/ +/* Projeto: Biblioteca ZeusNFe */ +/* Biblioteca C# para emissão de Nota Fiscal Eletrônica - NFe e Nota Fiscal de */ +/* Consumidor Eletrônica - NFC-e (http://www.nfe.fazenda.gov.br) */ +/* */ +/* Direitos Autorais Reservados (c) 2014 Adenilton Batista da Silva */ +/* Zeusdev Tecnologia LTDA ME */ +/* */ +/* Você pode obter a última versão desse arquivo no GitHub */ +/* localizado em https://github.com/adeniltonbs/Zeus.Net.NFe.NFCe */ +/* */ +/* */ +/* Esta biblioteca é software livre; você pode redistribuí-la e/ou modificá-la */ +/* sob os termos da Licença Pública Geral Menor do GNU conforme publicada pela */ +/* Free Software Foundation; tanto a versão 2.1 da Licença, ou (a seu critério) */ +/* qualquer versão posterior. */ +/* */ +/* Esta biblioteca é distribuída na expectativa de que seja útil, porém, SEM */ +/* NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU */ +/* ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor*/ +/* do GNU para mais detalhes. (Arquivo LICENÇA.TXT ou LICENSE.TXT) */ +/* */ +/* Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto*/ +/* com esta biblioteca; se não, escreva para a Free Software Foundation, Inc., */ +/* no endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. */ +/* Você também pode obter uma copia da licença em: */ +/* http://www.opensource.org/licenses/lgpl-license.php */ +/* */ +/* Zeusdev Tecnologia LTDA ME - adenilton@zeusautomacao.com.br */ +/* http://www.zeusautomacao.com.br/ */ +/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */ +/********************************************************************************/ + +using DFe.Utils.Attributes; +using System.Collections; +using System.Collections.Generic; + +namespace NFe.Classes.Informacoes +{ + public class _baseNFe + { + public void ExecutarCorrecaoDeDados(object obj) + { + var tipo = obj.GetType(); + + // Corrige as propriedades + var propriedades = tipo.GetProperties(); + foreach (var propriedade in propriedades) + { + if (!propriedade.CanRead || !propriedade.CanWrite) + { + continue; + } + + // Ignora propriedades indexadas + if (propriedade.GetIndexParameters().Length > 0) + { + continue; + } + + var atributosTString = propriedade.GetCustomAttributes(typeof(TStringAttribute), true); + if (atributosTString.Length > 0) + { + if (propriedade.GetValue(obj) is string valor) + { + var valorCorrigido = TStringAttribute.CorrigirValor(valor); + propriedade.SetValue(obj, valorCorrigido); + } + } + + // Se a propriedade é uma lista, itera sobre os itens na lista + if (propriedade.PropertyType.IsGenericType && propriedade.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) + { + var lista = propriedade.GetValue(obj) as IList; + if (lista != null) + { + foreach (var item in lista) + { + ExecutarCorrecaoDeDados(item); + } + } + } + else + { + // Verifica se a propriedade é do tipo de uma classe + if (propriedade.PropertyType.IsClass && propriedade.PropertyType != typeof(string)) + { + var propValor = propriedade.GetValue(obj); + if (propValor != null) + { + ExecutarCorrecaoDeDados(propValor); + } + } + } + } + } + } +} diff --git a/NFe.Classes/Informacoes/infNFe.cs b/NFe.Classes/Informacoes/infNFe.cs index 5d3b269c0..f3e90b906 100644 --- a/NFe.Classes/Informacoes/infNFe.cs +++ b/NFe.Classes/Informacoes/infNFe.cs @@ -47,7 +47,7 @@ namespace NFe.Classes.Informacoes { - public class infNFe + public class infNFe: _baseNFe { public infNFe() {