diff --git a/BoletoNetCore/Banco/BTGPactual/BancoBTGPactual.cs b/BoletoNetCore/Banco/BTGPactual/BancoBTGPactual.cs index c7bc57a..267f532 100644 --- a/BoletoNetCore/Banco/BTGPactual/BancoBTGPactual.cs +++ b/BoletoNetCore/Banco/BTGPactual/BancoBTGPactual.cs @@ -11,7 +11,7 @@ public BancoBTGPactual() { Codigo = 208; Nome = "BTG Pactual"; - Digito = "2"; + Digito = "1"; IdsRetornoCnab400RegistroDetalhe = new List { "1" }; RemoveAcentosArquivoRemessa = true; } diff --git a/BoletoNetCore/Banco/BTGPactual/Carteiras/BancoBTGPactualCarteira01.cs b/BoletoNetCore/Banco/BTGPactual/Carteiras/BancoBTGPactualCarteira01.cs index 65a2941..153ca0b 100644 --- a/BoletoNetCore/Banco/BTGPactual/Carteiras/BancoBTGPactualCarteira01.cs +++ b/BoletoNetCore/Banco/BTGPactual/Carteiras/BancoBTGPactualCarteira01.cs @@ -18,9 +18,10 @@ public void FormataNossoNumero(Boleto boleto) if (string.IsNullOrWhiteSpace(boleto.NossoNumero)) throw new Exception("Nosso Número não informado."); - // Nosso número não pode ter mais de 8 dígitos - if (boleto.NossoNumero.Length > 8) - throw new Exception($"Nosso Número ({boleto.NossoNumero}) deve conter 8 dígitos."); + // Nosso número não pode ter mais de 11 dígitos + const int tamanhoMaximoNossoNumero = 11; + if (boleto.NossoNumero.Length > tamanhoMaximoNossoNumero) + throw new Exception($"Nosso Número ({boleto.NossoNumero}) deve conter {tamanhoMaximoNossoNumero} dígitos."); var contaBancaria = boleto.Banco.Beneficiario.ContaBancaria; @@ -30,22 +31,19 @@ public void FormataNossoNumero(Boleto boleto) if (contaBancaria.Agencia.Length != 4) throw new NotImplementedException($"Não foi possível formatar o campo livre: Numero de Agencia ({contaBancaria.Agencia}) não possui 4 dígitos."); - boleto.NossoNumero = boleto.NossoNumero.PadLeft(8, '0'); - boleto.NossoNumeroDV = (boleto.Banco.Beneficiario.ContaBancaria.Agencia + boleto.Banco.Beneficiario.ContaBancaria.Conta + boleto.Carteira + boleto.NossoNumero).CalcularDVBancoBTGPactual(); - boleto.NossoNumeroFormatado = $"{boleto.Carteira}/{boleto.NossoNumero}-{boleto.NossoNumeroDV}"; + boleto.NossoNumero = boleto.NossoNumero.PadLeft(tamanhoMaximoNossoNumero, '0'); + boleto.NossoNumeroDV = (boleto.NossoNumero).CalcularDVBancoBTGPactual(); + boleto.NossoNumeroFormatado = $"{boleto.Carteira.PadLeft(3, '0')}/{boleto.NossoNumero.PadLeft(10, '0')}-{boleto.NossoNumeroDV}"; } public string FormataCodigoBarraCampoLivre(Boleto boleto) { return - $"00" + - $"{boleto.Carteira}" + - $"{boleto.NossoNumero}" + - $"{boleto.NossoNumeroDV}" + $"{boleto.Banco.Beneficiario.ContaBancaria.Agencia}" + - $"{boleto.Banco.Beneficiario.ContaBancaria.Conta}" + - $"{boleto.Banco.Beneficiario.ContaBancaria.DigitoConta}" + - $""; + $"{Convert.ToInt32(boleto.Carteira).ToString().PadLeft(2, '0')}" + + $"{boleto.NossoNumero}" + + $"{boleto.Banco.Beneficiario.ContaBancaria.Conta.Substring(boleto.Banco.Beneficiario.ContaBancaria.Conta.Length - 7)}" + + $"0"; } } } \ No newline at end of file diff --git a/BoletoNetCore/Extensions/StringExtensions.cs b/BoletoNetCore/Extensions/StringExtensions.cs index 45d85ba..13c980a 100644 --- a/BoletoNetCore/Extensions/StringExtensions.cs +++ b/BoletoNetCore/Extensions/StringExtensions.cs @@ -216,33 +216,44 @@ public static string CalcularDVBancoInter(this string texto) return digitoFinal.ToString(); } - public static string CalcularDVBancoBTGPactual(this string texto) + public static string CalcularDVBancoBTGPactual(this string nossoNumero) { - // Multiplicadores (pesos) de 2 a 9, repetidos da direita para a esquerda - int[] pesos = { 2, 3, 4, 5, 6, 7, 8, 9 }; - int soma = 0; - int pesoIndex = 0; + var soma = 0; + var multiplicador = 2; - // Percorre os dígitos do "Nosso Número" da direita para a esquerda - for (int i = texto.Length - 1; i >= 0; i--) + // Percorrer o número de trás para frente + for (int i = nossoNumero.Length - 1; i >= 0; i--) { - // Pega o dígito atual - int digito = int.Parse(texto[i].ToString()); - - // Multiplica o dígito pelo peso correspondente - soma += digito * pesos[pesoIndex]; + // Multiplicar cada dígito pela sequência crescente de 2 a 9 + int numero = int.Parse(nossoNumero[i].ToString()); + soma += numero * multiplicador; - // Avança no array de pesos (recomeça do início se necessário) - pesoIndex = (pesoIndex + 1) % pesos.Length; + // Atualizar o multiplicador (2 a 9 e depois volta para 2) + multiplicador++; + if (multiplicador > 9) + { + multiplicador = 2; + } } - var resto = soma % 11; - + // Aplicar o Módulo 11 + int resto = soma % 11; + int digitoVerificador; + if (resto == 0 || resto == 1) { - return "0"; + digitoVerificador = 1; // Regra para evitar dígito zero } - return (11 - resto).ToString(); + else if (resto == 10) + { + digitoVerificador = 1; // Também pode ser 1, dependendo da regra do banco + } + else + { + digitoVerificador = 11 - resto; + } + + return digitoVerificador.ToString(); } }