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 location_deactivation_periods.deactivations_without_reactivation.first
end end
def soonest_reactivation(date) def reactivation_date_after(date)
location_deactivation_periods.deactivations_with_reactivation.where("reactivation_date > ?", date).order(reactivation_date: :asc).first 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 end
def status def status

6
app/models/scheme.rb

@ -315,8 +315,10 @@ class Scheme < ApplicationRecord
scheme_deactivation_periods.deactivations_without_reactivation.first scheme_deactivation_periods.deactivations_without_reactivation.first
end end
def soonest_reactivation(date) def reactivation_date_after(date)
scheme_deactivation_periods.deactivations_with_reactivation.where("reactivation_date > ?", date).order(reactivation_date: :asc).first 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 end
def last_deactivation_date def last_deactivation_date

3
app/models/validations/shared_validations.rb

@ -73,7 +73,6 @@ module Validations::SharedValidations
status = resource.status_at(date) status = resource.status_at(date)
return unless %i[reactivating_soon activating_soon deactivated].include?(status) return unless %i[reactivating_soon activating_soon deactivated].include?(status)
closest_reactivation = resource.soonest_reactivation(date)
open_deactivation = if resource.is_a?(Location) open_deactivation = if resource.is_a?(Location)
resource.open_deactivation || resource.scheme.open_deactivation resource.open_deactivation || resource.scheme.open_deactivation
else else
@ -81,7 +80,7 @@ module Validations::SharedValidations
end end
date = case status 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 :activating_soon then resource&.available_from
when :deactivated then open_deactivation.deactivation_date when :deactivated then open_deactivation.deactivation_date
end end

8
spec/models/validations/setup_validations_spec.rb

@ -529,9 +529,9 @@ RSpec.describe Validations::SetupValidations do
record.scheme = scheme record.scheme = scheme
setup_validator.validate_scheme(record) setup_validator.validate_scheme(record)
expect(record.errors["startdate"]) 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"]) 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 end
it "produces error when tenancy start date is during earlier deactivated scheme period" do 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 record.scheme = scheme
setup_validator.validate_scheme(record) setup_validator.validate_scheme(record)
expect(record.errors["startdate"]) 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"]) 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 end
it "produces no error when tenancy start date is during an active scheme period" do it "produces no error when tenancy start date is during an active scheme period" do

Loading…
Cancel
Save