class IdEcuador::Id

Clase que va a analizar la cédula. Recibe un id y unas opciones @attr_reader [Array] errors Los errores que tiene el ID. Array vacío si es un ID válido

@attr_reader [String] tipo_id El tipo de identificación. Puede ser:

- "Cédula Persona natural"
- "RUC Persona natural"
- "Sociedad pública"
- "Sociedad privada o extranjera"

@attr_reader [Fixnum] codigo_provincia El código de la provincia del ID ingresado

@attr_reader [Symbol] tipo_id_sym El tipo de identificación en símbolo. Puede ser:

- :ruc
- :cedula
- :sociedad_publica
- :sociedad_privada

Attributes

codigo_provincia[R]
errors[R]
tipo_id[R]
tipo_id_sym[R]

Public Class Methods

new(id="", options={}) click to toggle source

@param [String] id El ID que se va a analizar @param [Hash] options Las opciones @option options [Boolean] :auto_validate Validar automáticamente el ID al instanciar. true por defecto

# File lib/id_ecuador/id.rb, line 28
def initialize(id="", options={})
  @id = id.to_s
  @errors = []
  
  defaults = {
    auto_validate: true
  }
  @options = defaults.merge options
  validate! if @options[:auto_validate]
end

Public Instance Methods

already_validated() click to toggle source

@return [Boolean] Si el ID ya ha sido validado

# File lib/id_ecuador/id.rb, line 53
def already_validated
  !!@already_validated
end
valid?() click to toggle source

@return [Boolean] Si es un ID válido o no

# File lib/id_ecuador/id.rb, line 40
def valid?
  validate! unless already_validated
  @errors.empty?
end
validate!() click to toggle source

@return [self] Método que valida

# File lib/id_ecuador/id.rb, line 46
def validate!
  @already_validated = true
  validate_length and evaluate_province_code and evaluate_third_digit
  self
end

Protected Instance Methods

do_sums!() click to toggle source
# File lib/id_ecuador/id.rb, line 164
def do_sums!
  sum = 0
  @products.each do |product|
    sum += product
  end
  res = sum % @modulus
  digit = if res == 0 then 0 else @modulus - res end
  unless digit == @verifier
    @errors << "ID inválida"
  end
  self
end
evaluate_province_code() click to toggle source
# File lib/id_ecuador/id.rb, line 66
def evaluate_province_code
  provinces = 22
  code = @id.slice(0,2).to_i
  if code < 1 or code > provinces
    @errors << "Código de provincia incorrecto"
    false
  else
    @codigo_provincia = code
    true
  end
end
evaluate_sums_for_persona_natural!() click to toggle source
# File lib/id_ecuador/id.rb, line 130
def evaluate_sums_for_persona_natural!
  @modulus = 10
  @verifier = @id.slice(9,1).to_i
  p = 2
  @id.slice(0,9).chars do |c|
    product = c.to_i * p
    if product >= 10 then product -= 9 end
    @products << product
    p = if p == 2 then 1 else 2 end
  end
  do_sums!
  self
end
evaluate_sums_for_sociedad_privada!() click to toggle source
# File lib/id_ecuador/id.rb, line 154
def evaluate_sums_for_sociedad_privada!
  @modulus = 11
  @verifier = @id.slice(9,1).to_i
  multipliers = [4, 3, 2, 7, 6, 5, 4, 3, 2]
  (0..8).each do |i|
    @products[i] = @id[i].to_i * multipliers[i]
  end
  do_sums!
  self
end
evaluate_sums_for_sociedad_publica!() click to toggle source
# File lib/id_ecuador/id.rb, line 143
def evaluate_sums_for_sociedad_publica!
  @modulus = 11
  @verifier = @id.slice(8,1).to_i
  multipliers = [3, 2, 7, 6, 5, 4, 3, 2]
  (0..7).each do |i|
    @products[i] = @id[i].to_i * multipliers[i]
  end
  @products[8] = 0
  do_sums!
  self
end
evaluate_third_digit() click to toggle source
# File lib/id_ecuador/id.rb, line 77
def evaluate_third_digit
  @third_digit = @id[2].to_i

  # to keep products in next method:
  @products = []

  if [7, 8].include?(@third_digit)
    @errors << "Tercer dígito es inválido"
    return false
  elsif @third_digit < 6
    if @id.length > 10
      @tipo_id = "RUC Persona natural"
      @tipo_id_sym = :ruc
    else
      @tipo_id = "Cédula Persona natural"
      @tipo_id_sym = :cedula
    end
    validate_last_digits_for_persona_natural and evaluate_sums_for_persona_natural!
  elsif @third_digit == 6
    @tipo_id = "Sociedad pública"
    @tipo_id_sym = :sociedad_publica
    validate_last_digits_for_sociedad_publica and evaluate_sums_for_sociedad_publica!
  elsif @third_digit == 9
    @tipo_id = "Sociedad privada o extranjera"
    @tipo_id_sym = :sociedad_privada
    validate_last_digits_for_sociedad_privada and evaluate_sums_for_sociedad_privada!
  end
  return true
end
validate_last_digits_for_persona_natural() click to toggle source
# File lib/id_ecuador/id.rb, line 106
def validate_last_digits_for_persona_natural
  if @id.length > 10 and @id.slice(10,3) != "001"
    @errors << "RUC de persona natural debe terminar en 001"
    false
  else
    true
  end
end
validate_last_digits_for_sociedad_privada() click to toggle source
# File lib/id_ecuador/id.rb, line 122
def validate_last_digits_for_sociedad_privada
  if @id.slice(10,3) != "001"
    @errors << "RUC de entidad privada o extranjera debe terminar en 001"
    false
  else
    true
  end
end
validate_last_digits_for_sociedad_publica() click to toggle source
# File lib/id_ecuador/id.rb, line 114
def validate_last_digits_for_sociedad_publica
  if @id.slice(9,4) != "0001"
    @errors << "RUC de empresa de sector público debe terminar en 0001"
    false
  else
    true
  end
end
validate_length() click to toggle source
# File lib/id_ecuador/id.rb, line 58
def validate_length
  if [10, 13].include?(@id.length)
    true
  else
    @errors << "Longitud incorrecta"
    false
  end
end