br_boleto 2.0.1 → 2.1.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 (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: