diff --git a/app/models/case_log.rb b/app/models/case_log.rb index b9bbdc2ad..1a66ee7eb 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -40,6 +40,7 @@ class CaseLog < ApplicationRecord RENT_TYPE_MAPPING_LABELS = { 1 => "Social Rent", 2 => "Affordable Rent", 3 => "Intermediate Rent" }.freeze HAS_BENEFITS_OPTIONS = [0, 1, 2, 3].freeze STATUS = { "not_started" => 0, "in_progress" => 1, "completed" => 2 }.freeze + NUM_OF_WEEKS_FROM_PERIOD = { 0 => 26, 1 => 13, 2 => 12, 3 => 50, 4 => 49, 5 => 48, 6 => 47, 7 => 46, 8 => 52 }.freeze enum status: STATUS def form @@ -85,6 +86,13 @@ class CaseLog < ApplicationRecord end end + def weekly_value(field_value) + num_of_weeks = NUM_OF_WEEKS_FROM_PERIOD[period] + return unless field_value && num_of_weeks + + field_value / 52 * num_of_weeks + end + def applicable_income_range return unless ecstat1 @@ -311,6 +319,13 @@ private self.supcharg ||= 0 self.tcharge = brent.to_f + scharge.to_f + pscharge.to_f + supcharg.to_f end + if period.present? + self.wrent = weekly_value(brent) if brent.present? + self.wscharge = weekly_value(scharge) if scharge.present? + self.wpschrge = weekly_value(pscharge) if pscharge.present? + self.wsupchrg = weekly_value(supcharg) if supcharg.present? + self.wtcharge = weekly_value(tcharge) if tcharge.present? + end self.has_benefits = get_has_benefits self.nocharge = household_charge&.zero? ? 1 : 0 self.underoccupation_benefitcap = 3 if renewal == 1 && year == 2021 diff --git a/db/migrate/20220311151611_add_derived_fields.rb b/db/migrate/20220311151611_add_derived_fields.rb new file mode 100644 index 000000000..147f380d0 --- /dev/null +++ b/db/migrate/20220311151611_add_derived_fields.rb @@ -0,0 +1,12 @@ +class AddDerivedFields < ActiveRecord::Migration[7.0] + def change + change_table :case_logs, bulk: true do |t| + t.decimal :wrent, precision: 10, scale: 2 + t.decimal :wscharge, precision: 10, scale: 2 + t.decimal :wpschrge, precision: 10, scale: 2 + t.decimal :wsupchrg, precision: 10, scale: 2 + t.decimal :wtcharge, precision: 10, scale: 2 + t.decimal :wtshortfall, precision: 10, scale: 2 + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 3d485704b..79e41a8ea 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -218,6 +218,12 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do t.integer "rent_type" t.integer "has_benefits" t.integer "renewal" + t.decimal "wrent", precision: 10, scale: 2 + t.decimal "wscharge", precision: 10, scale: 2 + t.decimal "wpschrge", precision: 10, scale: 2 + t.decimal "wsupchrg", precision: 10, scale: 2 + t.decimal "wtcharge", precision: 10, scale: 2 + t.decimal "wtshortfall", precision: 10, scale: 2 t.index ["managing_organisation_id"], name: "index_case_logs_on_managing_organisation_id" t.index ["owning_organisation_id"], name: "index_case_logs_on_owning_organisation_id" end @@ -271,10 +277,10 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do t.string "last_sign_in_ip" t.integer "role" t.string "old_user_id" - t.string "phone" t.integer "failed_attempts", default: 0 t.string "unlock_token" t.datetime "locked_at", precision: nil + t.string "phone" t.index ["email"], name: "index_users_on_email", unique: true t.index ["organisation_id"], name: "index_users_on_organisation_id" t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true diff --git a/spec/fixtures/exports/case_logs.xml b/spec/fixtures/exports/case_logs.xml index 14e68a723..0b6039cc9 100644 --- a/spec/fixtures/exports/case_logs.xml +++ b/spec/fixtures/exports/case_logs.xml @@ -160,5 +160,11 @@ 1 1 0 + 100.0 + 25.0 + 20.0 + 17.5 + 162.5 + diff --git a/spec/models/case_log_spec.rb b/spec/models/case_log_spec.rb index 3b9d2e4a2..dd28b3cf0 100644 --- a/spec/models/case_log_spec.rb +++ b/spec/models/case_log_spec.rb @@ -298,6 +298,339 @@ RSpec.describe CaseLog do expect(record_from_db["lettype"]).to eq(1) end end + + context "when rent is paid bi-weekly" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 100, period: 0) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(50.0) + expect(record_from_db["wrent"]).to eq(50.0) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 100, period: 0) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(50.0) + expect(record_from_db["wscharge"]).to eq(50.0) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 100, period: 0) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(50.0) + expect(record_from_db["wpschrge"]).to eq(50.0) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 100, period: 0) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(50.0) + expect(record_from_db["wsupchrg"]).to eq(50.0) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 100, period: 0) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(50.0) + expect(record_from_db["wtcharge"]).to eq(50.0) + end + end + + context "when rent is paid every 4 weeks" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 120, period: 1) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(30.0) + expect(record_from_db["wrent"]).to eq(30.0) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 120, period: 1) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(30.0) + expect(record_from_db["wscharge"]).to eq(30.0) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 120, period: 1) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(30.0) + expect(record_from_db["wpschrge"]).to eq(30.0) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 120, period: 1) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(30.0) + expect(record_from_db["wsupchrg"]).to eq(30.0) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 120, period: 1) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(30.0) + expect(record_from_db["wtcharge"]).to eq(30.0) + end + end + + context "when rent is paid every calendar month" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 130, period: 2) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(30.0) + expect(record_from_db["wrent"]).to eq(30.0) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 130, period: 2) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(30.0) + expect(record_from_db["wscharge"]).to eq(30.0) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 130, period: 2) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(30.0) + expect(record_from_db["wpschrge"]).to eq(30.0) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 130, period: 2) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(30.0) + expect(record_from_db["wsupchrg"]).to eq(30.0) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 130, period: 2) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(30.0) + expect(record_from_db["wtcharge"]).to eq(30.0) + end + end + + context "when rent is paid weekly for 50 weeks" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 130, period: 3) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(125.0) + expect(record_from_db["wrent"]).to eq(125.0) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 130, period: 3) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(125.0) + expect(record_from_db["wscharge"]).to eq(125.0) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 130, period: 3) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(125.0) + expect(record_from_db["wpschrge"]).to eq(125.0) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 130, period: 3) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(125.0) + expect(record_from_db["wsupchrg"]).to eq(125.0) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 130, period: 3) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(125.0) + expect(record_from_db["wtcharge"]).to eq(125.0) + end + end + + context "when rent is paid weekly for 49 weeks" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 130, period: 4) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(122.5) + expect(record_from_db["wrent"]).to eq(122.5) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 130, period: 4) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(122.5) + expect(record_from_db["wscharge"]).to eq(122.5) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 130, period: 4) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(122.5) + expect(record_from_db["wpschrge"]).to eq(122.5) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 130, period: 4) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(122.5) + expect(record_from_db["wsupchrg"]).to eq(122.5) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 130, period: 4) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(122.5) + expect(record_from_db["wtcharge"]).to eq(122.5) + end + end + + context "when rent is paid weekly for 48 weeks" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 130, period: 5) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(120.0) + expect(record_from_db["wrent"]).to eq(120.0) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 130, period: 5) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(120.0) + expect(record_from_db["wscharge"]).to eq(120.0) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 130, period: 5) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(120.0) + expect(record_from_db["wpschrge"]).to eq(120.0) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 130, period: 5) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(120.0) + expect(record_from_db["wsupchrg"]).to eq(120.0) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 130, period: 5) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(120.0) + expect(record_from_db["wtcharge"]).to eq(120.0) + end + end + + context "when rent is paid weekly for 47 weeks" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 130, period: 6) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(117.5) + expect(record_from_db["wrent"]).to eq(117.5) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 130, period: 6) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(117.5) + expect(record_from_db["wscharge"]).to eq(117.5) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 130, period: 6) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(117.5) + expect(record_from_db["wpschrge"]).to eq(117.5) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 130, period: 6) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(117.5) + expect(record_from_db["wsupchrg"]).to eq(117.5) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 130, period: 6) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(117.5) + expect(record_from_db["wtcharge"]).to eq(117.5) + end + end + + context "when rent is paid weekly for 46 weeks" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 130, period: 7) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(115.0) + expect(record_from_db["wrent"]).to eq(115.0) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 130, period: 7) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(115.0) + expect(record_from_db["wscharge"]).to eq(115.0) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 130, period: 7) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(115.0) + expect(record_from_db["wpschrge"]).to eq(115.0) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 130, period: 7) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(115.0) + expect(record_from_db["wsupchrg"]).to eq(115.0) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 130, period: 7) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(115.0) + expect(record_from_db["wtcharge"]).to eq(115.0) + end + end + + context "when rent is paid weekly for 52 weeks" do + it "correctly derives and saves weekly rent" do + case_log.update!(brent: 130, period: 8) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wrent).to eq(130.0) + expect(record_from_db["wrent"]).to eq(130.0) + end + + it "correctly derives and saves weekly service charge" do + case_log.update!(scharge: 130, period: 8) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wscharge).to eq(130.0) + expect(record_from_db["wscharge"]).to eq(130.0) + end + + it "correctly derives and saves weekly personal service charge" do + case_log.update!(pscharge: 130, period: 8) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wpschrge).to eq(130.0) + expect(record_from_db["wpschrge"]).to eq(130.0) + end + + it "correctly derives and saves weekly support charge" do + case_log.update!(supcharg: 130, period: 8) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wsupchrg).to eq(130.0) + expect(record_from_db["wsupchrg"]).to eq(130.0) + end + + it "correctly derives and saves weekly total charge" do + case_log.update!(tcharge: 130, period: 8) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from case_logs where id=#{case_log.id}").to_a[0] + expect(case_log.wtcharge).to eq(130.0) + expect(record_from_db["wtcharge"]).to eq(130.0) + end + end end context "when the owning organisation is an LA" do