br_boleto 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +145 -0
- data/History.txt +4 -0
- data/LICENSE +20 -0
- data/README.markdown +156 -0
- data/Rakefile +8 -0
- data/br_boleto.gemspec +26 -0
- data/lib/br_boleto.rb +87 -0
- data/lib/br_boleto/calculos/digitos.rb +35 -0
- data/lib/br_boleto/calculos/fator_vencimento.rb +129 -0
- data/lib/br_boleto/calculos/fatores_de_multiplicacao.rb +67 -0
- data/lib/br_boleto/calculos/linha_digitavel.rb +158 -0
- data/lib/br_boleto/calculos/modulo10.rb +83 -0
- data/lib/br_boleto/calculos/modulo11.rb +54 -0
- data/lib/br_boleto/calculos/modulo11_fator3197.rb +88 -0
- data/lib/br_boleto/calculos/modulo11_fator_de2a7.rb +97 -0
- data/lib/br_boleto/calculos/modulo11_fator_de2a9.rb +83 -0
- data/lib/br_boleto/calculos/modulo11_fator_de2a9_resto_zero.rb +29 -0
- data/lib/br_boleto/calculos/modulo11_fator_de9a2.rb +65 -0
- data/lib/br_boleto/calculos/modulo11_fator_de9a2_resto_x.rb +55 -0
- data/lib/br_boleto/calculos/modulo_numero_de_controle.rb +117 -0
- data/lib/br_boleto/core/boleto.rb +558 -0
- data/lib/br_boleto/core/sicoob.rb +169 -0
- data/lib/br_boleto/version.rb +8 -0
- data/test/br_boleto/calculos/digitos_test.rb +15 -0
- data/test/br_boleto/calculos/fator_vencimento_test.rb +56 -0
- data/test/br_boleto/calculos/fatores_de_multiplicacao_test.rb +66 -0
- data/test/br_boleto/calculos/linha_digitavel_test.rb +58 -0
- data/test/br_boleto/calculos/modulo10_test.rb +54 -0
- data/test/br_boleto/calculos/modulo11_fator3197_test.rb +43 -0
- data/test/br_boleto/calculos/modulo11_fator_de2a7_test.rb +44 -0
- data/test/br_boleto/calculos/modulo11_fator_de2a9_resto_zero_test.rb +40 -0
- data/test/br_boleto/calculos/modulo11_fator_de2a9_test.rb +68 -0
- data/test/br_boleto/calculos/modulo11_fator_de9a2_resto_x_test.rb +38 -0
- data/test/br_boleto/calculos/modulo11_fator_de9a2_test.rb +32 -0
- data/test/br_boleto/calculos/modulo11_test.rb +28 -0
- data/test/br_boleto/calculos/modulo_numero_de_controle_test.rb +38 -0
- data/test/br_boleto/core/boleto_test.rb +221 -0
- data/test/br_boleto/core/sicoob_test.rb +138 -0
- data/test/factories/boleto.rb +22 -0
- data/test/factories/boleto_sicoob.rb +23 -0
- data/test/inheritance/boleto_test.rb +15 -0
- data/test/inheritance/sicoob_test.rb +25 -0
- data/test/test_helper.rb +37 -0
- metadata +151 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
module BrBoleto
|
2
|
+
module Calculos
|
3
|
+
# Classe que possue a convenção de calculo do modulo 11.
|
4
|
+
# O que muda para cada classe é a forma de verificar o total do cálculo.
|
5
|
+
#
|
6
|
+
# @abstract Precisa implementar { #fatores, #calculate } nas subclasses.
|
7
|
+
#
|
8
|
+
class Modulo11 < String
|
9
|
+
# Número que será feito o cálculo do módulo 11.
|
10
|
+
#
|
11
|
+
attr_reader :number
|
12
|
+
|
13
|
+
# @param [String ou Integer] number (Corresponde ao número a ser calculado pelo Módulo 11)
|
14
|
+
# @return [String]
|
15
|
+
#
|
16
|
+
def initialize(number)
|
17
|
+
@number = number
|
18
|
+
|
19
|
+
super(calculate.to_s)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [Array] Fatores que serão multiplicados por cada digito do
|
23
|
+
# número passado como argumento no initialize.
|
24
|
+
# @raise [NotImplementedError] Precisa implementar na subclasse
|
25
|
+
#
|
26
|
+
def fatores
|
27
|
+
raise NotImplementedError, "Not implemented #fatores in subclass."
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Fixnum]
|
31
|
+
# @raise [NotImplementedError] Precisa implementar na subclasse
|
32
|
+
#
|
33
|
+
def calculate
|
34
|
+
raise NotImplementedError, "Not implemented #calculate in subclass."
|
35
|
+
end
|
36
|
+
|
37
|
+
# Realiza o cálculo retornando o resto da divisão do cálculo dos fatores por 11.
|
38
|
+
#
|
39
|
+
# @return [Fixnum] Resto da divisão por 11.
|
40
|
+
#
|
41
|
+
def mod_division
|
42
|
+
@mod_division ||= FatoresDeMultiplicacao.new(@number, fatores: fatores).sum % 11
|
43
|
+
end
|
44
|
+
|
45
|
+
# Subtrai 11 do resto da divisão para se ter o total do módulo 11.
|
46
|
+
#
|
47
|
+
# @return [Fixnum]
|
48
|
+
#
|
49
|
+
def total
|
50
|
+
@total ||= 11 - mod_division
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module BrBoleto
|
2
|
+
module Calculos
|
3
|
+
# === Módulo 11 Fator 3197
|
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 (3, 1, 9 ,7, 3, 1, 9 ,7 ... 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
|
+
# 4) Calcule o dígito verificador (DAC) através da expressão:
|
15
|
+
#
|
16
|
+
# DIGIT = 11 - Mod 11 (n)
|
17
|
+
#
|
18
|
+
# <b>OBS.:</b> Se o resto da divisão for “1” ou "0", o resultado deve ser = 0
|
19
|
+
#
|
20
|
+
# ==== Exemplo
|
21
|
+
#
|
22
|
+
# Considerando o seguinte número: '306900008281900010005'.
|
23
|
+
#
|
24
|
+
# 1) Multiplicando a seqüência de multiplicadores:
|
25
|
+
#
|
26
|
+
# 3 0 6 9 0 0 0 0 8 2 8 1 9 0 0 0 1 0 0 0 5
|
27
|
+
# * * * * * * * * * * * * * * * * * * * * *
|
28
|
+
# 3 1 9 7 3 1 9 7 3 1 9 7 3 1 9 7 3 1 9 7 3
|
29
|
+
#
|
30
|
+
# 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
|
31
|
+
#
|
32
|
+
# 9 0 54 63 0 0 0 0 24 2 72 7 27 0 0 0 3 0 0 0 15
|
33
|
+
# # => 204
|
34
|
+
#
|
35
|
+
# 3) Determina-se o resto da Divisão:
|
36
|
+
#
|
37
|
+
# 204 % 11
|
38
|
+
# # => 55
|
39
|
+
# Como é maior que 10, então pega-se 60-55 = 5
|
40
|
+
# Por exemplo, se fosse 27, então pegaria 30-27 = 3
|
41
|
+
#
|
42
|
+
# 4) Calcula-se o DAC:
|
43
|
+
#
|
44
|
+
# 11 - 5
|
45
|
+
# # => 6 =============> Resultado final retornado.
|
46
|
+
#
|
47
|
+
# @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 2 a 7.
|
48
|
+
# @return [String] Retorna o resultado do cálculo descrito acima.
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
#
|
52
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('20')
|
53
|
+
# # => '5'
|
54
|
+
#
|
55
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('64')
|
56
|
+
# # => '7'
|
57
|
+
#
|
58
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('26')
|
59
|
+
# # => '4'
|
60
|
+
#
|
61
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('6')
|
62
|
+
# # => 'P'
|
63
|
+
#
|
64
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('14')
|
65
|
+
# # => '0'
|
66
|
+
#
|
67
|
+
class Modulo11Fator3197 < Modulo11
|
68
|
+
# Sequência numérica 3197 que será feito a multiplicação de cada dígito
|
69
|
+
# do número passado no #initialize.
|
70
|
+
#
|
71
|
+
# @return [Array] Sequência numérica
|
72
|
+
#
|
73
|
+
def fatores
|
74
|
+
[3,7,9,1]
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [Fixnum]
|
78
|
+
#
|
79
|
+
def calculate
|
80
|
+
if mod_division.equal?(1) or mod_division.equal?(0)
|
81
|
+
0
|
82
|
+
else
|
83
|
+
total
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module BrBoleto
|
2
|
+
module Calculos
|
3
|
+
# === Módulo 11 Fator de 2 a 7
|
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 2 a 7 (2, 3, 4, 5, 6, 7 ... 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
|
+
# 4) Calcule o dígito verificador (DAC) através da expressão:
|
15
|
+
#
|
16
|
+
# DIGIT = 11 - Mod 11 (n)
|
17
|
+
#
|
18
|
+
# <b>OBS.:</b> Se o resto da divisão for “1”, desprezar a diferença entre o divisor
|
19
|
+
# menos o resto que será “10” e considerar o dígito como “P”.
|
20
|
+
#
|
21
|
+
# <b>OBS.:</b> Se o resto da divisão for “0”, desprezar o cálculo de subtração entre
|
22
|
+
# divisor e resto, e considerar o “0” como dígito.
|
23
|
+
#
|
24
|
+
# ==== Exemplo
|
25
|
+
#
|
26
|
+
# Considerando o seguinte número: '89234560'.
|
27
|
+
#
|
28
|
+
# 1) Multiplicando a seqüência de multiplicadores:
|
29
|
+
#
|
30
|
+
# 1 9 0 0 0 0 0 0 0 0 0 0 2
|
31
|
+
# * * * * * * * * * * * * *
|
32
|
+
# 2 7 6 5 4 3 2 7 6 5 4 3 2
|
33
|
+
#
|
34
|
+
# 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
|
35
|
+
#
|
36
|
+
# 2 + 63 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4
|
37
|
+
# # => 69
|
38
|
+
#
|
39
|
+
# 3) Determina-se o resto da Divisão:
|
40
|
+
#
|
41
|
+
# 69 % 11
|
42
|
+
# # => 3
|
43
|
+
#
|
44
|
+
# 4) Calcula-se o DAC:
|
45
|
+
#
|
46
|
+
# 11 - 3
|
47
|
+
# # => 8 =============> Resultado final retornado.
|
48
|
+
#
|
49
|
+
# @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 2 a 7.
|
50
|
+
# @return [String] Retorna o resultado do cálculo descrito acima.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
#
|
54
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('20')
|
55
|
+
# # => '5'
|
56
|
+
#
|
57
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('64')
|
58
|
+
# # => '7'
|
59
|
+
#
|
60
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('26')
|
61
|
+
# # => '4'
|
62
|
+
#
|
63
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('6')
|
64
|
+
# # => 'P'
|
65
|
+
#
|
66
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a7.new('14')
|
67
|
+
# # => '0'
|
68
|
+
#
|
69
|
+
class Modulo11FatorDe2a7 < Modulo11
|
70
|
+
# Sequência numérica de 2 a 7 que será feito a multiplicação de cada dígito
|
71
|
+
# do número passado no #initialize.
|
72
|
+
#
|
73
|
+
# @return [Array] Sequência numérica
|
74
|
+
#
|
75
|
+
def fatores
|
76
|
+
[2, 3, 4, 5, 6, 7]
|
77
|
+
end
|
78
|
+
|
79
|
+
# Calcula o número pelos fatores de multiplicação de 2 a 7.
|
80
|
+
# Depois calcula o resto da divisão por 11 e subtrai por 11.
|
81
|
+
# Se o resultado desse cálculo for igual a 11, considere DAC = 0.
|
82
|
+
# Se o resultado desse cálculo for igual a 10, considere DAC = P.
|
83
|
+
#
|
84
|
+
# @return [Fixnum]
|
85
|
+
#
|
86
|
+
def calculate
|
87
|
+
return 0 if total.equal?(11)
|
88
|
+
|
89
|
+
if total == 10
|
90
|
+
'P'
|
91
|
+
else
|
92
|
+
total
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module BrBoleto
|
3
|
+
module Calculos
|
4
|
+
# === Módulo 11 Fator de 2 a 9
|
5
|
+
#
|
6
|
+
# === Passos
|
7
|
+
#
|
8
|
+
# 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda,
|
9
|
+
# pela seqüência numérica de 2 a 9 (2, 3, 4, 5, 6, 7, 8, 9 ... e assim por diante).
|
10
|
+
#
|
11
|
+
# 2) Some o resultado de cada produto efetuado e determine o total como (N).
|
12
|
+
#
|
13
|
+
# 3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
|
14
|
+
#
|
15
|
+
# 4) Calcule o dígito verificador (DAC) através da expressão:
|
16
|
+
#
|
17
|
+
# DIGIT = 11 - Mod 11 (n)
|
18
|
+
#
|
19
|
+
# <b>OBS.:</b> Se o resultado desta expressão for igual a 0, 1, 10 ou 11, considere DAC = 1.
|
20
|
+
#
|
21
|
+
# ==== Exemplo
|
22
|
+
#
|
23
|
+
# Considerando o seguinte número: '89234560'.
|
24
|
+
#
|
25
|
+
# 1) Multiplicando a seqüência de multiplicadores:
|
26
|
+
#
|
27
|
+
# 8 9 2 3 4 5 6 0
|
28
|
+
# * * * * * * * *
|
29
|
+
# 9 8 7 6 5 4 3 2
|
30
|
+
#
|
31
|
+
# 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
|
32
|
+
#
|
33
|
+
# 72 + 72 + 14 + 18 + 20 + 20 + 18 + 0
|
34
|
+
# # => 234
|
35
|
+
#
|
36
|
+
# 3) Determina-se o resto da Divisão:
|
37
|
+
#
|
38
|
+
# 234 % 11
|
39
|
+
# # => 3
|
40
|
+
#
|
41
|
+
# 4) Calcula-se o DAC:
|
42
|
+
#
|
43
|
+
# 11 - 3
|
44
|
+
# # => 8 =============> Resultado final retornado.
|
45
|
+
#
|
46
|
+
# @param [String]: Corresponde ao número a ser calculado o Módulo 11 no fator de 2 a 9.
|
47
|
+
# @return [String] Retorna o resultado do cálculo descrito acima.
|
48
|
+
#
|
49
|
+
# @example
|
50
|
+
#
|
51
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a9.new('1')
|
52
|
+
# # => '9'
|
53
|
+
#
|
54
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a9.new('91')
|
55
|
+
# # => '4'
|
56
|
+
#
|
57
|
+
# BrBoleto::Calculos::Modulo11FatorDe2a9.new('189')
|
58
|
+
# # => '9'
|
59
|
+
#
|
60
|
+
class Modulo11FatorDe2a9 < Modulo11
|
61
|
+
# Sequência numérica de 2 a 9 que será feito a multiplicação de cada dígito
|
62
|
+
# do número passado no #initialize.
|
63
|
+
#
|
64
|
+
# @return [Array] Sequência numérica
|
65
|
+
#
|
66
|
+
def fatores
|
67
|
+
[2, 3, 4, 5, 6, 7, 8, 9]
|
68
|
+
end
|
69
|
+
|
70
|
+
# Calcula o número pelos fatores de multiplicação de 2 a 9.
|
71
|
+
# Depois calcula o resto da divisão por 11 e subtrai por 11.
|
72
|
+
# Se o resultado desse cálculo for igual a 0, 1, 10 ou 11, considere DAC = 1.
|
73
|
+
#
|
74
|
+
# @return [Fixnum]
|
75
|
+
#
|
76
|
+
def calculate
|
77
|
+
return 1 if total > 9
|
78
|
+
|
79
|
+
total
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module BrBoleto
|
2
|
+
module Calculos
|
3
|
+
# Classe responsável por calcular o módulo 11 com fatores de 2 a 9.
|
4
|
+
# <b>Essa classe difere da outra com Modulo11FatorDe2a9, no momento de verificar o resto da divisão por 11.</b>
|
5
|
+
#
|
6
|
+
# <b>Para mais detalhes veja a classe Modulo11FatorDe2a9.</b>
|
7
|
+
#
|
8
|
+
class Modulo11FatorDe2a9RestoZero < Modulo11FatorDe2a9
|
9
|
+
# Realiza o cálculo do módulo 11 com fatores de 2 a 9.
|
10
|
+
#
|
11
|
+
# === Resto Da divisão por 11
|
12
|
+
#
|
13
|
+
# * Se o resto da divisão por 11 for igual a 10, o digito será '1' (um),
|
14
|
+
# * Se o resto da divisão por 11 for igual a 1 (um) ou 0 (zero) o digito será 0 (zero).
|
15
|
+
#
|
16
|
+
# Qualquer “RESTO” diferente de “0, 1 ou 10”, subtrair o resto de 11 para obter o digíto.
|
17
|
+
#
|
18
|
+
# @return [Fixnum] Resultado da subtração ou resultado da verificação do resto da divisão.
|
19
|
+
#
|
20
|
+
def calculate
|
21
|
+
if mod_division.equal?(1) or mod_division.equal?(0)
|
22
|
+
0
|
23
|
+
else
|
24
|
+
total
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module BrBoleto
|
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
|
+
# BrBoleto::Calculos::Modulo11FatorDe9a2.new('12345')
|
40
|
+
# # => '5'
|
41
|
+
#
|
42
|
+
# BrBoleto::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
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module BrBoleto
|
2
|
+
module Calculos
|
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>
|
5
|
+
#
|
6
|
+
# <b>Para mais detalhes veja a classe Modulo11FatorDe9a2.</b>
|
7
|
+
#
|
8
|
+
# ==== Exemplo 10 como resto da divisão
|
9
|
+
#
|
10
|
+
# Considerando o seguinte número: '100008'.
|
11
|
+
#
|
12
|
+
# 1) Multiplicando a seqüência de multiplicadores:
|
13
|
+
#
|
14
|
+
# 1 0 0 0 0 8
|
15
|
+
# * * * * * *
|
16
|
+
# 4 5 6 7 8 9
|
17
|
+
#
|
18
|
+
# 2) Soma-se o resultado dos produtos obtidos no item “1” acima:
|
19
|
+
#
|
20
|
+
# 4 + 0 + 0 + 0 + 0 + 72
|
21
|
+
# # => 76
|
22
|
+
#
|
23
|
+
# 3) Determina-se o resto da Divisão:
|
24
|
+
#
|
25
|
+
# 76 % 11
|
26
|
+
# # => 10
|
27
|
+
#
|
28
|
+
# 4) Quando o resultado for '10', o dígito será:
|
29
|
+
#
|
30
|
+
# resultado == 10
|
31
|
+
# # => 'X' =============> Resultado final retornado.
|
32
|
+
#
|
33
|
+
# @example
|
34
|
+
#
|
35
|
+
# BrBoleto::Calculos::Modulo11FatorDe9a2RestoX.new('184122')
|
36
|
+
# # => 'X'
|
37
|
+
#
|
38
|
+
class Modulo11FatorDe9a2RestoX < Modulo11FatorDe9a2
|
39
|
+
# Calcula o número pelos fatores de multiplicação de 9 a 2.
|
40
|
+
# Depois calcula o resto da divisão por 11.
|
41
|
+
# Se o resultado desse cálculo for igual a 10, então o DAC = X.
|
42
|
+
# Se o resultado desse cálculo for menor que 10, retornar o resultado.
|
43
|
+
#
|
44
|
+
# @return [Fixnum]
|
45
|
+
#
|
46
|
+
def calculate
|
47
|
+
if mod_division.equal?(10)
|
48
|
+
'X'
|
49
|
+
else
|
50
|
+
mod_division
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|