From 6df92f070f8ccd145c2eca7d3ecc94f9d821f903 Mon Sep 17 00:00:00 2001 From: Diego Date: Fri, 5 Jan 2024 16:54:45 -0300 Subject: [PATCH] CTeDistribuicaoDFe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit . Novo construtor na classe ServicoCTeDistribuicaoDFe para permitir enviar as configurações do serviço e certificado, pois em alguns computadores o método de obtercertificado a partir do array de bytes retornava erro de acesso negado. . Novo método de extensão para strings que remove a declaração do xml, pois os métodos CTeDistDFeInteresse e CTeDistDFeInteresseAsync verificam o início da string para identificar o tipo de retorno do ws. --- .../ServicoCTeDistribuicaoDFe.cs | 55 ++++++++++++++----- CTe.Servicos/Factory/WsdlFactory.cs | 45 +++++++-------- DFe.Utils/StringExtencoes.cs | 17 +++++- 3 files changed, 81 insertions(+), 36 deletions(-) diff --git a/CTe.Servicos/DistribuicaoDFe/ServicoCTeDistribuicaoDFe.cs b/CTe.Servicos/DistribuicaoDFe/ServicoCTeDistribuicaoDFe.cs index 9db372857..6a968802d 100644 --- a/CTe.Servicos/DistribuicaoDFe/ServicoCTeDistribuicaoDFe.cs +++ b/CTe.Servicos/DistribuicaoDFe/ServicoCTeDistribuicaoDFe.cs @@ -33,18 +33,19 @@ -using System; -using System.IO; -using System.Reflection; -using System.Threading.Tasks; -using System.Xml; using CTe.Classes; using CTe.Classes.Servicos.DistribuicaoDFe; using CTe.Servicos.Factory; using CTe.Utils.DistribuicaoDFe; -using CTe.Utils; using CTe.Wsdl.DistribuicaoDFe; using DFe.Utils; +using Shared.DFe.Utils; +using System; +using System.IO; +using System.Reflection; +using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; +using System.Xml; using Compressao = DFe.Utils.Compressao; @@ -52,6 +53,20 @@ namespace CTe.Servicos.DistribuicaoDFe { public class ServicoCTeDistribuicaoDFe { + public ServicoCTeDistribuicaoDFe() + { + + } + + private readonly ConfiguracaoServico _configuracaoServico; + private readonly X509Certificate2 _certificado; + public ServicoCTeDistribuicaoDFe(ConfiguracaoServico configuracaoServico, X509Certificate2 certificado = null) + { + _configuracaoServico = configuracaoServico; + _certificado = certificado ?? configuracaoServico.X509Certificate2; + } + + /// /// Serviço destinado à distribuição de informações resumidas e documentos fiscais eletrônicos de interesse de um ator, seja este pessoa física ou jurídica. /// @@ -63,7 +78,7 @@ public class ServicoCTeDistribuicaoDFe /// Retorna um objeto da classe CTeDistDFeInteresse com os documentos de interesse do CNPJ/CPF pesquisado public RetornoCteDistDFeInt CTeDistDFeInteresse(string ufAutor, string documento, string ultNSU = "0", string nSU = "0", ConfiguracaoServico configuracaoServico = null) { - var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; + var configServico = configuracaoServico ?? _configuracaoServico ?? ConfiguracaoServico.Instancia; distDFeInt pedDistDFeInt; XmlDocument dadosConsulta; var ws = InicializaCTeDistDFeInteresse(documento, ultNSU, nSU, out pedDistDFeInt, out dadosConsulta, configServico); @@ -82,7 +97,7 @@ public RetornoCteDistDFeInt CTeDistDFeInteresse(string ufAutor, string documento { for (int i = 0; i < retConsulta.loteDistDFeInt.Length; i++) { - string conteudo = Compressao.Unzip(retConsulta.loteDistDFeInt[i].XmlNfe); + string conteudo = Compressao.Unzip(retConsulta.loteDistDFeInt[i].XmlNfe).RemoverDeclaracaoXml(); string chCTe = string.Empty; if (conteudo.StartsWith("(conteudo); chCTe = procEventoNFeConteudo.eventoCTe.infEvento.chCTe; } + else if (conteudo.StartsWith("(conteudo); + chCTe = retConteudo.protCTe.infProt.chCTe; + } + else + { + + } string[] schema = retConsulta.loteDistDFeInt[i].schema.Split('_'); if (chCTe == string.Empty) @@ -111,7 +135,7 @@ public RetornoCteDistDFeInt CTeDistDFeInteresse(string ufAutor, string documento public async Task CTeDistDFeInteresseAsync(string ufAutor, string documento, string ultNSU = "0", string nSU = "0", ConfiguracaoServico configuracaoServico = null) { - var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; + var configServico = configuracaoServico ?? _configuracaoServico ?? ConfiguracaoServico.Instancia; distDFeInt pedDistDFeInt; XmlDocument dadosConsulta; var ws = InicializaCTeDistDFeInteresse(documento, ultNSU, nSU, out pedDistDFeInt, out dadosConsulta, configServico); @@ -130,7 +154,7 @@ public async Task CTeDistDFeInteresseAsync(string ufAutor, { for (int i = 0; i < retConsulta.loteDistDFeInt.Length; i++) { - string conteudo = Compressao.Unzip(retConsulta.loteDistDFeInt[i].XmlNfe); + string conteudo = Compressao.Unzip(retConsulta.loteDistDFeInt[i].XmlNfe).RemoverDeclaracaoXml(); string chCTe = string.Empty; if (conteudo.StartsWith(" CTeDistDFeInteresseAsync(string ufAutor, var procEventoNFeConteudo = FuncoesXml.XmlStringParaClasse(conteudo); chCTe = procEventoNFeConteudo.eventoCTe.infEvento.chCTe; } + else if (conteudo.StartsWith("(conteudo); + chCTe = retConteudo.protCTe.infProt.chCTe; + } string[] schema = retConsulta.loteDistDFeInt[i].schema.Split('_'); if (chCTe == string.Empty) @@ -164,7 +193,7 @@ private CTeDistDFeInteresse InicializaCTeDistDFeInteresse(string documento, stri #region Cria o objeto wdsl para consulta - var ws = WsdlFactory.CriaWsdlCTeDistDFeInteresse(configuracaoServico); + var ws = WsdlFactory.CriaWsdlCTeDistDFeInteresse(configuracaoServico, _certificado); #endregion @@ -183,11 +212,11 @@ private CTeDistDFeInteresse InicializaCTeDistDFeInteresse(string documento, stri pedDistDFeInt.CNPJ = documento; - pedDistDFeInt.distNSU = new distNSU {ultNSU = ultNSU.PadLeft(15, '0')}; + pedDistDFeInt.distNSU = new distNSU { ultNSU = ultNSU.PadLeft(15, '0') }; if (!nSU.Equals("0")) { - pedDistDFeInt.consNSU = new consNSU {NSU = nSU.PadLeft(15, '0')}; + pedDistDFeInt.consNSU = new consNSU { NSU = nSU.PadLeft(15, '0') }; pedDistDFeInt.distNSU = null; } diff --git a/CTe.Servicos/Factory/WsdlFactory.cs b/CTe.Servicos/Factory/WsdlFactory.cs index d8c142cc9..2d680671c 100644 --- a/CTe.Servicos/Factory/WsdlFactory.cs +++ b/CTe.Servicos/Factory/WsdlFactory.cs @@ -46,109 +46,110 @@ using CTe.Wsdl.ConsultaProtocolo.V4; using CTe.Wsdl.Evento.V4; using CTe.Wsdl.Recepcao.Sincrono; +using System.Security.Cryptography.X509Certificates; namespace CTe.Servicos.Factory { public class WsdlFactory { - public static CteStatusServico CriaWsdlCteStatusServico(ConfiguracaoServico configuracaoServico = null) + public static CteStatusServico CriaWsdlCteStatusServico(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteStatusServico; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteStatusServico(configuracaoWsdl); } - public static CteConsulta CriaWsdlConsultaProtocolo(ConfiguracaoServico configuracaoServico = null) + public static CteConsulta CriaWsdlConsultaProtocolo(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteConsulta; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteConsulta(configuracaoWsdl); } - public static CteConsultaV4 CriaWsdlConsultaProtocoloV4(ConfiguracaoServico configuracaoServico = null) + public static CteConsultaV4 CriaWsdlConsultaProtocoloV4(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteConsulta; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteConsultaV4(configuracaoWsdl); } - public static CteInutilizacao CriaWsdlCteInutilizacao(ConfiguracaoServico configuracaoServico = null) + public static CteInutilizacao CriaWsdlCteInutilizacao(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteInutilizacao; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteInutilizacao(configuracaoWsdl); } - public static CteRetRecepcao CriaWsdlCteRetRecepcao(ConfiguracaoServico configuracaoServico = null) + public static CteRetRecepcao CriaWsdlCteRetRecepcao(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteRetRecepcao; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteRetRecepcao(configuracaoWsdl); } - public static CteRecepcao CriaWsdlCteRecepcao(ConfiguracaoServico configuracaoServico = null) + public static CteRecepcao CriaWsdlCteRecepcao(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteRecepcao; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteRecepcao(configuracaoWsdl); } - public static CteRecepcaoSincronoV4 CriaWsdlCteRecepcaoSincronoV4(ConfiguracaoServico configuracaoServico = null) + public static CteRecepcaoSincronoV4 CriaWsdlCteRecepcaoSincronoV4(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteRecepcaoSinc; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteRecepcaoSincronoV4(configuracaoWsdl); } - public static CteRecepcaoEvento CriaWsdlCteEvento(ConfiguracaoServico configuracaoServico = null) + public static CteRecepcaoEvento CriaWsdlCteEvento(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteRecepcaoEvento; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteRecepcaoEvento(configuracaoWsdl); } - public static CteRecepcaoEventoV4 CriaWsdlCteEventoV4(ConfiguracaoServico configuracaoServico = null) + public static CteRecepcaoEventoV4 CriaWsdlCteEventoV4(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CteRecepcaoEvento; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CteRecepcaoEventoV4(configuracaoWsdl); } - public static CTeDistDFeInteresse CriaWsdlCTeDistDFeInteresse(ConfiguracaoServico configuracaoServico = null) + public static CTeDistDFeInteresse CriaWsdlCTeDistDFeInteresse(ConfiguracaoServico configuracaoServico = null, X509Certificate2 certificado = null) { var url = UrlHelper.ObterUrlServico(configuracaoServico).CTeDistribuicaoDFe; - var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico); + var configuracaoWsdl = CriaConfiguracao(url, configuracaoServico, certificado); return new CTeDistDFeInteresse(configuracaoWsdl); } - private static WsdlConfiguracao CriaConfiguracao(string url, ConfiguracaoServico configuracaoServico = null) + private static WsdlConfiguracao CriaConfiguracao(string url, ConfiguracaoServico configuracaoServico, X509Certificate2 certificado) { var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia; var codigoEstado = configServico.cUF.GetCodigoIbgeEmString(); - var certificadoDigital = configServico.X509Certificate2; + var certificadoDigital = certificado ?? configServico.X509Certificate2; var versaoEmString = configServico.VersaoLayout.GetString(); var timeOut = configServico.TimeOut; diff --git a/DFe.Utils/StringExtencoes.cs b/DFe.Utils/StringExtencoes.cs index 3dc264aee..be85b97cb 100644 --- a/DFe.Utils/StringExtencoes.cs +++ b/DFe.Utils/StringExtencoes.cs @@ -1,4 +1,5 @@ -using System.Text.RegularExpressions; +using System; +using System.Text.RegularExpressions; namespace Shared.DFe.Utils { @@ -24,5 +25,19 @@ public static string RemoverAcentos(this string valor) return valor; } + + public static string RemoverDeclaracaoXml(this string xml) + { + if (string.IsNullOrEmpty(xml)) + return xml; + + var posIni = xml.IndexOf("", StringComparison.Ordinal); + return posFinal < 0 ? xml : xml.Remove(posIni, (posFinal + 2) - posIni); + } + } }