示例#1
0
 /// <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
            );
 }
示例#2
0
 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;
 }
示例#3
0
 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;
 }
示例#4
0
文件: Conversao.cs 项目: pmvarela/DFe
        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);
        }
示例#5
0
        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);
            }
        }
示例#6
0
 /// <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);
 }
示例#7
0
        /// <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);
        }
示例#8
0
        /// <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
        }
示例#9
0
        /// <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);
        }
示例#10
0
        /// <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());
        }