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 @@ +