BoletoNet / boleto2net

Nova versão do Boleto.Net
Apache License 2.0
162 stars 139 forks source link

Código de cedente com 6 dígitos - Banco do Brasil - Carteira 17/019 #292

Closed MatheusJordao closed 3 years ago

MatheusJordao commented 3 years ago

Boa tarde,

Estou com um problema no Banco do Brasil com um cliente que possui o código de cedente com 6 dígitos (199047), o banco está informando que o Segmento P está incorreto.


Orientações: Regularize as informações abaixo;

Segmento P < Lote 0001 >

Posições 038 a 057: Preencher o nosso número da seguinte forma: '199047NNNNNZbbbbbbbb' onde 'N' = numeração livre a cargo da empresa, 'Z' = dígito verificador e 'b' = brancos


Conforme imagem abaixo, existem 3 maneiras de gerar o Nosso Número, quando o convênio possui 4, 6 e 7 posições. Alguém já teve esse problema? Pelo que vi no Boleto2Net sempre é gerado da mesma forma, com 7 posições.

image

Manual BB.pdf

rafd75 commented 3 years ago

@MatheusJordao boa tarde.

Qual carteira vc está utilizando? Carteira 17? Se for, essa regra deveria ser implementada aqui:

https://github.com/BoletoNet/boleto2net/blob/ac2467d3a57ac6bd0cbb48f6150938d287229391/Boleto2.Net/Banco/Carteiras/BancoBrasil/BancoBrasilCarteira17.cs#L16

MatheusJordao commented 3 years ago

@rafd75 boa tarde,

Sim, carteira 17. Porém no trecho abaixo ele retorna uma mensagem informando que o código de cedente não possui 7 dígitos:

https://github.com/BoletoNet/boleto2net/blob/ac2467d3a57ac6bd0cbb48f6150938d287229391/Boleto2.Net/Banco/Carteiras/BancoBrasil/BancoBrasilCarteira17.cs#L24

Eu estava usando um PadLeft com '0' para garantir 7 dígitos e o arquivo é gerado corretamente e válido de acordo com o validador do próprio BB (https://gmtedi.bb.com.br/validaleiaute/). Mas o banco retornou informando que está incorreto.

Atualmente ele gera o nosso número igual para todos os casos:

Onde: C = Convênio S = Sequencial D = dígito verificador

Obs: O DV não é informado nessa função.

rafd75 commented 3 years ago

Ah... Agora entendi... Vc adicionou "ZERO" para fazer ficar com tamanho 7 ... mas como no banco está cadastrado com 6, o algoritmo não vai bater.

O que vai ser necessário fazer é implementar nessa função a lógica para convênios com 6 dígitos...

Algo assim:

public void FormataNossoNumero(Boleto boleto) -- se tem 6 dígitos, FormataNossoNumero6dig(Boleto boleto) --- se tem 7 d´giitos então FormataNossoNumero7dig(Boleto boleto) -- caso contrário, da a exception acima - com a mensagem "código cedente não tem 6 ou 7 dígitos"

extrair o código já existente para um novo método private FormataNossoNumero7dig e depois duplicar esse método e implementar a lógica para 6digitos.

MatheusJordao commented 3 years ago

Boa tarde,

Fiz a implementação necessária e o arquivo está sendo gerado conforme validador do BB. Posso fazer um pull request?

Também tive que fazer alterações no código de barras, estou deixando aqui o manual que informa como ele deve ser gerado.

Manual.pdf

rafd75 commented 3 years ago

@MatheusJordao , boa tarde...

Isso é bom para o projeto... vamos incorporar aqui sim.

Só sugiro um detalhe (caso não tenha pensado nisso)... Já existe o teste unitário da carteira 17 (que está utilizando um cedente com 7 dígitos)...

Duplicar esse teste, e criar as rotinas para validar com 6 dígitos também.

Dessa forma, se alguém alterar qualquer coisa no código, será testado os dois cenários...

Consegue implementar esse teste? ... em seguida, manda o PR ...