module RomanianValidators::Cif

Constants

FIRST_CIF
TEST_KEY

Public Instance Methods

control_sum(n, test_key) click to toggle source
# File lib/romanianvalidators/cif.rb, line 55
def control_sum(n, test_key)
  control, *rest_digits = n.to_s.chars.map(&:to_i).reverse
  sum = rest_digits.zip(test_key).map { |a, b| a * b }.reduce(0, &:+)
  [control, sum]
end
enumerator(start, direction = :up) click to toggle source
# File lib/romanianvalidators/cif.rb, line 40
def enumerator(start, direction = :up)
  Enumerator.new do |yielder|
    memo = direction == :up ? next_valid_cif(start + 1) : prev_valid_cif(start - 1)
    loop do
      yielder << memo
      memo = direction == :up ? next_valid_cif(memo + 1) : prev_valid_cif(memo - 1)
      break if memo < FIRST_CIF
    end
  end.lazy
end
next_valid_cif(cif) click to toggle source
# File lib/romanianvalidators/cif.rb, line 18
def next_valid_cif(cif)
  control, sum = control_sum(cif, TEST_KEY)
  last_digit_of_next_cif = sum * 10 % 11 % 10

  if last_digit_of_next_cif < control
    next_valid_cif(((cif / 10) + 1) * 10)
  else
    replace_last_digit(cif, last_digit_of_next_cif)
  end
end
prev_valid_cif(cif) click to toggle source
# File lib/romanianvalidators/cif.rb, line 29
def prev_valid_cif(cif)
  control, sum = control_sum(cif, TEST_KEY)
  last_digit_of_next_cif = sum * 10 % 11 % 10

  if last_digit_of_next_cif > control
    next_valid_cif(((cif / 10) - 1) * 10)
  else
    replace_last_digit(cif, last_digit_of_next_cif)
  end
end
replace_last_digit(number, digit) click to toggle source
# File lib/romanianvalidators/cif.rb, line 51
def replace_last_digit(number, digit)
  ((number / 10).to_s + digit.to_s).to_i
end
valid?(cif) click to toggle source
# File lib/romanianvalidators/cif.rb, line 8
def valid?(cif)
  return false unless well_formed?(cif)
  control, sum = control_sum(cif, TEST_KEY)
  sum * 10 % 11 % 10 == control
end
well_formed?(cif) click to toggle source
# File lib/romanianvalidators/cif.rb, line 14
def well_formed?(cif)
  cif.present? && (2..10).cover?(cif.size) && (cif =~ /[^0-9]/).nil?
end