Sugestão de alteração no processamento do arquivo de retorno CNAB 240 (versão 2.0.2 - changeset 83269)

Jun 23, 2013 at 4:40 AM
Olá,

Uso o Boleto.Net há algum tempo e, ao atualizar para a versão mais recente (estava usando uma bem antiga), percebi que a implementação que está feita no arquivo ArquivoRetornoCNAB240.cs nunca chama os métodos LerDetalheSegmentoTRetornoCNAB240 e LerDetalheSegmentoTRetornoCNAB240 que são sobrescritos pelas classes dos bancos.

No meu caso, tive problemas ao processar arquivos de retorno do BB pois em meus arquivos a data de vencimento vem "000000" e a implementação que está feita na classe DetalheSegmentoTRetornoCNAB240 não trata essa situação. Já a classe Banco_Brasil, que implementa IBanco, trata isso mas nunca é chamada pois a implementação para processamento de retorno do CNAB240 está diferente da implementação do processamento de retorno do CNAB400.

Sugiro que realizem as seguintes alterações no arquivo ArquivoRetornoCNAB240.cs:

1)
De: (linha 92)
detalheRetorno.SegmentoT.LerDetalheSegmentoTRetornoCNAB240(linha);

Para:
detalheRetorno.SegmentoT = banco.LerDetalheSegmentoTRetornoCNAB240(linha);

2)
De: (linha 97)
detalheRetorno.SegmentoU.LerDetalheSegmentoURetornoCNAB240(linha);

Para:
detalheRetorno.SegmentoU = banco.LerDetalheSegmentoURetornoCNAB240(linha);


3) coloquei também um tratamento para verificar se a linha é vazia pois ocorreu erro por conta disso em pelo menos um de meus arquivos


Minha implementação do método ficou assim:
    public override void LerArquivoRetorno(IBanco banco, Stream arquivo)
    {
        try
        {
            StreamReader stream = new StreamReader(arquivo, System.Text.Encoding.UTF8);
            string linha = "";

            while ((linha = stream.ReadLine()) != null)
            {
                if (!String.IsNullOrEmpty(linha))
                {

                    DetalheRetornoCNAB240 detalheRetorno = new DetalheRetornoCNAB240();

                    switch (linha.Substring(7, 1))
                    {
                        case "0": //Header de arquivo
                            OnLinhaLida(null, linha, EnumTipodeLinhaLida.HeaderDeArquivo);
                            break;
                        case "1": //Header de lote
                            OnLinhaLida(null, linha, EnumTipodeLinhaLida.HeaderDeLote);
                            break;
                        case "3": //Detalhe
                            if (linha.Substring(13, 1) == "W")
                            {
                                OnLinhaLida(detalheRetorno, linha, EnumTipodeLinhaLida.DetalheSegmentoW);
                                detalheRetorno.SegmentoW.LerDetalheSegmentoWRetornoCNAB240(linha);
                            }
                            else if (linha.Substring(13, 1) == "E")
                            {
                                OnLinhaLida(detalheRetorno, linha, EnumTipodeLinhaLida.DetalheSegmentoE);
                                detalheRetorno.SegmentoE = new DetalheSegmentoERetornoCNAB240();
                                detalheRetorno.SegmentoE.LerDetalheSegmentoERetornoCNAB240(linha);
                            }
                            else
                            {
                                OnLinhaLida(detalheRetorno, linha, EnumTipodeLinhaLida.DetalheSegmentoT);
                                //detalheRetorno.SegmentoT.LerDetalheSegmentoTRetornoCNAB240(linha);
                                detalheRetorno.SegmentoT = banco.LerDetalheSegmentoTRetornoCNAB240(linha);

                                linha = stream.ReadLine();

                                OnLinhaLida(detalheRetorno, linha, EnumTipodeLinhaLida.DetalheSegmentoU);
                                //detalheRetorno.SegmentoU.LerDetalheSegmentoURetornoCNAB240(linha);
                                detalheRetorno.SegmentoU = banco.LerDetalheSegmentoURetornoCNAB240(linha);

                            }
                            ListaDetalhes.Add(detalheRetorno);
                            break;
                        case "5": //Trailler de lote
                            OnLinhaLida(null, linha, EnumTipodeLinhaLida.TraillerDeLote);
                            break;
                        case "9": //Trailler de arquivo
                            OnLinhaLida(null, linha, EnumTipodeLinhaLida.TraillerDeArquivo);
                            break;
                    }

                }

            }
            stream.Close();
        }
        catch (Exception ex)
        {
            throw new Exception("Erro ao ler arquivo.", ex);
        }
    }




Abraço,
Guilherme
Coordinator
Jun 25, 2013 at 1:30 PM
Bom dia Guilherme,

Estranho isso está ocorrendo, pois no histórico não existe nenhuma alteração nessa classe. De qualquer forma, implementei essa alteração para evitar possíveis problemas.