1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-02-21 15:54:22 +01:00

ability to limit extended prices to slots in the same day

This commit is contained in:
Sylvain 2021-12-21 16:32:02 +01:00
parent 2d807e6c94
commit ffb0f3e19e
9 changed files with 41 additions and 14 deletions

View File

@ -2,6 +2,7 @@
- Updated portuguese translation - Updated portuguese translation
- Refactored the ReserveButton component to use the same user's data across all the component - Refactored the ReserveButton component to use the same user's data across all the component
- [TODO DEPLOY] `rails db:seed`
## v5.1.13 2021 November 16 ## v5.1.13 2021 November 16

View File

@ -111,7 +111,8 @@ export enum SettingName {
PublicAgendaModule = 'public_agenda_module', PublicAgendaModule = 'public_agenda_module',
RenewPackThreshold = 'renew_pack_threshold', RenewPackThreshold = 'renew_pack_threshold',
PackOnlyForSubscription = 'pack_only_for_subscription', PackOnlyForSubscription = 'pack_only_for_subscription',
OverlappingCategories = 'overlapping_categories' OverlappingCategories = 'overlapping_categories',
ExtendedPricesInSameDay = 'extended_prices_in_same_day'
} }
export type SettingValue = string|boolean|number; export type SettingValue = string|boolean|number;

View File

@ -1080,7 +1080,7 @@ angular.module('application.router', ['ui.router'])
"'reminder_delay', 'visibility_yearly', 'visibility_others', 'wallet_module', 'trainings_module', " + "'reminder_delay', 'visibility_yearly', 'visibility_others', 'wallet_module', 'trainings_module', " +
"'display_name_enable', 'machines_sort_by', 'fab_analytics', 'statistics_module', 'address_required', " + "'display_name_enable', 'machines_sort_by', 'fab_analytics', 'statistics_module', 'address_required', " +
"'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown', 'public_agenda_module'," + "'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown', 'public_agenda_module'," +
"'renew_pack_threshold', 'pack_only_for_subscription', 'overlapping_categories']" "'renew_pack_threshold', 'pack_only_for_subscription', 'overlapping_categories', 'extended_prices_in_same_day']"
}).$promise; }).$promise;
}], }],
privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }], privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }],

View File

@ -117,6 +117,28 @@
required="true"> required="true">
</number-setting> </number-setting>
</div> </div>
<div class="section-separator"></div>
<div class="row">
<h3 class="m-l" translate>{{ 'app.admin.settings.pack_only_for_subscription_info' }}</h3>
<p class="alert alert-warning m-h-md" ng-bind-html="'app.admin.settings.pack_only_for_subscription_info_html' | translate"></p>
<boolean-setting name="pack_only_for_subscription"
settings="allSettings"
label="app.admin.settings.pack_only_for_subscription"
classes="m-l">
</boolean-setting>
</div>
<div class="section-separator"></div>
<div class="row">
<h3 class="m-l" translate>{{ 'app.admin.settings.extended_prices' }}</h3>
<p class="alert alert-warning m-h-md" ng-bind-html="'app.admin.settings.extended_prices_info_html' | translate"></p>
<boolean-setting name="extended_prices_in_same_day"
settings="allSettings"
label="app.admin.settings.extended_prices_in_same_day"
classes="m-l">
</boolean-setting>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -170,6 +192,8 @@
label="app.admin.settings.show_event" label="app.admin.settings.show_event"
classes="m-l"></boolean-setting> classes="m-l"></boolean-setting>
</div> </div>
<div class="section-separator"></div>
<div class="row"> <div class="row">
<h3 class="m-l" translate>{{ 'app.admin.settings.display_invite_to_renew_pack' }}</h3> <h3 class="m-l" translate>{{ 'app.admin.settings.display_invite_to_renew_pack' }}</h3>
<p class="alert alert-warning m-h-md" ng-bind-html="'app.admin.settings.packs_threshold_info_html' | translate"></p> <p class="alert alert-warning m-h-md" ng-bind-html="'app.admin.settings.packs_threshold_info_html' | translate"></p>
@ -182,14 +206,5 @@
step="0.01"> step="0.01">
</number-setting> </number-setting>
</div> </div>
<div class="row">
<h3 class="m-l" translate>{{ 'app.admin.settings.pack_only_for_subscription_info' }}</h3>
<p class="alert alert-warning m-h-md" ng-bind-html="'app.admin.settings.pack_only_for_subscription_info_html' | translate"></p>
<boolean-setting name="pack_only_for_subscription"
settings="allSettings"
label="app.admin.settings.pack_only_for_subscription"
classes="m-l">
</boolean-setting>
</div>
</div> </div>
</div> </div>

View File

@ -18,13 +18,14 @@ class CartItem::Reservation < CartItem::BaseItem
def price def price
is_privileged = @operator.privileged? && @operator.id != @customer.id is_privileged = @operator.privileged? && @operator.id != @customer.id
prepaid = { minutes: PrepaidPackService.minutes_available(@customer, @reservable) } prepaid = { minutes: PrepaidPackService.minutes_available(@customer, @reservable) }
prices = applicable_prices
elements = { slots: [] } elements = { slots: [] }
amount = 0 amount = 0
hours_available = credits hours_available = credits
@slots.each_with_index do |slot, index| @slots.each_with_index do |slot, index|
amount += get_slot_price_from_prices(applicable_prices, slot, is_privileged, amount += get_slot_price_from_prices(prices, slot, is_privileged,
elements: elements, elements: elements,
has_credits: (index < hours_available), has_credits: (index < hours_available),
prepaid: prepaid) prepaid: prepaid)
@ -129,6 +130,8 @@ class CartItem::Reservation < CartItem::BaseItem
# and the base price (1 hours), we use the 7 hours price, then 3 hours price, and finally the base price twice (7+3+1+1 = 12). # and the base price (1 hours), we use the 7 hours price, then 3 hours price, and finally the base price twice (7+3+1+1 = 12).
# All these prices are returned to be applied to the reservation. # All these prices are returned to be applied to the reservation.
def applicable_prices def applicable_prices
all_slots_in_same_day = @slots.map { |slot| slot[:start_at].to_date }.uniq.size == 1
total_duration = @slots.map { |slot| (slot[:end_at].to_time - slot[:start_at].to_time) / SECONDS_PER_MINUTE }.reduce(:+) total_duration = @slots.map { |slot| (slot[:end_at].to_time - slot[:start_at].to_time) / SECONDS_PER_MINUTE }.reduce(:+)
rates = { prices: [] } rates = { prices: [] }
@ -137,7 +140,7 @@ class CartItem::Reservation < CartItem::BaseItem
max_duration = @reservable.prices.where(group_id: @customer.group_id, plan_id: @plan.try(:id)) max_duration = @reservable.prices.where(group_id: @customer.group_id, plan_id: @plan.try(:id))
.where(Price.arel_table[:duration].lteq(remaining_duration)) .where(Price.arel_table[:duration].lteq(remaining_duration))
.maximum(:duration) .maximum(:duration)
max_duration = 60 if max_duration.nil? max_duration = 60 if max_duration.nil? || Setting.get('extended_prices_in_same_day') && !all_slots_in_same_day
max_duration_price = @reservable.prices.find_by(group_id: @customer.group_id, plan_id: @plan.try(:id), duration: max_duration) max_duration_price = @reservable.prices.find_by(group_id: @customer.group_id, plan_id: @plan.try(:id), duration: max_duration)
current_duration = [remaining_duration, max_duration].min current_duration = [remaining_duration, max_duration].min

View File

@ -121,7 +121,8 @@ class Setting < ApplicationRecord
public_agenda_module public_agenda_module
renew_pack_threshold renew_pack_threshold
pack_only_for_subscription pack_only_for_subscription
overlapping_categories] } overlapping_categories
extended_prices_in_same_day] }
# WARNING: when adding a new key, you may also want to add it in: # WARNING: when adding a new key, you may also want to add it in:
# - config/locales/en.yml#settings # - config/locales/en.yml#settings
# - app/frontend/src/javascript/models/setting.ts#SettingName # - app/frontend/src/javascript/models/setting.ts#SettingName

View File

@ -1235,6 +1235,9 @@ en:
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription." pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack" pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs" pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
extended_prices: "Extended prices"
extended_prices_info_html: "Spaces can have different prices depending on the cumulated duration of the booking. You can choose if this apply to all bookings or only to those starting within the same day."
extended_prices_in_same_day: "Extended prices in the same day"
overlapping_options: overlapping_options:
training_reservations: "Trainings" training_reservations: "Trainings"
machine_reservations: "Machines" machine_reservations: "Machines"

View File

@ -535,3 +535,4 @@ en:
renew_pack_threshold: "Threshold for packs renewal" renew_pack_threshold: "Threshold for packs renewal"
pack_only_for_subscription: "Restrict packs for subscribers" pack_only_for_subscription: "Restrict packs for subscribers"
overlapping_categories: "Categories for overlapping booking prevention" overlapping_categories: "Categories for overlapping booking prevention"
extended_prices_in_same_day: "Extended prices in the same day"

View File

@ -905,6 +905,8 @@ unless Setting.find_by(name: 'overlapping_categories').try(:value)
Setting.set('overlapping_categories', 'training_reservations,machine_reservations,space_reservations,events_reservations') Setting.set('overlapping_categories', 'training_reservations,machine_reservations,space_reservations,events_reservations')
end end
Setting.set('extended_prices_in_same_day', true) unless Setting.find_by(name: 'extended_prices_in_same_day').try(:value)
if StatisticCustomAggregation.count.zero? if StatisticCustomAggregation.count.zero?
# available reservations hours for machines # available reservations hours for machines
machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2) machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2)