diff --git a/app/models/officing/residence.rb b/app/models/officing/residence.rb index 8036c8401..ae7fc4722 100644 --- a/app/models/officing/residence.rb +++ b/app/models/officing/residence.rb @@ -68,7 +68,7 @@ class Officing::Residence end def allowed_age? - date_of_birth.age_in_years <= User.minimum_required_age + Age.in_years(date_of_birth) <= User.minimum_required_age end def geozone diff --git a/app/models/user.rb b/app/models/user.rb index f092a6a7a..dc035c6d9 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -247,7 +247,7 @@ class User < ActiveRecord::Base end def age - date_of_birth.try(:age_in_years) + Age.in_years(date_of_birth) end def save_requiring_finish_signup diff --git a/app/models/verification/management/document.rb b/app/models/verification/management/document.rb index f39bf4b90..46907b76b 100644 --- a/app/models/verification/management/document.rb +++ b/app/models/verification/management/document.rb @@ -32,7 +32,7 @@ class Verification::Management::Document end def under_age?(response) - response.date_of_birth && User.minimum_required_age < response.date_of_birth.age_in_years + response.date_of_birth && User.minimum_required_age < Age.in_years(response.date_of_birth) end def verified? diff --git a/app/models/verification/residence.rb b/app/models/verification/residence.rb index 040460527..3f9fd097b 100644 --- a/app/models/verification/residence.rb +++ b/app/models/verification/residence.rb @@ -36,7 +36,7 @@ class Verification::Residence def allowed_age return if errors[:date_of_birth].any? - errors.add(:date_of_birth, I18n.t('verification.residence.new.error_not_allowed_age')) unless self.date_of_birth.age_in_years <= User.minimum_required_age + errors.add(:date_of_birth, I18n.t('verification.residence.new.error_not_allowed_age')) unless Age.in_years(self.date_of_birth) <= User.minimum_required_age end def document_number_uniqueness diff --git a/config/initializers/age.rb b/config/initializers/age.rb new file mode 100644 index 000000000..2e90c0a3b --- /dev/null +++ b/config/initializers/age.rb @@ -0,0 +1 @@ +require 'age' diff --git a/config/initializers/date_ext.rb b/config/initializers/date_ext.rb deleted file mode 100644 index 15055c3cb..000000000 --- a/config/initializers/date_ext.rb +++ /dev/null @@ -1 +0,0 @@ -require 'date_ext' diff --git a/lib/age.rb b/lib/age.rb new file mode 100644 index 000000000..c6ae6fe18 --- /dev/null +++ b/lib/age.rb @@ -0,0 +1,7 @@ +module Age + def self.in_years(dob, now = Time.now.utc.to_date) + return nil unless dob.present? + # reference: http://stackoverflow.com/questions/819263/get-persons-age-in-ruby#comment21200772_819263 + now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1) + end +end diff --git a/lib/date_ext.rb b/lib/date_ext.rb deleted file mode 100644 index beae11125..000000000 --- a/lib/date_ext.rb +++ /dev/null @@ -1,8 +0,0 @@ -module AgeInYears - def age_in_years(now = Time.now.utc.to_date) - # reference: http://stackoverflow.com/questions/819263/get-persons-age-in-ruby#comment21200772_819263 - now.year - year - ((now.month > month || (now.month == month && now.day >= day)) ? 0 : 1) - end -end - -Date.include(AgeInYears) diff --git a/spec/lib/age_spec.rb b/spec/lib/age_spec.rb new file mode 100644 index 000000000..6e1012fd4 --- /dev/null +++ b/spec/lib/age_spec.rb @@ -0,0 +1,58 @@ +require 'rails_helper' + +describe Age do + describe '.in_years' do + it "handles nils" do + expect(Age.in_years(nil)).to be_nil + end + + it "calculates age correctly for common dates" do + d = Date.new(1980, 3, 13) + expect(Age.in_years(d, Date.new(2000, 3, 12))).to eq(19) + expect(Age.in_years(d, Date.new(2000, 3, 13))).to eq(20) + expect(Age.in_years(d, Date.new(2000, 3, 14))).to eq(20) + end + + it "calculates age correctly for people born near a year's limit" do + d = Date.new(1980, 12, 31) + expect(Age.in_years(d, Date.new(2000, 12, 30))).to eq(19) + expect(Age.in_years(d, Date.new(2000, 12, 31))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 1, 1))).to eq(20) + + d = Date.new(1980, 1, 1) + expect(Age.in_years(d, Date.new(2000, 12, 31))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 1, 1))).to eq(21) + expect(Age.in_years(d, Date.new(2001, 1, 2))).to eq(21) + end + + it "calculates age correctly for people born around February the 29th" do + # 1980 and 2000 are leap years. 2001 is a regular year + d = Date.new(1980, 2, 29) + expect(Age.in_years(d, Date.new(2000, 2, 27))).to eq(19) + expect(Age.in_years(d, Date.new(2000, 2, 28))).to eq(19) + expect(Age.in_years(d, Date.new(2000, 2, 29))).to eq(20) + expect(Age.in_years(d, Date.new(2000, 3, 1))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 2, 27))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 2, 28))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 3, 1))).to eq(21) + + d = Date.new(1980, 2, 28) + expect(Age.in_years(d, Date.new(2000, 2, 27))).to eq(19) + expect(Age.in_years(d, Date.new(2000, 2, 28))).to eq(20) + expect(Age.in_years(d, Date.new(2000, 2, 29))).to eq(20) + expect(Age.in_years(d, Date.new(2000, 3, 1))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 2, 27))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 2, 28))).to eq(21) + expect(Age.in_years(d, Date.new(2001, 3, 1))).to eq(21) + + d = Date.new(1980, 3, 1) + expect(Age.in_years(d, Date.new(2000, 2, 27))).to eq(19) + expect(Age.in_years(d, Date.new(2000, 2, 28))).to eq(19) + expect(Age.in_years(d, Date.new(2000, 2, 29))).to eq(19) + expect(Age.in_years(d, Date.new(2000, 3, 1))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 2, 27))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 2, 28))).to eq(20) + expect(Age.in_years(d, Date.new(2001, 3, 1))).to eq(21) + end + end +end diff --git a/spec/lib/date_spec.rb b/spec/lib/date_spec.rb deleted file mode 100644 index 0963306e3..000000000 --- a/spec/lib/date_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'rails_helper' - -describe Date do - describe '#age_in_years' do - it "calculates age correctly for common dates" do - d = Date.new(1980, 3, 13) - expect(d.age_in_years(Date.new(2000, 3, 12))).to eq(19) - expect(d.age_in_years(Date.new(2000, 3, 13))).to eq(20) - expect(d.age_in_years(Date.new(2000, 3, 14))).to eq(20) - end - - it "calculates age correctly for people born near a year's limit" do - d = Date.new(1980, 12, 31) - expect(d.age_in_years(Date.new(2000, 12, 30))).to eq(19) - expect(d.age_in_years(Date.new(2000, 12, 31))).to eq(20) - expect(d.age_in_years(Date.new(2001, 1, 1))).to eq(20) - - d = Date.new(1980, 1, 1) - expect(d.age_in_years(Date.new(2000, 12, 31))).to eq(20) - expect(d.age_in_years(Date.new(2001, 1, 1))).to eq(21) - expect(d.age_in_years(Date.new(2001, 1, 2))).to eq(21) - end - - it "calculates age correctly for people born around February the 29th" do - # 1980 and 2000 are leap years. 2001 is a regular year - d = Date.new(1980, 2, 29) - expect(d.age_in_years(Date.new(2000, 2, 27))).to eq(19) - expect(d.age_in_years(Date.new(2000, 2, 28))).to eq(19) - expect(d.age_in_years(Date.new(2000, 2, 29))).to eq(20) - expect(d.age_in_years(Date.new(2000, 3, 1))).to eq(20) - expect(d.age_in_years(Date.new(2001, 2, 27))).to eq(20) - expect(d.age_in_years(Date.new(2001, 2, 28))).to eq(20) - expect(d.age_in_years(Date.new(2001, 3, 1))).to eq(21) - - d = Date.new(1980, 2, 28) - expect(d.age_in_years(Date.new(2000, 2, 27))).to eq(19) - expect(d.age_in_years(Date.new(2000, 2, 28))).to eq(20) - expect(d.age_in_years(Date.new(2000, 2, 29))).to eq(20) - expect(d.age_in_years(Date.new(2000, 3, 1))).to eq(20) - expect(d.age_in_years(Date.new(2001, 2, 27))).to eq(20) - expect(d.age_in_years(Date.new(2001, 2, 28))).to eq(21) - expect(d.age_in_years(Date.new(2001, 3, 1))).to eq(21) - - d = Date.new(1980, 3, 1) - expect(d.age_in_years(Date.new(2000, 2, 27))).to eq(19) - expect(d.age_in_years(Date.new(2000, 2, 28))).to eq(19) - expect(d.age_in_years(Date.new(2000, 2, 29))).to eq(19) - expect(d.age_in_years(Date.new(2000, 3, 1))).to eq(20) - expect(d.age_in_years(Date.new(2001, 2, 27))).to eq(20) - expect(d.age_in_years(Date.new(2001, 2, 28))).to eq(20) - expect(d.age_in_years(Date.new(2001, 3, 1))).to eq(21) - end - - end -end