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 |
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) } |
scope :deactivations_without_reactivation, -> { where(reactivation_date: nil) } |
||||||
end |
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 |
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) } |
scope :deactivations_without_reactivation, -> { where(reactivation_date: nil) } |
||||||
end |
end |
||||||
|
@ -1,5 +1,6 @@ |
|||||||
FactoryBot.define do |
FactoryBot.define do |
||||||
factory :location_deactivation_period do |
factory :location_deactivation_period do |
||||||
|
deactivation_date { Time.zone.local(2022, 4, 1) } |
||||||
reactivation_date { nil } |
reactivation_date { nil } |
||||||
end |
end |
||||||
end |
end |
||||||
|
Loading…
Reference in new issue