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
@@ -1,5 +1,19 @@
1
+ # Road to 1.0.0
2
+
3
+ ## Código de barras
4
+
5
+ * Colocar a gem barby para gerar a imagem do código de barras.
6
+
7
+ ## Layout
8
+
9
+ * Verificar a questão dos formatos (html, pdf, png).
10
+
11
+ # Outros
12
+
13
+ * Logo dos bancos.
14
+ * Formatacao documento (CPF/CNPJ).
1
15
  * Colocar exemplos melhores na documentação de cada banco.
2
16
  * Nos exemplos de cada banco colocar os métodos que são chamados pelo objeto.
3
17
  * Verificar as validações e suas mensagens de erro.
4
18
  * Internacionalização / Locales.
5
- * Verificar a questão dos formatos (html, pdf).
19
+ * Criar páginas explicando cada banco.
@@ -15,9 +15,13 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = BoletoBancario::VERSION
17
17
 
18
- gem.add_dependency "activesupport", "~> 3.2"
19
- gem.add_dependency "activemodel", "~> 3.2"
20
- gem.add_development_dependency "rspec", "~> 2.11"
18
+ gem.add_dependency "rake"
19
+ gem.add_dependency "activesupport", "~> 4.1"
20
+ gem.add_dependency "activemodel", "~> 4.1"
21
+ gem.add_dependency "barby"
22
+
23
+ gem.add_development_dependency "rspec", "~> 2.13"
24
+ gem.add_development_dependency "yard"
21
25
  gem.add_development_dependency "valid_attribute", "~> 1.3"
22
26
  gem.add_development_dependency "pry", "~> 0.9"
23
27
  gem.add_development_dependency "simplecov", "~> 0.2"
@@ -57,26 +57,38 @@ module BoletoBancario
57
57
  # você precise mudar os nomes dos campos nos boletos)
58
58
  #
59
59
  module Core
60
- autoload :Boleto, 'boleto_bancario/core/boleto'
61
- autoload :BancoBrasil, 'boleto_bancario/core/banco_brasil'
62
- autoload :Bradesco, 'boleto_bancario/core/bradesco'
63
- autoload :Itau, 'boleto_bancario/core/itau'
64
- autoload :Santander, 'boleto_bancario/core/santander'
60
+ extend ActiveSupport::Autoload
61
+
62
+ autoload :Boleto
63
+ autoload :BancoBrasil
64
+ autoload :Banrisul
65
+ autoload :Bradesco
66
+ autoload :Caixa
67
+ autoload :Hsbc
68
+ autoload :Itau
69
+ autoload :Real
70
+ autoload :Santander
71
+ autoload :Sicoob
72
+ autoload :Sicredi
65
73
  end
66
74
 
67
75
  # Módulo que possui classes que realizam os cálculos dos campos que serão mostrados nos boletos.
68
76
  #
69
77
  module Calculos
70
- autoload :FatorVencimento, 'boleto_bancario/calculos/fator_vencimento'
71
- autoload :FatoresDeMultiplicacao, 'boleto_bancario/calculos/fatores_de_multiplicacao'
72
- autoload :LinhaDigitavel, 'boleto_bancario/calculos/linha_digitavel'
73
- autoload :Modulo10, 'boleto_bancario/calculos/modulo10'
74
- autoload :Modulo11, 'boleto_bancario/calculos/modulo11'
75
- autoload :Modulo11FatorDe2a9, 'boleto_bancario/calculos/modulo11_fator_de2a9'
76
- autoload :Modulo11FatorDe2a9RestoZero, 'boleto_bancario/calculos/modulo11_fator_de2a9_resto_zero'
77
- autoload :Modulo11FatorDe2a7, 'boleto_bancario/calculos/modulo11_fator_de2a7'
78
- autoload :Modulo11FatorDe9a2RestoX, 'boleto_bancario/calculos/modulo11_fator_de9a2_resto_x'
79
- autoload :Digitos, 'boleto_bancario/calculos/digitos'
78
+ extend ActiveSupport::Autoload
79
+
80
+ autoload :FatorVencimento
81
+ autoload :FatoresDeMultiplicacao
82
+ autoload :LinhaDigitavel
83
+ autoload :Modulo10
84
+ autoload :Modulo11
85
+ autoload :Modulo11FatorDe2a9
86
+ autoload :Modulo11FatorDe2a9RestoZero
87
+ autoload :Modulo11FatorDe2a7
88
+ autoload :Modulo11FatorDe9a2
89
+ autoload :Modulo11FatorDe9a2RestoX
90
+ autoload :ModuloNumeroDeControle
91
+ autoload :Digitos
80
92
  end
81
93
 
82
94
  include Core
@@ -0,0 +1,65 @@
1
+ module BoletoBancario
2
+ module Calculos
3
+ # === Módulo 11 Fator de 9 a 2
4
+ #
5
+ # === Passos
6
+ #
7
+ # 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
8
+ # pela seqüência numérica de 9 a 2 (9, 8, 7, 6, 5, 4, 3, 2 ... e assim por diante).
9
+ #
10
+ # 2) Some o resultado de cada produto efetuado e determine o total como (N).
11
+ #
12
+ # 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
13
+ #
14
+ # ==== Exemplo Normal
15
+ #
16
+ # Considerando o seguinte número: '89234560'.
17
+ #
18
+ # 1) Multiplicando a seqüência de multiplicadores:
19
+ #
20
+ # 8 9 2 3 4 5 6 0
21
+ # * * * * * * * *
22
+ # 2 3 4 5 6 7 8 9
23
+ #
24
+ # 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
25
+ #
26
+ # 16 + 27 + 8 + 15 + 24 + 35 + 48 + 0
27
+ # # => 173
28
+ #
29
+ # 3) Determina-se o resto da Divisão:
30
+ #
31
+ # 173 % 11
32
+ # # => 8 =============> Resultado final retornado.
33
+ #
34
+ # @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 9 a 2.
35
+ # @return [String] Retorna o resultado do cálculo descrito acima.
36
+ #
37
+ # @example
38
+ #
39
+ # BoletoBancario::Calculos::Modulo11FatorDe9a2.new('12345')
40
+ # # => '5'
41
+ #
42
+ # BoletoBancario::Calculos::Modulo11FatorDe9a2.new('246')
43
+ # # => '1'
44
+ #
45
+ class Modulo11FatorDe9a2 < Modulo11
46
+ # Sequência numérica de 9 a 2 que será feito a multiplicação de cada dígito
47
+ # do número passado no #initialize.
48
+ #
49
+ # @return [Array] Sequência numérica
50
+ #
51
+ def fatores
52
+ [9, 8, 7, 6, 5, 4, 3, 2]
53
+ end
54
+
55
+ # Calcula o número pelos fatores de multiplicação de 9 a 2.
56
+ # Depois calcula o resto da divisão por 11.
57
+ #
58
+ # @return [Fixnum]
59
+ #
60
+ def calculate
61
+ mod_division
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,37 +1,9 @@
1
1
  module BoletoBancario
2
2
  module Calculos
3
- # === Módulo 11 Fator de 9 a 2 - Resto 10, sendo X
3
+ # === Módulo 11 Fator de 9 a 2 - Resto 10, sendo X
4
+ # <b>Essa classe difere da outra com Modulo11FatorDe9a2, no momento de verificar o resto da divisão por 11.</b>
4
5
  #
5
- # === Passos
6
- #
7
- # 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
8
- # pela seqüência numérica de 9 a 2 (9, 8, 7, 6, 5, 4, 3, 2 ... e assim por diante).
9
- #
10
- # 2) Some o resultado de cada produto efetuado e determine o total como (N).
11
- #
12
- # 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
13
- #
14
- # <b>OBS.:</b> Se o resultado desta expressão for igual a 10, considere DAC = X.
15
- #
16
- # ==== Exemplo Normal
17
- #
18
- # Considerando o seguinte número: '89234560'.
19
- #
20
- # 1) Multiplicando a seqüência de multiplicadores:
21
- #
22
- # 8 9 2 3 4 5 6 0
23
- # * * * * * * * *
24
- # 2 3 4 5 6 7 8 9
25
- #
26
- # 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
27
- #
28
- # 16 + 27 + 8 + 15 + 24 + 35 + 48 + 0
29
- # # => 173
30
- #
31
- # 3) Determina-se o resto da Divisão:
32
- #
33
- # 173 % 11
34
- # # => 8 =============> Resultado final retornado.
6
+ # <b>Para mais detalhes veja a classe Modulo11FatorDe9a2.</b>
35
7
  #
36
8
  # ==== Exemplo 10 como resto da divisão
37
9
  #
@@ -58,30 +30,12 @@ module BoletoBancario
58
30
  # resultado == 10
59
31
  # # => 'X' =============> Resultado final retornado.
60
32
  #
61
- # @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 9 a 2.
62
- # @return [String] Retorna o resultado do cálculo descrito acima.
63
- #
64
33
  # @example
65
34
  #
66
- # BoletoBancario::Calculos::Modulo11FatorDe9a2RestoX.new('12345')
67
- # # => '5'
68
- #
69
- # BoletoBancario::Calculos::Modulo11FatorDe9a2RestoX.new('246')
70
- # # => '1'
71
- #
72
- # BoletoBancario::Calculos::Modulo11FatorDe2a9.new('184122')
35
+ # BoletoBancario::Calculos::Modulo11FatorDe9a2RestoX.new('184122')
73
36
  # # => 'X'
74
37
  #
75
- class Modulo11FatorDe9a2RestoX < Modulo11
76
- # Sequência numérica de 9 a 2 que será feito a multiplicação de cada dígito
77
- # do número passado no #initialize.
78
- #
79
- # @return [Array] Sequência numérica
80
- #
81
- def fatores
82
- [9, 8, 7, 6, 5, 4, 3, 2]
83
- end
84
-
38
+ class Modulo11FatorDe9a2RestoX < Modulo11FatorDe9a2
85
39
  # Calcula o número pelos fatores de multiplicação de 9 a 2.
86
40
  # Depois calcula o resto da divisão por 11.
87
41
  # Se o resultado desse cálculo for igual a 10, então o DAC = X.
@@ -0,0 +1,117 @@
1
+ module BoletoBancario
2
+ module Calculos
3
+ # === Cálculo do Módulo do Número de Controle (2 dígitos)
4
+ #
5
+ # Tipo de cálculo usado pelo Banco Banrisul.
6
+ #
7
+ # === Cálculo do Primeiro Dígito
8
+ #
9
+ # 1) Multiplica-se cada algarismo do campo pela seqüência de multiplicadores <b>2, 1, 2, 1, 2, 1 ...</b>, posicionados da direita para a esquerda.
10
+ #
11
+ # 2) Some individualmente, os algarismos dos resultados dos produtos, obtendo-se o total (N).
12
+ #
13
+ # 3) Divida o total encontrado (N) por 10, e determine o resto da divisão como MOD 10 (N).
14
+ #
15
+ # 4) Encontre o DAC através da seguinte expressão:
16
+ #
17
+ # DAC = 10 - Mod 10 (n)
18
+ #
19
+ # === Cálculo do segundo dígito
20
+ #
21
+ # # 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
22
+ # pela seqüência numérica de 2 a 7 (2, 3, 4, 5, 6, 7 ... e assim por diante).
23
+ #
24
+ # 2) Some o resultado de cada produto efetuado e determine o total como (N).
25
+ #
26
+ # 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
27
+ #
28
+ # 4) Calcule o dígito verificador (DAC) através da expressão:
29
+ #
30
+ # DIGIT = 11 - Mod 11 (n)
31
+ #
32
+ # <b>Observações:</b>
33
+ #
34
+ # Caso o 'resto' obtido no cálculo do módulo '11' seja igual a '1', considera-se o DV inválido.
35
+ # Soma-se, então, "1" ao DV obtido do módulo "10" e refaz-se o cálculo do módulo “11”.
36
+ # Se o dígito obtido pelo módulo “10” era igual a "9", considera-se então (9+1=10) DV inválido.
37
+ # Neste caso, o DV do módulo "10" automaticamente será igual a "0" e procede-se assim
38
+ # novo cálculo pelo módulo "11".
39
+ #
40
+ # === Exemplo com Primeiro Dígito Inválido
41
+ #
42
+ # Dado o número '00009194':
43
+ #
44
+ # O somatório do primeiro cálculo é igual a '28' e o Resto é igual a '8'.
45
+ # Portanto, o primeiro DV é igual a 10 - 8 ou DV = 2.
46
+ #
47
+ # O somatório do segundo cálculo é igual a '111' e o Resto é, neste caso, igual a '1'.
48
+ # Portanto, o segundo DV é inválido (11 - 1 = 10).
49
+ #
50
+ # Neste caso, soma-se '1' ao DV obtido do primeiro cálculo:
51
+ #
52
+ # 2 + 1
53
+ # # ======> 3 # Primeiro dígito do número de controle
54
+ #
55
+ # Agora, efetua-se novo cálculo do módulo 11, agora com o novo número, ou seja, 000091943:
56
+ #
57
+ # A somatório do segundo cálculo é igual a '113' e o Resto igual a '3'.
58
+ # Portanto, o segundo DV é igual a:
59
+ #
60
+ # 11 - 3
61
+ # # ====> 8 # Segundo dígito do número de controle
62
+ #
63
+ # Neste exemplo, o número de controle será '38'.
64
+ #
65
+ class ModuloNumeroDeControle < String
66
+ attr_reader :number, :first_digit, :second_digit
67
+
68
+ def initialize(number)
69
+ @number = number
70
+ @first_digit = calculate_first_digit
71
+ @second_digit = calculate_second_digit
72
+
73
+ super(calculate)
74
+ end
75
+
76
+ # Retorna 2 dígitos verificando o segundo dígito se é válido ou não.
77
+ #
78
+ # @return [String]
79
+ #
80
+ def calculate
81
+ if second_digit_result.equal?(10)
82
+ @first_digit = first_digit.to_i + 1
83
+ @first_digit = 0 if @first_digit.equal?(10)
84
+ @second_digit = calculate_second_digit
85
+ end
86
+
87
+ "#{first_digit}#{second_digit}"
88
+ end
89
+
90
+ # Retorna a subtração de 11 pelo resto da divisão por 11 do segundo dígito.
91
+ #
92
+ # @return [Integer]
93
+ #
94
+ def second_digit_result
95
+ 11 - @second_digit.mod_division
96
+ end
97
+
98
+ # Calcula o primeiro dígito pelo módulo 10.
99
+ # Para mais detalhes veja a classe Modulo10.
100
+ #
101
+ # @return [String]
102
+ #
103
+ def calculate_first_digit
104
+ Modulo10.new(number)
105
+ end
106
+
107
+ # Calcula o segundo dígito pelo módulo 11 usando os fatores de 2 a 7.
108
+ # Para mais detalhes veja a classe Modulo11FatorDe2a7.
109
+ #
110
+ # @return [String]
111
+ #
112
+ def calculate_second_digit
113
+ Modulo11FatorDe2a7.new("#{number}#{first_digit}")
114
+ end
115
+ end
116
+ end
117
+ end
@@ -116,16 +116,25 @@ module BoletoBancario
116
116
  17
117
117
  end
118
118
 
119
- validates :codigo_cedente, :agencia, :digito_agencia, :conta_corrente, :digito_conta_corrente, presence: true
119
+ # <b>Carteiras suportadas.</b>
120
+ #
121
+ # <b>Método criado para validar se a carteira informada é suportada.</b>
122
+ #
123
+ # @return [Array]
124
+ #
125
+ def self.carteiras_suportadas
126
+ %w[12 16 17 18]
127
+ end
120
128
 
121
- validates :digito_agencia, length: { maximum: 1 }
122
- validates :digito_conta_corrente, length: { maximum: 1 }
129
+ validates :codigo_cedente, :agencia, :digito_agencia, :conta_corrente, :digito_conta_corrente, presence: true
123
130
 
124
- # Validações de Agencia e Conta corrente.
131
+ # Validações de Agencia, Conta corrente e Carteira.
125
132
  #
126
133
  validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
127
134
  validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
128
135
 
136
+ validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
137
+
129
138
  # Validações do número do documento.
130
139
  #
131
140
  # === Número do Documento e Código do Cedente.
@@ -182,7 +191,7 @@ module BoletoBancario
182
191
  # @return [String]
183
192
  #
184
193
  def numero_documento
185
- if @numero_documento.present?
194
+ if @numero_documento.present? and numero_documento_esperado[tamanho_codigo_cedente].present?
186
195
  @numero_documento.to_s.rjust(numero_documento_esperado[tamanho_codigo_cedente], '0')
187
196
  else
188
197
  @numero_documento
@@ -214,6 +223,22 @@ module BoletoBancario
214
223
  '9'
215
224
  end
216
225
 
226
+ # Dígito do código da agência. Precisa mostrar esse dígito no boleto.
227
+ #
228
+ # @return [String] Dígito da agência calculado apartir do Modulo11FatorDe9a2RestoX.
229
+ #
230
+ def digito_agencia
231
+ Modulo11FatorDe9a2RestoX.new(agencia)
232
+ end
233
+
234
+ # Dígito da conta corrente. Precisa mostrar esse dígito no boleto.
235
+ #
236
+ # @return [String] Dígito da conta corrente calculado apartir do Modulo11FatorDe9a2RestoX.
237
+ #
238
+ def digito_conta_corrente
239
+ Modulo11FatorDe9a2RestoX.new(conta_corrente)
240
+ end
241
+
217
242
  # Campo Agencia / Código do Cedente
218
243
  # Retorna formatado a agência, digito da agência, número da conta corrente e dígito da conta.
219
244
  #
@@ -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