Module: Brcobranca::Calculo

Defined in:
lib/brcobranca/calculo.rb

Overview

Métodos auxiliares de cálculos

Instance Method Summary collapse

Instance Method Details

#duplo_digitoString

Calcula duplo dígito com modulo 10 e 11

Returns:

  • (String)

Raises:

  • (ArgumentError)

    Caso não seja um número inteiro.


90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/brcobranca/calculo.rb', line 90

def duplo_digito
  raise ArgumentError, 'Número inválido' unless is_number?

  digito_1 = modulo10
  digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) { |total| (total < 11 ? total : total % 11) }

  while digito_2 == 1
    digito_1 = if digito_1 == 9
                 0
               else
                 digito_1 + 1
               end

    digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) { |total| (total < 11 ? total : total % 11) }
  end

  digito_2 = 11 - digito_2 if digito_2 != 0

  "#{digito_1}#{digito_2}"
end

#is_number?Boolean

Verifica se String só contem caracteres numéricos.

Returns:

  • (Boolean)

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

def is_number?
  to_s.empty? ? false : (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.


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

def modulo10
  raise ArgumentError, 'Número inválido' unless is_number?

  total = 0
  multiplicador = 2

  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(options = {}, &_block) ⇒ Integer

Calcula o módulo 11 segundo a BACEN

Parameters:

  • options (Hash) (defaults to: {})

    Opções para o cálculo do módulo

Options Hash (options):

  • :mapeamento (Hash)

    Mapeamento do valor final. Ex: { 10 => “X” }. Padrão: {}

  • :multiplicador (Array)

    Números a serem utilizados na multiplicação da direita para a esquerda. Padrão: [9 até 2]

Returns:

  • (Integer)

Raises:

  • (ArgumentError)

    Caso não seja um número inteiro.


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

def modulo11(options = {}, &_block)
  options[:mapeamento] ||= {}
  options[:multiplicador] ||= [9, 8, 7, 6, 5, 4, 3, 2]

  total = multiplicador(fatores: options[:multiplicador], reverse: options[:reverse])
  valor = block_given? ? yield(total) : (total % 11)

  options[:mapeamento][valor] || valor
end

#multiplicador(options = {}, &_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.


69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/brcobranca/calculo.rb', line 69

def multiplicador(options = {}, &_block)
  raise ArgumentError, 'Número inválido' unless is_number?
  raise ArgumentError, 'Fatores não podem estar em branco' unless options[:fatores]

  total = 0
  multiplicador_posicao = 0
  fatores = options[:fatores]
  numeros = options[:reverse].nil? ? to_s.split(//).reverse! : to_s.split(//)

  numeros.each do |caracter|
    fator = fatores[multiplicador_posicao]
    total += block_given? ? yield(caracter, fator) : (caracter.to_i * fator)
    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 (-9 ) #=> 2
13 (-9 ) #=> 4
18 (-9 ) #=> 9

Returns:

  • (Integer)

58
59
60
61
62
# File 'lib/brcobranca/calculo.rb', line 58

def soma_digitos
  total = self.to_i
  total = total - 9 if total > 9
  total
end