diff --git a/lib/tasks/clear_invalidated_earnings.rake b/lib/tasks/clear_invalidated_earnings.rake new file mode 100644 index 000000000..0be55bd71 --- /dev/null +++ b/lib/tasks/clear_invalidated_earnings.rake @@ -0,0 +1,19 @@ +desc "Clear earnings for lettings logs that fail validation" +task clear_invalidated_earnings: :environment do + LettingsLog.filter_by_year(2023).find_each do |lettings_log| + lettings_log.validate_net_income(lettings_log) + if lettings_log.errors[:earnings].present? + lettings_log.earnings = nil + lettings_log.incfreq = nil + lettings_log.save!(validate: false) + end + end + LettingsLog.filter_by_year(2022).find_each do |lettings_log| + lettings_log.validate_net_income(lettings_log) + if lettings_log.errors[:earnings].present? + lettings_log.earnings = nil + lettings_log.incfreq = nil + lettings_log.save!(validate: false, touch: false) + end + end +end diff --git a/spec/lib/tasks/clear_invalidated_earnings_spec.rb b/spec/lib/tasks/clear_invalidated_earnings_spec.rb new file mode 100644 index 000000000..b02f7561a --- /dev/null +++ b/spec/lib/tasks/clear_invalidated_earnings_spec.rb @@ -0,0 +1,79 @@ +require "rails_helper" +require "rake" + +RSpec.describe "clear_invalidated_earnings" do + describe ":clear_invalidated_earnings", type: :task do + subject(:task) { Rake::Task["clear_invalidated_earnings"] } + + before do + Rake.application.rake_require("tasks/clear_invalidated_earnings") + Rake::Task.define_task(:environment) + task.reenable + FormHandler.instance.use_real_forms! + end + + context "when the rake task is run" do + context "and there are 2023 logs with invalid earnings" do + let(:user) { create(:user) } + let!(:lettings_log) { create(:lettings_log, created_by: user) } + + before do + lettings_log.startdate = Time.zone.local(2023, 4, 4) + lettings_log.incfreq = 1 + lettings_log.earnings = 20 + lettings_log.hhmemb = 1 + lettings_log.ecstat1 = 1 + lettings_log.save!(validate: false) + end + + it "clears earnings" do + initial_updated_at = lettings_log.updated_at + expect(lettings_log.incfreq).to eq(1) + expect(lettings_log.earnings).to eq(20) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + + task.invoke + lettings_log.reload + + expect(lettings_log.incfreq).to eq(nil) + expect(lettings_log.earnings).to eq(nil) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + expect(lettings_log.updated_at).not_to eq(initial_updated_at) + end + end + + context "and there are 2022 logs with invalid earnings" do + let(:user) { create(:user) } + let!(:lettings_log) { create(:lettings_log, created_by: user) } + + before do + lettings_log.startdate = Time.zone.local(2022, 4, 4) + lettings_log.incfreq = 1 + lettings_log.earnings = 20 + lettings_log.hhmemb = 1 + lettings_log.ecstat1 = 1 + lettings_log.save!(validate: false) + end + + it "does not export the log" do + initial_updated_at = lettings_log.updated_at + expect(lettings_log.incfreq).to eq(1) + expect(lettings_log.earnings).to eq(20) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + + task.invoke + lettings_log.reload + + expect(lettings_log.incfreq).to eq(nil) + expect(lettings_log.earnings).to eq(nil) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + expect(lettings_log.updated_at).to eq(initial_updated_at) + end + end + end + end +end