Module: Brcobranca::Calculo

Defined in:
lib/brcobranca/calculo.rb

Overview

Métodos auxiliares de cálculos

Instance Method Summary collapse

Instance Method Details

#is_number?Boolean

Verifica se String só contem caracteres numéricos.

Returns:

  • (Boolean)


81
82
83
# File 'lib/brcobranca/calculo.rb', line 81

def is_number?
  self.to_s.empty? ? false : (self.to_s =~ (/\D/)).nil?
end

#modulo10Integer

Calcula módulo 10 segundo a BACEN.

Returns:

  • (Integer)

Raises:

  • (ArgumentError)

    Caso não seja um número inteiro.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/brcobranca/calculo.rb', line 10

def modulo10
  raise ArgumentError, "Número inválido" unless self.is_number?

  total = 0
  multiplicador = 2

  self.to_s.split(//).reverse!.each do |caracter|
    total += (caracter.to_i * multiplicador).soma_digitos
    multiplicador = multiplicador == 2 ? 1 : 2
  end

  valor = (10 - (total % 10))
  valor == 10 ? 0 : valor
end

#modulo11_2to9Integer

Calcula módulo 11 com multiplicaroes de 2 a 9 segundo a BACEN.

Returns:

  • (Integer)


55
56
57
58
59
60
# File 'lib/brcobranca/calculo.rb', line 55

def modulo11_2to9
  total = self.multiplicador([2,3,4,5,6,7,8,9])

  valor = (11 - (total % 11))
  return [0,10,11].include?(valor) ? 1 : valor
end

#modulo11_9to2Integer

Calcula módulo 11 com multiplicaroes de 9 a 2 segundo a BACEN.

Returns:

  • (Integer)


46
47
48
49
50
# File 'lib/brcobranca/calculo.rb', line 46

def modulo11_9to2
  total = self.multiplicador([9,8,7,6,5,4,3,2])

  return (total % 11 )
end

#modulo11_9to2_10_como_xInteger, String

Calcula módulo 11 com multiplicaroes de 9 a 2 trocando retorno 10 por X.

Returns:

  • (Integer, String)

    Caso resultado for 10, retorna X.



65
66
67
68
# File 'lib/brcobranca/calculo.rb', line 65

def modulo11_9to2_10_como_x
  valor = self.modulo11_9to2
  valor == 10 ? "X" : valor
end

#modulo11_9to2_10_como_zeroInteger

Calcula módulo 11 com multiplicaroes de 9 a 2 trocando retorno 10 por 0.

Returns:

  • (Integer)


73
74
75
76
# File 'lib/brcobranca/calculo.rb', line 73

def modulo11_9to2_10_como_zero
  valor = self.modulo11_9to2
  valor == 10 ? 0 : valor
end

#modulo_10_banespaInteger

Calcula módulo 10 do Banespa.

Returns:

  • (Integer)

Raises:

  • (ArgumentError)

    Caso não seja um número inteiro.



29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/brcobranca/calculo.rb', line 29

def modulo_10_banespa
  raise ArgumentError, "Número inválido" unless self.is_number?

  fatores = [7,3,1,9,7,3,1,9,7,3]
  total = 0
  posicao = 0
  self.to_s.split(//).each do |digito|
    total += (digito.to_i * fatores[posicao]).to_s.split(//)[-1].to_i
    posicao = (posicao < (fatores.size - 1)) ? (posicao + 1) : 0
  end
  dv = 10 - total.to_s.split(//)[-1].to_i
  dv == 10 ? 0 : dv
end

#multiplicador(fatores, &block) ⇒ Integer

Faz a multiplicação de um número pelos fatores passados como parâmetro.

Parameters:

  • (Array)

Returns:

  • (Integer)

Raises:

  • (ArgumentError)

    Caso não seja um número inteiro.



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/brcobranca/calculo.rb', line 110

def multiplicador(fatores, &block)
  raise ArgumentError, "Número inválido" unless self.is_number?

  total = 0
  multiplicador_posicao = 0

  self.to_s.split(//).reverse!.each do |caracter|
    fator = fatores[multiplicador_posicao]
    total += if block_given?
      yield(caracter, fator)
    else
      (caracter.to_i * fator)
    end
    multiplicador_posicao = (multiplicador_posicao < (fatores.size - 1)) ? (multiplicador_posicao + 1) : 0
  end
  total
end

#soma_digitosInteger

Soma dígitos de números inteiros positivos com 2 dígitos ou mais.

Examples:

1 #=> 1
11 (1+1) #=> 2
13 (1+3) #=> 4

Returns:

  • (Integer)


92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/brcobranca/calculo.rb', line 92

def soma_digitos
  total = case self.to_i
  when (0..9)
    self
  else
    numero = self.to_s
    total = 0
    0.upto(numero.size-1) {|digito| total += numero[digito,1].to_i }
    total
  end
  total.to_i
end