boleto_bancario 0.0.1.beta → 0.0.2

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