From 8c8f8d2b7c3abca3f81fdf1fa031fbdf162b5c6a Mon Sep 17 00:00:00 2001 From: Rachael Booth Date: Tue, 16 Jan 2024 12:42:42 +0000 Subject: [PATCH] CLDC-3110: Make income validations apply to all ecstat fields and take account of details not known --- app/models/lettings_log.rb | 33 ++++++++++++++----- .../validations/financial_validations.rb | 15 +++++---- app/models/validations/soft_validations.rb | 4 +-- spec/models/lettings_log_spec.rb | 29 ++++++++++++++++ .../validations/financial_validations_spec.rb | 16 +++++++++ 5 files changed, 80 insertions(+), 17 deletions(-) diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb index 016e48f2e..1b9b74bb8 100644 --- a/app/models/lettings_log.rb +++ b/app/models/lettings_log.rb @@ -213,20 +213,35 @@ class LettingsLog < Log format_as_currency((field_value * 52) / num_of_weeks) end + def all_relevant_ecstat_provided + return false unless ecstat1 + + if hhmemb && hhmemb > 1 + (2..hhmemb).each do |person_index| + next if details_not_known_for_person?(person_index) + + return false unless self["ecstat#{person_index}"] + end + end + + true + end + def applicable_income_range - return unless ecstat1 + return unless all_relevant_ecstat_provided range = ALLOWED_INCOME_RANGES[ecstat1].clone - (2..8).each do |person_index| - ecstat = self["ecstat#{person_index}"] - next unless ecstat + if hhmemb && hhmemb > 1 + (2..hhmemb).each do |person_index| + ecstat = details_not_known_for_person?(person_index) ? 10 : self["ecstat#{person_index}"] - person_range = ALLOWED_INCOME_RANGES[ecstat] - range.soft_min += person_range.soft_min - range.hard_min += person_range.hard_min - range.soft_max += person_range.soft_max - range.hard_max += person_range.hard_max + person_range = ALLOWED_INCOME_RANGES[ecstat] + range.soft_min += person_range.soft_min + range.hard_min += person_range.hard_min + range.soft_max += person_range.soft_max + range.hard_max += person_range.hard_max + end end range diff --git a/app/models/validations/financial_validations.rb b/app/models/validations/financial_validations.rb index eb66de861..7396465e7 100644 --- a/app/models/validations/financial_validations.rb +++ b/app/models/validations/financial_validations.rb @@ -24,7 +24,7 @@ module Validations::FinancialValidations end def validate_net_income(record) - if record.ecstat1 && record.weekly_net_income + if record.all_relevant_ecstat_provided && record.weekly_net_income if record.weekly_net_income > record.applicable_income_range.hard_max hard_max = format_as_currency(record.applicable_income_range.hard_max) frequency = record.form.get_question("incfreq", record).label_from_value(record.incfreq).downcase @@ -33,11 +33,14 @@ module Validations::FinancialValidations :over_hard_max, message: I18n.t("validations.financial.earnings.over_hard_max", hard_max:), ) - record.errors.add( - :ecstat1, - :over_hard_max, - message: I18n.t("validations.financial.ecstat.over_hard_max", earnings: format_as_currency(record.earnings), frequency:), - ) + ecstat_fields = %i[ecstat1 ecstat2 ecstat3 ecstat4 ecstat5 ecstat6 ecstat7 ecstat8] + ecstat_fields.each do |field| + record.errors.add( + field, + :over_hard_max, + message: I18n.t("validations.financial.ecstat.over_hard_max", earnings: format_as_currency(record.earnings), frequency:), + ) + end end if record.weekly_net_income < record.applicable_income_range.hard_min diff --git a/app/models/validations/soft_validations.rb b/app/models/validations/soft_validations.rb index d6c57f257..7c4f5c65d 100644 --- a/app/models/validations/soft_validations.rb +++ b/app/models/validations/soft_validations.rb @@ -14,13 +14,13 @@ module Validations::SoftValidations }.freeze def net_income_in_soft_max_range? - return unless weekly_net_income && ecstat1 + return unless weekly_net_income && all_relevant_ecstat_provided weekly_net_income.between?(applicable_income_range.soft_max, applicable_income_range.hard_max) end def net_income_in_soft_min_range? - return unless weekly_net_income && ecstat1 + return unless weekly_net_income && all_relevant_ecstat_provided weekly_net_income.between?(applicable_income_range.hard_min, applicable_income_range.soft_min) end diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 1f128c8d7..23febab96 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -3411,5 +3411,34 @@ RSpec.describe LettingsLog do end end end + + describe "#all_relevant_ecstat_provided" do + context "when details for a non-lead tenant are not known" do + let(:lettings_log) { build(:lettings_log, hhmemb: 2, ecstat1: 1, details_known_2: 1) } + + it "returns true" do + expect(lettings_log.all_relevant_ecstat_provided).to be(true) + end + end + + context "when details for a non-lead tenant are known" do + context "and that person's ecstat is provided" do + let(:lettings_log) { build(:lettings_log, hhmemb: 2, ecstat1: 1, details_known_2: 0, ecstat2: 2) } + + it "returns true" do + expect(lettings_log.all_relevant_ecstat_provided).to be(true) + end + end + + context "and that person's ecstat is not provided" do + let(:lettings_log) { build(:lettings_log, hhmemb: 2, ecstat1: 1, details_known_2: 0) } + + it "returns true" do + expect(lettings_log.all_relevant_ecstat_provided).to be(false) + end + end + end + + end end # rubocop:enable RSpec/MessageChain diff --git a/spec/models/validations/financial_validations_spec.rb b/spec/models/validations/financial_validations_spec.rb index 0139a7ae4..1aff44a9f 100644 --- a/spec/models/validations/financial_validations_spec.rb +++ b/spec/models/validations/financial_validations_spec.rb @@ -223,6 +223,7 @@ RSpec.describe Validations::FinancialValidations do it "allows income levels based on all working situations combined" do record.earnings = 5000 record.incfreq = 1 + record.hhmemb = 4 record.ecstat1 = 1 record.ecstat2 = 1 record.ecstat3 = 8 @@ -234,6 +235,7 @@ RSpec.describe Validations::FinancialValidations do it "uses the combined value in error messages" do record.earnings = 100 record.incfreq = 1 + record.hhmemb = 3 record.ecstat1 = 1 record.ecstat2 = 2 record.ecstat3 = 9 @@ -241,6 +243,20 @@ RSpec.describe Validations::FinancialValidations do expect(record.errors["earnings"]) .to eq(["Net income cannot be less than £150.00 per week given the household’s working situation"]) end + + it "adds errors to all tenant ecstat fields when income is too high" do + record.earnings = 5000 + record.incfreq = 1 + record.hhmemb = 3 + record.ecstat1 = 1 + record.ecstat2 = 2 + record.ecstat3 = 9 + financial_validator.validate_net_income(record) + (1..8).each do |n| + expect(record.errors["ecstat#{n}"]) + .to eq(["Net household income of £5,000.00 weekly is too high given the household’s working situation"]) + end + end end end