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