Brunomm/br_boleto

View on GitHub
lib/br_boleto/conta/caixa.rb

Summary

Maintainability
C
1 day
Test Coverage
# encoding: utf-8
module BrBoleto
    module Conta
        class Caixa < BrBoleto::Conta::Base
            
            # MODALIDADE CARTEIRA
            #  Opcoes:
            #    14: Cobrança Simples com registro
            #    24: Cobrança Simples sem registro
            #
            #  Carteira/Modalidade:
            #    1/4 = Registrada   / Emissão do boleto(4-Beneficiário) 
            #    2/4 = Sem Registro / Emissão do boleto(4-Beneficiário) 

            # versão do aplicativo da caixa
            attr_accessor :versao_aplicativo

            ###############################  VALIDAÇÕES DINÂMICAS ###############################
                # Versão do aplicativo
                attr_accessor :valid_versao_aplicativo_required
            #####################################################################################

            validates :versao_aplicativo, custom_length: { maximum: 4 }
            validates :versao_aplicativo, presence: true, if: :valid_versao_aplicativo_required

            def default_values
                super.merge({
                    carteira:                     '14',      # Com registro
                    valid_carteira_required:      true,      # <- Validação dinâmica que a carteira é obrigatória
                    valid_carteira_length:        2,         # <- Validação dinâmica que a carteira deve ter 2 digitos
                    valid_carteira_inclusion:     %w[14 24], # <- Validação dinâmica de valores aceitos para a modalidade
                    codigo_carteira:              '1',  # Cobrança Simples
                    valid_codigo_carteira_length: 1,         # <- Validação dinâmica que a carteira deve ter 1 digito
                    valid_convenio_required:      true, # <- Validação que a convenio deve ter obrigatório
                    valid_convenio_maximum:       6,    # <- Validação que a convenio deve ter no máximo 6 digitos
                    versao_aplicativo:            '0',
                })
            end

            def codigo_banco
                '104'
            end

            # Dígito do código do banco descrito na documentação
            def codigo_banco_dv
                '0'
            end

            def nome_banco
                @nome_banco ||= 'CAIXA ECONOMICA FEDERAL'
            end

            def versao_layout_arquivo_cnab_240
                '050'
            end

            def versao_layout_lote_cnab_240
                '030'
            end

            def agencia_dv
                # utilizando a agencia com 4 digitos
                # para calcular o digito
                @agencia_dv ||= BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(agencia).to_s
            end

            def conta_corrente_dv
                @conta_corrente_dv ||= BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(conta_corrente).to_s
            end

            def convenio_dv
                @convenio_dv ||= BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(convenio).to_s
            end

            def versao_aplicativo
                "#{@versao_aplicativo}".rjust(4, '0') if @versao_aplicativo.present?
            end

            # Formata a carteira da carteira dependendo se ela é registrada ou não.
            #
            # Para cobrança COM registro usar: <b>RG</b>
            # Para Cobrança SEM registro usar: <b>SR</b>
            #
            # @return [String]
            #
            def carteira_formatada
                if carteira.in?(carteiras_com_registro)
                    'RG'
                else
                    'SR'
                end
            end

            # Retorna as carteiras com registro da Caixa Econômica Federal.
            # <b>Você pode sobrescrever esse método na subclasse caso exista mais
            # carteiras com registro na Caixa Econômica Federal.</b>
            #
            # @return [Array]
            #
            def carteiras_com_registro
                %w(14)
            end

            # Campo Agência / Código do Cedente
            #
            # @return [String]
            #
            def agencia_codigo_cedente
                "#{agencia} / #{codigo_cedente}-#{codigo_cedente_dv}"
            end


            ##################################### DEFAULT CODES ###############################################

                # Identificação da Distribuição exclusiva da CAIXA
                def equivalent_distribuicao_boleto
                    {
                        '1' => '2', # Banco Distribui
                        '2' => '0', # Cliente Distribui
                        '3' => '3', # Banco envia e-mail
                        '4' => '4', # Banco envia SMS
                    }
                end

                # Código de Movimento Retorno 
                def equivalent_codigo_movimento_retorno_240
                    super.merge(
                        #  Padrão    Código para  
                        {# do Banco    a GEM
                            '35'   =>   '135',     # Confirmação de Inclusão Banco de Sacado
                            '36'   =>   '136',     # Confirmação de Alteração Banco de Sacado
                            '37'   =>   '137',     # Confirmação de Exclusão Banco de Sacado
                            '38'   =>   '138',     # Emissão de Bloquetos de Banco de Sacado
                            '39'   =>   '139',     # Manutenção de Sacado Rejeitada
                            '40'   =>   '140',     # Entrada de Título via Banco de Sacado Rejeitada
                            '41'   =>   '141',     # Manutenção de Banco de Sacado Rejeitada
                            '44'   =>   '144',     # Estorno de Baixa / Liquidação
                            '45'   =>   '145',     # Alteração de Dados
                        })
                end

                # Código do Motivo da Ocorrência Retorno
                def equivalent_codigo_motivo_ocorrencia_A_240 codigo_movimento_gem
                    super.merge(
                    #  Padrão    Código para  
                    {# do Banco    a GEM
                        '11'   =>   'A115', # Data de Geração Inválida 
                        '64'   =>   'A116', # Entrada Inválida para Cobrança Caucionada
                        '65'   =>   'A117', # CEP do Pagador não encontrado
                        '66'   =>   'A118', # Agencia Cobradora não encontrada
                        '67'   =>   'A119', # Agencia Beneficiário não encontrada
                        '68'   =>   'A120', # Movimentação inválida para título
                        '69'   =>   'A121', # Alteração de dados inválida
                        '70'   =>   'A122', # Apelido do cliente não cadastrado
                        '71'   =>   'A123', # Erro na composição do arquivo
                        '73'   =>   'A105', # Código do Beneficiário inválido
                        '72'   =>   'A124', # Lote de serviço inválido
                        '74'   =>   'A125', # Beneficiário não pertencente a Cobrança Eletrônica
                        '75'   =>   'A126', # Nome da Empresa inválido
                        '76'   =>   'A127', # Nome do Banco inválido
                        '77'   =>   'A128', # Código da Remessa inválido
                        '78'   =>   'A129', # Data/Hora Geração do arquivo inválida
                        '79'   =>   'A130', # Número Sequencial do arquivo inválido
                        '80'   =>   'A131', # Versão do Lay out do arquivo inválido
                        '81'   =>   'A132', # Literal REMESSA-TESTE - Válido só p/ fase testes
                        '82'   =>   'A133', # Literal REMESSA-TESTE - Obrigatório p/ fase testes
                        '83'   =>   'A134', # Tp Número Inscrição Empresa inválido
                        '84'   =>   'A135', # Tipo de Operação inválido
                        '85'   =>   'A136', # Tipo de serviço inválido
                        '86'   =>   'A137', # Forma de lançamento inválido
                        '87'   =>   'A138', # Número da remessa inválido
                        '88'   =>   'A139', # Número da remessa menor/igual remessa anterior
                        '89'   =>   'A140', # Lote de serviço divergente
                        '90'   =>   'A141', # Número sequencial do registro inválido
                        '91'   =>   'A142', # Erro seq de segmento do registro detalhe
                        '92'   =>   'A143', # Cod movto divergente entre grupo de segm
                        '93'   =>   'A144', # Qtde registros no lote inválido
                        '94'   =>   'A145', # Qtde registros no lote divergente
                        '95'   =>   'A146', # Qtde lotes no arquivo inválido
                        '96'   =>   'A147', # Qtde lotes no arquivo divergente
                        '97'   =>   'A148', # Qtde registros no arquivo inválido
                        '98'   =>   'A149', # Qtde registros no arquivo divergente
                        '99'   =>   'A150', # Código de DDD inválido
                    })
                end
                def equivalent_codigo_motivo_ocorrencia_B_240 codigo_movimento_gem
                    super.merge(
                    #  Padrão    Código para  
                    {# do Banco    a GEM
                        '12'     =>   'B21', # Redisponibilização de Arquivo Retorno Eletrônico
                        '15'     =>   'B22', # Banco de Pagadores
                        '17'     =>   'B23', # Entrega Aviso Disp Boleto via e-amail ao pagador (s/ emissão Boleto)
                        '18'     =>   'B24', # Emissão de Boleto Pré-impresso CAIXA matricial
                        '19'     =>   'B25', # Emissão de Boleto Pré-impresso CAIXA A4
                        '20'     =>   'B26', # Emissão de Boleto Padrão CAIXA
                        '21'     =>   'B27', # Emissão de Boleto/Carnê
                        '31'     =>   'B28', # Emissão de Aviso de Vencido
                        '42'     =>   'B29', # Alteração cadastral de dados do título - sem emissão de aviso
                        '45'     =>   'B30', # Emissão de 2a via de Boleto Cobrança Registrada
                    })
                end
                def codigos_movimento_retorno_para_ocorrencia_C_240
                    %w[06 08 09 17]
                end
                def equivalent_codigo_motivo_ocorrencia_C_240 codigo_movimento_gem
                    if codigo_movimento_gem == '08'
                        super.merge(
                            #  Padrão    Código para  
                            {# do Banco    a GEM
                            '01'     =>    'C35',  # Liquidação em Dinheiro
                            '02'     =>    'C36',  # Liquidação em Cheque
                        })
                    else
                        super.merge(
                            #  Padrão    Código para  
                            {# do Banco    a GEM
                            '02'     =>    'C100', # Casa Lotérica
                            '03'     =>    'C101', # Agências CAIXA
                            '07'     =>    'C102', # Correspondente Bancário
                        })
                    end
                end

                def equivalent_codigo_motivo_ocorrencia_A_400 codigo_movimento_gem
                    super.merge(
                        #  Padrão    Código para  
                        {# do Banco    a GEM
                            '01'   =>   'A220',  # Movimento sem Beneficiário Correspondente
                            '02'   =>   'A221',  # Movimento sem Título Correspondente
                            '08'   =>   'A222',  # Movimento para título já com movimentação no dia
                            '09'   =>   'A223',  # Nosso Número não pertence ao Beneficiário
                            '10'   =>   'A224',  # Inclusão de título já existente na base
                            '12'   =>   'A225',  # Movimento duplicado
                            '13'   =>   'A116',  # Entrada Inválida para Cobrança Caucionada (Beneficiário não possui conta Caução)
                            '20'   =>   'A117',  # CEP do Pagador não encontrado (não foi possível a determinação da Agência Cobradora para o título)
                            '21'   =>   'A118',  # Agência cobradora não encontrada (agência designada para cobradora não cadastrada no sistema)
                            '22'   =>   'A119',  # Agência Beneficiário não encontrada (Agência do Beneficiário não cadastrada no sistema)
                            '45'   =>   'A226',  # Data de Vencimento com prazo superior ao limite
                            '49'   =>   'A227',  # Movimento inválido para título Baixado/Liquidado
                            '50'   =>   'A228',  # Movimento inválido para título enviado a Cartório
                            '54'   =>   'A229',  # Faixa de CEP da Agência Cobradora não abrange CEP do Pagador
                            '55'   =>   'A230',  # Título já com opção de Devolução
                            '56'   =>   'A231',  # Processo de Protesto em andamento
                            '57'   =>   'A232',  # Título já com opção de Protesto
                            '58'   =>   'A233',  # Processo de devolução em andamento
                            '59'   =>   'A234',  # Novo prazo p/ Protesto/Devolução inválido
                            '76'   =>   'A235',  # Alteração do prazo de protesto inválida
                            '77'   =>   'A236',  # Alteração do prazo de devolução inválida
                            '81'   =>   'A237',  # CEP do Pagador inválido
                            '82'   =>   'A238',  # CNPJ/CPF do Pagador inválido (dígito não confere)
                            '83'   =>   'A86' ,  # Número do Documento (seu número) inválido
                            '84'   =>   'A239',  # Protesto inválido para título sem Número do documento (seu número)
                    })
                end

                def codigos_movimento_retorno_para_ocorrencia_C_400
                    %w[06 09 101 151 152]
                end
                def equivalent_codigo_motivo_ocorrencia_C_400 codigo_movimento_gem
                    super.merge(
                        #  Padrão    Código para  
                        {# do Banco    a GEM
                            '002'  =>  'C100', # Unidade Lotérica
                            '003'  =>  'C101', # Agências CAIXA
                            '004'  =>  'C04',  # Compensação Eletrônica
                            '006'  =>  'C06',  # Internet Banking
                            '007'  =>  'C102', # Correspondente CAIXA aqui
                            '008'  =>  'C08',  # Em Cartório
                            '009'  =>  'C09',  # Comandada Banco
                            '010'  =>  'C10',  # Comandada Cliente via Arquivo
                            '011'  =>  'C11',  # Comandada Cliente On-line
                    })
                end

                # Identificações de Ocorrência / Código de ocorrência:
                def equivalent_codigo_movimento_retorno_400
                    super.merge(
                        #  Padrão    Código para  
                        {# do Banco    a GEM
                            '01'   =>   '02',      # Entrada Confirmada
                            '02'   =>   '09',      # Baixa Manual Confirmada
                            '03'   =>   '12',      # Abatimento Concedido
                            '04'   =>   '13',      # Abatimento Cancelado
                            '05'   =>   '14',      # Vencimento Alterado
                            '06'   =>   '146',  # Uso da Empresa Alterado
                            '08'   =>   '147',  # Prazo de Devolução Alterado
                            '09'   =>   '27',      # Alteração Confirmada
                            '10'   =>   '148',  # Alteração com reemissão de Boleto Confirmada
                            '11'   =>   '149',  # Alteração da opção de Protesto para Devolução Confirmada
                            '12'   =>   '150',  # Alteração da opção de Devolução para Protesto Confirmada
                            '20'   =>   '11',      # Em Ser
                            '21'   =>   '06',      # Liquidação 
                            '22'   =>   '101',  # Liquidação em Cartório 
                            '23'   =>   '151',  # Baixa por Devolução 
                            '25'   =>   '152',  # Baixa por Protesto 
                            '26'   =>   '23',   # Título enviado para Cartório 
                            '27'   =>   '20',      # Sustação de Protesto 
                            '28'   =>   '153',  # Estorno de Protesto 
                            '29'   =>   '154',  # Estorno de Sustação de Protesto 
                            '30'   =>   '61',      # Alteração de Título 
                            '31'   =>   '108',  # Tarifa sobre Título Vencido 
                            '32'   =>   '155',  # Outras Tarifas de Alteração 
                            '33'   =>   '144',  # Estorno de Baixa / Liquidação 
                            '34'   =>   '156',  # Tarifas Diversas 
                        })
                end

                # Código para Protesto
                def equivalent_codigo_protesto_400
                    super.merge(
                        #  Padrão    Código para  
                        {# da GEM     o Banco
                            '3'   =>   '2',  # Devolver (Não Protestar)
                        })
                end

                # Código da Moeda
                def equivalent_codigo_moeda_400
                    super.merge(
                        #  Padrão    Código para  
                        {# da GEM     o Banco
                            '09'   =>   '1',  # Real
                        })
                end
                
        end
    end
end