diff --git a/app/models/validations/household_validations.rb b/app/models/validations/household_validations.rb index b5878cd84..b53cbde8c 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) - shared_validate_person_age_and_relationship_matches_economic_status(record, n) + validate_person_age_and_relationship_matches_economic_status(record, n) end shared_validate_partner_count(record, 8) end @@ -170,10 +170,31 @@ 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 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 2998c0059..a8c04c1a9 100644 --- a/app/models/validations/sales/household_validations.rb +++ b/app/models/validations/sales/household_validations.rb @@ -12,7 +12,7 @@ module Validations::Sales::HouseholdValidations 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) + validate_person_age_and_relationship_matches_economic_status(record, n) end shared_validate_partner_count(record, 6) end @@ -31,10 +31,29 @@ 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 && !person_is_child?(relationship) && person_is_fulltime_student?(economic_status) + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19_sales", person_num:) + end + end + def person_is_partner?(relationship) relationship == "P" end + def person_is_fulltime_student?(economic_status) + economic_status == 7 + end + + def person_economic_status_refused?(economic_status) + economic_status == 10 + end + def person_is_child?(relationship) relationship == "C" end diff --git a/app/models/validations/shared_validations.rb b/app/models/validations/shared_validations.rb index 650980483..85f275755 100644 --- a/app/models/validations/shared_validations.rb +++ b/app/models/validations/shared_validations.rb @@ -82,19 +82,6 @@ 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| person_is_partner?(record["relat#{n}"]) } if partner_count > 1 @@ -108,16 +95,4 @@ private 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 878d5bef4..d498a29e0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -298,6 +298,8 @@ en: child_under_16: "Answer cannot be under 16 as person’s %{person_num} working situation is not ‘child under 16’" child_over_16: "Answer cannot be over 16 as person’s %{person_num} working situation is ‘child under 16‘" student_16_19: "Answer cannot be between 16 and 19 as person %{person_num} is a child of the lead tenant but is not a full-time student" + partner_under_16: "Cannot be under 16 if the relationship is partner" + child_over_20: "Cannot be 20 or over as the relationship is child" lead: over_20: "The lead tenant must be under 20 as you told us their housing situation immediately before this letting was a children’s home or foster care" ecstat: @@ -310,9 +312,10 @@ en: 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" + 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" + student_16_19_sales: "Person %{person_num} must be a child if they are aged 16-19 and a student" housingneeds_a: one_or_two_choices: "You can only select one option or ‘other disabled access needs’ plus ‘wheelchair-accessible housing’, ‘wheelchair access to essential rooms’ or ‘level access housing’" prevten: diff --git a/spec/models/validations/sales/household_validations_spec.rb b/spec/models/validations/sales/household_validations_spec.rb index 54de605de..b07933886 100644 --- a/spec/models/validations/sales/household_validations_spec.rb +++ b/spec/models/validations/sales/household_validations_spec.rb @@ -61,5 +61,40 @@ RSpec.describe Validations::Sales::HouseholdValidations do household_validator.validate_household_number_of_other_members(record) expect(record.errors["base"]).to be_empty end + + context "when the household contains a person under 16" do + it "expects that person is a child of the tenant" do + record.age2 = 14 + record.relat2 = "C" + household_validator.validate_household_number_of_other_members(record) + expect(record.errors["relat2"]).to be_empty + expect(record.errors["age2"]).to be_empty + end + + it "validates that a person under 16 must not be a partner of the buyer" do + record.age2 = 14 + record.relat2 = "P" + household_validator.validate_household_number_of_other_members(record) + expect(record.errors["relat2"]) + .to include(match I18n.t("validations.household.relat.partner_under_16", person_num: 2)) + end + + it "validates that a person over 20 must not be a child of the buyer" do + record.age2 = 21 + record.relat2 = "C" + household_validator.validate_household_number_of_other_members(record) + expect(record.errors["relat2"]) + .to include(match I18n.t("validations.household.relat.child_over_20", person_num: 2)) + end + + it "validates that a person aged 16-19 who is a student must be a child of the buyer" do + record.age2 = 18 + record.ecstat2 = "7" + record.relat2 = "P" + household_validator.validate_household_number_of_other_members(record) + expect(record.errors["relat2"]) + .to include(match I18n.t("validations.household.relat.student_16_19_sales", person_num: 2)) + end + end end end