-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathProgram.cs
More file actions
171 lines (152 loc) · 7.61 KB
/
Program.cs
File metadata and controls
171 lines (152 loc) · 7.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
using DFe.Utils;
using HerculesZeusDfeDemo;
using NFe.Classes;
using NFe.Classes.Servicos.Tipos;
using NFe.Danfe.Base.NFe;
using NFe.Danfe.OpenFast.NFe;
using NFe.Servicos;
using NFe.Servicos.Retorno;
using NFe.Utils;
using NFe.Utils.NFe;
using NFe.Utils.Validacao;
using System.Net;
//diretorio de schemas
var diretorioSchema = Path.Combine(Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)!, "Schemas");
//criando configuração
var configuracao = new ConfiguracaoServico()
{
ValidarCertificadoDoServidor = false,
DiretorioSalvarXml = "", //nao salvar xmls
SalvarXmlServicos = false,
ValidarSchemas = false, //hoje e feito manualmente
DiretorioSchemas = diretorioSchema,
ProtocoloDeSeguranca = ServicePointManager.SecurityProtocol,
RemoverAcentos = true,
DefineVersaoServicosAutomaticamente = true,
VersaoLayout = DFe.Classes.Flags.VersaoServico.Versao400,
ModeloDocumento = DFe.Classes.Flags.ModeloDocumento.NFe,
tpEmis = NFe.Classes.Informacoes.Identificacao.Tipos.TipoEmissao.teNormal,
tpAmb = DFe.Classes.Flags.TipoAmbiente.Homologacao,
cUF = DFe.Classes.Entidades.Estado.SP,
TimeOut = 20000,
Certificado = new DFe.Utils.ConfiguracaoCertificado()
{
TipoCertificado = DFe.Utils.TipoCertificado.A1ByteArray,
ArrayBytesArquivo = File.ReadAllBytes("C:/PROJETOS/cert_BREDAS_venc_012026_senha_12345678.pfx"),
Senha = "12345678",
ManterDadosEmCache = false,
SignatureMethodSignedXml = "http://www.w3.org/2000/09/xmldsig#rsa-sha1",
DigestMethodReference = "http://www.w3.org/2000/09/xmldsig#sha1"
}
};
//gerando nfe
var nfe = FactoryNfe.Gerar(serie: 32, nro: 121);
var codigoNumero = nfe.infNFe.ide.cNF;
Console.WriteLine("Codigo NFE: " + codigoNumero);
var idLote = Convert.ToInt32(nfe.infNFe.ide.nNF);//idlote é o mesmo que o numero da nf
Helpers.AbrirXml(nfe.ObterXmlString());//abrindo para visualizacao (sem assinatura)
Console.WriteLine("XML gerado sem assinatura. pressione qualquer tecla para enviar assinar");
Console.ReadKey();
//------------------------------
//assinando nfe
nfe.Assina(configuracao);
var chaveAcesso = nfe.infNFe.Id.ToUpper().Replace("NFE", "");
//validando xml
Validador.Valida(ServicoNFe.NFeAutorizacao, configuracao.VersaoNFeAutorizacao, FuncoesXml.ClasseParaXmlString(nfe), false, configuracao.DiretorioSchemas);
Helpers.AbrirXml(nfe.ObterXmlString());//abrindo para visualizacao (com assinatura)
Console.WriteLine("XML gerado e assinado localmente, pressione qualquer tecla para enviar para sefaz");
Console.ReadKey();
//------------------------------
//enviando lote para api do sefaz
string recibo = "";
string xmlEnvio = "";
try
{
using (var servicoNFe = new ServicosNFe(configuracao))
{
RetornoNFeAutorizacao retornoSefaz = servicoNFe.NFeAutorizacao(idLote, IndicadorSincronizacao.Sincrono, new List<NFe.Classes.NFe> { nfe }, compactarMensagem: false);
var dto = new
{
// Dados de Retorno
EnvioStr = retornoSefaz.EnvioStr, // String XML enviada à Sefaz, salve como log para auditoria
Status = retornoSefaz.Retorno.cStat, // Código do status retornado pela Sefaz, indica o resultado do processamento (ex: 100 = Autorizado)
Motivo = retornoSefaz.Retorno.xMotivo, // Mensagem descritiva do status, detalha o motivo do processamento (ex: "Autorizado o uso da NF-e")
NumeroProtocolo = retornoSefaz.Retorno.protNFe.infProt.nProt, /*
O número de protocolo (nProt) é gerado pela Sefaz após a autorização da NF-e.
Na emissão síncrona, ele é fundamental porque indica que a nota foi efetivamente autorizada.
Ele é usado para:
- Comprovar a validade jurídica da NF-e (junto ao Fisco e clientes).
- Realizar operações posteriores: cancelamento, carta de correção, consulta de status, etc.
- Armazenamento e auditoria: vincula o evento ao documento fiscal autorizado.
*/
NumeroChaveAcesso = chaveAcesso, /*
A chave de acesso é o identificador único da NF-e.
Ela é usada para:
- Consultar a nota fiscal na Sefaz.
- Gerar DANFE (representação gráfica).
- Cancelar, inutilizar ou corrigir a nota fiscal.
- Referenciar a NF-e em outros documentos fiscais.
*/
// Dados complementares referentes à NF-e emitida
ModeloNfe = (int)nfe.infNFe.ide.mod, // Modelo do documento fiscal (ex: 55 = NF-e, 65 = NFC-e)
CodigoNumericoNfe = nfe.infNFe.ide.cNF, // Código numérico gerado para compor a chave de acesso
IdentificadorDestinoNfe = (int?)nfe.infNFe.ide.idDest ?? throw new Exception("nfe.infNFe.ide.idDest nulo, favor verificar programador"), // Identifica a localização do destinatário (1 = operação interna, 2 = interestadual, 3 = exterior)
FormatoImpressaoDanfeNfe = (int)nfe.infNFe.ide.tpImp, // Formato de impressão do DANFE (ex: 1 = Retrato, 2 = Paisagem)
TipoEmissaoNfe = (int)nfe.infNFe.ide.tpEmis, // Tipo de emissão da NF-e (1 = normal, 2 = contingência FS, 3 = SCAN, etc.)
DigitoVerificadorChaveAcessoNfe = nfe.infNFe.ide.cDV, // Dígito verificador da chave de acesso, usado para validar se a chave está correta
TipoAmbienteNfe = (int)nfe.infNFe.ide.tpAmb, // Identifica o ambiente de emissão (1 = produção, 2 = homologação)
FinalidadeNfe = (int)nfe.infNFe.ide.finNFe, // Finalidade da emissão (1 = normal, 2 = complementar, 3 = ajuste, 4 = devolução)
ProcessoEmissaoNfe = (int)nfe.infNFe.ide.procEmi // Processo de emissão utilizado (0 = aplicativo do contribuinte, 1 = avulsa Sefaz, 2 = Sefaz, 3 = terceiros)
};
xmlEnvio = dto.EnvioStr;
//Verificando o status de retorno
var protNFe = retornoSefaz.Retorno.protNFe;
var infProt = protNFe.infProt;
nfeProc nfeprocXml = null;
if (NfeSituacao.Autorizada(infProt.cStat))
{
//autorizado uso nfe
nfeprocXml = new nfeProc
{
NFe = new NFe.Classes.NFe().CarregarDeXmlString(xmlEnvio),
protNFe = protNFe,
versao = protNFe.versao
};
var xmlFinal = nfeprocXml.ObterXmlString();
//abrindo xml
Helpers.AbrirXml(xmlFinal);
//------------------------------
Console.WriteLine($"Nota Fiscal Emitida com Sucesso! Pressione algo para imprimir");
Console.ReadKey();
}
//IMPRESSAO DANFE openfast (necessario ultima versao da dll NFe.Danfe.OpenFast.dll)
DanfeFrNfe danfe = new DanfeFrNfe(proc: nfeprocXml, configuracaoDanfeNfe: new ConfiguracaoDanfeNfe()
{
Logomarca = null,
DuasLinhas = false,
DocumentoCancelado = false,
QuebrarLinhasObservacao = true,
ExibirResumoCanhoto = true,
ResumoCanhoto = "x",
ChaveContingencia = "y",
ExibeCampoFatura = false,
ImprimirISSQN = true,
ImprimirDescPorc = true,
ImprimirTotalLiquido = true,
ImprimirUnidQtdeValor = ImprimirUnidQtdeValor.Comercial,
ExibirTotalTributos = true,
ExibeRetencoes = false
},
desenvolvedor: "NOME DA SOFTWARE HOUSE AQUI",
arquivoRelatorio: string.Empty);
byte[] danfeEmPdfBytes = danfe.ExportarPdf();
//abrindo xml
Helpers.AbrirPdf(danfeEmPdfBytes);
}
}
catch (Exception ex)
{
Console.WriteLine($"Ocorreu um erro geral ao Emitir NFE {ex.Message}");
throw;
}
return 0;