1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-11-29 10:24:20 +01:00
fab-manager/app/models/setting.rb
Sylvain 7868f31a58 (feat) advanced accounting parameters
for: machines, spaces, trainings, events
2022-12-21 14:05:15 +01:00

236 lines
9.9 KiB
Ruby

# frozen_string_literal: true
# Setting is a configuration element of the platform. Only administrators are allowed to modify Settings
# For some settings, changing them will involve some callback actions (like rebuilding the stylesheets
# if the theme color Setting has changed).
# A full history of the previous values is kept in database with the date and the author of the change
# after_update callback is handled by SettingService
class Setting < ApplicationRecord
has_many :history_values, dependent: :destroy
# The following list contains all the settings that can be customized from the Fab-manager's UI.
# A few of them that are system settings, that should not be updated manually (uuid, origin...).
validates :name, inclusion:
{ in: %w[about_title
about_body
about_contacts
privacy_draft
privacy_body
privacy_dpo
twitter_name
home_blogpost
machine_explications_alert
training_explications_alert
training_information_message
subscription_explications_alert
invoice_logo
invoice_reference
invoice_code-active
invoice_code-value
invoice_order-nb
invoice_VAT-active
invoice_VAT-rate
invoice_VAT-rate_Machine
invoice_VAT-rate_Training
invoice_VAT-rate_Space
invoice_VAT-rate_Event
invoice_VAT-rate_Subscription
invoice_VAT-rate_Product
invoice_text
invoice_legals
booking_window_start
booking_window_end
booking_move_enable
booking_move_delay
booking_cancel_enable
booking_cancel_delay
main_color
secondary_color
fablab_name
name_genre
reminder_enable
reminder_delay
event_explications_alert
space_explications_alert
visibility_yearly
visibility_others
reservation_deadline
display_name_enable
machines_sort_by
accounting_journal_code
accounting_card_client_code
accounting_card_client_label
accounting_wallet_client_code
accounting_wallet_client_label
accounting_other_client_code
accounting_other_client_label
accounting_wallet_code
accounting_wallet_label
accounting_VAT_code
accounting_VAT_label
accounting_subscription_code
accounting_subscription_label
accounting_Machine_code
accounting_Machine_label
accounting_Training_code
accounting_Training_label
accounting_Event_code
accounting_Event_label
accounting_Space_code
accounting_Space_label
accounting_Product_code
accounting_Product_label
hub_last_version
hub_public_key
fab_analytics
link_name
home_content
home_css
origin
uuid
phone_required
tracking_id
book_overlapping_slots
slot_duration
events_in_calendar
spaces_module
plans_module
invoicing_module
facebook_app_id
twitter_analytics
recaptcha_site_key
recaptcha_secret_key
feature_tour_display
email_from
disqus_shortname
allowed_cad_extensions
allowed_cad_mime_types
openlab_app_id
openlab_app_secret
openlab_default
online_payment_module
stripe_public_key
stripe_secret_key
stripe_currency
invoice_prefix
confirmation_required
wallet_module
statistics_module
upcoming_events_shown
payment_schedule_prefix
trainings_module
address_required
accounting_Error_code
accounting_Error_label
payment_gateway
payzen_username
payzen_password
payzen_endpoint
payzen_public_key
payzen_hmac
payzen_currency
public_agenda_module
renew_pack_threshold
pack_only_for_subscription
overlapping_categories
extended_prices_in_same_day
public_registrations
accounting_Pack_code
accounting_Pack_label
facebook
twitter
viadeo
linkedin
instagram
youtube
vimeo
dailymotion
github
echosciences
pinterest
lastfm
flickr
machines_module
user_change_group
user_validation_required
user_validation_required_list
show_username_in_admin_list
store_module
store_withdrawal_instructions
store_hidden
advanced_accounting] }
# WARNING: when adding a new key, you may also want to add it in:
# - config/locales/en.yml#settings
# - app/frontend/src/javascript/models/setting.ts#SettingName
# - db/seeds.rb (to set the default value)
# - app/policies/setting_policy.rb#public_whitelist (if the setting can be read by anyone)
def value
last_value = history_values.order(HistoryValue.arel_table['created_at'].desc).limit(1).first
last_value&.value
end
def value_at(date)
val = history_values.order(HistoryValue.arel_table['created_at'].desc).where('created_at <= ?', date).limit(1).first
val&.value
end
def first_update
first_value = history_values.order(HistoryValue.arel_table['created_at'].asc).limit(1).first
first_value&.created_at
end
def first_value
first_value = history_values.order(HistoryValue.arel_table['created_at'].asc).limit(1).first
first_value&.value
end
def last_update
last_value = history_values.order(HistoryValue.arel_table['created_at'].desc).limit(1).first
last_value&.created_at
end
def previous_update
previous_value = history_values.order(HistoryValue.arel_table['created_at'].desc).limit(2).last
previous_value&.created_at
end
# @deprecated, prefer Setting.set() instead
def value=(val)
admin = User.admins.first
save && history_values.create(invoicing_profile: admin.invoicing_profile, value: val)
end
##
# Return the value of the requested setting, if any.
# Usage: Setting.get('my_setting')
# @return {String|Boolean}
##
def self.get(name)
res = find_by('LOWER(name) = ? ', name.downcase)&.value
# handle boolean values
return true if res == 'true'
return false if res == 'false'
res
end
##
# Create or update the provided setting with the given value
# Usage: Setting.set('my_setting', true)
# Optionally (but recommended when possible), the user updating the value can be provided as the third parameter
# Eg.: Setting.set('my_setting', true, User.find_by(slug: 'admin'))
##
def self.set(name, value, user = User.admins.first)
setting = find_or_initialize_by(name: name)
setting.save && setting.history_values.create(invoicing_profile: user.invoicing_profile, value: value.to_s)
end
##
# Check if the given setting was set
##
def self.set?(name)
!find_by(name: name)&.value.nil?
end
end