# -*- encoding: utf-8 -*- # require 'spec_helper' RSpec.describe Brcobranca::Remessa::Cnab240::Sicoob do let(:pagamento) do Brcobranca::Remessa::Pagamento.new( valor: 50.0, data_vencimento: Date.current, nosso_numero: '00000012', documento_sacado: '82136760505', nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO', endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior', bairro_sacado: 'São josé dos quatro apostolos magros', cep_sacado: '12345678', cidade_sacado: 'Santa rita de cássia maria da silva', uf_sacado: 'RJ' ) end let(:params) do { empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA', agencia: '4327', conta_corrente: '03666', documento_cedente: '74576177000177', modalidade_carteira: '01', pagamentos: [pagamento] } end let(:sicoob) { subject.class.new(params) } context 'validacoes' do context '@modalidade_carteira' do it 'deve ser invalido se nao possuir a modalidade da carteira' do objeto = subject.class.new(params.merge(modalidade_carteira: nil)) expect(objeto.invalid?).to be true expect(objeto.errors.full_messages).to include('Modalidade carteira não pode estar em branco.') end end context '@tipo_formulario' do it 'deve ser invalido se nao possuir o tipo de formulario' do objeto = subject.class.new(params.merge(tipo_formulario: nil)) expect(objeto.invalid?).to be true expect(objeto.errors.full_messages).to include('Tipo formulario não pode estar em branco.') end end context '@agencia' do it 'deve ser invalido se a agencia tiver mais de 4 digitos' do sicoob.agencia = '12345' expect(sicoob.invalid?).to be true expect(sicoob.errors.full_messages).to include('Agencia deve ter 4 dígitos.') end end context '@conta_corrente' do it 'deve ser invalido se a conta corrente tiver mais de 8 digitos' do sicoob.conta_corrente = '123456789' expect(sicoob.invalid?).to be true expect(sicoob.errors.full_messages).to include('Conta corrente deve ter 8 dígitos.') end end end context 'formatacoes' do it 'codigo do banco deve ser 756' do expect(sicoob.cod_banco).to eq '756' end it 'nome do banco deve ser Sicoob com 30 posicoes' do nome_banco = sicoob.nome_banco expect(nome_banco.size).to eq 30 expect(nome_banco[0..19]).to eq 'SICOOB ' end it 'versao do layout do arquivo deve ser 081' do expect(sicoob.versao_layout_arquivo).to eq '081' end it 'versao do layout do lote deve ser 040' do expect(sicoob.versao_layout_lote).to eq '040' end it 'deve calcular o digito da agencia' do # digito calculado a partir do modulo 11 com base 9 # # agencia = 1 2 3 4 # # 4 3 2 1 # x 9 8 7 6 # = 36 24 14 6 = 80 # 80 / 11 = 7 com resto 3 expect(sicoob.digito_agencia).to eq '3' end it 'deve calcular digito da conta' do # digito calculado a partir do modulo 11 com base 9 # # conta = 1 2 3 4 5 # # 5 4 3 2 1 # x 9 8 7 6 5 # = 45 32 21 12 5 = 116 # 116 / 11 = 10 com resto 5 expect(sicoob.digito_conta).to eq '8' end it 'cod. convenio deve retornar as informacoes nas posicoes corretas' do cod_convenio = sicoob.codigo_convenio expect(cod_convenio[0..19]).to eq ' ' end it 'info conta deve retornar as informacoes nas posicoes corretas' do info_conta = sicoob.info_conta expect(info_conta[0..4]).to eq '04327' expect(info_conta[5]).to eq '3' expect(info_conta[6..17]).to eq '000000003666' expect(info_conta[18]).to eq '8' end it 'complemento header deve retornar espacos em branco' do expect(sicoob.complemento_header).to eq ''.rjust(29, ' ') end it 'complemento trailer deve retornar espacos em branco' do expect(sicoob.complemento_trailer).to eq ''.rjust(117, ' ') end it 'formata o nosso numero' do nosso_numero = sicoob.formata_nosso_numero pagamento expect(nosso_numero).to eq '000000001201014 ' end end context 'geracao remessa' do it_behaves_like 'cnab240' context 'trailer lote' do it 'trailer lote deve ter as informacoes nas posicoes corretas' do trailer = sicoob.monta_trailer_lote 1, 4 expect(trailer[0..2]).to eq sicoob.cod_banco # cod. do banco expect(trailer[3..6]).to eq '0001' # numero do lote expect(trailer[17..22]).to eq '000004' # qtde de registros no lote # qtde de titulos em cobranca simples 6 # Valor Total dos titulos em carteiras simples 15 2 expect(trailer[23..28]).to eq '000001' expect(trailer[29..45]).to eq '00000000000005000' # qtde de titulos em cobranca vinculada 6 # Valor Total dos titulos em carteiras vinculada 15 2 expect(trailer[46..51]).to eq '000000' expect(trailer[52..68]).to eq '00000000000000000' # qtde de titulos em cobranca caucionada 6 # Valor Total dos titulos em carteiras caucionada 15 2 expect(trailer[69..74]).to eq '000000' expect(trailer[75..91]).to eq '00000000000000000' # qtde de titulos em cobranca descontada 6 # Valor Total dos titulos em carteiras descontada 15 2 expect(trailer[92..97]).to eq '000000' expect(trailer[98..114]).to eq '00000000000000000' # numero do aviso de lancamento 8 expect(trailer[115..122]).to eq ''.rjust(8, ' ') # CNAB Uso Exclusivo FEBRABAN/CNAB 117 expect(trailer[123..239]).to eq sicoob.complemento_trailer end end context 'arquivo' do before { Timecop.freeze(Time.local(2015, 7, 14, 16, 15, 15)) } after { Timecop.return } it { expect(sicoob.gera_arquivo).to eq(read_remessa('remessa-bancoob-cnab240.rem', sicoob.gera_arquivo)) } end end end