Formação da linha digitavel BANCO REAL

Dec 9, 2008 at 12:25 PM
Edited Dec 11, 2008 at 6:17 AM
Pessoal , bom dia

Primeiramente quero parabenizar os idealizadores desse projeto, esta muito bom.

Verifiquei q a linha digitável do banco real não confere com um boleto pre impresso que tenho aki.

Baseado nas informações do boleto pre-impresso eu fui testando para ver se a linha digitável iria bater com a linha digitável do boleto

pré impresso.


REMOVIDO CODIGO PHP....MOTIVO....NÃO HÁ NECESSIDADE.






Coordinator
Dec 9, 2008 at 6:08 PM
Admilson,

o interessante seria pegar a ultima versão do manual do banco Real. Assim fica mais fácil, pois a versão que eu disponibilizei ta muito ruim e tenho quase certeza que é muito antiga. Se você conseguir a documentação eu te ajudo a corrigir esse problema.

Stiven
Dec 9, 2008 at 8:52 PM
Stiven, vou conseguir isso entaum...

Pois o projeto está muito interessante.



Dec 11, 2008 at 6:32 AM
Stiven, depois de muita briga aqui com o C#, (afinal eu naum desenvolvo em C somente em vb.net) consegui gerar os boletos do banco real.

Algumas alterações foram necessárias , mas nada que afete muito o codigo.

_____

<style> <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 3.0cm 70.85pt 3.0cm; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> </style>

ANTES

public string CampoLivre()

        {

            return Boleto.Cedente.ContaBancaria.Agencia + Boleto.Cedente.ContaBancaria.Conta + Boleto.Cedente.ContaBancaria.DigitoConta + Boleto.NossoNumero;

        }

 

 

AGORA

 

public string CampoLivre(Boleto boleto)

        {

            return boleto.Cedente.ContaBancaria.Agencia + boleto.Cedente.ContaBancaria.Conta + _dacNossoNumero  + boleto.NossoNumero;

        }

<style> <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:595.3pt 841.9pt; margin:70.85pt 3.0cm 70.85pt 3.0cm; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> </style>

ANTES

 

public override void FormataCodigoBarra(Boleto boleto)

        {

            string valorBoleto = boleto.ValorBoleto.ToString("f").Replace(",", "").Replace(".", "");

            valorBoleto = Utils.FormatCode(valorBoleto, 14);

 

            boleto.CodigoBarra.Codigo = string.Format("{0}{1}{2}{3}{4}", Codigo, boleto.Moeda,

                    Utils.FatorVencimento(boleto), valorBoleto, CampoLivre(boleto));

 

            _dacBoleto = Utils.Mod11(Strings.Left(boleto.CodigoBarra.Codigo, 4) + Strings.Right(boleto.CodigoBarra.Codigo, 39), 9, 0);

 

            boleto.CodigoBarra.Codigo = Strings.Left(boleto.CodigoBarra.Codigo, 4) + _dacBoleto + Strings.Right(boleto.CodigoBarra.Codigo, 39);

        }

 

 

AGORA

 

public override void FormataCodigoBarra(Boleto boleto)

        {

            string valorBoleto = boleto.ValorBoleto.ToString("f").Replace(",", "").Replace(".", "");

            valorBoleto = Utils.FormatCode(valorBoleto, 14);

 

            sbancoMoeda = Strings.Left(Codigo + Convert.ToString(boleto.Moeda) , 4);

            sfatorvencimento =  Utils.FatorVencimento(boleto);

            scampolivre = CampoLivre(boleto);

            scodigoBarras = sbancoMoeda + "0" + sfatorvencimento + Strings.Right(valorBoleto,10)  + scampolivre;

           

            _dacBoleto = Utils.Mod11(Strings.Left(scodigoBarras, 4) + Strings.Right(scodigoBarras, 39), 9, 0);

            boleto.CodigoBarra.Codigo = sbancoMoeda + _dacBoleto + valorBoleto + scampolivre;

                       

        }

 

 

IMPLEMENTAÇÕES

Tive necessiade de implementar uma condição no arquivo BoletoBancario.cs no modulo MontaHtml logo após a declaração da string agenciaConta (string = agenciaConta)

 

ANTES

 

string agenciaConta;

agenciaConta = Utils.FormataAgenciaConta(Cedente.ContaBancaria.Agencia, Cedente.ContaBancaria.DigitoAgencia, Cedente.ContaBancaria.Conta, Cedente.ContaBancaria.DigitoConta);

 

AGORA

 

//Altera o digito do Cedente para o banco real(Admilson)

string _digCedente;

_digCedente = Strings.Mid(Boleto.CodigoBarra.LinhaDigitavel, 20, 1);

 

if (Banco.Codigo == 356)

agenciaConta = Utils.FormataAgenciaConta(Cedente.ContaBancaria.Agencia, Cedente.ContaBancaria.DigitoAgencia, Cedente.ContaBancaria.Conta, _digCedente );

else

agenciaConta = Utils.FormataAgenciaConta(Cedente.ContaBancaria.Agencia, Cedente.ContaBancaria.DigitoAgencia, Cedente.ContaBancaria.Conta, Cedente.ContaBancaria.DigitoConta);

 

 

 

IMPLEMENTAÇÕES.

 

Incluido arquivo INSTRUCAO_BANCO_REAL.CS APENAS ALTEREI UM ARQUIVO JÁ EXISTENTE.

 

//INICIO ARQUIVO

using System;

using System.Collections;

using System.Text;

 

namespace BoletoNet

{

    #region Enumerado

 

    public enum EnumInstrucoes_BancoReal

    {

        Protestar = 9,                      // Emite aviso ao sacado após N dias do vencto, e envia ao cartório após 5 dias úteis

        NaoProtestar = 10,                  // Inibe protesto, quando houver instrução permanente na conta corrente

        ImportanciaporDiaDesconto = 30,

        ProtestoFinsFalimentares = 42,

        ProtestarAposNDiasCorridos = 81,

        ProtestarAposNDiasUteis = 82,

        NaoReceberAposNDias = 91,

        DevolverAposNDias = 92,

        JurosdeMora = 998,

        DescontoporDia = 999,

    }

 

    #endregion

 

    public class Instrucao_BancoReal: AbstractInstrucao, IInstrucao

    {

 

        #region Construtores

 

             public Instrucao_BancoReal()

             {

                    try

                    {

                this.Banco = new Banco(356);

                    }

                    catch (Exception ex)

                    {

                throw new Exception("Erro ao carregar objeto", ex);

                    }

             }

 

        public Instrucao_BancoReal(int codigo)

        {

            this.carregar(codigo, 0);

        }

 

        public Instrucao_BancoReal(int codigo, int nrDias)

        {

            this.carregar(codigo, nrDias);

        }

 

             #endregion

 

        #region Metodos Privados

 

        private void carregar(int idInstrucao, int nrDias)

        {

            try

            {

                this.Banco = new Banco_Real();

                this.Valida();

 

                switch ((EnumInstrucoes_BancoReal)idInstrucao)

                {

                    case EnumInstrucoes_BancoReal.Protestar:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.Protestar;

                        this.Descricao = "Protestar após " + nrDias + " dias úteis.";

                        break;

                    case EnumInstrucoes_BancoReal.NaoProtestar:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.NaoProtestar;

                        this.Descricao = "Não protestar";

                        break;

                    case EnumInstrucoes_BancoReal.ImportanciaporDiaDesconto:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.ImportanciaporDiaDesconto;

                        this.Descricao = "Importância por dia de desconto.";

                        break;

                    case EnumInstrucoes_BancoReal.ProtestoFinsFalimentares:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.ProtestoFinsFalimentares;

                        this.Descricao = "Protesto para fins falimentares";

                        break;

                    case EnumInstrucoes_BancoReal.ProtestarAposNDiasCorridos:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.ProtestarAposNDiasCorridos;

                        this.Descricao = "Protestar após " + nrDias + " dias corridos do vencimento";

                        break;

                    case EnumInstrucoes_BancoReal.ProtestarAposNDiasUteis:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.ProtestarAposNDiasUteis;

                        this.Descricao = "Protestar após " + nrDias + " dias úteis do vencimento";

                        break;

                    case EnumInstrucoes_BancoReal.NaoReceberAposNDias:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.NaoReceberAposNDias;

                        this.Descricao = "Não receber após " + nrDias + " dias do vencimento";

                        break;

                    case EnumInstrucoes_BancoReal.DevolverAposNDias:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.DevolverAposNDias;

                        this.Descricao = "Devolver após " + nrDias + " dias do vencimento";

                        break;

                    case EnumInstrucoes_BancoReal.JurosdeMora:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.JurosdeMora;

                        this.Descricao = "Após vencimento cobrar R$ "; // por dia de atraso

                        break;

                    case EnumInstrucoes_BancoReal.DescontoporDia:

                        this.Codigo = (int)EnumInstrucoes_BancoReal.DescontoporDia;

                        this.Descricao = "Conceder desconto de R$ "; // por dia de antecipação

                        break;

                    default:

                        this.Codigo = 0;

                        this.Descricao = "( Selecione )";

                        break;

                }

 

                this.QuantidadeDias = nrDias;

            }

            catch (Exception ex)

            {

                throw new Exception("Erro ao carregar objeto", ex);

            }

        }

 

        public override void Valida()

        {

            //base.Valida();

        }

 

        #endregion

 

    }

}

 

//FIM ARQUIVO

 

Necessário alterar a função InstanciaInstrucao

 

private void InstanciaInstrucao(int codigoBanco)

        {

            try

            {

                switch (codigoBanco)

                {

                    //341 - Itaú

                    case 341:

                        _IInstrucao = new Instrucao_Itau();

                        break;

                    //1 - Banco do Brasil

                    case 1:

                        _IInstrucao = new Instrucao_BancoBrasil();

                        break;

                    //356 - Real

                    case 356:

                        _IInstrucao = new Instrucao_BancoReal();

                        break;

                    //422 - Safra

                    case 422:

                        //_IInstrucao = new Instrucao_Safra();

                        throw new Exception("Código do banco não implementando: " + codigoBanco);

                    //237 - Bradesco

                    case 237:

                        //_IInstrucao = new Instrucao_Bradesco();

                        throw new Exception("Código do banco não implementando: " + codigoBanco);

                    //347 - Sudameris

                    case 347:

                        //_IInstrucao = new Instrucao_Sudameris();

                        throw new Exception("Código do banco não implementando: " + codigoBanco);

                    //353 - Santander

                    case 353:

                    case 33:

                    case 8:

                    //case 8:

                        _IInstrucao = new Instrucao_Santander();

                        break;

                    //070 - BRB

                    case 70:

                        //_IInstrucao = new Instrucao_BRB();

                        throw new Exception("Código do banco não implementando: " + codigoBanco);

                    //479 - BankBoston

                    case 479:

                        _IInstrucao = new Instrucao_BankBoston();

                        break;

                    //41 - Banrisul

                    case 41:

                        _IInstrucao = new Instrucao_Banrisul();

                        break;

                    default:

                        throw new Exception("Código do banco não implementando: " + codigoBanco);

                }

            }

            catch (Exception ex)

            {

                throw new Exception("Erro durante a execução da transação.", ex);

            }

        }

 Que eu me lembre foi soh isso. Não sei se era aki mesmo q eu deveria ter postado as alterações, caso não seja favor comunicar-me onde devo colocar as alterações para que todos possam ver e/ou utilizar.

Por enquanto é isso....



Coordinator
Dec 11, 2008 at 12:12 PM

Admilson,

show de bola! É isso aí mesmo...o que vale na verdade é a força de vontade em contribuir. Tentei atualizar com base nos dados enviados mas tem alguns probleminhas. Mande para stiven@callas.com.br os arquivos do seu projeto zipados que me viro aqui. Pode ser?

Att[]'s

Stiven

Coordinator
Dec 11, 2008 at 2:13 PM
Admilson,

fiz umas alterações no Banco Real, cheguei a pagar no Banco do Brasil e Santander. E aparentemente pagou, agora tem que se verificar se realmente está sendo feito a compensação. Para se ter uma certeza é necessário verificar no arquivo de retorno.

Att[]'s

Stiven
Jan 17, 2009 at 12:21 PM
Desculpa pela demora, estava de  ferias de 13/12 a 13/01 estou retornando as atividades....

Vou mandar o arquivo alterado sim......

Com relação a sua segunda reply eu já recebi varios boletos de clientes sem nenhum problema.

Como eu disse em outros replys eu tenho aki os boletos pré impressos, e utilizando os dados padroes bem como o nosso numero ele esta gerando exatamente a mesma linha digitavel .

Nos boletos de testes todos geraram corretamente e foram recebido corretamente.


Naum utilizo arquivo retorno, por isso naum tenho como testar.


Outra coisa , é cobrança sem registro.