From 40c63ea1ef1a747a2f1ad0362f78184d91529b24 Mon Sep 17 00:00:00 2001 From: natdeanlewissoftwire Date: Fri, 13 Jan 2023 10:17:03 +0000 Subject: [PATCH] feat: DRY general household member validation --- .../validations/household_validations.rb | 64 +----------------- .../sales/household_validations.rb | 4 +- app/models/validations/shared_validations.rb | 65 +++++++++++++++++++ db/schema.rb | 12 ++-- 4 files changed, 75 insertions(+), 70 deletions(-) diff --git a/app/models/validations/household_validations.rb b/app/models/validations/household_validations.rb index 692800a87..0f4a53dfd 100644 --- a/app/models/validations/household_validations.rb +++ b/app/models/validations/household_validations.rb @@ -42,16 +42,11 @@ module Validations::HouseholdValidations 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 - shared_validate_partner_count(record, 6) + shared_validate_household_number_of_other_members(record, 8) end def validate_person_1_economic(record) - validate_person_age_matches_economic_status(record, 1) + shared_validate_person_age_matches_economic_status(record, 1) end def validate_condition_effects(record) @@ -143,59 +138,4 @@ private record["sex#{n}"] == "F" 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 && !tenant_is_economic_child?(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", 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 && !tenant_is_child?(relationship) - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_under_16", person_num:) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_relat", 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 - - 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 end diff --git a/app/models/validations/sales/household_validations.rb b/app/models/validations/sales/household_validations.rb index c142cd0e1..0b3e57a05 100644 --- a/app/models/validations/sales/household_validations.rb +++ b/app/models/validations/sales/household_validations.rb @@ -9,7 +9,7 @@ module Validations::Sales::HouseholdValidations end end - def validate_partner_count(record) - shared_validate_partner_count(record, 8) + def validate_household_number_of_other_members(record) + shared_validate_household_number_of_other_members(record, 6) end end diff --git a/app/models/validations/shared_validations.rb b/app/models/validations/shared_validations.rb index f15f9bb66..9ce6e2c0d 100644 --- a/app/models/validations/shared_validations.rb +++ b/app/models/validations/shared_validations.rb @@ -69,6 +69,54 @@ module Validations::SharedValidations { scope: status, date: date&.to_formatted_s(:govuk_date), deactivation_date: closest_reactivation&.deactivation_date&.to_formatted_s(:govuk_date) } end + def shared_validate_household_number_of_other_members(record, max_people) + (2..max_people).each do |n| + shared_validate_person_age_matches_economic_status(record, n) + shared_validate_person_age_matches_relationship(record, n) + shared_validate_person_age_and_relationship_matches_economic_status(record, n) + end + shared_validate_partner_count(record, max_people) + end + + def shared_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 && !tenant_is_child?(relationship) + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_under_16", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_relat", person_num:) + end + end + + def shared_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 && !tenant_is_economic_child?(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", 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 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 && 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 shared_validate_partner_count(record, max_people) partner_count = (2..max_people).count { |n| tenant_is_partner?(record["relat#{n}"]) } if partner_count > 1 @@ -76,8 +124,25 @@ module Validations::SharedValidations end end + private + 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 + def tenant_is_partner?(relationship) relationship == "P" end diff --git a/db/schema.rb b/db/schema.rb index 31f16f79d..b6e0ed6d8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -421,6 +421,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_01_09_160738) do t.string "relat5" t.string "relat6" t.integer "hb" + t.string "sex4" + t.string "sex5" + t.string "sex6" t.integer "savings_value_check" t.integer "deposit_value_check" t.integer "frombeds" @@ -457,20 +460,17 @@ ActiveRecord::Schema[7.0].define(version: 2023_01_09_160738) do t.integer "hhregres" t.integer "hhregresstill" t.integer "proplen" + t.integer "mscharge_known" + t.decimal "mscharge", precision: 10, scale: 2 t.integer "prevten" t.integer "mortgageused" t.integer "wchair" t.integer "armedforcesspouse" - t.integer "mscharge_known" - t.decimal "mscharge", precision: 10, scale: 2 - t.string "sex4" - t.string "sex5" - t.string "sex6" - t.integer "mortlen" t.datetime "hodate", precision: nil t.integer "hoday" t.integer "homonth" t.integer "hoyear" + t.integer "mortlen" t.index ["created_by_id"], name: "index_sales_logs_on_created_by_id" t.index ["managing_organisation_id"], name: "index_sales_logs_on_managing_organisation_id" t.index ["owning_organisation_id"], name: "index_sales_logs_on_owning_organisation_id"