Submit social housing lettings and sales data (CORE)
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.

1174 lines
40 KiB

Cldc 3114 enable support control of rent periods per organisation (#2442) * write helper method to support having the correct rent period checkboxes checked * update new and create in organisations controller and view to enable creation of relevant organisation rent periods write tests for this * small changes to models * enable editing rent period in the UI display change button on org details page display rent periods question on edit page * enable updating org rent periods update logic in #update related tests * alter redirect after support user creates an organisation * adjust various UI elements: ordering of rows, copy changes, label size and associated tests * rework the #rent_period_labels method to return All under the correct conditions, rework tests related to that. + fix assorted tests that were either flakey or breaking due to addition of rent periods logic to create and update * amend failing tests and resolve linting complaints * changes following review * disable checkboxes for rent periods if they are in use so that users are not able to make existing logs invalid hint text added to the question to explain this I have also added all rent periods to a hidden field to remove the need to fetch them again form the db in the update method * update validation to reflect the fact that an org having no associated rent periods no longer means they accept all rent periods update tests adding both cases and removing unnecessary additional db additions * rake task to create rent period associations for orgs that have none * revert mistaken copy changes in designs * create rent periods in factories as default, with an option to skip. skip automatic creation in tests specifically related to rent periods * stub api call for factory value, update csv tests and fixtures accordingly * extract a good chunk of tests out of lettings_log_spec and into a dedicated derived fields spec file. in many cases refactor tests * remove before(:context) and associated patterns. use assign_attributes in various places for cleaner code * escape . in regex for API call stubs to satisfy codeQL remove destroy_all call at the start of a test that was dealing with leftover modesl in the test db * further refactoring of various tests to reduce database interactions and improve speed * remove outdated distinction between unitletas mappings from before 23/24 * remove tests that seem to be testing active record and/or ruby Date class
5 months ago
require "rails_helper"
require "shared/shared_examples_for_derived_fields"
RSpec.describe LettingsLog, type: :model do
let(:organisation) { build(:organisation, name: "derived fields org", skip_rent_period_creation: true) }
let(:user) { build(:user, organisation:) }
let(:log) { build(:lettings_log, :startdate_today, assigned_to: user) }
include_examples "shared examples for derived fields", :lettings_log
it "correctly derives incref from net_income_known" do
log.net_income_known = 0
expect { log.set_derived_fields! }.to change(log, :incref).to 0
log.net_income_known = 1
expect { log.set_derived_fields! }.to change(log, :incref).to 2
log.net_income_known = 2
expect { log.set_derived_fields! }.to change(log, :incref).to 1
end
it "derives shortfall_known when tshortfall is set" do
log.tshortfall = 10
expect { log.set_derived_fields! }.to change(log, :tshortfall_known).to 0
end
describe "deriving has_benefits" do
it "correctly derives when the household receives benefits" do
benefits_codes = [1, 6, 8, 7]
log.hb = benefits_codes.sample
log.set_derived_fields!
expect(log.has_benefits).to be 1
end
it "correctly derives when the household does not receive benefits" do
no_benefits_codes = [9, 3, 10, 4]
log.hb = no_benefits_codes.sample
log.set_derived_fields!
expect(log.has_benefits).to be 0
end
end
describe "deriving vacant days" do
it "correctly derives vacdays from startdate and mrcdate across DST boundaries" do
log.startdate = Time.zone.local(2024, 4, 1)
log.mrcdate = Time.zone.local(2024, 3, 30)
log.set_derived_fields!
expect(log.vacdays).to be 2
end
it "correctly derives vacdays from startdate and voiddate across DST boundaries" do
log.startdate = Time.zone.local(2024, 4, 1)
log.mrcdate = nil
log.voiddate = Time.zone.local(2024, 3, 30)
log.set_derived_fields!
expect(log.vacdays).to be 2
end
Cldc 3114 enable support control of rent periods per organisation (#2442) * write helper method to support having the correct rent period checkboxes checked * update new and create in organisations controller and view to enable creation of relevant organisation rent periods write tests for this * small changes to models * enable editing rent period in the UI display change button on org details page display rent periods question on edit page * enable updating org rent periods update logic in #update related tests * alter redirect after support user creates an organisation * adjust various UI elements: ordering of rows, copy changes, label size and associated tests * rework the #rent_period_labels method to return All under the correct conditions, rework tests related to that. + fix assorted tests that were either flakey or breaking due to addition of rent periods logic to create and update * amend failing tests and resolve linting complaints * changes following review * disable checkboxes for rent periods if they are in use so that users are not able to make existing logs invalid hint text added to the question to explain this I have also added all rent periods to a hidden field to remove the need to fetch them again form the db in the update method * update validation to reflect the fact that an org having no associated rent periods no longer means they accept all rent periods update tests adding both cases and removing unnecessary additional db additions * rake task to create rent period associations for orgs that have none * revert mistaken copy changes in designs * create rent periods in factories as default, with an option to skip. skip automatic creation in tests specifically related to rent periods * stub api call for factory value, update csv tests and fixtures accordingly * extract a good chunk of tests out of lettings_log_spec and into a dedicated derived fields spec file. in many cases refactor tests * remove before(:context) and associated patterns. use assign_attributes in various places for cleaner code * escape . in regex for API call stubs to satisfy codeQL remove destroy_all call at the start of a test that was dealing with leftover modesl in the test db * further refactoring of various tests to reduce database interactions and improve speed * remove outdated distinction between unitletas mappings from before 23/24 * remove tests that seem to be testing active record and/or ruby Date class
5 months ago
it "correctly derives vacdays from startdate and mrcdate" do
day_count = 8
log.startdate = Time.zone.today
log.mrcdate = Time.zone.today - day_count.days
log.set_derived_fields!
expect(log.vacdays).to be day_count
end
it "correctly derives vacdays from startdate and voiddate if mrcdate is nil" do
day_count = 3
log.startdate = Time.zone.today
log.voiddate = Time.zone.today - day_count.days
log.mrcdate = nil
log.set_derived_fields!
expect(log.vacdays).to be day_count
end
it "does not derive vacdays if voiddate and mrcdate are blank" do
log.startdate = Time.zone.today
log.voiddate = nil
log.mrcdate = nil
log.set_derived_fields!
expect(log.vacdays).to be nil
end
it "does not derive vacdays if startdate is blank" do
log.startdate = nil
log.voiddate = Time.zone.today
log.mrcdate = Time.zone.today
log.set_derived_fields!
expect(log.vacdays).to be nil
end
end
describe "deriving household member fields" do
before do
log.assign_attributes(
relat2: "X",
relat3: "C",
relat4: "X",
relat5: "C",
relat7: "C",
relat8: "X",
age1: 22,
age2: 16,
age4: 60,
age6: 88,
age7: 14,
age8: 42,
)
log.set_derived_fields!
end
it "correctly derives totchild" do
expect(log.totchild).to eq 3
end
it "correctly derives totelder" do
expect(log.totelder).to eq 2
end
it "correctly derives totadult" do
expect(log.totadult).to eq 3
end
it "correctly derives economic status for tenants under 16" do
expect(log.ecstat7).to eq 9
end
end
describe "deriving lettype" do
context "when the owning organisation is a PRP" do
before do
log.owning_organisation.provider_type = "PRP"
end
[
{
context: "when the rent type is intermediate rent and supported housing",
rent_type: 4,
needstype: 2,
expected_lettype: 10,
},
{
context: "when the rent type is intermediate rent and general needs housing",
rent_type: 4,
needstype: 1,
expected_lettype: 9,
},
{
context: "when the rent type is affordable rent and supported housing",
rent_type: 2,
needstype: 2,
expected_lettype: 6,
},
{
context: "when the rent type is affordable rent and general needs housing",
rent_type: 2,
needstype: 1,
expected_lettype: 5,
},
{
context: "when the rent type is social rent and supported housing",
rent_type: 0,
needstype: 2,
expected_lettype: 2,
},
{
context: "when the rent type is social rent and general needs housing",
rent_type: 0,
needstype: 1,
expected_lettype: 1,
},
].each do |test_case|
context test_case[:context] do
it "correctly derives lettype" do
log.assign_attributes(
rent_type: test_case[:rent_type],
needstype: test_case[:needstype],
)
expect { log.set_derived_fields! }.to change(log, :lettype).to test_case[:expected_lettype]
end
end
end
end
context "when the owning organisation is an LA" do
before do
log.owning_organisation.provider_type = "LA"
end
[
{
context: "when the rent type is intermediate rent and supported housing",
rent_type: 4,
needstype: 2,
expected_lettype: 12,
},
{
context: "when the rent type is intermediate rent and general needs housing",
rent_type: 4,
needstype: 1,
expected_lettype: 11,
},
{
context: "when the rent type is affordable rent and supported housing",
rent_type: 2,
needstype: 2,
expected_lettype: 8,
},
{
context: "when the rent type is affordable rent and general needs housing",
rent_type: 2,
needstype: 1,
expected_lettype: 7,
},
{
context: "when the rent type is social rent and supported housing",
rent_type: 0,
needstype: 2,
expected_lettype: 4,
},
{
context: "when the rent type is social rent and general needs housing",
rent_type: 0,
needstype: 1,
expected_lettype: 3,
},
].each do |test_case|
context test_case[:context] do
it "correctly derives lettype" do
log.assign_attributes(
rent_type: test_case[:rent_type],
needstype: test_case[:needstype],
)
expect { log.set_derived_fields! }.to change(log, :lettype).to test_case[:expected_lettype]
end
end
end
end
end
describe "deriving newprop" do
it "updates newprop correctly when this is the first time the property has been let" do
first_time_let_codes = [15, 16, 17]
log.rsnvac = first_time_let_codes.sample
log.set_derived_fields!
expect(log.newprop).to eq 1
end
it "updates newprop correctly when this is not the first time the property has been let" do
not_first_time_let_codes = [14, 9, 13, 12, 8, 18, 20, 5, 19, 6, 10, 11, 21, 22]
log.rsnvac = not_first_time_let_codes.sample
log.set_derived_fields!
expect(log.newprop).to eq 2
end
end
describe "deriving charges based on rent period" do
context "when rent is paid bi-weekly" do
before do
log.period = 2
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 100 },
expected_values: { wrent: 50.0 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 70 },
expected_values: { wscharge: 35.0 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 60 },
expected_values: { wpschrge: 30.0 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 80 },
expected_values: { wsupchrg: 40.0 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 6 },
expected_values: { wtshortfall: 50.0 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 60.12, pscharge: 50.13, scharge: 60.98, brent: 60.97 },
expected_values: { wsupchrg: 30.06, wpschrge: 25.06, wscharge: 30.49, wrent: 30.49, wtcharge: 116.1 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 28.93 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid every 4 weeks" do
before do
log.period = 3
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 120 },
expected_values: { wrent: 30.0 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 120 },
expected_values: { wscharge: 30.0 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 120 },
expected_values: { wpschrge: 30.0 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 120 },
expected_values: { wsupchrg: 30.0 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 120, hb: 6 },
expected_values: { wtshortfall: 30.0 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 100.12, pscharge: 100.13, scharge: 100.98, brent: 100.97 },
expected_values: { wsupchrg: 25.03, wpschrge: 25.03, wscharge: 25.24, wrent: 25.24, wtcharge: 100.55 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 14.46 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid every calendar month" do
before do
log.period = 4
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 130 },
expected_values: { wrent: 30.0 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 130 },
expected_values: { wscharge: 30.0 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 130 },
expected_values: { wpschrge: 30.0 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 130 },
expected_values: { wsupchrg: 30.0 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 130, hb: 6 },
expected_values: { wtshortfall: 30.0 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 100.12, pscharge: 100.13, scharge: 100.98, brent: 100.97 },
expected_values: { wsupchrg: 23.10, wpschrge: 23.11, wscharge: 23.30, wrent: 23.30, wtcharge: 92.82 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 13.35 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid weekly for 50 weeks" do
before do
log.period = 5
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 130 },
expected_values: { wrent: 125.0 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 130 },
expected_values: { wscharge: 125.0 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 130 },
expected_values: { wpschrge: 125.0 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 130 },
expected_values: { wsupchrg: 125.0 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 130, hb: 6 },
expected_values: { wtshortfall: 125.0 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 20.12, pscharge: 20.13, scharge: 20.98, brent: 100.97 },
expected_values: { wsupchrg: 19.35, wpschrge: 19.36, wscharge: 20.17, wrent: 97.09, wtcharge: 155.96 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 55.63 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid weekly for 49 weeks" do
before do
log.period = 6
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 130 },
expected_values: { wrent: 122.5 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 130 },
expected_values: { wscharge: 122.5 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 130 },
expected_values: { wpschrge: 122.5 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 130 },
expected_values: { wsupchrg: 122.5 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 130, hb: 6 },
expected_values: { wtshortfall: 122.5 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 30.12, pscharge: 30.13, scharge: 30.98, brent: 100.97 },
expected_values: { wsupchrg: 28.38, wpschrge: 28.39, wscharge: 29.19, wrent: 95.14, wtcharge: 181.11 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 54.52 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid weekly for 48 weeks" do
before do
log.period = 7
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 130 },
expected_values: { wrent: 120 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 130 },
expected_values: { wscharge: 120 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 130 },
expected_values: { wpschrge: 120 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 130 },
expected_values: { wsupchrg: 120 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 130, hb: 6 },
expected_values: { wtshortfall: 120 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 30.12, pscharge: 30.13, scharge: 30.98, brent: 100.97 },
expected_values: { wsupchrg: 27.8, wpschrge: 27.81, wscharge: 28.6, wrent: 93.20, wtcharge: 177.42 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 53.41 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid weekly for 47 weeks" do
before do
log.period = 8
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 130 },
expected_values: { wrent: 117.5 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 130 },
expected_values: { wscharge: 117.5 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 130 },
expected_values: { wpschrge: 117.5 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 130 },
expected_values: { wsupchrg: 117.5 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 130, hb: 6 },
expected_values: { wtshortfall: 117.5 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 30.12, pscharge: 30.13, scharge: 30.98, brent: 100.97 },
expected_values: { wsupchrg: 27.22, wpschrge: 27.23, wscharge: 28, wrent: 91.26, wtcharge: 173.72 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 52.3 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid weekly for 46 weeks" do
before do
log.period = 9
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 130 },
expected_values: { wrent: 115 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 130 },
expected_values: { wscharge: 115 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 130 },
expected_values: { wpschrge: 115 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 130 },
expected_values: { wsupchrg: 115 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 130, hb: 6 },
expected_values: { wtshortfall: 115 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 30.12, pscharge: 30.13, scharge: 30.98, brent: 100.97 },
expected_values: { wsupchrg: 26.64, wpschrge: 26.65, wscharge: 27.41, wrent: 89.32, wtcharge: 170.02 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 51.18 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid weekly for 52 weeks" do
before do
log.period = 1
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 130 },
expected_values: { wrent: 130 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 130 },
expected_values: { wscharge: 130 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 130 },
expected_values: { wpschrge: 130 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 130 },
expected_values: { wsupchrg: 130 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 130, hb: 6 },
expected_values: { wtshortfall: 130 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 30.12, pscharge: 25.13, scharge: 30.98, brent: 100.97 },
expected_values: { wsupchrg: 30.12, wpschrge: 25.13, wscharge: 30.98, wrent: 100.97, wtcharge: 187.2 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 57.86 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
context "when rent is paid weekly for 53 weeks" do
before do
log.period = 10
end
[
{
test_title: "correctly derives weekly rent",
fields_to_set: { brent: 130 },
expected_values: { wrent: 132.5 },
},
{
test_title: "correctly derives weekly service charge",
fields_to_set: { scharge: 130 },
expected_values: { wscharge: 132.5 },
},
{
test_title: "correctly derives weekly personal service charge",
fields_to_set: { pscharge: 130 },
expected_values: { wpschrge: 132.5 },
},
{
test_title: "correctly derives weekly support charge",
fields_to_set: { supcharg: 130 },
expected_values: { wsupchrg: 132.5 },
},
{
test_title: "correctly derives weekly total shortfall",
fields_to_set: { hbrentshortfall: 1, tshortfall: 130, hb: 6 },
expected_values: { wtshortfall: 132.5 },
},
{
test_title: "correctly clears weekly total shortfall if the tenant does not receive applicable benefits",
fields_to_set: { hbrentshortfall: 1, tshortfall: 100, hb: 9 },
expected_values: { wtshortfall: nil },
},
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 30.12, pscharge: 25.13, scharge: 30.98, brent: 100.97 },
expected_values: { wsupchrg: 30.7, wpschrge: 25.61, wscharge: 31.58, wrent: 102.91, wtcharge: 190.8 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",
fields_to_set: { needstype: 2, chcharge: 57.86 },
expected_values: { wchchrg: 58.97 },
},
].each do |test_case|
it test_case[:test_title] do
log.assign_attributes(test_case[:fields_to_set])
log.set_derived_fields!
test_case[:expected_values].each do |field, expected_value|
expect(log[field]).to eq expected_value
end
end
end
end
end
describe "deriving charges" do
describe "deriving the total charge" do
it "sums all the charges" do
brent = 5.77
scharge = 10.01
pscharge = 3
supcharg = 12.2
log.assign_attributes(brent:, scharge:, pscharge:, supcharg:)
log.set_derived_fields!
expect(log.tcharge).to eq(brent + scharge + pscharge + supcharg)
end
it "takes nil values to be zero" do
brent = 5.77
scharge = nil
pscharge = nil
supcharg = 12.2
log.assign_attributes(brent:, scharge:, pscharge:, supcharg:)
log.set_derived_fields!
expect(log.tcharge).to eq(brent + supcharg)
end
end
it "when any charge field is set all blank charge fields are set to 0, non-blank fields are left the same" do
log.set_derived_fields!
%i[brent scharge pscharge supcharg].each do |field|
expect(log[field]).to be nil
end
brent_val = 111
log.brent = brent_val
log.set_derived_fields!
%i[scharge pscharge supcharg].each do |field|
expect(log[field]).to eq 0
end
log.scharge = 22
log.set_derived_fields!
expect(log.brent).to eq brent_val
end
end
describe "deriving refused" do
it "derives refused when any age field is refused or details field is unknown" do
age_and_details_fields = %i[age1_known age2_known age3_known age4_known age5_known age6_known age7_known age8_known details_known_2 details_known_3 details_known_4 details_known_5 details_known_6 details_known_7 details_known_8]
log[age_and_details_fields.sample] = 1
log.set_derived_fields!
expect(log.refused).to eq 1
end
it "derives refused when any sex or relationship field is refused" do
age_fields = %i[sex1 sex2 sex3 sex4 sex5 sex6 sex7 sex8 relat2 relat3 relat4 relat5 relat6 relat7 relat8]
log[age_fields.sample] = "R"
log.set_derived_fields!
expect(log.refused).to eq 1
end
it "derives refused when any economic status field is refused" do
economic_status_fields = %i[ecstat1 ecstat2 ecstat3 ecstat4 ecstat5 ecstat6 ecstat7 ecstat8]
log[economic_status_fields.sample] = 10
log.set_derived_fields!
expect(log.refused).to eq 1
end
end
describe "deriving renttype from rent_type" do
it "when rent_type is Social Rent derives renttype as Social Rent" do
log.rent_type = 0
expect { log.set_derived_fields! }.to change(log, :renttype).to 1
end
it "when rent_type is Affordable Rent derives renttype as Affordable Rent" do
log.rent_type = 1
expect { log.set_derived_fields! }.to change(log, :renttype).to 2
end
it "when rent_type is London Affordable Rent derives renttype as Affordable Rent" do
log.rent_type = 2
expect { log.set_derived_fields! }.to change(log, :renttype).to 2
end
it "when rent_type is Rent to Buy derives renttype as Intermediate Rent" do
log.rent_type = 3
expect { log.set_derived_fields! }.to change(log, :renttype).to 3
end
it "when rent_type is London Living Rent derives renttype as Intermediate Rent" do
log.rent_type = 4
expect { log.set_derived_fields! }.to change(log, :renttype).to 3
end
it "when rent_type is Other intermediate rent product derives renttype as Intermediate Rent" do
log.rent_type = 5
expect { log.set_derived_fields! }.to change(log, :renttype).to 3
end
end
describe "variables dependent on whether a letting is a renewal" do
let(:organisation) { create(:organisation, skip_rent_period_creation: true) }
let(:user) { create(:user, organisation:) }
let(:startdate) { Time.zone.today }
let(:persisted_renewal_lettings_log) { create(:lettings_log, :setup_completed, startdate:, renewal: 1, assigned_to: user) }
it "derives waityear offered referral first_time_property_let_as_social_housing rsnvac when renewal" do
log.renewal = 1
expect { log.set_derived_fields! }
.to change(log, :waityear).to(2)
.and change(log, :offered).to(0)
.and change(log, :referral).to(1)
.and change(log, :first_time_property_let_as_social_housing).to(0)
.and change(log, :rsnvac).to(14)
end
it "clears waityear offered referral first_time_property_let_as_social_housing rsnvac when not a renewal" do
expect { persisted_renewal_lettings_log.update!(renewal: 0) }
.to change(persisted_renewal_lettings_log, :waityear).from(2).to(nil)
.and change(persisted_renewal_lettings_log, :offered).from(0).to(nil)
.and change(persisted_renewal_lettings_log, :referral).from(1).to(nil)
.and change(persisted_renewal_lettings_log, :first_time_property_let_as_social_housing).from(0).to(nil)
.and change(persisted_renewal_lettings_log, :rsnvac).from(14).to(nil)
end
describe "deriving voiddate from startdate" do
let(:startdate) { Time.zone.now }
it "correctly derives voiddate if the letting is a renewal and clears it if it is not" do
log.assign_attributes(renewal: 1, startdate:)
expect { log.set_derived_fields! }.to change(log, :voiddate).to startdate
end
it "clears voiddate if the letting is no longer a renewal" do
expect { persisted_renewal_lettings_log.update!(renewal: 0) }.to change(persisted_renewal_lettings_log, :voiddate).from(startdate).to nil
end
end
it "derives values for local authority and previous location if postcode is set and log is a renewal" do
expected_la = "E09000033"
postcode = "SW1A 1AA"
log.assign_attributes(postcode_known: 1, postcode_full: postcode, renewal: 1)
expect { log.send :process_postcode_changes! }.to change(log, :la).to(expected_la)
expect { log.set_derived_fields! }
.to change(log, :ppostcode_full).to(postcode)
.and change(log, :ppcodenk).to(0)
.and change(log, :prevloc).to(expected_la)
end
it "clears values for previous location and related fields when log is a renewal and current values are cleared" do
log.assign_attributes(postcode_known: 0, postcode_full: nil, la: nil, renewal: 1, previous_la_known: 1, prevloc: "E09000033", ppostcode_full: "SW1A 1AA", ppcodenk: 0)
expect { log.set_derived_fields! }
.to change(log, :previous_la_known).to(nil)
.and change(log, :prevloc).to(nil)
.and change(log, :ppcodenk).to(1)
.and change(log, :ppostcode_full).to(nil)
end
Cldc 3114 enable support control of rent periods per organisation (#2442) * write helper method to support having the correct rent period checkboxes checked * update new and create in organisations controller and view to enable creation of relevant organisation rent periods write tests for this * small changes to models * enable editing rent period in the UI display change button on org details page display rent periods question on edit page * enable updating org rent periods update logic in #update related tests * alter redirect after support user creates an organisation * adjust various UI elements: ordering of rows, copy changes, label size and associated tests * rework the #rent_period_labels method to return All under the correct conditions, rework tests related to that. + fix assorted tests that were either flakey or breaking due to addition of rent periods logic to create and update * amend failing tests and resolve linting complaints * changes following review * disable checkboxes for rent periods if they are in use so that users are not able to make existing logs invalid hint text added to the question to explain this I have also added all rent periods to a hidden field to remove the need to fetch them again form the db in the update method * update validation to reflect the fact that an org having no associated rent periods no longer means they accept all rent periods update tests adding both cases and removing unnecessary additional db additions * rake task to create rent period associations for orgs that have none * revert mistaken copy changes in designs * create rent periods in factories as default, with an option to skip. skip automatic creation in tests specifically related to rent periods * stub api call for factory value, update csv tests and fixtures accordingly * extract a good chunk of tests out of lettings_log_spec and into a dedicated derived fields spec file. in many cases refactor tests * remove before(:context) and associated patterns. use assign_attributes in various places for cleaner code * escape . in regex for API call stubs to satisfy codeQL remove destroy_all call at the start of a test that was dealing with leftover modesl in the test db * further refactoring of various tests to reduce database interactions and improve speed * remove outdated distinction between unitletas mappings from before 23/24 * remove tests that seem to be testing active record and/or ruby Date class
5 months ago
context "when the log is general needs" do
context "and the managing organisation is a private registered provider" do
before do
log.managing_organisation.provider_type = "PRP"
log.renewal = 1
end
it "correctly derives prevten" do
log.needstype = 1
log.set_derived_fields!
expect(log.prevten).to be 32
end
it "clears prevten if the log is marked as supported housing" do
log.needstype = 2
log.set_derived_fields!
expect(log.prevten).to be nil
end
it "clears prevten if renewal is update to no" do
log.renewal = 0
log.set_derived_fields!
expect(log.prevten).to be nil
end
end
context "and the managing organisation is a local authority" do
before do
log.managing_organisation.provider_type = "LA"
log.renewal = 1
end
it "correctly derives prevten if the log is general needs" do
log.needstype = 1
log.set_derived_fields!
expect(log.prevten).to be 30
end
it "clears prevten if the log is marked as supported housing" do
log.needstype = 2
log.set_derived_fields!
expect(log.prevten).to be nil
end
it "clears prevten if renewal is update to no" do
log.renewal = 0
log.set_derived_fields!
expect(log.prevten).to be nil
end
end
end
context "and updating rent_type" do
let(:irproduct_other) { nil }
let(:persisted_renewal_lettings_log) { create(:lettings_log, :setup_completed, assigned_to: user, rent_type:, irproduct_other:, renewal: 1) }
context "when rent_type is Social Rent" do
let(:rent_type) { 0 }
let(:expected_unitletas) { 1 }
it "derives the most recent let type as Social Rent basis if it is a renewal" do
log.assign_attributes(renewal: 1, rent_type:)
expect { log.set_derived_fields! }.to change(log, :unitletas).to expected_unitletas
end
it "clears the most recent let type if it is not a renewal" do
expect { persisted_renewal_lettings_log.update!(renewal: 0) }.to change(persisted_renewal_lettings_log, :unitletas).from(expected_unitletas).to nil
end
end
context "when rent_type is Affordable Rent" do
let(:rent_type) { 1 }
let(:expected_unitletas) { 2 }
it "derives the most recent let type as Affordable Rent basis if it is a renewal" do
log.assign_attributes(renewal: 1, rent_type:)
expect { log.set_derived_fields! }.to change(log, :unitletas).to expected_unitletas
end
it "clears the most recent let type if it is not a renewal" do
expect { persisted_renewal_lettings_log.update!(renewal: 0) }.to change(persisted_renewal_lettings_log, :unitletas).from(expected_unitletas).to nil
end
end
context "when rent_type is London Affordable Rent" do
let(:rent_type) { 2 }
let(:expected_unitletas) { 5 }
it "derives the most recent let type as London Affordable Rent basis if it is a renewal" do
log.assign_attributes(renewal: 1, rent_type:)
expect { log.set_derived_fields! }.to change(log, :unitletas).to expected_unitletas
end
it "clears the most recent let type if it is not a renewal" do
expect { persisted_renewal_lettings_log.update!(renewal: 0) }.to change(persisted_renewal_lettings_log, :unitletas).from(expected_unitletas).to nil
end
end
context "when rent_type is Rent to Buy" do
let(:rent_type) { 3 }
let(:expected_unitletas) { 6 }
it "derives the most recent let type as Rent to Buy basis if it is a renewal" do
log.assign_attributes(renewal: 1, rent_type:)
expect { log.set_derived_fields! }.to change(log, :unitletas).to expected_unitletas
end
it "clears the most recent let type if it is not a renewal" do
expect { persisted_renewal_lettings_log.update!(renewal: 0) }.to change(persisted_renewal_lettings_log, :unitletas).from(expected_unitletas).to nil
end
end
context "when rent_type is London Living Rent" do
let(:rent_type) { 4 }
let(:expected_unitletas) { 7 }
it "derives the most recent let type as London Living Rent basis if it is a renewal" do
log.assign_attributes(renewal: 1, rent_type:)
expect { log.set_derived_fields! }.to change(log, :unitletas).to expected_unitletas
end
it "clears the most recent let type if it is not a renewal" do
expect { persisted_renewal_lettings_log.update!(renewal: 0) }.to change(persisted_renewal_lettings_log, :unitletas).from(expected_unitletas).to nil
end
end
context "when rent_type is Other intermediate rent product" do
let(:rent_type) { 5 }
let(:irproduct_other) { "Rent first" }
let(:expected_unitletas) { 8 }
it "derives the most recent let type as London Living Rent basis if it is a renewal" do
log.assign_attributes(renewal: 1, rent_type:, irproduct_other:)
expect { log.set_derived_fields! }.to change(log, :unitletas).to expected_unitletas
end
it "clears the most recent let type if it is not a renewal" do
expect { persisted_renewal_lettings_log.update!(renewal: 0) }.to change(persisted_renewal_lettings_log, :unitletas).from(expected_unitletas).to nil
end
end
end
end
end