Ir para conteúdo
  • Cadastre-se

dev botao

Recommended Posts

  • Membros Pro
Postado

Prezados, bom dia !!

Eu gostaria de tirar algumas dúvidas acerca da configuração acbr.

Eu tenho um projeto para captura de CTE. Toda vez que eu mudo de empresa, para realizar a captura, eu faço o seguinte código:

Instancio a classe de serviço...

acbrcteservico = new AcbrCTeServico(empresacteselecaomodel, certificadodigitalkeevo);

E chamo o método de distribuicaoDfe

var resposta = acbrcteservico.DistribuicaoDFe();

A minha dúvida é a seguinte... qdo instancio a classe, chamo o método ConfigurarCertificado.

Esse método está todo descrito abaixo.

1) Gostaria de saber se está faltando alguma configuração que não foi passada..

2) Ao final do método, eu chamo o acbrCTe.ConfigGravar(); É necessário ?

3) A propriedade acbrCTe.Config.Principal.LogPath é apenas caso eu queria gravar log ?

4) Eu preciso preencher a prop PathCTe ?

Desde já agradeço a atenção !!!

CÓDIGO DA CLASSE DE SERVICO (AcbrCTeServico)

using Dfe.Pacotes.Infra.IntegracaoApi.Models.Passaporte;
using Keevo.Pacotes.Infra.ACBrLib.Core.DFe;
using Keevo.Pacotes.Infra.ACBrLib.CTe;
using Keevo.Pacotes.Infra.ACBrLib.CTe.Models;
using Keevo.Pacotes.Infra.Utils.Conversao;
using Keevo.Pacotes.Infra.Utils.Criptografia;
using Keevo.Pacotes.Infra.Utils.Diretorio;
using Keevocenter.Pacotes.Infra.IntegracaoApi.Models.Certificado;

namespace Dfe.Monitor.CapturaCte.Servicos
{
    public class AcbrCTeServico : IDisposable
    {
        public ACBrCTe acbrcte { get; set; }
        public EmpresaParametrosCteSelecaoModel empresacte { get; set; }
        public CertificadoPorParametrosModel certificadodigitalkeevo { get; set; }
        public AcbrCTeServico(EmpresaParametrosCteSelecaoModel empresacte, CertificadoPorParametrosModel certificadodigitalkeevo)
        {
            try
            {
                acbrcte = new();
                this.empresacte = empresacte;
                this.certificadodigitalkeevo = certificadodigitalkeevo;
                ConfigurarCertificado(acbrcte, certificadodigitalkeevo);
            }
            catch (Exception e)
            {
                Console.WriteLine($"AcbrCTeServico - Schemas: {acbrcte?.Config.PathSchemas} - StackTrace - {e.StackTrace}");
            }
        }

        public DistribuicaoDFeResposta<TipoCTe> DistribuicaoDFe()
        {
            Console.WriteLine($"Código NFE: {empresacte.codigonfe.ToInt()} - CNPJ: {empresacte.cnpj} - NSU: {empresacte.ultimonsu ?? ("0").PadLeft(15, '0')} Schemas: {acbrcte.Config.PathSchemas}");

            return TratarDfeResposta(acbrcte.DistribuicaoDFe(empresacte.codigonfe.ToInt(),
                                                             empresacte.cnpj,
                                                             empresacte.ultimonsu ?? ("0").PadLeft(15, '0'), ""));
        }
        public DistribuicaoDFeResposta<TipoCTe> DistribuicaoDFe(long ultimonsu) => DistribuicaoDFe(ultimonsu.ToString().PadLeft(15, '0'));
        public DistribuicaoDFeResposta<TipoCTe> DistribuicaoDFe(string ultimonsu) => TratarDfeResposta(acbrcte.DistribuicaoDFe(empresacte.codigonfe.ToInt(),
                                                                                                     empresacte.cnpj,
                                                                                                     ultimonsu, ""));

        public DistribuicaoDFeResposta<TipoCTe> DistribuicaoCtePorNSU(long nsu) => DistribuicaoCtePorNSU(nsu.ToString().PadLeft(15, '0'));
        public DistribuicaoDFeResposta<TipoCTe> DistribuicaoCtePorNSU(string nsu) => TratarDfeResposta(acbrcte.DistribuicaoDFePorNSU(empresacte.codigonfe.ToInt(),
                                                                                                     empresacte.cnpj,
                                                                                                     nsu));
        public DistribuicaoDFeResposta<TipoCTe> DistribuicaoCtePorChave(string chave)
            => DistribuicaoCtePorChave(empresacte, chave);
        public DistribuicaoDFeResposta<TipoCTe> DistribuicaoCtePorChave(EmpresaParametrosCteSelecaoModel empresacte, string chave)
            => TratarDfeResposta(acbrcte.DistribuicaoDFePorChave(empresacte.codigonfe.ToInt(), empresacte.cnpj, chave));

        public DistribuicaoDFeResposta<TipoCTe> TratarDfeResposta(string resposta) => DistribuicaoDFeResposta<TipoCTe>.LerResposta(resposta);

        public void ConfigurarCertificado()
        {
            ConfigurarCertificado(acbrcte, certificadodigitalkeevo);
        }

        public static void ConfigurarCertificado(ACBrCTe acbrCTe, CertificadoPorParametrosModel certificadodigitalkeevo)
        {
            acbrCTe.Config.DFe.SSLCryptLib = GetSSLCryptLib();
            acbrCTe.Config.DFe.SSLHttpLib = GetSSLHttpLib();
            acbrCTe.Config.DFe.SSLXmlSignLib = SSLXmlSignLib.xsLibXml2;
            acbrCTe.Config.DFe.DadosPFX = certificadodigitalkeevo.arquivocertificado;
            acbrCTe.Config.DFe.Senha = KeevoCrypto.Decrypt(certificadodigitalkeevo.senha);
            acbrCTe.Config.Ambiente = TipoAmbiente.taProducao;
            //acbrCTe.Config.SalvarArq = false;
            //acbrCTe.Config.SalvarGer = false;
            

            //Configurações para processamento
            acbrCTe.Config.SSLType = SSLType.LT_TLSv1_2;
            acbrCTe.Config.Timeout = 25000;
            acbrCTe.Config.AguardarConsultaRet = 0;
            acbrCTe.Config.Tentativas = 5;
            acbrCTe.Config.IntervaloTentativas = 1000;
            acbrCTe.Config.DFe.TimeZoneModo = TimezoneMode.tzManual;
            acbrCTe.Config.DFe.TimeZoneStr = "-03:00";
            //acbrCTe.Config.PathSchemas = KeevoDiretorio.AppPath() + @"/Schemas/CTe";
            acbrCTe.Config.PathSchemas = Path.Combine(KeevoDiretorio.AppPath(), "Schemas", "CTe");

            //acbrCTe.Config.Principal.LogNivel = Keevo.Pacotes.Infra.ACBrLib.Core.NivelLog.logParanoico;
            //acbrCTe.Config.Principal.LogPath = KeevoDiretorio.AppPath();
            acbrCTe.ConfigGravar();

        }

        private static SSLCryptLib GetSSLCryptLib() => ACBrCTe.IsWindows ? SSLCryptLib.cryWinCrypt : SSLCryptLib.cryOpenSSL;
        private static SSLHttpLib GetSSLHttpLib() => ACBrCTe.IsWindows ? SSLHttpLib.httpWinHttp : SSLHttpLib.httpOpenSSL;
        public void Dispose()
        {
            acbrcte.Dispose();
        }
    }
}

 

  • Consultores
Postado

Boa tarde!

1 hour ago, TimeB256 said:

1) Gostaria de saber se está faltando alguma configuração que não foi passada..

No geral as configurações me parecem estar em ordem.

Você definiu SSLCryptLib, SSLHttpLib, SSLXmlSignLib, DadosPFX, Senha e SSLType.

Essas sãos a configurações mínimas para poder utilizar certificado.

Você definiu o ambiente e o PathSchemas que são importantes e necessárias.

Como você mencionou que o contexto é utilizar para distribuição DFe, acrescentaria essas duas propriedades:

//Define o caminho onde os arquivos da DistribuiçãoDFe serão salvos
ACBrCTe.Config.Download.PathDownload = "";

//Define se os arquivos serão salvos separando por nome do tipo do XML.
ACBrCTe.Config.Download.SepararPorNome = "1";

 

1 hour ago, TimeB256 said:

2) Ao final do método, eu chamo o acbrCTe.ConfigGravar(); É necessário ?

Sim, é necessário para que as informações sejam devidamente alteradas no arquivo ACBrLib.ini

1 hour ago, TimeB256 said:

3) A propriedade acbrCTe.Config.Principal.LogPath é apenas caso eu queria gravar log ?

O Log sempre é gravado a menos que você defina:

ACBrCTe.Config.Principal.LogNivel = NivelLog.logNenhum;

Se você não definir o LogPath, então vai ser gerado dentro da pasta do .EXE;

No geral acredito que seja interessante manter um log para controle.

Se sua preocupação é quanto ao tamanho do arquivo, você pode definir níveis de log mais simples e deixar os mais complexos para casos em que análises de problemas sejam necessárias.

2 hours ago, TimeB256 said:

4) Eu preciso preencher a prop PathCTe ?

Ela define onde serão salvos os XMLs do CT-e.

Para este contexto de DistribuicaoDFe e considerando que você definiu o valor false para o SalvarArq, diria que não há necessidade.

Mas no geral, o preenchimento dela é sim necessário.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Consultores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...