boleto_bancario 0.0.1.beta → 1.0.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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/Changelog.markdown +58 -2
  3. data/README.markdown +679 -156
  4. data/lib/boleto_bancario/calculos/documento.rb +191 -0
  5. data/lib/boleto_bancario/calculos/fator_vencimento.rb +78 -31
  6. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2.rb +65 -0
  7. data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +5 -51
  8. data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
  9. data/lib/boleto_bancario/core/banco_brasil.rb +30 -5
  10. data/lib/boleto_bancario/core/banrisul.rb +182 -0
  11. data/lib/boleto_bancario/core/boleto.rb +97 -35
  12. data/lib/boleto_bancario/core/bradesco.rb +28 -16
  13. data/lib/boleto_bancario/core/c6_bank.rb +155 -0
  14. data/lib/boleto_bancario/core/caixa.rb +233 -0
  15. data/lib/boleto_bancario/core/inter.rb +155 -0
  16. data/lib/boleto_bancario/core/itau.rb +20 -10
  17. data/lib/boleto_bancario/core/nubank.rb +156 -0
  18. data/lib/boleto_bancario/core/santander.rb +19 -22
  19. data/lib/boleto_bancario/core/sicoob.rb +172 -0
  20. data/lib/boleto_bancario/core/sicredi.rb +290 -0
  21. data/lib/boleto_bancario/locales/pt-BR.yml +55 -0
  22. data/lib/boleto_bancario/renderers/base.rb +154 -0
  23. data/lib/boleto_bancario/renderers/html_renderer.rb +92 -0
  24. data/lib/boleto_bancario/renderers/pdf_renderer.rb +130 -0
  25. data/lib/boleto_bancario/renderers/png_renderer.rb +66 -0
  26. data/lib/boleto_bancario/templates/_barcode.html.erb +3 -0
  27. data/lib/boleto_bancario/templates/_cedente.html.erb +14 -0
  28. data/lib/boleto_bancario/templates/_header.html.erb +4 -0
  29. data/lib/boleto_bancario/templates/_instructions.html.erb +10 -0
  30. data/lib/boleto_bancario/templates/_payment.html.erb +36 -0
  31. data/lib/boleto_bancario/templates/_sacado.html.erb +10 -0
  32. data/lib/boleto_bancario/templates/boleto.html.erb +22 -0
  33. data/lib/boleto_bancario/templates/boleto_styles.css +18 -0
  34. data/lib/boleto_bancario/version.rb +3 -2
  35. data/lib/boleto_bancario.rb +48 -19
  36. data/lib/generators/boleto_bancario/views_generator.rb +47 -0
  37. metadata +140 -106
  38. data/.gitignore +0 -18
  39. data/.rspec +0 -1
  40. data/.rvmrc +0 -1
  41. data/Gemfile +0 -3
  42. data/Planning.markdown +0 -131
  43. data/Rakefile +0 -9
  44. data/TODO.markdown +0 -5
  45. data/boleto_bancario.gemspec +0 -25
  46. data/documentacoes_dos_boletos/Bradesco/Manual_BRADESCO.PDF +0 -0
  47. data/spec/boleto_bancario/calculos/digitos_spec.rb +0 -19
  48. data/spec/boleto_bancario/calculos/fator_vencimento_spec.rb +0 -59
  49. data/spec/boleto_bancario/calculos/fatores_de_multiplicacao_spec.rb +0 -69
  50. data/spec/boleto_bancario/calculos/linha_digitavel_spec.rb +0 -57
  51. data/spec/boleto_bancario/calculos/modulo10_spec.rb +0 -49
  52. data/spec/boleto_bancario/calculos/modulo11_fator_de2a7_spec.rb +0 -43
  53. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero_spec.rb +0 -39
  54. data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +0 -61
  55. data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x_spec.rb +0 -37
  56. data/spec/boleto_bancario/calculos/modulo11_spec.rb +0 -19
  57. data/spec/boleto_bancario/core/banco_brasil_spec.rb +0 -383
  58. data/spec/boleto_bancario/core/boleto_spec.rb +0 -102
  59. data/spec/boleto_bancario/core/bradesco_spec.rb +0 -170
  60. data/spec/boleto_bancario/core/itau_spec.rb +0 -336
  61. data/spec/boleto_bancario/core/santander_spec.rb +0 -135
  62. data/spec/shared_examples/boleto_bancario_shared_example.rb +0 -164
  63. data/spec/spec_helper.rb +0 -14
@@ -0,0 +1,182 @@
1
+ module BoletoBancario
2
+ module Core
3
+ # Implementação de emissão de boleto bancário do Banrisul.
4
+ #
5
+ # === Documentação Implementada
6
+ #
7
+ # A documentação na qual essa implementação foi baseada está localizada na pasta
8
+ # 'documentacoes_dos_boletos/banrisul' dentro dessa biblioteca.
9
+ #
10
+ # === Contrato das classes de emissão de boletos
11
+ #
12
+ # Para ver o "<b>contrato</b>" da Emissão de Boletos (geração de código de barras, linha digitável, etc) veja
13
+ # a classe BoletoBancario::Core::Boleto.
14
+ #
15
+ # === Carteiras Suportadas
16
+ #
17
+ # 00 - CCB sem registro
18
+ # 08 - CCB com registro
19
+ #
20
+ # === Usage
21
+ #
22
+ # class BoletoBanrisul < BoletoBancario::Banrisul
23
+ # end
24
+ #
25
+ # boleto = BoletoBanrisul.new do |boleto|
26
+ # boleto.numero_documento = 22832563
27
+ # boleto.agencia = 100
28
+ # boleto.data_vencimento = Date.parse('2004-07-04')
29
+ # boleto.codigo_cedente = "0000001"
30
+ # boleto.valor_documento = 5.0
31
+ # end
32
+ #
33
+ class Banrisul < Boleto
34
+ # Tamanho máximo de uma agência no Banrisul (sem número de controle).
35
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
36
+ #
37
+ # @return [Fixnum] 3
38
+ #
39
+ def self.maximo_agencia
40
+ 3
41
+ end
42
+
43
+ # Tamanho máximo do código cedente.
44
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
45
+ #
46
+ # @return [Fixnum] 4
47
+ #
48
+ def self.maximo_codigo_cedente
49
+ 7
50
+ end
51
+
52
+ # Tamanho máximo do número do documento.
53
+ # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
54
+ #
55
+ # @return [Fixnum] 8
56
+ #
57
+ def self.maximo_numero_documento
58
+ 8
59
+ end
60
+
61
+ # <b>Carteiras suportadas.</b>
62
+ #
63
+ # <b>Método criado para validar se a carteira informada é suportada.</b>
64
+ #
65
+ # @return [Array]
66
+ #
67
+ def self.carteiras_suportadas
68
+ %w[00 08]
69
+ end
70
+
71
+ validates :agencia, :digito_agencia, :codigo_cedente, :digito_codigo_cedente, presence: true
72
+
73
+ validates :agencia, length: { maximum: maximo_agencia }, if: :deve_validar_agencia?
74
+ validates :codigo_cedente, length: { maximum: maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
75
+ validates :numero_documento, length: { maximum: maximo_numero_documento }, if: :deve_validar_numero_documento?
76
+
77
+ validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
78
+
79
+ # @return [String] 3 caracteres
80
+ #
81
+ def agencia
82
+ @agencia.to_s.rjust(3, '0') if @agencia.present?
83
+ end
84
+
85
+ # @return [String] 8 caracteres
86
+ #
87
+ def numero_documento
88
+ @numero_documento.to_s.rjust(8, '0') if @numero_documento.present?
89
+ end
90
+
91
+ # @return [String] 7 caracteres
92
+ #
93
+ def codigo_cedente
94
+ @codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.present?
95
+ end
96
+
97
+ # @return [String] 2 caracteres
98
+ #
99
+ def carteira
100
+ @carteira.to_s.rjust(2, '0') if @carteira.present?
101
+ end
102
+
103
+ # @return [String] Código do Banco descrito na documentação.
104
+ #
105
+ def codigo_banco
106
+ '041'
107
+ end
108
+
109
+ # Dígito do código do banco. Precisa mostrar esse dígito no boleto.
110
+ #
111
+ # @return [String] Dígito do código do banco descrito na documentação.
112
+ #
113
+ def digito_codigo_banco
114
+ '8'
115
+ end
116
+
117
+ # Dígito do código da agência. Precisa mostrar esse dígito no boleto.
118
+ #
119
+ # @return [String] Dígito da agência calculado apartir do ModuloNumeroDeControle.
120
+ #
121
+ def digito_agencia
122
+ ModuloNumeroDeControle.new(agencia)
123
+ end
124
+
125
+ # Dígito do código do cedente. Precisa mostrar esse dígito no boleto.
126
+ #
127
+ # @return [String] Dígito do código do cedente calculado apartir do ModuloNumeroDeControle.
128
+ #
129
+ def digito_codigo_cedente
130
+ ModuloNumeroDeControle.new(codigo_cedente)
131
+ end
132
+
133
+ # Retorna a Agencia, digito da agencia, código do cedente e o dígito do código do cedente.
134
+ #
135
+ # @return [String]
136
+ #
137
+ def agencia_codigo_cedente
138
+ "#{agencia}.#{digito_agencia} #{codigo_cedente}.#{digito_codigo_cedente}"
139
+ end
140
+
141
+ # Retorna o número do documento com seu número de controle.
142
+ #
143
+ # Para mais detalhes do cálculo, veja a classe ModuloNumeroDeControle.
144
+ #
145
+ # @return [String]
146
+ #
147
+ def nosso_numero
148
+ "#{numero_documento}.#{ModuloNumeroDeControle.new(numero_documento)}"
149
+ end
150
+
151
+ # === Código de barras do banco
152
+ #
153
+ # ________________________________________________________________________________________________
154
+ # | Posição | Tamanho | Descrição |
155
+ # |---------|---------|---------------------------------------------------------------------------|
156
+ # | 20 | 01 | Tipo da cobrança do produto (mais detalhes veja #tipo_da_cobranca) |
157
+ # | 21 | 01 | Constante '1' |
158
+ # | 22-24 | 03 | Agência (sem número de controle) |
159
+ # | 25-31 | 07 | Código do Cedente (sem número de controle) |
160
+ # | 32-39 | 08 | Nosso número (número do documento sem número de controle) |
161
+ # | 40-42 | 03 | Constante '041' |
162
+ # | 43-44 | 02 | Duplo Dígito referente às posições 20 a 42 (módulo do numero de controle) |
163
+ # ------------------------------------------------------------------------------------------------|
164
+ #
165
+ def codigo_de_barras_do_banco
166
+ codigo = "#{tipo_da_cobranca}1#{agencia}#{codigo_cedente}#{numero_documento}041"
167
+ "#{codigo}#{ModuloNumeroDeControle.new(codigo)}"
168
+ end
169
+
170
+ # Tipo da cobranca do boleto
171
+ #
172
+ # "1" Cobrança Normal, Fichário emitido pelo BANRISUL.
173
+ # "2" Cobrança Direta, Fichário emitido pelo CLIENTE.
174
+ #
175
+ # @return [String]
176
+ #
177
+ def tipo_da_cobranca
178
+ "2"
179
+ end
180
+ end
181
+ end
182
+ end
@@ -1,4 +1,5 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  module BoletoBancario
3
4
  module Core
4
5
  # @abstract Métodos { #codigo_banco, #digito_codigo_banco, #agencia_codigo_cedente, #nosso_numero, #codigo_de_barras_do_banco}
@@ -12,10 +13,7 @@ module BoletoBancario
12
13
  # * Internacionalização;
13
14
  # * Nomes das classes para serem manipuladas;
14
15
  #
15
- include ActiveModel::Validations
16
- include ActiveModel::Conversion
17
- extend ActiveModel::Naming
18
- extend ActiveModel::Translation
16
+ include ActiveModel::Model
19
17
 
20
18
  # Nome/Razão social que aparece no campo 'Cedente' no boleto.
21
19
  #
@@ -84,20 +82,10 @@ module BoletoBancario
84
82
  #
85
83
  attr_accessor :agencia
86
84
 
87
- # Dígito da agência. Campo auto explicativo.
88
- # Alguns bancos tem o agência, enquanto outros não possuem.
89
- #
90
- attr_accessor :digito_agencia
91
-
92
85
  # Número da Conta corrente. Campo auto explicativo.
93
86
  #
94
87
  attr_accessor :conta_corrente
95
88
 
96
- # Dígito da conta corrente. Campo auto explicativo.
97
- # Alguns bancos tem o dígito da conta corrente outros não.
98
- #
99
- attr_accessor :digito_conta_corrente
100
-
101
89
  # Código da moeda. Campo auto explicativo.
102
90
  # Padrão '9' (Real).
103
91
  #
@@ -168,24 +156,46 @@ module BoletoBancario
168
156
  #
169
157
  attr_accessor :local_pagamento
170
158
 
171
- # O que falta:
159
+ # Aceitar após o vencimento.
160
+ # Nessa gem utilizamos o campo aceite como Boolean.
161
+ # Obviamente, true para 'S' e false/nil para 'N'.
172
162
  #
173
- # Logo
174
- # Formatacao documento (CPF/CNPJ)
175
- # Aceite
176
- # Instruções
177
- # Código de barras como imagem (usar a gem Barby)
178
- # Data do vencimento formatado
179
- # Data do documento
180
- # Data do documento formatado
181
- # Data do processamento
182
- # Data do processamento formatado
163
+ attr_accessor :aceite
164
+
165
+ # Campos de instruções.
166
+ # São permitidas até seis linhas de instruções a serem mostradas no boleto
167
+
168
+ attr_accessor :instrucoes1,
169
+ :instrucoes2,
170
+ :instrucoes3,
171
+ :instrucoes4,
172
+ :instrucoes5,
173
+ :instrucoes6
174
+
175
+ # Caminho do logo do banco.
176
+ #
177
+ attr_accessor :logo
178
+
179
+ # Tamanho maximo do valor do documento do boleto.
180
+ # Acredito que não existirá valor de documento nesse valor,
181
+ # <b>porém a biblioteca precisa manter a consistência</b>.
182
+ #
183
+ # No código de barras o valor do documento precisa
184
+ # ter um tamanho de 8 caracteres para os reais (acrescentando zeros à esquerda),
185
+ # e 2 caracteres nos centavos (acrescentando zeros à esquerda).
186
+ #
187
+ # @return [Float] 99999999.99
188
+ #
189
+ def self.valor_documento_tamanho_maximo
190
+ 99999999.99
191
+ end
183
192
 
184
193
  # Validações de todos os boletos
185
194
  #
186
195
  validates :carteira, :valor_documento, :numero_documento, :data_vencimento, presence: true
187
196
  validates :cedente, :endereco_cedente, presence: true
188
197
  validates :sacado, :documento_sacado, presence: true
198
+ validates :valor_documento, numericality: { less_than_or_equal_to: ->(object) { object.class.valor_documento_tamanho_maximo } }
189
199
  validate :data_vencimento_deve_ser_uma_data
190
200
 
191
201
  # Passing the attributes as Hash or block
@@ -197,7 +207,6 @@ module BoletoBancario
197
207
  # @option options [String] :documento_cedente
198
208
  # @option options [String] :endereco_cedente
199
209
  # @option options [String] :conta_corrente
200
- # @option options [String] :digito_conta_corrente
201
210
  # @option options [String] :agencia
202
211
  # @option options [Date] :data_vencimento
203
212
  # @option options [String] :numero_documento
@@ -253,6 +262,7 @@ module BoletoBancario
253
262
  # bradesco.especie = 'outra_especie_que_nao_seja_em_reais'
254
263
  # bradesco.especie_documento = 'outra_especie_do_documento'
255
264
  # bradesco.data_documento = Date.tomorrow
265
+ # bradesco.aceite = false
256
266
  # end
257
267
  #
258
268
  # @return [Hash] Código da Moeda sendo '9' (real). Espécie sendo 'R$' (real).
@@ -263,7 +273,8 @@ module BoletoBancario
263
273
  :especie => 'R$',
264
274
  :especie_documento => 'DM',
265
275
  :local_pagamento => 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO',
266
- :data_documento => Date.today
276
+ :data_documento => Date.today,
277
+ :aceite => true
267
278
  }
268
279
  end
269
280
 
@@ -336,7 +347,17 @@ module BoletoBancario
336
347
  # @return [String] Precisa retornar 10 dígitos para o código de barras (incluindo os centavos).
337
348
  #
338
349
  def valor_formatado_para_codigo_de_barras
339
- valor_documento.to_s.gsub(/\,|\./, '').rjust(10, '0')
350
+ valor_documento_formatado = (Integer(valor_documento.to_f * 100) / Float(100))
351
+ real, centavos = valor_documento_formatado.to_s.split(/\./)
352
+ "#{real.rjust(8, '0')}#{centavos.ljust(2, '0')}"
353
+ end
354
+
355
+ # Força a carteira a retornar o valor como string
356
+ #
357
+ # @return [String]
358
+ #
359
+ def carteira
360
+ @carteira.to_s if @carteira.present?
340
361
  end
341
362
 
342
363
  # Embora o padrão seja mostrar o número da carteira no boleto,
@@ -349,6 +370,19 @@ module BoletoBancario
349
370
  carteira
350
371
  end
351
372
 
373
+ # Se o aceite for 'true', retorna 'S'.
374
+ # Retorna 'N', caso contrário.
375
+ #
376
+ # @return [String]
377
+ #
378
+ def aceite_formatado
379
+ if @aceite.present?
380
+ 'S'
381
+ else
382
+ 'N'
383
+ end
384
+ end
385
+
352
386
  # Fator de vencimento que é calculado a partir de uma data base.
353
387
  # Veja <b>FatorVencimento</b> para mais detalhes.
354
388
  #
@@ -469,7 +503,35 @@ module BoletoBancario
469
503
  false
470
504
  end
471
505
 
472
- # Métodos usado para verificar se deve realizar a validação de tamanho do campo 'agência'.
506
+ # Renderiza o boleto em formato PDF.
507
+ #
508
+ # @return [String] Conteúdo binário do PDF
509
+ # @raise [ArgumentError] Se o boleto não for válido
510
+ #
511
+ def to_pdf
512
+ Renderers::PdfRenderer.new(self).render
513
+ end
514
+
515
+ # Renderiza o boleto em formato HTML.
516
+ #
517
+ # @return [String] Conteúdo HTML do boleto
518
+ # @raise [ArgumentError] Se o boleto não for válido
519
+ #
520
+ def to_html
521
+ Renderers::HtmlRenderer.new(self).render
522
+ end
523
+
524
+ # Renderiza o código de barras em formato PNG.
525
+ #
526
+ # @param [Hash] options Opções para o renderizador PNG
527
+ # @return [String] Conteúdo binário do PNG
528
+ # @raise [ArgumentError] Se o boleto não for válido
529
+ #
530
+ def to_png(options = {})
531
+ Renderers::PngRenderer.new(self, options).render
532
+ end
533
+
534
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'agência'.
473
535
  # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
474
536
  #
475
537
  # @return [True]
@@ -478,7 +540,7 @@ module BoletoBancario
478
540
  true
479
541
  end
480
542
 
481
- # Métodos usado para verificar se deve realizar a validação de tamanho do campo 'agência'.
543
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'conta_corrente'.
482
544
  # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
483
545
  #
484
546
  # @return [True]
@@ -487,7 +549,7 @@ module BoletoBancario
487
549
  true
488
550
  end
489
551
 
490
- # Métodos usado para verificar se deve realizar a validação de tamanho do campo 'codigo_cedente'.
552
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'codigo_cedente'.
491
553
  # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
492
554
  #
493
555
  # @return [True]
@@ -496,7 +558,7 @@ module BoletoBancario
496
558
  true
497
559
  end
498
560
 
499
- # Métodos usado para verificar se deve realizar a validação de tamanho do campo 'numero_documento'.
561
+ # Método usado para verificar se deve realizar a validação de tamanho do campo 'numero_documento'.
500
562
  # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
501
563
  #
502
564
  # @return [True]
@@ -505,7 +567,7 @@ module BoletoBancario
505
567
  true
506
568
  end
507
569
 
508
- # Métodos usado para verificar se deve realizar a validação de tamanho do campo 'carteira'.
570
+ # Método usado para verificar se deve realizar a validação do campo 'carteira'.
509
571
  # <b>Sobrescreva esse método na subclasse, caso você mesmo queira fazer as validações</b>.
510
572
  #
511
573
  # @return [True]
@@ -522,4 +584,4 @@ module BoletoBancario
522
584
  end
523
585
  end
524
586
  end
525
- end
587
+ end
@@ -42,7 +42,7 @@ module BoletoBancario
42
42
  # Bradesco.new do |boleto|
43
43
  # boleto.conta_corrente = '89755'
44
44
  # boleto.agencia = '0097'
45
- # boleto.carteira = '198'
45
+ # boleto.carteira = '03'
46
46
  # boleto.numero_documento = '12345678'
47
47
  # boleto.codigo_cedente = '909014'
48
48
  # end
@@ -112,29 +112,26 @@ module BoletoBancario
112
112
  11
113
113
  end
114
114
 
115
- # Tamanho máximo da carteira.
116
- # O tamanho máximo é justamente 2 porque no código de barras só é permitido 2 posições para este campo.
115
+ # <b>Carteiras suportadas.</b>
117
116
  #
118
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
117
+ # <b>Método criado para validar se a carteira informada é suportada.</b>
119
118
  #
120
- # @return [Fixnum] 2
119
+ # @return [Array]
121
120
  #
122
- def self.tamanho_maximo_carteira
123
- 2
121
+ def self.carteiras_suportadas
122
+ %w[03 06 09 19 21 22]
124
123
  end
125
124
 
126
125
  validates :agencia, :digito_agencia, :conta_corrente, :digito_conta_corrente, presence: true
127
126
 
128
- # Validações de tamanho para os campos abaixo:
127
+ # Validações para os campos abaixo:
129
128
  #
130
129
  # * Agencia
131
- # * Digito verificador da agencia
132
130
  # * Conta corrente
133
- # * Digito verificador da conta corrente
134
131
  # * Número do documento
135
132
  # * Carteira
136
133
  #
137
- # Se você quiser sobrescrever os tamanhos permitidos, ficará a sua responsabilidade.
134
+ # Se você quiser sobrescrever os metodos, ficará a sua responsabilidade.
138
135
  # Basta você sobrescrever os métodos de validação:
139
136
  #
140
137
  # class Bradesco < BoletoBancario::Core::Bradesco
@@ -150,8 +147,8 @@ module BoletoBancario
150
147
  # 9
151
148
  # end
152
149
  #
153
- # def self.tamanho_maximo_carteira
154
- # 2
150
+ # def self.carteiras_suportadas
151
+ # %w[03 06 09 19 21 22]
155
152
  # end
156
153
  # end
157
154
  #
@@ -159,12 +156,11 @@ module BoletoBancario
159
156
  # Você precisará analisar o efeito no #codigo_de_barras, #nosso_numero e na
160
157
  # #linha_digitável (ambos podem ser sobreescritos também).
161
158
  #
162
- validates :digito_agencia, length: { maximum: 1 }
163
- validates :digito_conta_corrente, length: { maximum: 1 }
164
159
  validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
165
160
  validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
166
161
  validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
167
- validates :carteira, length: { maximum: tamanho_maximo_carteira }, if: :deve_validar_carteira?
162
+
163
+ validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
168
164
 
169
165
  # @return [String] 7 caracteres
170
166
  #
@@ -220,6 +216,22 @@ module BoletoBancario
220
216
  '2'
221
217
  end
222
218
 
219
+ # Dígito do código da agência. Precisa mostrar esse dígito no boleto.
220
+ #
221
+ # @return [String] Dígito da agência calculado usando o Modulo11FatorDe9a2.
222
+ #
223
+ def digito_agencia
224
+ Modulo11FatorDe9a2.new(agencia)
225
+ end
226
+
227
+ # Dígito da conta corrente. Precisa mostrar esse dígito no boleto.
228
+ #
229
+ # @return [String] Dígito da conta corrente calculado apartir do Modulo11FatorDe9a2.
230
+ #
231
+ def digito_conta_corrente
232
+ Modulo11FatorDe9a2.new(conta_corrente)
233
+ end
234
+
223
235
  # Campo preenchido com:
224
236
  #
225
237
  # - Agência com 4 caracteres - digito da agência / Conta de Cobrança com 7 caracteres - Digito da Conta
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BoletoBancario
4
+ module Core
5
+ # Implementação de emissão de boleto bancário pelo C6 Bank.
6
+ #
7
+ # === Documentação Implementada
8
+ #
9
+ # A documentação na qual essa implementação foi baseada está localizada na pasta
10
+ # 'documentacoes_dos_boletos/c6_bank' dentro dessa biblioteca.
11
+ #
12
+ # === Contrato das classes de emissão de boletos
13
+ #
14
+ # Para ver o "<b>contrato</b>" da Emissão de Boletos veja a classe BoletoBancario::Core::Boleto.
15
+ #
16
+ # === Carteiras suportadas
17
+ #
18
+ # O C6 Bank trabalha com carteira de cobrança registrada.
19
+ #
20
+ # ___________________________________________________________________________
21
+ # | Carteira | Descrição | Testada/Homologada |
22
+ # | 1 | Cobrança Registrada | Esperando Contribuição |
23
+ # ----------------------------------------------------------------------------
24
+ #
25
+ class C6Bank < Boleto
26
+ # Tamanho máximo de uma conta corrente no C6 Bank.
27
+ #
28
+ # @return [Integer] 10
29
+ #
30
+ def self.tamanho_maximo_conta_corrente
31
+ 10
32
+ end
33
+
34
+ # Tamanho máximo de uma agência no C6 Bank.
35
+ #
36
+ # @return [Integer] 4
37
+ #
38
+ def self.tamanho_maximo_agencia
39
+ 4
40
+ end
41
+
42
+ # Tamanho máximo do número do documento.
43
+ #
44
+ # @return [Integer] 11
45
+ #
46
+ def self.tamanho_maximo_numero_documento
47
+ 11
48
+ end
49
+
50
+ # Tamanho máximo do código do cedente.
51
+ #
52
+ # @return [Integer] 10
53
+ #
54
+ def self.tamanho_maximo_codigo_cedente
55
+ 10
56
+ end
57
+
58
+ # Carteiras suportadas pelo C6 Bank.
59
+ #
60
+ # @return [Array]
61
+ #
62
+ def self.carteiras_suportadas
63
+ %w[1]
64
+ end
65
+
66
+ validates :agencia, :conta_corrente, presence: true
67
+ validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
68
+ validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
69
+ validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
70
+ validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
71
+
72
+ # @return [String] Número do documento com 11 dígitos.
73
+ #
74
+ def numero_documento
75
+ @numero_documento.to_s.rjust(11, '0') if @numero_documento.present?
76
+ end
77
+
78
+ # @return [String] Agência com 4 dígitos.
79
+ #
80
+ def agencia
81
+ @agencia.to_s.rjust(4, '0') if @agencia.present?
82
+ end
83
+
84
+ # @return [String] Conta corrente com 10 dígitos.
85
+ #
86
+ def conta_corrente
87
+ @conta_corrente.to_s.rjust(10, '0') if @conta_corrente.present?
88
+ end
89
+
90
+ # @return [String] Código do cedente com 10 dígitos.
91
+ #
92
+ def codigo_cedente
93
+ @codigo_cedente.to_s.rjust(10, '0') if @codigo_cedente.present?
94
+ end
95
+
96
+ # Código do C6 Bank.
97
+ #
98
+ # @return [String] '336'
99
+ #
100
+ def codigo_banco
101
+ '336'
102
+ end
103
+
104
+ # Dígito do código do banco.
105
+ #
106
+ # @return [String] '5'
107
+ #
108
+ def digito_codigo_banco
109
+ '5'
110
+ end
111
+
112
+ # Dígito verificador da conta corrente.
113
+ #
114
+ # @return [String]
115
+ #
116
+ def digito_conta_corrente
117
+ Modulo10.new(conta_corrente.to_s)
118
+ end
119
+
120
+ # Agência e código do cedente formatados.
121
+ #
122
+ # @return [String]
123
+ #
124
+ def agencia_codigo_cedente
125
+ "#{agencia} / #{conta_corrente}-#{digito_conta_corrente}"
126
+ end
127
+
128
+ # Nosso Número formatado.
129
+ #
130
+ # @return [String]
131
+ #
132
+ def nosso_numero
133
+ "#{numero_documento}-#{digito_nosso_numero}"
134
+ end
135
+
136
+ # Dígito verificador do nosso número.
137
+ #
138
+ # @return [String]
139
+ #
140
+ def digito_nosso_numero
141
+ Modulo11FatorDe2a9.new(numero_documento.to_s)
142
+ end
143
+
144
+ # Segunda parte do código de barras (campo livre).
145
+ # 25 posições específicas do C6 Bank.
146
+ #
147
+ # @return [String]
148
+ #
149
+ def codigo_de_barras_do_banco
150
+ codigo = "#{agencia}#{carteira.to_s.rjust(1, '0')}#{numero_documento}#{conta_corrente.to_s[0, 9]}"
151
+ "#{codigo.ljust(25, '0')}"
152
+ end
153
+ end
154
+ end
155
+ end