Como formatar o NOSSO NUMERO para Banco do Brasil

Nov 6, 2010 at 7:15 PM

E ae pessoal!

Estou com um problema que não consigo resolver.

Ficou bem confuso para mim entender como devo formatar o NOSSO NUMERO para os boletos do BANCO DO BRASIL.

No construtor da classe Boleto eu devo passar o NOSSO NUMERO com qual formatação?

Atualmente a instancia da classe Boleto está sendo feita da seguinte maneira:

string DIGITO_NOSSO_NUMERO = this.DigitoModulo11(Convert.ToInt64(CODIGO_CONVENIO)).ToString();
string NOSSO_NUMERO = CODIGO_CONVENIO + DIGITO_NOSSO_NUMERO;
Boleto b = new Boleto(DateTime.Now, Convert.ToDouble(VALOR_BOLETO), "17", NOSSO_NUMERO, c);

Enfim, só falta isso pra funcionar (pelo menos é o que parece).

:)

Se alguém puder me ajudar ficarei muito agradecido.

Obrigado

h1j4ck3r

Nov 8, 2010 at 2:35 AM

Eu fiz assim:

BoletoNet.Boleto b = new BoletoNet.Boleto(DateTime.Now.AddDays(5), (double)orderValue, "18-019", String.Format("{0:0000000000}", code), c);

 

mas minha carteira é diferente da sua. 

No meu caso o nosso numero é um alor qualquer de 10 digitos que é adicionado na frente o numero do convenio.

 

abraços

Nov 8, 2010 at 5:02 PM

É... como sempre ninguém pode me ajudar.

Esse forum está meio parado ou é impressão minha?

De qualquer form bitten, obrigado pelo seu retorno, mas esse é exatamente o mesmo jeito que eu estou fazendo, pois o uso do NOSSO NUMERO me parece mal documentado.

Vamos aguardar e ver se alguma boa alma nos ajuda a decifrar a formatação para a carteira 17.

Obrigado

h1j4ck3r

Coordinator
Nov 8, 2010 at 6:25 PM

Olá h1j4ck3r,

ao verificar na classe Banco_Brasil.cs para ver se a carteira 17 do BB estava implementada. Percebi que para esta carteira é necessário o número do convênio do cedente para validar o tamanho do nosso número, conforme aos trechos de códigos abaixo:

#region Carteira 17
            //Carteira 17
            if (boleto.Carteira.Equals("17"))
            {
                switch (boleto.Cedente.Convenio.ToString().Length)
                {
                    //O BB manda como padr�o 7 posi��es, mas � poss�vel solicitar um conv�nio com 6 posi��es na carteira 17
                    case 6:
                        if (boleto.NossoNumero.Length > 12)
                            throw new NotImplementedException(string.Format("Para a carteira {0}, a quantidade m�xima s�o de 12 de posi��es para o nosso n�mero", boleto.Carteira));
                        boleto.NossoNumero = Utils.FormatCode(boleto.NossoNumero, 12);
                        break;
                    case 7:
                        if (boleto.NossoNumero.Length > 17)
                            throw new NotImplementedException(string.Format("Para a carteira {0}, a quantidade m�xima s�o de 10 de posi��es para o nosso n�mero", boleto.Carteira));
                        boleto.NossoNumero = string.Format("{0}{1}", boleto.Cedente.Convenio, Utils.FormatCode(boleto.NossoNumero, 11));
                        break;
                    default:
                        throw new NotImplementedException(string.Format("Para a carteira {0}, o n�mero do conv�nio deve ter 6 ou 7 posi��es", boleto.Carteira));
                }
            }
            #endregion Carteira 17


Que para número do convênio de 6 posições, o nosso número são de 12 posições e convênico com 7 posições, o nosso número são de 17 posições.

Acho que isso possa te ajudar.

PS: No link http://boletonet.codeplex.com/wikipage?title=Documenta%c3%a7%c3%a3o&referringTitle=Home existem alguns documentos que disponibilizei para eventuais consultas.

;)

Stiven

Nov 8, 2010 at 6:38 PM
Edited Nov 17, 2010 at 10:01 PM

Olá Stiven!

Obrigado pela sua resposta.

Eu já havia debulhado esses documentos do link. Já sabia também que no meu caso o nosso número deveria ter 17 posições, pois o meu código de cedente tem 7 posições.

A única diferença que notei neste link que você enviou foi a inclusão da carteira 17, que até Domingo pelo menos não constava na lista de carteiras.

Mesmo sabendo de tudo isso o boleto ainda é gerado de maneira errada. Não sei se sou eu quem está fazendo alguma coisa errada, ou se existe um bug na carteira 17, pois eu informo o NOSSO NUMERO com 17 posições e o boleto permanece errado.

O que será que está acontecendo?

Muito obrigado.

Coordinator
Nov 8, 2010 at 6:56 PM

Olá Cezar,

Mas você poderia baixar a ultima versao (código fonte) do projeto (http://boletonet.codeplex.com/SourceControl/changeset/view/68511) e debugar? Adicione o projeto Boleto.Net na sua "solution". Ou, no projeto web do Boleto.Net.Site no arquivo bancos\BancoBrasil.aspx.cs, inclua exatamente as suas informações e debugue. 

Vai ajudar a descobrir onde exatamente acontece o erro.

Aqui no meu trabalho não estou podendo abrir o projeto Boleto.Net devido a regras da empresa, senão te ajudava com esse probleminha.Qualquer coisa só falar.

Stiven

 

Nov 8, 2010 at 7:30 PM

Stiven, boa tarde.

Obrigado por se interessar e querer ajudar.

Eu estou fazendo os testes exatamente através do projeto 68511.

Nenhum erro é disparado pela classe Boleto.Net, nem mesmo se adiciono o debugger para erros tratados.

Para facilitar segue o codigo completo de como estou utilizando o Boleto.Net.

Basta colar este codigo no code behind da pagina BancodoBrasil.aspx.cs (incluiso no projeto 68511), e rodar.

Note que o valor do boleto que é de R$ 0.01 não aparece corretamente no código de barras.

Segue o código:

 

using System;
using BoletoNet;

public partial class Bancos_BancodoBrasil : System.Web.UI.Page
{
    void Page_PreInit(object sender, EventArgs e)
    {
        if (IsPostBack)
            MasterPageFile = "~/MasterPrint.master";
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        DateTime vencimento = new DateTime(2008, 11, 11);

	Cedente c = new Cedente("07.484.845/0001-098, "EMPRESA QUALQUER", "0411", "5", "32871", "4");
	c.Convenio = 2198427;
	Boleto b = new Boleto(DateTime.Now.AddDays(4), 0.01, "17", "21984270000000001", c);
	b.TipoModalidade = "17";

        b.NumeroDocumento = "12415487";

        b.Sacado = new Sacado("000.000.000-00", "Nome do seu Cliente ");
        b.Sacado.Endereco.End = "Endere�o do seu Cliente ";
        b.Sacado.Endereco.Bairro = "Bairro";
        b.Sacado.Endereco.Cidade = "Cidade";
        b.Sacado.Endereco.CEP = "00000000";
        b.Sacado.Endereco.UF = "UF";     

        //Adiciona as instru��es ao boleto
        #region Instru��es
        //Protestar
        Instrucao_BancoBrasil item = new Instrucao_BancoBrasil(9, 5);
        b.Instrucoes.Add(item);
        //ImportanciaporDiaDesconto
        item = new Instrucao_BancoBrasil(30, 0);
        b.Instrucoes.Add(item);
        //ProtestarAposNDiasCorridos
        item = new Instrucao_BancoBrasil(81, 15);
        b.Instrucoes.Add(item);
        #endregion Instru��es

        boletoBancario.Boleto = b;
        boletoBancario.Boleto.Valida();

        boletoBancario.MostrarComprovanteEntrega = (Request.Url.Query == "?show");
    }
}

Espero que me ajude a identificar o problema.

[]s

h1j4ck3r

 

Nov 8, 2010 at 7:53 PM

Stiven, problema aparentemente identificado.

Linha 427 da classe Banco_Brasil.cs última versão.

Existe um if nesta linha, e acredito que o correto seria um else if, pois somente com IF o código sempre cairá no ELSE logo abaixo dele, bagunçando geral o código de barras.

Ficaria deste jeito (em negrito) o trecho de código que ao meu ver seria o correto:

#region Carteira 17
            if (boleto.Carteira.Equals("17"))
            {
                if (boleto.Cedente.Convenio.ToString().Length == 7)
                {
                    boleto.CodigoBarra.Codigo = string.Format("{0}{1}{2}{3}{4}{5}{6}",
                        Utils.FormatCode(Codigo.ToString(), 3),
                        boleto.Moeda,
                        FatorVencimento(boleto),
                        valorBoleto,
                        "000000",
                        boleto.NossoNumero,
                        Utils.FormatCode(LimparCarteira(boleto.Carteira), 2));
                }
-->             else if (boleto.Cedente.Convenio.ToString().Length == 6)
                {
                    boleto.CodigoBarra.Codigo = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}",
                        Utils.FormatCode(Codigo.ToString(), 3),
                        boleto.Moeda,
                        FatorVencimento(boleto),
                        valorBoleto,
                        Strings.Mid(boleto.NossoNumero, 1, 11),
                        boleto.Cedente.ContaBancaria.Agencia,
                        boleto.Cedente.ContaBancaria.Conta,
                        boleto.Carteira);
                }
                else
                {
                    boleto.CodigoBarra.Codigo = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}",
                        Utils.FormatCode(Codigo.ToString(), 3),
                        boleto.Moeda,
                        FatorVencimento(boleto),
                        valorBoleto,
                        boleto.NossoNumero,
                        boleto.Cedente.ContaBancaria.Agencia,
                        boleto.Cedente.ContaBancaria.Conta,
                        boleto.Carteira);
                }
            }
            #endregion Carteira 17

Coordinator
Nov 9, 2010 at 1:11 PM

E ai Cesar,

era isso mesmo? Posso corrigir no projeto?

;)

Stiven

Nov 9, 2010 at 1:28 PM
Edited Nov 17, 2010 at 10:02 PM

Bom dia Stiven!

Era isso mesmo! Gerei um novo boleto com esse reparo e o problema foi resolvido!

UFA! Já estava ficando louco!

Pode corrigir sem pensar que eu agarantio!

[]s

Nov 9, 2010 at 1:49 PM
Edited Nov 17, 2010 at 10:02 PM

Stiven, bom dia.

Tinha mais um problema, o qual quase me eskeci de comentar.

Linha 103 da classe Banco_Brasil.cs

Atualmente esta linha está assim:

 

boleto.NossoNumero = string.Format("{0}{1}", boleto.Cedente.Convenio, Utils.FormatCode(boleto.NossoNumero, 11));

 

Acredito que o correto seja assim:

 

boleto.NossoNumero = string.Format("{0}{1}", boleto.Cedente.Convenio, Utils.FormatCode(boleto.NossoNumero, 10));

 

Troque o valor 11 para 10, pois para carteira 17 o nosso numero deve possuir 17 caracteres, logo, se o convenio possui 7 caracteres, nos restam 10 a serem colocados no NOSSO NUMERO, e não 11.

Isso tb estava gerando problemas para mim na hora de gerar o boleto ontem a tarde, mas só agora lembrei dessa alteração.

Qualquer coisa é só falar.

[]s