From 4816675db749057d6f7587e0f3a22bd3036c6029 Mon Sep 17 00:00:00 2001 From: "Marcos Gerene F. Spirito" Date: Thu, 26 Oct 2023 10:47:39 -0300 Subject: [PATCH] Ajustes para CTe 4.00 (#1454) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [CTe][-] CTE 4.0 não implementava URLs para QrCode * [CTe] [*] Configuração para ignorar validação dos schemas [*] No envio, salvar em disco antes de validar os schemas, possiblitando encontrar problemas pós-assinatura/qrcode --- CTe.Classes/ConfiguracaoServico.cs | 3 ++ CTe.Servicos/Recepcao/ServicoCTeRecepcao.cs | 1 + CTe.Utils/CTe/ExtCTe.cs | 50 +++++++++++---------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/CTe.Classes/ConfiguracaoServico.cs b/CTe.Classes/ConfiguracaoServico.cs index 121b9b2f7..643f931ec 100644 --- a/CTe.Classes/ConfiguracaoServico.cs +++ b/CTe.Classes/ConfiguracaoServico.cs @@ -53,6 +53,7 @@ public ConfiguracaoServico() { ConfiguracaoCertificado = new ConfiguracaoCertificado(); TipoEmissao = tpEmis.teNormal; + IsValidaSchemas = true; } /// @@ -177,6 +178,8 @@ public static ConfiguracaoServico Instancia public tpEmis TipoEmissao { get; set; } + public bool IsValidaSchemas { get; set; } + public bool NaoSalvarXml() { return !IsSalvarXml; diff --git a/CTe.Servicos/Recepcao/ServicoCTeRecepcao.cs b/CTe.Servicos/Recepcao/ServicoCTeRecepcao.cs index 22f0d3827..ae32e54e1 100644 --- a/CTe.Servicos/Recepcao/ServicoCTeRecepcao.cs +++ b/CTe.Servicos/Recepcao/ServicoCTeRecepcao.cs @@ -106,6 +106,7 @@ public retCTe CTeRecepcaoSincronoV4(CTeEletronico cte, ConfiguracaoServico confi cte.infCte.ide.tpEmis = instanciaConfiguracao.TipoEmissao; cte.Assina(instanciaConfiguracao); cte.infCTeSupl = cte.QrCode(instanciaConfiguracao.X509Certificate2, Encoding.UTF8, instanciaConfiguracao.IsAdicionaQrCode, UrlHelper.ObterUrlQrCode(instanciaConfiguracao)); + cte.SalvarXmlEmDisco(instanciaConfiguracao); //salva em disco antes de validas os schemas, facilitando encontrar possíveis erros cte.ValidaSchema(instanciaConfiguracao); cte.SalvarXmlEmDisco(instanciaConfiguracao); diff --git a/CTe.Utils/CTe/ExtCTe.cs b/CTe.Utils/CTe/ExtCTe.cs index 325b1f7f8..7d216f594 100644 --- a/CTe.Utils/CTe/ExtCTe.cs +++ b/CTe.Utils/CTe/ExtCTe.cs @@ -99,16 +99,20 @@ public static void ValidaSchema(this CteEletronica cte, ConfiguracaoServico conf var xmlValidacao = cte.ObterXmlString(); + var servicoInstancia = configuracaoServico ?? ConfiguracaoServico.Instancia; + if (!servicoInstancia.IsValidaSchemas) + return; + switch (cte.infCte.versao) { case versao.ve200: - Validador.Valida(xmlValidacao, "cte_v2.00.xsd", configuracaoServico); + Validador.Valida(xmlValidacao, "cte_v2.00.xsd", servicoInstancia); break; case versao.ve300: - Validador.Valida(xmlValidacao, "cte_v3.00.xsd", configuracaoServico); + Validador.Valida(xmlValidacao, "cte_v3.00.xsd", servicoInstancia); break; case versao.ve400: - Validador.Valida(xmlValidacao, "cte_v4.00.xsd", configuracaoServico); + Validador.Valida(xmlValidacao, "cte_v4.00.xsd", servicoInstancia); break; default: throw new InvalidOperationException("Nos achamos um erro na hora de validar o schema, " + @@ -125,104 +129,104 @@ public static void ValidaSchema(this CteEletronica cte, ConfiguracaoServico conf case versaoModal.veM200: if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(aereo)) { - Validador.Valida(xmlModal, "cteModalAereo_v2.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalAereo_v2.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(aquav)) { - Validador.Valida(xmlModal, "cteModalAquaviario_v2.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalAquaviario_v2.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(duto)) { - Validador.Valida(xmlModal, "cteModalDutoviario_v2.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalDutoviario_v2.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(ferrov)) { - Validador.Valida(xmlModal, "cteModalFerroviario_v2.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalFerroviario_v2.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(rodo)) { - Validador.Valida(xmlModal, "cteModalRodoviario_v2.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalRodoviario_v2.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(multimodal)) { - Validador.Valida(xmlModal, "cteMultimodal_v2.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteMultimodal_v2.00.xsd", servicoInstancia); } break; case versaoModal.veM300: if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(aereo)) { - Validador.Valida(xmlModal, "cteModalAereo_v3.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalAereo_v3.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(aquav)) { - Validador.Valida(xmlModal, "cteModalAquaviario_v3.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalAquaviario_v3.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(duto)) { - Validador.Valida(xmlModal, "cteModalDutoviario_v3.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalDutoviario_v3.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(ferrov)) { - Validador.Valida(xmlModal, "cteModalFerroviario_v3.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalFerroviario_v3.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(rodo)) { - Validador.Valida(xmlModal, "cteModalRodoviario_v3.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalRodoviario_v3.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(multimodal)) { - Validador.Valida(xmlModal, "cteMultimodal_v3.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteMultimodal_v3.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(rodoOS)) { - Validador.Valida(xmlModal, "cteModalRodoviarioOS_v3.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalRodoviarioOS_v3.00.xsd", servicoInstancia); } break; case versaoModal.veM400: if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(aereo)) { - Validador.Valida(xmlModal, "cteModalAereo_v4.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalAereo_v4.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(aquav)) { - Validador.Valida(xmlModal, "cteModalAquaviario_v4.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalAquaviario_v4.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(duto)) { - Validador.Valida(xmlModal, "cteModalDutoviario_v4.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalDutoviario_v4.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(ferrov)) { - Validador.Valida(xmlModal, "cteModalFerroviario_v4.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalFerroviario_v4.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(rodo)) { - Validador.Valida(xmlModal, "cteModalRodoviario_v4.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalRodoviario_v4.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(multimodal)) { - Validador.Valida(xmlModal, "cteMultimodal_v4.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteMultimodal_v4.00.xsd", servicoInstancia); } if (cte.infCte.infCTeNorm.infModal.ContainerModal.GetType() == typeof(rodoOS)) { - Validador.Valida(xmlModal, "cteModalRodoviarioOS_v4.00.xsd", configuracaoServico); + Validador.Valida(xmlModal, "cteModalRodoviarioOS_v4.00.xsd", servicoInstancia); } break; default: