brcobranca 4.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +1 -1
  5. data/.travis.yml +2 -1
  6. data/Gemfile +4 -4
  7. data/Gemfile.lock +65 -53
  8. data/README.md +18 -5
  9. data/brcobranca.gemspec +8 -6
  10. data/lib/brcobranca/boleto/banco_brasil.rb +25 -27
  11. data/lib/brcobranca/boleto/base.rb +13 -6
  12. data/lib/brcobranca/boleto/bradesco.rb +4 -1
  13. data/lib/brcobranca/boleto/caixa.rb +14 -4
  14. data/lib/brcobranca/boleto/hsbc.rb +26 -26
  15. data/lib/brcobranca/boleto/santander.rb +6 -3
  16. data/lib/brcobranca/boleto/sicredi.rb +3 -5
  17. data/lib/brcobranca/boleto/template/rghost.rb +7 -5
  18. data/lib/brcobranca/boleto/template/rghost_carne.rb +1 -2
  19. data/lib/brcobranca/calculo.rb +19 -93
  20. data/lib/brcobranca/formatacao_string.rb +21 -0
  21. data/lib/brcobranca/remessa/base.rb +59 -0
  22. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +117 -0
  23. data/lib/brcobranca/remessa/cnab240/base.rb +379 -0
  24. data/lib/brcobranca/remessa/cnab240/caixa.rb +103 -0
  25. data/lib/brcobranca/remessa/cnab400/base.rb +112 -0
  26. data/lib/brcobranca/remessa/cnab400/bradesco.rb +128 -0
  27. data/lib/brcobranca/remessa/cnab400/itau.rb +149 -0
  28. data/lib/brcobranca/remessa/pagamento.rb +159 -0
  29. data/lib/brcobranca/retorno/base.rb +1 -0
  30. data/lib/brcobranca/retorno/retorno_cnab400.rb +0 -2
  31. data/lib/brcobranca/version.rb +1 -1
  32. data/lib/brcobranca.rb +33 -17
  33. data/spec/brcobranca/banco_bradesco_spec.rb +0 -2
  34. data/spec/brcobranca/banco_brasil_spec.rb +0 -2
  35. data/spec/brcobranca/banco_caixa_spec.rb +0 -2
  36. data/spec/brcobranca/banco_hsbc_spec.rb +0 -3
  37. data/spec/brcobranca/banco_itau_spec.rb +0 -1
  38. data/spec/brcobranca/banco_santander_spec.rb +14 -14
  39. data/spec/brcobranca/banco_sicredi_spec.rb +0 -2
  40. data/spec/brcobranca/base_spec.rb +11 -0
  41. data/spec/brcobranca/boletos_em_lote_spec.rb +0 -2
  42. data/spec/brcobranca/core_ext_spec.rb +104 -58
  43. data/spec/brcobranca/remessa/base_spec.rb +87 -0
  44. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +200 -0
  45. data/spec/brcobranca/remessa/cnab240/base_spec.rb +88 -0
  46. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +137 -0
  47. data/spec/brcobranca/remessa/cnab400/base_spec.rb +51 -0
  48. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +174 -0
  49. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +160 -0
  50. data/spec/brcobranca/remessa/pagamento_spec.rb +197 -0
  51. data/spec/brcobranca/retorno_cbr643_spec.rb +0 -2
  52. data/spec/brcobranca/rghost_spec.rb +0 -2
  53. data/spec/shared_examples/cnab240.rb +206 -0
  54. data/spec/shared_examples/cnab400.rb +85 -0
  55. metadata +34 -4
@@ -0,0 +1,197 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Brcobranca::Remessa::Pagamento do
5
+ let(:pagamento) do
6
+ subject.class.new(valor: 199.9,
7
+ data_vencimento: Date.parse('2015-06-25'),
8
+ nosso_numero: 123,
9
+ documento_sacado: '12345678901',
10
+ nome_sacado: 'nome',
11
+ endereco_sacado: 'endereco',
12
+ bairro_sacado: 'bairro',
13
+ cep_sacado: '12345678',
14
+ cidade_sacado: 'cidade',
15
+ uf_sacado: 'SP')
16
+ end
17
+
18
+ context 'validacoes' do
19
+ it 'deve ser invalido se nao possuir nosso numero' do
20
+ pagamento.nosso_numero = nil
21
+ expect(pagamento.invalid?).to be true
22
+ expect(pagamento.errors.full_messages).to include('Nosso numero não pode estar em branco.')
23
+ end
24
+
25
+ it 'deve ser invalido se nao possuir data de vencimento' do
26
+ pagamento.data_vencimento = nil
27
+ expect(pagamento.invalid?).to be true
28
+ expect(pagamento.errors.full_messages).to include('Data vencimento não pode estar em branco.')
29
+ end
30
+
31
+ it 'deve ser invalido se nao possuir valor do documento' do
32
+ pagamento.valor = nil
33
+ expect(pagamento.invalid?).to be true
34
+ expect(pagamento.errors.full_messages).to include('Valor não pode estar em branco.')
35
+ end
36
+
37
+ it 'deve ser invalido se nao possuir documento do sacado' do
38
+ pagamento.documento_sacado = nil
39
+ expect(pagamento.invalid?).to be true
40
+ expect(pagamento.errors.full_messages).to include('Documento sacado não pode estar em branco.')
41
+ end
42
+
43
+ it 'deve ser invalido se nao possuir nome do sacado' do
44
+ pagamento.nome_sacado = nil
45
+ expect(pagamento.invalid?).to be true
46
+ expect(pagamento.errors.full_messages).to include('Nome sacado não pode estar em branco.')
47
+ end
48
+
49
+ it 'deve ser invalido se nao possuir endereco do sacado' do
50
+ pagamento.endereco_sacado = nil
51
+ expect(pagamento.invalid?).to be true
52
+ expect(pagamento.errors.full_messages).to include('Endereco sacado não pode estar em branco.')
53
+ end
54
+
55
+ it 'deve ser invalido se nao possuir cidade do sacado' do
56
+ pagamento.cidade_sacado = nil
57
+ expect(pagamento.invalid?).to be true
58
+ expect(pagamento.errors.full_messages).to include('Cidade sacado não pode estar em branco.')
59
+ end
60
+
61
+ it 'deve ser invalido se nao possuir UF do sacado' do
62
+ pagamento.uf_sacado = nil
63
+ expect(pagamento.invalid?).to be true
64
+ expect(pagamento.errors.full_messages).to include('Uf sacado não pode estar em branco.')
65
+ end
66
+
67
+ context '@cep' do
68
+ it 'deve ser invalido se nao possuir CEP' do
69
+ pagamento.cep_sacado = nil
70
+ expect(pagamento.invalid?).to be true
71
+ expect(pagamento.errors.full_messages).to include('Cep sacado não pode estar em branco.')
72
+ end
73
+
74
+ it 'deve ser invalido se CEP nao tiver 8 digitos' do
75
+ pagamento.cep_sacado = '123456789'
76
+ expect(pagamento.invalid?).to be true
77
+ expect(pagamento.errors.full_messages).to include('Cep sacado deve ter 8 dígitos.')
78
+ end
79
+ end
80
+
81
+ it 'deve ser invalido se codigo do desconto tiver mais de 1 digito' do
82
+ pagamento.cod_desconto = '123'
83
+ expect(pagamento.invalid?).to be true
84
+ expect(pagamento.errors.full_messages).to include('Cod desconto deve ter 1 dígito.')
85
+ end
86
+ end
87
+
88
+ context 'informacoes padrao' do
89
+ it 'data de emissao padrao deve ser o dia corrente' do
90
+ expect(pagamento.data_emissao).to eq Date.today
91
+ end
92
+
93
+ it 'nome do avalista padrao deve ser vazio' do
94
+ expect(pagamento.nome_avalista).to eq ''
95
+ end
96
+
97
+ it 'valor da mora padrao deve ser zero' do
98
+ expect(pagamento.valor_mora).to eq 0.0
99
+ end
100
+
101
+ it 'valor do desconto padrao deve ser zero' do
102
+ expect(pagamento.valor_desconto).to eq 0.0
103
+ end
104
+
105
+ it 'valor do IOF padrao deve ser zero' do
106
+ expect(pagamento.valor_iof).to eq 0.0
107
+ end
108
+
109
+ it 'valor do abatimento padrao deve ser zero' do
110
+ expect(pagamento.valor_abatimento).to eq 0.0
111
+ end
112
+ end
113
+
114
+ context 'formatacoes dos valores' do
115
+ context 'formata data do desconto' do
116
+ it 'formata data limite do desconto de acordo com o formato passado' do
117
+ pagamento.data_desconto = Date.parse('2015-06-25')
118
+ # formato padrao: DDMMAA
119
+ expect(pagamento.formata_data_desconto).to eq '250615'
120
+ # outro formato
121
+ expect(pagamento.formata_data_desconto('%d%m%Y')).to eq '25062015'
122
+ end
123
+
124
+ it 'retorna zeros se a data estiver vazia' do
125
+ pagamento.data_desconto = nil
126
+ expect(pagamento.formata_data_desconto).to eq '000000'
127
+ end
128
+ end
129
+
130
+ it 'formata valor com o numero de posicoes passadas' do
131
+ # padrao com 13 posicoes
132
+ expect(pagamento.formata_valor).to eq '0000000019990'
133
+ # formata com o numero passado
134
+ expect(pagamento.formata_valor(8)).to eq '00019990'
135
+ end
136
+
137
+ it 'formata valor de mora com o numero de posicoes passadas' do
138
+ # padrao com 13 posicoes
139
+ pagamento.valor_mora = 9.0
140
+ expect(pagamento.formata_valor_mora).to eq '0000000000900'
141
+ end
142
+
143
+ it 'formata valor de desconto com o numero de posicoes passadas' do
144
+ # padrao com 13 posicoes
145
+ pagamento.valor_desconto = 129.0
146
+ expect(pagamento.formata_valor_desconto).to eq '0000000012900'
147
+ # formata com o numero passado
148
+ expect(pagamento.formata_valor_desconto(5)).to eq '12900'
149
+ end
150
+
151
+ it 'formata valor do IOF com o numero de posicoes passadas' do
152
+ # padrao com 13 posicoes
153
+ pagamento.valor_iof = 1.84
154
+ expect(pagamento.formata_valor_iof).to eq '0000000000184'
155
+ # formata com o numero passado
156
+ expect(pagamento.formata_valor_iof(15)).to eq '000000000000184'
157
+ end
158
+
159
+ it 'formata valor do abatimento com o numero de posicoes passadas' do
160
+ # padrao com 13 posicoes
161
+ pagamento.valor_abatimento = 34.9
162
+ expect(pagamento.formata_valor_abatimento).to eq '0000000003490'
163
+ # formata com o numero passado
164
+ expect(pagamento.formata_valor_abatimento(10)).to eq '0000003490'
165
+ end
166
+
167
+ context 'identificacao sacado' do
168
+ it 'verifica a identificacao do sacado (pessoa fisica ou juridica)' do
169
+ # pessoa fisica
170
+ expect(pagamento.identificacao_sacado).to eq '01'
171
+ # pessoa juridica
172
+ pagamento.documento_sacado = '123456789101112'
173
+ expect(pagamento.identificacao_sacado).to eq '02'
174
+ end
175
+
176
+ it 'formata a identificacao com o numero de caracteres informados' do
177
+ expect(pagamento.identificacao_sacado(4)).to eq '0001'
178
+ end
179
+ end
180
+
181
+ context 'identificacao avalista' do
182
+ it 'verifica a identificacao do avalista (pessoa fisica ou juridica)' do
183
+ # pessoa fisica
184
+ pagamento.documento_avalista = '123456789101'
185
+ expect(pagamento.identificacao_avalista).to eq '01'
186
+ # pessoa juridica
187
+ pagamento.documento_avalista = '123456789101112'
188
+ expect(pagamento.identificacao_avalista).to eq '02'
189
+ end
190
+
191
+ it 'formata a identificacao com o numero de caracteres informados' do
192
+ pagamento.documento_avalista = '123456789101'
193
+ expect(pagamento.identificacao_avalista(1)).to eq '1'
194
+ end
195
+ end
196
+ end
197
+ end
@@ -2,7 +2,6 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Brcobranca::Retorno::RetornoCbr643 do
5
-
6
5
  before(:each) do
7
6
  @arquivo = File.join(File.dirname(__FILE__), '..', 'arquivos', 'CBR64310.RET')
8
7
  end
@@ -66,5 +65,4 @@ describe Brcobranca::Retorno::RetornoCbr643 do
66
65
  # pagamentos.first.valor_recebido.should eql("0000000009064")
67
66
  # pagamentos.first.nosso_numero.should eql("16224200000000003")
68
67
  # end
69
-
70
68
  end
@@ -2,7 +2,6 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe 'RGhost' do
5
-
6
5
  before(:each) do
7
6
  @valid_attributes = {
8
7
  especie_documento: 'DM',
@@ -33,5 +32,4 @@ describe 'RGhost' do
33
32
  s = `#{RGhost::Config::GS[:path]} --version`
34
33
  expect(s).to match(/[8-9]\.[0-9]/)
35
34
  end
36
-
37
35
  end
@@ -0,0 +1,206 @@
1
+ # -*- encoding: utf-8 -*-
2
+ shared_examples_for 'cnab240' do
3
+ let(:pagamento) do
4
+ Brcobranca::Remessa::Pagamento.new(valor: 199.9,
5
+ data_vencimento: Date.today,
6
+ nosso_numero: 123,
7
+ documento_sacado: '12345678901',
8
+ nome_sacado: 'nome',
9
+ endereco_sacado: 'endereco',
10
+ bairro_sacado: 'bairro',
11
+ cep_sacado: '12345678',
12
+ cidade_sacado: 'cidade',
13
+ uf_sacado: 'SP',
14
+ valor_iof: 9.9,
15
+ valor_abatimento: 24.35,
16
+ documento_avalista: '12345678901',
17
+ nome_avalista: 'avalista')
18
+ end
19
+ let(:params) do
20
+ p = { empresa_mae: 'teste',
21
+ agencia: '1234',
22
+ conta_corrente: '12345',
23
+ documento_cedente: '12345678901',
24
+ convenio: '123456',
25
+ sequencial_remessa: '1',
26
+ mensagem_1: 'mensagem 1',
27
+ mensagem_2: 'mensagem 2',
28
+ pagamentos: [pagamento] }
29
+ if subject.class == Brcobranca::Remessa::Cnab240::Caixa
30
+ p.merge!(versao_aplicativo: '1234',
31
+ digito_agencia: '1')
32
+ else
33
+ p.merge!(carteira: '12',
34
+ variacao: '123')
35
+ end
36
+ end
37
+ let(:objeto) { subject.class.new(params) }
38
+
39
+ context 'header arquivo' do
40
+ it 'header arquivo deve ter 240 posicoes' do
41
+ expect(objeto.monta_header_arquivo.size).to eq 240
42
+ end
43
+
44
+ it 'header arquivo deve ter as informacoes nas posicoes corretas' do
45
+ header = objeto.monta_header_arquivo
46
+ expect(header[0..2]).to eq objeto.cod_banco # cod. do banco
47
+ expect(header[17]).to eq '1' # tipo inscricao do cedente
48
+ expect(header[18..31]).to eq '00012345678901' # documento do cedente
49
+ expect(header[32..51]).to eq objeto.codigo_convenio # informacoes do convenio
50
+ expect(header[52..71]).to eq objeto.info_conta # informacoes da conta
51
+ expect(header[72..101]).to eq 'TESTE'.ljust(30, ' ') # razao social do cedente
52
+ expect(header[157..162]).to eq '000001' # sequencial de remessa
53
+ expect(header[163..165]).to eq objeto.versao_layout # versao do layout
54
+ end
55
+ end
56
+
57
+ context 'header lote' do
58
+ it 'header lote deve ter 240 posicoes' do
59
+ expect(objeto.monta_header_lote(1).size).to eq 240
60
+ end
61
+
62
+ it 'header lote deve ter as informacoes nas posicoes corretas' do
63
+ header = objeto.monta_header_lote 1
64
+ expect(header[0..2]).to eq objeto.cod_banco # cod. do banco
65
+ expect(header[3..6]).to eq '0001' # numero do lote
66
+ expect(header[13..15]).to eq objeto.versao_layout # versao do layout
67
+ expect(header[17]).to eq '1' # tipo inscricao do cedente
68
+ expect(header[18..32]).to eq '000012345678901' # documento do cedente
69
+ expect(header[33..52]).to eq objeto.convenio_lote # informacoes do convenio
70
+ expect(header[53..72]).to eq objeto.info_conta # informacoes da conta
71
+ expect(header[73..102]).to eq 'TESTE'.ljust(30, ' ') # razao social do cedente
72
+ expect(header[103..142]).to eq 'MENSAGEM 1'.ljust(40, ' ') # 1a mensagem
73
+ expect(header[143..182]).to eq 'MENSAGEM 2'.ljust(40, ' ') # 2a mensagem
74
+ expect(header[183..190]).to eq '00000001' # sequencial de remessa
75
+ end
76
+ end
77
+
78
+ context 'segmento P' do
79
+ it 'segmento P deve ter 240 posicoes' do
80
+ expect(objeto.monta_segmento_p(pagamento, 1, 2).size).to eq 240
81
+ end
82
+
83
+ it 'segmento P deve ter as informacos nas posicoes corretas' do
84
+ segmento_p = objeto.monta_segmento_p pagamento, 1, 2
85
+ expect(segmento_p[0..2]).to eq objeto.cod_banco # codigo do banco
86
+ expect(segmento_p[3..6]).to eq '0001' # numero do lote
87
+ expect(segmento_p[8..12]).to eq '00002' # sequencial do registro no lote
88
+ expect(segmento_p[17..21]).to eq '01234' # agencia
89
+ expect(segmento_p[22]).to eq objeto.digito_agencia.to_s # digito da agencia
90
+ expect(segmento_p[23..56]).to eq objeto.complemento_p(pagamento) # complemento do segmento P
91
+ expect(segmento_p[62..72]).to eq '00000000123' # nosso numero
92
+ expect(segmento_p[77..84]).to eq Date.today.strftime('%d%m%Y') # data de vencimento
93
+ expect(segmento_p[85..99]).to eq '000000000019990' # valor
94
+ expect(segmento_p[109..116]).to eq Date.today.strftime('%d%m%Y') # data de emissao
95
+ # mora
96
+ expect(segmento_p[141]).to eq '0' # codigo do desconto
97
+ expect(segmento_p[142..149]).to eq '00000000' # data de desconto
98
+ expect(segmento_p[150..164]).to eq ''.rjust(15, '0') # valor do desconto
99
+ expect(segmento_p[165..179]).to eq '000000000000990' # valor do IOF
100
+ expect(segmento_p[180..194]).to eq '000000000002435' # valor do abatimento
101
+ end
102
+ end
103
+
104
+ context 'segmento Q' do
105
+ it 'segmento Q deve ter 240 posicoes' do
106
+ expect(objeto.monta_segmento_q(pagamento, 1, 3).size).to eq 240
107
+ end
108
+
109
+ it 'segmento Q deve ter as informacoes nas posicoes corretas' do
110
+ segmento_q = objeto.monta_segmento_q pagamento, 1, 3
111
+ expect(segmento_q[0..2]).to eq objeto.cod_banco # codigo do banco
112
+ expect(segmento_q[3..6]).to eq '0001' # numero do lote
113
+ expect(segmento_q[8..12]).to eq '00003' # numero do registro no lote
114
+ expect(segmento_q[17]).to eq '1' # tipo inscricao sacado
115
+ expect(segmento_q[18..32]).to eq '000012345678901' # documento do sacado
116
+ expect(segmento_q[33..72]).to eq 'NOME'.ljust(40, ' ') # nome do sacado
117
+ expect(segmento_q[73..112]).to eq 'ENDERECO'.ljust(40, ' ') # endereco do sacado
118
+ expect(segmento_q[113..127]).to eq 'BAIRRO'.ljust(15, ' ') # bairro do sacado
119
+ expect(segmento_q[128..132]).to eq '12345' # CEP do sacado
120
+ expect(segmento_q[133..135]).to eq '678' # sufixo CEP do sacado
121
+ expect(segmento_q[136..150]).to eq 'CIDADE'.ljust(15, ' ') # cidade do sacado
122
+ expect(segmento_q[151..152]).to eq 'SP' # UF do sacado
123
+ expect(segmento_q[153]).to eq '1' # tipo inscricao avalista
124
+ expect(segmento_q[154..168]).to eq '000012345678901' # documento avalista
125
+ expect(segmento_q[169..208]).to eq 'AVALISTA'.ljust(40, ' ') # nome do avalista
126
+ end
127
+ end
128
+
129
+ context 'trailer lote' do
130
+ it 'trailer lote deve ter 240 posicoes' do
131
+ expect(objeto.monta_trailer_lote(1, 4).size).to eq 240
132
+ end
133
+
134
+ it 'trailer lote deve ter as informacoes nas posicoes corretas' do
135
+ trailer = objeto.monta_trailer_lote 1, 4
136
+ expect(trailer[0..2]).to eq objeto.cod_banco # cod. do banco
137
+ expect(trailer[3..6]).to eq '0001' # numero do lote
138
+ expect(trailer[17..22]).to eq '000004' # qtde de registros no lote
139
+ expect(trailer[23..239]).to eq objeto.complemento_trailer # complemento do registro trailer
140
+ end
141
+ end
142
+
143
+ context 'trailer arquivo' do
144
+ it 'trailer arquivo deve ter 240 posicoes' do
145
+ expect(objeto.monta_trailer_arquivo(1, 6).size).to eq 240
146
+ end
147
+
148
+ it 'trailer arquivo deve ter as informacoes nas posicoes corretas' do
149
+ trailer = objeto.monta_trailer_arquivo 1, 6
150
+ expect(trailer[0..2]).to eq objeto.cod_banco # cod. do banco
151
+ expect(trailer[17..22]).to eq '000001' # qtde de lotes
152
+ expect(trailer[23..28]).to eq '000006' # qtde de registros
153
+ end
154
+ end
155
+
156
+ context 'monta lote' do
157
+ it 'deve falhar se o pagamento passado nao for valido' do
158
+ expect { objeto.monta_lote(Brcobranca::Remessa::Pagamento.new, 1) }.to raise_error(Brcobranca::RemessaInvalida)
159
+ end
160
+
161
+ it 'retorno de lote deve ser uma colecao com os registros' do
162
+ lote = objeto.monta_lote pagamento, 1
163
+
164
+ expect(lote.is_a?(Array)).to be true
165
+ expect(lote.count).to be 4 # header, segmento p, segmento q e trailer
166
+ end
167
+
168
+ it 'contador de registros deve acrescer 1 a cada registro' do
169
+ lote = objeto.monta_lote pagamento, 1
170
+
171
+ expect(lote[1][8..12]).to eq '00002' # segmento P
172
+ expect(lote[2][8..12]).to eq '00003' # segmento Q
173
+ expect(lote[3][17..22]).to eq '000004' # trailer do lote
174
+ end
175
+ end
176
+
177
+ context 'gera arquivo' do
178
+ it 'deve falhar se o objeto for invalido' do
179
+ expect { subject.class.new.gera_arquivo }.to raise_error(Brcobranca::RemessaInvalida)
180
+ end
181
+
182
+ it 'remessa deve conter os registros mais as quebras de linha' do
183
+ remessa = objeto.gera_arquivo
184
+
185
+ expect(remessa.size).to eq 1445
186
+ # quebras de linha
187
+ expect(remessa[240]).to eq "\n"
188
+ expect(remessa[481]).to eq "\n"
189
+ expect(remessa[722]).to eq "\n"
190
+ expect(remessa[963]).to eq "\n"
191
+ expect(remessa[1204]).to eq "\n"
192
+ end
193
+
194
+ it 'pode ser adicionado varios lotes' do
195
+ objeto.pagamentos << pagamento
196
+ remessa = objeto.gera_arquivo
197
+ lote1 = remessa[241..1203]
198
+ lote2 = remessa[1205..2167]
199
+
200
+ # 10 registros (2400) + 9 quebras de linha (18)
201
+ expect(remessa.size).to eq 2409
202
+ expect(lote1).to eq objeto.monta_lote(pagamento, 1).join("\n")
203
+ expect(lote2).to eq objeto.monta_lote(pagamento, 2).join("\n")
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,85 @@
1
+ # -*- encoding: utf-8 -*-
2
+ shared_examples_for 'cnab400' do
3
+ let(:pagamento) do
4
+ Brcobranca::Remessa::Pagamento.new(valor: 199.9,
5
+ data_vencimento: Date.today,
6
+ nosso_numero: 123,
7
+ documento_sacado: '12345678901',
8
+ nome_sacado: 'nome',
9
+ endereco_sacado: 'endereco',
10
+ bairro_sacado: 'bairro',
11
+ cep_sacado: '12345678',
12
+ cidade_sacado: 'cidade',
13
+ uf_sacado: 'SP')
14
+ end
15
+ let(:params) do
16
+ if subject.class == Brcobranca::Remessa::Cnab400::Bradesco
17
+ { carteira: '01',
18
+ agencia: '12345',
19
+ conta_corrente: '1234567',
20
+ digito_conta: '1',
21
+ empresa_mae: 'asd',
22
+ sequencial_remessa: '1',
23
+ codigo_empresa: '123',
24
+ pagamentos: [pagamento] }
25
+ else
26
+ { carteira: '123',
27
+ agencia: '1234',
28
+ conta_corrente: '12345',
29
+ digito_conta: '1',
30
+ empresa_mae: 'asd',
31
+ documento_cedente: '12345678910',
32
+ pagamentos: [pagamento] }
33
+ end
34
+ end
35
+ let(:objeto) { subject.class.new(params) }
36
+
37
+ it 'header deve ter 400 posicoes' do
38
+ expect(objeto.monta_header.size).to eq 400
39
+ end
40
+
41
+ it 'detalhe deve falhar se pagamento nao for valido' do
42
+ expect { objeto.monta_detalhe(Brcobranca::Remessa::Pagamento.new, 1) }.to raise_error(Brcobranca::RemessaInvalida)
43
+ end
44
+
45
+ it 'detalhe deve ter 400 posicoes' do
46
+ expect(objeto.monta_detalhe(pagamento, 1).size).to eq 400
47
+ end
48
+
49
+ context 'trailer' do
50
+ it 'trailer deve ter 400 posicoes' do
51
+ expect(objeto.monta_trailer(1).size).to eq 400
52
+ end
53
+
54
+ it 'informacoes devem estar posicionadas corretamente no trailer' do
55
+ trailer = objeto.monta_trailer 3
56
+ expect(trailer[0]).to eq '9' # identificacao registro
57
+ expect(trailer[1..393]).to eq ''.rjust(393, ' ') # brancos
58
+ expect(trailer[394..399]).to eq '000003' # numero sequencial do registro
59
+ end
60
+ end
61
+
62
+ it 'montagem da remessa deve falhar se o objeto nao for valido' do
63
+ expect { subject.class.new.gera_arquivo }.to raise_error(Brcobranca::RemessaInvalida)
64
+ end
65
+
66
+ it 'remessa deve conter os registros mais as quebras de linha' do
67
+ remessa = objeto.gera_arquivo
68
+ expect(remessa.size).to eq 1202
69
+
70
+ # registros
71
+ expect(remessa[0..399]).to eq objeto.monta_header
72
+ expect(remessa[401..800]).to eq objeto.monta_detalhe(pagamento, 2)
73
+ expect(remessa[802..1201]).to eq objeto.monta_trailer(3)
74
+ # quebras de linha
75
+ expect(remessa[400]).to eq "\n"
76
+ expect(remessa[801]).to eq "\n"
77
+ end
78
+
79
+ it 'deve ser mais possivel adicionar mais de um pagamento' do
80
+ objeto.pagamentos << pagamento
81
+ remessa = objeto.gera_arquivo
82
+
83
+ expect(remessa.size).to eq 1603
84
+ end
85
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brcobranca
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kivanio Barbosa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-19 00:00:00.000000000 Z
11
+ date: 2015-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rghost
@@ -74,6 +74,7 @@ extra_rdoc_files: []
74
74
  files:
75
75
  - ".coveralls.yml"
76
76
  - ".gitignore"
77
+ - ".rspec"
77
78
  - ".rubocop.yml"
78
79
  - ".ruby-gemset"
79
80
  - ".ruby-version"
@@ -110,7 +111,16 @@ files:
110
111
  - lib/brcobranca/calculo_data.rb
111
112
  - lib/brcobranca/currency.rb
112
113
  - lib/brcobranca/formatacao.rb
114
+ - lib/brcobranca/formatacao_string.rb
113
115
  - lib/brcobranca/limpeza.rb
116
+ - lib/brcobranca/remessa/base.rb
117
+ - lib/brcobranca/remessa/cnab240/banco_brasil.rb
118
+ - lib/brcobranca/remessa/cnab240/base.rb
119
+ - lib/brcobranca/remessa/cnab240/caixa.rb
120
+ - lib/brcobranca/remessa/cnab400/base.rb
121
+ - lib/brcobranca/remessa/cnab400/bradesco.rb
122
+ - lib/brcobranca/remessa/cnab400/itau.rb
123
+ - lib/brcobranca/remessa/pagamento.rb
114
124
  - lib/brcobranca/retorno/base.rb
115
125
  - lib/brcobranca/retorno/retorno_cbr643.rb
116
126
  - lib/brcobranca/retorno/retorno_cnab240.rb
@@ -130,11 +140,21 @@ files:
130
140
  - spec/brcobranca/boletos_em_lote_spec.rb
131
141
  - spec/brcobranca/core_ext_spec.rb
132
142
  - spec/brcobranca/currency_spec.rb
143
+ - spec/brcobranca/remessa/base_spec.rb
144
+ - spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb
145
+ - spec/brcobranca/remessa/cnab240/base_spec.rb
146
+ - spec/brcobranca/remessa/cnab240/caixa_spec.rb
147
+ - spec/brcobranca/remessa/cnab400/base_spec.rb
148
+ - spec/brcobranca/remessa/cnab400/bradesco_spec.rb
149
+ - spec/brcobranca/remessa/cnab400/itau_spec.rb
150
+ - spec/brcobranca/remessa/pagamento_spec.rb
133
151
  - spec/brcobranca/retorno_cbr643_spec.rb
134
152
  - spec/brcobranca/retorno_cnab400_spec.rb
135
153
  - spec/brcobranca/retorno_cnab_240_spec.rb
136
154
  - spec/brcobranca/rghost_spec.rb
137
155
  - spec/brcobranca_spec.rb
156
+ - spec/shared_examples/cnab240.rb
157
+ - spec/shared_examples/cnab400.rb
138
158
  - spec/spec.opts
139
159
  - spec/spec_helper.rb
140
160
  homepage: http://rubygems.org/gems/brcobranca
@@ -148,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
168
  requirements:
149
169
  - - ">="
150
170
  - !ruby/object:Gem::Version
151
- version: '0'
171
+ version: '1.9'
152
172
  required_rubygems_version: !ruby/object:Gem::Requirement
153
173
  requirements:
154
174
  - - ">="
@@ -157,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
177
  requirements:
158
178
  - GhostScript > 9.0, para gear PDF e código de Barras
159
179
  rubyforge_project:
160
- rubygems_version: 2.4.6
180
+ rubygems_version: 2.4.8
161
181
  signing_key:
162
182
  specification_version: 4
163
183
  summary: Gem que permite trabalhar com bloquetos de cobranca para bancos brasileiros.
@@ -176,10 +196,20 @@ test_files:
176
196
  - spec/brcobranca/boletos_em_lote_spec.rb
177
197
  - spec/brcobranca/core_ext_spec.rb
178
198
  - spec/brcobranca/currency_spec.rb
199
+ - spec/brcobranca/remessa/base_spec.rb
200
+ - spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb
201
+ - spec/brcobranca/remessa/cnab240/base_spec.rb
202
+ - spec/brcobranca/remessa/cnab240/caixa_spec.rb
203
+ - spec/brcobranca/remessa/cnab400/base_spec.rb
204
+ - spec/brcobranca/remessa/cnab400/bradesco_spec.rb
205
+ - spec/brcobranca/remessa/cnab400/itau_spec.rb
206
+ - spec/brcobranca/remessa/pagamento_spec.rb
179
207
  - spec/brcobranca/retorno_cbr643_spec.rb
180
208
  - spec/brcobranca/retorno_cnab400_spec.rb
181
209
  - spec/brcobranca/retorno_cnab_240_spec.rb
182
210
  - spec/brcobranca/rghost_spec.rb
183
211
  - spec/brcobranca_spec.rb
212
+ - spec/shared_examples/cnab240.rb
213
+ - spec/shared_examples/cnab400.rb
184
214
  - spec/spec.opts
185
215
  - spec/spec_helper.rb