PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.1.2
LatePoint – Calendar Booking Plugin for Appointments and Events v5.1.2
5.6.7 5.6.6 5.6.5 5.6.4 5.6.3 5.6.2 5.6.1 5.6.0 5.5.2 5.5.1 5.5.0 5.4.2 trunk 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.1.91 5.1.92 5.1.93 5.1.94 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1
latepoint / lib / helpers / settings_helper.php
latepoint / lib / helpers Last commit date
activities_helper.php 1 year ago agent_helper.php 1 year ago auth_helper.php 1 year ago blocks_helper.php 1 year ago booking_helper.php 1 year ago bricks_helper.php 1 year ago bundles_helper.php 1 year ago calendar_helper.php 1 year ago carts_helper.php 1 year ago connector_helper.php 1 year ago csv_helper.php 1 year ago customer_helper.php 1 year ago database_helper.php 1 year ago debug_helper.php 1 year ago defaults_helper.php 1 year ago elementor_helper.php 1 year ago email_helper.php 1 year ago encrypt_helper.php 1 year ago events_helper.php 1 year ago form_helper.php 1 year ago icalendar_helper.php 1 year ago image_helper.php 1 year ago invoices_helper.php 1 year ago license_helper.php 1 year ago location_helper.php 1 year ago marketing_systems_helper.php 1 year ago meeting_systems_helper.php 1 year ago menu_helper.php 1 year ago meta_helper.php 1 year ago migrations_helper.php 1 year ago money_helper.php 1 year ago notifications_helper.php 1 year ago order_intent_helper.php 1 year ago orders_helper.php 1 year ago pages_helper.php 1 year ago params_helper.php 1 year ago payments_helper.php 1 year ago price_breakdown_helper.php 1 year ago process_jobs_helper.php 1 year ago processes_helper.php 1 year ago replacer_helper.php 1 year ago resource_helper.php 1 year ago roles_helper.php 1 year ago router_helper.php 1 year ago service_helper.php 1 year ago sessions_helper.php 1 year ago settings_helper.php 1 year ago shortcodes_helper.php 1 year ago sms_helper.php 1 year ago steps_helper.php 1 year ago stripe_connect_helper.php 1 year ago styles_helper.php 1 year ago support_topics_helper.php 1 year ago time_helper.php 1 year ago timeline_helper.php 1 year ago transaction_intent_helper.php 1 year ago util_helper.php 1 year ago version_specific_updates_helper.php 1 year ago work_periods_helper.php 1 year ago wp_datetime.php 1 year ago wp_user_helper.php 1 year ago
settings_helper.php
500 lines
1 <?php
2
3 class OsSettingsHelper {
4
5 public static $loaded_values;
6
7
8 private static $encrypted_settings = [
9 'license',
10 'google_calendar_client_secret',
11 'facebook_app_secret',
12 'google_client_secret',
13 'braintree_secret_key',
14 'braintree_merchant_id',
15 'paypal_client_secret'];
16
17 private static $settings_to_autoload = [
18 'enable_google_login',
19 'time_system',
20 'date_format',
21 'currency_symbol_before',
22 'currency_symbol_after',
23 'phone_format',
24 'steps_show_timezone_selector',
25 'show_booking_end_time',
26 'stripe_publishable_key',
27 'enable_facebook_login',
28 'earliest_possible_booking',
29 'enable_payments_local',
30 'color_scheme_for_booking_form',
31 'latest_possible_booking',
32 'facebook_app_id',
33 'google_client_id',
34 'paypal_client_id',
35 'paypal_currency_iso_code',
36 'paypal_use_braintree_api',
37 'stripe_secret_key',
38 'steps_hide_agent_info',
39 'booking_hash',
40 'payments_environment',
41 'list_of_phone_countries',
42 'included_phone_countries',
43 'wp_users_as_customers',
44 'thousand_separator',
45 'decimal_separator',
46 'number_of_decimals',
47 'default_phone_country'];
48
49 private static $defaults = [
50 'date_format' => LATEPOINT_DEFAULT_DATE_FORMAT,
51 'time_system' => LATEPOINT_DEFAULT_TIME_SYSTEM,
52 'currency_symbol_before' => '$'
53 ];
54
55 public static function get_remote_url($extra = '') {
56 return base64_decode(LATEPOINT_REMOTE_HASH) . $extra;
57 }
58
59 public static function get_business_logo_url() {
60 $default_logo_url = LATEPOINT_IMAGES_URL . 'logo.png';
61 return OsImageHelper::get_image_url_by_id(OsSettingsHelper::get_settings_value('business_logo'), 'thumbnail', $default_logo_url);
62 }
63
64 public static function get_business_logo_image($height = '50px') {
65 $url = self::get_business_logo_url();
66 return '<img src="' . $url . '" style="height: ' . $height . '; width: auto"/>';
67 }
68
69 public static function get_encrypted_settings() {
70 $encrypted_settings = apply_filters('latepoint_encrypted_settings', self::$encrypted_settings);
71 return $encrypted_settings;
72 }
73
74
75 public static function get_active_addons() : array{
76 return json_decode(OsSettingsHelper::get_settings_value('active_addons', '')) ?? [];
77 }
78
79 public static function run_autoload() {
80 /**
81 * Default settings to be used in SettingsHelper when no value exists in DB
82 *
83 * @since 4.7.2
84 * @hook latepoint_settings_defaults
85 *
86 * @param {array} $default_settings Array of key => value pairs of setting names and their default values
87 * @returns {array} The filtered array of default settings
88 */
89 self::$defaults = apply_filters('latepoint_settings_defaults', self::$defaults);
90 foreach (self::$defaults as $name => $default) {
91 self::$loaded_values[$name] = $default;
92 }
93
94 $settings_model = new OsSettingsModel();
95
96 /**
97 * Settings to autoload in SettingsHelper on every page load, this is done to reduce the number of queries to DB
98 *
99 * @since 4.7.2
100 * @hook latepoint_settings_to_autoload
101 *
102 * @param {array} $settings Array of setting names to autoload
103 * @returns {array} The filtered array of setting names
104 */
105 self::$settings_to_autoload = apply_filters('latepoint_settings_to_autoload', self::$settings_to_autoload);
106 $settings_arr = $settings_model->select('name, value')->where(array('name' => self::$settings_to_autoload))->get_results();
107
108
109 if ($settings_arr && is_array($settings_arr)) {
110 foreach ($settings_arr as $setting) {
111 if (in_array($setting->name, self::get_encrypted_settings())) {
112 self::$loaded_values[$setting->name] = OsEncryptHelper::decrypt_value($setting->value);
113 } else {
114 self::$loaded_values[$setting->name] = $setting->value;
115 }
116 }
117 }
118 }
119
120
121 // ENVIRONMENT SETTINGS
122
123 // BASE ENVIRONMENT
124 public static function is_env_live() {
125 return (LATEPOINT_ENV == LATEPOINT_ENV_LIVE);
126 }
127
128 public static function is_env_dev() {
129 return (LATEPOINT_ENV == LATEPOINT_ENV_DEV);
130 }
131
132 public static function is_env_demo() {
133 return (LATEPOINT_ENV == LATEPOINT_ENV_DEMO);
134 }
135
136 // SMS, EMAILS
137
138 public static function is_sms_allowed() {
139 return LATEPOINT_ALLOW_SMS;
140 }
141
142 public static function is_email_allowed() {
143 return LATEPOINT_ALLOW_EMAILS;
144 }
145
146 // PAYMENTS ENVIRONMENT
147 public static function is_env_payments_live() {
148 return (self::get_payments_environment() == LATEPOINT_PAYMENTS_ENV_LIVE);
149 }
150
151 public static function is_env_payments_dev() {
152 return (self::get_payments_environment() == LATEPOINT_PAYMENTS_ENV_DEV);
153 }
154
155 public static function is_env_payments_demo() {
156 return (self::get_payments_environment() == LATEPOINT_PAYMENTS_ENV_DEMO);
157 }
158
159 public static function get_payments_environment() {
160 return self::get_settings_value('payments_environment', LATEPOINT_PAYMENTS_ENV_LIVE);
161 }
162
163
164 public static function append_payment_env_key(string $string, string $force_env = ''): string{
165 if($force_env){
166 if($force_env == LATEPOINT_PAYMENTS_ENV_DEV) $string.=LATEPOINT_PAYMENTS_DEV_SUFFIX;
167 }else{
168 if(self::is_env_payments_dev()) $string.=LATEPOINT_PAYMENTS_DEV_SUFFIX;
169 }
170 return $string;
171 }
172
173 public static function set_menu_layout_style($layout) {
174 OsSessionsHelper::setcookie(LATEPOINT_ADMIN_MENU_LAYOUT_STYLE_COOKIE, $layout);
175 }
176
177 public static function get_menu_layout_style() {
178 if (!isset($_COOKIE[LATEPOINT_ADMIN_MENU_LAYOUT_STYLE_COOKIE])) {
179 self::set_menu_layout_style('full');
180 }
181 return isset($_COOKIE[LATEPOINT_ADMIN_MENU_LAYOUT_STYLE_COOKIE]) ? sanitize_text_field( wp_unslash($_COOKIE[LATEPOINT_ADMIN_MENU_LAYOUT_STYLE_COOKIE])) : 'full';
182 }
183
184 public static function get_time_system() {
185 return self::get_settings_value('time_system', LATEPOINT_DEFAULT_TIME_SYSTEM);
186 }
187
188 public static function get_date_format() {
189 return self::get_settings_value('date_format', LATEPOINT_DEFAULT_DATE_FORMAT);
190 }
191
192 public static function get_date_format_for_js() {
193 $format = strtolower(self::get_date_format());
194 return str_replace(['d', 'm', 'y'], ['dd', 'mm', 'yyyy'], $format);
195 }
196
197 public static function get_readable_datetime_format($no_year = false, $no_seconds = true) {
198 return self::get_readable_date_format($no_year) . ', ' . self::get_readable_time_format($no_seconds);
199 }
200
201 public static function get_order_types_list_for_any_agent_logic(): array{
202 $order_types = [
203 LATEPOINT_ANY_AGENT_ORDER_RANDOM => __('Randomly picked agent', 'latepoint'),
204 LATEPOINT_ANY_AGENT_ORDER_PRICE_HIGH => __('Most expensive agent', 'latepoint'),
205 LATEPOINT_ANY_AGENT_ORDER_PRICE_LOW => __('Least expensive agent', 'latepoint'),
206 LATEPOINT_ANY_AGENT_ORDER_BUSY_HIGH => __('Agent with the most bookings on that day', 'latepoint'),
207 LATEPOINT_ANY_AGENT_ORDER_BUSY_LOW => __('Agent with the least bookings on that day', 'latepoint') ];
208 /**
209 * Get the list of order types for agent selection logic when "ANY" agent is pre-selected in the booking form
210 *
211 * @since 4.7.6
212 * @hook latepoint_get_order_types_list_for_any_agent_logic
213 *
214 * @param {array} $order_types Array of order types
215 *
216 * @returns {array} Filtered array of order types
217 */
218 return apply_filters('latepoint_get_order_types_list_for_any_agent_logic', $order_types);
219 }
220
221 public static function get_readable_time_format($no_seconds = true) {
222 $seconds = $no_seconds ? '' : ':s';
223 $format = (self::get_time_system() == '12') ? "g:i$seconds a" : "G:i$seconds";
224 return $format;
225 }
226
227 public static function get_readable_date_format($no_year = false) {
228 if (OsSettingsHelper::is_on('disable_verbose_date_output')) return self::get_date_format();
229 $format = ($no_year) ? 'F j' : 'M j, Y';
230 switch (self::get_date_format()) {
231 case 'm/d/Y':
232 case 'm.d.Y':
233 $format = ($no_year) ? 'F j' : 'M j, Y';
234 break;
235 case 'd.m.Y':
236 case 'd/m/Y':
237 $format = ($no_year) ? 'j F' : 'j M, Y';
238 break;
239 case 'Y-m-d':
240 $format = ($no_year) ? 'F j' : 'Y, M j';
241 break;
242 }
243 return $format;
244 }
245
246
247 public static function get_booking_template_for_calendar() {
248 return OsSettingsHelper::get_settings_value('booking_template_for_calendar', '{{service_name}}');
249 }
250
251
252 public static function get_selected_columns_for_bookings_table() {
253 return OsSettingsHelper::get_settings_value('bookings_table_columns', []);
254 }
255
256 public static function get_available_columns_for_bookings_table() {
257 $available_columns = [];
258
259 $available_columns['customer'] = ['email' => __('Email', 'latepoint'),
260 'phone' => __('Phone', 'latepoint')];
261
262 $available_columns['booking'] = ['booking_code' => __('Code', 'latepoint'),
263 'duration' => __('Duration', 'latepoint'),
264 'source_id' => __('Source ID', 'latepoint'),
265 'payment_method' => __('Payment Method', 'latepoint'),
266 'payment_portion' => __('Payment Portion', 'latepoint'),
267 'formatted_price' => __('Price', 'latepoint')];
268
269 $available_columns = apply_filters('latepoint_bookings_table_columns', $available_columns);
270 return $available_columns;
271 }
272
273 public static function force_bite($request) {
274 }
275
276 public static function read_encoded($str) {
277 return base64_decode($str);
278 }
279
280 public static function get_db_version() {
281 return get_option('latepoint_db_version');
282 }
283
284 public static function force_release($request) {
285 }
286
287 public static function is_enabled_show_dial_code_with_flag(){
288 return (self::get_settings_value('show_dial_code_with_flag', LATEPOINT_VALUE_ON) == LATEPOINT_VALUE_ON);
289 }
290
291 public static function is_using_google_login() {
292 return self::is_on('enable_google_login');
293 }
294
295 public static function is_using_facebook_login() {
296 return self::is_on('enable_facebook_login');
297 }
298
299 public static function is_using_social_login() {
300 return (self::is_using_google_login() || self::is_using_facebook_login());
301 }
302
303 public static function get_steps_support_text() {
304 $default = '<h5>Questions?</h5><p>Call (858) 939-3746 for help</p>';
305 return self::get_settings_value('steps_support_text', $default);
306 }
307
308 public static function get_default_fields_for_customer() {
309 $default_fields = ['first_name' => ['locked' => false, 'label' => __('First Name', 'latepoint'), 'required' => true, 'width' => 'os-col-6', 'active' => true],
310 'last_name' => ['locked' => false, 'label' => __('Last Name', 'latepoint'), 'required' => true, 'width' => 'os-col-6', 'active' => true],
311 'email' => ['locked' => true, 'label' => __('Email Address', 'latepoint'), 'required' => true, 'width' => 'os-col-6', 'active' => true],
312 'phone' => ['locked' => false, 'label' => __('Phone Number', 'latepoint'), 'required' => false, 'width' => 'os-col-6', 'active' => true],
313 'notes' => ['locked' => false, 'label' => __('Comments', 'latepoint'), 'required' => false, 'width' => 'os-col-12', 'active' => true]];
314
315 $fields_from_db = OsSettingsHelper::get_settings_value('default_fields_for_customer', '');
316 $fields_from_db_arr = json_decode($fields_from_db, true);
317 if ($fields_from_db_arr) {
318 foreach ($fields_from_db_arr as $name => $field_from_db) {
319 if (isset($default_fields[$name])) $default_fields[$name] = $field_from_db;
320 }
321 }
322 $default_fields = apply_filters('latepoint_default_fields_for_customer', $default_fields);
323 return $default_fields;
324 }
325
326 public static function remove_setting_by_name($name) {
327 $settings_model = new OsSettingsModel();
328 $settings_model = $settings_model->delete_where(array('name' => $name));
329 self::reset_loaded_value($name);
330 }
331
332 public static function save_setting_by_name($name, $value) {
333 $settings_model = new OsSettingsModel();
334 $settings_model = $settings_model->where(array('name' => $name))->set_limit(1)->get_results_as_models();
335 if ($settings_model) {
336 $settings_model->value = self::prepare_value($name, $value);
337 } else {
338 $settings_model = new OsSettingsModel();
339 $settings_model->name = $name;
340 $settings_model->value = self::prepare_value($name, $value);
341 }
342 self::reset_loaded_value($name);
343 return $settings_model->save();
344 }
345
346 public static function reset_loaded_value($name){
347 unset(self::$loaded_values[$name]);
348 }
349
350 public static function prepare_value($name, $value) {
351 if (in_array($name, self::get_encrypted_settings())) {
352 $value = OsEncryptHelper::encrypt_value($value);
353 }
354 if (is_array($value)) {
355 $value = maybe_serialize($value);
356 }
357 return $value;
358 }
359
360 public static function get_settings_value($name, $default = false) {
361 if (isset(self::$loaded_values[$name])) return self::$loaded_values[$name];
362 $settings_model = new OsSettingsModel();
363 $settings_model = $settings_model->where(array('name' => $name))->set_limit(1)->get_results_as_models();
364 if ($settings_model) {
365 if (in_array($name, self::get_encrypted_settings())) {
366 $value = OsEncryptHelper::decrypt_value($settings_model->value);
367 } else {
368 $value = maybe_unserialize($settings_model->value);
369 }
370 } else {
371 $value = $default;
372 }
373 self::$loaded_values[$name] = $value;
374 return self::$loaded_values[$name];
375 }
376
377
378 public static function get_any_agent_order() {
379 return self::get_settings_value('any_agent_order', LATEPOINT_ANY_AGENT_ORDER_RANDOM);
380 }
381
382 public static function get_day_calendar_min_height() {
383 $height = preg_replace('/\D/', '', self::get_settings_value('day_calendar_min_height', 700));
384 if (!$height) $height = 700;
385 return $height;
386 }
387
388 public static function get_default_timeblock_interval() {
389 $timeblock_interval = self::get_settings_value('timeblock_interval', LATEPOINT_DEFAULT_TIMEBLOCK_INTERVAL);
390 if (empty($timeblock_interval)) $timeblock_interval = LATEPOINT_DEFAULT_TIMEBLOCK_INTERVAL;
391 return intval($timeblock_interval);
392 }
393
394 public static function get_customer_dashboard_url($include_site_url = true) {
395 $path = self::get_settings_value('page_url_customer_dashboard', '/customer-dashboard');
396 return ($include_site_url) ? site_url($path) : $path;
397 }
398
399 public static function get_customer_login_url($include_site_url = true) {
400 $path = self::get_settings_value('page_url_customer_login', '/customer-login');
401 return ($include_site_url) ? site_url($path) : $path;
402 }
403
404
405 // BOOKING STEPS
406
407 public static function steps_show_service_categories() {
408 return (self::get_settings_value('steps_show_service_categories', 'on') == 'on');
409 }
410
411 public static function steps_show_location_categories() {
412 return (self::get_settings_value('steps_show_location_categories', 'on') == 'on');
413 }
414
415 public static function steps_show_agent_bio() {
416 return (self::get_settings_value('steps_show_agent_bio') == 'on');
417 }
418
419 public static function get_booking_form_color_scheme() {
420 return self::get_settings_value('color_scheme_for_booking_form', 'blue');
421 }
422
423 public static function get_booking_form_border_radius() {
424 return self::get_settings_value('border_radius', 'flat');
425 }
426
427 public static function get_default_phone_country() {
428 return OsSettingsHelper::get_settings_value('default_phone_country', 'us');
429 }
430
431 public static function get_included_phone_countries(): array {
432 if (OsSettingsHelper::get_settings_value('list_of_phone_countries', LATEPOINT_ALL) == LATEPOINT_ALL) {
433 return [];
434 } else {
435 return array_map('trim', explode(',', OsSettingsHelper::get_settings_value('included_phone_countries', '')));
436 }
437 }
438
439
440 public static function is_on(string $setting, $default = false): bool {
441 return (self::get_settings_value($setting, $default) == LATEPOINT_VALUE_ON);
442 }
443
444 public static function is_off(string $setting, $default = false): bool {
445 return (self::get_settings_value($setting, $default) != LATEPOINT_VALUE_ON);
446 }
447
448 public static function generate_default_form_fields(array $default_fields) {
449 ?>
450 <div class="os-default-fields" data-route="<?php echo esc_attr(OsRouterHelper::build_route_name('form_fields', 'update_default_fields')); ?>">
451 <form>
452 <?php foreach ($default_fields as $name => $default_field) {
453 $atts = [];
454 if ($default_field['locked']) $atts['disabled'] = 'disabled';
455 ?>
456 <div class="os-default-field <?php echo $default_field['active'] ? '' : 'is-disabled'; ?>">
457 <?php
458 if ($default_field['locked']) {
459 echo '<div class="locked-field"><i class="latepoint-icon latepoint-icon-lock"></i><span>' . esc_html__('Email Address field can not be disabled.', 'latepoint') . '</span></div>';
460 } else {
461 $active = $default_field['active'] ? 'on' : 'off';
462 $field_name = 'default_fields[' . $name . '][active]';
463 echo '<div class="os-toggler ' . esc_attr($active) . '" data-for="' . esc_attr(OsFormHelper::name_to_id($field_name)) . '"><div class="toggler-rail"><div class="toggler-pill"></div></div></div>';
464 echo OsFormHelper::hidden_field($field_name, $default_field['active']);
465 } ?>
466 <div class="os-field-name"><?php echo esc_html($default_field['label']); ?></div>
467 <div class="os-field-setting">
468 <?php echo OsFormHelper::checkbox_field('default_fields[' . $name . '][required]', __('Required?', 'latepoint'), 'on', $default_field['required'], $atts); ?>
469 </div>
470 <div class="os-field-setting">
471 <?php echo OsFormHelper::select_field('default_fields[' . $name . '][width]', false, array('os-col-12' => __('Full Width', 'latepoint'), 'os-col-6' => __('Half Width', 'latepoint')), $default_field['width']); ?>
472 </div>
473 </div>
474 <?php } ?>
475 </form>
476 </div>
477 <?php
478 }
479
480
481 /**
482 * Get value set for start of week in WordPress, can be from 1-7 (representing Monday-Sunday)
483 * @return mixed
484 */
485 public static function get_start_of_week() :int {
486 $wp_value = intval(get_option('start_of_week', 0));
487 return $wp_value ? $wp_value : 7; // in WordPress they start count on sunday and it's 0, we are using PHP Date library that starts week on Monday and it's 1-7
488 }
489
490 public static function get_number_of_records_per_page(): int {
491 return intval(OsSettingsHelper::get_settings_value('number_of_records_per_page', 20));
492 }
493
494 public static function can_download_records_as_csv(): bool {
495 return OsAuthHelper::is_admin_logged_in() || self::is_on('allow_non_admins_download_csv');
496 }
497
498 }
499
500 ?>