module Faker::Russian::Inn

Constants

P10
P11
P12

Public Instance Methods

inn(options = {}) click to toggle source
# File lib/faker/russian/inn.rb, line 4
def inn(options = {})
  options.assert_valid_keys(:sequence_number, :region_number, :kind)

  sequence = find_sequence(options[:sequence_number])
  region_number = find_region_number(options[:region_number], sequence, :region_numbers)
  kind = find_kind(options[:kind], sequence)
  sequence_digits = find_digits(kind, sequence)

  inn_without_check_digit = region_number + sequence_digits
  inn_without_check_digit + check_digit(inn_without_check_digit)
end

Private Instance Methods

calc_inn(p, inn) click to toggle source
# File lib/faker/russian/inn.rb, line 38
def calc_inn(p, inn)
  (p.each_with_index.inject(0){ |s, p| s + p[0] * inn[p[1]].to_i } % 11 % 10).to_s
end
check_digit(digits) click to toggle source
# File lib/faker/russian/inn.rb, line 30
def check_digit(digits)
  if digits.length == 9
    calc_inn(P10, digits)
  else
    calc_inn(P11, digits) + calc_inn(P12, digits + calc_inn(P11, digits))
  end
end
find_digits(kind, sequence) click to toggle source
# File lib/faker/russian/inn.rb, line 26
def find_digits(kind, sequence)
  (kind == :legal) ? sequence.rand(1_000_000..9_999_999).to_s : sequence.rand(10_000_000..99_999_999).to_s
end
find_kind(kind, sequence) click to toggle source
# File lib/faker/russian/inn.rb, line 18
def find_kind(kind, sequence)
  case kind
  when :individual, :legal then kind
  when nil then [:individual, :legal][sequence.rand(2)]
  else raise 'there is no any kind other than :individual or :legal'
  end
end