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,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