<?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</title>
	<atom:link href="http://www.entendendo.net/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>4627</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>4383</slash:comments>
		</item>
		<item>
		<title>O Diário Nerd &#8211; Criando o Projeto no VS2008</title>
		<link>http://www.entendendo.net/2009/10/18/o-diario-nerd-criando-o-projeto-no-vs2008/</link>
		<comments>http://www.entendendo.net/2009/10/18/o-diario-nerd-criando-o-projeto-no-vs2008/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 19:15:56 +0000</pubDate>
		<dc:creator>Thiago Rheinheimer Costa</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[O Diário Nerd]]></category>

		<guid isPermaLink="false">http://www.entendendo.net/?p=125</guid>
		<description><![CDATA[Para começar:
1) Abra o Visual Studio 2008 SP1;

2) Clique em File-&#62;New-&#62;Project;

3) Na guia Project types, selecione Visual C#, e na guia Templates, selecione ASP.NET MVC Web Application;
4) No campo Name informe o nome do projeto digitando DiarioNerd;

5) Clique em OK;
Ao seguir os procedimentos acima, uma nova tela aparecerá solicitando se desejamos criar um projeto de [...]]]></description>
			<content:encoded><![CDATA[<p>Para começar:<br />
1) Abra o <strong>Visual Studio 2008 SP1</strong>;</p>
<p style="text-align: center;"><img class="size-full wp-image-126  aligncenter" title="Ícone VS2008" src="http://www.entendendo.net/wp-content/uploads/2009/10/1.png" alt="Ícone VS2008" width="53" height="31" /></p>
<p>2) Clique em <strong>File-&gt;New-&gt;Project</strong>;</p>
<p style="text-align: center;"><img class="size-full wp-image-127 aligncenter" title="2" src="http://www.entendendo.net/wp-content/uploads/2009/10/2.png" alt="2" width="460" height="189" /></p>
<p style="text-align: left;">3) Na guia <strong>Project types</strong>, selecione <strong>Visual C#, </strong>e na guia <strong>Templates</strong>, selecione <strong>ASP.NET MVC Web Application;</strong></p>
<p style="text-align: left;">4) No campo <strong>Name</strong> informe o nome do projeto digitando <strong>DiarioNerd;</strong></p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-128" title="3" src="http://www.entendendo.net/wp-content/uploads/2009/10/3.png" alt="3" width="596" height="406" /></p>
<p style="text-align: left;">5) Clique em <strong>OK;</strong></p>
<p style="text-align: left;">Ao seguir os procedimentos acima, uma nova tela aparecerá solicitando se desejamos criar um projeto de testes ou não. Apenas marque <strong>Yes, create a unit test project</strong> (que já vem selecionada por padrão), conforme a figura abaixo:</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-129" title="5" src="http://www.entendendo.net/wp-content/uploads/2009/10/5.png" alt="5" width="586" height="409" /></p>
<p style="text-align: left;">Após clicar em <strong>Ok</strong>, um novo projeto estará criado com alguns arquivos e uma estrutura padrão de pastas do <strong>ASP.NET MVC</strong>.</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-130" title="6" src="http://www.entendendo.net/wp-content/uploads/2009/10/6.png" alt="6" width="270" height="408" /></p>
<p style="text-align: left;">E o nosso projeto está criado.</p>
<p style="text-align: left;">No próximo post iremos criar o Banco de Dados da aplicação, até lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2009/10/18/o-diario-nerd-criando-o-projeto-no-vs2008/feed/</wfw:commentRss>
		<slash:comments>3309</slash:comments>
		</item>
		<item>
		<title>O Diário Nerd &#8211; Introdução</title>
		<link>http://www.entendendo.net/2009/09/06/o-diario-nerd-introducao/</link>
		<comments>http://www.entendendo.net/2009/09/06/o-diario-nerd-introducao/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 17:35:57 +0000</pubDate>
		<dc:creator>Thiago Rheinheimer Costa</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[O Diário Nerd]]></category>

		<guid isPermaLink="false">http://www.entendendo.net/?p=100</guid>
		<description><![CDATA[A aplicação que iremos construir aqui é parecida, em alguns aspectos, com o Twitter. A idéia é ter um microblog que não tenha tão poucos caracteres disponíveis, ou seja, os usuários podem postar inclusive artigos com muito conteúdo. Em tese o “post” seria como o de um blog normal, com a diferença de que no [...]]]></description>
			<content:encoded><![CDATA[<p>A aplicação que iremos construir aqui é parecida, em alguns aspectos, com o Twitter. A idéia é ter um microblog que não tenha tão poucos caracteres disponíveis, ou seja, os usuários podem postar inclusive artigos com muito conteúdo. Em tese o “post” seria como o de um blog normal, com a diferença de que no Diário Nerd os posts dos usuários ficam misturados, mostrando os últimos incluídos na página principal, ou seja, mais “atração” em um único lugar.</p>
<p>A imagem abaixo ilustra a página principal do experimento:</p>
<p><img src="http://www.entendendo.net/wp-content/uploads/2009/09/home3.jpg" alt="O Diário Nerd" title="O Diário Nerd" width="604" height="237" class="aligncenter size-full wp-image-107" /></p>
<p>Através da imagem acima, nota-se que os títulos dos posts, no lado direito da tela, estão em “azul”, sinalizando um hyperlink e, ao clicar sobre o título, podemos ver a visualização do conteúdo deste post. Se clicarmos no apelido do usuário que postou, mais ao lado direito, teremos também a lista paginada dos posts daquele usuário. Isso pode ser observado na figura abaixo:</p>
<p><img src="http://www.entendendo.net/wp-content/uploads/2009/09/intro2.jpg" alt="Posts do usuário" title="Posts do usuário" width="479" height="206" class="aligncenter size-full wp-image-111" /></p>
<p>Ao clicar no título de um dos posts, o usuário é redirecionado para a “view” (página) ilustrada pela figura abaixo:</p>
<p><img src="http://www.entendendo.net/wp-content/uploads/2009/09/intro3.jpg" alt="Página de detalhes (visualização)" title="Página de detalhes (visualização)" width="433" height="253" class="aligncenter size-full wp-image-113" /></p>
<p>E também, na mesma “view” de detalhamento do post (mostrada acima), o usuário pode visualizar e inserir os comentários, conforme podemos notar na imagem abaixo:</p>
<p><img src="http://www.entendendo.net/wp-content/uploads/2009/09/intro4.jpg" alt="Comentários" title="Comentários" width="407" height="504" class="aligncenter size-full wp-image-115" /></p>
<p>O usuário pode apagar os conteúdos que são de sua autoria, mas não pode apagar/alterar os conteúdos dos outros usuários.<br />
Veja, na imagem abaixo, os links que aparecem no detalhamento de um post quando o usuário é o seu criador:</p>
<p><img src="http://www.entendendo.net/wp-content/uploads/2009/09/intro5.jpg" alt="Detalhes do post para o Criador" title="Detalhes do post para o Criador" width="476" height="252" class="aligncenter size-full wp-image-117" /></p>
<p>E veja o menu superior que aparece para o usuário logado:</p>
<p><img src="http://www.entendendo.net/wp-content/uploads/2009/09/intro6.jpg" alt="Menu do usuário" title="Menu do usuário" width="589" height="41" class="aligncenter size-full wp-image-119" /></p>
<p>A idéia é adidionar vários recursos, para criar um verdadeiro ponto de troca de informações, mas sem ter a necessidade de um domínio isolado para cada blogger.<br />
Veja o que está envolvido neste rápido experimento: <strong>inclusão, alteração, deleção, validação, paginação, autenticação, autorização, master pages, views, partial views, actions, controllers, models, helpers e url routing</strong>, entre outros.</p>
<p><strong>Este é o primeiro post introdutório da série &#8220;O Diário Nerd&#8221;.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2009/09/06/o-diario-nerd-introducao/feed/</wfw:commentRss>
		<slash:comments>3460</slash:comments>
		</item>
		<item>
		<title>Novo treinamento presencial</title>
		<link>http://www.entendendo.net/2009/09/06/novo-treinamento-presencial/</link>
		<comments>http://www.entendendo.net/2009/09/06/novo-treinamento-presencial/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 14:37:50 +0000</pubDate>
		<dc:creator>Thiago Rheinheimer Costa</dc:creator>
				<category><![CDATA[Notícias]]></category>

		<guid isPermaLink="false">http://www.entendendo.net/?p=98</guid>
		<description><![CDATA[No último dia 29, tive a oportunidade de, mais uma vez, ministrar um curso presencial de ASP.NET MVC em São Paulo/SP pela escola Treinando.NET.
Os cursos passarão a ser oferecidos regularmente. A idéia é de oferecer um por mês.
Para os interessados, basta acompanhar o endereço http://www.treinando.net. Assim que as inscrições são abertas, o curso aparece nesse [...]]]></description>
			<content:encoded><![CDATA[<p>No último dia 29, tive a oportunidade de, mais uma vez, ministrar um curso presencial de ASP.NET MVC em São Paulo/SP pela escola Treinando.NET.</p>
<p>Os cursos passarão a ser oferecidos regularmente. A idéia é de oferecer um por mês.</p>
<p>Para os interessados, basta acompanhar o endereço <a title="http://www.treinando.net" href="http://www.treinando.net" target="_blank">http://www.treinando.net</a>. Assim que as inscrições são abertas, o curso aparece nesse endereço.</p>
<p>abs.</p>
<p><strong>Thiago Rheinheimer Costa</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2009/09/06/novo-treinamento-presencial/feed/</wfw:commentRss>
		<slash:comments>3594</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>1868</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>4952</slash:comments>
		</item>
		<item>
		<title>Principais detalhes ao utilizar o Firebird com .NET</title>
		<link>http://www.entendendo.net/2009/08/05/principais-detalhes-ao-utilizar-o-firebird-com-net/</link>
		<comments>http://www.entendendo.net/2009/08/05/principais-detalhes-ao-utilizar-o-firebird-com-net/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 18:36:40 +0000</pubDate>
		<dc:creator>Giovanni Alexandre Costa Rosa</dc:creator>
				<category><![CDATA[.NET Framework 3.5]]></category>

		<guid isPermaLink="false">http://www.entendendo.net/?p=69</guid>
		<description><![CDATA[Este post não é um passo a passo de como utilizar o Firebird, mas sim para esclarecer boa parte das dúvidas que geram os principais problemas ao trabalhar com o Firebird em .NET que eu e outros usuários já enfrentamos.
O Firebird .NET não adiciona as DLLs no GAC (Global Assembly Cache) quando instalado, então, por [...]]]></description>
			<content:encoded><![CDATA[<p>Este post não é um passo a passo de como utilizar o Firebird, mas sim para esclarecer boa parte das dúvidas que geram os principais problemas ao trabalhar com o Firebird em .NET que eu e outros usuários já enfrentamos.</p>
<p>O Firebird .NET não adiciona as DLLs no GAC (Global Assembly Cache) quando instalado, então, por muitas vezes você pode encontrar alguns problemas ao utilizar o Firebird no .NET, por exemplo:</p>
<pre>Não foi possível localizar o Provedor de Dados .Net Framework solicitado. Talvez ele não esteja instalado.</pre>
<p>Isso acontece principalmente ao tentar utilizar o Firebird com DbCommand, um exemplo do comando que dispara esta exception:</p>
<pre name="code" class="c-sharp">DbProviderFactory factory =  DbProviderFactories.GetFactory("FirebirdSql.Data.FirebirdClient")</pre>
<p>Por isso, vale lembrar aqui alguns detalhes ao utilizar o Firebird no .NET</p>
<p>Definir a propriedade Copy Local = True nas Dlls do Firebird referenciadas no projeto.<br />
Adicionar a DLL ao GAC, para isso, abra o Visual Studio 2008 Command Prompt, localizado no Iniciar =&gt; Programas =&gt; Visual Studio Tools</p>
<p>Digite gacutil -i FirebirdSql.Data.FirebirdClient (Se você não estiver na mesma pasta em que a DLL se encontra, defina o caminho com a DLL, por  exemplo C:\FirebirdSql.Data.FirebirdClient)</p>
<p>Com a DLL adicionada ao GAC, digite gac -l FirebirdSql.Data.FirebirdClient para listar as informações, que deve aparecer conforme abaixo:</p>
<pre><code>The Global Assembly Cache contains the following assemblies:
  FirebirdSql.Data.FirebirdClient, Version=2.1.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL

Number of items = 1</code></pre>
<p>Prestando atenção a detalhes como a Versão (Version) e PublicKeyToken.</p>
<p>Além disso, no web.config (ou app.config no caso de um aplicação winform), adicionar as linhas abaixo:</p>
<pre name="code" class="xml">&lt;system.data&gt;
&lt;DbProviderFactories&gt;
&lt;remove invariant="CoreLab.Oracle"/&gt;
&lt;add name="FirebirdClient Data Provider" invariant="FirebirdSql.Data.FirebirdClient" description=".Net Framework Data Provider for Firebird" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=2.1.0.0, Culture=neutral,PublicKeyToken=3750abcc3150b00c" /&gt;
&lt;/DbProviderFactories&gt;
&lt;/system.data&gt;</pre>
<p>Ao adicionar as linhas acima, fique atendo a detalhes como Version e PublicKeyToken, eles devem ser iguais aos listados quando executamos o comando gacutil -l</p>
<p>Bom, acho que é isso, dúvidas perguntem nos comentários <img src='http://www.entendendo.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2009/08/05/principais-detalhes-ao-utilizar-o-firebird-com-net/feed/</wfw:commentRss>
		<slash:comments>3269</slash:comments>
		</item>
		<item>
		<title>Vídeo- ASP.NET 3.5 &#8211; Introdução</title>
		<link>http://www.entendendo.net/2009/05/27/video-aspnet-35-introducao/</link>
		<comments>http://www.entendendo.net/2009/05/27/video-aspnet-35-introducao/#comments</comments>
		<pubDate>Thu, 28 May 2009 01:13:26 +0000</pubDate>
		<dc:creator>Thiago Rheinheimer Costa</dc:creator>
				<category><![CDATA[Vídeo aulas]]></category>

		<guid isPermaLink="false">http://blog.entendendo.net/?p=62</guid>
		<description><![CDATA[  
]]></description>
			<content:encoded><![CDATA[<p><object width="640" height="498"><param name="movie" value="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/ASPNET-Introducao_controller.swf"></param><param name="quality" value="high"></param><param name="bgcolor" value="#FFFFFF"></param><param name="flashVars" value="thumb=http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/FirstFrame.png&#038;containerwidth=640&#038;containerheight=498&#038;showstartscreen=true&#038;showendscreen=true&#038;loop=false&#038;autostart=false&#038;color=1A1A1A,1A1A1A&#038;thumbscale=45&#038;content=http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/ASPNET-Introducao.mp4"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="showall"></param><param name="allowScriptAccess" value="always"></param><param name="base" value="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/"></param>  <embed src="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/ASPNET-Introducao_controller.swf" quality="high" bgcolor="#FFFFFF" width="640" height="498" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/FirstFrame.png&#038;containerwidth=640&#038;containerheight=498&#038;showstartscreen=true&#038;showendscreen=true&#038;loop=false&#038;autostart=false&#038;color=1A1A1A,1A1A1A&#038;thumbscale=45&#038;content=http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/ASPNET-Introducao.mp4" allowFullScreen="true" base="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/" scale="showall"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2009/05/27/video-aspnet-35-introducao/feed/</wfw:commentRss>
		<slash:comments>3875</slash:comments>
<enclosure url="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/408173f5-6652-4248-bce0-d87124562b96/ASPNET-Introducao.mp4" length="12046268" type="video/mp4" />
		</item>
		<item>
		<title>Vídeo &#8211; Entendendo Models-Views-Controllers</title>
		<link>http://www.entendendo.net/2009/05/27/video-entendendo-models-views-controllers/</link>
		<comments>http://www.entendendo.net/2009/05/27/video-entendendo-models-views-controllers/#comments</comments>
		<pubDate>Wed, 27 May 2009 23:58:04 +0000</pubDate>
		<dc:creator>Thiago Rheinheimer Costa</dc:creator>
				<category><![CDATA[Vídeo aulas]]></category>

		<guid isPermaLink="false">http://blog.entendendo.net/?p=60</guid>
		<description><![CDATA[  
]]></description>
			<content:encoded><![CDATA[<p><object width="640" height="498"><param name="movie" value="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/7d0a7a50-1687-4f9a-b506-a6565436da84/MVC-ModelsViewsControllers_controller.swf"></param><param name="quality" value="high"></param><param name="bgcolor" value="#FFFFFF"></param><param name="flashVars" value="containerwidth=640&#038;containerheight=498&#038;showstartscreen=true&#038;showendscreen=true&#038;loop=false&#038;autostart=false&#038;color=000000,000000&#038;thumbscale=45&#038;content=http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/7d0a7a50-1687-4f9a-b506-a6565436da84/MVC-ModelsViewsControllers.mp4"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="showall"></param><param name="allowScriptAccess" value="always"></param><param name="base" value="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/7d0a7a50-1687-4f9a-b506-a6565436da84/"></param>  <embed src="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/7d0a7a50-1687-4f9a-b506-a6565436da84/MVC-ModelsViewsControllers_controller.swf" quality="high" bgcolor="#FFFFFF" width="640" height="498" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="containerwidth=640&#038;containerheight=498&#038;showstartscreen=true&#038;showendscreen=true&#038;loop=false&#038;autostart=false&#038;color=000000,000000&#038;thumbscale=45&#038;content=http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/7d0a7a50-1687-4f9a-b506-a6565436da84/MVC-ModelsViewsControllers.mp4" allowFullScreen="true" base="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/7d0a7a50-1687-4f9a-b506-a6565436da84/" scale="showall"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entendendo.net/2009/05/27/video-entendendo-models-views-controllers/feed/</wfw:commentRss>
		<slash:comments>3326</slash:comments>
<enclosure url="http://content.screencast.com/users/ThiagoRheinheimer/folders/Default/media/7d0a7a50-1687-4f9a-b506-a6565436da84/MVC-ModelsViewsControllers.mp4" length="15006892" type="video/mp4" />
		</item>
	</channel>
</rss>

