/// <summary> /// Construtor da classe reponsável pela impressão do DANFE da NFe em Fast Reports /// </summary> /// <param name="proc">Objeto do tipo nfeProc</param> /// <param name="configuracaoDanfeNfe">Objeto do tipo configuracaoDanfeNfe contendo as definições de impressão</param> public DanfeFrNfe(nfeProc proc, ConfiguracaoDanfeNfe configuracaoDanfeNfe) { #region Define as varíaveis 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 }, "NFe", 20); Relatorio.GetDataSource("NFe").Enabled = true; Relatorio.Load(new MemoryStream(Properties.Resources.NFe)); ((PictureObject)Relatorio.FindObject("poEmitLogo")).Image = configuracaoDanfeNfe.ObterLogo(); #endregion }
public void ServicosNFe_WhenNfeNFeAutorizacao4_ReturnsxMotivoSuccess() { var servico = CreateInstance4(); var nfeProc = CreateObject(); var nfe = nfeProc.NFe; var list = new List <NFe.Classes.NFe>(); list.Add(nfeProc.NFe); nfe.infNFe.ide.mod = DFe.Classes.Flags.ModeloDocumento.NFCe; nfe.infNFe.ide.tpImp = NFeClasses.Informacoes.Identificacao.Tipos.TipoImpressao.tiNFCe; nfe.infNFe.ide.indPres = NFeClasses.Informacoes.Identificacao.Tipos.PresencaComprador.pcPresencial; nfe.infNFe.dest = null; nfe.infNFe.det[0].prod.xProd = "NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"; nfe.Signature = null; SetValuesForMoriMo(nfe); nfe.infNFe.ide.dhEmi = DateTimeOffset.UtcNow; nfe.infNFe.ide.dhSaiEnt = null; CriarChaveDeAcesso(nfe); var a = new X509Certificate2(@"certificatePath", "certificatePassword", X509KeyStorageFlags.Exportable); var signature = Assinador.ObterAssinaturac <NFe.Classes.NFe>(nfe, nfe.infNFe.Id, a); nfe.Signature = signature; nfe.infNFeSupl = new NFeClasses.infNFeSupl { urlChave = nfe.infNFe.Id, qrCode = ExtinfNFeSupl.ObterUrlQrCode(new NFeClasses.infNFeSupl(), nfe, VersaoQrCode.QrCodeVersao1, "security-id", "security-Code") }; var issuedNfe = Assinador.SerializeToString(nfe); File.WriteAllText($@"D:\works\nfce\test123.xml", issuedNfe); var procNfe = new NFe.Classes.nfeProc { NFe = nfe }; var result = servico.NFeAutorizacao(1, IndicadorSincronizacao.Sincrono, list); Assert.IsTrue("Lote recebido com sucesso" == result.Retorno.xMotivo.ToString()); }
/// <summary> /// Construtor da classe reponsável pela impressão do DANFE da NFCe em Fast Reports /// </summary> /// <param name="proc">Objeto do tipo nfeProc</param> /// <param name="configuracaoDanfeNfce">Objeto do tipo ConfiguracaoDanfeNfce contendo as definições de impressão</param> public DanfeFrNfce(nfeProc proc, ConfiguracaoDanfeNfce configuracaoDanfeNfce) { #region Define as varíaveis 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; _relatorio.Load(new MemoryStream(Properties.Resources.NFCe)); _relatorio.SetParameterValue("NfceDetalheVendaNormal", configuracaoDanfeNfce.DetalheVendaNormal); _relatorio.SetParameterValue("NfceDetalheVendaContigencia", configuracaoDanfeNfce.DetalheVendaContigencia); ((PictureObject) _relatorio.FindObject("poEmitLogo")).Image = configuracaoDanfeNfce.ObterLogo(); ((TextObject)_relatorio.FindObject("txtUrl")).Text = EnderecadorDanfeNfce.ObterUrl(proc.NFe.infNFe.ide.tpAmb, proc.NFe.infNFe.ide.cUF, TipoUrlDanfeNfce.UrlConsulta); ((BarcodeObject)_relatorio.FindObject("bcoQrCode")).Text = EnderecadorDanfeNfce.ObterUrlQrCode(proc, configuracaoDanfeNfce); //Segundo o Manual de Padrões Padrões Técnicos do DANFE - NFC - e e QR Code, versão 3.2, página 9, nos casos de emissão em contigência deve ser impresso uma segunda cópia como via do estabelecimento _relatorio.PrintSettings.Copies = proc.NFe.infNFe.ide.tpEmis == TipoEmissao.teNormal ? 1 : 2; #endregion }
/// <summary> /// Construtor da classe reponsável pela impressão do DANFE da NFCe em Fast Reports /// </summary> /// <param name="proc">Objeto do tipo nfeProc</param> /// <param name="configuracaoDanfeNfce">Objeto do tipo ConfiguracaoDanfeNfce contendo as definições de impressão</param> /// <param name="cIdToken">Identificador do CSC – Código de Segurança do Contribuinte no Banco de Dados da SEFAZ</param> /// <param name="csc">Código de Segurança do Contribuinte(antigo Token)</param> public DanfeFrNfce(nfeProc proc, ConfiguracaoDanfeNfce configuracaoDanfeNfce, string cIdToken, string csc) { #region Define as varíaveis 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; Relatorio.Load(new MemoryStream(Properties.Resources.NFCe)); Relatorio.SetParameterValue("NfceDetalheVendaNormal", configuracaoDanfeNfce.DetalheVendaNormal); Relatorio.SetParameterValue("NfceDetalheVendaContigencia", configuracaoDanfeNfce.DetalheVendaContigencia); Relatorio.SetParameterValue("NfceImprimeDescontoItem", configuracaoDanfeNfce.ImprimeDescontoItem); Relatorio.SetParameterValue("NfceModoImpressao", configuracaoDanfeNfce.ModoImpressao); ((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 = proc.NFe.infNFeSupl.ObterUrl(proc.NFe.infNFe.ide.tpAmb, proc.NFe.infNFe.ide.cUF, TipoUrlConsultaPublica.UrlConsulta); ((BarcodeObject)Relatorio.FindObject("bcoQrCode")).Text = proc.NFe.infNFeSupl == null ? proc.NFe.infNFeSupl.ObterUrlQrCode(proc.NFe, cIdToken, csc) : proc.NFe.infNFeSupl.qrCode; //Segundo o Manual de Padrões Padrões Técnicos do DANFE - NFC - e e QR Code, versão 3.2, página 9, nos casos de emissão em contigência deve ser impresso uma segunda cópia como via do estabelecimento 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 }
/// <summary> /// Carrega um arquivo XML para um objeto da classe nfeProc /// </summary> /// <param name="nfeProc"></param> /// <param name="arquivoXml">arquivo XML</param> /// <returns>Retorna um nfeProc carregada com os dados do XML</returns> public static nfeProc CarregarDeArquivoXml(nfeProc nfeProc, string arquivoXml) { var s = FuncoesXml.ObterNodeDeArquivoXml(typeof (nfeProc).Name, arquivoXml); return FuncoesXml.XmlStringParaClasse<nfeProc>(s); }
/// <summary> /// Obtém a URL para uso no QR-Code /// </summary> /// <param name="proc"></param> /// <param name="configuracaoDanfeNfce"></param> /// <returns></returns> public static string ObterUrlQrCode(nfeProc proc, ConfiguracaoDanfeNfce configuracaoDanfeNfce) { //Passo 1: Converter o valor da Data e Hora de Emissão da NFC-e (dhEmi) para HEXA; var dhEmi = StringParaHex(proc.NFe.infNFe.ide.dhEmi); //Passo 2: Converter o valor do Digest Value da NFC-e (digVal) para HEXA; //Ao se efetuar a assinatura digital da NFCe emitida em contingência off-line, o campo digest value constante da XMl Signature deve obrigatoriamente ser idêntico ao encontrado quando da geração do digest value para a montagem QR Code. //Ver página 18 do Manual de Padrões Padrões Técnicos do DANFE - NFC - e e QR Code, versão 3.2 var digVal = StringParaHex(proc.NFe.infNFe.ide.tpEmis == TipoEmissao.teNormal ? proc.protNFe.infProt.digVal : proc.NFe.Signature.SignedInfo.Reference.DigestValue); //Na hipótese do consumidor não se identificar, não existirá o parâmetro cDest no QR Code; var cDest = ""; if (proc.NFe.infNFe.dest != null) cDest = "&cDest=" + proc.NFe.infNFe.dest.CPF + proc.NFe.infNFe.dest.CNPJ + proc.NFe.infNFe.dest.idEstrangeiro; //Passo 3: Substituir os valores (“dhEmi” e “digVal”) nos parâmetros; var dadosBase = "chNFe=" + proc.NFe.infNFe.Id.Substring(3) + "&nVersao=100&tpAmb=" + ((int) proc.NFe.infNFe.ide.tpAmb) + cDest + "&dhEmi=" + dhEmi + "&vNF=" + proc.NFe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.') + "&vICMS=" + proc.NFe.infNFe.total.ICMSTot.vICMS.ToString("0.00").Replace(',', '.') + "&digVal=" + digVal + "&cIdToken=" + configuracaoDanfeNfce.cIdToken; //Passo 4: Adicionar, ao final dos parâmetros, o CSC (CSC do contribuinte disponibilizado pela SEFAZ do Estado onde a empresa esta localizada): var dadosParaSh1 = dadosBase + configuracaoDanfeNfce.CSC; //Passo 5: Aplicar o algoritmo SHA-1 sobre todos os parâmetros concatenados. Asaída do algoritmo SHA-1 deve ser em HEXADECIMAL. var sha1ComCsc = ObterHashSha1(dadosParaSh1); //Passo 6: Adicione o resultado sem o CSC e gere a imagem do QR Code: 1º parte (endereço da consulta) +2º parte (tabela 3 com indicação SIM na última coluna). return ObterUrl(proc.NFe.infNFe.ide.tpAmb, proc.NFe.infNFe.ide.cUF, TipoUrlDanfeNfce.UrlQrCode) + "?" + dadosBase + "&cHashQRCode=" + sha1ComCsc; }
private void BtnNfeDanfeA4_Click(object sender, RoutedEventArgs e) { try { #region Carrega um XML com nfeProc para a variável var arquivoXml = Funcoes.BuscarArquivoXml(); if (string.IsNullOrEmpty(arquivoXml)) return; var proc = new nfeProc().CarregarDeArquivoXml(arquivoXml); if (proc.NFe.infNFe.ide.mod != ModeloDocumento.NFe) throw new Exception("O XML informado não é um NFe!"); #endregion #region Abre a visualização do relatório para impressão var danfe = new DanfeFrNfe(proc, new ConfiguracaoDanfeNfe(_configuracoes.ConfiguracaoDanfeNfce.Logomarca)); //danfe.Visualizar(); //danfe.Imprimir(); danfe.ExibirDesign(); //danfe.ExportarPdf(@"d:\teste.pdf"); #endregion } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.Message)) Funcoes.Mensagem(ex.Message, "Erro", MessageBoxButton.OK); } }