diff --git a/app/models/validations/household_validations.rb b/app/models/validations/household_validations.rb index c7e034e94..f505f5bac 100644 --- a/app/models/validations/household_validations.rb +++ b/app/models/validations/household_validations.rb @@ -51,17 +51,77 @@ module Validations::HouseholdValidations end end - def validate_household_number_of_other_members(record) - (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) - end + def validate_partner_count(record) shared_validate_partner_count(record, 8) end def validate_person_1_economic(record) - validate_person_age_matches_economic_status(record, 1) + return unless record.age1 && record.ecstat1 + + if record.age1 < 16 && !economic_status_is_child_other_or_refused?(record.ecstat1) + record.errors.add "ecstat1", I18n.t("validations.household.ecstat.child_under_16", person_num: 1) + record.errors.add "age1", I18n.t("validations.household.age.child_under_16_ecstat", person_num: 1) + end + if tenant_is_economic_child?(record.ecstat1) && record.age1 > 16 + record.errors.add "ecstat1", I18n.t("validations.household.ecstat.child_over_16", person_num: 1) + record.errors.add "age1", I18n.t("validations.household.age.child_over_16", person_num: 1) + end + end + + def validate_person_age_matches_economic_status(record) + (2..8).each do |person_num| + age = record.public_send("age#{person_num}") + economic_status = record.public_send("ecstat#{person_num}") + next unless age && economic_status + + if age < 16 && !economic_status_is_child_other_or_refused?(economic_status) + record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_under_16", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_ecstat", person_num:) + end + if tenant_is_economic_child?(economic_status) && age > 16 + record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_over_16", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_16", person_num:) + end + end + end + + def validate_person_age_matches_relationship(record) + (2..8).each do |person_num| + age = record.public_send("age#{person_num}") + relationship = record.public_send("relat#{person_num}") + next unless age && relationship + + if age < 16 && !relationship_is_child_other_or_refused?(relationship) + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_under_16_lettings", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_relat_lettings", person_num:) + end + end + end + + def validate_person_age_and_relationship_matches_economic_status(record) + (2..8).each do |person_num| + age = record.public_send("age#{person_num}") + economic_status = record.public_send("ecstat#{person_num}") + relationship = record.public_send("relat#{person_num}") + next unless age && economic_status && relationship + + age_between_16_19 = age.between?(16, 19) + student = tenant_is_fulltime_student?(economic_status) + economic_status_refused = tenant_economic_status_refused?(economic_status) + child = tenant_is_child?(relationship) + + if age_between_16_19 && !(student || economic_status_refused) && child + record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.cannot_be_16_19.child_not_student") + record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.must_be_student") # 1 + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student") + end + + next unless !age_between_16_19 && student && child + + record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.must_be_16_19") # 2 + record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.cannot_be_student.child_not_16_19") + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.student_not_16_19") + end end def validate_condition_effects(record) @@ -182,56 +242,6 @@ private end end - def validate_person_age_matches_economic_status(record, person_num) - age = record.public_send("age#{person_num}") - economic_status = record.public_send("ecstat#{person_num}") - return unless age && economic_status - - if age < 16 && !economic_status_is_child_other_or_refused?(economic_status) - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_under_16", person_num:) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_ecstat", person_num:) - end - if tenant_is_economic_child?(economic_status) && age > 16 - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_over_16", person_num:) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_16", person_num:) - end - end - - 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 && !relationship_is_child_other_or_refused?(relationship) - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_under_16_lettings", person_num:) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_relat_lettings", person_num:) - 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 - - age_between_16_19 = age.between?(16, 19) - student = tenant_is_fulltime_student?(economic_status) - economic_status_refused = tenant_economic_status_refused?(economic_status) - child = tenant_is_child?(relationship) - - if age_between_16_19 && !(student || economic_status_refused) && child - record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.cannot_be_16_19.child_not_student") - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.must_be_student") - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student") - end - - if !age_between_16_19 && student && child - record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.must_be_16_19") - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.cannot_be_student.child_not_16_19") - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.student_not_16_19") - end - end - def tenant_is_economic_child?(economic_status) economic_status == 9 end diff --git a/spec/models/validations/household_validations_spec.rb b/spec/models/validations/household_validations_spec.rb index 5a48d4b3f..be3f5177f 100644 --- a/spec/models/validations/household_validations_spec.rb +++ b/spec/models/validations/household_validations_spec.rb @@ -272,7 +272,7 @@ RSpec.describe Validations::HouseholdValidations do end end - describe "household member validations" do + describe "#validate_numeric_min_max" do it "validates that the number of household members cannot be less than 1" do record.hhmemb = 0 household_validator.validate_numeric_min_max(record) @@ -292,11 +292,13 @@ RSpec.describe Validations::HouseholdValidations do household_validator.validate_numeric_min_max(record) expect(record.errors["hhmemb"]).to be_empty end + end + describe "#validate_partner_count" do it "validates that only 1 partner exists" do record.relat2 = "P" record.relat3 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_partner_count(record) expect(record.errors["relat2"]) .to include(match I18n.t("validations.household.relat.one_partner")) expect(record.errors["relat3"]) @@ -307,15 +309,17 @@ RSpec.describe Validations::HouseholdValidations do it "expects that a tenant can have a partner" do record.relat3 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_partner_count(record) expect(record.errors["base"]).to be_empty end + end + describe "#validate_person_age_matches_relationship" do context "when the household contains a person under 16" do it "validates that person must be a child of the tenant" do record.age2 = 14 record.relat2 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_matches_relationship(record) expect(record.errors["relat2"]) .to include(match I18n.t("validations.household.relat.child_under_16_lettings", person_num: 2)) expect(record.errors["age2"]) @@ -325,15 +329,19 @@ RSpec.describe Validations::HouseholdValidations 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) + household_validator.validate_person_age_matches_relationship(record) expect(record.errors["relat2"]).to be_empty expect(record.errors["age2"]).to be_empty end + end + end + describe "#validate_person_age_matches_economic_status" do + context "when the household contains a person under 16" do it "validates that person's economic status must be Child" do record.age2 = 14 record.ecstat2 = 1 - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_matches_economic_status(record) expect(record.errors["ecstat2"]) .to include(match I18n.t("validations.household.ecstat.child_under_16", person_num: 2)) expect(record.errors["age2"]) @@ -343,7 +351,7 @@ RSpec.describe Validations::HouseholdValidations do it "expects that person's economic status is Child" do record.age2 = 14 record.ecstat2 = 9 - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_matches_economic_status(record) expect(record.errors["ecstat2"]).to be_empty expect(record.errors["age2"]).to be_empty end @@ -352,20 +360,22 @@ RSpec.describe Validations::HouseholdValidations do record.age2 = 21 record.relat2 = "C" record.ecstat2 = 9 - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_matches_economic_status(record) expect(record.errors["ecstat2"]) .to include(match I18n.t("validations.household.ecstat.child_over_16", person_num: 2)) expect(record.errors["age2"]) .to include(match I18n.t("validations.household.age.child_over_16", person_num: 2)) end end + end + describe "#validate_person_age_and_relationship_matches_economic_status" do context "when the household contains a tenant’s child between the ages of 16 and 19" do it "validates that person's economic status must be full time student or refused" do record.age2 = 17 record.relat2 = "C" record.ecstat2 = 1 - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["ecstat2"]) .to include(match I18n.t("validations.household.ecstat.student_16_19.must_be_student", person_num: 2)) expect(record.errors["age2"]) @@ -378,7 +388,7 @@ RSpec.describe Validations::HouseholdValidations do record.age2 = 17 record.relat2 = "C" record.ecstat2 = 7 - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["ecstat2"]).to be_empty expect(record.errors["age2"]).to be_empty expect(record.errors["relat2"]).to be_empty @@ -388,7 +398,7 @@ RSpec.describe Validations::HouseholdValidations do record.age2 = 17 record.relat2 = "C" record.ecstat2 = 10 - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["ecstat2"]).to be_empty expect(record.errors["age2"]).to be_empty expect(record.errors["relat2"]).to be_empty @@ -399,7 +409,7 @@ RSpec.describe Validations::HouseholdValidations do record.age2 = 18 record.ecstat2 = "7" record.relat2 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["relat2"]).to be_empty expect(record.errors["ecstat2"]).to be_empty expect(record.errors["age2"]).to be_empty @@ -409,7 +419,7 @@ RSpec.describe Validations::HouseholdValidations do record.age2 = 20 record.ecstat2 = "7" record.relat2 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["relat2"]).to be_empty expect(record.errors["ecstat2"]).to be_empty expect(record.errors["age2"]).to be_empty @@ -419,7 +429,7 @@ RSpec.describe Validations::HouseholdValidations do record.age2 = 14 record.ecstat2 = "7" record.relat2 = "C" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["relat2"]) .to include(match I18n.t("validations.household.relat.student_16_19.cannot_be_child.student_not_16_19")) expect(record.errors["age2"]) @@ -427,48 +437,6 @@ RSpec.describe Validations::HouseholdValidations do expect(record.errors["ecstat2"]) .to include(match I18n.t("validations.household.ecstat.student_16_19.cannot_be_student.child_not_16_19")) end - - context "when the household contains a person over 70" do - it "expects that person under 70 does not need to be retired" do - record.age2 = 50 - record.ecstat2 = 1 - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["ecstat2"]).to be_empty - expect(record.errors["age2"]).to be_empty - end - - it "expects that person over 70 is retired" do - record.age2 = 71 - record.ecstat2 = 5 - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["ecstat2"]).to be_empty - expect(record.errors["age2"]).to be_empty - end - end - - context "when the household contains a retired male" do - it "expects that person is over 65" do - record.age2 = 66 - record.sex2 = "M" - record.ecstat2 = 5 - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["ecstat2"]).to be_empty - expect(record.errors["sex2"]).to be_empty - expect(record.errors["age2"]).to be_empty - end - end - - context "when the household contains a retired female" do - it "expects that person is over 60" do - record.age2 = 61 - record.sex2 = "F" - record.ecstat2 = 5 - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["ecstat2"]).to be_empty - expect(record.errors["sex2"]).to be_empty - expect(record.errors["age2"]).to be_empty - end - end end describe "condition effects validation" do