From 05b15a26dfd4533ef03bd25c089b1194951e9c8c Mon Sep 17 00:00:00 2001 From: Rachael Booth Date: Thu, 30 May 2024 18:39:40 +0100 Subject: [PATCH] CLDC-3463: Fix bug with vacdays calculation --- .../lettings_log_variables.rb | 4 ++-- lib/tasks/recalculate_vacdays.rake | 5 +++++ spec/models/lettings_log_spec.rb | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 lib/tasks/recalculate_vacdays.rake diff --git a/app/models/derived_variables/lettings_log_variables.rb b/app/models/derived_variables/lettings_log_variables.rb index 815fbbe55..fae39be40 100644 --- a/app/models/derived_variables/lettings_log_variables.rb +++ b/app/models/derived_variables/lettings_log_variables.rb @@ -306,9 +306,9 @@ private return unless startdate if mrcdate.present? - (startdate - mrcdate).to_i / 1.day + startdate.to_date - mrcdate.to_date elsif voiddate.present? - (startdate - voiddate).to_i / 1.day + startdate.to_date - voiddate.to_date end end diff --git a/lib/tasks/recalculate_vacdays.rake b/lib/tasks/recalculate_vacdays.rake new file mode 100644 index 000000000..4114803d2 --- /dev/null +++ b/lib/tasks/recalculate_vacdays.rake @@ -0,0 +1,5 @@ +desc "Recalculate vacdays after bugfix for daylight savings time changes" +task recalculate_vacdays: :environment do + logs = LettingsLog.filter_by_years(%w[2023 2024]).where.not(vacdays: nil) + logs.each(&:save!) +end diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index a0281af45..49f954250 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -1514,6 +1514,24 @@ RSpec.describe LettingsLog do expect(record_from_db["has_benefits"]).to eq(1) end + describe "deriving vacant days" do + it "correctly derives vacdays from startdate and mrcdate across DST boundaries" do + log = build(:lettings_log, startdate: Time.zone.local(2024, 4, 1), 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 = build(:lettings_log, startdate: Time.zone.local(2024, 4, 1), mrcdate: nil, voiddate: Time.zone.local(2024, 3, 30)) + + log.set_derived_fields! + + expect(log.vacdays).to be 2 + end + end + context "when updating values that derive vacdays" do let(:lettings_log) { create(:lettings_log, startdate:) }