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