diff --git a/CTe.AppTeste.NetCore/Entidades/ConfigWebService.cs b/CTe.AppTeste.NetCore/Entidades/ConfigWebService.cs
index 0d09340c1..17219a4fe 100644
--- a/CTe.AppTeste.NetCore/Entidades/ConfigWebService.cs
+++ b/CTe.AppTeste.NetCore/Entidades/ConfigWebService.cs
@@ -1,34 +1,34 @@
-/********************************************************************************/
+/********************************************************************************/
/* 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) */
+/* 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 */
+/* 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 é 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) */
+/* 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: */
+/* 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 */
+/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */
/********************************************************************************/
using System;
using CTe.Classes.Servicos.Tipos;
diff --git a/DFe.Utils.Standard/CertificadoDigitaoUtil.cs b/DFe.Utils.Standard/CertificadoDigitaoUtil.cs
new file mode 100644
index 000000000..126092a28
--- /dev/null
+++ b/DFe.Utils.Standard/CertificadoDigitaoUtil.cs
@@ -0,0 +1,114 @@
+using System;
+using System.IO;
+using System.Security;
+using System.Security.Cryptography.X509Certificates;
+
+namespace DFe.Utils.Standard
+{
+ public class CertificadoDigitaoUtil
+ {
+ ///
+ /// Retorna o certificado que está no caminho especificado
+ ///
+ /// Caminho do certificado (.pfx)
+ /// string representando a senha do certificado
+ public static X509Certificate2 ObterDoCaminho(string caminho, string password)
+ {
+ caminho = ArrumaCaminho(caminho);
+ SecureString stringSegura = null;
+ try
+ {
+ stringSegura = new SecureString();
+ if ((password.Length > 0))
+ {
+ foreach (Char caractere in password.ToCharArray())
+ {
+ stringSegura.AppendChar(caractere);
+ }
+ }
+ return ObterDoCaminho(caminho, stringSegura);
+ }
+ catch
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Retorna o certificado que está no caminho especificado
+ ///
+ /// Caminho do certificado (.pfx)
+ /// SecureString representando a senha do certificado
+ ///
+ public static X509Certificate2 ObterDoCaminho(string caminho, SecureString password)
+ {
+ caminho = ArrumaCaminho(caminho);
+ if (!caminho.ToLower().EndsWith(".pfx"))
+ {
+ throw new Exception("Caminho do certificado deve terminar com '.pfx'");
+ }
+
+ if (!File.Exists(caminho))
+ {
+ throw new Exception("Certificado não se encontra no caminho especificado");
+ }
+
+ var cert = new X509Certificate2(caminho, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
+ return cert;
+ }
+
+ ///
+ /// Retorna o certificado que está em bytes
+ ///
+ /// array de byte do certificado
+ /// string representando a senha do certificado
+ ///
+ public static X509Certificate2 ObterDosBytes(byte[] bytes, string password)
+ {
+ SecureString stringSegura = null;
+ try
+ {
+ stringSegura = new SecureString();
+ if ((password.Length > 0))
+ {
+ foreach (Char caractere in password.ToCharArray())
+ {
+ stringSegura.AppendChar(caractere);
+ }
+ }
+
+ return ObterDosBytes(bytes, stringSegura);
+ }
+ catch
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Retorna o certificado que está em bytes
+ ///
+ /// array de byte do certificado
+ /// SecureString senha do certificado
+ ///
+ public static X509Certificate2 ObterDosBytes(byte[] bytes, SecureString password)
+ {
+ var cert = new X509Certificate2(bytes, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
+ return cert;
+ }
+
+ ///
+ /// Arruma o path caso tenha sido escrito incorretamente
+ ///
+ /// Caminho do arquivo + pastas
+ ///
+ private static string ArrumaCaminho(string caminho)
+ {
+ caminho = caminho.Replace(@"/", @"\");
+ caminho = caminho.Replace(@"\\", @"\");
+ caminho = caminho.Replace("\"", ""); //remove "
+ caminho = caminho.Replace("\'", ""); //remove '
+ return caminho;
+ }
+ }
+}
diff --git a/DFe.Utils/DFe.Utils.csproj b/DFe.Utils/DFe.Utils.csproj
index 6bcc36915..0d28a05a6 100755
--- a/DFe.Utils/DFe.Utils.csproj
+++ b/DFe.Utils/DFe.Utils.csproj
@@ -45,7 +45,6 @@
-
diff --git a/NFe.AppTeste.NetCore/ConfiguracaoApp.cs b/NFe.AppTeste.NetCore/ConfiguracaoApp.cs
new file mode 100644
index 000000000..71051584d
--- /dev/null
+++ b/NFe.AppTeste.NetCore/ConfiguracaoApp.cs
@@ -0,0 +1,44 @@
+using DFe.Classes.Flags;
+using DFe.Utils;
+using NFe.Classes.Informacoes.Emitente;
+using NFe.Classes.Informacoes.Identificacao.Tipos;
+using NFe.Utils;
+using NFe.Utils.Email;
+using System.Net;
+
+namespace NFe.AppTeste.NetCore
+{
+ public class ConfiguracaoApp
+ {
+ private ConfiguracaoServico _cfgServico;
+
+ public ConfiguracaoApp()
+ {
+ CfgServico = ConfiguracaoServico.Instancia;
+ CfgServico.tpAmb = TipoAmbiente.Homologacao;
+ CfgServico.tpEmis = TipoEmissao.teNormal;
+ CfgServico.ProtocoloDeSeguranca = ServicePointManager.SecurityProtocol;
+ Emitente = new emit { CPF = "", CRT = CRT.SimplesNacional };
+ EnderecoEmitente = new enderEmit();
+ ConfiguracaoEmail = new ConfiguracaoEmail("email@dominio.com", "senha", "Envio de NFE", Properties.Resources.MensagemHtml, "smtp.dominio.com", 587, true, true);
+ }
+
+ public ConfiguracaoServico CfgServico
+ {
+ get
+ {
+ ConfiguracaoServico.Instancia.CopiarPropriedades(_cfgServico);
+ return _cfgServico;
+ }
+ set
+ {
+ _cfgServico = value;
+ ConfiguracaoServico.Instancia.CopiarPropriedades(value);
+ }
+ }
+
+ public emit Emitente { get; set; }
+ public enderEmit EnderecoEmitente { get; set; }
+ public ConfiguracaoEmail ConfiguracaoEmail { get; set; }
+ }
+}
diff --git a/NFe.AppTeste.NetCore/NFe.AppTeste.NetCore.csproj b/NFe.AppTeste.NetCore/NFe.AppTeste.NetCore.csproj
new file mode 100644
index 000000000..7a9801892
--- /dev/null
+++ b/NFe.AppTeste.NetCore/NFe.AppTeste.NetCore.csproj
@@ -0,0 +1,31 @@
+
+
+
+ Exe
+ netcoreapp2.2
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
diff --git a/NFe.AppTeste.NetCore/Program.cs b/NFe.AppTeste.NetCore/Program.cs
new file mode 100644
index 000000000..ccdd3f8a7
--- /dev/null
+++ b/NFe.AppTeste.NetCore/Program.cs
@@ -0,0 +1,1049 @@
+using DFe.Classes.Flags;
+using DFe.Utils;
+using DFe.Utils.Assinatura;
+using DFe.Utils.Standard;
+using NFe.Classes;
+using NFe.Classes.Informacoes;
+using NFe.Classes.Informacoes.Cobranca;
+using NFe.Classes.Informacoes.Destinatario;
+using NFe.Classes.Informacoes.Detalhe;
+using NFe.Classes.Informacoes.Detalhe.Tributacao;
+using NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual;
+using NFe.Classes.Informacoes.Detalhe.Tributacao.Estadual.Tipos;
+using NFe.Classes.Informacoes.Detalhe.Tributacao.Federal;
+using NFe.Classes.Informacoes.Detalhe.Tributacao.Federal.Tipos;
+using NFe.Classes.Informacoes.Emitente;
+using NFe.Classes.Informacoes.Identificacao;
+using NFe.Classes.Informacoes.Identificacao.Tipos;
+using NFe.Classes.Informacoes.Observacoes;
+using NFe.Classes.Informacoes.Pagamento;
+using NFe.Classes.Informacoes.Total;
+using NFe.Classes.Informacoes.Transporte;
+using NFe.Classes.Servicos.ConsultaCadastro;
+using NFe.Classes.Servicos.Tipos;
+using NFe.Servicos;
+using NFe.Servicos.Retorno;
+using NFe.Utils;
+using NFe.Utils.Excecoes;
+using NFe.Utils.NFe;
+using NFe.Utils.Tributacao.Estadual;
+using NFe.Utils.Tributacao.Federal;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace NFe.AppTeste.NetCore
+{
+ internal class Program
+ {
+ #region Console
+ private const string ArquivoConfiguracao = @"\configuracao.xml";
+ private static ConfiguracaoApp _configuracoes;
+
+ private static void Main(string[] args)
+ {
+ Console.WriteLine("Bem vindo ao demo do projeto NF-e com suporte ao NetStandard 2.0!");
+ Console.WriteLine("Este exemplo necessita do arquivo Configuração.xml já criado.");
+ Console.WriteLine("Caso necessite criar, utilize o app 'NFe.AppTeste'. e clique em 'Salvar Configuração para Arquivo'");
+ Console.WriteLine("Em seguida copie o 'configuração.xml' para a pasta bin\\Debug\\netcoreapp2.2 deste projeto.\n");
+ Console.ReadKey();
+
+ //inicializa configuracoes bases (podem ser carregadas novas aqui posteriormente com a opção 99)
+ _configuracoes = new ConfiguracaoApp();
+
+ Menu();
+ }
+
+ private static async void Menu()
+ {
+ while (true)
+ {
+ try
+ {
+ Console.Clear();
+ Console.WriteLine("Escolha uma das opções abaixo:");
+ Console.WriteLine("0 - Sair");
+ Console.WriteLine("1 - Consulta Status");
+ Console.WriteLine("2 - Consulta Cadastro Contribuinte");
+ Console.WriteLine("3 - Envia Nfe (assincrono)");
+ Console.WriteLine("4 - Listar NSU"); //Util para mostrar as notas emitida contra o CNPJ da empresa
+ Console.WriteLine("5 - Manifestar ciência da operação");
+ Console.WriteLine("6 - Download NFe");
+ Console.WriteLine($"98 - Carrega certificado (.pfx) A1");
+ Console.WriteLine($"99 - Carrega Configuracoes do arquivo {ArquivoConfiguracao}");
+
+ string option = Console.ReadLine();
+ Console.WriteLine();
+ Console.Clear();
+ Console.WriteLine("Aguarde... ");
+
+ switch (Convert.ToInt32(option))
+ {
+ case 0:
+ return;
+ case 1:
+ await FuncaoStatusServico();
+ break;
+ case 2:
+ await FuncaoConsultaCadastroContribuinte();
+ break;
+ case 3:
+ await FuncaoEnviaNfeAssincrono();
+ break;
+ case 4:
+ await CarregarNSUs();
+ break;
+ case 5:
+ await ManifestarCienciaOperacao();
+ break;
+ case 6:
+ await DownloadXml();
+ break;
+ case 98:
+ await CarregaDadosCertificado();
+ break;
+ case 99:
+ await CarregarConfiguracao();
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.Clear();
+ Console.WriteLine(e);
+ Console.WriteLine("Digite algo para continuar...");
+ Console.ReadKey();
+ }
+ }
+ }
+
+ private static async Task CarregarConfiguracao()
+ {
+ string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+
+ try
+ {
+ _configuracoes = !File.Exists(path + ArquivoConfiguracao)
+ ? new ConfiguracaoApp()
+ : FuncoesXml.ArquivoXmlParaClasse(path + ArquivoConfiguracao);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+
+ private static async Task CarregaDadosCertificado()
+ {
+ try
+ {
+ Console.Clear();
+ Console.WriteLine("Escreva o caminho do certificado com a extensão .pfx:");
+ string caminho = Console.ReadLine();
+
+ Console.Clear();
+ Console.WriteLine("Escreva a senha do certificado:");
+ string password = Console.ReadLine();
+
+ Console.Clear();
+ var cert = CertificadoDigitaoUtil.ObterDoCaminho(caminho, password);
+ _configuracoes.CfgServico.Certificado.Serial = cert.SerialNumber;
+ Console.WriteLine("Certificado encontrado e carregado...");
+ Console.WriteLine("Issuer: " + cert.IssuerName);
+ Console.WriteLine("Validade: " + cert.GetExpirationDateString());
+ Console.WriteLine("\nPressione para voltar..");
+ Console.ReadKey();
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+
+ #endregion
+
+ #region Funcoes
+
+ private static async Task FuncaoStatusServico()
+ {
+ try
+ {
+ #region Status do serviço
+ using (ServicosNFe servicoNFe = new ServicosNFe(_configuracoes.CfgServico))
+ {
+ var retornoStatus = servicoNFe.NfeStatusServico();
+ OnSucessoSync(retornoStatus);
+ }
+ #endregion
+ }
+ catch (ComunicacaoException ex)
+ {
+ throw ex;
+ }
+ catch (ValidacaoSchemaException ex)
+ {
+ throw ex;
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+
+ private static async Task FuncaoConsultaCadastroContribuinte()
+ {
+ try
+ {
+ #region Consulta Cadastro
+
+ Console.Clear();
+ Console.WriteLine("UF do Documento a ser Consultado:");
+ string uf = Console.ReadLine();
+ if (string.IsNullOrEmpty(uf))
+ {
+ throw new Exception("A UF deve ser informada!");
+ }
+
+ if (uf.Length != 2)
+ {
+ throw new Exception("UF deve conter 2 caracteres!");
+ }
+
+ Console.Clear();
+ Console.WriteLine("Tipo de documento a ser consultado: (0 - IE; 1 - CNPJ; 2 - CPF):");
+ string tipoDocumento = Console.ReadLine();
+ if (string.IsNullOrEmpty(tipoDocumento))
+ {
+ throw new Exception("O Tipo de documento deve ser informado!");
+ }
+
+ if (tipoDocumento.Length != 1)
+ {
+ throw new Exception("O Tipo de documento deve conter um apenas um número!");
+ }
+
+ if (!tipoDocumento.All(char.IsDigit))
+ {
+ throw new Exception("O Tipo de documento deve ser um número inteiro");
+ }
+
+ int intTipoDocumento = int.Parse(tipoDocumento);
+ if (!(intTipoDocumento >= 0 && intTipoDocumento <= 2))
+ {
+ throw new Exception("Tipos válidos: (0 - IE; 1 - CNPJ; 2 - CPF)");
+ }
+
+ Console.Clear();
+ Console.WriteLine("Documento(IE/CNPJ/CPF):");
+ string documento = Console.ReadLine();
+ if (string.IsNullOrEmpty(documento))
+ {
+ throw new Exception("O Documento(IE/CNPJ/CPF) deve ser informado!");
+ }
+
+ //efetua req de consulta
+ ServicosNFe servicoNFe = new ServicosNFe(_configuracoes.CfgServico);
+ var retornoConsulta = servicoNFe.NfeConsultaCadastro(uf, (ConsultaCadastroTipoDocumento)intTipoDocumento, documento);
+ OnSucessoSync(retornoConsulta);
+
+ #endregion
+ }
+ catch (ComunicacaoException ex)
+ {
+ throw ex;
+ }
+ catch (ValidacaoSchemaException ex)
+ {
+ throw ex;
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+
+ private static async Task FuncaoEnviaNfeAssincrono()
+ {
+ try
+ {
+ #region Cria e Envia NFe
+
+ /*var numero = Funcoes.InpuBox(this, "Criar e Enviar NFe", "Número da Nota:");
+ if (string.IsNullOrEmpty(numero)) throw new Exception("O Número deve ser informado!");
+
+ var lote = Funcoes.InpuBox(this, "Criar e Enviar NFe", "Id do Lote:");
+ if (string.IsNullOrEmpty(lote)) throw new Exception("A Id do lote deve ser informada!");*/
+
+ //parametros
+ string numero = "123";
+ string lote = "321";
+ var versaoServico = _configuracoes.CfgServico.VersaoNFeAutorizacao;
+ var modelo = _configuracoes.CfgServico.ModeloDocumento;
+
+ //gera o objeto NFe
+ var nfe = GetNf(Convert.ToInt32(numero), modelo, versaoServico);
+ nfe.Assina();
+ //apenas para nfce
+ /*if (nfe.infNFe.ide.mod == ModeloDocumento.NFCe)
+ {
+ nfe.infNFeSupl = new infNFeSupl();
+ if (versaoServico == VersaoServico.Versao400)
+ nfe.infNFeSupl.urlChave = nfe.infNFeSupl.ObterUrlConsulta(nfe, _configuracoes.ConfiguracaoDanfeNfce.VersaoQrCode);
+ nfe.infNFeSupl.qrCode = nfe.infNFeSupl.ObterUrlQrCode(nfe, _configuracoes.ConfiguracaoDanfeNfce.VersaoQrCode, configuracaoCsc.CIdToken, configuracaoCsc.Csc);
+ }*/
+ nfe.Valida();
+
+ //envia via req
+ ServicosNFe servicoNFe = new ServicosNFe(_configuracoes.CfgServico);
+ var retornoEnvio = servicoNFe.NFeAutorizacao(Convert.ToInt32(lote), IndicadorSincronizacao.Assincrono, new List { nfe }, false/*Envia a mensagem compactada para a SEFAZ*/);
+
+ OnSucessoSync(retornoEnvio);
+
+ #endregion
+ }
+ catch (ComunicacaoException ex)
+ {
+ //Faça o tratamento de contingência OffLine aqui.
+ throw ex;
+ }
+ catch (ValidacaoSchemaException ex)
+ {
+ throw ex;
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+
+ private static async Task CarregarNSUs()
+ {
+ try
+ {
+ Console.WriteLine("Informe o ultimo número de NSU que você tem. Se não tiver, informe 0 (zero):");
+ string ultimoNsu = Console.ReadLine();
+
+ Console.WriteLine("Informe a UF do autor");
+ string uf = Console.ReadLine();
+
+ do
+ {
+ RetornoNfeDistDFeInt retornoNFeDistDFe = null;
+ using (var _certificado = CertificadoDigital.ObterCertificado(_configuracoes.CfgServico.Certificado))
+ using (var servicoNFe = new ServicosNFe(_configuracoes.CfgServico, _certificado))
+ retornoNFeDistDFe = servicoNFe.NfeDistDFeInteresse(ufAutor: _configuracoes.Emitente.enderEmit.UF.ToString(),
+ documento: _configuracoes.Emitente.CNPJ,
+ ultNSU: ultimoNsu.ToString());
+
+ var lote = retornoNFeDistDFe.Retorno.loteDistDFeInt;
+ if (lote == null || !lote.Any())
+ break;
+
+ Console.WriteLine($"{"NSU".PadRight(44, ' ')} | Xml");
+
+ foreach (var item in lote)
+ {
+ string linha = string.Empty;
+
+ string xmlStr = string.Empty;
+
+ if (item.XmlNfe != null)
+ {
+ xmlStr = Compressao.Unzip(item.XmlNfe);
+
+ Console.WriteLine($"{item.NSU.ToString().PadRight(44, ' ')} | {xmlStr}");
+ }
+ }
+
+ await Task.Delay(2000); //https://github.com/ZeusAutomacao/DFe.NET/issues/568#issuecomment-339862458
+
+ } while (true);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+
+ private static async Task ManifestarCienciaOperacao()
+ {
+ try
+ {
+ Console.WriteLine("Informe a chave da NFe para download:");
+ string chave = Console.ReadLine();
+
+ using (var _certificado = CertificadoDigital.ObterCertificado(_configuracoes.CfgServico.Certificado))
+ using (var servicoNFe = new ServicosNFe(_configuracoes.CfgServico, _certificado))
+ {
+ var retornoManifestacao = servicoNFe.RecepcaoEventoManifestacaoDestinatario(idlote: 1,
+ sequenciaEvento: 1,
+ chavesNFe: new string[] { chave },
+ nFeTipoEventoManifestacaoDestinatario: NFeTipoEvento.TeMdCienciaDaEmissao,
+ cpfcnpj: _configuracoes.Emitente.CNPJ,
+ justificativa: null);
+
+ Console.WriteLine($"Retorno da manifestação: {retornoManifestacao.RetornoStr}");
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+
+ private static async Task DownloadXml()
+ {
+ try
+ {
+ Console.WriteLine("Informe a chave da NFe para download:");
+ string chave = Console.ReadLine();
+
+ Console.WriteLine("Deseja manifestar a NFe? (S/N)");
+ bool manifestar = string.Equals(Console.ReadLine().Trim().ToLower(), "s");
+
+
+ using (var _certificado = CertificadoDigital.ObterCertificado(_configuracoes.CfgServico.Certificado))
+ using (var servicoNFe = new ServicosNFe(_configuracoes.CfgServico, _certificado))
+ {
+ if (manifestar)
+ {
+ try
+ {
+ var retornoManifestacao = servicoNFe.RecepcaoEventoManifestacaoDestinatario(idlote: 1,
+ sequenciaEvento: 1,
+ chavesNFe: new string[] { chave },
+ nFeTipoEventoManifestacaoDestinatario: NFeTipoEvento.TeMdCienciaDaEmissao,
+ cpfcnpj: _configuracoes.Emitente.CNPJ,
+ justificativa: null);
+
+ Console.WriteLine($"Retorno da manifestação: {retornoManifestacao.RetornoStr}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"Manifestação: {ex.Message}");
+ }
+ }
+
+ var retornoNFeDistDFe = servicoNFe.NfeDistDFeInteresse(ufAutor: _configuracoes.Emitente.enderEmit.UF.ToString(), documento: _configuracoes.Emitente.CNPJ, chNFE: chave);
+ if (retornoNFeDistDFe.Retorno.loteDistDFeInt == null)
+ {
+ await Task.Delay(2000); //https://github.com/ZeusAutomacao/DFe.NET/issues/568#issuecomment-339862458
+
+ retornoNFeDistDFe = servicoNFe.NfeDistDFeInteresse(ufAutor: _configuracoes.Emitente.enderEmit.UF.ToString(), documento: _configuracoes.Emitente.CNPJ, chNFE: chave);
+
+ if (retornoNFeDistDFe.Retorno.loteDistDFeInt == null)
+ throw new Exception(retornoNFeDistDFe.Retorno.xMotivo);
+ }
+
+ if ((retornoNFeDistDFe.Retorno.loteDistDFeInt.Count()) > 0)
+ {
+ var xmlBytes = retornoNFeDistDFe.Retorno.loteDistDFeInt[0].XmlNfe;
+ string xmlStr = Compressao.Unzip(xmlBytes);
+
+ Console.WriteLine($"Xml: {xmlStr}");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+
+ #endregion
+
+ #region Funcoes Auxiliares
+
+ private static void OnSucessoSync(RetornoBasico e)
+ {
+ Console.Clear();
+ if (!string.IsNullOrEmpty(e.EnvioStr))
+ {
+ Console.WriteLine("Xml Envio:");
+ Console.WriteLine(FormatXml(e.EnvioStr) + "\n");
+ }
+
+ if (!string.IsNullOrEmpty(e.RetornoStr))
+ {
+ Console.WriteLine("Xml Retorno:");
+ Console.WriteLine(FormatXml(e.RetornoStr) + "\n");
+ }
+
+ if (!string.IsNullOrEmpty(e.RetornoCompletoStr))
+ {
+ Console.WriteLine("Xml Retorno Completo:");
+ Console.WriteLine(FormatXml(e.RetornoCompletoStr) + "\n");
+ }
+ Console.ReadKey();
+ }
+
+ private static string FormatXml(string xml)
+ {
+ try
+ {
+ XDocument doc = XDocument.Parse(xml);
+ return doc.ToString();
+ }
+ catch (Exception)
+ {
+ return xml;
+ }
+ }
+
+ #endregion
+
+ #region Criar NFe
+
+ private static Classes.NFe GetNf(int numero, ModeloDocumento modelo, VersaoServico versao)
+ {
+ Classes.NFe nf = new Classes.NFe { infNFe = GetInf(numero, modelo, versao) };
+ return nf;
+ }
+
+ private static infNFe GetInf(int numero, ModeloDocumento modelo, VersaoServico versao)
+ {
+ infNFe infNFe = new infNFe
+ {
+ versao = versao.VersaoServicoParaString(),
+ ide = GetIdentificacao(numero, modelo, versao),
+ emit = GetEmitente(),
+ dest = GetDestinatario(versao, modelo),
+ transp = GetTransporte()
+ };
+
+ for (int i = 0; i < 5; i++)
+ {
+ infNFe.det.Add(GetDetalhe(i, infNFe.emit.CRT, modelo));
+ }
+
+ infNFe.total = GetTotal(versao, infNFe.det);
+
+ if (infNFe.ide.mod == ModeloDocumento.NFe & (versao == VersaoServico.Versao310 || versao == VersaoServico.Versao400))
+ {
+ infNFe.cobr = GetCobranca(infNFe.total.ICMSTot); //V3.00 e 4.00 Somente
+ }
+
+ if (infNFe.ide.mod == ModeloDocumento.NFCe || (infNFe.ide.mod == ModeloDocumento.NFe & versao == VersaoServico.Versao400))
+ {
+ infNFe.pag = GetPagamento(infNFe.total.ICMSTot, versao); //NFCe Somente
+ }
+
+ if (infNFe.ide.mod == ModeloDocumento.NFCe & versao != VersaoServico.Versao400)
+ {
+ infNFe.infAdic = new infAdic() { infCpl = "Troco: 10,00" }; //Susgestão para impressão do troco em NFCe
+ }
+
+ return infNFe;
+ }
+
+ private static ide GetIdentificacao(int numero, ModeloDocumento modelo, VersaoServico versao)
+ {
+ ide ide = new ide
+ {
+ cUF = _configuracoes.EnderecoEmitente.UF,
+ natOp = "VENDA",
+ mod = modelo,
+ serie = 1,
+ nNF = numero,
+ tpNF = TipoNFe.tnSaida,
+ cMunFG = _configuracoes.EnderecoEmitente.cMun,
+ tpEmis = _configuracoes.CfgServico.tpEmis,
+ tpImp = TipoImpressao.tiRetrato,
+ cNF = "1234",
+ tpAmb = _configuracoes.CfgServico.tpAmb,
+ finNFe = FinalidadeNFe.fnNormal,
+ verProc = "3.000"
+ };
+
+ if (ide.tpEmis != TipoEmissao.teNormal)
+ {
+ ide.dhCont = DateTime.Now;
+ ide.xJust = "TESTE DE CONTIGÊNCIA PARA NFe/NFCe";
+ }
+
+ #region V2.00
+
+ if (versao == VersaoServico.Versao200)
+ {
+ ide.dEmi = DateTime.Today; //Mude aqui para enviar a nfe vinculada ao EPEC, V2.00
+ ide.dSaiEnt = DateTime.Today;
+ }
+
+ #endregion
+
+ #region V3.00
+
+ if (versao == VersaoServico.Versao200)
+ {
+ return ide;
+ }
+
+ if (versao == VersaoServico.Versao310)
+ {
+ ide.indPag = IndicadorPagamento.ipVista;
+ }
+
+
+ ide.idDest = DestinoOperacao.doInterna;
+ ide.dhEmi = DateTime.Now;
+ //Mude aqui para enviar a nfe vinculada ao EPEC, V3.10
+ if (ide.mod == ModeloDocumento.NFe)
+ {
+ ide.dhSaiEnt = DateTime.Now;
+ }
+ else
+ {
+ ide.tpImp = TipoImpressao.tiNFCe;
+ }
+
+ ide.procEmi = ProcessoEmissao.peAplicativoContribuinte;
+ ide.indFinal = ConsumidorFinal.cfConsumidorFinal; //NFCe: Tem que ser consumidor Final
+ ide.indPres = PresencaComprador.pcPresencial; //NFCe: deve ser 1 ou 4
+
+ #endregion
+
+ return ide;
+ }
+
+ private static emit GetEmitente()
+ {
+ var emit = _configuracoes.Emitente; // new emit
+ //{
+ // //CPF = "12345678912",
+ // CNPJ = "12345678000189",
+ // xNome = "RAZAO SOCIAL LTDA",
+ // xFant = "FANTASIA LTRA",
+ // IE = "123456789",
+ //};
+ emit.enderEmit = GetEnderecoEmitente();
+ return emit;
+ }
+
+ private static enderEmit GetEnderecoEmitente()
+ {
+ var enderEmit = _configuracoes.EnderecoEmitente; // new enderEmit
+ //{
+ // xLgr = "RUA TESTE DE ENREREÇO",
+ // nro = "123",
+ // xCpl = "1 ANDAR",
+ // xBairro = "CENTRO",
+ // cMun = 2802908,
+ // xMun = "ITABAIANA",
+ // UF = "SE",
+ // CEP = 49500000,
+ // fone = 79123456789
+ //};
+ enderEmit.cPais = 1058;
+ enderEmit.xPais = "BRASIL";
+ return enderEmit;
+ }
+
+ private static dest GetDestinatario(VersaoServico versao, ModeloDocumento modelo)
+ {
+ dest dest = new dest(versao)
+ {
+ 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.enderDest = GetEnderecoDestinatario(); //Obrigatório para NFe e opcional para NFCe
+
+ //if (versao == VersaoServico.Versao200)
+ // dest.IE = "ISENTO";
+ if (versao == VersaoServico.Versao200)
+ {
+ return dest;
+ }
+
+ dest.indIEDest = indIEDest.NaoContribuinte; //NFCe: Tem que ser não contribuinte V3.00 Somente
+ dest.email = "teste@gmail.com"; //V3.00 Somente
+ return dest;
+ }
+
+ private static enderDest GetEnderecoDestinatario()
+ {
+ enderDest enderDest = new enderDest
+ {
+ xLgr = "RUA ...",
+ nro = "S/N",
+ xBairro = "CENTRO",
+ cMun = 2802908,
+ xMun = "ITABAIANA",
+ UF = "SE",
+ CEP = "49500000",
+ cPais = 1058,
+ xPais = "BRASIL"
+ };
+ return enderDest;
+ }
+
+ private static det GetDetalhe(int i, CRT crt, ModeloDocumento modelo)
+ {
+ det det = new det
+ {
+ nItem = i + 1,
+ prod = GetProduto(i + 1),
+ imposto = new imposto
+ {
+ vTotTrib = 0.17m,
+
+ ICMS = new ICMS
+ {
+ //Se você já tem os dados de toda a tributação persistida no banco em uma única tabela, utilize a linha comentada abaixo para preencher as tags do ICMS
+ //TipoICMS = ObterIcmsBasico(crt),
+
+ //Caso você resolva utilizar método ObterIcmsBasico(), comente esta proxima linha
+ TipoICMS =
+ crt == CRT.SimplesNacional
+ ? InformarCSOSN(Csosnicms.Csosn102)
+ : InformarICMS(Csticms.Cst00, VersaoServico.Versao310)
+ },
+
+ //ICMSUFDest = new ICMSUFDest()
+ //{
+ // pFCPUFDest = 0,
+ // pICMSInter = 12,
+ // pICMSInterPart = 0,
+ // pICMSUFDest = 0,
+ // vBCUFDest = 0,
+ // vFCPUFDest = 0,
+ // vICMSUFDest = 0,
+ // vICMSUFRemet = 0
+ //},
+
+ COFINS = new COFINS
+ {
+ //Se você já tem os dados de toda a tributação persistida no banco em uma única tabela, utilize a linha comentada abaixo para preencher as tags do COFINS
+ //TipoCOFINS = ObterCofinsBasico(),
+
+ //Caso você resolva utilizar método ObterCofinsBasico(), comente esta proxima linha
+ TipoCOFINS = new COFINSOutr { CST = CSTCOFINS.cofins99, pCOFINS = 0, vBC = 0, vCOFINS = 0 }
+ },
+
+ PIS = new PIS
+ {
+ //Se você já tem os dados de toda a tributação persistida no banco em uma única tabela, utilize a linha comentada abaixo para preencher as tags do PIS
+ //TipoPIS = ObterPisBasico(),
+
+ //Caso você resolva utilizar método ObterPisBasico(), comente esta proxima linha
+ TipoPIS = new PISOutr { CST = CSTPIS.pis99, pPIS = 0, vBC = 0, vPIS = 0 }
+ }
+ }
+ };
+
+ if (modelo == ModeloDocumento.NFe) //NFCe não aceita grupo "IPI"
+ {
+ det.imposto.IPI = new IPI()
+ {
+ cEnq = 999,
+
+ //Se você já tem os dados de toda a tributação persistida no banco em uma única tabela, utilize a linha comentada abaixo para preencher as tags do IPI
+ //TipoIPI = ObterIPIBasico(),
+
+ //Caso você resolva utilizar método ObterIPIBasico(), comente esta proxima linha
+ TipoIPI = new IPITrib() { CST = CSTIPI.ipi00, pIPI = 5, vBC = 1, vIPI = 0.05m }
+ };
+ }
+
+ //det.impostoDevol = new impostoDevol() { IPI = new IPIDevolvido() { vIPIDevol = 10 }, pDevol = 100 };
+
+ return det;
+ }
+
+ private static prod GetProduto(int i)
+ {
+ prod p = new prod
+ {
+ cProd = i.ToString().PadLeft(5, '0'),
+ cEAN = "7770000000012",
+ xProd = i == 1 ? "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL" : "ABRACADEIRA NYLON 6.6 BRANCA 91X92 " + i,
+ NCM = "84159090",
+ CFOP = 5102,
+ uCom = "UNID",
+ qCom = 1,
+ vUnCom = 1.1m,
+ vProd = 1.1m,
+ vDesc = 0.10m,
+ cEANTrib = "7770000000012",
+ uTrib = "UNID",
+ qTrib = 1,
+ vUnTrib = 1.1m,
+ indTot = IndicadorTotal.ValorDoItemCompoeTotalNF,
+ //NVE = {"AA0001", "AB0002", "AC0002"},
+ //CEST = ?
+
+ //ProdutoEspecifico = new arma
+ //{
+ // tpArma = TipoArma.UsoPermitido,
+ // nSerie = "123456",
+ // nCano = "123456",
+ // descr = "TESTE DE ARMA"
+ //}
+ };
+ return p;
+ }
+
+ private static ICMSBasico InformarICMS(Csticms CST, VersaoServico versao)
+ {
+ ICMS20 icms20 = new ICMS20
+ {
+ orig = OrigemMercadoria.OmNacional,
+ CST = Csticms.Cst20,
+ modBC = DeterminacaoBaseIcms.DbiValorOperacao,
+ vBC = 1.1m,
+ pICMS = 18,
+ vICMS = 0.20m,
+ motDesICMS = MotivoDesoneracaoIcms.MdiTaxi
+ };
+ if (versao == VersaoServico.Versao310)
+ {
+ icms20.vICMSDeson = 0.10m; //V3.00 ou maior Somente
+ }
+
+ switch (CST)
+ {
+ case Csticms.Cst00:
+ return new ICMS00
+ {
+ CST = Csticms.Cst00,
+ modBC = DeterminacaoBaseIcms.DbiValorOperacao,
+ orig = OrigemMercadoria.OmNacional,
+ pICMS = 18,
+ vBC = 1.1m,
+ vICMS = 0.20m
+ };
+ case Csticms.Cst20:
+ return icms20;
+ //Outros casos aqui
+ }
+
+ return new ICMS10();
+ }
+
+ private static ICMSBasico ObterIcmsBasico(CRT crt)
+ {
+ //Leia os dados de seu banco de dados e em seguida alimente o objeto ICMSGeral, como no exemplo abaixo.
+ ICMSGeral icmsGeral = new ICMSGeral
+ {
+ orig = OrigemMercadoria.OmNacional,
+ CST = Csticms.Cst00,
+ modBC = DeterminacaoBaseIcms.DbiValorOperacao,
+ vBC = 1.1m,
+ pICMS = 18,
+ vICMS = 0.20m,
+ motDesICMS = MotivoDesoneracaoIcms.MdiTaxi
+ };
+ return icmsGeral.ObterICMSBasico(crt);
+ }
+
+ private static PISBasico ObterPisBasico()
+ {
+ //Leia os dados de seu banco de dados e em seguida alimente o objeto PISGeral, como no exemplo abaixo.
+ PISGeral pisGeral = new PISGeral()
+ {
+ CST = CSTPIS.pis01,
+ vBC = 1.1m,
+ pPIS = 1.65m,
+ vPIS = 0.01m,
+ vAliqProd = 0
+ };
+
+ return pisGeral.ObterPISBasico();
+ }
+
+ private static COFINSBasico ObterCofinsBasico()
+ {
+ //Leia os dados de seu banco de dados e em seguida alimente o objeto COFINSGeral, como no exemplo abaixo.
+ COFINSGeral cofinsGeral = new COFINSGeral()
+ {
+ CST = CSTCOFINS.cofins01,
+ vBC = 1.1m,
+ pCOFINS = 1.65m,
+ vCOFINS = 0.01m,
+ vAliqProd = 0
+ };
+
+ return cofinsGeral.ObterCOFINSBasico();
+ }
+
+ private static IPIBasico ObterIPIBasico()
+ {
+ //Leia os dados de seu banco de dados e em seguida alimente o objeto IPIGeral, como no exemplo abaixo.
+ IPIGeral ipiGeral = new IPIGeral()
+ {
+ CST = CSTIPI.ipi01,
+ vBC = 1.1m,
+ pIPI = 5m,
+ vIPI = 0.05m
+ };
+
+ return ipiGeral.ObterIPIBasico();
+ }
+
+ private static ICMSBasico InformarCSOSN(Csosnicms CST)
+ {
+ switch (CST)
+ {
+ case Csosnicms.Csosn101:
+ return new ICMSSN101
+ {
+ CSOSN = Csosnicms.Csosn101,
+ orig = OrigemMercadoria.OmNacional
+ };
+ case Csosnicms.Csosn102:
+ return new ICMSSN102
+ {
+ CSOSN = Csosnicms.Csosn102,
+ orig = OrigemMercadoria.OmNacional
+ };
+ //Outros casos aqui
+ default:
+ return new ICMSSN201();
+ }
+ }
+
+ private static total GetTotal(VersaoServico versao, List produtos)
+ {
+ ICMSTot icmsTot = new ICMSTot
+ {
+ vProd = produtos.Sum(p => p.prod.vProd),
+ vDesc = produtos.Sum(p => p.prod.vDesc ?? 0),
+ vTotTrib = produtos.Sum(p => p.imposto.vTotTrib ?? 0),
+ };
+
+ if (versao == VersaoServico.Versao310 || versao == VersaoServico.Versao400)
+ {
+ icmsTot.vICMSDeson = 0;
+ }
+
+ if (versao == VersaoServico.Versao400)
+ {
+ icmsTot.vFCPUFDest = 0;
+ icmsTot.vICMSUFDest = 0;
+ icmsTot.vICMSUFRemet = 0;
+ icmsTot.vFCP = 0;
+ icmsTot.vFCPST = 0;
+ icmsTot.vFCPSTRet = 0;
+ icmsTot.vIPIDevol = 0;
+ }
+
+ foreach (var produto in produtos)
+ {
+ if (produto.imposto.IPI != null && produto.imposto.IPI.TipoIPI.GetType() == typeof(IPITrib))
+ {
+ icmsTot.vIPI = icmsTot.vIPI + ((IPITrib)produto.imposto.IPI.TipoIPI).vIPI ?? 0;
+ }
+
+ if (produto.imposto.ICMS.TipoICMS.GetType() == typeof(ICMS00))
+ {
+ icmsTot.vBC = icmsTot.vBC + ((ICMS00)produto.imposto.ICMS.TipoICMS).vBC;
+ icmsTot.vICMS = icmsTot.vICMS + ((ICMS00)produto.imposto.ICMS.TipoICMS).vICMS;
+ }
+ if (produto.imposto.ICMS.TipoICMS.GetType() == typeof(ICMS20))
+ {
+ icmsTot.vBC = icmsTot.vBC + ((ICMS20)produto.imposto.ICMS.TipoICMS).vBC;
+ icmsTot.vICMS = icmsTot.vICMS + ((ICMS20)produto.imposto.ICMS.TipoICMS).vICMS;
+ }
+ //Outros Ifs aqui, caso vá usar as classes ICMS00, ICMS10 para totalizar
+ }
+
+ //** Regra de validação W16-10 que rege sobre o Total da NF **//
+ icmsTot.vNF =
+ icmsTot.vProd
+ - icmsTot.vDesc
+ - icmsTot.vICMSDeson.GetValueOrDefault()
+ + icmsTot.vST
+ + icmsTot.vFCPST.GetValueOrDefault()
+ + icmsTot.vFrete
+ + icmsTot.vSeg
+ + icmsTot.vOutro
+ + icmsTot.vII
+ + icmsTot.vIPI
+ + icmsTot.vIPIDevol.GetValueOrDefault();
+
+ total t = new total { ICMSTot = icmsTot };
+ return t;
+ }
+
+ private static transp GetTransporte()
+ {
+ //var volumes = new List {GetVolume(), GetVolume()};
+
+ transp t = new transp
+ {
+ modFrete = ModalidadeFrete.mfSemFrete //NFCe: Não pode ter frete
+ //vol = volumes
+ };
+
+ return t;
+ }
+
+ private static vol GetVolume()
+ {
+ vol v = new vol
+ {
+ esp = "teste de espécie",
+ lacres = new List { new lacres { nLacre = "123456" } }
+ };
+
+ return v;
+ }
+
+ private static cobr GetCobranca(ICMSTot icmsTot)
+ {
+ decimal valorParcela = (icmsTot.vNF / 2).Arredondar(2);
+ cobr c = new cobr
+ {
+ fat = new fat { nFat = "12345678910", vLiq = icmsTot.vNF, vOrig = icmsTot.vNF, vDesc = 0m },
+ dup = new List
+ {
+ new dup {nDup = "001", dVenc = DateTime.Now.AddDays(30), vDup = valorParcela},
+ new dup {nDup = "002", dVenc = DateTime.Now.AddDays(60), vDup = icmsTot.vNF - valorParcela}
+ }
+ };
+
+ return c;
+ }
+
+ private static List GetPagamento(ICMSTot icmsTot, VersaoServico versao)
+ {
+ decimal valorPagto = (icmsTot.vNF / 2).Arredondar(2);
+
+ if (versao != VersaoServico.Versao400) // difernte de versão 4 retorna isso
+ {
+ List p = new List
+ {
+ new pag {tPag = FormaPagamento.fpDinheiro, vPag = valorPagto},
+ new pag {tPag = FormaPagamento.fpCheque, vPag = icmsTot.vNF - valorPagto}
+ };
+ return p;
+ }
+
+
+ // igual a versão 4 retorna isso
+ List p4 = new List
+ {
+ //new pag {detPag = new detPag {tPag = FormaPagamento.fpDinheiro, vPag = valorPagto}},
+ //new pag {detPag = new detPag {tPag = FormaPagamento.fpCheque, vPag = icmsTot.vNF - valorPagto}}
+ new pag
+ {
+ detPag = new List
+ {
+ new detPag {tPag = FormaPagamento.fpCreditoLoja, vPag = valorPagto},
+ new detPag {tPag = FormaPagamento.fpCreditoLoja, vPag = icmsTot.vNF - valorPagto}
+ }
+ }
+ };
+
+
+ return p4;
+ }
+
+
+ #endregion
+ }
+}
diff --git a/NFe.AppTeste.NetCore/Properties/Resources.Designer.cs b/NFe.AppTeste.NetCore/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..37fb9db42
--- /dev/null
+++ b/NFe.AppTeste.NetCore/Properties/Resources.Designer.cs
@@ -0,0 +1,82 @@
+//------------------------------------------------------------------------------
+//
+// O código foi gerado por uma ferramenta.
+// Versão de Tempo de Execução:4.0.30319.42000
+//
+// As alterações ao arquivo poderão causar comportamento incorreto e serão perdidas se
+// o código for gerado novamente.
+//
+//------------------------------------------------------------------------------
+
+namespace NFe.AppTeste.NetCore.Properties {
+ using System;
+
+
+ ///
+ /// Uma classe de recurso de tipo de alta segurança, para pesquisar cadeias de caracteres localizadas etc.
+ ///
+ // Essa classe foi gerada automaticamente pela classe StronglyTypedResourceBuilder
+ // através de uma ferramenta como ResGen ou Visual Studio.
+ // Para adicionar ou remover um associado, edite o arquivo .ResX e execute ResGen novamente
+ // com a opção /str, ou recrie o projeto do VS.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Retorna a instância de ResourceManager armazenada em cache usada por essa classe.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NFe.AppTeste.NetCore.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Substitui a propriedade CurrentUICulture do thread atual para todas as
+ /// pesquisas de recursos que usam essa classe de recurso de tipo de alta segurança.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Consulta uma cadeia de caracteres localizada semelhante a <html>
+ ///<h1>Nota Fiscal Eletrônica</h1>
+ ///<h2>Prezado Cliente,</h2>
+ ///<p>Segue anexo a Nota Fiscal eletrônica (xml e pdf), conforme pedido número 1234.</p>
+ ///<p>
+ ///<b>Chave de acesso:</b> 0123 4567 8901 2345 6789 0123 4567 8901 2345 6789 0123
+ ///<br><b>Número:</b> 000123456
+ ///<br><b>Valor Total:</b> 1.234,56
+ ///</p>
+ ///<p>Consulte a autencidade de sua NFe acessando <a href="http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=">Consulta NFe Completa</a> </p>
+ ///ZEUS Automação [o restante da cadeia de caracteres foi truncado]";.
+ ///
+ internal static string MensagemHtml {
+ get {
+ return ResourceManager.GetString("MensagemHtml", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/NFe.AppTeste.NetCore/Properties/Resources.resx b/NFe.AppTeste.NetCore/Properties/Resources.resx
new file mode 100644
index 000000000..e80171c29
--- /dev/null
+++ b/NFe.AppTeste.NetCore/Properties/Resources.resx
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ <html>
+<h1>Nota Fiscal Eletrônica</h1>
+<h2>Prezado Cliente,</h2>
+<p>Segue anexo a Nota Fiscal eletrônica (xml e pdf), conforme pedido número 1234.</p>
+<p>
+<b>Chave de acesso:</b> 0123 4567 8901 2345 6789 0123 4567 8901 2345 6789 0123
+<br><b>Número:</b> 000123456
+<br><b>Valor Total:</b> 1.234,56
+</p>
+<p>Consulte a autencidade de sua NFe acessando <a href="http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=">Consulta NFe Completa</a> </p>
+ZEUS Automação
+</html>
+
+
\ No newline at end of file
diff --git a/NFe.Classes.Standard/NFe.Classes.Standard.csproj b/NFe.Classes.Standard/NFe.Classes.Standard.csproj
index 9f5c4f4ab..8858f0654 100644
--- a/NFe.Classes.Standard/NFe.Classes.Standard.csproj
+++ b/NFe.Classes.Standard/NFe.Classes.Standard.csproj
@@ -4,4 +4,11 @@
netstandard2.0
+
+
+
+
+
+
+
diff --git a/NFe.Danfe.AppTeste.NetCore/ConfiguracaoConsole.cs b/NFe.Danfe.AppTeste.NetCore/ConfiguracaoConsole.cs
new file mode 100644
index 000000000..56582d337
--- /dev/null
+++ b/NFe.Danfe.AppTeste.NetCore/ConfiguracaoConsole.cs
@@ -0,0 +1,14 @@
+using NFe.Danfe.Base.NFe;
+
+namespace NFe.Danfe.AppTeste.NetCore
+{
+ public class ConfiguracaoConsole
+ {
+ public ConfiguracaoConsole()
+ {
+ ConfiguracaoDanfeNfe = new ConfiguracaoDanfeNfe();
+ }
+
+ public ConfiguracaoDanfeNfe ConfiguracaoDanfeNfe { get; set; }
+ }
+}
diff --git a/NFe.Danfe.AppTeste.NetCore/Funcoes.cs b/NFe.Danfe.AppTeste.NetCore/Funcoes.cs
new file mode 100644
index 000000000..408aba480
--- /dev/null
+++ b/NFe.Danfe.AppTeste.NetCore/Funcoes.cs
@@ -0,0 +1,60 @@
+using System;
+using System.IO;
+
+namespace NFe.Danfe.AppTeste.NetCore
+{
+ public static class Funcoes
+ {
+ ///
+ /// Abre busca de arquivo xml com os dados passados no parâmetro
+ ///
+ /// Nome e caminho do arquivo mais caminho digitado pelo usuário
+ public static string BuscarArquivoXml(string caminho)
+ {
+ var caminhoArquivo = ArrumaCaminho(caminho);
+
+ if (!caminho.EndsWith(".xml"))
+ {
+ throw new Exception("Caminho do arquivo precisa terminar com .xml");
+ }
+
+ if (!File.Exists(caminho))
+ {
+ throw new Exception("Caminho do arquivo incorreto! Arquivo não foi encontrado.");
+ }
+
+ return File.ReadAllText(caminho);
+ }
+
+ ///
+ /// Gera um arquivo através do caminho do arquivo xml passado anteriormente (.xml)
+ ///
+ /// Nome e caminho do arquivo do xml encontrado anteriormente
+ public static void SalvaArquivoGerado(string caminhoXmlAnterior, string extensao, byte[] bytes)
+ {
+ //caso você chegou até aqui se perguntando de o que fazer com o array de bytes, para exemplos com aspnet core e outras plataformas, de como retornar os bytes para o client:
+ //https://github.com/FastReports/FastReport/blob/master/Demos/OpenSource/FastReport.OpenSource.Web.Vue/Controllers/ReportsController.cs
+
+ var caminhoArquivo = Path.GetDirectoryName(ArrumaCaminho(caminhoXmlAnterior)) + "/generated" + DateTime.Now.ToString("ddMMyyyy_HHmmss") + extensao;
+ File.WriteAllBytes(caminhoArquivo, bytes);
+
+ Console.Clear();
+ Console.WriteLine("Arquivo gerado em: " + caminhoArquivo + " \n Digite algo para continuar...");
+ Console.ReadKey();
+ }
+
+ ///
+ /// Arruma o path caso tenha sido escrito incorretamente
+ ///
+ /// Caminho do arquivo + pastas
+ ///
+ private static string ArrumaCaminho(string caminho)
+ {
+ caminho = caminho.Replace(@"/", @"\");
+ caminho = caminho.Replace(@"\\", @"\");
+ caminho = caminho.Replace("\"", ""); //remove "
+ caminho = caminho.Replace("\'", ""); //remove '
+ return caminho;
+ }
+ }
+}
diff --git a/NFe.Danfe.AppTeste.NetCore/NFe.Danfe.AppTeste.NetCore.csproj b/NFe.Danfe.AppTeste.NetCore/NFe.Danfe.AppTeste.NetCore.csproj
new file mode 100644
index 000000000..bfdb5de9d
--- /dev/null
+++ b/NFe.Danfe.AppTeste.NetCore/NFe.Danfe.AppTeste.NetCore.csproj
@@ -0,0 +1,17 @@
+
+
+
+ Exe
+ netcoreapp2.2
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/NFe.Danfe.AppTeste.NetCore/Program.cs b/NFe.Danfe.AppTeste.NetCore/Program.cs
new file mode 100644
index 000000000..06bcd1c76
--- /dev/null
+++ b/NFe.Danfe.AppTeste.NetCore/Program.cs
@@ -0,0 +1,354 @@
+using DFe.Classes.Flags;
+using DFe.Utils;
+using NFe.Classes;
+using NFe.Classes.Servicos.Consulta;
+using NFe.Danfe.Base.NFe;
+using NFe.Danfe.Fast.Standard.NFe;
+using NFe.Utils.NFe;
+using System;
+using System.IO;
+using System.Reflection;
+using System.Threading.Tasks;
+
+namespace NFe.Danfe.AppTeste.NetCore
+{
+ internal class Program
+ {
+ #region Console
+ private const string ArquivoConfiguracao = @"\configuracao.xml";
+ private static ConfiguracaoConsole _configuracoes;
+
+ private static void Main(string[] args)
+ {
+ Console.WriteLine("Bem vindo aos teste de Danfe no projeto NF-e com suporte ao NetStandard 2.0!");
+ Console.WriteLine("Este exemplo necessita do arquivo Configuração.xml já criado.");
+ Console.WriteLine("Caso necessite criar, utilize o app 'NFe.Danfe.AppTeste'. e clique em 'Salvar Configuração para Arquivo'");
+ Console.WriteLine("Em seguida copie o 'configuração.xml' para a pasta bin\\Debug\\netcoreapp2.2 deste projeto.\n");
+ Console.ReadKey();
+
+ //inicializa configuracoes bases (podem ser carregadas novas aqui posteriormente com a opção 99)
+ _configuracoes = new ConfiguracaoConsole();
+
+ Menu();
+ }
+
+ private static async void Menu()
+ {
+ while (true)
+ {
+ try
+ {
+ Console.Clear();
+ Console.WriteLine("Escolha uma das opções abaixo:");
+ Console.WriteLine("0 - Sair");
+ Console.WriteLine("1 - Gerar Danfe PDF");
+ Console.WriteLine("2 - Gerar Danfe HTML");
+ Console.WriteLine("3 - Gerar Danfe Image PNG");
+ Console.WriteLine("4 - Gerar Danfe(Evento) PDF");
+ Console.WriteLine("5 - Gerar Danfe(Evento) HTML");
+ Console.WriteLine("6 - Gerar Danfe(Evento) Image PNG");
+ Console.WriteLine($"99 - Carrega Configuracoes do arquivo {ArquivoConfiguracao}");
+
+ string option = Console.ReadLine();
+ Console.WriteLine();
+ Console.Clear();
+ Console.WriteLine("Aguarde... ");
+
+ switch (Convert.ToInt32(option))
+ {
+ case 0:
+ return;
+ case 1:
+ await GerarDanfePdf();
+ break;
+ case 2:
+ await GerarDanfeHtml();
+ break;
+ case 3:
+ await GerarDanfePng();
+ break;
+ case 4:
+ await GerarDanfeEventoPdf();
+ break;
+ case 5:
+ await GerarDanfeEventoHtml();
+ break;
+ case 6:
+ await GerarDanfeEventoPng();
+ break;
+ case 99:
+ await CarregarConfiguracao();
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ Console.Clear();
+ Console.WriteLine(e);
+ Console.WriteLine("Digite algo para continuar...");
+ Console.ReadKey();
+ }
+ }
+ }
+
+ private static async Task CarregarConfiguracao()
+ {
+ string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+
+ try
+ {
+ _configuracoes = !File.Exists(path + ArquivoConfiguracao)
+ ? new ConfiguracaoConsole()
+ : FuncoesXml.ArquivoXmlParaClasse(path + ArquivoConfiguracao);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+
+ #endregion
+
+
+
+ #region NFe
+
+ private static async Task GerarDanfePdf()
+ {
+ Console.WriteLine(@"Digite o caminho do .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ string caminho = Console.ReadLine();
+
+ //busca arquivo xml
+ string xml = Funcoes.BuscarArquivoXml(caminho);
+
+ using (MemoryStream stream = new MemoryStream()) // Create a stream for the report
+ {
+ try
+ {
+ var report = GeraClasseDanfeFrNFe(xml);
+ byte[] bytes = report.ExportarPdf();
+ Funcoes.SalvaArquivoGerado(caminho, ".pdf", bytes);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+ }
+
+ private static async Task GerarDanfeHtml()
+ {
+ Console.WriteLine(@"Digite o caminho do .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ string caminho = Console.ReadLine();
+
+ //busca arquivo xml
+ string xml = Funcoes.BuscarArquivoXml(caminho);
+
+ using (MemoryStream stream = new MemoryStream()) // Create a stream for the report
+ {
+ try
+ {
+ var report = GeraClasseDanfeFrNFe(xml);
+ byte[] bytes = report.ExportarHtml();
+ Funcoes.SalvaArquivoGerado(caminho, ".html", bytes);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+ }
+
+ private static async Task GerarDanfePng()
+ {
+ Console.WriteLine(@"Digite o caminho do .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ string caminho = Console.ReadLine();
+
+ //busca arquivo xml
+ string xml = Funcoes.BuscarArquivoXml(caminho);
+
+ using (MemoryStream stream = new MemoryStream()) // Create a stream for the report
+ {
+ try
+ {
+ var report = GeraClasseDanfeFrNFe(xml);
+ byte[] bytes = report.ExportarPng();
+ Funcoes.SalvaArquivoGerado(caminho, ".png", bytes);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+ }
+
+ private static DanfeFrNfe GeraClasseDanfeFrNFe(string xml)
+ {
+ var configuracaoDanfeNfe = _configuracoes.ConfiguracaoDanfeNfe;
+ try
+ {
+ #region Carrega um XML com nfeProc para a variável
+ nfeProc proc = null;
+ try
+ {
+ proc = new nfeProc().CarregarDeXmlString(xml);
+ }
+ catch //Carregar NFe ainda não transmitida à sefaz, como uma pré-visualização.
+ {
+ proc = new nfeProc() { NFe = new Classes.NFe().CarregarDeXmlString(xml), protNFe = new Classes.Protocolo.protNFe() };
+ }
+
+ if (proc.NFe.infNFe.ide.mod != ModeloDocumento.NFe)
+ {
+ throw new Exception("O XML informado não é um NFe!");
+ }
+ #endregion
+
+ DanfeFrNfe danfe = new DanfeFrNfe(proc: proc, configuracaoDanfeNfe: new ConfiguracaoDanfeNfe()
+ {
+ Logomarca = configuracaoDanfeNfe.Logomarca,
+ DuasLinhas = false,
+ DocumentoCancelado = false,
+ QuebrarLinhasObservacao = configuracaoDanfeNfe.QuebrarLinhasObservacao,
+ ExibirResumoCanhoto = configuracaoDanfeNfe.ExibirResumoCanhoto,
+ ResumoCanhoto = configuracaoDanfeNfe.ResumoCanhoto,
+ ChaveContingencia = configuracaoDanfeNfe.ChaveContingencia,
+ ExibeCampoFatura = configuracaoDanfeNfe.ExibeCampoFatura,
+ ImprimirISSQN = configuracaoDanfeNfe.ImprimirISSQN,
+ ImprimirDescPorc = configuracaoDanfeNfe.ImprimirDescPorc,
+ ImprimirTotalLiquido = configuracaoDanfeNfe.ImprimirTotalLiquido,
+ ImprimirUnidQtdeValor = configuracaoDanfeNfe.ImprimirUnidQtdeValor,
+ ExibirTotalTributos = configuracaoDanfeNfe.ExibirTotalTributos
+ },
+ desenvolvedor: "NOME DA SOFTWARE HOUSE",
+ arquivoRelatorio: string.Empty);
+
+ return danfe;
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+
+ #endregion
+
+ #region NFe Evento
+
+ private static async Task GerarDanfeEventoPdf()
+ {
+ Console.WriteLine(@"Digite o caminho do .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ string caminho = Console.ReadLine();
+ Console.Clear();
+ string xml = Funcoes.BuscarArquivoXml(caminho);
+
+ Console.WriteLine(@"Digite o caminho do evento .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ caminho = Console.ReadLine();
+ Console.Clear();
+ string xmlEvento = Funcoes.BuscarArquivoXml(caminho);
+
+ using (MemoryStream stream = new MemoryStream()) // Create a stream for the report
+ {
+ try
+ {
+ var report = GeraClasseDanfeFrEvento(xml, xmlEvento);
+ byte[] bytes = report.ExportarPdf();
+ Funcoes.SalvaArquivoGerado(caminho, ".pdf", bytes);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+ }
+
+ private static async Task GerarDanfeEventoHtml()
+ {
+ Console.WriteLine(@"Digite o caminho do .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ string caminho = Console.ReadLine();
+ Console.Clear();
+ string xml = Funcoes.BuscarArquivoXml(caminho);
+
+ Console.WriteLine(@"Digite o caminho do evento .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ caminho = Console.ReadLine();
+ Console.Clear();
+ string xmlEvento = Funcoes.BuscarArquivoXml(caminho);
+
+ using (MemoryStream stream = new MemoryStream()) // Create a stream for the report
+ {
+ try
+ {
+ var report = GeraClasseDanfeFrEvento(xml, xmlEvento);
+ byte[] bytes = report.ExportarHtml();
+ Funcoes.SalvaArquivoGerado(caminho, ".html", bytes);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+ }
+
+ private static async Task GerarDanfeEventoPng()
+ {
+ Console.WriteLine(@"Digite o caminho do .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ string caminho = Console.ReadLine();
+ Console.Clear();
+ string xml = Funcoes.BuscarArquivoXml(caminho);
+
+ Console.WriteLine(@"Digite o caminho do evento .xml (ex: C:\arquivos\35199227357619000192550010090001111381546999.xml):");
+ caminho = Console.ReadLine();
+ Console.Clear();
+ string xmlEvento = Funcoes.BuscarArquivoXml(caminho);
+
+ using (MemoryStream stream = new MemoryStream()) // Create a stream for the report
+ {
+ try
+ {
+ var report = GeraClasseDanfeFrEvento(xml, xmlEvento);
+ byte[] bytes = report.ExportarPng();
+ Funcoes.SalvaArquivoGerado(caminho, ".png", bytes);
+ }
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+ }
+ }
+
+ private static DanfeFrEvento GeraClasseDanfeFrEvento(string xml, string xmlEvento)
+ {
+ var configuracaoDanfeNfe = _configuracoes.ConfiguracaoDanfeNfe;
+
+ var proc = new nfeProc().CarregarDeXmlString(xml);
+ if (proc.NFe.infNFe.ide.mod != ModeloDocumento.NFe)
+ {
+ throw new Exception("O XML informado não é um NFe!");
+ }
+
+ var procEvento = FuncoesXml.XmlStringParaClasse(xmlEvento);
+
+ DanfeFrEvento danfe = new DanfeFrEvento(proc: proc, procEventoNFe: procEvento, configuracaoDanfeNfe: new ConfiguracaoDanfeNfe()
+ {
+ Logomarca = configuracaoDanfeNfe.Logomarca,
+ DuasLinhas = false,
+ DocumentoCancelado = false,
+ QuebrarLinhasObservacao = configuracaoDanfeNfe.QuebrarLinhasObservacao,
+ ExibirResumoCanhoto = configuracaoDanfeNfe.ExibirResumoCanhoto,
+ ResumoCanhoto = configuracaoDanfeNfe.ResumoCanhoto,
+ ChaveContingencia = configuracaoDanfeNfe.ChaveContingencia,
+ ExibeCampoFatura = configuracaoDanfeNfe.ExibeCampoFatura,
+ ImprimirISSQN = configuracaoDanfeNfe.ImprimirISSQN,
+ ImprimirDescPorc = configuracaoDanfeNfe.ImprimirDescPorc,
+ ImprimirTotalLiquido = configuracaoDanfeNfe.ImprimirTotalLiquido,
+ ImprimirUnidQtdeValor = configuracaoDanfeNfe.ImprimirUnidQtdeValor,
+ ExibirTotalTributos = configuracaoDanfeNfe.ExibirTotalTributos
+ },
+ desenvolvedor: "NOME DA SOFTWARE HOUSE");
+
+ return danfe;
+ }
+
+ #endregion
+ }
+}
diff --git a/NFe.Danfe.Base.Standard/NFe.Danfe.Base.Standard.csproj b/NFe.Danfe.Base.Standard/NFe.Danfe.Base.Standard.csproj
new file mode 100644
index 000000000..164f901c0
--- /dev/null
+++ b/NFe.Danfe.Base.Standard/NFe.Danfe.Base.Standard.csproj
@@ -0,0 +1,41 @@
+
+
+
+ netstandard2.0
+
+
+
+ TRACE;Standard
+
+
+
+ TRACE;Standard
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+
diff --git a/NFe.Danfe.Base.Standard/Properties/Resources.Designer.cs b/NFe.Danfe.Base.Standard/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..483af7360
--- /dev/null
+++ b/NFe.Danfe.Base.Standard/Properties/Resources.Designer.cs
@@ -0,0 +1,103 @@
+//------------------------------------------------------------------------------
+//
+// O código foi gerado por uma ferramenta.
+// Versão de Tempo de Execução:4.0.30319.42000
+//
+// As alterações ao arquivo poderão causar comportamento incorreto e serão perdidas se
+// o código for gerado novamente.
+//
+//------------------------------------------------------------------------------
+
+namespace NFe.Danfe.Base.Standard.Properties {
+ using System;
+
+
+ ///
+ /// Uma classe de recurso de tipo de alta segurança, para pesquisar cadeias de caracteres localizadas etc.
+ ///
+ // Essa classe foi gerada automaticamente pela classe StronglyTypedResourceBuilder
+ // através de uma ferramenta como ResGen ou Visual Studio.
+ // Para adicionar ou remover um associado, edite o arquivo .ResX e execute ResGen novamente
+ // com a opção /str, ou recrie o projeto do VS.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Retorna a instância de ResourceManager armazenada em cache usada por essa classe.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NFe.Danfe.Base.Standard.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Substitui a propriedade CurrentUICulture do thread atual para todas as
+ /// pesquisas de recursos que usam essa classe de recurso de tipo de alta segurança.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Consulta um recurso localizado do tipo System.Byte[].
+ ///
+ public static byte[] OpenSans_CondBold {
+ get {
+ object obj = ResourceManager.GetObject("OpenSans_CondBold", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Consulta um recurso localizado do tipo System.Byte[].
+ ///
+ public static byte[] OpenSans_CondLight {
+ get {
+ object obj = ResourceManager.GetObject("OpenSans_CondLight", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Consulta um recurso localizado do tipo System.Byte[].
+ ///
+ public static byte[] OpenSans_CondLightItalic {
+ get {
+ object obj = ResourceManager.GetObject("OpenSans_CondLightItalic", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Consulta um recurso localizado do tipo System.Byte[].
+ ///
+ public static byte[] UbuntuCondensed_Regular {
+ get {
+ object obj = ResourceManager.GetObject("UbuntuCondensed_Regular", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+ }
+}
diff --git a/NFe.Danfe.Base.Standard/Properties/Resources.resx b/NFe.Danfe.Base.Standard/Properties/Resources.resx
new file mode 100644
index 000000000..70eab7246
--- /dev/null
+++ b/NFe.Danfe.Base.Standard/Properties/Resources.resx
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\..\Shared.NFe.Danfe.Base\Fontes\OpenSans-CondBold.ttf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\..\Shared.NFe.Danfe.Base\Fontes\OpenSans-CondLight.ttf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\..\Shared.NFe.Danfe.Base\Fontes\OpenSans-CondLightItalic.ttf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\..\Shared.NFe.Danfe.Base\Fontes\UbuntuCondensed-Regular.ttf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/NFe.Danfe.Base/NFe.Danfe.Base.csproj b/NFe.Danfe.Base/NFe.Danfe.Base.csproj
index 4d881b478..733d49db7 100644
--- a/NFe.Danfe.Base/NFe.Danfe.Base.csproj
+++ b/NFe.Danfe.Base/NFe.Danfe.Base.csproj
@@ -39,12 +39,6 @@
-
-
-
-
-
-
True
@@ -52,26 +46,11 @@
Resources.resx
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
PublicResXFileCodeGenerator
- Resources.Designer.cs
Designer
+ Resources.Designer.cs
@@ -80,6 +59,7 @@
NFe.Utils
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\NFe\NFeEvento.frx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\NFe\NFeRetrato.frx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/NFe.Danfe.Fast/DanfeBase.cs b/NFe.Danfe.Fast/DanfeBase.cs
index 2346fbcf0..07f3db10e 100644
--- a/NFe.Danfe.Fast/DanfeBase.cs
+++ b/NFe.Danfe.Fast/DanfeBase.cs
@@ -1,34 +1,34 @@
/********************************************************************************/
/* 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) */
+/* 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 */
+/* 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 é 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) */
+/* 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: */
+/* 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 */
+/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */
/********************************************************************************/
using System.IO;
@@ -43,29 +43,29 @@ public class DanfeBase: IDanfe
public Report Relatorio { get; protected set; }
///
- /// Abre a janela de visualização do DANFE da NFCe
+ /// Abre a janela de visualização do DANFE da NFCe
///
- /// Se true, exibe a visualização em Modal. O modo modal está disponível apenas para WinForms
+ /// Se true, exibe a visualização em Modal. O modo modal está disponÃvel apenas para WinForms
public void Visualizar(bool modal = true)
{
Relatorio.Show(modal);
}
///
- /// Abre a janela de visualização do design do DANFE da NFCe.
- /// Chame esse método se desja fazer alterações no design do DANFE em modo run-time
+ /// Abre a janela de visualização do design do DANFE da NFCe.
+ /// Chame esse método se desja fazer alterações no design do DANFE em modo run-time
///
- /// Se true, exibe a visualização em Modal. O modo modal está disponível apenas para WinForms
+ /// Se true, exibe a visualização em Modal. O modo modal está disponÃvel apenas para WinForms
public void ExibirDesign(bool modal = false)
{
Relatorio.Design(modal);
}
///
- /// Envia a impressão do DANFE da NFCe diretamente para a impressora
+ /// Envia a impressão do DANFE da NFCe diretamente para a impressora
///
- /// Se true exibe o diálogo Imprimindo...
- /// Passe a string com o nome da impressora para imprimir diretamente em determinada impressora. Caso contrário, a impressão será feita na impressora que estiver como padrão
+ /// Se true exibe o diálogo Imprimindo...
+ /// Passe a string com o nome da impressora para imprimir diretamente em determinada impressora. Caso contrário, a impressão será feita na impressora que estiver como padrão
public void Imprimir(bool exibirDialogo = true, string impressora = "")
{
Relatorio.PrintSettings.ShowDialog = exibirDialogo;
diff --git a/NFe.Danfe.Fast/NFCe/DanfeFrNfce.cs b/NFe.Danfe.Fast/NFCe/DanfeFrNfce.cs
index 8abe19704..bc438dfce 100644
--- a/NFe.Danfe.Fast/NFCe/DanfeFrNfce.cs
+++ b/NFe.Danfe.Fast/NFCe/DanfeFrNfce.cs
@@ -31,21 +31,16 @@
/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */
/********************************************************************************/
-using System.IO;
-using FastReport;
-using FastReport.Barcode;
using NFe.Classes;
-using NFe.Classes.Informacoes.Identificacao.Tipos;
using NFe.Danfe.Base.NFCe;
-using NFe.Utils;
-using NFe.Utils.InformacoesSuplementares;
+using Shared.DFe.Danfe.Fast;
namespace NFe.Danfe.Fast.NFCe
{
///
/// Classe responsável pela impressão do DANFE da NFCe em Fast Reports
///
- public class DanfeFrNfce: DanfeBase
+ public class DanfeFrNfce : DanfeBase
{
///
/// Construtor da classe responsável pela impressão do DANFE da NFCe em Fast Reports
@@ -58,37 +53,7 @@ public class DanfeFrNfce: DanfeBase
/// Texto para ser impresso no final do documento
public DanfeFrNfce(nfeProc proc, ConfiguracaoDanfeNfce configuracaoDanfeNfce, string cIdToken, string csc, string arquivoRelatorio = "", string textoRodape = "")
{
- #region Define as variáveis que serão usadas no relatório (dúvidas a respeito do fast reports consulte a documentação em https://www.fast-report.com/pt/product/fast-report-net/documentation/)
-
- Relatorio = new Report();
- Relatorio.RegisterData(new[] { proc }, "NFCe", 20);
- Relatorio.GetDataSource("NFCe").Enabled = true;
- if (string.IsNullOrEmpty(arquivoRelatorio))
- Relatorio.Load(new MemoryStream(Properties.Resources.NFCe));
- else
- Relatorio.Load(arquivoRelatorio);
- Relatorio.SetParameterValue("NfceDetalheVendaNormal", configuracaoDanfeNfce.DetalheVendaNormal);
- Relatorio.SetParameterValue("NfceDetalheVendaContigencia", configuracaoDanfeNfce.DetalheVendaContigencia);
- Relatorio.SetParameterValue("NfceImprimeDescontoItem", configuracaoDanfeNfce.ImprimeDescontoItem);
- Relatorio.SetParameterValue("NfceModoImpressao", configuracaoDanfeNfce.ModoImpressao);
- Relatorio.SetParameterValue("NfceCancelado", configuracaoDanfeNfce.DocumentoCancelado);
- Relatorio.SetParameterValue("NfceLayoutQrCode", configuracaoDanfeNfce.NfceLayoutQrCode);
- Relatorio.SetParameterValue("TextoRodape", textoRodape);
- ((ReportPage) Relatorio.FindObject("PgNfce")).LeftMargin = configuracaoDanfeNfce.MargemEsquerda;
- ((ReportPage)Relatorio.FindObject("PgNfce")).RightMargin = configuracaoDanfeNfce.MargemDireita;
- ((PictureObject) Relatorio.FindObject("poEmitLogo")).Image = configuracaoDanfeNfce.ObterLogo();
- ((TextObject)Relatorio.FindObject("txtUrl")).Text = string.IsNullOrEmpty(proc.NFe.infNFeSupl.urlChave) ? proc.NFe.infNFeSupl.ObterUrlConsulta(proc.NFe, configuracaoDanfeNfce.VersaoQrCode) : proc.NFe.infNFeSupl.urlChave;
- ((BarcodeObject)Relatorio.FindObject("bcoQrCode")).Text = proc.NFe.infNFeSupl == null ? proc.NFe.infNFeSupl.ObterUrlQrCode(proc.NFe, configuracaoDanfeNfce.VersaoQrCode, cIdToken, csc) : proc.NFe.infNFeSupl.qrCode;
- ((BarcodeObject)Relatorio.FindObject("bcoQrCodeLateral")).Text = proc.NFe.infNFeSupl == null ? proc.NFe.infNFeSupl.ObterUrlQrCode(proc.NFe, configuracaoDanfeNfce.VersaoQrCode, cIdToken, csc) : proc.NFe.infNFeSupl.qrCode;
-
-
-
- //Segundo o Manual de Padrões Técnicos do DANFE - NFC - e e QR Code, versão 3.2, página 9, nos casos de emissão em contingência deve ser impresso uma segunda cópia como via do estabelecimento
- if (configuracaoDanfeNfce.SegundaViaContingencia)
- Relatorio.PrintSettings.Copies = (proc.NFe.infNFe.ide.tpEmis == TipoEmissao.teNormal | (proc.protNFe != null && proc.protNFe.infProt != null && NfeSituacao.Autorizada(proc.protNFe.infProt.cStat))
- /*Se a NFe for autorizada, mesmo que seja em contingência, imprime somente uma via*/ ) ? 1 : 2;
-
- #endregion
+ Relatorio = DanfeSharedHelper.GenerateDanfeNfceReport(proc, configuracaoDanfeNfce, cIdToken, csc, Properties.Resources.NFCe, arquivoRelatorio);
}
///
@@ -99,8 +64,9 @@ public DanfeFrNfce(nfeProc proc, ConfiguracaoDanfeNfce configuracaoDanfeNfce, st
/// Objeto do tipo ConfiguracaoDanfeNfce contendo as definições de impressão
/// Identificador do CSC – Código de Segurança do Contribuinte no Banco de Dados da SEFAZ
/// Código de Segurança do Contribuinte(antigo Token)
- public DanfeFrNfce(Classes.NFe nfe, ConfiguracaoDanfeNfce configuracaoDanfeNfce, string cIdToken, string csc, string arquivoRelatorio = "", string textoRodape = "") :
- this(new nfeProc() {NFe = nfe}, configuracaoDanfeNfce, cIdToken, csc, arquivoRelatorio, textoRodape)
+ /// Texto para ser impresso no final do documento
+ public DanfeFrNfce(Classes.NFe nfe, ConfiguracaoDanfeNfce configuracaoDanfeNfce, string cIdToken, string csc, string textoRodape = "") :
+ this(new nfeProc() { NFe = nfe }, configuracaoDanfeNfce, cIdToken, csc, arquivoRelatorio: string.Empty, textoRodape: textoRodape)
{
}
}
diff --git a/NFe.Danfe.Fast/NFe.Danfe.Fast.csproj b/NFe.Danfe.Fast/NFe.Danfe.Fast.csproj
index 85876acfa..8080aea93 100644
--- a/NFe.Danfe.Fast/NFe.Danfe.Fast.csproj
+++ b/NFe.Danfe.Fast/NFe.Danfe.Fast.csproj
@@ -68,15 +68,11 @@
Resources.resx
-
-
-
-
-
ResXFileCodeGenerator
Resources.Designer.cs
+ Designer
@@ -97,6 +93,12 @@
NFe.Utils
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/NFe.Servicos/NFe.Servicos.csproj b/NFe.Servicos/NFe.Servicos.csproj
index e59290437..ba74892c1 100644
--- a/NFe.Servicos/NFe.Servicos.csproj
+++ b/NFe.Servicos/NFe.Servicos.csproj
@@ -45,23 +45,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -93,6 +77,7 @@
+