boleto_bancario 0.0.1.beta → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -2
  3. data/.travis.yml +10 -0
  4. data/Changelog.markdown +4 -0
  5. data/Gemfile +1 -1
  6. data/Planning.markdown +18 -86
  7. data/README.markdown +107 -55
  8. data/Rakefile +7 -1
  9. data/TODO.markdown +15 -1
  10. data/boleto_bancario.gemspec +7 -3
  11. data/lib/boleto_bancario.rb +27 -15
  12. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2.rb +65 -0
  13. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +5 -51
  14. data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
  15. data/lib/boleto_bancario/core/banco_brasil.rb +30 -5
  16. data/lib/boleto_bancario/core/banrisul.rb +182 -0
  17. data/lib/boleto_bancario/core/boleto.rb +67 -34
  18. data/lib/boleto_bancario/core/bradesco.rb +28 -16
  19. data/lib/boleto_bancario/core/caixa.rb +233 -0
  20. data/lib/boleto_bancario/core/hsbc.rb +170 -0
  21. data/lib/boleto_bancario/core/itau.rb +20 -10
  22. data/lib/boleto_bancario/core/real.rb +177 -0
  23. data/lib/boleto_bancario/core/santander.rb +19 -22
  24. data/lib/boleto_bancario/core/sicoob.rb +172 -0
  25. data/lib/boleto_bancario/core/sicredi.rb +290 -0
  26. data/lib/boleto_bancario/version.rb +1 -2
  27. data/spec/boleto_bancario/calculos/modulo10_spec.rb +4 -0
  28. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +6 -0
  29. data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_spec.rb +31 -0
  30. data/spec/boleto_bancario/calculos/modulo_numero_de_controle_spec.rb +37 -0
  31. data/spec/boleto_bancario/core/banco_brasil_spec.rb +59 -65
  32. data/spec/boleto_bancario/core/banrisul_spec.rb +129 -0
  33. data/spec/boleto_bancario/core/boleto_spec.rb +148 -32
  34. data/spec/boleto_bancario/core/bradesco_spec.rb +29 -36
  35. data/spec/boleto_bancario/core/caixa_spec.rb +111 -0
  36. data/spec/boleto_bancario/core/hsbc_spec.rb +72 -0
  37. data/spec/boleto_bancario/core/itau_spec.rb +33 -36
  38. data/spec/boleto_bancario/core/real_spec.rb +104 -0
  39. data/spec/boleto_bancario/core/santander_spec.rb +26 -24
  40. data/spec/boleto_bancario/core/sicoob_spec.rb +111 -0
  41. data/spec/boleto_bancario/core/sicredi_spec.rb +149 -0
  42. data/spec/inheritance/banco_brasil_spec.rb +22 -0
  43. data/spec/inheritance/banrisul_spec.rb +22 -0
  44. data/spec/inheritance/boleto_spec.rb +15 -0
  45. data/spec/inheritance/bradesco_spec.rb +22 -0
  46. data/spec/inheritance/caixa_spec.rb +22 -0
  47. data/spec/inheritance/hsbc_spec.rb +22 -0
  48. data/spec/inheritance/itau_spec.rb +22 -0
  49. data/spec/inheritance/real_spec.rb +22 -0
  50. data/spec/inheritance/santander_spec.rb +22 -0
  51. data/spec/inheritance/sicoob_spec.rb +22 -0
  52. data/spec/inheritance/sicredi_spec.rb +22 -0
  53. data/spec/shared_examples/boleto_bancario_shared_example.rb +21 -34
  54. data/spec/spec_helper.rb +2 -2
  55. metadata +119 -47
  56. data/.rvmrc +0 -1
@@ -0,0 +1,172 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Core
4
+ # Implementação de emissão de boleto bancário pelo Banco Sicoob.
5
+ #
6
+ # === Documentação Implementada
7
+ #
8
+ # A documentação na qual essa implementação foi baseada está localizada na pasta
9
+ # 'documentacoes_dos_boletos/sicoob' dentro dessa biblioteca.
10
+ #
11
+ # === Código da Carteira
12
+ #
13
+ # '1' - Cobrança SEM registro
14
+ # '9' - Cobrança COM registro
15
+ #
16
+ class Sicoob < Boleto
17
+ # Tamanho máximo de uma agência no Banco Sicoob.
18
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
19
+ #
20
+ # @return [Fixnum] 4
21
+ #
22
+ def self.tamanho_maximo_agencia
23
+ 4
24
+ end
25
+
26
+ # Tamanho máximo do codigo cedente no Banco Sicoob.
27
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
28
+ #
29
+ # @return [Fixnum] 7
30
+ #
31
+ def self.tamanho_maximo_codigo_cedente
32
+ 7
33
+ end
34
+
35
+ # Tamanho máximo do numero do documento no Boleto.
36
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
37
+ #
38
+ # @return [Fixnum] 6
39
+ #
40
+ def self.tamanho_maximo_numero_documento
41
+ 6
42
+ end
43
+
44
+ # <b>Carteiras suportadas.</b>
45
+ #
46
+ # <b>Método criado para validar se a carteira informada é suportada.</b>
47
+ #
48
+ # @return [Array]
49
+ #
50
+ def self.carteiras_suportadas
51
+ %w[1 9]
52
+ end
53
+
54
+ # Validações para os campos abaixo:
55
+ #
56
+ # * Agencia
57
+ # * Codigo Cedente
58
+ # * Número do documento
59
+ #
60
+ # Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
61
+ # Basta você sobrescrever os métodos de validação:
62
+ #
63
+ # class Sicoob < BoletoBancario::Core::Sicoob
64
+ # def self.tamanho_maximo_agencia
65
+ # 6
66
+ # end
67
+ #
68
+ # def self.tamanho_maximo_codigo_cedente
69
+ # 9
70
+ # end
71
+ #
72
+ # def self.tamanho_maximo_numero_documento
73
+ # 10
74
+ # end
75
+ # end
76
+ #
77
+ # Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
78
+ # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
79
+ # sobreescritos também).
80
+ #
81
+ validates :agencia, :codigo_cedente, presence: true
82
+
83
+ validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
84
+ validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
85
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
86
+
87
+ validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
88
+
89
+ # @return [String] 4 caracteres
90
+ #
91
+ def agencia
92
+ @agencia.to_s.rjust(4, '0') if @agencia.present?
93
+ end
94
+
95
+ # @return [String] 7 caracteres
96
+ #
97
+ def codigo_cedente
98
+ @codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.present?
99
+ end
100
+
101
+ # @return [String] 6 caracteres
102
+ #
103
+ def numero_documento
104
+ @numero_documento.to_s.rjust(6, '0') if @numero_documento.present?
105
+ end
106
+
107
+ # @return [String] Código do Banco descrito na documentação.
108
+ #
109
+ def codigo_banco
110
+ '756'
111
+ end
112
+
113
+ # @return [String] Dígito do código do banco descrito na documentação.
114
+ #
115
+ def digito_codigo_banco
116
+ '0'
117
+ end
118
+
119
+ # Campo Agência / Código do Cedente
120
+ #
121
+ # @return [String]
122
+ #
123
+ def agencia_codigo_cedente
124
+ "#{agencia} / #{codigo_cedente}"
125
+ end
126
+
127
+ # O nosso número descrino na documentação é formado pelo dois ultimos digitos do ano autal e
128
+ # por outros 6 digitos que o clinte usara para numerar os documentos, assim sendo composto por 8 dígitos.
129
+ #
130
+ # @return [String]
131
+ #
132
+ def nosso_numero
133
+ "#{ano}#{numero_documento}"
134
+ end
135
+
136
+ # Ano atual usado para os calculos
137
+ #
138
+ # @return [String]
139
+ #
140
+ def ano
141
+ Date.today.strftime('%y')
142
+ end
143
+
144
+ # === Código de barras do banco
145
+ #
146
+ # ___________________________________________________________
147
+ # | Posição | Tamanho | Descrição |
148
+ # |---------|---------|---------------------------------------|
149
+ # | 20 - 20 | 01 | Código da carteira |
150
+ # | 21 - 24 | 04 | Código da agência |
151
+ # | 25 - 26 | 02 | Código da modalidade de cobrança (01) |
152
+ # | 27 - 33 | 07 | Código do Cedente |
153
+ # | 34 - 41 | 08 | Nosso Número do título |
154
+ # | 42 - 44 | 03 | Número da Parcela do Título (001) |
155
+ # |___________________________________________________________|
156
+ #
157
+ # @return [String]
158
+ #
159
+ def codigo_de_barras_do_banco
160
+ "#{carteira}#{agencia}#{modalidade_cobranca}#{codigo_cedente}#{nosso_numero}#{parcelas}"
161
+ end
162
+
163
+ def modalidade_cobranca
164
+ '01'
165
+ end
166
+
167
+ def parcelas
168
+ '001'
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,290 @@
1
+ # encoding: utf-8
2
+ module BoletoBancario
3
+ module Core
4
+ # Implementação de emissão de boleto bancário pela Cooperativa de Credito Sicredi.
5
+ #
6
+ # === Documentação Implementada
7
+ #
8
+ # A documentação na qual essa implementação foi baseada está localizada na pasta
9
+ # 'documentacoes_dos_boletos/sicredi' dentro dessa biblioteca.
10
+ # === Carteiras suportadas
11
+ #
12
+ # Segue abaixo as carteiras suportadas pelo Sicredi <b>seguindo a documentação</b>:
13
+ #
14
+ # __________________________________________
15
+ # | Carteira | Descrição |
16
+ # | 03 | Cobrança Simples sem registro |
17
+ # | C | Cobrança Simples sem registro |
18
+ # |__________________________________________|
19
+ #
20
+ class Sicredi < Boleto
21
+ # Código do posto da cooperativa de crédito
22
+ attr_accessor :posto
23
+
24
+ # Byte de identificação do cedente do bloqueto utilizado para compor o nosso número.
25
+ attr_accessor :byte_id
26
+
27
+ # Tamanho máximo de uma agência no Sicredi.
28
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
29
+ #
30
+ # @return [Fixnum] 4
31
+ #
32
+ def self.tamanho_maximo_agencia
33
+ 4
34
+ end
35
+
36
+ # Tamanho máximo da conta corrente no Boleto.
37
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
38
+ #
39
+ # @return [Fixnum] 5
40
+ #
41
+ def self.tamanho_maximo_conta_corrente
42
+ 5
43
+ end
44
+
45
+ # Tamanho máximo do posto no Boleto.
46
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
47
+ #
48
+ # @return [Fixnum] 2
49
+ #
50
+ def self.tamanho_maximo_posto
51
+ 2
52
+ end
53
+
54
+ # <b>Byte Identificadores suportados.</b>
55
+ # <b>Método criado para validar se o byte identificador informado é suportado.</b>
56
+ #
57
+ # @return [Array]
58
+ #
59
+ def self.byte_id_suportados
60
+ %w[2 3 4 5 6 7 8 9]
61
+ end
62
+
63
+ # <b>Carteiras suportadas.</b>
64
+ # <b>Método criado para validar se a carteira informada é suportada.</b>
65
+ #
66
+ # @return [Array]
67
+ #
68
+ def self.carteiras_suportadas
69
+ %w[03 C]
70
+ end
71
+
72
+ # Tamanho máximo do número do documento emitido no Boleto.
73
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
74
+ #
75
+ # @return [Fixnum] 5
76
+ #
77
+ def self.tamanho_maximo_numero_documento
78
+ 5
79
+ end
80
+
81
+ # Validações para os campos abaixo:
82
+ #
83
+ # * Agencia
84
+ # * Conta Corrente
85
+ # * Posto
86
+ # * Byte Identificador
87
+ # * Carteira
88
+ # * Número do documento
89
+ #
90
+ # Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
91
+ # Basta você sobrescrever os métodos de validação:
92
+ #
93
+ # class Sicredi < BoletoBancario::Core::Sicredi
94
+ # def self.tamanho_maximo_agencia
95
+ # 5
96
+ # end
97
+ #
98
+ # def self.tamanho_maximo_conta_corrente
99
+ # 7
100
+ # end
101
+ #
102
+ # def self.tamanho_maximo_posto
103
+ # 2
104
+ # end
105
+ #
106
+ # def self.byte_id_suportados
107
+ # %w[1 12 123]
108
+ # end
109
+ #
110
+ # def self.carteiras_suportadas
111
+ # %w[45 89]
112
+ # end
113
+ #
114
+ # def self.tamanho_maximo_numero_documento
115
+ # 10
116
+ # end
117
+ # end
118
+ #
119
+ # Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
120
+ # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
121
+ # sobreescritos também).
122
+ #
123
+ validates :agencia, :conta_corrente, :posto, :byte_id, presence: true
124
+
125
+ validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
126
+ validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
127
+ validates :posto, length: { maximum: tamanho_maximo_posto }, if: :deve_validar_posto?
128
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
129
+
130
+ validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
131
+ validates :byte_id, inclusion: { in: ->(object) { object.class.byte_id_suportados } }, if: :deve_validar_byte_id?
132
+
133
+ # @return [String] 4 caracteres
134
+ #
135
+ def agencia
136
+ @agencia.to_s.rjust(4, '0') if @agencia.present?
137
+ end
138
+
139
+ # @return [String] 5 caracteres
140
+ #
141
+ def conta_corrente
142
+ @conta_corrente.to_s.rjust(5, '0') if @conta_corrente.present?
143
+ end
144
+
145
+ # @return [String] 2 caracteres
146
+ #
147
+ def posto
148
+ @posto.to_s.rjust(2, '0') if @posto.present?
149
+ end
150
+
151
+ # @return [String] 1 caracteres
152
+ #
153
+ def byte_id
154
+ @byte_id.to_s.rjust(1, '0') if @byte_id.present?
155
+ end
156
+
157
+ # @return [String] 5 caracteres
158
+ #
159
+ def numero_documento
160
+ @numero_documento.to_s.rjust(5, '0') if @numero_documento.present?
161
+ end
162
+
163
+ # A formatação da Carteira Simples é 1
164
+ #
165
+ # @return [String]
166
+ #
167
+ def carteira_formatada
168
+ tipo_carteira
169
+ end
170
+
171
+ # @return [String] Código do Banco descrito na documentação.
172
+ #
173
+ def codigo_banco
174
+ '748'
175
+ end
176
+
177
+ # @return [String] Dígito do código do banco descrito na documentação.
178
+ #
179
+ def digito_codigo_banco
180
+ 'X'
181
+ end
182
+
183
+ # Campo Agência/Código Beneficiário (:conta_corrente) formatado
184
+ #
185
+ # @return [String] Campo descrito na documentação.
186
+ #
187
+ def agencia_codigo_cedente
188
+ "#{agencia}.#{posto}.#{conta_corrente}"
189
+ end
190
+
191
+ # @return [String] Código referente ao tipo de cobrança
192
+ #
193
+ def tipo_cobranca
194
+ "3" # Somente sem registro
195
+ end
196
+
197
+ # @return [String] Código referente ao tipo de carteira
198
+ #
199
+ def tipo_carteira
200
+ "1"
201
+ end
202
+
203
+ # Mostra o campo nosso número calculando o dígito verificador do nosso número. AA/BXXXXX-D onde:
204
+ # AA = Ano atual, apenas os dois ultimos digitos.
205
+ # B = Byte Identificador (2 a 9). 1 só poderá ser utilizado pela cooperativa.
206
+ # XXXXX – Número do Documento.
207
+ # D = Digito Verificador pelo módulo 11.
208
+ #
209
+ # EX: 13/200004-1
210
+ #
211
+ # @return [String]
212
+ #
213
+ def nosso_numero
214
+ "#{ano}/#{byte_id}#{numero_documento}-#{nosso_numero_dv}"
215
+ end
216
+
217
+ # Ano atual usado para os calculos
218
+ #
219
+ # @return [String]
220
+ #
221
+ def ano
222
+ Date.today.strftime('%y')
223
+ end
224
+
225
+ # Digito verificador do nosso número
226
+ # Calculado atravez do modulo 11 com peso de 2 a 9 da direta para a esquerda.
227
+ # ____________________________________________________________________________
228
+ # | | Agencia | Posto | Conta Corrente | Ano | Byte | Numero Documento |
229
+ # |---------|---------|-------|----------------|-----|------|------------------|
230
+ # | Tamanho | 04 | 02 | 05 | 02 | 01 | 05 |
231
+ # |_________|__________________________________________________________________|
232
+ #
233
+ # @return [String]
234
+ #
235
+ def nosso_numero_dv
236
+ Modulo11FatorDe2a9RestoZero.new("#{agencia}#{posto}#{conta_corrente}#{ano}#{byte_id}#{numero_documento}")
237
+ end
238
+
239
+ # === Código de barras do banco
240
+ # __________________________________________________________________________
241
+ # | Posição | Tamanho | Descrição |
242
+ # |---------|---------|------------------------------------------------------|
243
+ # | 20 – 21 | 02 | Carteira |
244
+ # | 22 – 30 | 09 | Nosso número com o digito identificador |
245
+ # | 31 – 34 | 04 | Cooperativa de crédito/agência beneficiária |
246
+ # | 35 – 36 | 02 | Posto da cooperativa de crédito/agência beneficiária |
247
+ # | 37 – 41 | 05 | Código do beneficiário |
248
+ # | 42 – 42 | 01 | Será 1 quando houver o valor do documento |
249
+ # | 43 – 43 | 01 | Fixo 0 |
250
+ # | 44 – 44 | 01 | DV do campo livre |
251
+ # |__________________________________________________________________________|
252
+ #
253
+ # @return [String]
254
+ #
255
+ def codigo_de_barras_do_banco
256
+ codigo = "#{tipo_cobranca}#{tipo_carteira}#{nosso_numero_codigo_de_barras}#{agencia}#{posto}#{conta_corrente}#{valor_expresso}0"
257
+
258
+ codigo_dv = Modulo11FatorDe2a9RestoZero.new(codigo)
259
+
260
+ "#{codigo}#{codigo_dv}"
261
+ end
262
+
263
+ def nosso_numero_codigo_de_barras
264
+ "#{ano}#{byte_id}#{numero_documento}#{nosso_numero_dv}"
265
+ end
266
+
267
+ def valor_expresso
268
+ @valor_documento.present? ? '1' : '0'
269
+ end
270
+
271
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'posto'.
272
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
273
+ #
274
+ # @return [True]
275
+ #
276
+ def deve_validar_posto?
277
+ true
278
+ end
279
+
280
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'byte_id'.
281
+ # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
282
+ #
283
+ # @return [True]
284
+ #
285
+ def deve_validar_byte_id?
286
+ true
287
+ end
288
+ end
289
+ end
290
+ end