Brunomm/br_boleto

View on GitHub
lib/br_boleto/retorno/cnab240/base.rb

Summary

Maintainability
A
2 hrs
Test Coverage
# -*- encoding: utf-8 -*-
module BrBoleto
    module Retorno
        module Cnab240
            class Base < BrBoleto::Retorno::Base

            # Esta classe foi desenvolvida baseando-se no manual disponibilizado pela FEBRABAN
            # Manual: Layout Padrão Febraban 240 posições v09.0
                
            private

                # É feito um loop em todas as linhas do arquivo onde ignora se a linha não
                # for do segmento T ou do segmento U.
                # A cada loop é lido 2 linhas por vez, onde sempre terá o segmento T e U juntos.
                # Cada loop representa um pagamento.
                #
                def read_file! #:doc:
                    File.readlines(file).reject{|l| adjust_encode(l) =~ /^((?!^.{7}3.{5}[T|U].*$).)*$/}.each_slice(2) do |line|
                        instnce_payment(line)
                    end
                    pagamentos
                end

                # Método utilizado para instanciar um novo Pagamento a partir das linhas dos
                # Segmentos T e U do arquivo de retorno
                #
                def instnce_payment(lines) #:doc:
                    payment = BrBoleto::Retorno::Pagamento.new(conta_class: conta_pagamento_class, cnab: 240)
                    lines.each do |line|
                        self.codigo_banco ||= line[0..2]
                        if line[13] == 'T'
                            set_values_for_segment_t(payment, line)
                        else # U
                            set_values_for_segment_u(payment, line)
                        end
                    end
                    self.pagamentos << payment
                end

                def set_values_for_segment_u(payment, line) #:doc: 
                    segmento_u_fields.each do |column, position |
                        payment.send("#{column}=", "_#{line}"[position].try(:strip))
                    end
                end

                def set_values_for_segment_t(payment, line) #:doc:
                    segmento_t_fields.each do |column, position |
                        payment.send("#{column}=", "_#{line}"[position].try(:strip))
                    end
                end
                
                def segmento_t_fields #:doc:
                    { #    ATRIBUTO               POSIÇÃO DA LINHA
                        codigo_movimento_retorno:      16..17,
                        agencia_com_dv:                18..23,
                        agencia_sem_dv:                18..22,
                        numero_conta_sem_dv:           24..35,
                        numero_conta_dv:               36,
                        dv_conta_e_agencia:            37..37,
                        nosso_numero_sem_dv:           38..56,
                        nosso_numero_dv:               57,
                        carteira:                      58..58,
                        numero_documento:              59..73,
                        data_vencimento:               74..81,
                        valor_titulo:                  82..96,
                        banco_recebedor:               97..99,
                        agencia_recebedora_com_dv:    100..105,
                        identificacao_titulo_empresa: 106..130,
                        codigo_moeda:                 131..132,
                        sacado_tipo_documento:        133..133,
                        sacado_documento:             134..148,
                        sacado_nome:                  149..188,
                        numero_contrato:              189..198,
                        valor_tarifa:                 199..213,
                        motivo_ocorrencia_original_1: 214..215,
                        motivo_ocorrencia_original_2: 216..217,
                        motivo_ocorrencia_original_3: 218..219,
                        motivo_ocorrencia_original_4: 220..221,
                        motivo_ocorrencia_original_5: 222..223,
                    }
                end

                def segmento_u_fields #:doc:
                    { #    ATRIBUTO                        POSIÇÃO DA LINHA     
                        valor_juros_multa:                       18..32,
                        valor_desconto:                          33..47,
                        valor_abatimento:                        48..62,
                        valor_iof:                               63..77,
                        valor_pago:                              78..92,
                        valor_liquido:                           93..107,
                        valor_outras_despesas:                   108..122,
                        valor_outros_creditos:                   123..137,
                        data_ocorrencia:                         138..145,
                        data_credito:                            146..153,
                        codigo_ocorrencia_sacado:                154..157,
                        data_ocorrencia_sacado:                  158..165,
                        valor_ocorrencia_sacado:                 166..180,
                        complemento_ocorrencia_sacado:           181..210,
                        codigo_ocorrencia_banco_correspondente:  211..213,
                        nosso_numero_banco_correspondente:       214..233,
                    }                
                end

            end
        end
    end
end