diff --git a/app/models/validations/sales/household_validations.rb b/app/models/validations/sales/household_validations.rb index e006374aa..fb1ea65c2 100644 --- a/app/models/validations/sales/household_validations.rb +++ b/app/models/validations/sales/household_validations.rb @@ -9,9 +9,9 @@ module Validations::Sales::HouseholdValidations return unless record.form.start_date.year >= 2023 if record.buyers_will_live_in? && record.buyer_one_will_not_live_in_property? && record.buyer_two_will_not_live_in_property? - record.errors.add :buylivein, I18n.t("validations.household.buylivein.buyers_will_live_in_property_values_inconsistent_setup") - record.errors.add :buy1livein, I18n.t("validations.household.buylivein.buyers_will_live_in_property_values_inconsistent") - record.errors.add :buy2livein, I18n.t("validations.household.buylivein.buyers_will_live_in_property_values_inconsistent") + record.errors.add :buylivein, I18n.t("validations.sales.household.buylivein.buyers_will_live_in_property_values_inconsistent") + record.errors.add :buy1livein, I18n.t("validations.sales.household.buy1livein.buyers_will_live_in_property_values_inconsistent") + record.errors.add :buy2livein, I18n.t("validations.sales.household.buy2livein.buyers_will_live_in_property_values_inconsistent") end end @@ -20,8 +20,8 @@ module Validations::Sales::HouseholdValidations return unless record.discounted_ownership_sale? && record.prevten if [3, 4, 5, 6, 7, 9, 0].include?(record.prevten) - record.errors.add :prevten, I18n.t("validations.household.prevten.invalid_for_discounted_sale") - record.errors.add :ownershipsch, I18n.t("validations.household.prevten.invalid_for_discounted_sale") + record.errors.add :prevten, I18n.t("validations.sales.household.prevten.prevten_invalid_for_discounted_sale") + record.errors.add :ownershipsch, I18n.t("validations.sales.household.ownershipsch.prevten_invalid_for_discounted_sale") end end @@ -34,11 +34,11 @@ module Validations::Sales::HouseholdValidations next unless age && relationship if age < 16 && !relationship_is_child_other_or_refused?(relationship) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_relat_sales", person_num:) - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_under_16_sales", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.sales.household.age.child_under_16", person_num:) + record.errors.add "relat#{person_num}", I18n.t("validations.sales.household.relat.child_under_16", person_num:) elsif age >= 20 && person_is_child?(relationship) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_20") - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_over_20") + record.errors.add "age#{person_num}", I18n.t("validations.sales.household.age.child_over_20") + record.errors.add "relat#{person_num}", I18n.t("validations.sales.household.relat.child_over_20") end end end @@ -58,16 +58,16 @@ module Validations::Sales::HouseholdValidations child = person_is_child?(relationship) if age_between_16_19 && !(student || economic_status_refused) && child - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.must_be_student") - record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.cannot_be_16_19.child_not_student") - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student") + record.errors.add "ecstat#{person_num}", I18n.t("validations.sales.household.ecstat.student_16_19.must_be_student") + record.errors.add "age#{person_num}", I18n.t("validations.sales.household.age.student_16_19.cannot_be_16_19.child_not_student") + record.errors.add "relat#{person_num}", I18n.t("validations.sales.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") - 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") + record.errors.add "age#{person_num}", I18n.t("validations.sales.household.age.student_16_19.must_be_16_19") + record.errors.add "ecstat#{person_num}", I18n.t("validations.sales.household.ecstat.student_16_19.cannot_be_student.child_not_16_19") + record.errors.add "relat#{person_num}", I18n.t("validations.sales.household.relat.student_16_19.cannot_be_child.student_not_16_19") end end @@ -78,12 +78,12 @@ module Validations::Sales::HouseholdValidations next unless age && economic_status if age < 16 && !economic_status_is_child_other_or_refused?(economic_status) && !record.form.start_year_after_2024? - 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:) + record.errors.add "ecstat#{person_num}", I18n.t("validations.sales.household.ecstat.child_under_16", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.sales.household.age.child_under_16_ecstat", person_num:) end if person_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:) + record.errors.add "ecstat#{person_num}", I18n.t("validations.sales.household.ecstat.child_over_16", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.sales.household.age.child_over_16", person_num:) end end end @@ -99,17 +99,17 @@ module Validations::Sales::HouseholdValidations next unless person_age > buyer_1_age - 12 && person_is_child?(relationship) - record.errors.add "age1", I18n.t("validations.household.age.child_12_years_younger") - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_12_years_younger") - record.errors.add "relat#{person_num}", I18n.t("validations.household.age.child_12_years_younger") + record.errors.add "age1", I18n.t("validations.sales.household.age1.child_12_years_younger") + record.errors.add "age#{person_num}", I18n.t("validations.sales.household.age.child_12_years_younger") + record.errors.add "relat#{person_num}", I18n.t("validations.sales.household.relat.child_12_years_younger") end end def validate_buyer_not_child(record) return unless record.saledate && record.form.start_year_after_2024? - record.errors.add "ecstat1", I18n.t("validations.household.ecstat.buyer_cannot_be_child", buyer_index: "1") if person_is_economic_child?(record.ecstat1) - record.errors.add "ecstat2", I18n.t("validations.household.ecstat.buyer_cannot_be_child", buyer_index: "2") if person_is_economic_child?(record.ecstat2) && record.joint_purchase? + record.errors.add "ecstat1", I18n.t("validations.sales.household.ecstat1.buyer_cannot_be_child") if person_is_economic_child?(record.ecstat1) + record.errors.add "ecstat2", I18n.t("validations.sales.household.ecstat2.buyer_cannot_be_child") if person_is_economic_child?(record.ecstat2) && record.joint_purchase? end private diff --git a/app/models/validations/shared_validations.rb b/app/models/validations/shared_validations.rb index 217b2c170..a2ae916c1 100644 --- a/app/models/validations/shared_validations.rb +++ b/app/models/validations/shared_validations.rb @@ -131,7 +131,11 @@ module Validations::SharedValidations partner_numbers = (2..max_people).select { |n| person_is_partner?(record["relat#{n}"]) } if partner_numbers.count > 1 partner_numbers.each do |n| - record.errors.add "relat#{n}", I18n.t("validations.household.relat.one_partner") + if record.sales? + record.errors.add "relat#{n}", I18n.t("validations.sales.household.relat.one_partner") + else + record.errors.add "relat#{n}", I18n.t("validations.household.relat.one_partner") + end end end end diff --git a/app/services/bulk_upload/sales/year2024/row_parser.rb b/app/services/bulk_upload/sales/year2024/row_parser.rb index fbc99ba02..35984a045 100644 --- a/app/services/bulk_upload/sales/year2024/row_parser.rb +++ b/app/services/bulk_upload/sales/year2024/row_parser.rb @@ -1469,10 +1469,10 @@ private def validate_buyer1_economic_status if field_35 == 9 if field_31.present? && field_31.to_i >= 16 - errors.add(:field_35, I18n.t("validations.household.ecstat.buyer_cannot_be_over_16_and_child", buyer_index: "1")) - errors.add(:field_31, I18n.t("validations.household.ecstat.buyer_cannot_be_over_16_and_child", buyer_index: "1")) + errors.add(:field_35, I18n.t("validations.sales.household.ecstat.buyer_cannot_be_over_16_and_child", buyer_index: "1")) + errors.add(:field_31, I18n.t("validations.sales.household.ecstat.buyer_cannot_be_over_16_and_child", buyer_index: "1")) else - errors.add(:field_35, I18n.t("validations.household.ecstat.buyer_cannot_be_child", buyer_index: "1")) + errors.add(:field_35, I18n.t("validations.sales.household.ecstat1.buyer_cannot_be_child")) end end end @@ -1482,10 +1482,10 @@ private if field_42 == 9 if field_38.present? && field_38.to_i >= 16 - errors.add(:field_42, I18n.t("validations.household.ecstat.buyer_cannot_be_over_16_and_child", buyer_index: "2")) - errors.add(:field_38, I18n.t("validations.household.ecstat.buyer_cannot_be_over_16_and_child", buyer_index: "2")) + errors.add(:field_42, I18n.t("validations.sales.household.ecstat.buyer_cannot_be_over_16_and_child", buyer_index: "2")) + errors.add(:field_38, I18n.t("validations.sales.household.ecstat.buyer_cannot_be_over_16_and_child", buyer_index: "2")) else - errors.add(:field_42, I18n.t("validations.household.ecstat.buyer_cannot_be_child", buyer_index: "2")) + errors.add(:field_42, I18n.t("validations.sales.household.ecstat2.buyer_cannot_be_child")) end end end diff --git a/config/locales/en.yml b/config/locales/en.yml index b39183591..7cff7aae7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -501,11 +501,8 @@ en: retired_female: "A female tenant who is retired must be 60 or over." retired_over_70: "Answer cannot be over 70 as person %{person_num} has economic status that is not ‘retired’." child_under_16_relat_lettings: "Answer cannot be under 16 as person %{person_num}'s relationship to the lead tenant is ‘partner’." - child_under_16_relat_sales: "Answer cannot be under 16 as person %{person_num}'s relationship to buyer 1 is ‘partner’." child_under_16_ecstat: "Answer cannot be under 16 as person %{person_num}’s working situation is not ‘child under 16’, ‘other’ or ‘prefers not to say’." child_over_16: "Answer cannot be over 16 as person’s %{person_num} working situation is ‘child under 16‘." - child_over_20: "Answer cannot be 20 or over as the relationship is ‘child’." - child_12_years_younger: "A child must be at least 12 years younger than their parent." not_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." student_16_19: cannot_be_16_19: @@ -528,12 +525,8 @@ en: retired_female: "Answer cannot be ‘retired’ as the female tenant is under 60." not_child_16_19: cannot_be_student: "Person cannot be a student if they are aged 16-19 but are not a child." - buyer_cannot_be_child: "Buyer %{buyer_index} cannot have a working situation of child under 16." - buyer_cannot_be_over_16_and_child: "Buyer %{buyer_index}'s age cannot be 16 or over if their working situation is child under 16." relat: - child_under_16_sales: "Answer cannot be ‘partner’ as you told us person %{person_num}'s age is under 16." child_under_16_lettings: "Answer cannot be ‘partner’ as you told us person %{person_num}'s age is under 16." - child_over_20: "Answer cannot be ‘child’ if the person's age is 20 or over." one_partner: "Number of partners cannot be greater than 1." not_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: @@ -556,7 +549,6 @@ en: internal_transfer: "Answer cannot be %{prevten} as this tenancy is an internal transfer." la_general_needs: internal_transfer: "Answer cannot be a fixed-term or lifetime local authority general needs tenancy as it’s an internal transfer and a private registered provider is on the tenancy agreement." - invalid_for_discounted_sale: "Buyer 1’s previous tenure should be “local authority tenant” or “private registered provider or housing association tenant” for discounted sales." referral: secure_tenancy: "Answer must be internal transfer as this is a secure tenancy." rsnvac_non_temp: "Answer cannot be this source of referral as this is a re-let to tenant who occupied the same property as temporary accommodation." @@ -596,9 +588,6 @@ en: no_choices: "You cannot answer this question as you told us nobody in the household has a physical or mental health condition (or other illness) expected to last 12 months or more." postcode: discounted_ownership: "Last settled accommodation and discounted ownership property postcodes must match." - buylivein: - buyers_will_live_in_property_values_inconsistent_setup: "You have already told us that both buyer 1 and buyer 2 will not live in the property." - buyers_will_live_in_property_values_inconsistent: "You have already told us that the buyers will live in the property. Either buyer 1 or buyer 2 must live in the property." nationality: "Select a valid nationality." tenancy: diff --git a/config/locales/validations/sales/household.en.yml b/config/locales/validations/sales/household.en.yml new file mode 100644 index 000000000..c1f90971c --- /dev/null +++ b/config/locales/validations/sales/household.en.yml @@ -0,0 +1,47 @@ +en: + validations: + sales: + household: + buylivein: + buyers_will_live_in_property_values_inconsistent: "You have already told us that both buyer 1 and buyer 2 will not live in the property." + buy1livein: + buyers_will_live_in_property_values_inconsistent: "You have already told us that the buyers will live in the property. Either buyer 1 or buyer 2 must live in the property." + buy2livein: + buyers_will_live_in_property_values_inconsistent: "You have already told us that the buyers will live in the property. Either buyer 1 or buyer 2 must live in the property." + ownershipsch: + prevten_invalid_for_discounted_sale: "Buyer 1’s previous tenure should be “local authority tenant” or “private registered provider or housing association tenant” for discounted sales." + prevten: + prevten_invalid_for_discounted_sale: "Buyer 1’s previous tenure should be “local authority tenant” or “private registered provider or housing association tenant” for discounted sales." + age1: + child_12_years_younger: "A child must be at least 12 years younger than their parent." + ecstat1: + buyer_cannot_be_child: "Buyer 1 cannot have a working situation of child under 16." + ecstat2: + buyer_cannot_be_child: "Buyer 2 cannot have a working situation of child under 16." + age: + child_12_years_younger: "A child must be at least 12 years younger than their parent." + child_under_16: "Answer cannot be under 16 as person %{person_num}'s relationship to buyer 1 is ‘partner’." + child_under_16_ecstat: "Answer cannot be under 16 as person %{person_num}’s working situation is not ‘child under 16’, ‘other’ or ‘prefers not to say’." + child_over_16: "Answer cannot be over 16 as person’s %{person_num} working situation is ‘child under 16‘." + child_over_20: "Answer cannot be 20 or over as the relationship is ‘child’." + student_16_19: + cannot_be_16_19: + child_not_student: "Person cannot be aged 16-19 if they have relationship ‘child’ but are not a student." + must_be_16_19: "Person must be aged 16-19 if they are a student and have relationship ‘child’." + relat: + one_partner: "Number of partners cannot be greater than 1." + child_12_years_younger: "A child must be at least 12 years younger than their parent." + child_under_16: "Answer cannot be ‘partner’ as you told us person %{person_num}'s age is under 16." + child_over_20: "Answer cannot be ‘child’ if the person's age is 20 or over." + student_16_19: + cannot_be_child: + student_not_16_19: "Answer cannot be ‘child’ if the person is a student but not aged 16-19." + 16_19_not_student: "Answer cannot be ‘child’ if the person is aged 16-19 but not a student." + ecstat: + child_under_16: "Person %{person_num}’s working situation must be ‘child under 16’, ‘other’ or ‘prefers not to say’ as you told us they’re under 16." + child_over_16: "Answer cannot be ‘child under 16’ as you told us the person %{person_num} is older than 16." + student_16_19: + must_be_student: "Person must be a student if they are aged 16-19 and have relationship ‘child’." + cannot_be_student: + child_not_16_19: "Person cannot be a student if they are not aged 16-19 but have relationship ‘child’." + buyer_cannot_be_over_16_and_child: "Buyer %{buyer_index}'s age cannot be 16 or over if their working situation is child under 16." diff --git a/spec/models/validations/sales/household_validations_spec.rb b/spec/models/validations/sales/household_validations_spec.rb index 510681420..cffb42ab1 100644 --- a/spec/models/validations/sales/household_validations_spec.rb +++ b/spec/models/validations/sales/household_validations_spec.rb @@ -15,11 +15,11 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.relat3 = "P" household_validator.validate_partner_count(record) expect(record.errors["relat2"]) - .to include(match I18n.t("validations.household.relat.one_partner")) + .to include(match I18n.t("validations.sales.household.relat.one_partner")) expect(record.errors["relat3"]) - .to include(match I18n.t("validations.household.relat.one_partner")) + .to include(match I18n.t("validations.sales.household.relat.one_partner")) expect(record.errors["relat4"]) - .not_to include(match I18n.t("validations.household.relat.one_partner")) + .not_to include(match I18n.t("validations.sales.household.relat.one_partner")) end it "expects that a tenant can have a partner" do @@ -47,9 +47,9 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.relat2 = "P" household_validator.validate_person_age_matches_relationship(record) expect(record.errors["relat2"]) - .to include(match I18n.t("validations.household.relat.child_under_16_sales", person_num: 2)) + .to include(match I18n.t("validations.sales.household.relat.child_under_16", person_num: 2)) expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.child_under_16_relat_sales", person_num: 2)) + .to include(match I18n.t("validations.sales.household.age.child_under_16", person_num: 2)) end end @@ -58,9 +58,9 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.relat2 = "C" household_validator.validate_person_age_matches_relationship(record) expect(record.errors["relat2"]) - .to include(match I18n.t("validations.household.relat.child_over_20")) + .to include(match I18n.t("validations.sales.household.relat.child_over_20")) expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.child_over_20")) + .to include(match I18n.t("validations.sales.household.age.child_over_20")) end end @@ -94,9 +94,9 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.ecstat2 = 1 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)) + .to include(match I18n.t("validations.sales.household.ecstat.child_under_16", person_num: 2)) expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.child_under_16_ecstat", person_num: 2)) + .to include(match I18n.t("validations.sales.household.age.child_under_16_ecstat", person_num: 2)) end it "expects that person's economic status is Child" do @@ -112,9 +112,9 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.ecstat2 = 9 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)) + .to include(match I18n.t("validations.sales.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)) + .to include(match I18n.t("validations.sales.household.age.child_over_16", person_num: 2)) end end @@ -126,9 +126,9 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.ecstat2 = 1 household_validator.validate_person_age_matches_economic_status(record) expect(record.errors["ecstat2"]) - .not_to include(match I18n.t("validations.household.ecstat.child_under_16", person_num: 2)) + .not_to include(match I18n.t("validations.sales.household.ecstat.child_under_16", person_num: 2)) expect(record.errors["age2"]) - .not_to include(match I18n.t("validations.household.age.child_under_16_ecstat", person_num: 2)) + .not_to include(match I18n.t("validations.sales.household.age.child_under_16_ecstat", person_num: 2)) end end end @@ -143,11 +143,11 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.relat2 = "C" household_validator.validate_child_12_years_younger(record) expect(record.errors["age1"]) - .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) + .to include(match I18n.t("validations.sales.household.age.child_12_years_younger", person_num: 2)) expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) + .to include(match I18n.t("validations.sales.household.age.child_12_years_younger", person_num: 2)) expect(record.errors["relat2"]) - .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) + .to include(match I18n.t("validations.sales.household.age.child_12_years_younger", person_num: 2)) end it "expects the child is at least 12 years younger than buyer 1" do @@ -206,11 +206,11 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.relat2 = "C" 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.16_19_not_student")) + .to include(match I18n.t("validations.sales.household.relat.student_16_19.cannot_be_child.16_19_not_student")) expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.student_16_19.cannot_be_16_19.child_not_student")) + .to include(match I18n.t("validations.sales.household.age.student_16_19.cannot_be_16_19.child_not_student")) expect(record.errors["ecstat2"]) - .to include(match I18n.t("validations.household.ecstat.student_16_19.must_be_student")) + .to include(match I18n.t("validations.sales.household.ecstat.student_16_19.must_be_student")) end it "adds errors for a person who is a child of the buyer and a student but not aged 16-19" do @@ -219,11 +219,11 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.relat2 = "C" 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")) + .to include(match I18n.t("validations.sales.household.relat.student_16_19.cannot_be_child.student_not_16_19")) expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.student_16_19.must_be_16_19")) + .to include(match I18n.t("validations.sales.household.age.student_16_19.must_be_16_19")) expect(record.errors["ecstat2"]) - .to include(match I18n.t("validations.household.ecstat.student_16_19.cannot_be_student.child_not_16_19")) + .to include(match I18n.t("validations.sales.household.ecstat.student_16_19.cannot_be_student.child_not_16_19")) end end @@ -316,9 +316,9 @@ RSpec.describe Validations::Sales::HouseholdValidations do it "triggers a validation if buyer two will also not live in the property" do sales_log.buy2livein = 2 household_validator.validate_buyers_living_in_property(sales_log) - expect(sales_log.errors[:buylivein]).to include I18n.t("validations.household.buylivein.buyers_will_live_in_property_values_inconsistent_setup") - expect(sales_log.errors[:buy2livein]).to include I18n.t("validations.household.buylivein.buyers_will_live_in_property_values_inconsistent") - expect(sales_log.errors[:buy1livein]).to include I18n.t("validations.household.buylivein.buyers_will_live_in_property_values_inconsistent") + expect(sales_log.errors[:buylivein]).to include I18n.t("validations.sales.household.buylivein.buyers_will_live_in_property_values_inconsistent") + expect(sales_log.errors[:buy2livein]).to include I18n.t("validations.sales.household.buy2livein.buyers_will_live_in_property_values_inconsistent") + expect(sales_log.errors[:buy1livein]).to include I18n.t("validations.sales.household.buy1livein.buyers_will_live_in_property_values_inconsistent") end end end