You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1218 lines
48 KiB
1218 lines
48 KiB
require "rails_helper" |
|
|
|
RSpec.describe Validations::FinancialValidations do |
|
subject(:financial_validator) { validator_class.new } |
|
|
|
let(:validator_class) { Class.new { include Validations::FinancialValidations } } |
|
let(:record) { FactoryBot.create(:lettings_log) } |
|
let(:fake_2021_2022_form) { Form.new("spec/fixtures/forms/2021_2022.json") } |
|
|
|
before do |
|
allow(FormHandler.instance).to receive(:current_lettings_form).and_return(fake_2021_2022_form) |
|
end |
|
|
|
describe "earnings and income frequency" do |
|
it "when earnings are provided it validates that income frequency must be provided" do |
|
record.earnings = 500 |
|
record.incfreq = nil |
|
financial_validator.validate_net_income(record) |
|
expect(record.errors["incfreq"]) |
|
.to include(match I18n.t("validations.financial.earnings.freq_missing")) |
|
expect(record.errors["earnings"]) |
|
.to include(match I18n.t("validations.financial.earnings.freq_missing")) |
|
end |
|
|
|
it "when income frequency is provided it validates that earnings must be provided" do |
|
record.earnings = nil |
|
record.incfreq = 1 |
|
financial_validator.validate_net_income(record) |
|
expect(record.errors["earnings"]) |
|
.to include(match I18n.t("validations.financial.earnings.earnings_missing")) |
|
expect(record.errors["incfreq"]) |
|
.to include(match I18n.t("validations.financial.earnings.earnings_missing")) |
|
end |
|
end |
|
|
|
describe "benefits proportion validations" do |
|
context "when the proportion is all" do |
|
it "validates that the lead tenant is not in full time employment" do |
|
record.benefits = 0 |
|
record.ecstat1 = 1 |
|
financial_validator.validate_net_income_uc_proportion(record) |
|
expect(record.errors["benefits"]).to include(match I18n.t("validations.financial.benefits.part_or_full_time")) |
|
end |
|
|
|
it "validates that the lead tenant is not in part time employment" do |
|
record.benefits = 0 |
|
record.ecstat1 = 0 |
|
financial_validator.validate_net_income_uc_proportion(record) |
|
expect(record.errors["benefits"]).to include(match I18n.t("validations.financial.benefits.part_or_full_time")) |
|
end |
|
|
|
it "expects that the lead tenant is not in full-time or part-time employment" do |
|
record.benefits = 0 |
|
record.ecstat1 = 4 |
|
financial_validator.validate_net_income_uc_proportion(record) |
|
expect(record.errors["benefits"]).to be_empty |
|
end |
|
|
|
it "validates that the tenant’s partner is not in full time employment" do |
|
record.benefits = 0 |
|
record.ecstat2 = 0 |
|
record.relat2 = "P" |
|
financial_validator.validate_net_income_uc_proportion(record) |
|
expect(record.errors["benefits"]).to include(match I18n.t("validations.financial.benefits.part_or_full_time")) |
|
end |
|
|
|
it "expects that the tenant’s partner is not in full-time or part-time employment" do |
|
record.benefits = 0 |
|
record.ecstat2 = 4 |
|
record.relat2 = "P" |
|
financial_validator.validate_net_income_uc_proportion(record) |
|
expect(record.errors["benefits"]).to be_empty |
|
end |
|
end |
|
end |
|
|
|
describe "outstanding rent amount validations" do |
|
context "when outstanding rent or charges is no" do |
|
it "validates that no shortfall is provided" do |
|
record.hbrentshortfall = 2 |
|
record.tshortfall = 99 |
|
financial_validator.validate_outstanding_rent_amount(record) |
|
expect(record.errors["tshortfall"]) |
|
.to include(match I18n.t("validations.financial.tshortfall.outstanding_amount_not_expected")) |
|
end |
|
end |
|
|
|
context "when outstanding rent or charges is yes" do |
|
let(:record) { FactoryBot.create(:lettings_log, :setup_completed, startdate: Time.zone.now) } |
|
|
|
it "expects that a shortfall is provided" do |
|
record.hbrentshortfall = 1 |
|
record.tshortfall = 99 |
|
financial_validator.validate_outstanding_rent_amount(record) |
|
expect(record.errors["tshortfall"]).to be_empty |
|
end |
|
|
|
it "validates that the shortfall is a positive £ amount" do |
|
record.hb = 6 |
|
record.hbrentshortfall = 1 |
|
record.tshortfall_known = 0 |
|
record.tshortfall = 0 |
|
record.period = 2 |
|
record.set_derived_fields! |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tshortfall"]) |
|
.to include(match I18n.t("validations.financial.tshortfall.must_be_positive")) |
|
end |
|
|
|
it "validates that basic rent is no less than the shortfall" do |
|
record.hb = 6 |
|
record.hbrentshortfall = 1 |
|
record.tshortfall_known = 0 |
|
record.tshortfall = 299.50 |
|
record.brent = 198 |
|
record.period = 2 |
|
record.set_derived_fields! |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["brent"]) |
|
.to include(match I18n.t("validations.financial.rent.less_than_shortfall")) |
|
expect(record.errors["tshortfall"]) |
|
.to include(match I18n.t("validations.financial.tshortfall.more_than_rent")) |
|
end |
|
end |
|
end |
|
|
|
describe "rent period validations" do |
|
let(:organisation) { FactoryBot.create(:organisation) } |
|
let(:user) { FactoryBot.create(:user) } |
|
let(:record) { FactoryBot.create(:lettings_log, owning_organisation: user.organisation, managing_organisation: organisation, created_by: user) } |
|
|
|
before do |
|
FactoryBot.create(:organisation_relationship, parent_organisation: user.organisation, child_organisation: organisation) |
|
FactoryBot.create(:organisation_rent_period, organisation:, rent_period: 2) |
|
end |
|
|
|
context "when the organisation only uses specific rent periods" do |
|
it "validates that the selected rent period is used by the managing organisation" do |
|
record.period = 3 |
|
financial_validator.validate_rent_period(record) |
|
expect(record.errors["period"]) |
|
.to include(match I18n.t( |
|
"validations.financial.rent_period.invalid_for_org", |
|
org_name: organisation.name, |
|
rent_period: "every 4 weeks", |
|
)) |
|
end |
|
end |
|
end |
|
|
|
describe "housing benefit rent shortfall validations" do |
|
before { record.startdate = Time.zone.local(2022, 5, 1) } |
|
|
|
context "when shortfall is yes" do |
|
it "validates that housing benefit is not none" do |
|
record.hbrentshortfall = 1 |
|
record.hb = 9 |
|
financial_validator.validate_tshortfall(record) |
|
expect(record.errors["tshortfall"]) |
|
.to include(match I18n.t("validations.financial.hbrentshortfall.outstanding_no_benefits")) |
|
end |
|
|
|
it "validates that housing benefit is not don't know" do |
|
record.hbrentshortfall = 1 |
|
record.hb = 3 |
|
financial_validator.validate_tshortfall(record) |
|
expect(record.errors["tshortfall"]) |
|
.to include(match I18n.t("validations.financial.hbrentshortfall.outstanding_no_benefits")) |
|
end |
|
|
|
it "validates that housing benefit is not Universal Credit without housing benefit (prior to 22/23)" do |
|
record.startdate = Time.zone.local(2022, 3, 1) |
|
record.hbrentshortfall = 1 |
|
record.hb = 7 |
|
financial_validator.validate_tshortfall(record) |
|
expect(record.errors["tshortfall"]) |
|
.to include(match I18n.t("validations.financial.hbrentshortfall.outstanding_no_benefits")) |
|
end |
|
|
|
it "validates that housing benefit is provided" do |
|
record.hbrentshortfall = 1 |
|
record.hb = 1 |
|
financial_validator.validate_tshortfall(record) |
|
expect(record.errors["tshortfall"]).to be_empty |
|
end |
|
end |
|
end |
|
|
|
describe "net income validations" do |
|
it "validates that the net income is within the expected range for the household’s employment status" do |
|
record.startdate = Time.zone.local(2023, 5, 1) |
|
record.earnings = 200 |
|
record.incfreq = 1 |
|
record.hhmemb = 1 |
|
record.ecstat1 = 1 |
|
financial_validator.validate_net_income(record) |
|
expect(record.errors["earnings"]).to be_empty |
|
end |
|
|
|
context "when the net income is higher than the hard max for their employment status" do |
|
it "adds an error" do |
|
record.startdate = Time.zone.local(2023, 5, 1) |
|
record.earnings = 5000 |
|
record.incfreq = 1 |
|
record.hhmemb = 1 |
|
record.ecstat1 = 1 |
|
financial_validator.validate_net_income(record) |
|
expect(record.errors["earnings"]) |
|
.to eq(["The household’s income cannot be greater than £1,230.00 per week given the household’s working situation"]) |
|
expect(record.errors["ecstat1"]) |
|
.to eq(["The household’s income of £5,000.00 weekly is too high given the household’s working situation"]) |
|
expect(record.errors["hhmemb"]) |
|
.to eq(["The household’s income of £5,000.00 weekly is too high for this number of tenants. Change either the household income or number of tenants."]) |
|
end |
|
end |
|
|
|
context "when the net income is lower than the hard min for their employment status" do |
|
it "adds an error" do |
|
record.startdate = Time.zone.local(2023, 5, 1) |
|
record.earnings = 50 |
|
record.incfreq = 1 |
|
record.hhmemb = 1 |
|
record.ecstat1 = 1 |
|
financial_validator.validate_net_income(record) |
|
expect(record.errors["earnings"]) |
|
.to eq(["The household’s income cannot be less than £90.00 per week given the household’s working situation"]) |
|
expect(record.errors["ecstat1"]) |
|
.to eq(["The household’s income of £50.00 weekly is too low given the household’s working situation"]) |
|
expect(record.errors["hhmemb"]) |
|
.to eq(["The household’s income of £50.00 weekly is too low for this number of tenants. Change either the household income or number of tenants."]) |
|
end |
|
end |
|
|
|
context "when there is more than one household member" do |
|
it "allows income levels based on all working situations combined" do |
|
record.startdate = Time.zone.local(2023, 5, 1) |
|
record.earnings = 5000 |
|
record.incfreq = 1 |
|
record.hhmemb = 4 |
|
record.ecstat1 = 1 |
|
record.ecstat2 = 1 |
|
record.ecstat3 = 8 |
|
record.ecstat4 = 9 |
|
financial_validator.validate_net_income(record) |
|
expect(record.errors["earnings"]).to be_empty |
|
end |
|
|
|
it "uses the combined value in error messages" do |
|
record.startdate = Time.zone.local(2023, 5, 1) |
|
record.earnings = 100 |
|
record.incfreq = 1 |
|
record.hhmemb = 3 |
|
record.ecstat1 = 1 |
|
record.ecstat2 = 2 |
|
record.ecstat3 = 9 |
|
financial_validator.validate_net_income(record) |
|
expect(record.errors["earnings"]) |
|
.to eq(["The household’s income cannot be less than £150.00 per week given the household’s working situation"]) |
|
end |
|
|
|
it "adds errors to relevant fields for each tenant when income is too high" do |
|
record.startdate = Time.zone.local(2023, 5, 1) |
|
record.earnings = 5000 |
|
record.incfreq = 1 |
|
record.hhmemb = 3 |
|
record.ecstat1 = 1 |
|
record.ecstat2 = 2 |
|
record.age3 = 12 |
|
record.ecstat3 = 9 |
|
financial_validator.validate_net_income(record) |
|
(1..record.hhmemb).each do |n| |
|
expect(record.errors["ecstat#{n}"]) |
|
.to eq(["The household’s income of £5,000.00 weekly is too high given the household’s working situation"]) |
|
end |
|
expect(record.errors["age1"]).to be_empty |
|
expect(record.errors["age2"]).to be_empty |
|
expect(record.errors["age3"]) |
|
.to eq(["The household’s income of £5,000.00 weekly is too high for the number of adults. Change either the household income or the age of the tenants."]) |
|
(record.hhmemb + 1..8).each do |n| |
|
expect(record.errors["ecstat#{n}"]).to be_empty |
|
expect(record.errors["age#{n}"]).to be_empty |
|
end |
|
end |
|
|
|
it "adds errors to relevant fields for each tenant when income is too low" do |
|
record.startdate = Time.zone.local(2023, 5, 1) |
|
record.earnings = 50 |
|
record.incfreq = 1 |
|
record.hhmemb = 3 |
|
record.ecstat1 = 1 |
|
record.ecstat2 = 2 |
|
record.age3 = 12 |
|
record.ecstat3 = 9 |
|
financial_validator.validate_net_income(record) |
|
(1..record.hhmemb).each do |n| |
|
expect(record.errors["ecstat#{n}"]) |
|
.to eq(["The household’s income of £50.00 weekly is too low given the household’s working situation"]) |
|
end |
|
(record.hhmemb + 1..8).each do |n| |
|
expect(record.errors["ecstat#{n}"]).to be_empty |
|
end |
|
end |
|
|
|
context "when the net income is lower than the hard min for their employment status for 22/23 collection" do |
|
it "does not add an error" do |
|
record.startdate = Time.zone.local(2022, 5, 1) |
|
record.earnings = 50 |
|
record.incfreq = 1 |
|
record.hhmemb = 1 |
|
record.ecstat1 = 1 |
|
financial_validator.validate_net_income(record) |
|
expect(record.errors["earnings"]).to be_empty |
|
expect(record.errors["ecstat1"]).to be_empty |
|
expect(record.errors["hhmemb"]).to be_empty |
|
end |
|
end |
|
end |
|
end |
|
|
|
describe "financial validations" do |
|
context "when currency is negative" do |
|
it "returns error" do |
|
record.earnings = -8 |
|
record.brent = -2 |
|
record.scharge = -134 |
|
record.pscharge = -10_024 |
|
record.supcharg = -1 |
|
|
|
financial_validator.validate_negative_currency(record) |
|
expect(record.errors["earnings"]) |
|
.to include(match I18n.t("validations.financial.negative_currency")) |
|
expect(record.errors["brent"]) |
|
.to include(match I18n.t("validations.financial.negative_currency")) |
|
expect(record.errors["scharge"]) |
|
.to include(match I18n.t("validations.financial.negative_currency")) |
|
expect(record.errors["pscharge"]) |
|
.to include(match I18n.t("validations.financial.negative_currency")) |
|
expect(record.errors["supcharg"]) |
|
.to include(match I18n.t("validations.financial.negative_currency")) |
|
end |
|
end |
|
|
|
context "when the field allows decimals" do |
|
it "correctly co-erces values" do |
|
record.brent = "20" |
|
record.pscharge = "0.0" |
|
record.period = "2" |
|
financial_validator.validate_numeric_min_max(record) |
|
expect(record.errors["pscharge"]).to be_empty |
|
end |
|
end |
|
end |
|
|
|
describe "rent and charges validations" do |
|
let!(:location) { FactoryBot.create(:location, location_code: "E07000223") } |
|
|
|
context "when the owning organisation is a private registered provider" do |
|
before { record.owning_organisation.provider_type = 2 } |
|
|
|
context "when needstype is general needs" do |
|
before { record.needstype = 1 } |
|
|
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: 801 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£800.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "scharge", value: 3471 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£3,466.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "scharge", value: 1601 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£1,600.00", |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: 701 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£700.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "pscharge", value: 3200 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£3,033.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "pscharge", value: 1401 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£1,400.00", |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: 801 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£800.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "supcharg", value: 3471 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£3,466.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "supcharg", value: 1601 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£1,600.00", |
|
}].each do |test_case| |
|
it "does not allow charges outside the range when period is #{test_case[:period][:label]}" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to include(match I18n.t("validations.financial.rent.out_of_range", charge_name: test_case[:charge_name], maximum_per_period: test_case[:maximum_per_period], frequency: test_case[:period][:label], letting_type: "general needs", provider_type: "private registered provider")) |
|
end |
|
end |
|
|
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: 799 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "scharge", value: 3400 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "scharge", value: 1599 }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: 699 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "pscharge", value: 2500 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "pscharge", value: 1399 }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: 799 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "supcharg", value: 3000 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "supcharg", value: 1599 }, |
|
}].each do |test_case| |
|
it "does allow charges inside the range when period is #{test_case[:period][:label]}" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to be_empty |
|
end |
|
end |
|
end |
|
|
|
context "when needstype is supported housing" do |
|
before { record.needstype = 2 } |
|
|
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: 801 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£800.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "scharge", value: 3471 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£3,466.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "scharge", value: 1601 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£1,600.00", |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: 701 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£700.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "pscharge", value: 3200 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£3,033.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "pscharge", value: 1401 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£1,400.00", |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: 801 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£800.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "supcharg", value: 3471 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£3,466.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "supcharg", value: 1601 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£1,600.00", |
|
}].each do |test_case| |
|
it "does not allow charges outside the range when period is #{test_case[:period][:label]}" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to include(match I18n.t("validations.financial.rent.out_of_range", charge_name: test_case[:charge_name], maximum_per_period: test_case[:maximum_per_period], frequency: test_case[:period][:label], letting_type: "supported housing", provider_type: "private registered provider")) |
|
end |
|
end |
|
|
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: 799 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "scharge", value: 3400 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "scharge", value: 1599 }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: 699 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "pscharge", value: 2500 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "pscharge", value: 1399 }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: 799 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "supcharg", value: 3400 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "supcharg", value: 1599 }, |
|
}].each do |test_case| |
|
it "does allow charges inside the range when period is #{test_case[:period][:label]}" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to be_empty |
|
end |
|
end |
|
end |
|
end |
|
|
|
context "when the owning organisation is a local authority" do |
|
before { record.owning_organisation.provider_type = 1 } |
|
|
|
context "when needstype is general needs" do |
|
before { record.needstype = 1 } |
|
|
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: 501 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£500.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "scharge", value: 2300 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£2,166.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "scharge", value: 1001 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£1,000.00", |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: 201 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£200.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "pscharge", value: 1000 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£866.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "pscharge", value: 401 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£400.00", |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: 201 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£200.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "supcharg", value: 1000 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£866.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "supcharg", value: 401 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£400.00", |
|
}].each do |test_case| |
|
it "does not allow charges outside the range when period is #{test_case[:period][:label]}" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to include(match I18n.t("validations.financial.rent.out_of_range", charge_name: test_case[:charge_name], maximum_per_period: test_case[:maximum_per_period], frequency: test_case[:period][:label], letting_type: "general needs", provider_type: "local authority")) |
|
end |
|
end |
|
|
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: 499 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "scharge", value: 2000 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "scharge", value: 999 }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: 199 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "pscharge", value: 800 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "pscharge", value: 399 }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: 199.99 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "supcharg", value: 800 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "supcharg", value: 399 }, |
|
}].each do |test_case| |
|
it "does allow charges inside the range when period is #{test_case[:period][:label]}" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to be_empty |
|
end |
|
end |
|
end |
|
|
|
context "when needstype is supported housing" do |
|
before { record.needstype = 2 } |
|
|
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: 501 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£500.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "scharge", value: 2300 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£2,166.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "scharge", value: 1001 }, |
|
charge_name: "service charge", |
|
maximum_per_period: "£1,000.00", |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: 201 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£200.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "pscharge", value: 1000 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£866.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "pscharge", value: 401 }, |
|
charge_name: "personal service charge", |
|
maximum_per_period: "£400.00", |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: 201 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£200.00", |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "supcharg", value: 1000 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£866.00", |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "supcharg", value: 401 }, |
|
charge_name: "support charge", |
|
maximum_per_period: "£400.00", |
|
}].each do |test_case| |
|
it "does not allow charges outside the range when period is #{test_case[:period][:label]}" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to include(match I18n.t("validations.financial.rent.out_of_range", charge_name: test_case[:charge_name], maximum_per_period: test_case[:maximum_per_period], frequency: test_case[:period][:label], letting_type: "supported housing", provider_type: "local authority")) |
|
end |
|
end |
|
|
|
context "when charges are not given" do |
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: nil }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: nil }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: nil }, |
|
}].each do |test_case| |
|
it "does not error" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to be_empty |
|
end |
|
end |
|
end |
|
|
|
[{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "scharge", value: 499 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "scharge", value: 2000 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "scharge", value: 999 }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "pscharge", value: 199 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "pscharge", value: 800 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "pscharge", value: 399 }, |
|
}, |
|
{ |
|
period: { label: "weekly for 52 weeks", value: 1 }, |
|
charge: { field: "supcharg", value: 199.99 }, |
|
}, |
|
{ |
|
period: { label: "every calendar month", value: 4 }, |
|
charge: { field: "supcharg", value: 800 }, |
|
}, |
|
{ |
|
period: { label: "every 2 weeks", value: 2 }, |
|
charge: { field: "supcharg", value: 399 }, |
|
}].each do |test_case| |
|
it "does allow charges inside the range when period is #{test_case[:period][:label]}" do |
|
record.period = test_case[:period][:value] |
|
record[test_case[:charge][:field]] = test_case[:charge][:value] |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors[test_case[:charge][:field]]) |
|
.to be_empty |
|
end |
|
end |
|
end |
|
|
|
context "when period is weekly" do |
|
it "validates that total charge is at least 10 per week" do |
|
record.period = 1 |
|
record.tcharge = 9 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to include(match I18n.t("validations.financial.tcharge.under_10")) |
|
end |
|
|
|
it "allows the total charge to be over 10 per week" do |
|
record.period = 1 |
|
record.tcharge = 10 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to be_empty |
|
end |
|
end |
|
|
|
context "when period is every 2 weeks" do |
|
it "validates that total charge is at least 10 per week" do |
|
record.period = 2 |
|
record.tcharge = 19.99 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to include(match I18n.t("validations.financial.tcharge.under_10")) |
|
end |
|
|
|
it "allows the total charge to be over 10 per week" do |
|
record.period = 2 |
|
record.tcharge = 20 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to be_empty |
|
end |
|
end |
|
|
|
context "when entering charges" do |
|
it "returns an error for 3 charge types selected" do |
|
record.tcharge = 19.99 |
|
record.chcharge = 20 |
|
record.household_charge = 1 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
expect(record.errors["chcharge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
expect(record.errors["household_charge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
end |
|
|
|
it "returns an error for tcharge and chcharge types selected" do |
|
record.tcharge = 19.99 |
|
record.chcharge = 20 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["household_charge"]) |
|
.to be_empty |
|
expect(record.errors["tcharge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
expect(record.errors["chcharge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
end |
|
|
|
it "returns an error for tcharge type and household_charge not paid selected" do |
|
record.tcharge = 19.99 |
|
record.household_charge = 1 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["chcharge"]) |
|
.to be_empty |
|
expect(record.errors["tcharge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
expect(record.errors["household_charge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
end |
|
|
|
it "returns an error for chcharge type and household_charge not paid selected" do |
|
record.chcharge = 20 |
|
record.household_charge = 1 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to be_empty |
|
expect(record.errors["chcharge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
expect(record.errors["household_charge"]) |
|
.to include(match I18n.t("validations.financial.charges.complete_1_of_3")) |
|
end |
|
end |
|
|
|
it "does not return an error for household_charge being no" do |
|
record.household_charge = 1 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to be_empty |
|
expect(record.errors["chcharge"]) |
|
.to be_empty |
|
expect(record.errors["household_charge"]) |
|
.to be_empty |
|
end |
|
|
|
it "does not return an error for chcharge being selected" do |
|
record.household_charge = 0 |
|
record.chcharge = 20 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to be_empty |
|
expect(record.errors["chcharge"]) |
|
.to be_empty |
|
expect(record.errors["household_charge"]) |
|
.to be_empty |
|
end |
|
|
|
it "does not return an error for tcharge being selected" do |
|
record.household_charge = 0 |
|
record.tcharge = 19.99 |
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["tcharge"]) |
|
.to be_empty |
|
expect(record.errors["chcharge"]) |
|
.to be_empty |
|
expect(record.errors["household_charge"]) |
|
.to be_empty |
|
end |
|
|
|
context "when validating ranges based on LA and needstype" do |
|
before do |
|
LaRentRange.create!( |
|
ranges_rent_id: "1", |
|
la: "E07000223", |
|
beds: 4, |
|
lettype: 1, |
|
soft_min: 12.41, |
|
soft_max: 89.54, |
|
hard_min: 9.87, |
|
hard_max: 100.99, |
|
start_year: 2021, |
|
) |
|
LaRentRange.create!( |
|
ranges_rent_id: "2", |
|
la: "E07000223", |
|
beds: 0, |
|
lettype: 2, |
|
soft_min: 12.41, |
|
soft_max: 89.54, |
|
hard_min: 9.87, |
|
hard_max: 100.99, |
|
start_year: 2021, |
|
) |
|
end |
|
|
|
it "validates hard minimum for general needs" do |
|
record.needstype = 1 |
|
record.lettype = 1 |
|
record.period = 1 |
|
record.la = "E07000223" |
|
record.beds = 4 |
|
record.startdate = Time.zone.local(2021, 9, 17) |
|
record.brent = 9.17 |
|
|
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["brent"]) |
|
.to include(match I18n.t("validations.financial.brent.below_hard_min")) |
|
end |
|
|
|
it "validates hard minimum for supported housing" do |
|
record.needstype = 2 |
|
record.lettype = 2 |
|
record.period = 1 |
|
record.location = location |
|
record.startdate = Time.zone.local(2021, 9, 17) |
|
record.brent = 9.17 |
|
|
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["brent"]) |
|
.to include(match I18n.t("validations.financial.brent.below_hard_min")) |
|
|
|
%w[beds la postcode_known scheme_id location_id rent_type needstype period].each do |field| |
|
expect(record.errors[field]) |
|
.to include(match I18n.t("validations.financial.brent.#{field}.below_hard_min")) |
|
end |
|
end |
|
|
|
it "validates hard max for general needs" do |
|
record.needstype = 1 |
|
record.lettype = 1 |
|
record.period = 1 |
|
record.la = "E07000223" |
|
record.beds = 4 |
|
record.startdate = Time.zone.local(2021, 9, 17) |
|
record.brent = 200 |
|
|
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["brent"]) |
|
.to include(match I18n.t("validations.financial.brent.above_hard_max")) |
|
|
|
%w[beds la postcode_known scheme_id location_id rent_type needstype period].each do |field| |
|
expect(record.errors[field]) |
|
.to include(match I18n.t("validations.financial.brent.#{field}.above_hard_max")) |
|
end |
|
end |
|
|
|
it "validates hard max for supported housing" do |
|
record.needstype = 2 |
|
record.lettype = 2 |
|
record.period = 1 |
|
record.location = location |
|
record.startdate = Time.zone.local(2021, 9, 17) |
|
record.brent = 200 |
|
|
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["brent"]) |
|
.to include(match I18n.t("validations.financial.brent.above_hard_max")) |
|
|
|
%w[beds la postcode_known scheme_id location_id rent_type needstype period].each do |field| |
|
expect(record.errors[field]) |
|
.to include(match I18n.t("validations.financial.brent.#{field}.above_hard_max")) |
|
end |
|
end |
|
|
|
it "validates hard max for correct collection year" do |
|
record.lettype = 1 |
|
record.period = 1 |
|
record.la = "E07000223" |
|
record.startdate = Time.zone.local(2022, 2, 5) |
|
record.beds = 4 |
|
record.brent = 200 |
|
|
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["brent"]) |
|
.to include(match I18n.t("validations.financial.brent.above_hard_max")) |
|
|
|
%w[beds la postcode_known scheme_id location_id rent_type needstype period].each do |field| |
|
expect(record.errors[field]) |
|
.to include(match I18n.t("validations.financial.brent.#{field}.above_hard_max")) |
|
end |
|
end |
|
|
|
it "does not error if some of the fields are missing" do |
|
record.managing_organisation.provider_type = 2 |
|
record.startdate = Time.zone.local(2021, 9, 17) |
|
record.brent = 200 |
|
|
|
financial_validator.validate_rent_amount(record) |
|
expect(record.errors["brent"]) |
|
.to be_empty |
|
end |
|
end |
|
end |
|
|
|
context "when the accommodation is care home" do |
|
before do |
|
record.is_carehome = 1 |
|
end |
|
|
|
context "and charges are over the valid limit (£1,000 per week)" do |
|
it "validates charge when period is weekly for 52 weeks" do |
|
record.period = 1 |
|
record.chcharge = 5001 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include("Household rent and other charges must be between £10.00 and £5,000.00 if paying weekly for 52 weeks") |
|
expect(record.errors["period"]) |
|
.to include("Household rent and other charges must be between £10.00 and £5,000.00 if paying weekly for 52 weeks") |
|
end |
|
|
|
it "validates charge when period is monthly" do |
|
record.period = 4 |
|
record.chcharge = 21_667 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include("Household rent and other charges must be between £43.00 and £21,666.00 if paying every calendar month") |
|
expect(record.errors["period"]) |
|
.to include("Household rent and other charges must be between £43.00 and £21,666.00 if paying every calendar month") |
|
end |
|
|
|
it "validates charge when period is every 2 weeks" do |
|
record.period = 2 |
|
record.chcharge = 12_001 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include("Household rent and other charges must be between £20.00 and £10,000.00 if paying every 2 weeks") |
|
expect(record.errors["period"]) |
|
.to include("Household rent and other charges must be between £20.00 and £10,000.00 if paying every 2 weeks") |
|
end |
|
|
|
it "validates charge when period is every 4 weeks" do |
|
record.period = 3 |
|
record.chcharge = 24_001 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include("Household rent and other charges must be between £40.00 and £20,000.00 if paying every 4 weeks") |
|
expect(record.errors["period"]) |
|
.to include("Household rent and other charges must be between £40.00 and £20,000.00 if paying every 4 weeks") |
|
end |
|
end |
|
|
|
context "and charges are within the valid limit (£1,000 per week)" do |
|
it "does not throw error when period is weekly for 52 weeks" do |
|
record.period = 1 |
|
record.chcharge = 999 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]).to be_empty |
|
expect(record.errors["period"]).to be_empty |
|
end |
|
|
|
it "does not throw error when period is monthly" do |
|
record.period = 4 |
|
record.chcharge = 4333 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]).to be_empty |
|
expect(record.errors["period"]).to be_empty |
|
end |
|
|
|
it "does not throw error when period is every 2 weeks" do |
|
record.period = 2 |
|
record.chcharge = 1999.99 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]).to be_empty |
|
expect(record.errors["period"]).to be_empty |
|
end |
|
|
|
it "does not throw error when period is every 4 weeks" do |
|
record.period = 3 |
|
record.chcharge = 3999 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]).to be_empty |
|
expect(record.errors["period"]).to be_empty |
|
end |
|
end |
|
|
|
context "and charges are not provided" do |
|
xit "throws an error" do |
|
record.period = 3 |
|
record.chcharge = nil |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include(match I18n.t("validations.financial.carehome.not_provided", period: "every 4 weeks")) |
|
expect(record.errors["is_carehome"]) |
|
.to include(match I18n.t("validations.financial.carehome.not_provided", period: "every 4 weeks")) |
|
end |
|
end |
|
|
|
context "and charges under valid limit (£10pw)" do |
|
it "validates charge when period is weekly for 52 weeks" do |
|
record.period = 1 |
|
record.chcharge = 9 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include("Household rent and other charges must be between £10.00 and £5,000.00 if paying weekly for 52 weeks") |
|
expect(record.errors["period"]) |
|
.to include("Household rent and other charges must be between £10.00 and £5,000.00 if paying weekly for 52 weeks") |
|
end |
|
|
|
it "validates charge when period is monthly" do |
|
record.period = 4 |
|
record.chcharge = 42 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include("Household rent and other charges must be between £43.00 and £21,666.00 if paying every calendar month") |
|
expect(record.errors["period"]) |
|
.to include("Household rent and other charges must be between £43.00 and £21,666.00 if paying every calendar month") |
|
end |
|
|
|
it "validates charge when period is every 2 weeks" do |
|
record.period = 2 |
|
record.chcharge = 19 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include("Household rent and other charges must be between £20.00 and £10,000.00 if paying every 2 weeks") |
|
expect(record.errors["period"]) |
|
.to include("Household rent and other charges must be between £20.00 and £10,000.00 if paying every 2 weeks") |
|
end |
|
|
|
it "validates charge when period is every 4 weeks" do |
|
record.period = 3 |
|
record.chcharge = 39 |
|
financial_validator.validate_care_home_charges(record) |
|
expect(record.errors["chcharge"]) |
|
.to include("Household rent and other charges must be between £40.00 and £20,000.00 if paying every 4 weeks") |
|
expect(record.errors["period"]) |
|
.to include("Household rent and other charges must be between £40.00 and £20,000.00 if paying every 4 weeks") |
|
end |
|
end |
|
end |
|
end |
|
end
|
|
|