class Faker::SpanishDocuments

Constants

CIF_CONTROL_LETTERS
CIF_LETTERS
CIF_LETTERS_NUMBER
NIE_LETTERS
NIF_LETTERS

Public Class Methods

cif(letter=nil) click to toggle source
# File lib/faker_spanish_documents.rb, line 27
def cif(letter=nil)
  first_letter = letter && CIF_LETTERS.include?(letter) ? letter : CIF_LETTERS.sample
  province_code = Faker::Number.number(digits: 2)
  random_number = Faker::Number.number(digits: 5)
  number = "#{province_code}#{random_number}"

  control_code = cif_control_code(number, first_letter)

  "#{first_letter}#{number}#{control_code}"
end
dni() click to toggle source
# File lib/faker_spanish_documents.rb, line 13
def dni
  number = Faker::Number.number(digits: 8).to_i
  "#{number}#{nif_letter(number)}"
end
nie(letter=nil) click to toggle source
# File lib/faker_spanish_documents.rb, line 18
def nie(letter=nil)
  first_letter = letter && NIE_LETTERS.include?(letter) ? letter : NIE_LETTERS.sample
  first_number = NIE_LETTERS.find_index { |e| e == first_letter }
  number_part = Faker::Number.number(digits: 7)
  number_for_calculation = "#{first_number}#{number_part}".to_i

  "#{first_letter}#{number_part}#{nif_letter(number_for_calculation)}"
end

Private Class Methods

cif_control_code(number, first_letter) click to toggle source
# File lib/faker_spanish_documents.rb, line 40
def cif_control_code(number, first_letter)
  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
  control = decimal != 0 ? 10 - decimal : decimal

  if CIF_LETTERS_NUMBER.include?(first_letter) || number.start_with?('00')
    # Control code will be a letter
    CIF_CONTROL_LETTERS[control]
  else
    # Control code will be a number
    control
  end
end
nif_letter(number) click to toggle source
# File lib/faker_spanish_documents.rb, line 64
def nif_letter(number)
  NIF_LETTERS[number % NIF_LETTERS.length]
end