Browse Source

handle edge case of overlapping periods

pull/2995/head
Carolyn 2 months ago
parent
commit
8d47e23910
  1. 7
      app/models/location.rb
  2. 6
      app/models/scheme.rb
  3. 3
      app/models/validations/shared_validations.rb
  4. 8
      spec/models/validations/setup_validations_spec.rb

7
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

6
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

3
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

8
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

Loading…
Cancel
Save