class SocialSecurityNumber::De

SocialSecurityNumber::De validates Germany Steuer-IdNr en.wikipedia.org/wiki/National_identification_number#Germany

Public Instance Methods

validate() click to toggle source
# File lib/social_security_number/country/de.rb, line 5
def validate
  @error = if !check_digits
             'it is not number'
           elsif !check_length(11)
             'number should be length of 11'
           elsif @civil_number[0].to_i.zero?
             'first number is invalid'
           # elsif !check_digits_apperings
           #   'first number is invalid'
           elsif !check_control_sum
             'number control sum invalid'
           end
end

Private Instance Methods

check_control_sum() click to toggle source
# File lib/social_security_number/country/de.rb, line 21
def check_control_sum
  count_last_number == @civil_number[10].to_i
end
check_digits_apperings() click to toggle source
# File lib/social_security_number/country/de.rb, line 49
def check_digits_apperings
  out = true

  if validate_2015
    out = false
  elsif validate_2016
    out = false
  end
  out
end
count_dig(digits, number) click to toggle source
# File lib/social_security_number/country/de.rb, line 60
def count_dig(digits, number)
  (digits.select { |count| count.to_i == number }).count
end
count_last_number() click to toggle source
# File lib/social_security_number/country/de.rb, line 25
def count_last_number
  sum = 0
  product = 10

  digits(@civil_number.to_s[0..9]).each_with_index do |digit, _i|
    sum = (digit.to_i + product) % 10
    sum = 10 if sum.zero?
    product = (sum * 2) % 11
  end
  checksum = 11 - product
  checksum = 0 if checksum == 10
  checksum
end
digits(number) click to toggle source
# File lib/social_security_number/country/de.rb, line 45
def digits(number)
  number.split(//)
end
group_number(number) click to toggle source
# File lib/social_security_number/country/de.rb, line 39
def group_number(number)
  out = []
  digits(number).group_by(&:itself).map { |k, v| out[k.to_i] = v.count }
  out
end
validate_2015() click to toggle source
# File lib/social_security_number/country/de.rb, line 64
def validate_2015
  # validate ids that are only valid since 2015
  # one digit appears exactly twice and all other digits appear exactly once
  digit = group_number(@civil_number.to_s[0..9]).compact
  count_dig(digit, 2) != 1 && count_dig(digit, 1) != 8
end
validate_2016() click to toggle source
# File lib/social_security_number/country/de.rb, line 71
def validate_2016
  # validate ids that are only valid since 2016
  # two digits appear zero times and one digit appears exactly three times
  # and all other digits appear exactly once
  digit = group_number(@civil_number.to_s[0..9]).compact
  count_dig(digit, 2).zero? && count_dig(digit, 3) != 1 &&
    count_dig(digit, 1) != 7
end