Class: ZAIDNumber

Inherits:
Object
  • Object
show all
Defined in:
lib/za_id_number.rb,
lib/za_id_number/version.rb

Defined Under Namespace

Classes: Version

Constant Summary collapse

REQUIRED_ID_LENGTH =
13
FEMALE_RANGE =
(0..4999)
MALE_RANGE =
(5000..9999)
CITIZENSHIP_RANGE =
(0..1)
ZA_CITIZEN =
0
PERMANENT_RESIDENT =
1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id_num) ⇒ ZAIDNumber



15
16
17
# File 'lib/za_id_number.rb', line 15

def initialize(id_num)
  @id_number = id_num.to_s
end

Instance Attribute Details

#id_numberObject (readonly)

Returns the value of attribute id_number.



13
14
15
# File 'lib/za_id_number.rb', line 13

def id_number
  @id_number
end

Instance Method Details

#citizenshipObject



65
66
67
# File 'lib/za_id_number.rb', line 65

def citizenship
  za_citizen? ? :za_citizen : :permanent_resident
end

#date_of_birthObject



47
48
49
50
51
# File 'lib/za_id_number.rb', line 47

def date_of_birth
  Date.parse("#{@id_number[0..1]}-#{@id_number[2..3]}-#{@id_number[4..5]}")
rescue ArgumentError
  nil
end

#female?Boolean



57
58
59
# File 'lib/za_id_number.rb', line 57

def female?
  FEMALE_RANGE.include? @id_number[6..9].to_i
end

#genderObject



53
54
55
# File 'lib/za_id_number.rb', line 53

def gender
  female? ? :f : :m
end

#male?Boolean



61
62
63
# File 'lib/za_id_number.rb', line 61

def male?
  !female?
end

#only_digits?Boolean



35
36
37
# File 'lib/za_id_number.rb', line 35

def only_digits?
  @id_number.to_s.gsub(/\D*/, '') == @id_number.to_s
end

#permanent_resident?Boolean



73
74
75
# File 'lib/za_id_number.rb', line 73

def permanent_resident?
  !za_citizen?
end

#valid?Boolean



19
20
21
22
23
24
25
# File 'lib/za_id_number.rb', line 19

def valid?
  valid_length?      &&
  only_digits?       &&
  valid_date?        &&
  valid_citizenship? &&
  valid_checksum?
end

#valid_checksum?Boolean



27
28
29
# File 'lib/za_id_number.rb', line 27

def valid_checksum?
  Luhn.valid? @id_number
end

#valid_citizenship?Boolean



43
44
45
# File 'lib/za_id_number.rb', line 43

def valid_citizenship?
  CITIZENSHIP_RANGE.include? @id_number[10].to_i
end

#valid_date?Boolean



39
40
41
# File 'lib/za_id_number.rb', line 39

def valid_date?
  date_of_birth ? true : false
end

#valid_length?Boolean



31
32
33
# File 'lib/za_id_number.rb', line 31

def valid_length?
  @id_number.length == REQUIRED_ID_LENGTH
end

#za_citizen?Boolean



69
70
71
# File 'lib/za_id_number.rb', line 69

def za_citizen?
  @id_number[10].to_i == ZA_CITIZEN
end