CNAB240 BB: inconsistência nosso numero

Mar 25, 2013 at 3:48 PM
Bom dia,

Estou implementando para um cliente, o BB (carteira 17-019) e ao gerar o CNAB240, me deparei uma questão:

O nosso número está com uma inconsistência ao preencher as posições 34-53 do arquivo. Fui debugando o sistema com o fonte da biblioteca para ir rastreando e encontrei: no método de ValidaBoleto(), ele está modificando a propriedade nossonumero e acrescentando a carteira, para que seja exibida da seguinte forma no canhoto do boleto: 17/CCCCCCCNNNNNNNNNN.

Porém, quando é gerado o arquivo, ele pega essa propriedade com as 17 posições e poe no arquivo, porém ficaria errado: 17/CCCCCCCNNNNNNN (esta montando assim no arquivo).

Não realizei qualquer alteração em particular, preferi informar aqui para que seja feita uma possível análise e em caso de correção para manter o padrão do projeto :)
Developer
Mar 25, 2013 at 9:57 PM
Olá marcelhsouza.

De acordo com meu código, está rodando tudo certinho.
Verifique se na "#region Carteira 17-019", dentro do método ValidaBoleto(), está conforme a minha versão:
            #region Carteira 17-019
            //Carteira 17, com variação 019
            if (boleto.Carteira.Equals("17-019"))
            {
                /*
                 * Convênio de 7 posições
                 * Nosso Número com 17 posições
                 */
                if (boleto.Cedente.Convenio.ToString().Length == 7)
                {
                    if (boleto.NossoNumero.Length > 10)
                        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, 10));
                }
                /*
                 * Convênio de 6 posições
                 * Nosso Número com 11 posições
                 */
                else if (boleto.Cedente.Convenio.ToString().Length == 6)
                {
                    //Nosso Número com 17 posições
                    if ((boleto.Cedente.Codigo.ToString().Length + boleto.NossoNumero.Length) > 11)
                        throw new NotImplementedException(string.Format("Para a carteira {0}, a quantidade máxima são de 11 de posições para o nosso número. Onde o nosso número é formado por CCCCCCNNNNN-X: C -> número do convênio fornecido pelo Banco, N -> seqüencial atribuído pelo cliente e X -> dígito verificador do “Nosso-Número”.", boleto.Carteira));

                    boleto.NossoNumero = string.Format("{0}{1}", boleto.Cedente.Convenio, Utils.FormatCode(boleto.NossoNumero, 5));
                }
                /*
                  * Convênio de 4 posições
                  * Nosso Número com 11 posições
                  */
                else if (boleto.Cedente.Convenio.ToString().Length == 4)
                {
                    if (boleto.NossoNumero.Length > 7)
                        throw new NotImplementedException(string.Format("Para a carteira {0}, a quantidade máxima são de 7 de posições para o nosso número [{1}]", boleto.Carteira, boleto.NossoNumero));

                    boleto.NossoNumero = string.Format("{0}{1}", boleto.Cedente.Convenio, Utils.FormatCode(boleto.NossoNumero, 7));
                }
                else
                    boleto.NossoNumero = Utils.FormatCode(boleto.NossoNumero, 11);
            }
            #endregion Carteira 17-019
Abraços,
Mar 28, 2013 at 2:44 PM
Bom Dia jsoda,

Conferi aqui e está igual o código.
Conferi mais atentamente e não está aí o "problema".

O "problema" está no método FormataNossoNumero:

(...)
else if (boleto.Carteira.Equals("17-019"))
            boleto.NossoNumero = string.Format("{0}/{1}", LimparCarteira(boleto.Carteira), boleto.NossoNumero);
(...)

Ele está concatenando a carteira junto a propriedade nosso numero para que saia formatado assim no canhoto do boleto. Bom tudo bem.
Porém, após chamar o método ValidaBoleto, vou gerar o CNAB240, nas posições do arquivo (34-53) que é para constar o nosso numero, no caso 17 posições. ele está saindo com valor que fora formatado para sair no canhoto.
Fiz um teste aqui, e se antes de gerar o arquivo eu nao chamar o metodo (validaboleto) parece-me que sai certo no cnab.
Então o metodo ValidaBoleto só deve ser chamado na montagem do boleto para impressao, e quando for gerar o arquivo de remessa, nao?
Developer
Mar 28, 2013 at 5:56 PM
Olá marcelhsouza.

Pois é, na minha lógica (minha aplicação), tenho 2 rotinas independentes :
Uma é a impressão, que pega os registros, formata a impressão e atualiza as informações no banco de dados e,
a outra é a remessa/retorno.

Para a remessa, acumulo os registros que precisam ser enviados ao banco de tempo em tempo, por exemplo 2 vezes ao dia, uma antes do almoço e outra antes do término do expediente. Assim, evito ter que controlar muitas numerações de remessa.

Na minha rotina de remessa, realmente, eu não faço a validação de boleto, pois considero que se a impressão foi bem sucedida e a informação de NOSSONUMERO foi guardada no BD. Sendo assim, é só montar as propriedades necessárias e gerar o arquivo.

Enviar um registro apenas no arquivo remessa, à cada boleto emitido, acho desnecessário.
Espero ter ajudado.

Abraços,
Mar 28, 2013 at 6:11 PM
Edited Mar 28, 2013 at 7:00 PM
Olá jsoda,

Certo, entendi.
Conferi aqui no meu sistema, que eu já havia feito para o bradesco (há um tempo atrás) e também estou procedendo da mesma maneira (não chamando o ValidaBoleto).

Obrigado.

Abs