Module: Brcobranca::Calculo

Defined in:
lib/brcobranca/core_ext.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)


109
110
111
# File 'lib/brcobranca/core_ext.rb', line 109

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

#modulo10Object

Método padrão para cálculo de módulo 10 segundo a BACEN.

Raises:

  • (ArgumentError)


114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/brcobranca/core_ext.rb', line 114

def modulo10
  valor_inicial = self.kind_of?(String) ? self : self.to_s
  raise ArgumentError, "Somente números" unless valor_inicial.numeric?

  total = 0
  multiplicador = 2

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

Método padrão para cálculo de módulo 11 com multiplicaroes de 2 a 9 segundo a BACEN. Usado no DV do Código de Barras.

Retorna + nil + para todos os parametros que não forem String
Retorna + nil + para String em branco


144
145
146
147
148
149
# File 'lib/brcobranca/core_ext.rb', line 144

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_9to2Object

Método padrão para cálculo de módulo 11 com multiplicaroes de 9 a 2 segundo a BACEN. Usado no DV do Nosso Numero, Agência e Cedente.

Retorna + nil + para todos os parametros que nao forem String
Retorna + nil + para String em branco


134
135
136
137
138
# File 'lib/brcobranca/core_ext.rb', line 134

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

  return (total % 11 )
end

#modulo11_9to2_10_como_xObject

Retorna o dígito verificador de modulo 11(9-2) trocando retorno 10 por X.

Usado por alguns bancos.


168
169
170
171
# File 'lib/brcobranca/core_ext.rb', line 168

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

#modulo11_9to2_10_como_zeroObject

Retorna o dígito verificador de modulo 11(9-2) trocando retorno 10 por 0.

Usado por alguns bancos.


175
176
177
178
# File 'lib/brcobranca/core_ext.rb', line 175

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

#modulo_10_banespaObject

Raises:

  • (ArgumentError)


151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/brcobranca/core_ext.rb', line 151

def modulo_10_banespa
  valor_inicial = self.kind_of?(String) ? self : self.to_s
  raise ArgumentError, "Somente números" unless valor_inicial.numeric?

  fatores = [7,3,1,9,7,3,1,9,7,3]
  total = 0
  posicao = 0
  valor_inicial.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) ⇒ Object

Raises:

  • (ArgumentError)


198
199
200
201
202
203
204
205
206
207
208
209
210
# File 'lib/brcobranca/core_ext.rb', line 198

def multiplicador(fatores)
  valor_inicial = self.kind_of?(String) ? self : self.to_s
  raise ArgumentError, "Somente números" unless valor_inicial.numeric?

  total = 0
  multiplicador_posicao = 0

  valor_inicial.split(//).reverse!.each do |caracter|
    total += (caracter.to_i * fatores[multiplicador_posicao])
    multiplicador_posicao = (multiplicador_posicao < (fatores.size - 1)) ? (multiplicador_posicao + 1) : 0
  end
  total.to_i
end

#soma_digitosObject

Soma números inteiros positivos com 2 dígitos ou mais Retorna 0(zero) caso seja impossível.

Ex. 1 = 1
Ex. 11 = (1+1) = 2
Ex. 13 = (1+3) = 4


185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/brcobranca/core_ext.rb', line 185

def soma_digitos
  valor_inicial = self.kind_of?(Fixnum) ? self : self.to_i
  return 0 if valor_inicial == 0
  return valor_inicial if valor_inicial <= 9

  valor_inicial = valor_inicial.to_s
  total = 0

  0.upto(valor_inicial.size-1) {|digito| total += valor_inicial[digito,1].to_i }

  return total
end