/// <summary> /// Cria uma instância da Classe responsável pelos serviços relacionados à NFe /// </summary> /// <param name="cFgServico"></param> public ServicosNFe(ConfiguracaoServico cFgServico) { _cFgServico = cFgServico; _certificado = string.IsNullOrEmpty(_cFgServico.Certificado.Arquivo) ? CertificadoDigital.ObterDoRepositorio(_cFgServico.Certificado.Serial, _cFgServico.Certificado.Senha) : CertificadoDigital.ObterDeArquivo(_cFgServico.Certificado.Arquivo, _cFgServico.Certificado.Senha); _path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); }
/// <summary> /// Limpa a instancia atual caso exista /// </summary> public static void LimparIntancia() { _instancia = null; }
/// <summary> /// Cria uma instância da Classe responsável pelos serviços relacionados à NFe /// </summary> /// <param name="cFgServico"></param> public ServicosNFe(ConfiguracaoServico cFgServico) { _cFgServico = cFgServico; _certificado = CertificadoDigital.BuscaCertificado(_cFgServico.SerialCertificado); _path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); }
/// <summary> /// Obtém uma url a partir de uma lista armazenada em enderecoServico e povoada dinamicamente no create desta classe /// </summary> /// <param name="servico"></param> /// <param name="tipoRecepcaoEvento"></param> /// <param name="cfgServico"></param> /// <returns></returns> public static string ObterUrlServico(ServicoNFe servico, TipoRecepcaoEvento tipoRecepcaoEvento, ConfiguracaoServico cfgServico) { //Se o serviço for RecepcaoEvento e o tipo de emissão for dpec, a url deve ser a do ambiente nacional para EPEC e da propria sefaz para os demais casos var tipoEmissao = servico == ServicoNFe.RecepcaoEvento & cfgServico.tpEmis == TipoEmissao.teEPEC & tipoRecepcaoEvento != TipoRecepcaoEvento.Epec ? TipoEmissao.teNormal : cfgServico.tpEmis; var definicao = from d in ListaEnderecos where d.Estado == cfgServico.cUF && d.ServicoNFe == servico && d.TipoAmbiente == cfgServico.tpAmb && d.TipoEmissao == tipoEmissao && d.VersaoServico == ObterVersaoServico(servico, cfgServico) && d.ModeloDocumento == cfgServico.ModeloDocumento select d.Url; var listaRetorno = definicao as IList<string> ?? definicao.ToList(); var qtdeRetorno = listaRetorno.Count(); if (qtdeRetorno == 0) throw new Exception(Erro(servico, cfgServico)); if (qtdeRetorno > 1) throw new Exception("A função ObterUrlServico obteve mais de um resultado!"); return listaRetorno.FirstOrDefault(); }
/// <summary> /// Obtém uma string com a mensagem de erro. /// Essa função é acionada quando não é encontrada uma url para os parâmetros informados na função ObterUrlServico. /// </summary> /// <param name="servico"></param> /// <param name="cfgServico"></param> /// <returns></returns> private static string Erro(ServicoNFe servico, ConfiguracaoServico cfgServico) { return "Serviço " + servico + ", versão " + Auxiliar.VersaoServicoParaString(servico, ObterVersaoServico(servico, cfgServico)) + ", não disponível para a UF " + cfgServico.cUF + ", no ambiente de " + Auxiliar.TpAmbParaString(cfgServico.tpAmb) + " para emissão tipo " + Auxiliar.TipoEmissaoParaString(cfgServico.tpEmis) + ", documento: " + Auxiliar.ModeloDocumentoParaString(cfgServico.ModeloDocumento) + "!"; }
/// <summary> /// Obtém a versão configurada para um determinado serviço. /// A versão configurada para o serviço é armazenada em ConfiguracaoServico /// </summary> /// <param name="servico"></param> /// <param name="cfgServico"></param> /// <returns>Retorna um item do enum VersaoServico, com a versão do serviço</returns> private static VersaoServico? ObterVersaoServico(ServicoNFe servico, ConfiguracaoServico cfgServico) { switch (servico) { case ServicoNFe.RecepcaoEvento: return cfgServico.VersaoRecepcaoEvento; case ServicoNFe.NfeRecepcao: return cfgServico.VersaoNfeRecepcao; case ServicoNFe.NfeRetRecepcao: return cfgServico.VersaoNfeRetRecepcao; case ServicoNFe.NfeConsultaCadastro: return cfgServico.VersaoNfeConsultaCadastro; case ServicoNFe.NfeInutilizacao: return cfgServico.VersaoNfeInutilizacao; case ServicoNFe.NfeConsultaProtocolo: return cfgServico.VersaoNfeConsultaProtocolo; case ServicoNFe.NfeStatusServico: return cfgServico.VersaoNfeStatusServico; case ServicoNFe.NFeAutorizacao: return cfgServico.VersaoNFeAutorizacao; case ServicoNFe.NFeRetAutorizacao: return cfgServico.VersaoNFeRetAutorizacao; case ServicoNFe.NFeDistribuicaoDFe: return cfgServico.VersaoNFeDistribuicaoDFe; case ServicoNFe.NfeConsultaDest: return cfgServico.VersaoNfeConsultaDest; case ServicoNFe.NfeDownloadNF: return cfgServico.VersaoNfeDownloadNF; } return null; }
/// <summary> /// Obtém uma url a partir de uma lista armazenada em enderecoServico e povoada dinamicamente no create desta classe /// </summary> /// <param name="servico"></param> /// <param name="cfgServico"></param> /// <returns></returns> public static string ObterUrlServico(ServicoNFe servico, ConfiguracaoServico cfgServico) { var definicao = from d in ListaEnderecos where d.Estado == cfgServico.cUF && d.ServicoNFe == servico && d.TipoAmbiente == cfgServico.tpAmb && d.TipoEmissao == cfgServico.tpEmis && d.VersaoServico == ObterVersaoServico(servico, cfgServico) && d.ModeloDocumento == cfgServico.ModeloDocumento select d.Url; var listaRetorno = definicao as IList<string> ?? definicao.ToList(); var qtdeRetorno = listaRetorno.Count(); if (qtdeRetorno == 0) throw new Exception(Erro(servico, cfgServico)); if (qtdeRetorno > 1) throw new Exception("A função ObterUrlServico obteve mais de um resultado!"); return listaRetorno.FirstOrDefault(); }
/// <summary> /// Obtém a versão configurada para um determinado serviço. /// A versão configurada para o serviço é armazenada em ConfiguracaoServico /// </summary> /// <param name="servico"></param> /// <param name="cfgServico"></param> /// <returns>Retorna um item do enum VersaoServico, com a versão do serviço</returns> private static VersaoServico? ObterVersaoServico(ServicoNFe servico, ConfiguracaoServico cfgServico) { switch (servico) { case ServicoNFe.RecepcaoEventoCartaCorrecao: case ServicoNFe.RecepcaoEventoCancelmento: return cfgServico.VersaoRecepcaoEventoCceCancelamento; case ServicoNFe.RecepcaoEventoEpec: return cfgServico.VersaoRecepcaoEventoEpec; case ServicoNFe.RecepcaoEventoManifestacaoDestinatario: return cfgServico.VersaoRecepcaoEventoManifestacaoDestinatario; case ServicoNFe.NfeRecepcao: return cfgServico.VersaoNfeRecepcao; case ServicoNFe.NfeRetRecepcao: return cfgServico.VersaoNfeRetRecepcao; case ServicoNFe.NfeConsultaCadastro: return cfgServico.VersaoNfeConsultaCadastro; case ServicoNFe.NfeInutilizacao: return cfgServico.VersaoNfeInutilizacao; case ServicoNFe.NfeConsultaProtocolo: return cfgServico.VersaoNfeConsultaProtocolo; case ServicoNFe.NfeStatusServico: return cfgServico.VersaoNfeStatusServico; case ServicoNFe.NFeAutorizacao: return cfgServico.VersaoNFeAutorizacao; case ServicoNFe.NFeRetAutorizacao: return cfgServico.VersaoNFeRetAutorizacao; case ServicoNFe.NFeDistribuicaoDFe: return cfgServico.VersaoNFeDistribuicaoDFe; case ServicoNFe.NfeConsultaDest: return cfgServico.VersaoNfeConsultaDest; case ServicoNFe.NfeDownloadNF: return cfgServico.VersaoNfeDownloadNF; case ServicoNFe.NfceAdministracaoCSC: return cfgServico.VersaoNfceAministracaoCSC; } return null; }