Class: BoletoBancario::Calculos::ModuloNumeroDeControle
- Inherits:
-
String
- Object
- String
- BoletoBancario::Calculos::ModuloNumeroDeControle
- Defined in:
- lib/boleto_bancario/calculos/modulo_numero_de_controle.rb
Overview
Cálculo do Módulo do Número de Controle (2 dígitos)
Tipo de cálculo usado pelo Banco Banrisul.
Cálculo do Primeiro Dígito
1) Multiplica-se cada algarismo do campo pela seqüência de multiplicadores 2, 1, 2, 1, 2, 1 …, posicionados da direita para a esquerda.
2) Some individualmente, os algarismos dos resultados dos produtos, obtendo-se o total (N).
3) Divida o total encontrado (N) por 10, e determine o resto da divisão como MOD 10 (N).
4) Encontre o DAC através da seguinte expressão:
DAC = 10 - Mod 10 (n)
Cálculo do segundo dígito
# 1) Tomando-se os algarismos multiplique-os, iniciando-se da direita para a esquerda, pela seqüência numérica de 2 a 7 (2, 3, 4, 5, 6, 7 … e assim por diante).
2) Some o resultado de cada produto efetuado e determine o total como (N).
3) Divida o total (N) por 11 e determine o resto obtido da divisão como Mod 11(N).
4) Calcule o dígito verificador (DAC) através da expressão:
DIGIT = 11 - Mod 11 (n)
Observações:
Caso o ‘resto’ obtido no cálculo do módulo ‘11’ seja igual a ‘1’, considera-se o DV inválido. Soma-se, então, “1” ao DV obtido do módulo “10” e refaz-se o cálculo do módulo “11”. Se o dígito obtido pelo módulo “10” era igual a “9”, considera-se então (9+1=10) DV inválido. Neste caso, o DV do módulo “10” automaticamente será igual a “0” e procede-se assim novo cálculo pelo módulo “11”.
Exemplo com Primeiro Dígito Inválido
Dado o número ‘00009194’:
O somatório do primeiro cálculo é igual a ‘28’ e o Resto é igual a ‘8’. Portanto, o primeiro DV é igual a 10 - 8 ou DV = 2.
O somatório do segundo cálculo é igual a ‘111’ e o Resto é, neste caso, igual a ‘1’. Portanto, o segundo DV é inválido (11 - 1 = 10).
Neste caso, soma-se ‘1’ ao DV obtido do primeiro cálculo:
2 + 1
# ======> 3 # Primeiro dígito do número de controle
Agora, efetua-se novo cálculo do módulo 11, agora com o novo número, ou seja, 000091943:
A somatório do segundo cálculo é igual a ‘113’ e o Resto igual a ‘3’. Portanto, o segundo DV é igual a:
11 - 3
# ====> 8 # Segundo dígito do número de controle
Neste exemplo, o número de controle será ‘38’.
Instance Attribute Summary collapse
-
#first_digit ⇒ Object
readonly
Returns the value of attribute first_digit.
-
#number ⇒ Object
readonly
Returns the value of attribute number.
-
#second_digit ⇒ Object
readonly
Returns the value of attribute second_digit.
Instance Method Summary collapse
-
#calculate ⇒ String
Retorna 2 dígitos verificando o segundo dígito se é válido ou não.
-
#calculate_first_digit ⇒ String
Calcula o primeiro dígito pelo módulo 10.
-
#calculate_second_digit ⇒ String
Calcula o segundo dígito pelo módulo 11 usando os fatores de 2 a 7.
-
#initialize(number) ⇒ ModuloNumeroDeControle
constructor
A new instance of ModuloNumeroDeControle.
-
#second_digit_result ⇒ Integer
Retorna a subtração de 11 pelo resto da divisão por 11 do segundo dígito.
Constructor Details
#initialize(number) ⇒ ModuloNumeroDeControle
Returns a new instance of ModuloNumeroDeControle.
68 69 70 71 72 73 74 |
# File 'lib/boleto_bancario/calculos/modulo_numero_de_controle.rb', line 68 def initialize(number) @number = number @first_digit = calculate_first_digit @second_digit = calculate_second_digit super(calculate) end |
Instance Attribute Details
#first_digit ⇒ Object (readonly)
Returns the value of attribute first_digit.
66 67 68 |
# File 'lib/boleto_bancario/calculos/modulo_numero_de_controle.rb', line 66 def first_digit @first_digit end |
#number ⇒ Object (readonly)
Returns the value of attribute number.
66 67 68 |
# File 'lib/boleto_bancario/calculos/modulo_numero_de_controle.rb', line 66 def number @number end |
#second_digit ⇒ Object (readonly)
Returns the value of attribute second_digit.
66 67 68 |
# File 'lib/boleto_bancario/calculos/modulo_numero_de_controle.rb', line 66 def second_digit @second_digit end |
Instance Method Details
#calculate ⇒ String
Retorna 2 dígitos verificando o segundo dígito se é válido ou não.
80 81 82 83 84 85 86 87 88 |
# File 'lib/boleto_bancario/calculos/modulo_numero_de_controle.rb', line 80 def calculate if second_digit_result.equal?(10) @first_digit = first_digit.to_i + 1 @first_digit = 0 if @first_digit.equal?(10) @second_digit = calculate_second_digit end "#{first_digit}#{second_digit}" end |
#calculate_first_digit ⇒ String
Calcula o primeiro dígito pelo módulo 10. Para mais detalhes veja a classe Modulo10.
103 104 105 |
# File 'lib/boleto_bancario/calculos/modulo_numero_de_controle.rb', line 103 def calculate_first_digit Modulo10.new(number) end |
#calculate_second_digit ⇒ String
Calcula o segundo dígito pelo módulo 11 usando os fatores de 2 a 7. Para mais detalhes veja a classe Modulo11FatorDe2a7.
112 113 114 |
# File 'lib/boleto_bancario/calculos/modulo_numero_de_controle.rb', line 112 def calculate_second_digit Modulo11FatorDe2a7.new("#{number}#{first_digit}") end |
#second_digit_result ⇒ Integer
Retorna a subtração de 11 pelo resto da divisão por 11 do segundo dígito.
94 95 96 |
# File 'lib/boleto_bancario/calculos/modulo_numero_de_controle.rb', line 94 def second_digit_result 11 - @second_digit.mod_division end |