From 8d47e23910db18951848dfed5a8d8c85a573b59e Mon Sep 17 00:00:00 2001 From: Carolyn Date: Mon, 17 Mar 2025 15:30:06 +0000 Subject: [PATCH] handle edge case of overlapping periods --- app/models/location.rb | 7 +++++-- app/models/scheme.rb | 6 ++++-- app/models/validations/shared_validations.rb | 3 +-- spec/models/validations/setup_validations_spec.rb | 8 ++++---- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/models/location.rb b/app/models/location.rb index 4fd050789..06c8543b9 100644 --- a/app/models/location.rb +++ b/app/models/location.rb @@ -220,8 +220,11 @@ class Location < ApplicationRecord location_deactivation_periods.deactivations_without_reactivation.first end - def soonest_reactivation(date) - location_deactivation_periods.deactivations_with_reactivation.where("reactivation_date > ?", date).order(reactivation_date: :asc).first + def reactivation_date_after(date) + return nil if location_deactivation_periods.deactivations_without_reactivation.any? + + periods_ending_in_future = location_deactivation_periods.deactivations_with_reactivation.where("reactivation_date > ?", date).all + periods_ending_in_future.select {|period| %i[active deactivating_soon].include?(status_at(period.reactivation_date)) }.map(&:reactivation_date).min end def status diff --git a/app/models/scheme.rb b/app/models/scheme.rb index 81415ad85..2c486182c 100644 --- a/app/models/scheme.rb +++ b/app/models/scheme.rb @@ -315,8 +315,10 @@ class Scheme < ApplicationRecord scheme_deactivation_periods.deactivations_without_reactivation.first end - def soonest_reactivation(date) - scheme_deactivation_periods.deactivations_with_reactivation.where("reactivation_date > ?", date).order(reactivation_date: :asc).first + def reactivation_date_after(date) + return nil if scheme_deactivation_periods.deactivations_without_reactivation.any? + periods_ending_in_future = scheme_deactivation_periods.deactivations_with_reactivation.where("reactivation_date > ?", date).all + periods_ending_in_future.select {|period| %i[active deactivating_soon].include?(status_at(period.reactivation_date)) }.map(&:reactivation_date).min end def last_deactivation_date diff --git a/app/models/validations/shared_validations.rb b/app/models/validations/shared_validations.rb index f4201ebcb..530735213 100644 --- a/app/models/validations/shared_validations.rb +++ b/app/models/validations/shared_validations.rb @@ -73,7 +73,6 @@ module Validations::SharedValidations status = resource.status_at(date) return unless %i[reactivating_soon activating_soon deactivated].include?(status) - closest_reactivation = resource.soonest_reactivation(date) open_deactivation = if resource.is_a?(Location) resource.open_deactivation || resource.scheme.open_deactivation else @@ -81,7 +80,7 @@ module Validations::SharedValidations end date = case status - when :reactivating_soon then closest_reactivation.reactivation_date + when :reactivating_soon then resource.reactivation_date_after(date) when :activating_soon then resource&.available_from when :deactivated then open_deactivation.deactivation_date end diff --git a/spec/models/validations/setup_validations_spec.rb b/spec/models/validations/setup_validations_spec.rb index 50b1665ef..eeac39d1d 100644 --- a/spec/models/validations/setup_validations_spec.rb +++ b/spec/models/validations/setup_validations_spec.rb @@ -529,9 +529,9 @@ RSpec.describe Validations::SetupValidations do record.scheme = scheme setup_validator.validate_scheme(record) expect(record.errors["startdate"]) - .to include(match I18n.t("validations.lettings.setup.startdate.scheme.reactivating_soon.startdate", name: scheme.service_name, date: "4 August 2022")) + .to include(match I18n.t("validations.lettings.setup.startdate.scheme.reactivating_soon.startdate", name: scheme.service_name, date: "3 August 2022")) expect(record.errors["scheme_id"]) - .to include(match I18n.t("validations.lettings.setup.startdate.scheme.reactivating_soon.scheme_id", name: scheme.service_name, date: "4 August 2022")) + .to include(match I18n.t("validations.lettings.setup.startdate.scheme.reactivating_soon.scheme_id", name: scheme.service_name, date: "3 August 2022")) end it "produces error when tenancy start date is during earlier deactivated scheme period" do @@ -539,9 +539,9 @@ RSpec.describe Validations::SetupValidations do record.scheme = scheme setup_validator.validate_scheme(record) expect(record.errors["startdate"]) - .to include(match I18n.t("validations.lettings.setup.startdate.scheme.reactivating_soon.startdate", name: scheme.service_name, date: "4 August 2022")) + .to include(match I18n.t("validations.lettings.setup.startdate.scheme.reactivating_soon.startdate", name: scheme.service_name, date: "4 March 2022")) expect(record.errors["scheme_id"]) - .to include(match I18n.t("validations.lettings.setup.startdate.scheme.reactivating_soon.scheme_id", name: scheme.service_name, date: "4 August 2022")) + .to include(match I18n.t("validations.lettings.setup.startdate.scheme.reactivating_soon.scheme_id", name: scheme.service_name, date: "4 March 2022")) end it "produces no error when tenancy start date is during an active scheme period" do