br_boleto 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/Gemfile.lock +3 -3
  4. data/README.markdown +196 -11
  5. data/Rakefile +5 -0
  6. data/br_boleto.gemspec +1 -1
  7. data/lib/br_boleto.rb +30 -12
  8. data/lib/br_boleto/{core/boleto.rb → boleto/base.rb} +83 -5
  9. data/lib/br_boleto/boleto/sicoob.rb +211 -0
  10. data/lib/br_boleto/calculos/modulo11_fator3197.rb +5 -5
  11. data/lib/br_boleto/helper/cpf_cnpj.rb +60 -0
  12. data/lib/br_boleto/helper/number.rb +15 -0
  13. data/lib/br_boleto/remessa/base.rb +89 -0
  14. data/lib/br_boleto/remessa/cnab240/base.rb +328 -0
  15. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +186 -0
  16. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +180 -0
  17. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +349 -0
  18. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +206 -0
  19. data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +261 -0
  20. data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +193 -0
  21. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +88 -0
  22. data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +75 -0
  23. data/lib/br_boleto/remessa/cnab240/sicoob.rb +246 -0
  24. data/lib/br_boleto/remessa/lote.rb +52 -0
  25. data/lib/br_boleto/remessa/pagamento.rb +238 -0
  26. data/lib/br_boleto/string_methods.rb +21 -0
  27. data/lib/br_boleto/version.rb +2 -2
  28. data/test/br_boleto/{core/boleto_test.rb → boleto/base_test.rb} +107 -11
  29. data/test/br_boleto/{core → boleto}/sicoob_test.rb +60 -2
  30. data/test/br_boleto/remessa/base_test.rb +80 -0
  31. data/test/br_boleto/remessa/cnab240/base_test.rb +405 -0
  32. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +208 -0
  33. data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +200 -0
  34. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +390 -0
  35. data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +223 -0
  36. data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +260 -0
  37. data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +217 -0
  38. data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +82 -0
  39. data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +67 -0
  40. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +347 -0
  41. data/test/br_boleto/remessa/lote_test.rb +49 -0
  42. data/test/br_boleto/remessa/pagamento_test.rb +339 -0
  43. data/test/factories/{boleto.rb → boleto/base.rb} +1 -1
  44. data/test/factories/{boleto_sicoob.rb → boleto/boleto_sicoob.rb} +1 -1
  45. data/test/factories/remessa/base.rb +13 -0
  46. data/test/factories/remessa/cnab240/base.rb +18 -0
  47. data/test/factories/remessa/cnab240/sicoob.rb +18 -0
  48. data/test/factories/remessa/lote.rb +7 -0
  49. data/test/factories/remessa/pagamento.rb +16 -0
  50. data/test/inheritance/boleto_test.rb +1 -1
  51. data/test/inheritance/sicoob_test.rb +1 -1
  52. metadata +65 -13
  53. data/lib/br_boleto/core/sicoob.rb +0 -169
@@ -0,0 +1,217 @@
1
+ module Helper
2
+ module SegmentoSTest
3
+ def test_SegmentoSTest_metodo_monta_segmento_s_deve_ter_o_conteudo_dos_metodos_na_sequencia_tipo_imressao_1
4
+ pagamento.tipo_impressao = '1'
5
+ subject.stubs(:segmento_s_posicao_001_a_003).returns( " 001_a_003")
6
+ subject.stubs(:segmento_s_posicao_004_a_007).with(1).returns( " 004_a_007")
7
+ subject.stubs(:segmento_s_posicao_008_a_008).returns( " 008_a_008")
8
+ subject.stubs(:segmento_s_posicao_009_a_013).with(2).returns( " 009_a_013")
9
+ subject.stubs(:segmento_s_posicao_014_a_014).returns( " 014_a_014")
10
+ subject.stubs(:segmento_s_posicao_015_a_015).returns( " 015_a_015")
11
+ subject.stubs(:segmento_s_posicao_016_a_017).returns( " 016_a_017")
12
+ subject.stubs(:segmento_s_posicao_018_a_018).with(pagamento).returns(" 018_a_018")
13
+
14
+ subject.expects(:segmento_s_tipo_impressao_1_ou_2).with(pagamento).returns(" 999")
15
+ # Deve dar um upcase
16
+ subject.monta_segmento_s(pagamento, 1, 2).must_equal(" 001_A_003 004_A_007 008_A_008 009_A_013 014_A_014 015_A_015 016_A_017 018_A_018 999")
17
+ end
18
+
19
+ def test_SegmentoSTest_metodo_monta_segmento_s_deve_ter_o_conteudo_dos_metodos_na_sequencia_tipo_imressao_2
20
+ pagamento.tipo_impressao = '2'
21
+ subject.stubs(:segmento_s_posicao_001_a_003).returns( " 001_a_003")
22
+ subject.stubs(:segmento_s_posicao_004_a_007).with(1).returns( " 004_a_007")
23
+ subject.stubs(:segmento_s_posicao_008_a_008).returns( " 008_a_008")
24
+ subject.stubs(:segmento_s_posicao_009_a_013).with(2).returns( " 009_a_013")
25
+ subject.stubs(:segmento_s_posicao_014_a_014).returns( " 014_a_014")
26
+ subject.stubs(:segmento_s_posicao_015_a_015).returns( " 015_a_015")
27
+ subject.stubs(:segmento_s_posicao_016_a_017).returns( " 016_a_017")
28
+ subject.stubs(:segmento_s_posicao_018_a_018).with(pagamento).returns(" 018_a_018")
29
+
30
+ subject.expects(:segmento_s_tipo_impressao_1_ou_2).with(pagamento).returns(" 888")
31
+ # Deve dar um upcase
32
+ subject.monta_segmento_s(pagamento, 1, 2).must_equal(" 001_A_003 004_A_007 008_A_008 009_A_013 014_A_014 015_A_015 016_A_017 018_A_018 888")
33
+ end
34
+
35
+ def test_SegmentoSTest_metodo_monta_segmento_s_deve_ter_o_conteudo_dos_metodos_na_sequencia_tipo_imressao_3
36
+ pagamento.tipo_impressao = '3'
37
+ subject.stubs(:segmento_s_posicao_001_a_003).returns( " 001_a_003")
38
+ subject.stubs(:segmento_s_posicao_004_a_007).with(1).returns( " 004_a_007")
39
+ subject.stubs(:segmento_s_posicao_008_a_008).returns( " 008_a_008")
40
+ subject.stubs(:segmento_s_posicao_009_a_013).with(2).returns( " 009_a_013")
41
+ subject.stubs(:segmento_s_posicao_014_a_014).returns( " 014_a_014")
42
+ subject.stubs(:segmento_s_posicao_015_a_015).returns( " 015_a_015")
43
+ subject.stubs(:segmento_s_posicao_016_a_017).returns( " 016_a_017")
44
+ subject.stubs(:segmento_s_posicao_018_a_018).with(pagamento).returns(" 018_a_018")
45
+
46
+ subject.expects(:segmento_s_tipo_impressao_3).with(pagamento).returns(" 777")
47
+ # Deve dar um upcase
48
+ subject.monta_segmento_s(pagamento, 1, 2).must_equal(" 001_A_003 004_A_007 008_A_008 009_A_013 014_A_014 015_A_015 016_A_017 018_A_018 777")
49
+ end
50
+
51
+ def test_SegmentoSHelper_deve_ter_240_posicoes_com_tipo_impressao_1_ou_2
52
+ pagamento.tipo_impressao = '1'
53
+ subject.stubs(:codigo_banco).returns("123")
54
+ subject.monta_segmento_s(pagamento, 1, 2).size.must_equal 240
55
+ end
56
+
57
+ def test_SegmentoSHelper_deve_ter_240_posicoes_com_tipo_impressao_3
58
+ pagamento.tipo_impressao = '3'
59
+ subject.stubs(:codigo_banco).returns("123")
60
+ subject.monta_segmento_s(pagamento, 1, 2).size.must_equal 240
61
+ end
62
+
63
+ # Código do banco
64
+ # 3 posições
65
+ #
66
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_001_a_003
67
+ subject.expects(:codigo_banco).returns("123")
68
+ subject.segmento_s_posicao_001_a_003 .must_equal '123'
69
+ end
70
+
71
+ # Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
72
+ # Criado e controlado pelo responsável pela geração magnética dos dados contidos no arquivo.
73
+ # Preencher com '0001' para o primeiro lote do arquivo.
74
+ # Para os demais: número do lote anterior acrescido de 1. O número não poderá ser repetido dentro do arquivo.
75
+ # 4 posições
76
+ #
77
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_004_a_007
78
+ subject.segmento_s_posicao_004_a_007(5).must_equal '0005'
79
+ end
80
+
81
+ # Tipo do registro -> Padrão 3
82
+ # 1 posição
83
+ #
84
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_008_a_008
85
+ subject.segmento_s_posicao_008_a_008.must_equal '3'
86
+ end
87
+
88
+ # Nº Sequencial do Registro no Lote
89
+ # 5 posições
90
+ #
91
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_009_a_013#(sequencial)
92
+ subject.segmento_s_posicao_009_a_013('4').must_equal '00004'
93
+ end
94
+
95
+ # Cód. Segmento do Registro Detalhe
96
+ # 1 posição
97
+ #
98
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_014_a_014
99
+ subject.segmento_s_posicao_014_a_014.must_equal 'S'
100
+ end
101
+
102
+ # Uso Exclusivo FEBRABAN/CNAB
103
+ # 1 posição
104
+ #
105
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_015_a_015
106
+ subject.segmento_s_posicao_015_a_015.must_equal ' '
107
+ end
108
+
109
+ # Código de Movimento Remessa - 01 = Entrada de Titulos
110
+ # 2 posições
111
+ #
112
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_016_a_017
113
+ subject.segmento_s_posicao_016_a_017.must_equal '01'
114
+ end
115
+
116
+ # Tipo de impressão
117
+ # 1 - Frente do Bloqueto
118
+ # 2 - Verso do Bloauqto
119
+ # 3 - Corpo de instruções da Ficha de Complansação
120
+ # 1 posição
121
+ #
122
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_018_a_018#(pagamento)
123
+ pagamento.expects(:tipo_impressao).returns('999')
124
+ subject.segmento_s_posicao_018_a_018(pagamento).must_equal '9'
125
+ end
126
+
127
+ ########### TIPO DE IMPRESÃO 1 OU 2 ################
128
+ def test_SegmentoSHelper_metodo_segmento_s_tipo_impressao_1_ou_2#(pagamento)
129
+ subject.stubs(:segmento_s_posicao_019_a_020_tipo_impressao_1_ou_2).with(pagamento).returns(" 019_a_020")
130
+ subject.stubs(:segmento_s_posicao_021_a_160_tipo_impressao_1_ou_2).with(pagamento).returns(" 021_a_160")
131
+ subject.stubs(:segmento_s_posicao_161_a_162_tipo_impressao_1_ou_2).with(pagamento).returns(" 161_a_162")
132
+ subject.stubs(:segmento_s_posicao_163_a_240_tipo_impressao_1_ou_2).returns(" 163_a_240")
133
+ subject.segmento_s_tipo_impressao_1_ou_2(pagamento).must_equal(" 019_a_020 021_a_160 161_a_162 163_a_240")
134
+ end
135
+ # Numero da Linha a ser impressa
136
+ # 2 posições
137
+ #
138
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_019_a_020_tipo_impressao_1_ou_2#(pagamento)
139
+ subject.segmento_s_posicao_019_a_020_tipo_impressao_1_ou_2(pagamento).must_equal '01'
140
+ end
141
+ # Mensagem a ser impresas
142
+ # 140 posições
143
+ #
144
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_021_a_160_tipo_impressao_1_ou_2#(pagamento)
145
+ subject.segmento_s_posicao_021_a_160_tipo_impressao_1_ou_2(pagamento).must_equal ''.rjust(140, ' ')
146
+ end
147
+
148
+ # Tipo de caractere a ser impresso
149
+ # '01' = Normal
150
+ # '02' = Itálico
151
+ # '03' = Normal Negrito
152
+ # '04' = Itálico Negrito
153
+ # 2 posições
154
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_161_a_162_tipo_impressao_1_ou_2#(pagamento)
155
+ subject.segmento_s_posicao_161_a_162_tipo_impressao_1_ou_2(pagamento).must_equal '01'
156
+ end
157
+
158
+ # Uso exclusivo
159
+ # 78 posições
160
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_163_a_240_tipo_impressao_1_ou_2
161
+ subject.segmento_s_posicao_163_a_240_tipo_impressao_1_ou_2.must_equal ''.rjust(78, ' ')
162
+ end
163
+ ########################################################
164
+ ############## TIPO DE IMPRESSÃO 3 #####################
165
+ def test_SegmentoSHelper_metodo_segmento_s_tipo_impressao_3#(pagamento)
166
+ subject.stubs(:segmento_s_posicao_019_a_058_tipo_impressao_3).with(pagamento).returns(" 019_a_058")
167
+ subject.stubs(:segmento_s_posicao_059_a_098_tipo_impressao_3).with(pagamento).returns(" 059_a_098")
168
+ subject.stubs(:segmento_s_posicao_099_a_138_tipo_impressao_3).with(pagamento).returns(" 099_a_138")
169
+ subject.stubs(:segmento_s_posicao_139_a_178_tipo_impressao_3).with(pagamento).returns(" 139_a_178")
170
+ subject.stubs(:segmento_s_posicao_179_a_218_tipo_impressao_3).with(pagamento).returns(" 179_a_218")
171
+ subject.stubs(:segmento_s_posicao_219_a_240_tipo_impressao_3).returns(" 219_a_240")
172
+ subject.segmento_s_tipo_impressao_3(pagamento).must_equal(" 019_a_058 059_a_098 099_a_138 139_a_178 179_a_218 219_a_240")
173
+ end
174
+ # Informação 5
175
+ # 40 posições
176
+ #
177
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_019_a_058_tipo_impressao_3#(pagamento)
178
+ subject.segmento_s_posicao_019_a_058_tipo_impressao_3(pagamento).must_equal ''.rjust(40, ' ')
179
+ end
180
+
181
+ # Informação 6
182
+ # 40 posições
183
+ #
184
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_059_a_098_tipo_impressao_3#(pagamento)
185
+ subject.segmento_s_posicao_059_a_098_tipo_impressao_3(pagamento).must_equal ''.rjust(40, ' ')
186
+ end
187
+
188
+ # Informação 7
189
+ # 40 posições
190
+ #
191
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_099_a_138_tipo_impressao_3#(pagamento)
192
+ subject.segmento_s_posicao_099_a_138_tipo_impressao_3(pagamento).must_equal ''.rjust(40, ' ')
193
+ end
194
+
195
+ # Informação 8
196
+ # 40 posições
197
+ #
198
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_139_a_178_tipo_impressao_3#(pagamento)
199
+ subject.segmento_s_posicao_139_a_178_tipo_impressao_3(pagamento).must_equal ''.rjust(40, ' ')
200
+ end
201
+
202
+ # Informação 9
203
+ # 40 posições
204
+ #
205
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_179_a_218_tipo_impressao_3#(pagamento)
206
+ subject.segmento_s_posicao_179_a_218_tipo_impressao_3(pagamento).must_equal ''.rjust(40, ' ')
207
+ end
208
+
209
+ # Uso exclusivo
210
+ # 78 posições
211
+ def test_SegmentoSHelper_metodo_segmento_s_posicao_219_a_240_tipo_impressao_3
212
+ subject.segmento_s_posicao_219_a_240_tipo_impressao_3.must_equal ''.rjust(22, ' ')
213
+ end
214
+ ########################################################
215
+
216
+ end
217
+ end
@@ -0,0 +1,82 @@
1
+ module Helper
2
+ module TrailerArquivoTest
3
+ def test_TrailerArquivo_metodo_monta_trailer_arquivo_deve_ter_o_conteudo_dos_metodos_na_sequencia
4
+ subject.stubs(:trailer_arquivo_posicao_001_a_003).returns( " 001_a_003")
5
+ subject.stubs(:trailer_arquivo_posicao_004_a_007).with(1).returns(" 004_a_007")
6
+ subject.stubs(:trailer_arquivo_posicao_008_a_008).returns( " 008_a_008")
7
+ subject.stubs(:trailer_arquivo_posicao_009_a_017).returns( " 009_a_017")
8
+ subject.stubs(:trailer_arquivo_posicao_018_a_023).with(1).returns(" 018_a_023")
9
+ subject.stubs(:trailer_arquivo_posicao_024_a_029).with(2).returns(" 024_a_029")
10
+ subject.stubs(:trailer_arquivo_posicao_030_a_035).returns( " 030_a_035")
11
+ subject.stubs(:trailer_arquivo_posicao_036_a_240).returns( " 036_a_240")
12
+ # Deve dar um upcase
13
+ subject.monta_trailer_arquivo(1, 2).must_equal(" 001_A_003 004_A_007 008_A_008 009_A_017 018_A_023 024_A_029 030_A_035 036_A_240")
14
+ end
15
+
16
+ # Código do banco
17
+ # 3 posições
18
+ # Por padrão deve retornar o "codigo_banco"
19
+ #
20
+ def test_TrailerArquivo_metodo_trailer_arquivo_posicao_001_a_003
21
+ subject.expects(:codigo_banco).returns("669")
22
+ subject.trailer_arquivo_posicao_001_a_003.must_equal("669")
23
+ end
24
+
25
+ # Lote de Serviço -> Padrão 9999
26
+ # 4 posições
27
+ # Padrão retorna 9999
28
+ #
29
+ def test_TrailerArquivo_metodo_trailer_arquivo_posicao_004_a_007#(nro_lotes)
30
+ subject.trailer_arquivo_posicao_004_a_007('tato faz').must_equal '9999'
31
+ end
32
+
33
+ # Tipo do registro -> Padrão 9
34
+ # 1 posição
35
+ # Retorna '9'
36
+ #
37
+ def test_TrailerArquivo_metodo_trailer_arquivo_posicao_008_a_008
38
+ subject.trailer_arquivo_posicao_008_a_008.must_equal '9'
39
+ end
40
+
41
+ # Uso Exclusivo FEBRABAN/CNAB
42
+ # 9 posições
43
+ # todas as posições em branco
44
+ #
45
+ def test_TrailerArquivo_metodo_trailer_arquivo_posicao_009_a_017
46
+ subject.trailer_arquivo_posicao_009_a_017.must_equal ''.rjust(9, ' ')
47
+ end
48
+
49
+ # Quantidade de Lotes do Arquivo
50
+ # 6 posições
51
+ # deve retornar o numero de lotes com 6 posições
52
+ #
53
+ def test_TrailerArquivo_metodo_trailer_arquivo_posicao_018_a_023#(nro_lotes)
54
+ subject.trailer_arquivo_posicao_018_a_023(123).must_equal '123'.rjust(6, '0')
55
+ end
56
+
57
+ # Quantidade de Registros do Arquivo
58
+ # 6 posições
59
+ # Deve retornar o sequencial com 6 posições
60
+ #
61
+ def test_TrailerArquivo_metodo_trailer_arquivo_posicao_024_a_029#(sequencial)
62
+ subject.trailer_arquivo_posicao_024_a_029(888).must_equal '888'.to_s.rjust(6, '0')
63
+ end
64
+
65
+ # Qtde de Contas p/ Conc. (Lotes)
66
+ # 6 posições
67
+ # Retorna 6 posições em branco
68
+ #
69
+ def test_TrailerArquivo_metodo_trailer_arquivo_posicao_030_a_035
70
+ subject.trailer_arquivo_posicao_030_a_035.must_equal ''.rjust(6, ' ')
71
+ end
72
+
73
+ # Uso Exclusivo FEBRABAN/CNAB
74
+ # 205 posições
75
+ # Retorna todas as posições em branco
76
+ #
77
+ def test_TrailerArquivo_metodo_trailer_arquivo_posicao_036_a_240
78
+ subject.trailer_arquivo_posicao_036_a_240.must_equal ''.rjust(205, ' ')
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,67 @@
1
+ module Helper
2
+ module TrailerLoteTest
3
+ def test_TrailerLote_metodo_monta_trailer_lote_deve_ter_o_conteudo_dos_metodos_na_sequencia
4
+ subject.stubs(:trailer_lote_posicao_001_a_003).returns( ' 001_a_003')
5
+ subject.stubs(:trailer_lote_posicao_004_a_007).with(1).returns(' 004_a_007')
6
+ subject.stubs(:trailer_lote_posicao_008_a_008).returns( ' 008_a_008')
7
+ subject.stubs(:trailer_lote_posicao_009_a_017).returns( ' 009_a_017')
8
+ subject.stubs(:trailer_lote_posicao_018_a_023).with(2).returns(' 018_a_023')
9
+ subject.stubs(:trailer_lote_posicao_024_a_240).returns( ' 024_a_240')
10
+ # Deve dar um upcase
11
+ subject.monta_trailer_lote(lote, 1, 2).must_equal(" 001_A_003 004_A_007 008_A_008 009_A_017 018_A_023 024_A_240")
12
+ end
13
+
14
+ # Código do banco
15
+ # 3 posições
16
+ # Por padrão deve retornar o "codigo_banco"
17
+ #
18
+ def test_TrailerLote_metodo_trailer_lote_posicao_001_a_003
19
+ subject.expects(:codigo_banco).returns("669")
20
+ subject.trailer_lote_posicao_001_a_003.must_equal("669")
21
+ end
22
+
23
+ # Lote de Serviço: Número seqüencial para identificar univocamente um lote de serviço.
24
+ # Criado e controlado pelo responsável pela geração magnética dos dados contidos no arquivo.
25
+ # Preencher com '0001' para o primeiro lote do arquivo.
26
+ # Para os demais: número do lote anterior acrescido de 1. O número não poderá ser repetido dentro do arquivo.
27
+ # 4 posições
28
+ # Padrão recebe o nro do lote por parametro e ajusta para 4 caracteres
29
+ #
30
+ def test_TrailerLote_metodo_trailer_lote_posicao_004_a_007
31
+ subject.trailer_lote_posicao_004_a_007(5).to_s.rjust(4, '0')
32
+ end
33
+
34
+ # Tipo do registro -> Padrão 5
35
+ # 1 posição
36
+ # Por padrão retorna '5'
37
+ #
38
+ def test_TrailerLote_metodo_trailer_lote_posicao_008_a_008
39
+ subject.trailer_lote_posicao_008_a_008.must_equal '5'
40
+ end
41
+
42
+ # Uso Exclusivo FEBRABAN/CNAB
43
+ # 9 posições
44
+ # Deve ser 9 posiçẽos em branco
45
+ #
46
+ def test_TrailerLote_metodo_trailer_lote_posicao_009_a_017
47
+ subject.trailer_lote_posicao_009_a_017.must_equal ''.rjust(9, ' ')
48
+ end
49
+
50
+ # Quantidade de Registros no Lote
51
+ # 6 posições
52
+ # todas as posições em branco
53
+ #
54
+ def test_TrailerLote_metodo_trailer_lote_posicao_018_a_023#(nro_registros)
55
+ subject.trailer_lote_posicao_018_a_023(1).must_equal '1'.to_s.rjust(6, '0')
56
+ end
57
+
58
+ # Complemento trailer diferente para cada banco
59
+ # 217 posições
60
+ # Deve pegar o valor do metodo "complemento_trailer_lote"
61
+ #
62
+ def test_TrailerLote_metodo_trailer_lote_posicao_024_a_240
63
+ subject.expects(:complemento_trailer_lote).with(lote, 1).returns('complemento_trailer_lote')
64
+ subject.trailer_lote_posicao_024_a_240(lote, 1).must_equal 'complemento_trailer_lote'
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,347 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab240::Sicoob do
4
+ subject { FactoryGirl.build(:remessa_cnab240_sicoob, lotes: lote) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, valor_documento: 100.00) }
6
+ let(:lote) { FactoryGirl.build(:remessa_lote, pagamentos: pagamento) }
7
+
8
+ it "deve herdar da class Base" do
9
+ subject.class.superclass.must_equal BrBoleto::Remessa::Cnab240::Base
10
+ end
11
+
12
+ context "validations" do
13
+ it { must validate_presence_of(:modalidade_carteira) }
14
+ it { must validate_presence_of(:tipo_formulario) }
15
+ it { must validate_presence_of(:parcela) }
16
+ it { must validate_presence_of(:conta_corrente) }
17
+ # Segundo a documentação do Sicoob o convênio deve ter 20 caracteres em branco
18
+ # Então ele não pode ser obrigatorio
19
+ it { wont validate_presence_of(:convenio) }
20
+
21
+ it { must validate_length_of(:conta_corrente ).is_at_most(12).with_message("deve ter no máximo 12 dígitos.") }
22
+ it { must validate_length_of(:agencia ).is_equal_to(4).with_message("deve ter 4 dígitos.") }
23
+ it { must validate_length_of(:modalidade_carteira).is_equal_to(2).with_message("deve ter 2 dígitos.") }
24
+ end
25
+
26
+ describe "conveio" do
27
+ it "por padrão tem 20 caracteres em branco" do
28
+ subject.convenio = nil
29
+ subject.convenio.must_equal "".rjust(20, ' ')
30
+ end
31
+
32
+ it "deve ser possivel setar um valor" do
33
+ subject.convenio = "123"
34
+ subject.convenio.must_equal "123".ljust(20, " ")
35
+ end
36
+ end
37
+
38
+ describe "#default_values" do
39
+ it "for emissao_boleto" do
40
+ object = subject.class.new()
41
+ object.emissao_boleto.must_equal '2'
42
+ end
43
+
44
+ it "for distribuicao_boleto" do
45
+ object = subject.class.new()
46
+ object.distribuicao_boleto.must_equal '2'
47
+ end
48
+
49
+ it "for especie_titulo" do
50
+ object = subject.class.new()
51
+ object.especie_titulo.must_equal '02'
52
+ end
53
+
54
+ it "for tipo_formulario" do
55
+ object = subject.class.new()
56
+ object.tipo_formulario.must_equal '4'
57
+ end
58
+
59
+ it "for parcela" do
60
+ object = subject.class.new()
61
+ object.parcela.must_equal '01'
62
+ end
63
+
64
+ it "for modalidade_carteira" do
65
+ object = subject.class.new()
66
+ object.modalidade_carteira.must_equal '01'
67
+ end
68
+
69
+ context "Deve sobrescrever os campos default se houver algum igual" do
70
+ it "forma_cadastramento deve ser sobrescrita" do
71
+ object = subject.class.new()
72
+ object.forma_cadastramento.must_equal '0' # Na classe base é '1'
73
+ end
74
+ end
75
+ context "deve manter os defaults da classe Base" do
76
+ it "for codigo_carteira" do
77
+ object = subject.class.new()
78
+ object.codigo_carteira.must_equal '1'
79
+ end
80
+ it "deve continuar com o default da superclass" do
81
+ object = subject.class.new()
82
+ object.aceite.must_equal 'N'
83
+ end
84
+ end
85
+ end
86
+
87
+ it "codigo_banco deve ser 756" do
88
+ subject.codigo_banco.must_equal '756'
89
+ end
90
+
91
+ it "metodo nome_banco deve retornar SICOOB com 30 posições" do
92
+ subject.nome_banco.must_equal 'SICOOB'.ljust(30, ' ')
93
+ end
94
+
95
+ it "metodo versao_layout_arquivo deve retornar 081" do
96
+ subject.versao_layout_arquivo.must_equal '081'
97
+ end
98
+
99
+ it "metodo versao_layout_lote deve retornar 040" do
100
+ subject.versao_layout_lote.must_equal '040'
101
+ end
102
+
103
+ it "o digito_agencia deve calcular o modulo11 de 2 a 9 com resto zero " do
104
+ subject.agencia = '33'
105
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('33').returns(1)
106
+ subject.digito_agencia.must_equal '1'
107
+ end
108
+
109
+ it "o digito_conta deve calcular o modulo11 de 2 a 9 com resto zero " do
110
+ subject.conta_corrente = '34'
111
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('34').returns(1)
112
+ subject.digito_conta.must_equal '1'
113
+ end
114
+
115
+ it "o codigo_convenio deve ter 20 posições em branco" do
116
+ subject.codigo_convenio.must_equal ''.rjust(20, ' ')
117
+ end
118
+
119
+ it "o convenio_lote deve ser o mesmo valor que o codigo_convenio" do
120
+ subject.stubs(:convenio_lote).returns('qqcoisa')
121
+ subject.convenio_lote.must_equal "qqcoisa"
122
+ end
123
+
124
+ describe "#informacoes_da_conta" do
125
+ it "deve ter 20 posições" do
126
+ subject.informacoes_da_conta.size.must_equal 20
127
+ end
128
+ context "1 Primeira parte = agencia 5 posicoes" do
129
+ it "se for menor que 5 deve preencher com zero" do
130
+ subject.agencia = '123'
131
+ subject.informacoes_da_conta[0..4].must_equal '00123'
132
+ end
133
+ it "quando agencia tiver as 5 posições" do
134
+ subject.agencia = '12345'
135
+ subject.informacoes_da_conta[0..4].must_equal '12345'
136
+ end
137
+ end
138
+
139
+ context "2 - Segunda parte = digito_agencia" do
140
+ it "deve pegar o digito da agencia" do
141
+ subject.expects(:digito_agencia).returns("&")
142
+ subject.informacoes_da_conta[5].must_equal "&"
143
+ end
144
+ end
145
+
146
+ context "3 - Terceira parte = conta_corrente com 12 posições" do
147
+ it "se tiver menos que 12 caracteres deve preencher com zero" do
148
+ subject.stubs(:digito_conta)
149
+ subject.expects(:conta_corrente).returns("123456")
150
+ subject.informacoes_da_conta[6..17].must_equal "123456".rjust(12, '0')
151
+ end
152
+ it "se tiver 12 caracteres deve manter" do
153
+ subject.stubs(:digito_conta)
154
+ subject.expects(:conta_corrente).returns("".rjust(12, '1'))
155
+ subject.informacoes_da_conta[6..17].must_equal "1".rjust(12, '1')
156
+ end
157
+ end
158
+
159
+ context "4 - Quarta parte = digito_conta" do
160
+ it "deve buscar o valor do metodo digito_conta" do
161
+ subject.expects(:digito_conta).returns('*')
162
+ subject.informacoes_da_conta[18].must_equal('*')
163
+ end
164
+ end
165
+ end
166
+
167
+ describe "#complemento_header" do
168
+ it "deve ter 29 posições em branco" do
169
+ subject.complemento_header.must_equal ''.rjust(29, ' ')
170
+ end
171
+ end
172
+
173
+ describe "#complemento_trailer_lote" do
174
+ let(:pagamento_2) { FactoryGirl.build(:remessa_pagamento, valor_documento: 50.25) }
175
+ it "deve carregar os dados dos metodos complemento_trailer_lote na sequencia" do
176
+ subject.stubs(:complemento_trailer_lote_posicao_024_a_029).with(lote).returns(" 024_a_029")
177
+ subject.stubs(:complemento_trailer_lote_posicao_030_a_046).with(lote).returns(" 030_a_046")
178
+ subject.stubs(:complemento_trailer_lote_posicao_047_a_052).with(lote).returns(" 047_a_052")
179
+ subject.stubs(:complemento_trailer_lote_posicao_053_a_069).with(lote).returns(" 053_a_069")
180
+ subject.stubs(:complemento_trailer_lote_posicao_070_a_075).with(lote).returns(" 070_a_075")
181
+ subject.stubs(:complemento_trailer_lote_posicao_076_a_092).with(lote).returns(" 076_a_092")
182
+ subject.stubs(:complemento_trailer_lote_posicao_093_a_098).with(lote).returns(" 093_a_098")
183
+ subject.stubs(:complemento_trailer_lote_posicao_099_a_115).with(lote).returns(" 099_a_115")
184
+ subject.stubs(:complemento_trailer_lote_posicao_116_a_123).with(lote).returns(" 116_a_123")
185
+ subject.stubs(:complemento_trailer_lote_posicao_124_a_240).returns(" 124_a_240")
186
+ subject.complemento_trailer_lote(lote, 1).must_equal(" 024_A_029 030_A_046 047_A_052 053_A_069 070_A_075 076_A_092 093_A_098 099_A_115 116_A_123 124_A_240")
187
+ end
188
+
189
+ before do
190
+ lote.pagamentos << pagamento_2
191
+ end
192
+
193
+ describe "#complemento_trailer_lote_posicao_024_a_029" do
194
+ it "se o tipo_cobranca for simples, então deve contar o total de pagamentos do lote" do
195
+ subject.expects(:tipo_cobranca).returns(:simples)
196
+ subject.complemento_trailer_lote_posicao_024_a_029(lote).must_equal "2".rjust(6, "0")
197
+ end
198
+ it "se o tipo_cobranca não for simples, então não deve contar o total de pagamentos do lote" do
199
+ subject.expects(:tipo_cobranca).returns(:caucionada)
200
+ subject.complemento_trailer_lote_posicao_024_a_029(lote).must_equal "".rjust(6, "0")
201
+ end
202
+ end
203
+
204
+ describe "#complemento_trailer_lote_posicao_030_a_046" do
205
+ it "se o tipo_cobranca for simples, então deve somar o valor_documento dos pagamentos do lote" do
206
+ subject.expects(:tipo_cobranca).returns(:simples)
207
+ subject.complemento_trailer_lote_posicao_030_a_046(lote).must_equal "15025".rjust(17, "0")
208
+ end
209
+ it "se o tipo_cobranca não for simples, então não deve somar o valor_documento dos pagamentos do lote" do
210
+ subject.expects(:tipo_cobranca).returns(:caucionada)
211
+ subject.complemento_trailer_lote_posicao_030_a_046(lote).must_equal "".rjust(17, "0")
212
+ end
213
+ end
214
+
215
+ describe "#complemento_trailer_lote_posicao_047_a_052" do
216
+ it { subject.complemento_trailer_lote_posicao_047_a_052(lote).must_equal "".rjust(6, "0") }
217
+ end
218
+
219
+ describe "#complemento_trailer_lote_posicao_053_a_069" do
220
+ it { subject.complemento_trailer_lote_posicao_053_a_069(lote).must_equal "".rjust(17, "0") }
221
+ end
222
+
223
+ describe "#complemento_trailer_lote_posicao_070_a_075" do
224
+ it "se o tipo_cobranca for caucionada, então deve contar o total de pagamentos do lote" do
225
+ subject.expects(:tipo_cobranca).returns(:caucionada)
226
+ subject.complemento_trailer_lote_posicao_070_a_075(lote).must_equal "2".rjust(6, "0")
227
+ end
228
+ it "se o tipo_cobranca não for caucionada, então não deve contar o total de pagamentos do lote" do
229
+ subject.expects(:tipo_cobranca).returns(:simples)
230
+ subject.complemento_trailer_lote_posicao_070_a_075(lote).must_equal "".rjust(6, "0")
231
+ end
232
+ end
233
+
234
+ describe "#complemento_trailer_lote_posicao_076_a_092" do
235
+ it "se o tipo_cobranca for caucionada, então deve somar o valor_documento dos pagamentos do lote" do
236
+ subject.expects(:tipo_cobranca).returns(:caucionada)
237
+ subject.complemento_trailer_lote_posicao_076_a_092(lote).must_equal "15025".rjust(17, "0")
238
+ end
239
+ it "se o tipo_cobranca não for caucionada, então não deve somar o valor_documento dos pagamentos do lote" do
240
+ subject.expects(:tipo_cobranca).returns(:simples)
241
+ subject.complemento_trailer_lote_posicao_076_a_092(lote).must_equal "".rjust(17, "0")
242
+ end
243
+ end
244
+
245
+ describe "#complemento_trailer_lote_posicao_093_a_098" do
246
+ it { subject.complemento_trailer_lote_posicao_093_a_098(lote).must_equal "".rjust(6, "0") }
247
+ end
248
+
249
+ describe "#complemento_trailer_lote_posicao_099_a_115" do
250
+ it { subject.complemento_trailer_lote_posicao_099_a_115(lote).must_equal "".rjust(17, "0") }
251
+ end
252
+
253
+ describe "#complemento_trailer_lote_posicao_116_a_123" do
254
+ it { subject.complemento_trailer_lote_posicao_116_a_123(lote).must_equal "".rjust(8, " ") }
255
+ end
256
+
257
+ describe "#complemento_trailer_lote_posicao_124_a_240" do
258
+ it { subject.complemento_trailer_lote_posicao_124_a_240.must_equal "".rjust(117, " ") }
259
+ end
260
+
261
+ end
262
+
263
+ describe "#formata_nosso_numero" do
264
+ it "posicao 0 até 9 deve pegar o nosso_numero passado por parametro e ajustar para 10 posições" do
265
+ subject.formata_nosso_numero(123)[0..9].must_equal "123".rjust(10, '0')
266
+ end
267
+ it "posicao 10 até 11 deve ter o numero da parcela" do
268
+ subject.expects(:parcela).returns("99")
269
+ subject.formata_nosso_numero(1)[10..11].must_equal "99"
270
+ end
271
+ it "posicao 12 até 13 deve ter a modalidade_carteira" do
272
+ subject.expects(:modalidade_carteira).returns("23")
273
+ subject.formata_nosso_numero(1)[12..13].must_equal "23"
274
+ end
275
+ it "posicao 14 deve ter o tipo_formulario" do
276
+ subject.expects(:tipo_formulario).returns("4")
277
+ subject.formata_nosso_numero(1)[14].must_equal "4"
278
+ end
279
+ it "posição 15 até 19 deve ser valor em branco" do
280
+ subject.formata_nosso_numero(123)[15..19].must_equal "".rjust(5, ' ')
281
+ end
282
+ it "deve ajustar a string para no maximo 20 posições" do
283
+ subject.expects(:modalidade_carteira).returns("".rjust(20, "1"))
284
+ subject.formata_nosso_numero(123456).size.must_equal 20
285
+ end
286
+ end
287
+
288
+ describe "#complemento_p" do
289
+ it "posicao 0 até 11 deve ter a conta_corrente" do
290
+ subject.stubs(:digito_conta)
291
+ subject.expects(:conta_corrente).returns(123456789)
292
+ subject.complemento_p(pagamento)[0..11].must_equal "000123456789"
293
+ end
294
+ it "posicao 12 deve te o digito_conta" do
295
+ subject.expects(:digito_conta).returns("%")
296
+ subject.complemento_p(pagamento)[12].must_equal "%"
297
+ end
298
+ it "posição 13 deve ser um caracter em branco" do
299
+ subject.complemento_p(pagamento)[13].must_equal " "
300
+ end
301
+ it "posição 14 até 33 deve ter o valor do metodo formata_nosso_numero passando o nosso_numero do pagamento" do
302
+ subject.expects(:formata_nosso_numero).with(pagamento.nosso_numero).returns("12345678901234567890")
303
+ subject.complemento_p(pagamento)[14..33].must_equal '12345678901234567890'
304
+ end
305
+ end
306
+
307
+ describe "#dados_do_arquivo" do
308
+ it "deve gerar os dados do arquivo" do
309
+ subject.dados_do_arquivo.size.must_equal 1927
310
+ end
311
+ end
312
+
313
+ describe "#tipo_cobranca" do
314
+ it "deve ser :simples se modalidade_carteira for 01" do
315
+ subject.modalidade_carteira = '01'
316
+ subject.tipo_cobranca.must_equal :simples
317
+ end
318
+ it "deve ser :simples se modalidade_carteira for 1" do
319
+ subject.modalidade_carteira = 1
320
+ subject.tipo_cobranca.must_equal :simples
321
+ end
322
+ it "deve ser :simples se modalidade_carteira for 02" do
323
+ subject.modalidade_carteira = '02'
324
+ subject.tipo_cobranca.must_equal :simples
325
+ end
326
+ it "deve ser :simples se modalidade_carteira for 2" do
327
+ subject.modalidade_carteira = 2
328
+ subject.tipo_cobranca.must_equal :simples
329
+ end
330
+ it "deve ser :caucionada se modalidade_carteira for 03" do
331
+ subject.modalidade_carteira = '03'
332
+ subject.tipo_cobranca.must_equal :caucionada
333
+ end
334
+ it "deve ser :caucionada se modalidade_carteira for 3" do
335
+ subject.modalidade_carteira = 3
336
+ subject.tipo_cobranca.must_equal :caucionada
337
+ end
338
+ it "deve ser nil se modalidade_carteira for outro numero" do
339
+ subject.modalidade_carteira = 4
340
+ subject.tipo_cobranca.must_be_nil
341
+ end
342
+ it "deve ser nil se modalidade_carteira for nil" do
343
+ subject.modalidade_carteira = nil
344
+ subject.tipo_cobranca.must_be_nil
345
+ end
346
+ end
347
+ end