From 91e08b5f4599ab50f220031dfaabae2e7ad49bc9 Mon Sep 17 00:00:00 2001 From: natdeanlewissoftwire Date: Fri, 16 Feb 2024 10:19:20 +0000 Subject: [PATCH] feat: make charges soft validations check soft max range rather than just over soft max --- app/helpers/charges_helper.rb | 38 ++++++++++++ .../lettings/pages/pscharge_value_check.rb | 2 +- .../lettings/pages/scharge_value_check.rb | 2 +- .../lettings/pages/supcharg_value_check.rb | 2 +- .../validations/financial_validations.rb | 38 +----------- app/models/validations/soft_validations.rb | 62 ++++++++++++------- config/forms/2022_2023.json | 6 +- .../validations/soft_validations_spec.rb | 6 +- 8 files changed, 86 insertions(+), 70 deletions(-) create mode 100644 app/helpers/charges_helper.rb diff --git a/app/helpers/charges_helper.rb b/app/helpers/charges_helper.rb new file mode 100644 index 000000000..44e20b6e3 --- /dev/null +++ b/app/helpers/charges_helper.rb @@ -0,0 +1,38 @@ +module ChargesHelper + CHARGE_MAXIMA_PER_WEEK = { + scharge: { + private_registered_provider: { + general_needs: 800, + supported_housing: 800, + }, + local_authority: { + general_needs: 500, + supported_housing: 500, + }, + }, + pscharge: { + private_registered_provider: { + general_needs: 700, + supported_housing: 700, + }, + local_authority: { + general_needs: 200, + supported_housing: 200, + }, + }, + supcharg: { + private_registered_provider: { + general_needs: 800, + supported_housing: 800, + }, + local_authority: { + general_needs: 200, + supported_housing: 200, + }, + }, + }.freeze + + PROVIDER_TYPE = { 1 => :local_authority, 2 => :private_registered_provider }.freeze + NEEDSTYPE_VALUES = { 2 => :supported_housing, 1 => :general_needs }.freeze + CHARGE_NAMES = { scharge: "service charge", pscharge: "personal service charge", supcharg: "support charge" }.freeze +end diff --git a/app/models/form/lettings/pages/pscharge_value_check.rb b/app/models/form/lettings/pages/pscharge_value_check.rb index 89cca160e..6c8ada196 100644 --- a/app/models/form/lettings/pages/pscharge_value_check.rb +++ b/app/models/form/lettings/pages/pscharge_value_check.rb @@ -2,7 +2,7 @@ class Form::Lettings::Pages::PschargeValueCheck < ::Form::Page def initialize(id, hsh, subsection) super @id = "pscharge_value_check" - @depends_on = [{ "pscharge_over_soft_max?" => true }] + @depends_on = [{ "pscharge_in_soft_max_range?" => true }] @title_text = { "translation" => "soft_validations.pscharge.over_soft_max_title", "arguments" => [{ diff --git a/app/models/form/lettings/pages/scharge_value_check.rb b/app/models/form/lettings/pages/scharge_value_check.rb index 72ad8039e..73ee41920 100644 --- a/app/models/form/lettings/pages/scharge_value_check.rb +++ b/app/models/form/lettings/pages/scharge_value_check.rb @@ -2,7 +2,7 @@ class Form::Lettings::Pages::SchargeValueCheck < ::Form::Page def initialize(id, hsh, subsection) super @id = "scharge_value_check" - @depends_on = [{ "scharge_over_soft_max?" => true }] + @depends_on = [{ "scharge_in_soft_max_range?" => true }] @title_text = { "translation" => "soft_validations.scharge.over_soft_max_title", "arguments" => [{ diff --git a/app/models/form/lettings/pages/supcharg_value_check.rb b/app/models/form/lettings/pages/supcharg_value_check.rb index 8155a28bb..a974a8f89 100644 --- a/app/models/form/lettings/pages/supcharg_value_check.rb +++ b/app/models/form/lettings/pages/supcharg_value_check.rb @@ -2,7 +2,7 @@ class Form::Lettings::Pages::SupchargValueCheck < ::Form::Page def initialize(id, hsh, subsection) super @id = "supcharg_value_check" - @depends_on = [{ "supcharg_over_soft_max?" => true }] + @depends_on = [{ "supcharg_in_soft_max_range?" => true }] @title_text = { "translation" => "soft_validations.supcharg.over_soft_max_title", "arguments" => [{ diff --git a/app/models/validations/financial_validations.rb b/app/models/validations/financial_validations.rb index 890c28284..0b9209281 100644 --- a/app/models/validations/financial_validations.rb +++ b/app/models/validations/financial_validations.rb @@ -1,6 +1,7 @@ module Validations::FinancialValidations include Validations::SharedValidations include MoneyFormattingHelper + include ChargesHelper # Validations methods need to be called 'validate_' to run on model save # or 'validate_' to run on submit as well def validate_outstanding_rent_amount(record) @@ -175,43 +176,6 @@ module Validations::FinancialValidations private - CHARGE_MAXIMA_PER_WEEK = { - scharge: { - private_registered_provider: { - general_needs: 800, - supported_housing: 800, - }, - local_authority: { - general_needs: 500, - supported_housing: 500, - }, - }, - pscharge: { - private_registered_provider: { - general_needs: 700, - supported_housing: 700, - }, - local_authority: { - general_needs: 200, - supported_housing: 200, - }, - }, - supcharg: { - private_registered_provider: { - general_needs: 800, - supported_housing: 800, - }, - local_authority: { - general_needs: 200, - supported_housing: 200, - }, - }, - }.freeze - - PROVIDER_TYPE = { 1 => :local_authority, 2 => :private_registered_provider }.freeze - NEEDSTYPE_VALUES = { 2 => :supported_housing, 1 => :general_needs }.freeze - CHARGE_NAMES = { scharge: "service charge", pscharge: "personal service charge", supcharg: "support charge" }.freeze - def validate_charges(record) return unless record.owning_organisation diff --git a/app/models/validations/soft_validations.rb b/app/models/validations/soft_validations.rb index 92685afe0..c645752f0 100644 --- a/app/models/validations/soft_validations.rb +++ b/app/models/validations/soft_validations.rb @@ -1,4 +1,6 @@ module Validations::SoftValidations + include ChargesHelper + ALLOWED_INCOME_RANGES = { 1 => OpenStruct.new(soft_min: 143, soft_max: 730, hard_min: 90, hard_max: 1230), 2 => OpenStruct.new(soft_min: 67, soft_max: 620, hard_min: 50, hard_max: 950), @@ -97,40 +99,52 @@ module Validations::SoftValidations net_income_in_soft_max_range? ? "higher" : "lower" end - def scharge_over_soft_max? - return unless scharge && period && needstype + def scharge_in_soft_max_range? + return unless scharge && period && needstype && owning_organisation return if weekly_value(scharge).blank? - max = if needstype == 1 - owning_organisation.provider_type == "LA" ? 25 : 35 - else - owning_organisation.provider_type == "LA" ? 100 : 200 - end - weekly_value(scharge) > max + soft_max = if needstype == 1 + owning_organisation.provider_type == "LA" ? 25 : 35 + else + owning_organisation.provider_type == "LA" ? 100 : 200 + end + + provider_type = owning_organisation.provider_type_before_type_cast + hard_max = CHARGE_MAXIMA_PER_WEEK.dig(:scharge, PROVIDER_TYPE[provider_type], NEEDSTYPE_VALUES[needstype]) + + weekly_value(scharge).between?(soft_max, hard_max) end - def pscharge_over_soft_max? - return unless pscharge && period && needstype + def pscharge_in_soft_max_range? + return unless pscharge && period && needstype && owning_organisation return if weekly_value(pscharge).blank? - max = if needstype == 1 - owning_organisation.provider_type == "LA" ? 25 : 35 - else - owning_organisation.provider_type == "LA" ? 75 : 100 - end - weekly_value(pscharge) > max + soft_max = if needstype == 1 + owning_organisation.provider_type == "LA" ? 25 : 35 + else + owning_organisation.provider_type == "LA" ? 75 : 100 + end + + provider_type = owning_organisation.provider_type_before_type_cast + hard_max = CHARGE_MAXIMA_PER_WEEK.dig(:pscharge, PROVIDER_TYPE[provider_type], NEEDSTYPE_VALUES[needstype]) + + weekly_value(pscharge).between?(soft_max, hard_max) end - def supcharg_over_soft_max? - return unless supcharg && period && needstype + def supcharg_in_soft_max_range? + return unless supcharg && period && needstype && owning_organisation return if weekly_value(supcharg).blank? - max = if needstype == 1 - owning_organisation.provider_type == "LA" ? 25 : 35 - else - owning_organisation.provider_type == "LA" ? 75 : 85 - end - weekly_value(supcharg) > max + soft_max = if needstype == 1 + owning_organisation.provider_type == "LA" ? 25 : 35 + else + owning_organisation.provider_type == "LA" ? 75 : 85 + end + + provider_type = owning_organisation.provider_type_before_type_cast + hard_max = CHARGE_MAXIMA_PER_WEEK.dig(:supcharg, PROVIDER_TYPE[provider_type], NEEDSTYPE_VALUES[needstype]) + + weekly_value(supcharg).between?(soft_max, hard_max) end private diff --git a/config/forms/2022_2023.json b/config/forms/2022_2023.json index affc18971..7de00a07b 100644 --- a/config/forms/2022_2023.json +++ b/config/forms/2022_2023.json @@ -8370,7 +8370,7 @@ "scharge_value_check": { "depends_on": [ { - "scharge_over_soft_max?": true + "scharge_in_soft_max_range?": true } ], "title_text": { @@ -8415,7 +8415,7 @@ "pscharge_value_check": { "depends_on": [ { - "pscharge_over_soft_max?": true + "pscharge_in_soft_max_range?": true } ], "title_text": { @@ -8460,7 +8460,7 @@ "supcharg_value_check": { "depends_on": [ { - "supcharg_over_soft_max?": true + "supcharg_in_soft_max_range?": true } ], "title_text": { diff --git a/spec/models/validations/soft_validations_spec.rb b/spec/models/validations/soft_validations_spec.rb index 8f00799ff..f449a8c2d 100644 --- a/spec/models/validations/soft_validations_spec.rb +++ b/spec/models/validations/soft_validations_spec.rb @@ -376,7 +376,7 @@ RSpec.describe Validations::SoftValidations do end end - describe "scharge_over_soft_max?" do + describe "scharge_in_soft_max_range?" do context "and organisation is PRP" do before do record.owning_organisation.update(provider_type: "PRP") @@ -590,7 +590,7 @@ RSpec.describe Validations::SoftValidations do end end - describe "pscharge_over_soft_max?" do + describe "pscharge_in_soft_max_range?" do context "and organisation is PRP" do before do record.owning_organisation.update(provider_type: "PRP") @@ -804,7 +804,7 @@ RSpec.describe Validations::SoftValidations do end end - describe "supcharg_over_soft_max?" do + describe "supcharg_in_soft_max_range?" do context "and organisation is PRP" do before do record.owning_organisation.update(provider_type: "PRP")