/// <summary> /// Retorna verdadeiro para as UFs que utilizam SVC-AN, caso o tipo de emissão seja SVC-AN e o documento seja NF-e /// </summary> /// <param name="cfgServico"></param> /// <returns></returns> public static bool UsaSvcanNFe4(this ConfiguracaoServico cfgServico, VersaoServico versaoServico) { return(Enderecador.EstadosQueUsamSvcAnParaNfe().Contains(cfgServico.cUF) && cfgServico.tpEmis == TipoEmissao.teSVCAN && cfgServico.ModeloDocumento == ModeloDocumento.NFe && versaoServico == VersaoServico.ve400 ); }
public EnderecoConsultaPublicaNfce(TipoAmbiente tipoAmbiente, Estado estado, TipoUrlConsultaPublica tipoUrlConsultaPublica, VersaoServico versaoServico, VersaoQrCode versaoQrCode, string url) { TipoAmbiente = tipoAmbiente; Estado = estado; TipoUrlConsultaPublica = tipoUrlConsultaPublica; Url = url; VersaoServico = versaoServico; VersaoQrCode = versaoQrCode; }
public EnderecoServico(ServicoNFe servicoNFe, VersaoServico versaoServico, TipoAmbiente tipoAmbiente, TipoEmissao tipoEmissao, Estado estado, ModeloDocumento modeloDocumento, string url) { ServicoNFe = servicoNFe; VersaoServico = versaoServico; TipoAmbiente = tipoAmbiente; TipoEmissao = tipoEmissao; Estado = estado; Url = url; ModeloDocumento = modeloDocumento; }
public static string VersaoServicoParaString(this VersaoServico versao) { switch (versao) { case VersaoServico.ve100: return("1.00"); case VersaoServico.ve200: return("2.00"); case VersaoServico.ve310: return("3.10"); case VersaoServico.ve400: return("4.00"); } return(null); }
private static DFe.Classes.Flags.VersaoServico ConverteVersaoLayout(VersaoServico cfgVersaoNFeAutorizacao) { switch (cfgVersaoNFeAutorizacao) { case VersaoServico.ve100: return(DFe.Classes.Flags.VersaoServico.Versao100); case VersaoServico.ve200: return(DFe.Classes.Flags.VersaoServico.Versao200); case VersaoServico.ve310: return(DFe.Classes.Flags.VersaoServico.Versao310); case VersaoServico.ve400: return(DFe.Classes.Flags.VersaoServico.Versao400); default: throw new ArgumentOutOfRangeException("cfgVersaoNFeAutorizacao", cfgVersaoNFeAutorizacao, null); } }
/// <summary> /// Retorna verdadeiro para as UFs que utilizam a SVAN - Sefaz Virtual do Ambiente Nacional, para serviços com versão 4.0 /// </summary> /// <returns></returns> public static bool UsaSvanNFe4(this ConfiguracaoServico cfgServico, VersaoServico versaoServico) { return(Enderecador.EstadosQueUsamSvanParaNfe().Contains(cfgServico.cUF) && versaoServico == VersaoServico.ve400 && cfgServico.ModeloDocumento == ModeloDocumento.NFe); }
/// <summary> /// Obtém a URL para o QR-Code versão 2.0 com o tratamento de parâmetro query no final da url /// </summary> /// <returns></returns> public static string ObterUrlQrCode2ComParametro(this infNFeSupl infNFeSupl, TipoAmbiente tipoAmbiente, Estado estado, VersaoServico versaoServico) { const string interrogacao = "?"; const string parametro = "p="; var url = ObterUrl(infNFeSupl, tipoAmbiente, estado, TipoUrlConsultaPublica.UrlQrCode, versaoServico, VersaoQrCode.QrCodeVersao2); if (!url.EndsWith(interrogacao)) { url += interrogacao; } if (!url.EndsWith(parametro)) { url += parametro; } return(url); }
/// <summary> /// Obtém a URL para uso no QR-Code, versão 2.0 - leiaute 4.00 /// </summary> private static string ObterUrlQrCode2(infNFeSupl infNFeSupl, Classes.NFe nfe, string cIdToken, string csc, VersaoServico versaoServico) { #region 1ª parte var url = ObterUrlQrCode2ComParametro(infNFeSupl, nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, versaoServico); #endregion #region 2ª parte const string pipe = "|"; //Chave de Acesso da NFC-e var chave = nfe.infNFe.Id.Substring(3); //Identificação do Ambiente (1 – Produção, 2 – Homologação) var ambiente = (int)nfe.infNFe.ide.tpAmb; //Identificador do CSC (Código de Segurança do Contribuinte no Banco de Dados da SEFAZ). Informar sem os zeros não significativos var idCsc = Convert.ToInt16(cIdToken); string dadosBase; if (nfe.infNFe.ide.tpEmis == TipoEmissao.teOffLine) { var diaEmi = nfe.infNFe.ide.dhEmi.Day.ToString("D2"); var valorNfce = nfe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.'); var digVal = Conversao.ObterHexDeString(nfe.Signature.SignedInfo.Reference.DigestValue); dadosBase = string.Concat(chave, pipe, (int)VersaoQrCode.QrCodeVersao2, pipe, ambiente, pipe, diaEmi, pipe, valorNfce, pipe, digVal, pipe, idCsc); } else { dadosBase = string.Concat(chave, pipe, (int)VersaoQrCode.QrCodeVersao2, pipe, ambiente, pipe, idCsc); } var dadosSha1 = string.Concat(dadosBase, csc); var sh1 = Conversao.ObterHexSha1DeString(dadosSha1); return(string.Concat(url, dadosBase, pipe, sh1)); #endregion }
/// <summary> /// Obtém a URL para uso no QR-Code, versão 1.0 - leiaute 3.10 /// </summary> private static string ObterUrlQrCode1(infNFeSupl infNFeSupl, Classes.NFe nfe, string cIdToken, string csc, VersaoServico versaoServico) { //Passo 1: Converter o valor da Data e Hora de Emissão da NFC-e (dhEmi) para HEXA; var dhEmi = Conversao.ObterHexDeString(nfe.infNFe.ide.ProxyDhEmi); //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 Técnicos do DANFE - NFC - e e QR Code, versão 3.2 if (nfe.Signature == null) { throw new Exception("Não é possível obter a URL do QR-Code de uma NFCe não assinada!"); } var digVal = Conversao.ObterHexDeString(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 (nfe.infNFe.dest != null) { cDest = "&cDest=" + nfe.infNFe.dest.CPF + nfe.infNFe.dest.CNPJ + nfe.infNFe.dest.idEstrangeiro; } //Passo 3: Substituir os valores (“dhEmi” e “digVal”) nos parâmetros; var dadosBase = "chNFe=" + nfe.infNFe.Id.Substring(3) + "&nVersao=100" + "&tpAmb=" + (int)nfe.infNFe.ide.tpAmb + cDest + "&dhEmi=" + dhEmi + "&vNF=" + nfe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.') + "&vICMS=" + nfe.infNFe.total.ICMSTot.vICMS.ToString("0.00").Replace(',', '.') + "&digVal=" + digVal + "&cIdToken=" + 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 + csc; //Passo 5: Aplicar o algoritmo SHA-1 sobre todos os parâmetros concatenados. A saída do algoritmo SHA-1 deve ser em HEXADECIMAL. var sha1ComCsc = Conversao.ObterHexSha1DeString(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). const string interrogacao = "?"; var url = ObterUrl(infNFeSupl, nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, TipoUrlConsultaPublica.UrlQrCode, versaoServico, VersaoQrCode.QrCodeVersao1); if (!url.EndsWith(interrogacao)) { url += interrogacao; } return(url + dadosBase + "&cHashQRCode=" + sha1ComCsc); }
/// <summary> /// Obtém a URL para uso no DANFE da NFCe /// </summary> public static string ObterUrl(this infNFeSupl infNFeSupl, TipoAmbiente tipoAmbiente, Estado estado, TipoUrlConsultaPublica tipoUrlConsultaPublica, VersaoServico versaoServico, VersaoQrCode versaoQrCode) { var query = from qr in EndQrCodeNfce where qr.TipoAmbiente == tipoAmbiente && qr.Estado == estado && qr.TipoUrlConsultaPublica == tipoUrlConsultaPublica && qr.VersaoServico == versaoServico && qr.VersaoQrCode == versaoQrCode select qr.Url; var listaRetorno = query as IList <string> ?? query.ToList(); var qtdeRetorno = listaRetorno.Count(); if (qtdeRetorno == 0) { throw new Exception(string.Format("Não foi possível obter o {0}, para o Estado {1}, ambiente: {2}", tipoUrlConsultaPublica.Descricao(), estado, tipoAmbiente.Descricao())); } if (qtdeRetorno > 1) { throw new Exception("A função ObterUrl obteve mais de um resultado!"); } return(listaRetorno.FirstOrDefault()); }