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,189 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Conta::Itau do
4
+ subject { FactoryGirl.build(:conta_itau) }
5
+
6
+ it "deve herdar de Conta::Base" do
7
+ subject.class.superclass.must_equal BrBoleto::Conta::Base
8
+ end
9
+ context "valores padrões" do
10
+ it "deve setar a carteira com '109' " do
11
+ subject.class.new.carteira.must_equal '109'
12
+ end
13
+ it "deve setar a valid_agencia_length com 4 " do
14
+ subject.class.new.valid_agencia_length.must_equal 4
15
+ end
16
+ it "deve setar a valid_carteira_required com true " do
17
+ subject.class.new.valid_carteira_required.must_equal true
18
+ end
19
+ it "deve setar a valid_carteira_length com 3 " do
20
+ subject.class.new.valid_carteira_length.must_equal 3
21
+ end
22
+ it "deve setar a valid_conta_corrente_required com true " do
23
+ subject.class.new.valid_conta_corrente_required.must_equal true
24
+ end
25
+ it "deve setar a valid_conta_corrente_maximum com 5 " do
26
+ subject.class.new.valid_conta_corrente_maximum.must_equal 5
27
+ end
28
+ it "deve setar a valid_codigo_cedente_maximum com 5 " do
29
+ subject.class.new.valid_codigo_cedente_maximum.must_equal 5
30
+ end
31
+ end
32
+ describe "Validations" do
33
+ it { must validate_presence_of(:agencia) }
34
+ it { must validate_presence_of(:razao_social) }
35
+ it { must validate_presence_of(:cpf_cnpj) }
36
+ it do
37
+ subject.agencia_dv = 21
38
+ must_be_message_error(:agencia_dv, :custom_length_is, {count: 1})
39
+ end
40
+ context 'Validações padrões da carteira' do
41
+ subject { BrBoleto::Conta::Itau.new }
42
+ it { must validate_presence_of(:carteira) }
43
+ it 'Tamanho deve ser de 3' do
44
+ subject.carteira = '1345'
45
+ must_be_message_error(:carteira, :custom_length_is, {count: 3})
46
+ end
47
+ it "valores aceitos" do
48
+ subject.carteira = '04'
49
+ must_be_message_error(:carteira, :custom_inclusion, {list: '104, 105, 107, 108, 109, 112, 113, 116, 117, 119, 121, 122, 126, 131, 134, 135, 136, 142, 143, 146, 147, 150, 168, 169, 174, 175, 180, 191, 196, 198'})
50
+ end
51
+ end
52
+ context 'Validações padrões da conta_corrente' do
53
+ subject { BrBoleto::Conta::Itau.new }
54
+ it { must validate_presence_of(:conta_corrente) }
55
+ it 'Tamanho deve ter o tamanho maximo de 5' do
56
+ subject.conta_corrente = '12345678'
57
+ must_be_message_error(:conta_corrente, :custom_length_maximum, {count: 5})
58
+ end
59
+ end
60
+ context 'Validações padrões da codigo_cedente' do
61
+ subject { BrBoleto::Conta::Itau.new }
62
+ it 'Tamanho deve ter o tamanho maximo de 5' do
63
+ subject.codigo_cedente = '12345678'
64
+ must_be_message_error(:convenio, :custom_length_maximum, {count: 5})
65
+ end
66
+ end
67
+ end
68
+
69
+ it "codigo do banco" do
70
+ subject.codigo_banco.must_equal '341'
71
+ end
72
+ it '#codigo_banco_dv' do
73
+ subject.codigo_banco_dv.must_equal '7'
74
+ end
75
+
76
+ describe "#nome_banco" do
77
+ it "valor padrão para o nome_banco" do
78
+ subject.nome_banco.must_equal 'ITAU'
79
+ end
80
+ it "deve ser possível mudar o valor do nome do banco" do
81
+ subject.nome_banco = 'MEU'
82
+ subject.nome_banco.must_equal 'MEU'
83
+ end
84
+ end
85
+
86
+ it "#versao_layout_arquivo_cnab_240" do
87
+ subject.versao_layout_arquivo_cnab_240.must_equal '040'
88
+ end
89
+ it "#versao_layout_lote_cnab_240" do
90
+ subject.versao_layout_lote_cnab_240.must_equal '030'
91
+ end
92
+
93
+ describe '#conta_corrente_dv' do
94
+ it "deve ser personalizavel pelo usuario" do
95
+ subject.conta_corrente_dv = 88
96
+ subject.conta_corrente_dv.must_equal 88
97
+ end
98
+ it "se não passar valor deve calcular automatico" do
99
+ subject.conta_corrente_dv = nil
100
+ subject.conta_corrente = '12345'
101
+ subject.agencia_dv = nil
102
+ subject.agencia = '1234'
103
+ BrBoleto::Calculos::Modulo10.expects(:new).with('123412345').returns(stub(to_s: 1))
104
+
105
+ subject.conta_corrente_dv.must_equal 1
106
+ end
107
+ end
108
+
109
+ describe "#get_especie_titulo" do
110
+ context "CÓDIGOS para o cnab 240 do Itau" do
111
+ it { subject.get_especie_titulo('02', 240).must_equal '01' } # DUPLICATA MERCANTIL
112
+ it { subject.get_especie_titulo('12', 240).must_equal '02' } # NOTA PROMISSÓRIA
113
+ it { subject.get_especie_titulo('16', 240).must_equal '03' } # NOTA DE SEGURO
114
+ it { subject.get_especie_titulo('21', 240).must_equal '04' } # MENSALIDADE ESCOLAR
115
+ it { subject.get_especie_titulo('17', 240).must_equal '05' } # RECIBO
116
+ it { subject.get_especie_titulo('04', 240).must_equal '08' } # DUPLICATA DE SERVIÇO
117
+ it { subject.get_especie_titulo('07', 240).must_equal '09' } # LETRA DE CÂMBIO
118
+ it { subject.get_especie_titulo('19', 240).must_equal '13' } # NOTA DE DÉBITOS
119
+ it { subject.get_especie_titulo('24', 240).must_equal '15' } # DOCUMENTO DE DÍVIDA
120
+ it { subject.get_especie_titulo('30', 240).must_equal '16' } # ENCARGOS CONDOMINIAIS
121
+ it { subject.get_especie_titulo('32', 240).must_equal '18' } # BOLETO DE PROPOSTA
122
+ it { subject.get_especie_titulo('66', 240).must_equal '06' } # CONTRATO
123
+ it { subject.get_especie_titulo('77', 240).must_equal '07' } # COSSEGUROS
124
+ it { subject.get_especie_titulo('88', 240).must_equal '17' } # CONTA DE PRESTAÇÃO DE SERVIÇOS
125
+ end
126
+ end
127
+ describe "#get_especie_titulo" do
128
+ context "CÓDIGOS para o cnab 400 do Itau" do
129
+ it { subject.get_especie_titulo('02', 400).must_equal '01' } # DUPLICATA MERCANTIL
130
+ it { subject.get_especie_titulo('12', 400).must_equal '02' } # NOTA PROMISSÓRIA
131
+ it { subject.get_especie_titulo('16', 400).must_equal '03' } # NOTA DE SEGURO
132
+ it { subject.get_especie_titulo('21', 400).must_equal '04' } # MENSALIDADE ESCOLAR
133
+ it { subject.get_especie_titulo('17', 400).must_equal '05' } # RECIBO
134
+ it { subject.get_especie_titulo('04', 400).must_equal '08' } # DUPLICATA DE SERVIÇO
135
+ it { subject.get_especie_titulo('07', 400).must_equal '09' } # LETRA DE CÂMBIO
136
+ it { subject.get_especie_titulo('19', 400).must_equal '13' } # NOTA DE DÉBITOS
137
+ it { subject.get_especie_titulo('24', 400).must_equal '15' } # DOCUMENTO DE DÍVIDA
138
+ it { subject.get_especie_titulo('30', 400).must_equal '16' } # ENCARGOS CONDOMINIAIS
139
+ it { subject.get_especie_titulo('32', 400).must_equal '18' } # BOLETO DE PROPOSTA
140
+ it { subject.get_especie_titulo('66', 400).must_equal '06' } # CONTRATO
141
+ it { subject.get_especie_titulo('77', 400).must_equal '07' } # COSSEGUROS
142
+ it { subject.get_especie_titulo('88', 400).must_equal '17' } # CONTA DE PRESTAÇÃO DE SERVIÇOS
143
+ end
144
+ end
145
+
146
+ describe "#get_codigo_movimento_remessa" do
147
+ context "CÓDIGOS para o cnab 240 do Itau" do
148
+ it { subject.get_codigo_movimento_remessa('10', 240).must_equal '18' } # SUSTAR O PROTESTO
149
+ it { subject.get_codigo_movimento_remessa('38', 240).must_equal '38' } # BENEFICIÁRIO NÃO CONCORDA COM A ALEGAÇÃO DO PAGADOR CÓDIGO DA ALEGAÇÃO
150
+ it { subject.get_codigo_movimento_remessa('41', 240).must_equal '41' } # EXCLUSÃO DE SACADOR AVALISTA
151
+ it { subject.get_codigo_movimento_remessa('66', 240).must_equal '66' } # ENTRADA EM NEGATIVAÇÃO EXPRESSA
152
+ it { subject.get_codigo_movimento_remessa('67', 240).must_equal '67' } # NÃO NEGATIVAR (INIBE ENTRADA EM NEGATIVAÇÃO EXPRESSA
153
+ it { subject.get_codigo_movimento_remessa('68', 240).must_equal '68' } # EXCLUIR NEGATIVAÇÃO EXPRESSA (ATÉ 15 DIAS CORRIDOS APÓS A ENTRADA EM NEGATIVAÇÃO EXPRESSA)
154
+ it { subject.get_codigo_movimento_remessa('69', 240).must_equal '69' } # CANCELAR NEGATIVAÇÃO EXPRESSA (APÓS TÍTULO TER SIDO NEGATIVADO)
155
+ it { subject.get_codigo_movimento_remessa('93', 240).must_equal '93' } # DESCONTAR TÍTULOS ENCAMINHADOS NO DIA
156
+ end
157
+ end
158
+
159
+ describe "#get_codigo_protesto" do
160
+ it { subject.get_codigo_protesto('0').must_equal '0' } # Sem instrução
161
+ it { subject.get_codigo_protesto('07').must_equal '07' } # Negativar (Dias Corridos)
162
+ end
163
+
164
+ describe "#get_codigo_multa" do
165
+ it { subject.get_codigo_multa('0').must_equal '0' } # NÃO REGISTRA A MULTA
166
+ end
167
+
168
+ describe "#get_codigo_carteira" do
169
+ it "deve retornar E se a carteira for 147" do
170
+ subject.carteira = '147'
171
+ subject.get_codigo_carteira.must_equal 'E' # ESCRITURAL ELETRÔNICA – DÓLAR
172
+ end
173
+ it "deve retornar U se a carteira for 150" do
174
+ subject.carteira = '150'
175
+ subject.get_codigo_carteira.must_equal 'U' # DIRETA ELETRÔNICA SEM EMISSÃO – DÓLAR
176
+ end
177
+ it "deve retornar 1 se a carteira for 191" do
178
+ subject.carteira = '191'
179
+ subject.get_codigo_carteira.must_equal '1' # DUPLICATAS - TRANSFERÊNCIA DE DESCONTO
180
+ end
181
+ it "deve retornar I para as demais carteiras" do
182
+ subject.carteira = '109'
183
+ subject.get_codigo_carteira.must_equal 'I' # DEMAIS CARTEIRAS
184
+
185
+ subject.carteira = '999'
186
+ subject.get_codigo_carteira.must_equal 'I' # DEMAIS CARTEIRAS
187
+ end
188
+ end
189
+ end
@@ -125,7 +125,6 @@ describe BrBoleto::Conta::Sicoob do
125
125
  end
126
126
  end
127
127
 
128
-
129
128
  describe '#conta_corrente_dv' do
130
129
  it "deve ser personalizavel pelo usuario" do
131
130
  subject.conta_corrente_dv = 88
@@ -140,5 +139,36 @@ describe BrBoleto::Conta::Sicoob do
140
139
  end
141
140
  end
142
141
 
143
-
142
+ describe "#get_codigo_movimento_remessa" do
143
+ context "CÓDIGOS para o cnab 400 do SICOOB" do
144
+ it { subject.get_codigo_movimento_remessa('23', 400).must_equal '12' } # Alteração de Pagador
145
+ it { subject.get_codigo_movimento_remessa('46', 400).must_equal '34' } # Baixa - Pagamento Direto ao Beneficiário
146
+ end
147
+ end
148
+ describe '#get_codigo_juros' do
149
+ it { subject.get_codigo_juros('1').must_equal '1' }
150
+ it { subject.get_codigo_juros('2').must_equal '2' }
151
+ it "para o siccob o código que representa sem juros deve ser 0(zero)" do
152
+ subject.get_codigo_juros('3').must_equal '0'
153
+ end
154
+ it "se passar o código '0' para os juros deve retornar 0" do
155
+ subject.get_codigo_juros('0').must_equal '0'
156
+ end
157
+ it "default_codigo_juros deve ser '0" do
158
+ subject.default_codigo_juros.must_equal '0'
159
+ end
160
+ end
161
+ describe '#get_codigo_multa' do
162
+ it { subject.get_codigo_multa('1').must_equal '1' }
163
+ it { subject.get_codigo_multa('2').must_equal '2' }
164
+ it "para o siccob o código que representa sem multa deve ser 0(zero)" do
165
+ subject.get_codigo_multa('3').must_equal '0'
166
+ end
167
+ it "se passar o código '0' para os multa deve retornar 0" do
168
+ subject.get_codigo_multa('0').must_equal '0'
169
+ end
170
+ it "default_codigo_multa deve ser '0" do
171
+ subject.default_codigo_multa.must_equal '0'
172
+ end
173
+ end
144
174
  end
@@ -0,0 +1,180 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Conta::Sicredi do
4
+ subject { FactoryGirl.build(:conta_sicredi) }
5
+
6
+ it "deve herdar de Conta::Base" do
7
+ subject.class.superclass.must_equal BrBoleto::Conta::Base
8
+ end
9
+ context "valores padrões" do
10
+ it "deve setar a carteira com '1' " do
11
+ subject.class.new.carteira.must_equal '1'
12
+ end
13
+ it "deve setar a valid_agencia_length com 4 " do
14
+ subject.class.new.valid_agencia_length.must_equal 4
15
+ end
16
+ it "deve setar a valid_carteira_required com true " do
17
+ subject.class.new.valid_carteira_required.must_equal true
18
+ end
19
+ it "deve setar a valid_carteira_length com 1 " do
20
+ subject.class.new.valid_carteira_length.must_equal 1
21
+ end
22
+ it "deve setar a valid_conta_corrente_required com true " do
23
+ subject.class.new.valid_conta_corrente_required.must_equal true
24
+ end
25
+ it "deve setar a valid_conta_corrente_maximum com 5 " do
26
+ subject.class.new.valid_conta_corrente_maximum.must_equal 5
27
+ end
28
+ it "deve setar a valid_codigo_cedente_maximum com 5 " do
29
+ subject.class.new.valid_codigo_cedente_maximum.must_equal 5
30
+ end
31
+ it "deve setar a posto com '0'" do
32
+ subject.class.new.posto.must_equal '00'
33
+ end
34
+ it "deve setar a byte_id com '2'" do
35
+ subject.class.new.byte_id.must_equal '2'
36
+ end
37
+ end
38
+ describe "Validations" do
39
+ it { must validate_presence_of(:agencia) }
40
+ it { must validate_presence_of(:razao_social) }
41
+ it { must validate_presence_of(:cpf_cnpj) }
42
+
43
+ context 'Validações padrões da carteira' do
44
+ subject { BrBoleto::Conta::Sicredi.new }
45
+ it { must validate_presence_of(:carteira) }
46
+ it 'Tamanho deve ser de 1' do
47
+ subject.carteira = '132'
48
+ must_be_message_error(:carteira, :custom_length_is, {count: 1})
49
+ end
50
+ it "valores aceitos" do
51
+ subject.carteira = '04'
52
+ must_be_message_error(:carteira, :custom_inclusion, {list: '1, 3'})
53
+ end
54
+ end
55
+ context 'Validações padrões da conta_corrente' do
56
+ subject { BrBoleto::Conta::Sicredi.new }
57
+ it { must validate_presence_of(:conta_corrente) }
58
+ it 'Tamanho deve ter o tamanho maximo de 5' do
59
+ subject.conta_corrente = '12345678'
60
+ must_be_message_error(:conta_corrente, :custom_length_maximum, {count: 5})
61
+ end
62
+ end
63
+ context 'Validações padrões da codigo_cedente' do
64
+ subject { BrBoleto::Conta::Sicredi.new }
65
+ it 'Tamanho deve ter o tamanho maximo de 5' do
66
+ subject.codigo_cedente = '12345678'
67
+ must_be_message_error(:convenio, :custom_length_maximum, {count: 5})
68
+ end
69
+ end
70
+ it 'posto deve ter no maximo 2 digitos' do
71
+ subject.posto = '12345'
72
+ must_be_message_error(:posto, :custom_length_maximum, {count: 2})
73
+ subject.posto = '12'
74
+ wont_be_message_error(:posto, :custom_length_maximum, {count: 2})
75
+ end
76
+ context 'Validações padrões do byte_id' do
77
+ subject { BrBoleto::Conta::Sicredi.new }
78
+ it { must validate_presence_of(:byte_id) }
79
+ it 'byte_id deve ter 1 digito' do
80
+ subject.byte_id = '12345'
81
+ must_be_message_error(:byte_id, :custom_length_is, {count: 1})
82
+ subject.byte_id = '9'
83
+ wont_be_message_error(:byte_id, :custom_length_is, {count: 1})
84
+ end
85
+ it "valores aceitos" do
86
+ subject.byte_id = '1'
87
+ must_be_message_error(:byte_id, :custom_inclusion, {list: '2, 3, 4, 5, 6, 7, 8, 9'})
88
+ subject.byte_id = '7'
89
+ wont_be_message_error(:byte_id, :custom_inclusion, {list: '2, 3, 4, 5, 6, 7, 8, 9'})
90
+ end
91
+ end
92
+ end
93
+
94
+ it "codigo do banco" do
95
+ subject.codigo_banco.must_equal '748'
96
+ end
97
+ it '#codigo_banco_dv' do
98
+ subject.codigo_banco_dv.must_equal 'X'
99
+ end
100
+
101
+ describe "#nome_banco" do
102
+ it "valor padrão para o nome_banco" do
103
+ subject.nome_banco.must_equal 'SICREDI'
104
+ end
105
+ it "deve ser possível mudar o valor do nome do banco" do
106
+ subject.nome_banco = 'MEU'
107
+ subject.nome_banco.must_equal 'MEU'
108
+ end
109
+ end
110
+
111
+ it "#versao_layout_arquivo_cnab_240" do
112
+ subject.versao_layout_arquivo_cnab_240.must_equal '081'
113
+ end
114
+ it "#versao_layout_lote_cnab_240" do
115
+ subject.versao_layout_lote_cnab_240.must_equal '040'
116
+ end
117
+
118
+ describe '#posto' do
119
+ it "deve ajustar valor para 2 digitos" do
120
+ subject.posto = 4
121
+ subject.posto.must_equal '04'
122
+ end
123
+ end
124
+ describe '#byte_id' do
125
+ it "deve ajustar valor para 1 digito" do
126
+ subject.byte_id = 4
127
+ subject.byte_id.must_equal '4'
128
+ end
129
+ end
130
+
131
+ describe "#equivalent_especie_titulo_240" do
132
+ context "CÓDIGOS para o cnab 240 do Sicredi" do
133
+ it { subject.get_especie_titulo('01', 240).must_equal '03' } # Duplicata Mercantil por Indicação (DMI)
134
+ it { subject.get_especie_titulo('02', 240).must_equal '03' } # Duplicata Mercantil por Indicação (DMI)
135
+ end
136
+ end
137
+
138
+ describe "#equivalent_especie_titulo_400" do
139
+ context "CÓDIGOS para o cnab 400 do Sicredi" do
140
+ it { subject.get_especie_titulo('01', 400).must_equal 'A' }
141
+ it { subject.get_especie_titulo('02', 400).must_equal 'A' }
142
+ it { subject.get_especie_titulo('03', 400).must_equal 'A' } # Duplicata Mercantil por Indicação (DMI)
143
+ it { subject.get_especie_titulo('06', 400).must_equal 'B' } # Duplicata Rural (DR)
144
+ it { subject.get_especie_titulo('12', 400).must_equal 'C' } # Nota Promissória (NP)
145
+ it { subject.get_especie_titulo('13', 400).must_equal 'D' } # Nota Promissória Rural (NR)
146
+ it { subject.get_especie_titulo('16', 400).must_equal 'E' } # Nota de Seguros (NS)
147
+ it { subject.get_especie_titulo('17', 400).must_equal 'G' } # Recibo (RC)
148
+ it { subject.get_especie_titulo('07', 400).must_equal 'H' } # Letra de Câmbio (LC)
149
+ it { subject.get_especie_titulo('19', 400).must_equal 'I' } # Nota de Débito (ND)
150
+ it { subject.get_especie_titulo('05', 400).must_equal 'J' } # Duplicata de Serviço por Indicação (DSI)
151
+ it { subject.get_especie_titulo('99', 400).must_equal 'K' } # Outros (OS)
152
+ it { subject.get_especie_titulo('32', 400).must_equal 'O' } # Boleto de Proposta (BDP)
153
+ end
154
+ end
155
+
156
+ describe "#equivalent_tipo_cobranca_400" do
157
+ it { subject.get_tipo_cobranca('1', 400).must_equal 'A' } # Cobrança Simples
158
+ end
159
+
160
+ describe "#equivalent_tipo_impressao_400" do
161
+ it { subject.get_tipo_impressao('1', 400).must_equal 'A' } # Frente do Bloqueto
162
+ end
163
+
164
+ describe "#equivalent_identificacao_emissao_400" do
165
+ it { subject.get_identificacao_emissao('1', 400).must_equal 'A' } # Impressão é feita pelo Sicredi
166
+ it { subject.get_identificacao_emissao('2', 400).must_equal 'B' } # Impressão é feita pelo Beneficiário
167
+ end
168
+
169
+ describe "#equivalent_codigo_desconto" do
170
+ it { subject.get_codigo_desconto('0').must_equal '1' } # Sem Desconto
171
+ it { subject.get_codigo_desconto('1').must_equal '1' } # Valor Fixo Até a Data Informada
172
+ it { subject.get_codigo_desconto('2').must_equal '2' } # Percentual Até a Data Informada
173
+ it { subject.get_codigo_desconto('3').must_equal '3' } # Valor por Antecipação Dia Corrido
174
+ it { subject.get_codigo_desconto('4').must_equal '3' } # Valor por Antecipação Dia Úti
175
+ it { subject.get_codigo_desconto('5').must_equal '2' } # Percentual Sobre o Valor Nominal Dia Corrido
176
+ it { subject.get_codigo_desconto('6').must_equal '2' } # Percentual Sobre o Valor Nominal Dia Útil
177
+ it { subject.get_codigo_desconto('7').must_equal '7' } # Cancelamento de Desconto
178
+ end
179
+
180
+ end
@@ -0,0 +1,154 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Conta::Unicred do
4
+ subject { FactoryGirl.build(:conta_unicred) }
5
+
6
+ it "deve herdar de Conta::Bradesco" do
7
+ subject.class.superclass.must_equal BrBoleto::Conta::Bradesco
8
+ end
9
+ context "valores padrões" do
10
+ it "deve setar a carteira com '09' " do
11
+ subject.class.new.carteira.must_equal '09'
12
+ end
13
+ it "deve setar a valid_agencia_length com 4 " do
14
+ subject.class.new.valid_agencia_length.must_equal 4
15
+ end
16
+ it "deve setar a valid_carteira_required com true " do
17
+ subject.class.new.valid_carteira_required.must_equal true
18
+ end
19
+ it "deve setar a valid_carteira_length com 2 " do
20
+ subject.class.new.valid_carteira_length.must_equal 2
21
+ end
22
+ it "deve setar a valid_conta_corrente_required com true " do
23
+ subject.class.new.valid_conta_corrente_required.must_equal true
24
+ end
25
+ it "deve setar a valid_conta_corrente_maximum com 7 " do
26
+ subject.class.new.valid_conta_corrente_maximum.must_equal 7
27
+ end
28
+ it "deve setar a valid_codigo_cedente_maximum com 7 " do
29
+ subject.class.new.valid_codigo_cedente_maximum.must_equal 7
30
+ end
31
+ end
32
+ describe "Validations" do
33
+ it { must validate_presence_of(:agencia) }
34
+ it { must validate_presence_of(:razao_social) }
35
+ it { must validate_presence_of(:cpf_cnpj) }
36
+ it do
37
+ subject.agencia_dv = 21
38
+ must_be_message_error(:agencia_dv, :custom_length_is, {count: 1})
39
+ end
40
+ context 'Validações padrões da carteira' do
41
+ subject { BrBoleto::Conta::Unicred.new }
42
+ it { must validate_presence_of(:carteira) }
43
+ it 'Tamanho deve ser de 2' do
44
+ subject.carteira = '132'
45
+ must_be_message_error(:carteira, :custom_length_is, {count: 2})
46
+ end
47
+ it "valores aceitos" do
48
+ subject.carteira = '04'
49
+ must_be_message_error(:carteira, :custom_inclusion, {list: '06, 09, 19, 21, 22'})
50
+ end
51
+ end
52
+ context 'Validações padrões da conta_corrente' do
53
+ subject { BrBoleto::Conta::Unicred.new }
54
+ it { must validate_presence_of(:conta_corrente) }
55
+ it 'Tamanho deve ter o tamanho maximo de 7' do
56
+ subject.conta_corrente = '12345678'
57
+ must_be_message_error(:conta_corrente, :custom_length_maximum, {count: 7})
58
+ end
59
+ end
60
+ context 'Validações padrões da codigo_cedente' do
61
+ subject { BrBoleto::Conta::Unicred.new }
62
+ it 'Tamanho deve ter o tamanho maximo de 7' do
63
+ subject.codigo_cedente = '12345678'
64
+ must_be_message_error(:convenio, :custom_length_maximum, {count: 7})
65
+ end
66
+ end
67
+ end
68
+
69
+ it "codigo do banco" do
70
+ subject.codigo_banco.must_equal '237'
71
+ end
72
+ it '#codigo_banco_dv' do
73
+ subject.codigo_banco_dv.must_equal '2'
74
+ end
75
+
76
+ describe "#nome_banco" do
77
+ it "valor padrão para o nome_banco" do
78
+ subject.nome_banco.must_equal 'BRADESCO'
79
+ end
80
+ it "deve ser possível mudar o valor do nome do banco" do
81
+ subject.nome_banco = 'MEU'
82
+ subject.nome_banco.must_equal 'MEU'
83
+ end
84
+ end
85
+
86
+ it "#versao_layout_arquivo_cnab_240" do
87
+ subject.versao_layout_arquivo_cnab_240.must_equal '082'
88
+ end
89
+ it "#versao_layout_lote_cnab_240" do
90
+ subject.versao_layout_lote_cnab_240.must_equal '041'
91
+ end
92
+
93
+ describe '#agencia_dv' do
94
+ it "deve ser personalizavel pelo usuario" do
95
+ subject.agencia_dv = 88
96
+ subject.agencia_dv.must_equal 88
97
+ end
98
+ it "se não passar valor deve calcular automatico" do
99
+ subject.agencia = '1234'
100
+ BrBoleto::Calculos::Modulo11FatorDe2a9.expects(:new).with('1234').returns(stub(to_s: 5))
101
+
102
+ subject.agencia_dv.must_equal 5
103
+ end
104
+ end
105
+
106
+ describe '#conta_corrente_dv' do
107
+ it "deve ser personalizavel pelo usuario" do
108
+ subject.conta_corrente_dv = 88
109
+ subject.conta_corrente_dv.must_equal 88
110
+ end
111
+ it "se não passar valor deve calcular automatico" do
112
+ subject.conta_corrente_dv = nil
113
+ subject.conta_corrente = '6688'
114
+ BrBoleto::Calculos::Modulo11FatorDe2a7.expects(:new).with('0006688').returns(stub(to_s: 5))
115
+
116
+ subject.conta_corrente_dv.must_equal 5
117
+ end
118
+ end
119
+
120
+ describe "#get_especie_titulo" do
121
+ context "CÓDIGOS para o cnab 400 do Unicred" do
122
+ it { subject.get_especie_titulo('07', 400).must_equal '10' } # Letra de Câmbio
123
+ it { subject.get_especie_titulo('17', 400).must_equal '05' } # Recibo
124
+ it { subject.get_especie_titulo('19', 400).must_equal '11' } # Nota de Débito
125
+ it { subject.get_especie_titulo('32', 400).must_equal '30' } # Boleto de Proposta
126
+ end
127
+ end
128
+
129
+ describe "#get_codigo_movimento_remessa" do
130
+ context "CÓDIGOS para o cnab 400 do Unicred" do
131
+ it { subject.get_codigo_movimento_remessa('10', 400).must_equal '18' } # Sustar protesto e baixar Título
132
+ it { subject.get_codigo_movimento_remessa('11', 400).must_equal '19' } # Sustar protesto e manter em carteira
133
+ it { subject.get_codigo_movimento_remessa('31', 400).must_equal '22' } # Transferência Cessão Crédito
134
+ it { subject.get_codigo_movimento_remessa('33', 400).must_equal '68' } # Acerto nos dados do rateio de Crédito
135
+ it { subject.get_codigo_movimento_remessa('43', 400).must_equal '23' } # Transferência entre Carteiras
136
+ it { subject.get_codigo_movimento_remessa('45', 400).must_equal '45' } # Pedido de Negativação
137
+ it { subject.get_codigo_movimento_remessa('46', 400).must_equal '46' } # Excluir Negativação com baixa
138
+ it { subject.get_codigo_movimento_remessa('47', 400).must_equal '47' } # Excluir negativação e manter pendente
139
+ it { subject.get_codigo_movimento_remessa('34', 400).must_equal '69' } # Cancelamento do rateio de crédito.
140
+ end
141
+ end
142
+
143
+ describe "#get_codigo_protesto" do
144
+ context "CÓDIGOS para o cnab 240 do Unicred" do
145
+ it { subject.get_codigo_protesto('1').must_equal '1' } # Protestar Dias Corridos
146
+ it { subject.get_codigo_protesto('2').must_equal '1' } # Protestar Dias Úteis
147
+ it { subject.get_codigo_protesto('3').must_equal '3' } # Não Protesta
148
+ it { subject.get_codigo_protesto('4').must_equal '1' } # Protestar Fim Falimentar - Dias Úteis
149
+ it { subject.get_codigo_protesto('5').must_equal '1' } # Protestar Fim Falimentar - Dias Corridos
150
+ it { subject.get_codigo_protesto('8').must_equal '3' } # Negativação sem Protesto
151
+ it { subject.get_codigo_protesto('9').must_equal '3' } # Cancelamento Protesto Automático
152
+ end
153
+ end
154
+ end
@@ -22,8 +22,20 @@ describe BrBoleto::Pagador do
22
22
  it { must validate_presence_of(:cidade) }
23
23
  it { must validate_presence_of(:uf) }
24
24
  end
25
-
26
25
  end
26
+ context "validação de presença do avalsita" do
27
+ context "por padrão não deve ser obrigatorio" do
28
+ it { wont validate_presence_of(:nome_avalista) }
29
+ it { wont validate_presence_of(:documento_avalista) }
30
+ it { wont validate_presence_of(:endereco_avalista) }
31
+ end
32
+ context "se setar o valid_avalista_required então valida a presença do avalista" do
33
+ before { subject.valid_avalista_required = true }
34
+ it { must validate_presence_of(:nome_avalista) }
35
+ it { must validate_presence_of(:documento_avalista) }
36
+ end
37
+ end
38
+
27
39
  end
28
40
 
29
41
  it "cep deve retornar apenas numeros" do
@@ -96,7 +108,7 @@ describe BrBoleto::Pagador do
96
108
  it "se setar o CPF com a pontuação deve sempre retornar apenas os numeros" do
97
109
  subject.documento_avalista = '725.211.506-22'
98
110
  subject.documento_avalista.must_equal '72521150622'
99
- end
111
+ end
100
112
  end
101
113
 
102
114
  describe "#tipo_documento_avalista" do
@@ -143,6 +155,14 @@ describe BrBoleto::Pagador do
143
155
  subject.documento_avalista_formatado_com_label.must_equal 'CPF 725.211.506-22'
144
156
  end
145
157
  end
158
+
159
+ describe "#endereco_avalista" do
160
+ it "deve retornar o endereço do avalista" do
161
+ subject.endereco_avalista = 'RUA - BAIRRO - CEP - CIDADE-UF'
162
+ subject.endereco_avalista.must_equal 'RUA - BAIRRO - CEP - CIDADE-UF'
163
+ end
164
+ end
165
+
146
166
  end
147
167
 
148
168
  describe '#endereco_formatado' do
@@ -173,8 +173,8 @@ describe BrBoleto::Remessa::Cnab240::Base do
173
173
  subject.expects(:monta_lote).with(lote, 1).returns(["LOTE_lote_1"])
174
174
  subject.expects(:monta_lote).with(lote_2, 2).returns(["LOTE_lote_2"])
175
175
  resultado = subject.dados_do_arquivo
176
- resultado[10..21].must_equal "\nLOTE_LOTE_1"
177
- resultado[22..33].must_equal "\nLOTE_LOTE_2"
176
+ resultado[10..22].must_equal "\r\nLOTE_LOTE_1"
177
+ resultado[23..35].must_equal "\r\nLOTE_LOTE_2"
178
178
  end
179
179
 
180
180
  it "com 1 lote" do
@@ -182,7 +182,7 @@ describe BrBoleto::Remessa::Cnab240::Base do
182
182
  subject.stubs(:monta_header_arquivo).returns("1234567890")
183
183
  subject.expects(:monta_lote).with(lote, 1).returns(["LOTE_lote_1"])
184
184
  resultado = subject.dados_do_arquivo
185
- resultado[10..21].must_equal "\nLOTE_LOTE_1"
185
+ resultado[10..22].must_equal "\r\nLOTE_LOTE_1"
186
186
  end
187
187
  end
188
188
 
@@ -192,12 +192,12 @@ describe BrBoleto::Remessa::Cnab240::Base do
192
192
  subject.stubs(:monta_lote).with(lote_2, 2).returns(["LOTE_LOTE01234_2", "PARTE 2"])
193
193
  subject.expects(:monta_trailer_arquivo).with(2, 6).returns("TRAILER_DO_LOTE")
194
194
  resultado = subject.dados_do_arquivo
195
- resultado[10..26].must_equal "\nLOTE_LOTE01234_1"
196
- resultado[27..34].must_equal "\nPARTE 2"
197
- resultado[35..51].must_equal "\nLOTE_LOTE01234_2"
198
- resultado[52..59].must_equal "\nPARTE 2"
199
- resultado[60..75].must_equal "\nTRAILER_DO_LOTE"
200
- resultado.size.must_equal 76
195
+ resultado[10..27].must_equal "\r\nLOTE_LOTE01234_1"
196
+ resultado[28..36].must_equal "\r\nPARTE 2"
197
+ resultado[37..54].must_equal "\r\nLOTE_LOTE01234_2"
198
+ resultado[55..63].must_equal "\r\nPARTE 2"
199
+ resultado[64..80].must_equal "\r\nTRAILER_DO_LOTE"
200
+ resultado.size.must_equal 83
201
201
  end
202
202
  end
203
203
  describe "#monta_lote" do
@@ -375,11 +375,23 @@ describe BrBoleto::Remessa::Cnab240::Base do
375
375
  it "para monta_trailer_arquivo deve ter 240 caracteres" do
376
376
  subject.monta_trailer_arquivo(1, 2).size.must_equal 240
377
377
  end
378
- it "o total de caracteres do arquivo para 1 pagamento deve ser de 1445 caracteres" do
379
- # 1440 são das montagens e 5 caracteres são das quebras de linha (\n)
380
- subject.dados_do_arquivo.size.must_equal 1927
378
+ it "o total de caracteres do arquivo para 1 pagamento deve ser de 1936 caracteres" do
379
+ # 1926 são das montagens e 5 caracteres são das quebras de linha (\r\n)
380
+ subject.dados_do_arquivo.size.must_equal 1936
381
381
  end
382
382
  end
383
383
  end
384
384
 
385
+ describe "usa_segmento_R?" do
386
+ it "deve retornar como padrão sempre true" do
387
+ subject.usa_segmento_R?.must_equal true
388
+ end
389
+ end
390
+
391
+ describe "usa_segmento_S?" do
392
+ it "deve retornar como padrão sempre true" do
393
+ subject.usa_segmento_S?.must_equal true
394
+ end
395
+ end
396
+
385
397
  end