Skip to content

Commit

Permalink
Merge pull request BoletoNet#331 from cdsistemas/btgpactual
Browse files Browse the repository at this point in the history
Correção na linha digitável BTG Pactual
  • Loading branch information
carloscds authored Sep 25, 2024
2 parents 9bd0df8 + d189534 commit 817e4b3
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 32 deletions.
2 changes: 1 addition & 1 deletion BoletoNetCore/Banco/BTGPactual/BancoBTGPactual.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public BancoBTGPactual()
{
Codigo = 208;
Nome = "BTG Pactual";
Digito = "2";
Digito = "1";
IdsRetornoCnab400RegistroDetalhe = new List<string> { "1" };
RemoveAcentosArquivoRemessa = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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";
}
}
}
47 changes: 29 additions & 18 deletions BoletoNetCore/Extensions/StringExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}

Expand Down

0 comments on commit 817e4b3

Please sign in to comment.