ZeusAutomacao/DFe.NET

Erro ao enviar CTE chamando o método "EnviarAsync" na versão 4.0

Closed this issue · 8 comments

Estou tendo o seguinte erro ao chamar o método EnviarAsync utilizando Zeus.Net.CTe na versão 2024.1.26.1413:
The 'versao' attribute is invalid - The value '4.00' is invalid according to its datatype 'http://www.portalfiscal.inf.br/cte:TVerCTe' - The Pattern constraint failed.

Ao analisar o código eu estranhei o fato do método validaSchema de enviCte, estar utilizando o schema enviCTe_v3.00.xsd mesmo na versão 4.0.

Também achei estranho estar sendo feita uma consulta onde chama o validaSchema de consReciCTe já que o schema consReciCTe também não existe na versão 4.0

@Gabriel-Di-Domenico

Estou tendo o seguinte erro ao chamar o método EnviarAsync utilizando Zeus.Net.CTe na versão 2024.1.26.1413:
The 'versao' attribute is invalid - The value '4.00' is invalid according to its datatype 'http://www.portalfiscal.inf.br/cte:TVerCTe' - The Pattern constraint failed.

Que método é "EnviarAsync()" referencia no código, por favor.

Ao analisar o código eu estranhei o fato do método validaSchema de enviCte, estar utilizando o schema enviCTe_v3.00.xsd mesmo na versão 4.0.

Também achei estranho estar sendo feita uma consulta onde chama o validaSchema de consReciCTe já que o schema consReciCTe também não existe na versão 4.0

Uso o CTe 4.0 a tempos aqui em produção, por favor refencia no código aqui onde você notou as inconsistências

namespace CTe.Servicos.EnviarCte
{
public class ServicoEnviarCte
{
public RetornoEnviarCte Enviar(int lote, Classes.CTe cte, ConfiguracaoServico configuracaoServico = null)
{
var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia;

        ServicoCTeRecepcao servicoRecepcao = new ServicoCTeRecepcao();

        retEnviCte retEnviCte = servicoRecepcao.CTeRecepcao(lote, new List<Classes.CTe> {cte}, configServico);

        if (retEnviCte.cStat != 103)
        {
            return new RetornoEnviarCte(retEnviCte, null, null);
        }

        ConsultaReciboServico servicoConsultaRecibo = new ConsultaReciboServico(retEnviCte.infRec.nRec);

        retConsReciCTe retConsReciCTe = servicoConsultaRecibo.Consultar(configServico);


        cteProc cteProc = null;
        if (retConsReciCTe.cStat == 104)
        {

            if (retConsReciCTe.protCTe[0].infProt.cStat != 100)
            {
                return new RetornoEnviarCte(retEnviCte, retConsReciCTe, null);
            }

            cteProc = new cteProc
            {
                CTe = cte,
                versao = configServico.VersaoLayout,
                protCTe = retConsReciCTe.protCTe[0]
            };
        }

        cteProc.SalvarXmlEmDisco(configServico);

        return new RetornoEnviarCte(retEnviCte, retConsReciCTe, cteProc);
    }

    public async Task<RetornoEnviarCte> EnviarAsync(int lote, Classes.CTe cte, ConfiguracaoServico configuracaoServico = null)
    {
        var configServico = configuracaoServico ?? ConfiguracaoServico.Instancia;
        ServicoCTeRecepcao servicoRecepcao = new ServicoCTeRecepcao();

        retEnviCte retEnviCte = await servicoRecepcao.CTeRecepcaoAsync(lote, new List<Classes.CTe> { cte }, configServico);

        if (retEnviCte.cStat != 103)
        {
            return new RetornoEnviarCte(retEnviCte, null, null);
        }

        ConsultaReciboServico servicoConsultaRecibo = new ConsultaReciboServico(retEnviCte.infRec.nRec);

        retConsReciCTe retConsReciCTe = await servicoConsultaRecibo.ConsultarAsync(configServico);


        cteProc cteProc = null;
        if (retConsReciCTe.cStat == 104)
        {

            if (retConsReciCTe.protCTe[0].infProt.cStat != 100)
            {
                return new RetornoEnviarCte(retEnviCte, retConsReciCTe, null);
            }

            cteProc = new cteProc
            {
                CTe = cte,
                versao = configServico.VersaoLayout,
                protCTe = retConsReciCTe.protCTe[0]
            };
        }

        cteProc.SalvarXmlEmDisco(configServico);

        return new RetornoEnviarCte(retEnviCte, retConsReciCTe, cteProc);
    }
}

}

Eu estou tentando chamar diretamente ServicoCTeRecepcao().CTeRecepcaoSincronoV4, ao invés de usar este enviarAsync

Esta parecendo erro de schema antigo... que valida se versão ta 3.0! tenta desabilitar a validação de esquema para ver se funciona, lembrando que os schemas não estão adicionados no nuget ou codigo fonte do zeus.

Então Danilo, dentro da chamada do servicoRecepcao.CTeRecepcaoAsync ele chamada enviCte.ValidaSchema, e ali dentro ele usa um schema da 3.0 que não existe na 4.0, acredito que esse seja o motivo do meu erro, de fato se eu colocar isValidaSchema pra false, deve passar dai, mas eu reparei que é feita uma chamada pra servicoConsultaRecibo.ConsultarAsync, onde dentro dela é feito consReciCTe.ValidarSchema, e dentro dessa validação o switch case me jogaria pra uma exception, e essse cara não está em um if de isValidaSchema

public async Task CTeRecepcaoAsync(int lote, List cteEletronicosList, ConfiguracaoServico configuracaoServico = null)
{
var enviCte = PreparaEnvioCTe(lote, cteEletronicosList, configuracaoServico);

        var webService = WsdlFactory.CriaWsdlCteRecepcao(configuracaoServico);

        OnAntesDeEnviar(enviCte);

        var retornoXml = await webService.cteRecepcaoLoteAsync(enviCte.CriaRequestWs(configuracaoServico));

        var retorno = retEnviCte.LoadXml(retornoXml.OuterXml, enviCte);
        retorno.SalvarXmlEmDisco(configuracaoServico);

        return retorno;
    }
     private static enviCTe PreparaEnvioCTe(int lote, List<CTeEletronico> cteEletronicosList, ConfiguracaoServico configuracaoServico = null)
    {
        var instanciaConfiguracao = configuracaoServico ?? ConfiguracaoServico.Instancia;

        var enviCte = ClassesFactory.CriaEnviCTe(lote, cteEletronicosList, instanciaConfiguracao);

        if (instanciaConfiguracao.tpAmb == TipoAmbiente.Homologacao)
        {
            foreach (var cte in enviCte.CTe)
            {
                const string razaoSocial = "CT-E EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL";

                cte.infCte.rem.xNome = razaoSocial;
                cte.infCte.dest.xNome = razaoSocial;
            }
        }


        foreach (var cte in enviCte.CTe)
        {
            cte.infCte.ide.tpEmis = instanciaConfiguracao.TipoEmissao;
            cte.Assina(instanciaConfiguracao);
            cte.infCTeSupl = cte.QrCode(instanciaConfiguracao.X509Certificate2, Encoding.UTF8, instanciaConfiguracao.IsAdicionaQrCode, UrlHelper.ObterUrlQrCode(instanciaConfiguracao));

            if (configuracaoServico.IsValidaSchemas)
                cte.ValidaSchema(instanciaConfiguracao);

            cte.SalvarXmlEmDisco(instanciaConfiguracao);
        }

        if (configuracaoServico.IsValidaSchemas)
            enviCte.ValidaSchema(instanciaConfiguracao);

        enviCte.SalvarXmlEmDisco(instanciaConfiguracao);
        return enviCte;
    }

Eu utilizei "ServicoCTeRecepcao().CTeRecepcaoSincronoV4" diretamente e parece estar funcionando. Pelo que entendi agora não é mais assíncrona a chamada para o sefaz, então talvez o método "ServicoEnviarCte().EnviarAsync" perdeu sua utilidade.

@Gabriel-Di-Domenico

Sim, o CTe não permite mais envio assincrono.

Eu não tive tempo de parar e ver seu caso ainda, talvez consiga no final de semana, mas então vou para alguns fatos:

  1. CT-e só síncrono**.
  2. Uso em produção aqui.

Eu consegui emitir CTE usando ServicoCTeRecepcao().CTeRecepcaoSincronoV4, segui exemplo do app.teste
Mas estou tendo problemas ao utilizar outras funções, como cancelamento, consulta protocolo e consulto status. Mas não deve ter relação com esta issue, vou estudar mais esse erro e talvez eu abra outra issue.