<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>entendendo.net &#187; CSharp (C#)</title>
	<atom:link href="http://www.entendendo.net/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.entendendo.net</link>
	<description>agora você pode falar: &#34;eu entendo.net&#34;</description>
	<lastBuildDate>Wed, 08 Sep 2010 19:38:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Geração do Sintegra</title>
		<link>http://www.entendendo.net/2010/09/08/geracao-do-sintegra/</link>
		<comments>http://www.entendendo.net/2010/09/08/geracao-do-sintegra/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 19:36:37 +0000</pubDate>
		<dc:creator>Giovanni Alexandre Costa Rosa</dc:creator>
				<category><![CDATA[.NET Framework 3.5]]></category>
		<category><![CDATA[CSharp (C#)]]></category>

		<guid isPermaLink="false">http://www.entendendo.net/?p=148</guid>
		<description><![CDATA[Olá a todos.
Após alguns meses sem atualização, estamos com um novo post disponibilizando as classes para geração do Sintegra.
O Projeto pode ser encontrado no endereço http://sintegra.codeplex.com
O Projeto ainda não foi exaustivamente testado e nem todos os registros ainda são gerados, mas a intenção do projeto não é apenas disponibilizar classes prontas para o usuário mas [...]]]></description>
			<content:encoded><![CDATA[<p>Olá a todos.</p>
<p>Após alguns meses sem atualização, estamos com um novo post disponibilizando as classes para geração do Sintegra.</p>
<p>O Projeto pode ser encontrado no endereço <a href="http://sintegra.codeplex.com" target="_blank">http://sintegra.codeplex.com</a></p>
<p>O Projeto ainda não foi exaustivamente testado e nem todos os registros ainda são gerados, mas a intenção do projeto não é apenas disponibilizar classes prontas para o usuário mas também fazer com que no futuro tenhamos uma dor de cabeça a menos como desenvolvedores <img src='http://www.entendendo.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Em caso de dúvida, postem nos comentários ou criem uma nova discussão na página do Codeplex.</p>
<p>Abraço a todos</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2010/09/08/geracao-do-sintegra/feed/</wfw:commentRss>
		<slash:comments>3023</slash:comments>
		</item>
		<item>
		<title>Certificado digital da Caixa e Windows 7</title>
		<link>http://www.entendendo.net/2010/03/31/certificado-digital-da-caixa-e-windows-7/</link>
		<comments>http://www.entendendo.net/2010/03/31/certificado-digital-da-caixa-e-windows-7/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 19:40:01 +0000</pubDate>
		<dc:creator>Giovanni Alexandre Costa Rosa</dc:creator>
				<category><![CDATA[CSharp (C#)]]></category>
		<category><![CDATA[Nota fiscal Eletrônica (NFe)]]></category>

		<guid isPermaLink="false">http://www.entendendo.net/?p=136</guid>
		<description><![CDATA[Olá a todos.
Recentemente um cliente nosso comprou um certificado digital na Caixa econômica federal e encontrou alguns problemas pra utilizar ela no Windows 7 (E talvez no Vista também).
No nosso caso, os erros eram:
Erro interno. Pode ser que o perfil do usuário não esteja acessível ou que a chave privada que você está importando exija [...]]]></description>
			<content:encoded><![CDATA[<p>Olá a todos.</p>
<p>Recentemente um cliente nosso comprou um certificado digital na Caixa econômica federal e encontrou alguns problemas pra utilizar ela no Windows 7 (E talvez no Vista também).<br />
No nosso caso, os erros eram:</p>
<p>Erro interno. Pode ser que o perfil do usuário não esteja acessível ou que a chave privada que você está importando exija um provedor de serviço de criptografia que não está instalado no sistema</p>
<p>Ou em Inglês:</p>
<p>An internal error occurred. This can be either the user profile is not accessible or the private key that you are importing might require a cryptographic service provider that is not installed on your system.</p>
<p>Para corrigir esse problema, verifique se você possui as seguintes pastas criadas:</p>
<p>%USERPROFILE%\Application Data\Microsoft\SystemCertificates<br />
%USERPROFILE%\Application Data\Microsoft\Protect<br />
%USERPROFILE%\Application Data\Microsoft\Credentials<br />
%USERPROFILE%\Application Data\Microsoft\Crypto</p>
<p>PS: O %USERPROFILE% refere-se a pasta AppData, na pasta do seu usuário (Pasta oculta).</p>
<p>Se as pastas acima não existem, crie-as e verifique suas permissões.</p>
<p>Aqui resolvemos o problema desta forma.</p>
<p>Update: Instale também o gerenciador de certificados da caixa, que pode ser encontrado no link:<br />
http://icp.caixa.gov.br/_downloads/CSPSetup6aVersao.zip</p>
<p>Continuamos ainda sem uma solução pra funcionar no Windows Server 2008, se alguem tiver alguma idéia, favor poste nos comentários <img src='http://www.entendendo.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Abraço</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2010/03/31/certificado-digital-da-caixa-e-windows-7/feed/</wfw:commentRss>
		<slash:comments>2731</slash:comments>
		</item>
		<item>
		<title>Geração de XML, validação e assinatura digital</title>
		<link>http://www.entendendo.net/2009/08/29/geracao-de-xml-validacao-e-assinatura-digital/</link>
		<comments>http://www.entendendo.net/2009/08/29/geracao-de-xml-validacao-e-assinatura-digital/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 14:26:26 +0000</pubDate>
		<dc:creator>Giovanni Alexandre Costa Rosa</dc:creator>
				<category><![CDATA[Nota fiscal Eletrônica (NFe)]]></category>

		<guid isPermaLink="false">http://www.entendendo.net/?p=94</guid>
		<description><![CDATA[Olá pessoal.
Estou disponibilizando um sistema de exemplo para geração de XML, validação e assinatura digital.
Atenção: A classe disponibilizada foi bastante alterada daquela que eu utilizo nas empresas no dia a dia, visando torna-la ainda mais automatizada com Reflection, portanto, não testei todas as situações possíveis, mas já aviso antecipadamente que qualquer problema com a classe [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal.</p>
<p>Estou disponibilizando um sistema de exemplo para geração de XML, validação e assinatura digital.</p>
<p><strong>Atenção: A classe disponibilizada foi bastante alterada daquela que eu utilizo nas empresas no dia a dia, visando torna-la ainda mais automatizada com Reflection, portanto, não testei todas as situações possíveis, mas já aviso antecipadamente que qualquer problema com a classe vocês podem perguntar que vou ajustando.</strong></p>
<p>Antes de tudo, esta classe não é para ser um exemplo demonstrando a melhor forma de se gerar um XML para NFe, na verdade quando iniciei o desenvolvimento a intenção era uma geração de XML com manutenção fácil para que no futuro as alterações de Layout fossem o mais simples possível.</p>
<p>Portanto, explicando basicamente, a classe foi inteiramente escrita conforme o manual de Integração, utiliza Reflection para uma geração mais automatizada e atributos para facilitar a formatação e outras configurações do XML. Acredito que o meu objetivo inicial com ela, que era ter uma classe de fácil manutenção foi atingida. </p>
<p>Vou começar explicando como a classe funciona e no final deste posto você encontra um aplicativo exemplo com a classe em uso. No meu sistema original esta classe está mais organizada, mas para o exemplo, coloquei as classes um pouco bagunçadas dentro de arquivos, mas acredito que está bem fácil de entender.</p>
<p>Bom, a classe não tem muito segredo, foi inteiramente digitada, é necessário apenas explicar alguns dos recursos que implementei.</p>
<p><strong>Atributos</strong><br />
Entre as várias propriedades da classe, em algumas você encontra atributos como no exemplo abaixo:</p>
<pre name="code" class="c-sharp">
                [Formato("#####0.0000", "en-US")]
                public decimal qCom { get; set; }
</pre>
<p>O Atributo [Formato] define o formato que o valor precisa no XML, além de informar a cultura, como &#8220;en-US&#8221; ou &#8220;pt-br&#8221;. </p>
<pre name="code" class="c-sharp">
            [Obrigatorio]
            public string IE { get; set; }
</pre>
<p>O Atributo [Obrigatorio] define se o campo deve sair no XML mesmo quando não tiver um valor definido, como o IE por exemplo, que mesmo que esteja em branco deve ser informado no XML (<IE /> ou <IE></IE>).</p>
<p>Além disso, várias propriedades podem ser nulas, como esta no exemplo abaixo:</p>
<pre name="code" class="c-sharp">
public decimal? qTrib { get; set; }
</pre>
<p>Estas propriedades serão ignoradas pelo reflection se não tiverem um valor definido, utilize quando a TAG não deve ser informada no XML quando não possuir um valor.</p>
<p><strong>Geração do XML</strong><br />
Pretendo explicar basicamente como desenvolvi a geração do XML através do Reflection. Vale lembrar que talvez algumas coisas devem ser arrumadas aqui ainda, visto que para este Post no Blog eu alterei a classe visando tornar ela ainda mais automatizada. Além disso, não me crucifiquem por algumas linhas de código, em algumas funções eu realmente não encontrei uma melhor de forma de fazer, mas uma das razões de postar esta classe é ter um feedback de vocês e melhorar ela ainda mais <img src='http://www.entendendo.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Com a classe preenchida, a geração do XML é simples:</p>
<pre name="code" class="c-sharp">
            NFe teste = new NFe();
            //Código para preencher a classe... no exemplo ele está disponível, aqui resolvi economizar espaço pulando esta parte
            XmlDocument xmlGerado = teste.GerarXML();
            //Salva uma cópia do XML não assinado - ATENÇÃO - se você está utilizando Windows Vista/7/Server, salvar na Unidade C pode não ser possível caso o VS2008 não esteja rodando como administrador
            xmlGerado.Save("c:\\testeXMLNaoAssinado.xml");
            //Seleciona o certificado
            X509Certificate2 certificado = CertificadoDigital.SelecionarCertificado();
            //assina o xml
            XmlDocument xmlAssinado = CertificadoDigital.Assinar(xmlGerado, "infNFe", certificado);                        

            //Valida o XML assinado
            string resultado = ValidaXML.ValidarXML(xmlAssinado);

            if (resultado.Trim().Length == 0)
                resultado = "Xml gerado com sucesso, nenhum erro encontrado";

            //Opcional - Função para gerar o Lote e deixar o arquivo pronto para ser enviado.
            //teste.GerarLoteNfe(ref xmlAssinado);

            //Importante:
            //Salvar através do TextWriter evita que o XML saia formatado no arquivo, desta forma o mesmo
            //pode ser rejeitado por alguns estados e/ou não validar nos programas teste
            using (XmlTextWriter xmltw = new XmlTextWriter("C:\\testeXML.xml", new UTF8Encoding(false)))
            {
                xmlAssinado.WriteTo(xmltw);
                xmltw.Close();
</pre>
<p>Eis a função GerarXML() &#8211; Veja os comentários no código para entender melhor</p>
<pre name="code" class="c-sharp">
        public XmlDocument GerarXML()
        {
            XmlWriterSettings configXML = new XmlWriterSettings();
            configXML.Indent = true;
            configXML.IndentChars = "";
            configXML.NewLineOnAttributes = false;
            configXML.OmitXmlDeclaration = false;            

            Stream xmlSaida = new MemoryStream();

            XmlWriter oXmlGravar = XmlWriter.Create(xmlSaida, configXML);

            oXmlGravar.WriteStartDocument();
            oXmlGravar.WriteStartElement("NFe","http://www.portalfiscal.inf.br/nfe"); //abre nfe
            oXmlGravar.WriteStartElement("infNFe");
            oXmlGravar.WriteAttributeString("xmlns","xsi",null,"http://www.w3.org/2001/XMLSchema-instance");
            oXmlGravar.WriteAttributeString("Id", "NFe" + Id.ToString());
            oXmlGravar.WriteAttributeString("versao", versao.ToString());

            Type tipoObjeto;
            tipoObjeto = infNFE.Ide.GetType();
            PropertyInfo[] propriedades;
            propriedades = tipoObjeto.GetProperties();

            //A Função objetoParaXML utiliza o reflection para ler as propriedades da classe e gerar o XML
            objetoParaXML(oXmlGravar, infNFE.Ide,false);
            objetoParaXML(oXmlGravar, infNFE.Emit,false);
            objetoParaXML(oXmlGravar, infNFE.Dest, false);

            foreach (infNFE.det detalhe in infNFE.Det)
            {
                oXmlGravar.WriteStartElement("det");
                oXmlGravar.WriteAttributeString("nItem", detalhe.nItem.ToString());

                objetoParaXML(oXmlGravar, detalhe.Prod, false);

                oXmlGravar.WriteStartElement("imposto");
                objetoParaXML(oXmlGravar, detalhe.Imposto.Icms, false);
                objetoParaXML(oXmlGravar, detalhe.Imposto.Ii, false);
                objetoParaXML(oXmlGravar, detalhe.Imposto.Ipi, false);
                objetoParaXML(oXmlGravar, detalhe.Imposto.Pis, false);
                objetoParaXML(oXmlGravar, detalhe.Imposto.Cofins, false);                

                oXmlGravar.WriteEndElement(); //fecha TAG imposto...
                oXmlGravar.WriteEndElement(); //fecha TAG det...
            }

            objetoParaXML(oXmlGravar, infNFE.Total, false);
            objetoParaXML(oXmlGravar, infNFE.Transp, false);
            objetoParaXML(oXmlGravar, infNFE.Cobr, false);
            objetoParaXML(oXmlGravar, infNFE.InfAdic, false);

            oXmlGravar.WriteEndElement(); //fecha infNFe
            oXmlGravar.WriteEndElement(); //fecha NFe            

            oXmlGravar.Flush();
            xmlSaida.Flush();
            xmlSaida.Position = 0;

            XmlDocument documento = new XmlDocument();
            documento.Load(xmlSaida);

            oXmlGravar.Close();                      

            return documento;
        }
</pre>
<p>Função objetoParaXML, que gera o XML</p>
<pre name="code" class="c-sharp">
        private void objetoParaXML(XmlWriter xmlWriter, object objeto, bool ignorarDeclaracaoElemento)
        {
            if (objeto == null)
                return;

            Type tipoObjeto;
            tipoObjeto = objeto.GetType();
            PropertyInfo[] propriedades;
            propriedades = tipoObjeto.GetProperties();

            if (!ignorarDeclaracaoElemento)
                xmlWriter.WriteStartElement(tipoObjeto.Name);                 

            foreach (PropertyInfo propriedade in propriedades)
            {
               //A Função novaTag verifica se a propriedade em sí é um novo elemento, como o enderEmit
               //no caso do emitente, e verifica tbm se esta propriedade foi declarada (!= null), se não ignora

                if (Funcoes.novaTag(propriedade) &#038;&#038; !(propriedade.GetValue(objeto, null) == null))
                {
                   //utilizando recursão
                    objetoParaXML(xmlWriter, propriedade.GetValue(objeto, null), false);
                    continue;
                }

                object[] obj = propriedade.GetCustomAttributes(false);
                Funcoes.gravarElemento(xmlWriter, propriedade.Name, propriedade.GetValue(objeto, null), obj);
            }
            if (!ignorarDeclaracaoElemento)
                xmlWriter.WriteEndElement();
        }
</pre>
<p>Bom, por enquanto é isso, não sei se consegui deixar claro sobre como funciona a classe, e agora estou com o tempo curto e vou postar assim mesmo, mas os comentários estão abertos para que todos possam perguntar, e assim vou melhorando este post e os códigos disponíveis.</p>
<p>Detalhe: A Classe está sendo disponibilizada gratuitamente, mas por favor, se você fizer alterações, notifique-me para que eu possa melhorar o código disponível.</p>
<p><a href="http://www.entendendo.net/downloads/NfeExemplo.rar">Link para Download do Exemplo</a></p>
<p>Para usar, mude o código do button1, adicionando um CNPJ válido, IE, nome de empresa e etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2009/08/29/geracao-de-xml-validacao-e-assinatura-digital/feed/</wfw:commentRss>
		<slash:comments>1305</slash:comments>
		</item>
		<item>
		<title>Funções básicas</title>
		<link>http://www.entendendo.net/2009/08/27/funcoes-basicas/</link>
		<comments>http://www.entendendo.net/2009/08/27/funcoes-basicas/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 14:45:52 +0000</pubDate>
		<dc:creator>Giovanni Alexandre Costa Rosa</dc:creator>
				<category><![CDATA[Nota fiscal Eletrônica (NFe)]]></category>

		<guid isPermaLink="false">http://www.entendendo.net/?p=84</guid>
		<description><![CDATA[Iniciando o primeiro post desta categoria mostrando algumas das funções básicas (Mas essenciais) na utilização da NFe com .NET.
Módulo 11 &#8211; Para calculo do digito verificado da Chave.
Com certeza esta função pode ser reduzida para menos linhas&#8230; se o fizer, por favor deixe um comentário com o código, sugestões são sempre bem vindas  

 [...]]]></description>
			<content:encoded><![CDATA[<p>Iniciando o primeiro post desta categoria mostrando algumas das funções básicas (Mas essenciais) na utilização da NFe com .NET.</p>
<p><strong>Módulo 11 &#8211; Para calculo do digito verificado da Chave.</strong><br />
Com certeza esta função pode ser reduzida para menos linhas&#8230; se o fizer, por favor deixe um comentário com o código, sugestões são sempre bem vindas <img src='http://www.entendendo.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<pre name="code" class="c-sharp">
        public static int modulo11(string chaveNFE)
        {
            if (chaveNFE.Length != 43)
                throw new Exception("Chave inválida, não é possível calcular o digito verificador");

            string baseCalculo = "4329876543298765432987654329876543298765432";
            int somaResultados = 0;

            for (int i = 0; i <= chaveNFE.Length - 1; i++)
            {
                int numNF = Convert.ToInt32(chaveNFE[i].ToString());
                int numBaseCalculo = Convert.ToInt32(baseCalculo[i].ToString());

                somaResultados += (numBaseCalculo * numNF);
            }

            int restoDivisao = (somaResultados % 11);
            int dv = 11 - restoDivisao;
            if ((dv == 0) || (dv > 9))
                return 0;
            else
                return dv;
        }
</pre>
<p><strong>Remover Acentos</strong><br />
Esta função não é de minha autoria, peguei no Google um tempo atrás e realmente não lembro mais de onde ela foi retirada.</p>
<pre name="code" class="c-sharp">
        public static string TirarAcento(string palavra)
        {
            string palavraSemAcento = "";
            string caracterComAcento = "áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÖÔÚÙÛÜÇ";
            string caracterSemAcento = "aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC";

            for (int i = 0; i < palavra.Length; i++)
            {
                if (caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1))) >= 0)
                {
                    int car = caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1)));
                    palavraSemAcento += caracterSemAcento.Substring(car, 1);
                }
                else
                {
                    palavraSemAcento += palavra.Substring(i, 1);
                }
            }

            return palavraSemAcento;
        }
</pre>
<p><strong>Remove formatação</strong><br />
Remove formatação de CNPJ/IE/RG/CPF, entre outros</p>
<pre name="code" class="c-sharp">
        public static string removeFormatacao(string texto)
        {
            string txt = "";

            txt = texto.Replace(".", "");
            txt = txt.Replace("-", "");
            txt = txt.Replace("/", "");
            txt = txt.Replace("(", "");
            txt = txt.Replace(")", "");
            txt = txt.Replace(" ", "");

            return txt;
        }
</pre>
<p>Por enquanto é isso, em breve (Ainda esta semana acredito eu) estarei postando uma classe para geração de XML, assim como exemplos para conexão com WebService, assinatura digital, cadeias de certificado, utilização de certificados A1 e A3 e etc.</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2009/08/27/funcoes-basicas/feed/</wfw:commentRss>
		<slash:comments>2687</slash:comments>
		</item>
	</channel>
</rss>

