diff --git a/app/helpers/interruption_screen_helper.rb b/app/helpers/interruption_screen_helper.rb index c30ba7bfa..59619dbb0 100644 --- a/app/helpers/interruption_screen_helper.rb +++ b/app/helpers/interruption_screen_helper.rb @@ -34,6 +34,8 @@ module InterruptionScreenHelper lettings_log.form.get_question(argument["key"], lettings_log).answer_label(lettings_log).downcase elsif argument["currency"] number_to_currency(lettings_log.public_send(argument["key"]), delimiter: ",", format: "%n", unit: "£") + elsif argument["arguments_for_public_send"] + lettings_log.public_send(argument["key"], argument["arguments_for_public_send"]) else lettings_log.public_send(argument["key"]) end diff --git a/app/models/form/sales/pages/buyer2_income_value_check.rb b/app/models/form/sales/pages/buyer2_income_value_check.rb index 1dadd53d0..0262a4283 100644 --- a/app/models/form/sales/pages/buyer2_income_value_check.rb +++ b/app/models/form/sales/pages/buyer2_income_value_check.rb @@ -9,6 +9,20 @@ class Form::Sales::Pages::Buyer2IncomeValueCheck < ::Form::Page "income2_under_soft_min?" => true, }, ] + @title_text = { + "translation" => "soft_validations.income.under_soft_min_for_economic_status", + "arguments" => [ + { + "key" => "income2", + "i18n_template" => "income", + }, + { + "key" => "income_soft_min_for_ecstat", + "arguments_for_public_send" => "ecstat2", + "i18n_template" => "minimum", + }, + ], + } @informative_text = {} end diff --git a/app/models/form/sales/questions/buyer2_income_value_check.rb b/app/models/form/sales/questions/buyer2_income_value_check.rb index 84a47f521..0ae80a956 100644 --- a/app/models/form/sales/questions/buyer2_income_value_check.rb +++ b/app/models/form/sales/questions/buyer2_income_value_check.rb @@ -3,7 +3,7 @@ class Form::Sales::Questions::Buyer2IncomeValueCheck < ::Form::Question super @id = "income2_value_check" @check_answer_label = "Income confirmation" - @header = "Are you sure this income is correct?" + @header = "Are you sure?" @type = "interruption_screen" @answer_options = { "0" => { "value" => "Yes" }, diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb index 23610d503..5f4cacc99 100644 --- a/app/models/sales_log.rb +++ b/app/models/sales_log.rb @@ -248,4 +248,12 @@ class SalesLog < Log def purchase_price_soft_max LaSaleRange.find_by(start_year: collection_start_year, la:, bedrooms: beds).soft_max end + + def income_soft_min_for_ecstat(ecstat_field) + economic_status_code = public_send(ecstat_field) + + return unless ALLOWED_INCOME_RANGES + + ALLOWED_INCOME_RANGES[economic_status_code]&.soft_min + end end diff --git a/app/models/validations/sales/financial_validations.rb b/app/models/validations/sales/financial_validations.rb index 5bb41a8ac..e91c0b350 100644 --- a/app/models/validations/sales/financial_validations.rb +++ b/app/models/validations/sales/financial_validations.rb @@ -7,9 +7,9 @@ module Validations::Sales::FinancialValidations relevant_fields = %i[income1 ecstat1 ownershipsch la postcode_full] if record.london_property? && record.income1 > 90_000 - relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000) } + relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.over_hard_max_for_london") } elsif record.property_not_in_london? && record.income1 > 80_000 - relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000) } + relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.over_hard_max_for_outside_london") } end end @@ -18,9 +18,9 @@ module Validations::Sales::FinancialValidations relevant_fields = %i[income2 ecstat2 ownershipsch la postcode_full] if record.london_property? && record.income2 > 90_000 - relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000) } + relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.over_hard_max_for_london") } elsif record.property_not_in_london? && record.income2 > 80_000 - relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000) } + relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.over_hard_max_for_outside_london") } end end @@ -30,9 +30,9 @@ module Validations::Sales::FinancialValidations combined_income = record.income1 + record.income2 relevant_fields = %i[income1 income2 ownershipsch la postcode_full] if record.london_property? && combined_income > 90_000 - relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.combined_over_hard_max", hard_max: 90_000) } + relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.combined_over_hard_max_for_london") } elsif record.property_not_in_london? && combined_income > 80_000 - relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.combined_over_hard_max", hard_max: 80_000) } + relevant_fields.each { |field| record.errors.add field, I18n.t("validations.financial.income.combined_over_hard_max_for_outside_london") } end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 1602f9625..195abd838 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -217,9 +217,11 @@ en: freq_missing: "Select how often the household receives income" earnings_missing: "Enter how much income the household has in total" income: - over_hard_max: "Income must be lower than £%{hard_max}" - combined_over_hard_max: "Combined income must not be more than £%{hard_max}" - child_has_income: "A child's income must be 0" + over_hard_max_for_london: "Income must not exceed £90,000 for properties within London local authorities" + over_hard_max_for_outside_london: "Income must not exceed £80,000 for properties outside London local authorities" + combined_over_hard_max_for_london: "Combined income must not exceed £90,000 for properties within London local authorities" + combined_over_hard_max_for_outside_london: "Combined income must not exceed £80,000 for properties outside London local authorities" + child_has_income: "Child's income must be £0" negative_currency: "Enter an amount above 0" rent: less_than_shortfall: "Enter an amount that is more than the shortfall in basic rent" @@ -456,6 +458,8 @@ en: message: "Net income is lower than expected based on the lead tenant’s working situation. Are you sure this is correct?" in_soft_max_range: message: "Net income is higher than expected based on the lead tenant’s working situation. Are you sure this is correct?" + income: + under_soft_min_for_economic_status: "You said income was £%{income}, which is below this working situation's minimum (£%{minimum})" rent: outside_range_title: "You told us the rent is %{brent}" min_hint_text: "The minimum rent expected for this type of property in this local authority is £%{soft_min_for_period}." diff --git a/spec/models/validations/sales/financial_validations_spec.rb b/spec/models/validations/sales/financial_validations_spec.rb index d8ddd2dbd..3a64b2b7b 100644 --- a/spec/models/validations/sales/financial_validations_spec.rb +++ b/spec/models/validations/sales/financial_validations_spec.rb @@ -18,22 +18,22 @@ RSpec.describe Validations::Sales::FinancialValidations do record.income1 = 85_000 record.ecstat1 = rand(0..8) financial_validator.validate_income1(record) - expect(record.errors["income1"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) - expect(record.errors["ecstat1"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) - expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) - expect(record.errors["la"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) - expect(record.errors["postcode_full"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) + expect(record.errors["income1"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) + expect(record.errors["ecstat1"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) + expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) + expect(record.errors["la"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) + expect(record.errors["postcode_full"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) end it "adds errors if buyer 2's economic status is not child and has income over 80,000" do record.income2 = 85_000 record.ecstat2 = rand(0..8) financial_validator.validate_income2(record) - expect(record.errors["income2"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) - expect(record.errors["ecstat2"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) - expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) - expect(record.errors["la"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) - expect(record.errors["postcode_full"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 80_000)) + expect(record.errors["income2"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) + expect(record.errors["ecstat2"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) + expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) + expect(record.errors["la"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) + expect(record.errors["postcode_full"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_outside_london")) end it "does not add errors if buyer 1 has not set economic status" do @@ -66,8 +66,8 @@ RSpec.describe Validations::Sales::FinancialValidations do record.income1 = 45_000 record.income2 = 40_000 financial_validator.validate_combined_income(record) - expect(record.errors["income1"]).to include(match I18n.t("validations.financial.income.combined_over_hard_max", hard_max: 80_000)) - expect(record.errors["income2"]).to include(match I18n.t("validations.financial.income.combined_over_hard_max", hard_max: 80_000)) + expect(record.errors["income1"]).to include(match I18n.t("validations.financial.income.combined_over_hard_max_for_outside_london")) + expect(record.errors["income2"]).to include(match I18n.t("validations.financial.income.combined_over_hard_max_for_outside_london")) end it "does not add errors when combined income is under 80_000" do @@ -88,22 +88,22 @@ RSpec.describe Validations::Sales::FinancialValidations do record.income1 = 95_000 record.ecstat1 = rand(0..8) financial_validator.validate_income1(record) - expect(record.errors["income1"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) - expect(record.errors["ecstat1"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) - expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) - expect(record.errors["la"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) - expect(record.errors["postcode_full"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) + expect(record.errors["income1"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) + expect(record.errors["ecstat1"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) + expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) + expect(record.errors["la"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) + expect(record.errors["postcode_full"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) end it "adds errors if buyer 2's economic status is not child and has income over 90,000" do record.income2 = 95_000 record.ecstat2 = rand(0..8) financial_validator.validate_income2(record) - expect(record.errors["income2"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) - expect(record.errors["ecstat2"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) - expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) - expect(record.errors["la"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) - expect(record.errors["postcode_full"]).to include(match I18n.t("validations.financial.income.over_hard_max", hard_max: 90_000)) + expect(record.errors["income2"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) + expect(record.errors["ecstat2"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) + expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) + expect(record.errors["la"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) + expect(record.errors["postcode_full"]).to include(match I18n.t("validations.financial.income.over_hard_max_for_london")) end it "does not add errors if buyer 1 has not set economic status" do @@ -136,8 +136,8 @@ RSpec.describe Validations::Sales::FinancialValidations do record.income1 = 55_000 record.income2 = 40_000 financial_validator.validate_combined_income(record) - expect(record.errors["income1"]).to include(match I18n.t("validations.financial.income.combined_over_hard_max", hard_max: 90_000)) - expect(record.errors["income2"]).to include(match I18n.t("validations.financial.income.combined_over_hard_max", hard_max: 90_000)) + expect(record.errors["income1"]).to include(match I18n.t("validations.financial.income.combined_over_hard_max_for_london")) + expect(record.errors["income2"]).to include(match I18n.t("validations.financial.income.combined_over_hard_max_for_london")) end it "does not add errors when combined income is under 90_000" do