Browse Source
* route deactivated scheme to reactivation page * Render correct reactivate question content * refactor into a helper * display successful reactivation banner for default date * Save reactivation date * Add reactivation errors * lint and fix url in tests * make toggle translations generic * Add reactivation status * Reuse date validation messages * Show deactivate this location when location is reactivating soon * Display correct confirmation banner * Add validation for reactivation date before deactivation date * Improve availability label * Use current collection start date if created at is later than that * Update paths * Fix controller and don't display the previous day if location availability start afterwards * refactor availability label * Filter out active periods * lint * Refactor active_period method into the model * Allow deactivations and reactivations from available from date instead of start of the collection date * Prevent deactivations during deactivated periods * lint * typo * Remove active periods that last 1 day (because they get deactivated on the same day) * Move the active_periods into helper * extract remove_overlapping_and_empty_periods into a separate method * Remove nested deactivation periods * Make deactivate/reactvate location form use location_deactivation_period model * refactor toggle date methods * extract shared condition * update validations * refactor validations * Update schemes deactivation form to use dectivation model * Refactor * lint * remove redundant location_id and update scheme controller * update active_periodspull/1018/head
kosiakkatrina
2 years ago
committed by
GitHub
23 changed files with 699 additions and 200 deletions
@ -0,0 +1,17 @@
|
||||
module ToggleActiveLocationHelper |
||||
def toggle_location_form_path(action, location) |
||||
if action == "deactivate" |
||||
scheme_location_new_deactivation_path(location.scheme, location) |
||||
else |
||||
scheme_location_reactivate_path(location.scheme, location) |
||||
end |
||||
end |
||||
|
||||
def date_type_question(action) |
||||
action == "deactivate" ? :deactivation_date_type : :reactivation_date_type |
||||
end |
||||
|
||||
def date_question(action) |
||||
action == "deactivate" ? :deactivation_date : :reactivation_date |
||||
end |
||||
end |
@ -1,3 +1,49 @@
|
||||
class LocationDeactivationPeriodValidator < ActiveModel::Validator |
||||
def validate(record) |
||||
location = record.location |
||||
recent_deactivation = location.location_deactivation_periods.deactivations_without_reactivation.first |
||||
if recent_deactivation.present? |
||||
validate_reactivation(record, recent_deactivation, location) |
||||
else |
||||
validate_deactivation(record, location) |
||||
end |
||||
end |
||||
|
||||
def validate_reactivation(record, recent_deactivation, location) |
||||
if record.reactivation_date.blank? |
||||
if record.reactivation_date_type.blank? |
||||
record.errors.add(:reactivation_date_type, message: I18n.t("validations.location.toggle_date.not_selected")) |
||||
elsif record.reactivation_date_type == "other" |
||||
record.errors.add(:reactivation_date, message: I18n.t("validations.location.toggle_date.invalid")) |
||||
end |
||||
elsif !record.reactivation_date.between?(location.available_from, Time.zone.local(2200, 1, 1)) |
||||
record.errors.add(:reactivation_date, message: I18n.t("validations.location.toggle_date.out_of_range", date: location.available_from.to_formatted_s(:govuk_date))) |
||||
elsif record.reactivation_date < recent_deactivation.deactivation_date |
||||
record.errors.add(:reactivation_date, message: I18n.t("validations.location.reactivation.before_deactivation", date: recent_deactivation.deactivation_date.to_formatted_s(:govuk_date))) |
||||
end |
||||
end |
||||
|
||||
def validate_deactivation(record, location) |
||||
if record.deactivation_date.blank? |
||||
if record.deactivation_date_type.blank? |
||||
record.errors.add(:deactivation_date_type, message: I18n.t("validations.location.toggle_date.not_selected")) |
||||
elsif record.deactivation_date_type == "other" |
||||
record.errors.add(:deactivation_date, message: I18n.t("validations.location.toggle_date.invalid")) |
||||
end |
||||
elsif location.location_deactivation_periods.any? { |period| period.reactivation_date.present? && record.deactivation_date.between?(period.deactivation_date, period.reactivation_date - 1.day) } |
||||
record.errors.add(:deactivation_date, message: I18n.t("validations.location.deactivation.during_deactivated_period")) |
||||
else |
||||
unless record.deactivation_date.between?(location.available_from, Time.zone.local(2200, 1, 1)) |
||||
record.errors.add(:deactivation_date, message: I18n.t("validations.location.toggle_date.out_of_range", date: location.available_from.to_formatted_s(:govuk_date))) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
class LocationDeactivationPeriod < ApplicationRecord |
||||
validates_with LocationDeactivationPeriodValidator |
||||
belongs_to :location |
||||
attr_accessor :deactivation_date_type, :reactivation_date_type |
||||
|
||||
scope :deactivations_without_reactivation, -> { where(reactivation_date: nil) } |
||||
end |
||||
|
@ -1,3 +1,24 @@
|
||||
class SchemeDeactivationPeriodValidator < ActiveModel::Validator |
||||
def validate(record) |
||||
if record.deactivation_date.blank? |
||||
if record.deactivation_date_type.blank? |
||||
record.errors.add(:deactivation_date_type, message: I18n.t("validations.scheme.deactivation_date.not_selected")) |
||||
elsif record.deactivation_date_type == "other" |
||||
record.errors.add(:deactivation_date, message: I18n.t("validations.scheme.deactivation_date.invalid")) |
||||
end |
||||
else |
||||
collection_start_date = FormHandler.instance.current_collection_start_date |
||||
unless record.deactivation_date.between?(collection_start_date, Time.zone.local(2200, 1, 1)) |
||||
record.errors.add(:deactivation_date, message: I18n.t("validations.scheme.deactivation_date.out_of_range", date: collection_start_date.to_formatted_s(:govuk_date))) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
class SchemeDeactivationPeriod < ApplicationRecord |
||||
validates_with SchemeDeactivationPeriodValidator |
||||
belongs_to :scheme |
||||
attr_accessor :deactivation_date_type, :reactivation_date_type |
||||
|
||||
scope :deactivations_without_reactivation, -> { where(reactivation_date: nil) } |
||||
end |
||||
|
@ -1,5 +1,6 @@
|
||||
FactoryBot.define do |
||||
factory :location_deactivation_period do |
||||
deactivation_date { Time.zone.local(2022, 4, 1) } |
||||
reactivation_date { nil } |
||||
end |
||||
end |
||||
|
Loading…
Reference in new issue