diff --git a/app/models/validations/household_validations.rb b/app/models/validations/household_validations.rb index f188c4bc6..b5878cd84 100644 --- a/app/models/validations/household_validations.rb +++ b/app/models/validations/household_validations.rb @@ -45,7 +45,7 @@ module Validations::HouseholdValidations (2..8).each do |n| validate_person_age_matches_economic_status(record, n) validate_person_age_matches_relationship(record, n) - validate_person_age_and_relationship_matches_economic_status(record, n) + shared_validate_person_age_and_relationship_matches_economic_status(record, n) end shared_validate_partner_count(record, 8) end @@ -170,38 +170,10 @@ private end end - def validate_person_age_and_relationship_matches_economic_status(record, person_num) - age = record.public_send("age#{person_num}") - economic_status = record.public_send("ecstat#{person_num}") - relationship = record.public_send("relat#{person_num}") - return unless age && economic_status && relationship - - if age >= 16 && age <= 19 && tenant_is_child?(relationship) && (!tenant_is_fulltime_student?(economic_status) && !tenant_economic_status_refused?(economic_status)) - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19", person_num:) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19", person_num:) - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19", person_num:) - end - end - - def validate_partner_count(record) - partner_count = (2..8).count { |n| tenant_is_partner?(record["relat#{n}"]) } - if partner_count > 1 - record.errors.add :base, I18n.t("validations.household.relat.one_partner") - end - end - def tenant_is_economic_child?(economic_status) economic_status == 9 end - def tenant_is_fulltime_student?(economic_status) - economic_status == 7 - end - - def tenant_economic_status_refused?(economic_status) - economic_status == 10 - end - def tenant_is_child?(relationship) relationship == "C" end diff --git a/app/models/validations/sales/household_validations.rb b/app/models/validations/sales/household_validations.rb index da6c547e5..2998c0059 100644 --- a/app/models/validations/sales/household_validations.rb +++ b/app/models/validations/sales/household_validations.rb @@ -9,11 +9,33 @@ module Validations::Sales::HouseholdValidations end end - def validate_household_number_of_other_members(record) (2..6).each do |n| - + validate_person_age_matches_relationship(record, n) + shared_validate_person_age_and_relationship_matches_economic_status(record, n) end shared_validate_partner_count(record, 6) end + +private + + def validate_person_age_matches_relationship(record, person_num) + age = record.public_send("age#{person_num}") + relationship = record.public_send("relat#{person_num}") + return unless age && relationship + + if age < 16 && person_is_partner?(relationship) + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.partner_under_16", person_num:) + elsif age >= 20 && person_is_child?(relationship) + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_over_20", person_num:) + end + end + + def person_is_partner?(relationship) + relationship == "P" + end + + def person_is_child?(relationship) + relationship == "C" + end end diff --git a/app/models/validations/shared_validations.rb b/app/models/validations/shared_validations.rb index e551de2fc..650980483 100644 --- a/app/models/validations/shared_validations.rb +++ b/app/models/validations/shared_validations.rb @@ -82,8 +82,21 @@ module Validations::SharedValidations end end + def shared_validate_person_age_and_relationship_matches_economic_status(record, person_num) + age = record.public_send("age#{person_num}") + economic_status = record.public_send("ecstat#{person_num}") + relationship = record.public_send("relat#{person_num}") + return unless age && economic_status && relationship + + if age >= 16 && age <= 19 && person_is_child?(relationship) && (!person_is_fulltime_student?(economic_status) && !person_economic_status_refused?(economic_status)) + record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19", person_num:) + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19", person_num:) + end + end + def shared_validate_partner_count(record, max_people) - partner_count = (2..max_people).count { |n| tenant_is_partner?(record["relat#{n}"]) } + partner_count = (2..max_people).count { |n| person_is_partner?(record["relat#{n}"]) } if partner_count > 1 record.errors.add :base, I18n.t("validations.household.relat.one_partner") end @@ -92,7 +105,19 @@ module Validations::SharedValidations private - def tenant_is_partner?(relationship) + def person_is_partner?(relationship) relationship == "P" end + + def person_is_child?(relationship) + relationship == "C" + end + + def person_is_fulltime_student?(economic_status) + economic_status == 7 + end + + def person_economic_status_refused?(economic_status) + economic_status == 10 + end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 2bc894b0d..878d5bef4 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -308,7 +308,9 @@ en: retired_male: "Answer cannot be ‘retired’ as the male tenant is under 65" retired_female: "Answer cannot be ‘retired’ as the female tenant is under 60" relat: + partner_under_16: "Cannot be partner if the person's age is under 16" child_under_16: "Person’s %{person_num}’s relationship to tenant 1 must be ‘child’ as you told us they’re under 16" + child_over_20: "Relationship cannot be child if the person's age is 20 or over" one_partner: "Number of partners cannot be greater than 1" student_16_19: "Answer cannot be ‘child’ as you told us the person %{person_num} is between 16 and 19 and is not a full-time student" housingneeds_a: