diff --git a/app/models/derived_variables/lettings_log_variables.rb b/app/models/derived_variables/lettings_log_variables.rb index aae49422d..937dd7c2e 100644 --- a/app/models/derived_variables/lettings_log_variables.rb +++ b/app/models/derived_variables/lettings_log_variables.rb @@ -1,4 +1,6 @@ module DerivedVariables::LettingsLogVariables + include DerivedVariables::SharedLogic + # renttype and unitletas values are different for intermediate rent (3 for renttype and 4 for unitletas) RENT_TYPE_MAPPING = { 0 => 1, # "Social Rent" => "Social Rent" @@ -35,10 +37,12 @@ module DerivedVariables::LettingsLogVariables end def set_derived_fields! + clear_inapplicable_derived_values! + set_encoded_derived_values!(DEPENDENCIES) + if rsnvac.present? self.newprop = has_first_let_vacancy_reason? ? 1 : 2 end - self.incref = 1 if net_income_refused? self.renttype = RENT_TYPE_MAPPING[rent_type] self.lettype = get_lettype self.totchild = get_totchild @@ -69,15 +73,9 @@ module DerivedVariables::LettingsLogVariables self.nocharge = household_charge&.zero? ? 1 : 0 if is_renewal? self.underoccupation_benefitcap = 2 if collection_start_year == 2021 - self.referral = 1 - self.waityear = 2 - self.offered = 0 self.voiddate = startdate - self.first_time_property_let_as_social_housing = 0 - self.rsnvac = 14 self.unitletas = form.start_date.year >= 2023 ? UNITLETAS_MAPPING_23_24[rent_type] : UNITLETAS_MAPPING[rent_type] if is_general_needs? - # fixed term self.prevten = 32 if managing_organisation&.provider_type == "PRP" self.prevten = 30 if managing_organisation&.provider_type == "LA" end @@ -109,6 +107,49 @@ module DerivedVariables::LettingsLogVariables private + DEPENDENCIES = [ + { + conditions: { + renewal: 1, + }, + derived_values: { + referral: 1, + waityear: 2, + offered: 0, + rsnvac: 14, + first_time_property_let_as_social_housing: 0, + }, + }, + { + conditions: { + net_income_known: 2, + }, + derived_values: { + incref: 1, + }, + }, + ].freeze + + def clear_inapplicable_derived_values! + reset_invalidated_derived_values!(DEPENDENCIES) + if (startdate_changed? || renewal_changed?) && (renewal_was == 1 && startdate_was&.between?(Time.zone.local(2021, 4, 1), Time.zone.local(2022, 3, 31))) + self.underoccupation_benefitcap = nil + end + if renewal_changed? && renewal_was == 1 + self.voiddate = nil + self.unitletas = nil + end + if %w[PRP LA].include?(managing_organisation&.provider_type) && + (needstype_changed? || renewal_changed?) && + needstype_was == 1 && renewal_was == 1 + self.prevten = nil + end + if needstype_changed? && needstype_was == 2 + self.wchair = nil + self.location_id = nil + end + end + def get_totelder ages = [age1, age2, age3, age4, age5, age6, age7, age8] ages.count { |x| !x.nil? && x >= 60 } diff --git a/app/models/derived_variables/sales_log_variables.rb b/app/models/derived_variables/sales_log_variables.rb index 9151a72f5..c30c62b9a 100644 --- a/app/models/derived_variables/sales_log_variables.rb +++ b/app/models/derived_variables/sales_log_variables.rb @@ -1,6 +1,8 @@ module DerivedVariables::SalesLogVariables + include DerivedVariables::SharedLogic + def set_derived_fields! - reset_invalidated_derived_values! + reset_invalidated_derived_values!(DEPENDENCIES) self.ethnic = 17 if ethnic_refused? self.mscharge = nil if no_monthly_leasehold_charges? @@ -30,7 +32,7 @@ module DerivedVariables::SalesLogVariables self.uprn_known = 0 end - set_encoded_derived_values! + set_encoded_derived_values!(DEPENDENCIES) end private @@ -73,30 +75,6 @@ private }, ].freeze - def reset_invalidated_derived_values! - DEPENDENCIES.each do |dependency| - any_conditions_changed = dependency[:conditions].any? { |attribute, _value| send("#{attribute}_changed?") } - next unless any_conditions_changed - - previously_in_derived_state = dependency[:conditions].all? { |attribute, value| send("#{attribute}_was") == value } - next unless previously_in_derived_state - - dependency[:derived_values].each do |derived_attribute, _derived_value| - Rails.logger.debug("Cleared derived #{derived_attribute} value") - send("#{derived_attribute}=", nil) - end - end - end - - def set_encoded_derived_values! - DEPENDENCIES.each do |dependency| - derivation_applies = dependency[:conditions].all? { |attribute, value| send(attribute) == value } - if derivation_applies - dependency[:derived_values].each { |attribute, value| send("#{attribute}=", value) } - end - end - end - def number_of_household_members return unless hholdcount.present? && jointpur.present? diff --git a/app/models/derived_variables/shared_logic.rb b/app/models/derived_variables/shared_logic.rb new file mode 100644 index 000000000..c326cb8c9 --- /dev/null +++ b/app/models/derived_variables/shared_logic.rb @@ -0,0 +1,27 @@ +module DerivedVariables::SharedLogic +private + + def reset_invalidated_derived_values!(dependencies) + dependencies.each do |dependency| + any_conditions_changed = dependency[:conditions].any? { |attribute, _value| send("#{attribute}_changed?") } + next unless any_conditions_changed + + previously_in_derived_state = dependency[:conditions].all? { |attribute, value| send("#{attribute}_was") == value } + next unless previously_in_derived_state + + dependency[:derived_values].each do |derived_attribute, _derived_value| + Rails.logger.debug("Cleared derived #{derived_attribute} value") + send("#{derived_attribute}=", nil) + end + end + end + + def set_encoded_derived_values!(dependencies) + dependencies.each do |dependency| + derivation_applies = dependency[:conditions].all? { |attribute, value| send(attribute) == value } + if derivation_applies + dependency[:derived_values].each { |attribute, value| send("#{attribute}=", value) } + end + end + end +end diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb index 2d91e2ad9..6fce43f42 100644 --- a/app/models/lettings_log.rb +++ b/app/models/lettings_log.rb @@ -531,24 +531,6 @@ class LettingsLog < Log private - def reset_derived_questions - dependent_questions = { waityear: [{ key: :renewal, value: 0 }], - referral: [{ key: :renewal, value: 0 }], - rsnvac: [{ key: :renewal, value: 0 }], - underoccupation_benefitcap: [{ key: :renewal, value: 0 }], - wchair: [{ key: :needstype, value: 1 }], - location_id: [{ key: :needstype, value: 1 }] } - - dependent_questions.each do |dependent, conditions| - condition_key = conditions.first[:key] - condition_value = conditions.first[:value] - if public_send("#{condition_key}_changed?") && condition_value == public_send(condition_key) && !public_send("#{dependent}_changed?") - Rails.logger.debug("Cleared derived #{dependent} value") - self[dependent] = nil - end - end - end - def reset_invalid_unresolved_log_fields! return unless unresolved? @@ -581,7 +563,6 @@ private reset_invalid_unresolved_log_fields! reset_scheme - reset_derived_questions end def dynamically_not_required diff --git a/config/locales/en.yml b/config/locales/en.yml index 53565b753..0e2500dce 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -539,7 +539,7 @@ en: in_soft_max_range: message: "Net income is higher than expected based on the lead tenant’s working situation. Are you sure this is correct?" income: - under_soft_min_for_economic_status: + under_soft_min_for_economic_status: title_text: "You told us income was %{income}." hint_text: "This is less than we would expect for someone in this working situation." rent: @@ -571,10 +571,10 @@ en: hint_text: "This is higher than we would expect." shared_ownership_deposit: title_text: "You told us that the mortgage, deposit and discount add up to %{mortgage_deposit_and_discount_total}" - old_persons_shared_ownership: + old_persons_shared_ownership: title_text: "You told us the buyer is using the Older Persons Shared Ownership scheme." hint_text: "At least one buyer must be aged 65 years and over to use this scheme." - staircase_bought_seems_high: + staircase_bought_seems_high: title_text: "You told us that %{percentage}% was bought in this staircasing transaction." hint_text: "Most staircasing transactions are less than 50%" monthly_charges_over_soft_max: diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 05da0a5a8..5e661fe16 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -268,13 +268,6 @@ RSpec.describe LettingsLog do expect(record_from_db["mrcdate"].year).to eq(2021) end - it "correctly derives and saves partial and full major property void date" do - record_from_db = ActiveRecord::Base.connection.execute("select voiddate from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["voiddate"].day).to eq(3) - expect(record_from_db["voiddate"].month).to eq(3) - expect(record_from_db["voiddate"].year).to eq(2021) - end - it "correctly derives and saves incref" do record_from_db = ActiveRecord::Base.connection.execute("select incref from lettings_logs where id=#{lettings_log.id}").to_a[0] expect(record_from_db["incref"]).to eq(1) @@ -1504,334 +1497,329 @@ RSpec.describe LettingsLog do expect(record_from_db["has_benefits"]).to eq(1) end - context "when it is a renewal" do + context "when updating values that derive vacdays" do + let(:lettings_log) { create(:lettings_log, startdate:) } + + context "when start date is set" do + let(:startdate) { Time.zone.now } + + it "correctly derives vacdays when voiddate is set" do + day_count = 3 + expect { lettings_log.update!(voiddate: startdate - day_count.days) }.to change(lettings_log, :vacdays).to day_count + expect { lettings_log.update!(voiddate: nil) }.to change(lettings_log, :vacdays).from(day_count).to nil + end + + it "correctly derives vacdays when mrcdate is set" do + day_count = 3 + expect { lettings_log.update!(mrcdate: startdate - day_count.days) }.to change(lettings_log, :vacdays).to day_count + expect { lettings_log.update!(mrcdate: nil) }.to change(lettings_log, :vacdays).from(day_count).to nil + end + end + + context "when start date is not set" do + let(:startdate) { nil } + + it "correctly derives vacdays when voiddate is set" do + day_count = 3 + lettings_log.update!(voiddate: Time.zone.now - day_count.days) + expect(lettings_log.vacdays).to be nil + end + + it "correctly derives vacdays when mrcdate is set" do + day_count = 3 + lettings_log.update!(mrcdate: Time.zone.now - day_count.days) + expect(lettings_log.vacdays).to be nil + end + end + end + + context "when updating renewal" do let!(:lettings_log) do described_class.create({ managing_organisation: owning_organisation, owning_organisation:, created_by: created_by_user, - renewal: 1, startdate: Time.zone.local(2021, 4, 10), created_at: Time.utc(2022, 2, 8, 16, 52, 15), }) end - it "correctly derives and saves waityear" do - record_from_db = ActiveRecord::Base.connection.execute("select waityear from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["waityear"]).to eq(2) - expect(lettings_log["waityear"]).to eq(2) + it "correctly derives the length of time on local authority waiting list" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :waityear).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :waityear).from(2).to nil end - it "correctly derives and saves underoccupation_benefitcap if year is 2021" do - record_from_db = ActiveRecord::Base.connection.execute("select underoccupation_benefitcap from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["underoccupation_benefitcap"]).to eq(2) - expect(lettings_log["underoccupation_benefitcap"]).to eq(2) + it "correctly derives the number of times previously offered since becoming available" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :offered).to 0 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :offered).from(0).to nil end - it "correctly derives and saves prevten" do - lettings_log.managing_organisation.update!({ provider_type: "PRP" }) - lettings_log.update!({ needstype: 1 }) - - record_from_db = ActiveRecord::Base.connection.execute("select prevten from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["prevten"]).to eq(32) - expect(lettings_log["prevten"]).to eq(32) + it "correctly derives referral if the letting is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :referral).to 1 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :referral).from(1).to nil + end - lettings_log.managing_organisation.update!({ provider_type: "LA" }) - lettings_log.update!({ needstype: 1 }) + it "correctly derives voiddate if the letting is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :voiddate).to lettings_log.startdate + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :voiddate).from(lettings_log.startdate).to nil + end - record_from_db = ActiveRecord::Base.connection.execute("select prevten from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["prevten"]).to eq(30) - expect(lettings_log["prevten"]).to eq(30) + it "correctly derives first_time_property_let_as_social_housing and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :first_time_property_let_as_social_housing).to 0 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :first_time_property_let_as_social_housing).from(0).to nil end - it "correctly derives and saves referral" do - record_from_db = ActiveRecord::Base.connection.execute("select referral from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["referral"]).to eq(1) - expect(lettings_log["referral"]).to eq(1) + it "correctly derives vacancy reason and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :rsnvac).to 14 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :rsnvac).from(14).to nil end - it "correctly derives and saves vacdays" do - record_from_db = ActiveRecord::Base.connection.execute("select vacdays from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["vacdays"]).to eq(0) - expect(lettings_log["vacdays"]).to eq(0) + it "derives vacdays as 0 if log is renewal" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :vacdays).to 0 end - it "correctly derives and saves first_time_property_let_as_social_housing" do - record_from_db = ActiveRecord::Base.connection.execute( - "select first_time_property_let_as_social_housing" \ - " from lettings_logs where id=#{lettings_log.id}", - ).to_a[0] - expect(record_from_db["first_time_property_let_as_social_housing"]).to eq(0) - expect(lettings_log["first_time_property_let_as_social_housing"]).to eq(0) + it "correctly derives underoccupation_benefitcap if log is a renewal from 2021/22" do + lettings_log.update!(renewal: 1) + expect(lettings_log.underoccupation_benefitcap).to be 2 end - it "derives vacancy reason as relet" do - record_from_db = ActiveRecord::Base.connection.execute("select rsnvac from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["rsnvac"]).to eq(14) - expect(lettings_log["rsnvac"]).to eq(14) + it "clears underoccupation_benefitcap if log is no longer a renewal" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :underoccupation_benefitcap).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :underoccupation_benefitcap).from(2).to nil end - context "when deriving renttype and unitletas" do - before do - Timecop.freeze(Time.zone.local(2022, 1, 1)) - allow(FeatureToggle).to receive(:startdate_two_week_validation_enabled?).and_return(false) - lettings_log.update!(rent_type:, irproduct_other: "other") - end + it "clears underoccupation_benefitcap if log is no longer in 2021/22" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :underoccupation_benefitcap).to 2 + Timecop.return + expect { lettings_log.update!(startdate: Time.zone.local(2023, 1, 1)) }.to change(lettings_log, :underoccupation_benefitcap).from(2).to nil + end - after do - Timecop.unfreeze - end + context "when the log is general needs" do + context "and the managing organisation is a private registered provider" do + before do + lettings_log.managing_organisation.update!(provider_type: "PRP") + lettings_log.update!(needstype: 1, renewal: 1) + end - context "when the rent_type is Social Rent (0)" do - let(:rent_type) { 0 } + it "correctly derives prevten" do + expect(lettings_log.prevten).to be 32 + end - it "derives and saves renttype and unitletas as Social rent(1)" do - record_from_db = ActiveRecord::Base.connection.execute("select renttype from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.renttype).to eq(1) - expect(record_from_db["renttype"]).to eq(1) + it "clears prevten if the log is marked as supported housing" do + lettings_log.update!(needstype: 2) + expect(lettings_log.prevten).to be nil end - it "derives and saves unitletas as Social rent(1)" do - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(1) - expect(record_from_db["unitletas"]).to eq(1) + it "clears prevten if renewal is update to no" do + lettings_log.update!(renewal: 0) + expect(lettings_log.prevten).to be nil end + end - context "and it is a 23/24 form" do - before do - Timecop.freeze(Time.zone.local(2023, 5, 1)) - end + context "and the managing organisation is a local authority" do + before do + lettings_log.managing_organisation.update!(provider_type: "LA") + lettings_log.update!(needstype: 1, renewal: 1) + end - after do - Timecop.unfreeze - end + it "correctly derives prevten" do + expect(lettings_log.prevten).to be 30 + end - around do |example| - Timecop.freeze(Time.zone.local(2023, 5, 1)) do - Singleton.__init__(FormHandler) - example.run - end - Timecop.return - Singleton.__init__(FormHandler) - end + it "clears prevten if the log is marked as supported housing" do + expect { lettings_log.update!(needstype: 2) }.to change(lettings_log, :prevten).to nil + end - it "derives and saves unitletas as Social rent(1)" do - lettings_log.update!(startdate: Time.zone.local(2023, 5, 1)) - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(1) - expect(record_from_db["unitletas"]).to eq(1) - end + it "clears prevten if renewal is update to no" do + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :prevten).to nil end end + end - context "when the rent_type is Affordable Rent(1)" do - let(:rent_type) { 1 } + context "and updating rent_type" do + let(:irproduct_other) { nil } - it "derives and saves renttype as Affordable Rent(2)" do - record_from_db = ActiveRecord::Base.connection.execute("select renttype from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.renttype).to eq(2) - expect(record_from_db["renttype"]).to eq(2) + around do |example| + Timecop.freeze(now) do + Singleton.__init__(FormHandler) + lettings_log.update!(rent_type:, irproduct_other:, startdate: now) + example.run end + end - it "derives and saves unitletas as Affordable Rent(2)" do - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(2) - expect(record_from_db["unitletas"]).to eq(2) - end + context "when collection year is 2022/23 or earlier" do + let(:now) { Time.zone.local(2023, 1, 1) } - context "and it is a 23/24 form" do - before do - Timecop.freeze(Time.zone.local(2023, 5, 1)) - end + context "when rent_type is Social Rent" do + let(:rent_type) { 0 } - after do - Timecop.unfreeze + it "derives the most recent let type as Social Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 1 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(1).to nil end + end - around do |example| - Timecop.freeze(Time.zone.local(2023, 5, 1)) do - Singleton.__init__(FormHandler) - example.run - end - Timecop.return - Singleton.__init__(FormHandler) - end + context "when rent_type is Affordable Rent" do + let(:rent_type) { 1 } - it "derives and saves unitletas as Affordable Rent basis(2)" do - lettings_log.update!(startdate: Time.zone.local(2023, 5, 1)) - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(2) - expect(record_from_db["unitletas"]).to eq(2) + it "derives the most recent let type as Affordable Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(2).to nil end end - end - context "when the rent_type is London Affordable Rent(2)" do - let(:rent_type) { 2 } + context "when rent_type is London Affordable Rent" do + let(:rent_type) { 2 } - it "derives and saves renttype as London Affordable Rent(2)" do - record_from_db = ActiveRecord::Base.connection.execute("select renttype from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.renttype).to eq(2) - expect(record_from_db["renttype"]).to eq(2) + it "derives the most recent let type as Affordable Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(2).to nil + end end - it "derives and saves unitletas as London Affordable Rent(2)" do - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(2) - expect(record_from_db["unitletas"]).to eq(2) - end + context "when rent_type is Rent to Buy" do + let(:rent_type) { 3 } - context "and it is a 23/24 form" do - before do - Timecop.freeze(Time.zone.local(2023, 5, 1)) + it "derives the most recent let type as Intermediate Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 4 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(4).to nil end + end - after do - Timecop.unfreeze - end + context "when rent_type is London Living Rent" do + let(:rent_type) { 4 } - around do |example| - Timecop.freeze(Time.zone.local(2023, 5, 1)) do - Singleton.__init__(FormHandler) - example.run - end - Timecop.return - Singleton.__init__(FormHandler) + it "derives the most recent let type as Intermediate Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 4 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(4).to nil end + end + + context "when rent_type is Other intermediate rent product" do + let(:rent_type) { 5 } + let(:irproduct_other) { "Rent first" } - it "derives and saves unitletas as London Affordable Rent basis(5)" do - lettings_log.update!(startdate: Time.zone.local(2023, 5, 1)) - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(5) - expect(record_from_db["unitletas"]).to eq(5) + it "derives the most recent let type as Intermediate Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 4 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(4).to nil end end end - context "when the rent_type is Rent to Buy(3)" do - let(:rent_type) { 3 } + context "when collection year is 2023/24 or later" do + let(:now) { Time.zone.local(2024, 1, 1) } - it "derives and saves renttype as Intermediate Rent(3)" do - record_from_db = ActiveRecord::Base.connection.execute("select renttype from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.renttype).to eq(3) - expect(record_from_db["renttype"]).to eq(3) - end + context "when rent_type is Social Rent" do + let(:rent_type) { 0 } - it "derives and saves unitletas as Intermediate Rent(4)" do - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(4) - expect(record_from_db["unitletas"]).to eq(4) + it "derives the most recent let type as Social Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 1 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(1).to nil + end end - context "and it is a 23/24 form" do - before do - Timecop.freeze(Time.zone.local(2023, 5, 1)) - end + context "when rent_type is Affordable Rent" do + let(:rent_type) { 1 } - after do - Timecop.unfreeze + it "derives the most recent let type as Affordable Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(2).to nil end + end - around do |example| - Timecop.freeze(Time.zone.local(2023, 5, 1)) do - Singleton.__init__(FormHandler) - example.run - end - Timecop.return - Singleton.__init__(FormHandler) - end + context "when rent_type is London Affordable Rent" do + let(:rent_type) { 2 } - it "derives and saves unitletas as Rent to Buy basis(6)" do - lettings_log.update!(startdate: Time.zone.local(2023, 5, 1)) - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(6) - expect(record_from_db["unitletas"]).to eq(6) + it "derives the most recent let type as London Affordable Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 5 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(5).to nil end end - end - context "when the rent_type is London Living Rent(4)" do - let(:rent_type) { 4 } + context "when rent_type is Rent to Buy" do + let(:rent_type) { 3 } - it "derives and saves renttype as Intermediate Rent(3)" do - record_from_db = ActiveRecord::Base.connection.execute("select renttype from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.renttype).to eq(3) - expect(record_from_db["renttype"]).to eq(3) - end - - it "derives and saves unitletas as Intermediate Rent(4)" do - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(4) - expect(record_from_db["unitletas"]).to eq(4) + it "derives the most recent let type as Rent to Buy basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 6 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(6).to nil + end end - context "and it is a 23/24 form" do - before do - Timecop.freeze(Time.zone.local(2023, 5, 1)) - end + context "when rent_type is London Living Rent" do + let(:rent_type) { 4 } - after do - Timecop.unfreeze + it "derives the most recent let type as London Living Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 7 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(7).to nil end + end - around do |example| - Timecop.freeze(Time.zone.local(2023, 5, 1)) do - Singleton.__init__(FormHandler) - example.run - end - Timecop.return - Singleton.__init__(FormHandler) - end + context "when rent_type is Other intermediate rent product" do + let(:rent_type) { 5 } + let(:irproduct_other) { "Rent first" } - it "derives and saves unitletas as London Living Rent basis(7)" do - lettings_log.update!(startdate: Time.zone.local(2023, 5, 1)) - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(7) - expect(record_from_db["unitletas"]).to eq(7) + it "derives the most recent let type as Another Intermediate Rent basis if it is a renewal and clears it if it is not" do + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 8 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(8).to nil end end end + end + end + + context "when updating rent type" do + let(:irproduct_other) { nil } + + before do + lettings_log.update!(rent_type:, irproduct_other:) + end + + context "when rent_type is Social Rent" do + let(:rent_type) { 0 } + + it "derives renttype as Social Rent" do + expect(lettings_log.renttype).to be 1 + end + end - context "when the rent_type is Other intermediate rent product(5)" do - let(:rent_type) { 5 } + context "when rent_type is Affordable Rent" do + let(:rent_type) { 1 } - it "derives and saves renttype as Intermediate Rent(3)" do - record_from_db = ActiveRecord::Base.connection.execute("select renttype from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.renttype).to eq(3) - expect(record_from_db["renttype"]).to eq(3) - end + it "derives renttype as Affordable Rent" do + expect(lettings_log.renttype).to be 2 + end + end - it "derives and saves unitletas as Intermediate Rent(4)" do - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(4) - expect(record_from_db["unitletas"]).to eq(4) - end + context "when rent_type is London Affordable Rent" do + let(:rent_type) { 2 } - context "and it is a 23/24 form" do - before do - Timecop.freeze(Time.zone.local(2023, 5, 1)) - end + it "derives renttype as Affordable Rent" do + expect(lettings_log.renttype).to be 2 + end + end - after do - Timecop.unfreeze - end + context "when rent_type is Rent to Buy" do + let(:rent_type) { 3 } - around do |example| - Timecop.freeze(Time.zone.local(2023, 5, 1)) do - Singleton.__init__(FormHandler) - example.run - end - Timecop.return - Singleton.__init__(FormHandler) - end + it "derives renttype as Intermediate Rent" do + expect(lettings_log.renttype).to be 3 + end + end - it "derives and saves unitletas as Other intermediate rent basis(8)" do - lettings_log.update!(startdate: Time.zone.local(2023, 5, 1)) - record_from_db = ActiveRecord::Base.connection.execute("select unitletas from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(lettings_log.unitletas).to eq(8) - expect(record_from_db["unitletas"]).to eq(8) - end - end + context "when rent_type is London Living Rent" do + let(:rent_type) { 4 } + + it "derives renttype as Intermediate Rent" do + expect(lettings_log.renttype).to be 3 + end + end + + context "when rent_type is Other intermediate rent product" do + let(:rent_type) { 5 } + let(:irproduct_other) { "Rent first" } + + it "derives renttype as Intermediate Rent" do + expect(lettings_log.renttype).to be 3 end end end @@ -2168,37 +2156,6 @@ RSpec.describe LettingsLog do expect(record_from_db["wchair"]).to eq(1) end end - - context "and renewal" do - before do - Timecop.freeze(Time.zone.local(2022, 4, 2)) - end - - after do - Timecop.unfreeze - end - - let(:scheme) { create(:scheme) } - let(:location) { create(:location, scheme:) } - let!(:supported_housing_lettings_log) do - described_class.create!({ - managing_organisation: owning_organisation, - owning_organisation:, - created_by: created_by_user, - needstype: 2, - scheme_id: scheme.id, - location_id: location.id, - renewal: 1, - startdate: Time.zone.local(2022, 4, 2), - created_at: Time.utc(2022, 2, 8, 16, 52, 15), - }) - end - - it "correctly infers and saves the renewal date" do - record_from_db = ActiveRecord::Base.connection.execute("SELECT voiddate from lettings_logs where id=#{supported_housing_lettings_log.id}").to_a[0] - expect(record_from_db["voiddate"].to_i).to eq(supported_housing_lettings_log.startdate.to_i) - end - end end context "when saving accessibility needs" do @@ -2434,77 +2391,18 @@ RSpec.describe LettingsLog do end end - context "when it changes from a renewal to not a renewal" do - let(:lettings_log) { create(:lettings_log) } - - it "resets inferred waityear value" do - lettings_log.update!({ renewal: 1 }) - - record_from_db = ActiveRecord::Base.connection.execute("select waityear from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["waityear"]).to eq(2) - expect(lettings_log["waityear"]).to eq(2) - - lettings_log.update!({ renewal: 0 }) - record_from_db = ActiveRecord::Base.connection.execute("select waityear from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["waityear"]).to eq(nil) - expect(lettings_log["waityear"]).to eq(nil) - end - - it "resets inferred vacancy reason value" do - vacancy_reason = "rsnvac" - - lettings_log.update!({ renewal: 1 }) - - record_from_db = ActiveRecord::Base.connection.execute("select #{vacancy_reason} from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db[vacancy_reason]).to eq(14) - expect(lettings_log[vacancy_reason]).to eq(14) - - lettings_log.update!({ renewal: 0 }) - record_from_db = ActiveRecord::Base.connection.execute("select #{vacancy_reason} from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db[vacancy_reason]).to eq(nil) - expect(lettings_log[vacancy_reason]).to eq(nil) - end - end - context "when it changes from a supported housing to not a supported housing" do let(:location) { create(:location, mobility_type: "A", postcode: "SW1P 4DG") } let(:lettings_log) { create(:lettings_log, location:) } it "resets inferred wchair value" do - lettings_log.update!({ needstype: 2 }) - - record_from_db = ActiveRecord::Base.connection.execute("select wchair from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["wchair"]).to eq(2) - expect(lettings_log["wchair"]).to eq(2) - - lettings_log.update!({ needstype: 1 }) - record_from_db = ActiveRecord::Base.connection.execute("select needstype from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["wchair"]).to eq(nil) - expect(lettings_log["wchair"]).to eq(nil) + expect { lettings_log.update!(needstype: 2) }.to change(lettings_log, :wchair).to(2) + expect { lettings_log.update!(needstype: 1) }.to change(lettings_log, :wchair).from(2).to(nil) end it "resets location" do - lettings_log.update!({ needstype: 2 }) - - record_from_db = ActiveRecord::Base.connection.execute("select location_id from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["location_id"]).to eq(location.id) - expect(lettings_log["location_id"]).to eq(location.id) - lettings_log.update!({ needstype: 1 }) - record_from_db = ActiveRecord::Base.connection.execute("select location_id from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["location_id"]).to eq(nil) - expect(lettings_log["location_id"]).to eq(nil) - end - end - - context "when it is not a renewal" do - let(:lettings_log) { create(:lettings_log) } - - it "saves waityear value" do - lettings_log.update!({ renewal: 0, waityear: 2 }) - - record_from_db = ActiveRecord::Base.connection.execute("select waityear from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["waityear"]).to eq(2) - expect(lettings_log["waityear"]).to eq(2) + lettings_log.update!(needstype: 2) + expect { lettings_log.update!(needstype: 1) }.to change(lettings_log, :location_id).from(location.id).to(nil) end end