1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-03-21 12:29:03 +01:00

Added reservation deadlines for each type of reservation

This commit is contained in:
Guilherme Chaguri 2023-03-01 17:44:01 -03:00
parent e467a084b5
commit 1aa9b2fe39
14 changed files with 112 additions and 15 deletions

View File

@ -81,7 +81,10 @@ export const bookingSettings = [
'reminder_delay',
'visibility_yearly',
'visibility_others',
'reservation_deadline',
'machine_reservation_deadline',
'training_reservation_deadline',
'event_reservation_deadline',
'space_reservation_deadline',
'display_name_enable',
'book_overlapping_slots',
'slot_duration',

View File

@ -1175,7 +1175,8 @@ angular.module('application.router', ['ui.router'])
"'renew_pack_threshold', 'pack_only_for_subscription', 'overlapping_categories', 'public_registrations'," +
"'extended_prices_in_same_day', 'recaptcha_site_key', 'recaptcha_secret_key', 'user_validation_required', " +
"'user_validation_required_list', 'machines_module', 'user_change_group', 'show_username_in_admin_list', " +
"'store_module', 'reservation_deadline']"
"'store_module', 'machine_reservation_deadline', 'training_reservation_deadline', 'event_reservation_deadline', " +
"'space_reservation_deadline']"
}).$promise;
}],
privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }],

View File

@ -108,9 +108,33 @@
<div class="row">
<h3 class="m-l m-t-lg" translate>{{ 'app.admin.settings.reservation_deadline' }}</h3>
<p class="alert alert-warning m-h-md" translate>{{ 'app.admin.settings.reservation_deadline_help' }}</p>
<number-setting name="reservation_deadline"
<number-setting name="machine_reservation_deadline"
settings="allSettings"
label="app.admin.settings.deadline_minutes"
label="app.admin.settings.machine_deadline_minutes"
classes="col-md-4"
fa-icon="fas fa-clock"
min="0"
required="true">
</number-setting>
<number-setting name="training_reservation_deadline"
settings="allSettings"
label="app.admin.settings.training_deadline_minutes"
classes="col-md-4"
fa-icon="fas fa-clock"
min="0"
required="true">
</number-setting>
<number-setting name="event_reservation_deadline"
settings="allSettings"
label="app.admin.settings.event_deadline_minutes"
classes="col-md-4"
fa-icon="fas fa-clock"
min="0"
required="true">
</number-setting>
<number-setting name="space_reservation_deadline"
settings="allSettings"
label="app.admin.settings.space_deadline_minutes"
classes="col-md-4"
fa-icon="fas fa-clock"
min="0"

View File

@ -58,7 +58,10 @@ module SettingsHelper
space_explications_alert
visibility_yearly
visibility_others
reservation_deadline
machine_reservation_deadline
training_reservation_deadline
event_reservation_deadline
space_reservation_deadline
display_name_enable
machines_sort_by
accounting_sales_journal_code

View File

@ -71,4 +71,8 @@ class CartItem::EventReservation < CartItem::Reservation
def total_tickets
(normal_tickets || 0) + (cart_item_event_reservation_tickets.map(&:booked).reduce(:+) || 0)
end
def reservation_deadline_minutes
return Setting.get('event_reservation_deadline').to_i
end
end

View File

@ -49,4 +49,8 @@ class CartItem::MachineReservation < CartItem::Reservation
machine_credit = plan.machine_credits.find { |credit| credit.creditable_id == reservable.id }
credits_hours(machine_credit, new_plan_being_bought: new_subscription)
end
def reservation_deadline_minutes
return Setting.get('machine_reservation_deadline').to_i
end
end

View File

@ -55,7 +55,6 @@ class CartItem::Reservation < CartItem::BaseItem
def valid?(all_items = [])
pending_subscription = all_items.find { |i| i.is_a?(CartItem::Subscription) }
reservation_deadline_minutes = Setting.get('reservation_deadline').to_i
reservation_deadline = reservation_deadline_minutes.minutes.since
cart_item_reservation_slots.each do |sr|
@ -255,4 +254,11 @@ class CartItem::Reservation < CartItem::BaseItem
(operator.manager? && customer.id != operator.id) ||
operator.admin?
end
##
# Gets the deadline in minutes for slots in this reservation
##
def reservation_deadline_minutes
return 0
end
end

View File

@ -34,4 +34,8 @@ class CartItem::SpaceReservation < CartItem::Reservation
space_credit = plan.space_credits.find { |credit| credit.creditable_id == reservable.id }
credits_hours(space_credit, new_plan_being_bought: new_subscription)
end
def reservation_deadline_minutes
return Setting.get('space_reservation_deadline').to_i
end
end

View File

@ -45,4 +45,8 @@ class CartItem::TrainingReservation < CartItem::Reservation
is_creditable = plan&.training_credits&.select { |credit| credit.creditable_id == reservable&.id }&.any?
is_creditable ? plan&.training_credit_nb : 0
end
def reservation_deadline_minutes
return Setting.get('training_reservation_deadline').to_i
end
end

View File

@ -10,7 +10,12 @@ class Availabilities::AvailabilitiesService
year: Setting.get('visibility_yearly').to_i.months.since,
other: Setting.get('visibility_others').to_i.months.since
}
@minimum_visibility = Setting.get('reservation_deadline').to_i.minutes.since
@minimum_visibility = {
machine: Setting.get('machine_reservation_deadline').to_i.minutes.since,
training: Setting.get('training_reservation_deadline').to_i.minutes.since,
event: Setting.get('event_reservation_deadline').to_i.minutes.since,
space: Setting.get('space_reservation_deadline').to_i.minutes.since
}
@level = level
end
@ -138,8 +143,18 @@ class Availabilities::AvailabilitiesService
end_at = @maximum_visibility[:other]
end_at = @maximum_visibility[:year] if subscription_year?(user) && type != 'training'
end_at = @maximum_visibility[:year] if show_more_trainings?(user) && type == 'training'
minimum_visibility = 0.minutes.since
minimum_visibility = @minimum_visibility[:machine] if type == 'machines'
minimum_visibility = @minimum_visibility[:training] if type == 'training'
minimum_visibility = @minimum_visibility[:event] if type == 'event'
minimum_visibility = @minimum_visibility[:space] if type == 'space'
print(minimum_visibility)
print(@minimum_visibility[:machine])
window_end = [end_at, range_end].min
window_start = [range_start, @minimum_visibility].max
window_start = [range_start, minimum_visibility].max
availabilities.includes(:tags, :slots)
.joins(:slots)
.where('availabilities.start_at <= ? AND availabilities.end_at >= ? AND available_type = ?', window_end, window_start, type)

View File

@ -1578,7 +1578,10 @@ en:
visibility_for_other_members: "For all other members"
reservation_deadline: "Prevent last minute booking"
reservation_deadline_help: "If you increase the prior period, members won't be able to book a slot X minutes before its start."
deadline_minutes: "Prior period (minutes)"
machine_deadline_minutes: "Machine prior period (minutes)"
training_deadline_minutes: "Training prior period (minutes)"
event_deadline_minutes: "Event prior period (minutes)"
space_deadline_minutes: "Space prior period (minutes)"
ability_for_the_users_to_move_their_reservations: "Ability for the users to move their reservations"
reservations_shifting: "Reservations shifting"
prior_period_hours: "Prior period (hours)"

View File

@ -418,7 +418,15 @@ Setting.set('visibility_yearly', 3) unless Setting.find_by(name: 'visibility_yea
Setting.set('visibility_others', 1) unless Setting.find_by(name: 'visibility_others').try(:value)
Setting.set('reservation_deadline', 0) unless Setting.find_by(name: 'reservation_deadline').try(:value)
reservation_deadline = Setting.get('reservation_deadline') || 0
Setting.set('machine_reservation_deadline', reservation_deadline) unless Setting.find_by(name: 'machine_reservation_deadline').try(:value)
Setting.set('training_reservation_deadline', reservation_deadline) unless Setting.find_by(name: 'training_reservation_deadline').try(:value)
Setting.set('event_reservation_deadline', reservation_deadline) unless Setting.find_by(name: 'event_reservation_deadline').try(:value)
Setting.set('space_reservation_deadline', reservation_deadline) unless Setting.find_by(name: 'space_reservation_deadline').try(:value)
Setting.set('display_name_enable', false) unless Setting.find_by(name: 'display_name_enable').try(:value)

View File

@ -737,9 +737,27 @@ export const settings: Array<Setting> = [
localized: 'éviter la génération de factures à 0'
},
{
name: 'reservation_deadline',
name: 'machine_reservation_deadline',
value: '0',
last_update: '2022-11-29T21:02:47-0300',
last_update: '2023-03-01T16:28:23-0300',
localized: "Empêcher la réservation avant qu'elle ne commence"
},
{
name: 'training_reservation_deadline',
value: '0',
last_update: '2023-03-01T16:28:23-0300',
localized: "Empêcher la réservation avant qu'elle ne commence"
},
{
name: 'event_reservation_deadline',
value: '0',
last_update: '2023-03-01T16:28:23-0300',
localized: "Empêcher la réservation avant qu'elle ne commence"
},
{
name: 'space_reservation_deadline',
value: '0',
last_update: '2023-03-01T16:28:23-0300',
localized: "Empêcher la réservation avant qu'elle ne commence"
},
{

View File

@ -13,7 +13,7 @@ class Reservations::LastMinuteTest < ActionDispatch::IntegrationTest
end
test 'user cannot reserve last minute booking' do
Setting.set('reservation_deadline', '120')
Setting.set('space_reservation_deadline', '120')
login_as(@user, scope: :user)
@ -44,7 +44,7 @@ class Reservations::LastMinuteTest < ActionDispatch::IntegrationTest
end
test 'user can reserve last minute booking' do
Setting.set('reservation_deadline', '0')
Setting.set('space_reservation_deadline', '0')
login_as(@user, scope: :user)
@ -85,7 +85,7 @@ class Reservations::LastMinuteTest < ActionDispatch::IntegrationTest
end
test 'admin can reserve last minute booking anyway' do
Setting.set('reservation_deadline', '120')
Setting.set('space_reservation_deadline', '120')
login_as(@admin, scope: :user)