diff --git a/lib/tasks/correct_checkbox_values.rake b/lib/tasks/correct_checkbox_values.rake new file mode 100644 index 000000000..0bd7c6974 --- /dev/null +++ b/lib/tasks/correct_checkbox_values.rake @@ -0,0 +1,20 @@ +desc "Update BU reasonable preference and illness type checkbox values" +task correct_checkbox_values: :environment do + any_reasonpref_selected = "rp_homeless = 1 OR rp_hardship = 1 OR rp_medwel = 1 OR rp_insan_unsat = 1 OR rp_dontknow = 1" + any_reasonpref_is_null = "rp_homeless IS NULL OR rp_hardship IS NULL OR rp_medwel IS NULL OR rp_insan_unsat IS NULL OR rp_dontknow IS NULL" + + LettingsLog.filter_by_year(2024).where(reasonpref: 1).where(any_reasonpref_selected).where(any_reasonpref_is_null).find_each do |lettings_log| + unless lettings_log.save + Rails.logger.info("Failed to save reasonpref for LettingsLog with id #{lettings_log.id}: #{lettings_log.errors.full_messages}") + end + end + + any_illness_selected = "illness_type_1 = 1 OR illness_type_2 = 1 OR illness_type_3 = 1 OR illness_type_4 = 1 OR illness_type_5 = 1 OR illness_type_6 = 1 OR illness_type_7 = 1 OR illness_type_8 = 1 OR illness_type_9 = 1 OR illness_type_10 = 1" + any_illness_is_null = "illness_type_1 IS NULL OR illness_type_2 IS NULL OR illness_type_3 IS NULL OR illness_type_4 IS NULL OR illness_type_5 IS NULL OR illness_type_6 IS NULL OR illness_type_7 IS NULL OR illness_type_8 IS NULL OR illness_type_9 IS NULL OR illness_type_10 IS NULL" + + LettingsLog.filter_by_year(2024).where(illness: 1).where(any_illness_selected).where(any_illness_is_null).find_each do |lettings_log| + unless lettings_log.save + Rails.logger.info("Failed to save illness for LettingsLog with id #{lettings_log.id}: #{lettings_log.errors.full_messages}") + end + end +end diff --git a/spec/lib/tasks/correct_checkbox_values_spec.rb b/spec/lib/tasks/correct_checkbox_values_spec.rb new file mode 100644 index 000000000..1557517f0 --- /dev/null +++ b/spec/lib/tasks/correct_checkbox_values_spec.rb @@ -0,0 +1,216 @@ +require "rails_helper" +require "rake" + +RSpec.describe "correct_checkbox_values" do + describe ":correct_checkbox_values", type: :task do + subject(:task) { Rake::Task["correct_checkbox_values"] } + + let(:organisation) { create(:organisation, rent_periods: [2]) } + let(:user) { create(:user, organisation:) } + + before do + Rake.application.rake_require("tasks/correct_checkbox_values") + Rake::Task.define_task(:environment) + task.reenable + end + + context "when the rake task is run" do + context "and any of the reasonable_preference_reason options are 1" do + let(:bulk_upload) { create(:bulk_upload, :lettings, year: 2024, rent_type_fix_status: BulkUpload.rent_type_fix_statuses[:not_applied]) } + + it "sets the remaining options to 0" do + log = build(:lettings_log, :completed, reasonpref: 1, rp_homeless: 1, rp_hardship: nil, rp_medwel: nil, rp_insan_unsat: nil, rp_dontknow: nil, + bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + + task.invoke + log.reload + + expect(log.updated_at).not_to eq(initial_updated_at) + expect(log.status).to eq("completed") + expect(log.rp_homeless).to be(1) + expect(log.rp_hardship).to be(0) + expect(log.rp_medwel).to be(0) + expect(log.rp_insan_unsat).to be(0) + expect(log.rp_dontknow).to be(0) + end + + it "updates the reasonable preference reason values on a pending log" do + log = build(:lettings_log, :completed, status: "pending", reasonpref: 1, rp_homeless: 1, rp_hardship: nil, rp_medwel: nil, rp_insan_unsat: nil, rp_dontknow: nil, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + expect(log.status).to eq("pending") + + task.invoke + log.reload + expect(log.rp_homeless).to be(1) + expect(log.rp_hardship).to be(0) + expect(log.rp_medwel).to be(0) + expect(log.rp_insan_unsat).to be(0) + expect(log.rp_dontknow).to be(0) + expect(log.status).to eq("pending") + expect(log.updated_at).not_to eq(initial_updated_at) + end + + it "does not update logs if all unselected reasonable preference reason are alredy 0" do + log = build(:lettings_log, :completed, reasonpref: 1, rp_homeless: 0, rp_hardship: 1, rp_medwel: 0, rp_insan_unsat: 0, rp_dontknow: 0, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + expect(log.status).to eq("completed") + + task.invoke + log.reload + + expect(log.status).to eq("completed") + expect(log.updated_at).to eq(initial_updated_at) + end + + it "updates the reasonable preference reason values if some of the checkbox values are nil" do + log = build(:lettings_log, :completed, status: "pending", reasonpref: 1, rp_homeless: 0, rp_hardship: nil, rp_medwel: 1, rp_insan_unsat: 0, rp_dontknow: 0, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + expect(log.status).to eq("pending") + + task.invoke + log.reload + expect(log.rp_homeless).to be(0) + expect(log.rp_hardship).to be(0) + expect(log.rp_medwel).to be(1) + expect(log.rp_insan_unsat).to be(0) + expect(log.rp_dontknow).to be(0) + expect(log.status).to eq("pending") + expect(log.updated_at).not_to eq(initial_updated_at) + end + + it "does not update the reasonable preference reason values on a 2023 log" do + log = build(:lettings_log, :completed, startdate: Time.zone.local(2023, 6, 6), reasonpref: 1, rp_homeless: 0, rp_hardship: nil, rp_medwel: 1, rp_insan_unsat: 0, rp_dontknow: 0, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + + task.invoke + log.reload + + expect(log.updated_at).to eq(initial_updated_at) + end + + it "does not update and logs error if a validation triggers" do + log = build(:lettings_log, :completed, postcode_full: "0", reasonpref: 1, rp_homeless: 0, rp_hardship: nil, rp_medwel: 1, rp_insan_unsat: 0, rp_dontknow: 0, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + + task.invoke + log.reload + + expect(log.updated_at).to eq(initial_updated_at) + end + end + + context "and any of the illness_type options are 1" do + let(:bulk_upload) { create(:bulk_upload, :lettings, year: 2024, rent_type_fix_status: BulkUpload.rent_type_fix_statuses[:not_applied]) } + + it "sets the remaining options to 0" do + log = build(:lettings_log, :completed, illness: 1, illness_type_1: 1, illness_type_2: nil, illness_type_3: nil, illness_type_4: nil, illness_type_5: nil, illness_type_6: nil, illness_type_7: nil, illness_type_8: nil, illness_type_9: nil, illness_type_10: nil, + bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + + task.invoke + log.reload + + expect(log.updated_at).not_to eq(initial_updated_at) + expect(log.status).to eq("completed") + expect(log.illness_type_1).to be(1) + expect(log.illness_type_2).to be(0) + expect(log.illness_type_3).to be(0) + expect(log.illness_type_4).to be(0) + expect(log.illness_type_5).to be(0) + expect(log.illness_type_6).to be(0) + expect(log.illness_type_7).to be(0) + expect(log.illness_type_8).to be(0) + expect(log.illness_type_9).to be(0) + expect(log.illness_type_10).to be(0) + end + + it "updates the reasonable preference reason values on a pending log" do + log = build(:lettings_log, :completed, status: "pending", illness: 1, illness_type_1: 1, illness_type_2: nil, illness_type_3: nil, illness_type_4: nil, illness_type_5: nil, illness_type_6: nil, illness_type_7: nil, illness_type_8: nil, illness_type_9: nil, illness_type_10: nil, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + expect(log.status).to eq("pending") + + task.invoke + log.reload + expect(log.illness_type_1).to be(1) + expect(log.illness_type_2).to be(0) + expect(log.illness_type_3).to be(0) + expect(log.illness_type_4).to be(0) + expect(log.illness_type_5).to be(0) + expect(log.illness_type_6).to be(0) + expect(log.illness_type_7).to be(0) + expect(log.illness_type_8).to be(0) + expect(log.illness_type_9).to be(0) + expect(log.illness_type_10).to be(0) + expect(log.status).to eq("pending") + expect(log.updated_at).not_to eq(initial_updated_at) + end + + it "does not update logs if all unselected reasonable preference reason are alredy 0" do + log = build(:lettings_log, :completed, illness: 1, illness_type_1: 0, illness_type_2: 1, illness_type_3: 0, illness_type_4: 0, illness_type_5: 0, illness_type_6: 0, illness_type_7: 0, illness_type_8: 0, illness_type_9: 0, illness_type_10: 0, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + expect(log.status).to eq("completed") + + task.invoke + log.reload + + expect(log.status).to eq("completed") + expect(log.updated_at).to eq(initial_updated_at) + end + + it "updates the reasonable preference reason values if some of the checkbox values are nil" do + log = build(:lettings_log, :completed, status: "pending", illness: 1, illness_type_1: 0, illness_type_2: nil, illness_type_3: 1, illness_type_4: 0, illness_type_5: 0, illness_type_6: nil, illness_type_7: nil, illness_type_8: nil, illness_type_9: nil, illness_type_10: nil, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + expect(log.status).to eq("pending") + + task.invoke + log.reload + expect(log.illness_type_1).to be(0) + expect(log.illness_type_2).to be(0) + expect(log.illness_type_3).to be(1) + expect(log.illness_type_4).to be(0) + expect(log.illness_type_5).to be(0) + expect(log.illness_type_6).to be(0) + expect(log.illness_type_7).to be(0) + expect(log.illness_type_8).to be(0) + expect(log.illness_type_9).to be(0) + expect(log.illness_type_10).to be(0) + expect(log.status).to eq("pending") + expect(log.updated_at).not_to eq(initial_updated_at) + end + + it "does not update the reasonable preference reason values on a 2023 log" do + log = build(:lettings_log, :completed, startdate: Time.zone.local(2023, 6, 6), illness: 1, illness_type_1: 0, illness_type_2: nil, illness_type_3: 1, illness_type_4: 0, illness_type_5: 0, illness_type_6: nil, illness_type_7: nil, illness_type_8: nil, illness_type_9: nil, illness_type_10: nil, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + + task.invoke + log.reload + + expect(log.updated_at).to eq(initial_updated_at) + end + + it "does not update and logs error if a validation triggers" do + log = build(:lettings_log, :completed, postcode_full: "0", illness: 1, illness_type_1: 0, illness_type_2: nil, illness_type_3: 1, illness_type_4: 0, illness_type_5: 0, illness_type_6: nil, illness_type_7: nil, illness_type_8: nil, illness_type_9: nil, illness_type_10: nil, bulk_upload:, assigned_to: user) + log.save!(validate: false) + initial_updated_at = log.updated_at + + task.invoke + log.reload + + expect(log.updated_at).to eq(initial_updated_at) + end + end + end + end +end