Browse Source

feat: DRY general household member validation

pull/1178/head
natdeanlewissoftwire 3 years ago
parent
commit
40c63ea1ef
  1. 64
      app/models/validations/household_validations.rb
  2. 4
      app/models/validations/sales/household_validations.rb
  3. 65
      app/models/validations/shared_validations.rb
  4. 12
      db/schema.rb

64
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

4
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

65
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

12
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"

Loading…
Cancel
Save