br_boleto 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.travis.yml +1 -1
  4. data/Gemfile.lock +2 -2
  5. data/br_boleto.gemspec +2 -3
  6. data/lib/br_boleto/association/have_conta.rb +27 -25
  7. data/lib/br_boleto/association/have_pagador.rb +2 -0
  8. data/lib/br_boleto/boleto/base.rb +0 -4
  9. data/lib/br_boleto/boleto/bradesco.rb +80 -0
  10. data/lib/br_boleto/boleto/caixa.rb +10 -12
  11. data/lib/br_boleto/boleto/cecred.rb +76 -0
  12. data/lib/br_boleto/boleto/itau.rb +114 -0
  13. data/lib/br_boleto/boleto/sicredi.rb +101 -0
  14. data/lib/br_boleto/boleto/unicred.rb +21 -0
  15. data/lib/br_boleto/conta/base.rb +28 -3
  16. data/lib/br_boleto/conta/bradesco.rb +120 -0
  17. data/lib/br_boleto/conta/caixa.rb +22 -12
  18. data/lib/br_boleto/conta/cecred.rb +67 -0
  19. data/lib/br_boleto/conta/itau.rb +199 -0
  20. data/lib/br_boleto/conta/sicoob.rb +40 -11
  21. data/lib/br_boleto/conta/sicredi.rb +171 -0
  22. data/lib/br_boleto/conta/unicred.rb +38 -0
  23. data/lib/br_boleto/helper/default_codes.rb +535 -26
  24. data/lib/br_boleto/pagador.rb +4 -0
  25. data/lib/br_boleto/remessa/base.rb +2 -0
  26. data/lib/br_boleto/remessa/cnab240/base.rb +21 -6
  27. data/lib/br_boleto/remessa/cnab240/bradesco.rb +141 -0
  28. data/lib/br_boleto/remessa/cnab240/caixa.rb +8 -1
  29. data/lib/br_boleto/remessa/cnab240/cecred.rb +169 -0
  30. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +29 -21
  31. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +4 -3
  32. data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +5 -5
  33. data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +4 -3
  34. data/lib/br_boleto/remessa/cnab240/itau.rb +186 -0
  35. data/lib/br_boleto/remessa/cnab240/sicoob.rb +4 -16
  36. data/lib/br_boleto/remessa/cnab240/sicredi.rb +205 -0
  37. data/lib/br_boleto/remessa/cnab240/unicred.rb +40 -0
  38. data/lib/br_boleto/remessa/cnab400/bradesco.rb +235 -0
  39. data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +6 -5
  40. data/lib/br_boleto/remessa/cnab400/itau.rb +190 -0
  41. data/lib/br_boleto/remessa/cnab400/sicoob.rb +3 -3
  42. data/lib/br_boleto/remessa/cnab400/sicredi.rb +276 -0
  43. data/lib/br_boleto/remessa/cnab400/unicred.rb +62 -0
  44. data/lib/br_boleto/remessa/pagamento.rb +93 -43
  45. data/lib/br_boleto/retorno/cnab240/base.rb +13 -12
  46. data/lib/br_boleto/retorno/cnab240/bradesco.rb +10 -0
  47. data/lib/br_boleto/retorno/cnab240/caixa.rb +2 -3
  48. data/lib/br_boleto/retorno/cnab240/cecred.rb +10 -0
  49. data/lib/br_boleto/retorno/cnab240/itau.rb +24 -0
  50. data/lib/br_boleto/retorno/cnab240/sicredi.rb +10 -0
  51. data/lib/br_boleto/retorno/cnab240/unicred.rb +10 -0
  52. data/lib/br_boleto/retorno/cnab400/bradesco.rb +42 -0
  53. data/lib/br_boleto/retorno/cnab400/itau.rb +43 -0
  54. data/lib/br_boleto/retorno/cnab400/sicoob.rb +2 -2
  55. data/lib/br_boleto/retorno/cnab400/sicredi.rb +43 -0
  56. data/lib/br_boleto/retorno/cnab400/unicred.rb +10 -0
  57. data/lib/br_boleto/retorno/pagamento.rb +18 -4
  58. data/lib/br_boleto/version.rb +2 -2
  59. data/lib/br_boleto.rb +28 -0
  60. data/lib/config/locales/br-boleto-en.yml +1 -0
  61. data/lib/config/locales/br-boleto-pt-BR.yml +1 -0
  62. data/test/br_boleto/association/have_pagador_test.rb +24 -0
  63. data/test/br_boleto/boleto/bradesco_test.rb +125 -0
  64. data/test/br_boleto/boleto/caixa_test.rb +18 -18
  65. data/test/br_boleto/boleto/cecred_test.rb +115 -0
  66. data/test/br_boleto/boleto/itau_test.rb +160 -0
  67. data/test/br_boleto/boleto/sicredi_test.rb +136 -0
  68. data/test/br_boleto/boleto/unicred_test.rb +128 -0
  69. data/test/br_boleto/conta/base_test.rb +298 -3
  70. data/test/br_boleto/conta/bradesco_test.rb +142 -0
  71. data/test/br_boleto/conta/caixa_test.rb +7 -6
  72. data/test/br_boleto/conta/cecred_test.rb +119 -0
  73. data/test/br_boleto/conta/itau_test.rb +189 -0
  74. data/test/br_boleto/conta/sicoob_test.rb +32 -2
  75. data/test/br_boleto/conta/sicredi_test.rb +180 -0
  76. data/test/br_boleto/conta/unicred_test.rb +154 -0
  77. data/test/br_boleto/pagador_test.rb +22 -2
  78. data/test/br_boleto/remessa/cnab240/base_test.rb +24 -12
  79. data/test/br_boleto/remessa/cnab240/bradesco_test.rb +196 -0
  80. data/test/br_boleto/remessa/cnab240/caixa_test.rb +51 -0
  81. data/test/br_boleto/remessa/cnab240/cecred_test.rb +242 -0
  82. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +78 -71
  83. data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +4 -3
  84. data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +10 -18
  85. data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +6 -5
  86. data/test/br_boleto/remessa/cnab240/itau_test.rb +201 -0
  87. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +1 -58
  88. data/test/br_boleto/remessa/cnab240/sicredi_test.rb +207 -0
  89. data/test/br_boleto/remessa/cnab240/unicred_test.rb +250 -0
  90. data/test/br_boleto/remessa/cnab400/base_test.rb +4 -4
  91. data/test/br_boleto/remessa/cnab400/bradesco_test.rb +164 -0
  92. data/test/br_boleto/remessa/cnab400/itau_test.rb +173 -0
  93. data/test/br_boleto/remessa/cnab400/sicoob_test.rb +2 -2
  94. data/test/br_boleto/remessa/cnab400/sicredi_test.rb +241 -0
  95. data/test/br_boleto/remessa/cnab400/unicred_test.rb +169 -0
  96. data/test/br_boleto/retorno/cnab240/base_test.rb +20 -10
  97. data/test/br_boleto/retorno/cnab240/bradesco_test.rb +228 -0
  98. data/test/br_boleto/retorno/cnab240/caixa_test.rb +20 -10
  99. data/test/br_boleto/retorno/cnab240/cecred_test.rb +228 -0
  100. data/test/br_boleto/retorno/cnab240/itau_test.rb +228 -0
  101. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +20 -10
  102. data/test/br_boleto/retorno/cnab240/sicredi_test.rb +228 -0
  103. data/test/br_boleto/retorno/cnab240/unicred_test.rb +228 -0
  104. data/test/br_boleto/retorno/cnab400/bradesco_test.rb +255 -0
  105. data/test/br_boleto/retorno/cnab400/itau_test.rb +96 -0
  106. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +10 -5
  107. data/test/br_boleto/retorno/cnab400/sicredi_test.rb +7 -0
  108. data/test/br_boleto/retorno/cnab400/unicred.rb +255 -0
  109. data/test/br_boleto/retorno/pagamento_test.rb +7 -0
  110. data/test/factories/boleto/boleto_bradesco.rb +18 -0
  111. data/test/factories/boleto/boleto_cecred.rb +18 -0
  112. data/test/factories/boleto/boleto_itau.rb +18 -0
  113. data/test/factories/boleto/boleto_sicredi.rb +18 -0
  114. data/test/factories/boleto/boleto_unicred.rb +18 -0
  115. data/test/factories/conta/bradesco.rb +16 -0
  116. data/test/factories/conta/caixa.rb +2 -1
  117. data/test/factories/conta/cecred.rb +15 -0
  118. data/test/factories/conta/itau.rb +15 -0
  119. data/test/factories/conta/sicoob.rb +2 -1
  120. data/test/factories/conta/sicredi.rb +15 -0
  121. data/test/factories/conta/unicred.rb +15 -0
  122. data/test/factories/remessa/cnab240/bradesco.rb +9 -0
  123. data/test/factories/remessa/cnab240/cecred.rb +9 -0
  124. data/test/factories/remessa/cnab240/itau.rb +9 -0
  125. data/test/factories/remessa/cnab240/sicredi.rb +9 -0
  126. data/test/factories/remessa/cnab240/unicred.rb +9 -0
  127. data/test/factories/remessa/cnab400/bradesco.rb +8 -0
  128. data/test/factories/remessa/cnab400/itau.rb +8 -0
  129. data/test/factories/remessa/cnab400/sicredi.rb +8 -0
  130. data/test/factories/remessa/cnab400/unicred.rb +8 -0
  131. data/test/fixtures/remessa/cnab240/caixa.rem +8 -0
  132. data/test/fixtures/remessa/cnab240/cecred.rem +8 -0
  133. data/test/fixtures/remessa/cnab240/sicoob.rem +8 -8
  134. data/test/fixtures/remessa/cnab240/unicred.rem +7 -0
  135. data/test/fixtures/retorno/cnab400/bradesco.ret +8 -0
  136. data/test/fixtures/retorno/cnab400/itau.ret +54 -0
  137. metadata +138 -3
@@ -0,0 +1,250 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab240::Unicred do
4
+ subject { FactoryGirl.build(:remessa_cnab240_unicred, lotes: lote) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, valor_documento: 879.66) }
6
+ let(:lote) { FactoryGirl.build(:remessa_lote, pagamentos: pagamento) }
7
+
8
+ it "deve herdar da class Bradesco" do
9
+ subject.class.superclass.must_equal BrBoleto::Remessa::Cnab240::Bradesco
10
+ end
11
+
12
+ context "validations" do
13
+ describe 'Validações personalizadas da conta' do
14
+ it 'valid_carteira_required' do
15
+ # subject.send(:valid_carteira_required).must_equal true
16
+ subject.conta.carteira = ''
17
+ conta_must_be_msg_error(:carteira, :blank)
18
+ end
19
+
20
+ it 'valid_carteira_length' do
21
+ # subject.send(:valid_carteira_length).must_equal 2
22
+ subject.conta.carteira = '1234567890123456'
23
+ conta_must_be_msg_error(:carteira, :custom_length_is, {count: 2})
24
+ end
25
+
26
+ it 'valid_convenio_required' do
27
+ # subject.send(:valid_convenio_required).must_equal true
28
+ subject.conta.convenio = ''
29
+ conta_must_be_msg_error(:convenio, :blank)
30
+ end
31
+
32
+ it 'valid_convenio_length' do
33
+ # subject.send(:valid_convenio_length).must_equal 2
34
+ subject.conta.convenio = '1234567890123456'
35
+ conta_must_be_msg_error(:convenio, :custom_length_maximum, {count: 7})
36
+ end
37
+
38
+ it 'agencia_required' do
39
+ # subject.send(:agencia_required).must_equal true
40
+ subject.conta.agencia = ''
41
+ conta_must_be_msg_error(:agencia, :blank)
42
+ end
43
+
44
+ it 'agencia_length' do
45
+ # subject.send(:agencia_length).must_equal 2
46
+ subject.conta.agencia = '1234567890123456'
47
+ conta_must_be_msg_error(:agencia, :custom_length_is, {count: 4})
48
+ end
49
+
50
+ private
51
+
52
+ def conta_must_be_msg_error(attr_validation, msg_key, options_msg={})
53
+ must_be_message_error(:base, "#{BrBoleto::Conta::Unicred.human_attribute_name(attr_validation)} #{get_message(msg_key, options_msg)}")
54
+ end
55
+ end
56
+ end
57
+
58
+
59
+ describe "#convenio_lote" do
60
+ it "as 7 primeiras posições deve ser o valor do convenio ajustado com zeros a esquerda" do
61
+ subject.conta.codigo_cedente = '88'
62
+ subject.convenio_lote(lote).must_equal '00000000000000000088'
63
+
64
+ subject.conta.convenio = '7374'
65
+ subject.convenio_lote(lote).must_equal '00000000000000007374'
66
+ end
67
+ it "deve ter 20 caracteres" do
68
+ subject.convenio_lote(lote).size.must_equal 20
69
+ end
70
+ end
71
+
72
+ describe "#informacoes_da_conta" do
73
+ it "deve ter 20 posições" do
74
+ subject.informacoes_da_conta.size.must_equal 20
75
+ end
76
+
77
+ it "1 - Primeira parte = agencia 5 posicoes - ajustados com zeros a esquerda" do
78
+ subject.conta.agencia = '47'
79
+ subject.informacoes_da_conta[0..4].must_equal '00047'
80
+
81
+ subject.conta.agencia = '1234'
82
+ subject.informacoes_da_conta[0..4].must_equal '01234'
83
+ end
84
+
85
+ it "2 - Segunda parte = agencia_dv" do
86
+ subject.conta.agencia_dv = '7'
87
+ subject.informacoes_da_conta[5].must_equal "7"
88
+ end
89
+
90
+ it "3 - Terceira parte = conta_corrente 12 posicoes - ajustados com zeros a esquerda" do
91
+ subject.conta.conta_corrente = '89755'
92
+ subject.informacoes_da_conta[6..17].must_equal '000000089755'
93
+
94
+ subject.conta.conta_corrente = '1234567890'
95
+ subject.informacoes_da_conta[6..17].must_equal '001234567890'
96
+ end
97
+
98
+ it "4 - Quarta parte = Conta Corrente DV" do
99
+ subject.conta.conta_corrente_dv = '8'
100
+ subject.informacoes_da_conta[18..18].must_equal('8')
101
+ end
102
+
103
+ it "5 - Quinta parte = Se o conta_corrente_dv não for 2 digitos deve ter 1 espaço em branco" do
104
+ subject.informacoes_da_conta[19].must_equal(' ')
105
+ end
106
+ end
107
+
108
+ describe "#complemento_header_arquivo" do
109
+ it "deve ter 29 posições" do
110
+ subject.complemento_header_arquivo.size.must_equal 29
111
+ end
112
+
113
+ it "2 - Segunda parte = USO FEBRABAN com 25 posições em branco" do
114
+ subject.complemento_header_arquivo[4..28].must_equal ' ' * 25
115
+ end
116
+ end
117
+
118
+ describe "#complemento_p" do
119
+
120
+ it "deve ter 34 posições" do
121
+ subject.complemento_p(pagamento).size.must_equal 34
122
+ end
123
+
124
+ it "1 - Primeira parte = conta_corrente com 12 posicoes - ajustados com zeros a esquerda" do
125
+ subject.conta.conta_corrente = '1234'
126
+ subject.complemento_p(pagamento)[0..11].must_equal '000000001234'
127
+
128
+ subject.conta.conta_corrente = '264631'
129
+ subject.complemento_p(pagamento)[0..11].must_equal '000000264631'
130
+ end
131
+
132
+ it "2 - Seguna parte = Conta Corrente DV - 1 posicao" do
133
+ subject.conta.conta_corrente_dv = '7'
134
+ subject.complemento_p(pagamento)[12..12].must_equal '7'
135
+ end
136
+
137
+ it "3 - Terceira parte = Se o conta_corrente_dv não for 2 digitos deve ter 1 espaço em branco" do
138
+ subject.complemento_p(pagamento)[13..13].must_equal ' '
139
+ end
140
+
141
+ it "4 - Quarta parte = Numero documento com 11 posicoes" do
142
+ pagamento.numero_documento = '89378'
143
+ subject.complemento_p(pagamento)[14..24].must_equal '00000089378'
144
+
145
+ pagamento.numero_documento = '12345678901'
146
+ subject.complemento_p(pagamento)[14..24].must_equal '12345678901'
147
+ end
148
+
149
+ it "5 - Quinta parte = numero_documento DV com 1 posicao - Deve ser o ultimo digito do nosso numero" do
150
+ pagamento.nosso_numero = '99/99999999999-9'
151
+ subject.complemento_p(pagamento)[25..25].must_equal '9'
152
+
153
+ pagamento.nosso_numero = '99/99999999999-0'
154
+ subject.complemento_p(pagamento)[25..25].must_equal '0'
155
+ end
156
+
157
+ it "6 - Sexta parte = Exclusivo Banco com 8 posicoes preenchidas com zeros" do
158
+ subject.complemento_p(pagamento)[26..33].must_equal ' ' * 8
159
+ end
160
+
161
+ end
162
+
163
+ describe "#segmento_p_numero_do_documento" do
164
+ it "deve ter 15 posições" do
165
+ subject.segmento_p_numero_do_documento(pagamento).size.must_equal 15
166
+ end
167
+
168
+ it "deve conter o numero do documento 15 posicoes - ajustados com zeros a esquerda" do
169
+ pagamento.expects(:numero_documento).returns("977897")
170
+ subject.segmento_p_numero_do_documento(pagamento).must_equal '000000000977897'
171
+ end
172
+ end
173
+
174
+ describe "#complemento_trailer_lote" do
175
+ it "deve ter 217 posições" do
176
+ subject.complemento_trailer_lote(lote, 5).size.must_equal 217
177
+ end
178
+
179
+ it "1 - Primeira parte = 92 posições todas preenchidas com zeros (VALORES UTILIZADOS APENAS PARA ARQUIVO DE RETORNO)" do
180
+ subject.complemento_trailer_lote(lote, 5)[0..91].must_equal '0' * 92
181
+ end
182
+
183
+ it "2 - Segunda parte = 8 posições todas preenchidas com zeros (Nr. do aviso de lançamento do crédito referente aos títulos de cobrança)" do
184
+ subject.complemento_trailer_lote(lote, 5)[92..99].must_equal ('0' * 8)
185
+ end
186
+
187
+ it "3 - Terceira parte = EXCLUSIVO FEBRABAN com 117 posicoes em branco" do
188
+ subject.complemento_trailer_lote(lote, 5)[100..216].must_equal (' ' * 117)
189
+ end
190
+ end
191
+
192
+ describe "usa_segmento_S?" do
193
+ it "deve retornar false como padrão para o UNICRED" do
194
+ subject.usa_segmento_S?.must_equal false
195
+ end
196
+ end
197
+
198
+ describe 'Geração do arquivo' do
199
+ let(:conta) do
200
+ {
201
+ razao_social: 'EMPRESA EMITENTE',
202
+ cpf_cnpj: '33.486.451/0001-30',
203
+ carteira: '09',
204
+ agencia: '7506',
205
+ codigo_cedente: '82819',
206
+ conta_corrente: '1354843'
207
+ }
208
+ end
209
+ let(:pagador) {
210
+ {
211
+ nome: 'Benjamin Francisco Marcos Vinicius Fernandes',
212
+ cpf_cnpj: '787.933.211-12',
213
+ endereco: 'Rua Principal s/n 881',
214
+ bairro: 'Centro',
215
+ cep: '79210-972',
216
+ cidade: 'Anastácio',
217
+ uf: 'MS',
218
+ nome_avalista: 'EMPRESA EMITENTE',
219
+ documento_avalista: '33486451000130'
220
+ }
221
+ }
222
+ let(:pagamento) {
223
+ BrBoleto::Remessa::Pagamento.new({
224
+ nosso_numero: '09000000000011',
225
+ numero_documento: '00000000001',
226
+ data_vencimento: Date.parse('13/12/2016'),
227
+ valor_documento: 50.00,
228
+ pagador: pagador,
229
+ especie_titulo: '02',
230
+ codigo_juros: '0',
231
+ data_juros: Date.parse('15/12/2016'),
232
+ valor_juros: 0.00,
233
+ codigo_multa: '0',
234
+ data_multa: Date.parse('14/12/2016'),
235
+ valor_multa: 0.00,
236
+ data_emissao: Date.parse('10/11/2016'),
237
+ })
238
+ }
239
+ let(:lote) { BrBoleto::Remessa::Lote.new(pagamentos: pagamento) }
240
+ it "deve gerar o arquivo de remessa corretamente com as informações passadas" do
241
+ remessa = BrBoleto::Remessa::Cnab240::Unicred.new({
242
+ data_hora_arquivo: Time.parse('10/11/2016 09:27:45'),
243
+ sequencial_remessa: 1,
244
+ conta: conta,
245
+ lotes: [lote],
246
+ })
247
+ remessa.dados_do_arquivo.must_equal read_fixture('remessa/cnab240/unicred.rem')
248
+ end
249
+ end
250
+ end
@@ -156,7 +156,7 @@ describe BrBoleto::Remessa::Cnab400::Base do
156
156
 
157
157
  it '#detalhe_posicao_002_003 - deve retornar o tipo do cnpj da conta' do
158
158
  conta.expects(:tipo_cpf_cnpj).returns('5')
159
- subject.detalhe_posicao_002_003.must_equal '5'
159
+ subject.detalhe_posicao_002_003(pagamento).must_equal '5'
160
160
  end
161
161
 
162
162
  it '#detalhe_posicao_004_017 - deve retornar o cnpj da conta ajustado para 14 digitos' do
@@ -171,7 +171,7 @@ describe BrBoleto::Remessa::Cnab400::Base do
171
171
  end
172
172
 
173
173
  it '#detalhe_posicao_038_062 - deve retornar 25 caracteres vazios' do
174
- subject.detalhe_posicao_038_062.must_equal ''.rjust(25, ' ')
174
+ subject.detalhe_posicao_038_062(pagamento).must_equal ''.rjust(25, ' ')
175
175
 
176
176
  end
177
177
 
@@ -188,8 +188,8 @@ describe BrBoleto::Remessa::Cnab400::Base do
188
188
  end
189
189
 
190
190
  it '#detalhe_posicao_109_110 - deve retornar a identificacao da ocorrencia ajustando o tamanho para 2' do # (pagamento, sequencial)
191
- pagamento.expects(:identificacao_ocorrencia).returns('7')
192
- subject.detalhe_posicao_109_110(pagamento, 1).must_equal '07'
191
+ pagamento.expects(:identificacao_ocorrencia).returns('5')
192
+ subject.detalhe_posicao_109_110(pagamento, 1).must_equal '05'
193
193
  end
194
194
 
195
195
  it '#detalhe_posicao_111_120 - deve retornar o numero do documento do pagamento' do # (pagamento, sequencial)
@@ -0,0 +1,164 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab400::Bradesco do
4
+ subject { FactoryGirl.build(:remessa_cnab400_bradesco, pagamentos: pagamento, conta: conta) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, pagador: pagador) }
6
+ let(:conta) { FactoryGirl.build(:conta_bradesco) }
7
+ let(:pagador) { FactoryGirl.build(:pagador) }
8
+
9
+ it "deve ter a class para a conta do bradesco" do
10
+ BrBoleto::Remessa::Cnab400::Bradesco.new.conta_class.must_equal BrBoleto::Conta::Bradesco
11
+ end
12
+
13
+ it "deve herdar de Cnab400::Base" do
14
+ subject.class.superclass.must_equal BrBoleto::Remessa::Cnab400::Base
15
+ end
16
+
17
+ describe '#informacoes_da_conta' do
18
+ it "deve retornar com 20 caracteres" do
19
+ subject.informacoes_da_conta(:header).size.must_equal 20
20
+ end
21
+ it "deve trazer as informações em suas posições quando o parametro for :header" do
22
+ conta.codigo_empresa = 39321235
23
+ result = subject.informacoes_da_conta(:header)
24
+
25
+ result[0..20].must_equal '00000000000039321235' # Codigo Empresa
26
+ end
27
+ it "deve retornar com 20 caracteres" do
28
+ subject.informacoes_da_conta(:detalhe).size.must_equal 20
29
+ end
30
+ it "deve trazer as informações em suas posições quando o parametro for :detalhe" do
31
+ conta.agencia = 1234
32
+ conta.agencia_dv = 1
33
+ conta.conta_corrente = 89755
34
+ conta.conta_corrente_dv = 7
35
+ conta.carteira = 21
36
+ result = subject.informacoes_da_conta(:detalhe)
37
+
38
+ result[0..2].must_equal ' '
39
+ result[3].must_equal '0'
40
+ result[4..6].must_equal '021'
41
+ result[7..11].must_equal '01234' # Agencia
42
+ result[12..18].must_equal '0089755' # Conta Corrente
43
+ result[19].must_equal '7' # Conta Corrente DV
44
+ end
45
+ end
46
+
47
+ describe '#complemento_registro' do
48
+ it "deve retornar o sequencial da remessa com 12 posições e mais 277 brancos" do
49
+ subject.sequencial_remessa = 4758
50
+
51
+ subject.complemento_registro[0..7].must_equal ' '
52
+ subject.complemento_registro[8..9].must_equal 'MX'
53
+ subject.complemento_registro[10..16].must_equal '0004758'
54
+ subject.complemento_registro[17..293].must_equal ''.rjust(277)
55
+
56
+ subject.complemento_registro.size.must_equal 294
57
+ end
58
+ end
59
+
60
+
61
+ describe '#detalhe_posicao_063_108' do
62
+ it "deve ter o tamanho de 46 digitos" do
63
+ subject.detalhe_posicao_063_108(pagamento).size.must_equal 46
64
+ end
65
+ it "deve conter as informações nas posições corretas" do
66
+ pagamento.assign_attributes(tipo_emissao: 2)
67
+ result = subject.detalhe_posicao_063_108(pagamento)
68
+
69
+ result[0..2].must_equal '000'
70
+ result[3].must_equal '0' # Identificativos de Multa
71
+ result[4..7].must_equal '0000' # Percentual de Multa por Atraso
72
+ result[8..18].must_equal '00000977897' # Identificação do Título no Banco
73
+ result[19].must_equal '6' # Nosso numero DV
74
+ result[20..29].must_equal '0000000000' # Desconto Bonificação por dia
75
+ result[30].must_equal '2' # Condição para Emissão da Papeleta de Cobrança
76
+ result[31..45].must_equal ''.rjust(15) # Preencher com Branco
77
+
78
+ result.size.must_equal 46
79
+ end
80
+ end
81
+
82
+ describe '#informacoes_do_pagamento' do
83
+ it "deve ter o tamanho de 40 digitos" do
84
+ subject.informacoes_do_pagamento(pagamento, 1).size.must_equal 40
85
+ end
86
+ it "deve conter as informações nas posições corretas" do
87
+ conta.agencia = 4587
88
+ conta.agencia_dv = 45 # Vai retornar apenas o 4
89
+ pagamento.data_vencimento = Date.parse('05/08/2029')
90
+ pagamento.valor_documento = 47.56
91
+ pagamento.especie_titulo = "12"
92
+ pagamento.aceite = true
93
+ pagamento.data_emissao = Date.parse('15/09/2017')
94
+ result = subject.informacoes_do_pagamento(pagamento, 4)
95
+ result.size.must_equal 40
96
+
97
+ result[00..05].must_equal '050829' # "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
98
+ result[06..18].must_equal '0000000004756' # Valor do Titulo
99
+ result[19..21].must_equal '000' # 000 ou Número Banco
100
+ result[22..26].must_equal "00000" # 000000 ou Agencia
101
+ result[27..28].must_equal "02" # Espécie do Título
102
+ result[ 29 ].must_equal "N" # dentificação (Sempre 'N')
103
+ result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
104
+ result[36..37].must_equal '00' # Primeira instrução codificada
105
+ result[38..39].must_equal '00' # Segunda instrução
106
+ end
107
+ end
108
+
109
+ describe '#detalhe_multas_e_juros_do_pagamento' do
110
+ it "deve ter o tamanho de 58 digitos" do
111
+ subject.detalhe_multas_e_juros_do_pagamento(pagamento, 2).size.must_equal 58
112
+ end
113
+ it "deve conter as informações nas posições corretas" do
114
+ pagamento.valor_mora = '0.39'
115
+ pagamento.valor_iof = '2.7'
116
+ pagamento.data_desconto = Date.parse('21/03/2018')
117
+ pagamento.valor_desconto = 4.3
118
+ pagamento.valor_abatimento = 56.47
119
+
120
+ result = subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
121
+ result.size.must_equal 58
122
+
123
+ result[00..12].must_equal '0000000000039'
124
+ result[13..18].must_equal "210318"
125
+ result[19..31].must_equal '0000000000430'
126
+ result[32..44].must_equal '0000000000270'
127
+ result[45..57].must_equal '0000000005647'
128
+ end
129
+ end
130
+
131
+ describe '#informacoes_do_sacado' do
132
+ it "deve ter o tamanho de 176 digitos" do
133
+ subject.informacoes_do_sacado(pagamento, 2).size.must_equal 176
134
+ end
135
+ it "deve conter as informações nas posições corretas" do
136
+ # pagador.tipo_cpf_cnpj = '1'
137
+ pagador.cpf_cnpj = '12345678901'
138
+ pagador.nome = 'nome pagador'
139
+ pagador.endereco = 'rua do pagador'
140
+ pagador.bairro = 'bairro do pagador'
141
+ pagador.cidade = 'Chapecó'
142
+ pagador.uf = 'SC'
143
+ pagador.cep = '89885-001'
144
+ pagador.nome_avalista = 'Avalista'
145
+ pagador.documento_avalista = '840.106.990-43'
146
+
147
+ result = subject.informacoes_do_sacado(pagamento, 2)
148
+ result.size.must_equal 176
149
+
150
+ result[00..01].must_equal "01" # Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
151
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
152
+ result[16..55].must_equal 'nome pagador'.adjust_size_to(40) # Nome do Pagador
153
+
154
+ result[56..73].must_equal 'rua do pagador'.adjust_size_to(18) # Endereço do Pagador
155
+ result[74..83].must_equal 'bairro do pagador'.adjust_size_to(10) # Endereço do Pagador
156
+ result[84..93].must_equal 'Chapecó'.adjust_size_to(10) # Endereço do Pagador
157
+ result[94..95].must_equal 'SC'.adjust_size_to(2) # Endereço do Pagador
158
+ result[108..115].must_equal '89885001' # CEP do Pagador
159
+
160
+ result[116..129].must_equal '84010699043'.adjust_size_to(14) # Observações/Mensagem ou Sacador/Avalista
161
+ result[130..175].must_equal 'Avalista'.adjust_size_to(46) # Observações/Mensagem ou Sacador/Avalista
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,173 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab400::Itau do
4
+ subject { FactoryGirl.build(:remessa_cnab400_itau, pagamentos: pagamento, conta: conta) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, pagador: pagador) }
6
+ let(:conta) { FactoryGirl.build(:conta_itau) }
7
+ let(:pagador) { FactoryGirl.build(:pagador) }
8
+
9
+ it "deve ter a class para a conta do itau" do
10
+ BrBoleto::Remessa::Cnab400::Itau.new.conta_class.must_equal BrBoleto::Conta::Itau
11
+ end
12
+
13
+ it "deve herdar de Cnab400::Base" do
14
+ subject.class.superclass.must_equal BrBoleto::Remessa::Cnab400::Base
15
+ end
16
+
17
+ describe '#informacoes_da_conta' do
18
+ it "deve retornar com 20 caracteres" do
19
+ subject.informacoes_da_conta(:header).size.must_equal 20
20
+ end
21
+ it "deve trazer as informações em suas posições quando o parametro for :header" do
22
+ conta.agencia = 1234
23
+ conta.agencia_dv = 1
24
+ conta.conta_corrente = 89755
25
+ conta.conta_corrente_dv = 7
26
+
27
+ result = subject.informacoes_da_conta(:header)
28
+
29
+ result[0..3].must_equal '1234' # Agencia
30
+ result[4..5].must_equal '00'
31
+ result[6..10].must_equal '89755' # Conta Corrente
32
+ result[11].must_equal '7' # Conta Corrente DV
33
+ result[12..19].must_equal ' ' * 8
34
+
35
+
36
+ end
37
+ it "deve retornar com 20 caracteres" do
38
+ subject.informacoes_da_conta(:detalhe).size.must_equal 20
39
+ end
40
+ it "deve trazer as informações em suas posições quando o parametro for :detalhe" do
41
+ conta.agencia = 1234
42
+ conta.agencia_dv = 1
43
+ conta.conta_corrente = 89755
44
+ conta.conta_corrente_dv = 7
45
+
46
+ result = subject.informacoes_da_conta(:detalhe)
47
+
48
+ result[0..3].must_equal '1234' # Agencia
49
+ result[4..5].must_equal '00'
50
+ result[6..10].must_equal '89755' # Conta Corrente
51
+ result[11].must_equal '7' # Conta Corrente DV
52
+ result[12..15].must_equal ' '
53
+ result[16..19].must_equal '0000'
54
+
55
+ end
56
+ end
57
+
58
+ describe '#complemento_registro' do
59
+ it "deve retornar 294 brancos" do
60
+ subject.complemento_registro[0..293].must_equal ''.rjust(294)
61
+ subject.complemento_registro.size.must_equal 294
62
+ end
63
+ end
64
+
65
+
66
+ describe '#detalhe_posicao_063_108' do
67
+ it "deve ter o tamanho de 46 digitos" do
68
+ subject.detalhe_posicao_063_108(pagamento).size.must_equal 46
69
+ end
70
+ it "deve conter as informações nas posições corretas" do
71
+ conta.carteira = 123
72
+ pagamento.assign_attributes(tipo_emissao: 2)
73
+ pagamento.assign_attributes(numero_documento: 763)
74
+
75
+ result = subject.detalhe_posicao_063_108(pagamento)
76
+
77
+ result[0..7].must_equal '00000763' # Numero documento
78
+ result[8..20].must_equal '0' * 13 # Zeros
79
+ result[21..23].must_equal '123' # Carteira
80
+ result[24..44].must_equal ' ' * 21 # Brancos
81
+ result[45].must_equal 'I' # Cod. Carteira
82
+
83
+ result.size.must_equal 46
84
+ end
85
+ end
86
+
87
+ describe '#informacoes_do_pagamento' do
88
+ it "deve ter o tamanho de 40 digitos" do
89
+ subject.informacoes_do_pagamento(pagamento, 1).size.must_equal 40
90
+ end
91
+ it "deve conter as informações nas posições corretas" do
92
+ conta.agencia = 4587
93
+ conta.agencia_dv = 45 # Vai retornar apenas o 4
94
+ pagamento.data_vencimento = Date.parse('05/08/2029')
95
+ pagamento.valor_documento = 47.56
96
+ pagamento.especie_titulo = "12"
97
+ pagamento.aceite = true
98
+ pagamento.data_emissao = Date.parse('15/09/2017')
99
+ result = subject.informacoes_do_pagamento(pagamento, 4)
100
+ result.size.must_equal 40
101
+
102
+ result[00..05].must_equal '050829' # "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
103
+ result[06..18].must_equal '0000000004756' # Valor do Titulo
104
+ result[19..21].must_equal '341' # Número Banco
105
+ result[22..26].must_equal "00000" # 000000 ou Agencia
106
+ result[27..28].must_equal "02" # Espécie do Título
107
+ result[ 29 ].must_equal "N" # dentificação (Sempre 'N')
108
+ result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
109
+ result[36..37].must_equal '00' # Primeira instrução codificada
110
+ result[38..39].must_equal '00' # Segunda instrução
111
+ end
112
+ end
113
+
114
+ describe '#detalhe_multas_e_juros_do_pagamento' do
115
+ it "deve ter o tamanho de 58 digitos" do
116
+ subject.detalhe_multas_e_juros_do_pagamento(pagamento, 2).size.must_equal 58
117
+ end
118
+ it "deve conter as informações nas posições corretas" do
119
+ pagamento.valor_mora = '0.39'
120
+ pagamento.valor_iof = '2.7'
121
+ pagamento.data_desconto = Date.parse('21/03/2018')
122
+ pagamento.valor_desconto = 4.3
123
+ pagamento.valor_abatimento = 56.47
124
+
125
+ result = subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
126
+ result.size.must_equal 58
127
+
128
+ result[00..12].must_equal '0000000000039'
129
+ result[13..18].must_equal "210318"
130
+ result[19..31].must_equal '0000000000430'
131
+ result[32..44].must_equal '0000000000270'
132
+ result[45..57].must_equal '0000000005647'
133
+ end
134
+ end
135
+
136
+ describe '#informacoes_do_sacado' do
137
+ it "deve ter o tamanho de 176 digitos" do
138
+ subject.informacoes_do_sacado(pagamento, 2).size.must_equal 176
139
+ end
140
+ it "deve conter as informações nas posições corretas" do
141
+ # pagador.tipo_cpf_cnpj = '1'
142
+ pagador.cpf_cnpj = '12345678901'
143
+ pagador.nome = 'nome pagador'
144
+ pagador.endereco = 'rua do pagador'
145
+ pagador.bairro = 'bairro do pagador'
146
+ pagador.cidade = 'Chapecó'
147
+ pagador.uf = 'SC'
148
+ pagador.cep = '89885-001'
149
+ pagador.nome_avalista = 'Avalista'
150
+ pagador.documento_avalista = '840.106.990-43'
151
+
152
+ result = subject.informacoes_do_sacado(pagamento, 2)
153
+ result.size.must_equal 176
154
+
155
+ result[00..01].must_equal "01" # Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
156
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
157
+ result[16..55].must_equal 'nome pagador'.adjust_size_to(40) # Nome do Pagador
158
+
159
+ result[56..95].must_equal 'rua do pagador'.adjust_size_to(40) # Endereço do Pagador
160
+ result[96..107].must_equal 'bairro do pagador'.adjust_size_to(12) # Bairro do Pagador
161
+ result[108..115].must_equal '89885001' # CEP do Pagador
162
+ result[116..130].must_equal 'Chapecó'.adjust_size_to(15) # Cidade do Pagador
163
+ result[131..132].must_equal 'SC'.adjust_size_to(2) # UF do Pagador
164
+
165
+ result[133..162].must_equal 'Avalista'.adjust_size_to(30) # Nome Sacador/Avalista
166
+
167
+ result[163..166].must_equal ' ' # Complemento Registro (Brancos)
168
+ result[167..172].must_equal '000000' # Data de mora (Zeros)
169
+ result[173..174].must_equal '03' # Quantidade de dias (Zeros)
170
+ result[175].must_equal ' ' # Complemento Registro (Branco)
171
+ end
172
+ end
173
+ end
@@ -99,7 +99,7 @@ describe BrBoleto::Remessa::Cnab400::Sicoob do
99
99
  conta.agencia_dv = 45 # Vai retornar apenas o 4
100
100
  pagamento.data_vencimento = Date.parse('05/08/2029')
101
101
  pagamento.valor_documento = 47.56
102
- pagamento.especie_titulo = 12
102
+ pagamento.especie_titulo = "12"
103
103
  pagamento.aceite = true
104
104
  pagamento.data_emissao = Date.parse('15/09/2017')
105
105
  result = subject.informacoes_do_pagamento(pagamento, 4)
@@ -110,7 +110,7 @@ describe BrBoleto::Remessa::Cnab400::Sicoob do
110
110
  result[19..21].must_equal '756' # Número Banco: "756"
111
111
  result[22..25].must_equal "4587" # Prefixo da Cooperativa: vide e-mail enviado com os dados do processo de homologação
112
112
  result[ 26 ].must_equal "4" # Dígito Verificador do Prefixo: vide e-mail enviado com os dados do processo de homologação
113
- result[27..28].must_equal "12" # Espécie do Título
113
+ result[27..28].must_equal "02" # Espécie do Título
114
114
  result[ 29 ].must_equal "1" # "Aceite do Título: "0" = Sem aceite "1" = Com aceite"
115
115
  result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
116
116
  result[36..37].must_equal '00' # Primeira instrução codificada: