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.
- checksums.yaml +7 -0
- data/.gitignore +3 -2
- data/.travis.yml +10 -0
- data/Changelog.markdown +4 -0
- data/Gemfile +1 -1
- data/Planning.markdown +18 -86
- data/README.markdown +107 -55
- data/Rakefile +7 -1
- data/TODO.markdown +15 -1
- data/boleto_bancario.gemspec +7 -3
- data/lib/boleto_bancario.rb +27 -15
- data/lib/boleto_bancario/calculos/modulo11_fator_de9a2.rb +65 -0
- data/lib/boleto_bancario/calculos/modulo11_fator_de9a2_resto_x.rb +5 -51
- data/lib/boleto_bancario/calculos/modulo_numero_de_controle.rb +117 -0
- data/lib/boleto_bancario/core/banco_brasil.rb +30 -5
- data/lib/boleto_bancario/core/banrisul.rb +182 -0
- data/lib/boleto_bancario/core/boleto.rb +67 -34
- data/lib/boleto_bancario/core/bradesco.rb +28 -16
- data/lib/boleto_bancario/core/caixa.rb +233 -0
- data/lib/boleto_bancario/core/hsbc.rb +170 -0
- data/lib/boleto_bancario/core/itau.rb +20 -10
- data/lib/boleto_bancario/core/real.rb +177 -0
- data/lib/boleto_bancario/core/santander.rb +19 -22
- data/lib/boleto_bancario/core/sicoob.rb +172 -0
- data/lib/boleto_bancario/core/sicredi.rb +290 -0
- data/lib/boleto_bancario/version.rb +1 -2
- data/spec/boleto_bancario/calculos/modulo10_spec.rb +4 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de2a9_spec.rb +6 -0
- data/spec/boleto_bancario/calculos/modulo11_fator_de9a2_spec.rb +31 -0
- data/spec/boleto_bancario/calculos/modulo_numero_de_controle_spec.rb +37 -0
- data/spec/boleto_bancario/core/banco_brasil_spec.rb +59 -65
- data/spec/boleto_bancario/core/banrisul_spec.rb +129 -0
- data/spec/boleto_bancario/core/boleto_spec.rb +148 -32
- data/spec/boleto_bancario/core/bradesco_spec.rb +29 -36
- data/spec/boleto_bancario/core/caixa_spec.rb +111 -0
- data/spec/boleto_bancario/core/hsbc_spec.rb +72 -0
- data/spec/boleto_bancario/core/itau_spec.rb +33 -36
- data/spec/boleto_bancario/core/real_spec.rb +104 -0
- data/spec/boleto_bancario/core/santander_spec.rb +26 -24
- data/spec/boleto_bancario/core/sicoob_spec.rb +111 -0
- data/spec/boleto_bancario/core/sicredi_spec.rb +149 -0
- data/spec/inheritance/banco_brasil_spec.rb +22 -0
- data/spec/inheritance/banrisul_spec.rb +22 -0
- data/spec/inheritance/boleto_spec.rb +15 -0
- data/spec/inheritance/bradesco_spec.rb +22 -0
- data/spec/inheritance/caixa_spec.rb +22 -0
- data/spec/inheritance/hsbc_spec.rb +22 -0
- data/spec/inheritance/itau_spec.rb +22 -0
- data/spec/inheritance/real_spec.rb +22 -0
- data/spec/inheritance/santander_spec.rb +22 -0
- data/spec/inheritance/sicoob_spec.rb +22 -0
- data/spec/inheritance/sicredi_spec.rb +22 -0
- data/spec/shared_examples/boleto_bancario_shared_example.rb +21 -34
- data/spec/spec_helper.rb +2 -2
- metadata +119 -47
- data/.rvmrc +0 -1
data/TODO.markdown
CHANGED
@@ -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
|
-
*
|
19
|
+
* Criar páginas explicando cada banco.
|
data/boleto_bancario.gemspec
CHANGED
@@ -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 "
|
19
|
-
gem.add_dependency "
|
20
|
-
gem.
|
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"
|
data/lib/boleto_bancario.rb
CHANGED
@@ -57,26 +57,38 @@ module BoletoBancario
|
|
57
57
|
# você precise mudar os nomes dos campos nos boletos)
|
58
58
|
#
|
59
59
|
module Core
|
60
|
-
|
61
|
-
|
62
|
-
autoload :
|
63
|
-
autoload :
|
64
|
-
autoload :
|
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
|
-
|
71
|
-
|
72
|
-
autoload :
|
73
|
-
autoload :
|
74
|
-
autoload :
|
75
|
-
autoload :
|
76
|
-
autoload :
|
77
|
-
autoload :
|
78
|
-
autoload :
|
79
|
-
autoload :
|
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
|
-
#
|
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
|
-
#
|
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('
|
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 <
|
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
|
-
|
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,
|
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
|
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
|