class Identificamex::Rfc::Homoclave

Public Class Methods

new(rfc_base) click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 6
def initialize(rfc_base)
  @rfc_base = rfc_base
  @tabla_conversiones = nil
end

Public Instance Methods

siglas() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 11
def siglas
  homonimia + digito_verificador
end

Private Instance Methods

clave_diferenciadora() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 125
def clave_diferenciadora
  {
    0 => '1',
    1 => '2',
    2 => '3',
    3 => '4',
    4 => '5',
    5 => '6',
    6 => '7',
    7 => '8',
    8 => '9',
    9 => 'A',
    10 => 'B',
    11 => 'C',
    12 => 'D',
    13 => 'E',
    14 => 'F',
    15 => 'G',
    16 => 'H',
    17 => 'I',
    18 => 'J',
    19 => 'K',
    20 => 'L',
    21 => 'M',
    22 => 'N',
    23 => 'P',
    24 => 'Q',
    25 => 'R',
    26 => 'S',
    27 => 'T',
    28 => 'U',
    29 => 'V',
    30 => 'W',
    31 => 'X',
    32 => 'Y',
    33 => 'Z',
  }
end
digito_verificador() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 54
def digito_verificador
  residuo_digito_verificador(suma_letras_rfc(@rfc_base.siglas + homonimia))
end
generar_homonimia() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 23
def generar_homonimia
  suma = map_sequential_pair(numbers){|v1, v2| to_number(v1, v2) * to_number(v2)}.inject(:+)
  numero_tres_ultimos_digitos = suma.to_s[-3..-1].to_i
  cosiente = numero_tres_ultimos_digitos / 34
  residuo = numero_tres_ultimos_digitos % 34
  [clave_diferenciadora[cosiente], clave_diferenciadora[residuo]].join
end
generate_numbers() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 46
def generate_numbers
  @rfc_base.nombre_completo
  .each_char
  .map{|ch| tabla_conversiones[ch]}
  .unshift('0')
  .join
end
homonimia() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 19
def homonimia
  @homonimia ||= generar_homonimia
end
map_sequential_pair(str) { |str, str| ... } click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 31
def map_sequential_pair(str)
  size = str.size
  str.each_char.each_with_index.collect do |v, i|
    yield str[v], str[i + 1] if i + 1 <= size
  end
end
numbers() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 42
def numbers
  @numbers ||= generate_numbers
end
residuo_digito_verificador(total) click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 66
def residuo_digito_verificador(total)
  modulo_base = 11
  residuo = total % modulo_base
  if residuo == 0
    '0'
  elsif residuo == 10 || (modulo_base - residuo) == 10
    'A'
  else
    (modulo_base - residuo).to_s
  end
end
suma_letras_rfc(str) click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 58
def suma_letras_rfc(str)
  longitud_base = 13
  str = " " + str if str.length < (longitud_base - 1)
  str.each_char.each_with_index.inject(0) do |total, (ch, i)|
    total + (longitud_base - i) * tabla_digito_verificador[ch]
  end
end
tabla_conversiones() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 78
def tabla_conversiones
  return @tabla_conversiones if @tabla_conversiones
  @tabla_conversiones = {
    ' ' => '00',
    '0' => '00',
    '1' => '01',
    '2' => '02',
    '3' => '03',
    '4' => '04',
    '5' => '05',
    '6' => '06',
    '7' => '07',
    '8' => '08',
    '9' => '09',
    '&' => '10',
    'A' => '11',
    'B' => '12',
    'C' => '13',
    'D' => '14',
    'E' => '15',
    'F' => '16',
    'G' => '17',
    'H' => '18',
    'I' => '19',
    'J' => '21',
    'K' => '22',
    'L' => '23',
    'M' => '24',
    'N' => '25',
    'O' => '26',
    'P' => '27',
    'Q' => '28',
    'R' => '29',
    'S' => '32',
    'T' => '33',
    'U' => '34',
    'V' => '35',
    'W' => '36',
    'X' => '37',
    'Y' => '38',
    'Z' => '39',
    'Ñ' => '40',
  }
  @tabla_conversiones.default = '0'
  @tabla_conversiones
end
tabla_digito_verificador() click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 164
def tabla_digito_verificador
  {
    '0'=> 0,
    '1'=> 1,
    '2'=> 2,
    '3'=> 3,
    '4'=> 4,
    '5'=> 5,
    '6'=> 6,
    '7'=> 7,
    '8'=> 8,
    '9'=> 9,
    'A'=> 10,
    'B'=> 11,
    'C'=> 12,
    'D'=> 13,
    'E'=> 14,
    'F'=> 15,
    'G'=> 16,
    'H'=> 17,
    'I'=> 18,
    'J'=> 19,
    'K'=> 20,
    'L'=> 21,
    'M'=> 22,
    'N'=> 23,
    '&'=> 24,
    'O'=> 25,
    'P'=> 26,
    'Q'=> 27,
    'R'=> 28,
    'S'=> 29,
    'T'=> 30,
    'U'=> 31,
    'V'=> 32,
    'W'=> 33,
    'X'=> 34,
    'Y'=> 35,
    'Z'=> 36,
    ' '=> 37,
    'Ñ'=> 38,
  }
end
to_number(*chars) click to toggle source
# File lib/identificamex/rfc/homoclave.rb, line 38
def to_number(*chars)
  [*chars].join.to_i
end