Erro no calculo do DV do campo Nosso Número, Banco do Brasil

Jun 4, 2009 at 3:22 PM

Bom dia, Pessoal!

Fazendo alguns testes de pagamento de boleto detectamos, em alguns casos, erro no cálculo do DV, para o banco do brasil.

Vejam:

 

Errados Corretos
10342029000000111-1 10342029000000111-0
10342029000000148-1 10342029000000148-x
10342029000000151-1 10342029000000151-x
10342029000000142-1 10342029000000142-0

E fazendo o cálculo de acordo com o manual, anexo aqui na documentação, DVMD11.doc, realmente o resultado está errado.

Já estou verificando,  mas caso alguém já tenha corrigido, favor informar!

Obrigado,

George

Jun 4, 2009 at 6:14 PM

Pessoal,

Percebi que na classe Utils.cs existem três métodos para cálcular o DV de Módulo 11, porém nenhum tratava a condição específica do Banco do Brasil, que se o resto do cálculo for igual a 10 o DV vira X.

Sendo assim, criei um método a mais na classe Utils.cs, conforme abaixo:

internal static string Mod11BancoBrasil(string value)
{
#region Trecho do manual DVMD11.doc
/*
Multiplicar cada algarismo que compõe o número pelo seu respectivo multiplicador (PESO).
Os multiplicadores(PESOS) variam de 9 a 2.
O primeiro dígito da direita para a esquerda deverá ser multiplicado por 9, o segundo por 8 e assim sucessivamente.
O resultados das multiplicações devem ser somados:
72+35+24+27+4+9+8=179
O total da soma deverá ser dividido por 11:
179 / 11=16
RESTO=3

Se o resto da divisão for igual a 10 o D.V. será igual a X.
Se o resto da divisão for igual a 0 o D.V. será igual a 0.
Se o resto for menor que 10, o D.V. será igual ao resto.

No exemplo acima, o dígito verificador será igual a 3

*/
#endregion

string Digito;
int Soma = 0, Peso = 9, Base = 2;

for (int i = value.Length-1; i >= 0; i--)
{
Soma += (int.Parse(value[i].ToString()) * Peso);
if (Peso == Base)
Peso = 9;
else
Peso--;
}

int Resto = (Soma % 11);
if (Resto == 10)
Digito = "X";
else if (Resto == 0)
Digito = "0";
else
Digito = Resto.ToString();

return Digito;
}

E na classe Banco\Banco_Brasil.cs, no método FormataNossoNumero, mudei para:

public override void FormataNossoNumero(Boleto boleto)
{
boleto.NossoNumero = string.Format("{0}/{1}-{2}", LimparCarteira(boleto.Carteira), boleto.NossoNumero,
Utils.Mod11BancoBrasil(boleto.NossoNumero));
}

Já pagamos os boletos e funcionou o pagamento. Se der algum erro amanhã, no arquivo de retorno do banco, informo a vocês.

Abraços,
George

Coordinator
Jun 4, 2009 at 7:25 PM

Olá George,

eu ja tinha percebi esse problema com os métodos Mod10, Mod11 por terem regras especificas para cada banco. Acho que podemos jogar esse metodo na classe do proprio Banco, assim fica melhor.

De qualquer forma valeu pela contribuição. Vou fazer os ajustes...

Jun 5, 2009 at 2:33 PM

Bom dia!

Informo que os boletos foram recebidos perfeitamente! Em fim, processo de validação e baixa de boleto com o Banco do Brasil concluídos!!

 

Stiven,

Depois que fizer as alterações, me avise para eu atualizar meu código de acordo com padrão que você criar.

 

Obrigado,
George