diff --git a/application/controllers/Settings.php b/application/controllers/Settings.php new file mode 100644 index 00000000..0976ea64 --- /dev/null +++ b/application/controllers/Settings.php @@ -0,0 +1,186 @@ + + * @copyright Copyright (c) 2013 - 2020, Alex Tselegidis + * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 + * @link https://easyappointments.org + * @since v1.5.0 + * ---------------------------------------------------------------------------- */ + +/** + * Settings controller. + * + * Handles settings related operations. + * + * @package Controllers + */ +class Settings extends EA_Controller { + /** + * @var array + */ + protected $permissions; + + /** + * Calendar constructor. + */ + public function __construct() + { + parent::__construct(); + + $this->load->model('appointments_model'); + $this->load->model('customers_model'); + $this->load->model('services_model'); + $this->load->model('providers_model'); + + $this->load->library('google_sync'); + $this->load->library('notifications'); + $this->load->library('synchronization'); + $this->load->library('timezones'); + + $role_slug = session('role_slug'); + + if ($role_slug) + { + $this->permissions = $this->roles_model->get_permissions_by_slug($role_slug); + } + } + + /** + * Save a setting or multiple settings in the database. + */ + public function ajax_save_settings() + { + try + { + $type = request('type'); + + if ($type == SETTINGS_SYSTEM) + { + if ($this->permissions[PRIV_SYSTEM_SETTINGS]['edit'] == FALSE) + { + throw new Exception('You do not have the required permissions for this task.'); + } + + $settings = json_decode(request('settings', FALSE), TRUE); + + // Check if phone number settings are valid. + + $phone_number_required = FALSE; + + $phone_number_shown = FALSE; + + foreach ($settings as $setting) + { + if ($setting['name'] === 'require_phone_number') + { + $phone_number_required = $setting['value']; + } + + if ($setting['name'] === 'show_phone_number') + { + $phone_number_shown = $setting['value']; + } + } + + if ($phone_number_required && ! $phone_number_shown) + { + throw new RuntimeException('You cannot hide the phone number in the booking form while it\'s also required!'); + } + + foreach ($settings as $setting) + { + $existing_setting = $this->settings_model->query()->where('name', $setting['name'])->get()->row_array(); + + if ( ! empty($existing_setting)) + { + $setting['id'] = $existing_setting['id']; + } + + $this->settings_model->save($setting); + } + } + else if ($type == SETTINGS_USER) + { + if ($this->permissions[PRIV_USER_SETTINGS]['edit'] == FALSE) + { + throw new Exception('You do not have the required permissions for this task.'); + } + + $settings = json_decode(request('settings'), TRUE); + + $this->users_model->save($settings); + + session([ + 'user_email' => $settings['email'], + 'username' => $settings['settings']['username'], + 'timezone' => $settings['timezone'], + ]); + } + + response(); + } + catch (Throwable $e) + { + json_exception($e); + } + } + + /** + * This method checks whether the username already exists in the database. + */ + public function ajax_validate_username() + { + try + { + // We will only use the function in the admins_model because it is sufficient for the rest user types for + // now (providers, secretaries). + + $username = request('username'); + + $user_id = request('user_id'); + + $is_valid = $this->admins_model->validate_username($username, $user_id); + + json_response([ + 'is_valid' => $is_valid, + ]); + } + catch (Throwable $e) + { + json_exception($e); + } + } + + /** + * Apply global working plan to all providers. + */ + public function ajax_apply_global_working_plan() + { + try + { + if ($this->permissions[PRIV_SYSTEM_SETTINGS]['edit'] == FALSE) + { + throw new Exception('You do not have the required permissions for this task.'); + } + + $working_plan = request('working_plan'); + + $providers = $this->providers_model->get(); + + foreach ($providers as $provider) + { + $this->providers_model->set_setting($provider['id'], 'working_plan', $working_plan); + } + + response(); + } + catch (Throwable $e) + { + json_exception($e); + } + } +}