class Faker::IDNumber
def south_african_id_checksum_digit(id_number)
def south_african_id_checksum_digit(id_number) value_parts = id_number.chars even_digits = value_parts .select .with_index { |_, i| (i + 1).even? } odd_digits_without_last_character = value_parts[0...-1] .select .with_index { |_, i| (i + 1).odd? } sum_of_odd_digits = odd_digits_without_last_character.map(&:to_i).reduce(:+) even_digits_times_two = (even_digits.join.to_i * 2).to_s sum_of_even_digits = even_digits_times_two.chars.map(&:to_i).reduce(:+) total_sum = sum_of_odd_digits + sum_of_even_digits ((10 - (total_sum % 10)) % 10).to_s end