module ValidatesSpanishDocuments::InstanceMethods

rubocop:disable Metrics/ModuleLength

Private Class Methods

included(base) click to toggle source

Call nss validators

# File lib/validates_spanish_documents.rb, line 180
def included(base)
  base.send(:validate, :nss_validators)
end

Private Instance Methods

check_if(condition) click to toggle source

rubocop:enable Metrics/CyclomaticComplexity

# File lib/validates_spanish_documents.rb, line 171
def check_if(condition)
  return send(condition) if condition.class == String || condition.class == Symbol
  return condition.call if condition.class == Proc

  true
end
cif_valid?(field_name) click to toggle source

Check validate CIF

# File lib/validates_spanish_documents.rb, line 70
def cif_valid?(field_name)
  if send(field_name) =~ REGEX_CIF
    number = Regexp.last_match(2)
    first_letter = Regexp.last_match(1)
    province_code = number[0..1]
    actual_control = Regexp.last_match(3)

    total = number
            .split('')
            .each_with_index
            .inject(0) do |acc, (element, index)|
      acc + if index.even?
              (element.to_i * 2).digits.inject(:+)
            else
              element.to_i
            end
    end

    decimal = total.digits.first
    expected_control = decimal != 0 ? 10 - decimal : decimal

    # Control code must be a letter
    return LETTERS_CIF_CONTROL[expected_control] if LETTERS_CIF_NUMBER.include?(first_letter) ||
                                                    province_code == '00'

    # Control code will be a number or a letter
    return [expected_control.to_s,
            LETTERS_CIF_CONTROL[expected_control]].include?(actual_control)
  end

  false
end
dni_valid?(field_name) click to toggle source

Check validate DNI

# File lib/validates_spanish_documents.rb, line 43
def dni_valid?(field_name)
  if send(field_name) =~ REGEX_DNI
    number = Regexp.last_match(1).to_i
    position = number % 23
    control_code = Regexp.last_match(2)

    return true if control_code == LETTERS_DNI[position]
  end

  false
end
nie_valid?(field_name) click to toggle source

Check validate NIE

# File lib/validates_spanish_documents.rb, line 56
def nie_valid?(field_name)
  if send(field_name) =~ REGEX_NIE
    number_first = LETTERS_NIE.index(Regexp.last_match(1))
    number = (number_first.to_s + Regexp.last_match(2)).to_i
    position = number % 23
    control_code = Regexp.last_match(3)

    return true if control_code == LETTERS_DNI[position]
  end

  false
end
nif_valid?(field_name) click to toggle source

Check validate nif

# File lib/validates_spanish_documents.rb, line 23
def nif_valid?(field_name)
  if send(field_name).match?(REGEX_DNI)
    dni_valid?(field_name)
  elsif send(field_name).match?(REGEX_NIE)
    nie_valid?(field_name)
  else
    cif_valid?(field_name)
  end
end
nss_validators() click to toggle source

Call all validations rubocop:disable Metrics/CyclomaticComplexity

# File lib/validates_spanish_documents.rb, line 156
def nss_validators
  self.class.nss_validations.each do |item|
    next if send(item[:field_name]).blank? || (item[:if] && !check_if(item[:if]))

    case item[:validation]
    when :nif then send(:validate_nss_nif, item[:field_name])
    when :dni then send(:validate_nss_dni, item[:field_name])
    when :cif then send(:validate_nss_cif, item[:field_name])
    when :nie then send(:validate_nss_nie, item[:field_name])
    when :person_nif then send(:validate_nss_person_nif, item[:field_name])
    end
  end
end
person_nif_valid?(field_name) click to toggle source

Check validate PERSON NIF

# File lib/validates_spanish_documents.rb, line 34
def person_nif_valid?(field_name)
  if send(field_name).match?(REGEX_DNI)
    dni_valid?(field_name)
  else
    nie_valid?(field_name)
  end
end
validate_nss_cif(field_name) click to toggle source

Validate CIF method es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal

# File lib/validates_spanish_documents.rb, line 145
def validate_nss_cif(field_name)
  unless cif_valid?(field_name)
    errors.add field_name, :invalid
    false
  end

  true
end
validate_nss_dni(field_name) click to toggle source

Validate DNI method

# File lib/validates_spanish_documents.rb, line 124
def validate_nss_dni(field_name)
  unless dni_valid?(field_name)
    errors.add field_name, :invalid
    false
  end

  true
end
validate_nss_nie(field_name) click to toggle source

Validate NIE method

# File lib/validates_spanish_documents.rb, line 134
def validate_nss_nie(field_name)
  unless nie_valid?(field_name)
    errors.add field_name, :invalid
    false
  end

  true
end
validate_nss_nif(field_name) click to toggle source

Validate NIF method

# File lib/validates_spanish_documents.rb, line 104
def validate_nss_nif(field_name)
  unless nif_valid?(field_name)
    errors.add field_name, :invalid
    false
  end

  true
end
validate_nss_person_nif(field_name) click to toggle source

Validate NIF method

# File lib/validates_spanish_documents.rb, line 114
def validate_nss_person_nif(field_name)
  unless person_nif_valid?(field_name)
    errors.add field_name, :invalid
    false
  end

  true
end