From 056e9c11653f91ae2a0e27f6c03aaaec1e8dbd43 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Sun, 18 Oct 2015 20:00:01 +0200 Subject: [PATCH] Moved the register-appointment function to a new ajax callback and added extra installation checks to the installation.php controller. --- src/application/controllers/appointments.php | 355 +++++++++---------- src/application/controllers/installation.php | 25 +- 2 files changed, 199 insertions(+), 181 deletions(-) diff --git a/src/application/controllers/appointments.php b/src/application/controllers/appointments.php index be1ffd01..6b010466 100755 --- a/src/application/controllers/appointments.php +++ b/src/application/controllers/appointments.php @@ -17,16 +17,28 @@ * @package Controllers */ class Appointments extends CI_Controller { + + /** + * Class Constructor + */ public function __construct() { parent::__construct(); + $this->load->library('session'); - // Set user's selected language. + $this->load->helper('installation'); + + // Set user's selected language. if ($this->session->userdata('language')) { $this->config->set_item('language', $this->session->userdata('language')); $this->lang->load('translations', $this->session->userdata('language')); } else { $this->lang->load('translations', $this->config->item('language')); // default } + + // Create a new captcha builder instance and store it to the session vars. + if ($this->session->userdata('captcha_builder') === FALSE) { + $this->session->userdata('captcha_builder', new Gregwar\Captcha\CaptchaBuilder()); + } } /** @@ -40,7 +52,7 @@ class Appointments extends CI_Controller { * record. */ public function index($appointment_hash = '') { - if (!$this->check_installation()) { + if (!is_ea_installed()) { redirect('installation/index'); return; } @@ -51,179 +63,64 @@ class Appointments extends CI_Controller { $this->load->model('customers_model'); $this->load->model('settings_model'); - if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') { - try { - $available_services = $this->services_model->get_available_services(); - $available_providers = $this->providers_model->get_available_providers(); - $company_name = $this->settings_model->get_setting('company_name'); + try { + $available_services = $this->services_model->get_available_services(); + $available_providers = $this->providers_model->get_available_providers(); + $company_name = $this->settings_model->get_setting('company_name'); - // If an appointment hash is provided then it means that the customer - // is trying to edit a registered appointment record. - if ($appointment_hash !== ''){ - // Load the appointments data and enable the manage mode of the page. - $manage_mode = TRUE; + // If an appointment hash is provided then it means that the customer + // is trying to edit a registered appointment record. + if ($appointment_hash !== ''){ + // Load the appointments data and enable the manage mode of the page. + $manage_mode = TRUE; - $results = $this->appointments_model->get_batch(array('hash' => $appointment_hash)); + $results = $this->appointments_model->get_batch(array('hash' => $appointment_hash)); - if (count($results) === 0) { - // The requested appointment doesn't exist in the database. Display - // a message to the customer. - $view = array( - 'message_title' => $this->lang->line('appointment_not_found'), - 'message_text' => $this->lang->line('appointment_does_not_exist_in_db'), - 'message_icon' => $this->config->item('base_url') - . '/assets/img/error.png' - ); - $this->load->view('appointments/message', $view); - return; - } - - $appointment = $results[0]; - $provider = $this->providers_model->get_row($appointment['id_users_provider']); - $customer = $this->customers_model->get_row($appointment['id_users_customer']); - - } else { - // The customer is going to book a new appointment so there is no - // need for the manage functionality to be initialized. - $manage_mode = FALSE; - $appointment = array(); - $provider = array(); - $customer = array(); + if (count($results) === 0) { + // The requested appointment doesn't exist in the database. Display + // a message to the customer. + $view = array( + 'message_title' => $this->lang->line('appointment_not_found'), + 'message_text' => $this->lang->line('appointment_does_not_exist_in_db'), + 'message_icon' => $this->config->item('base_url') + . '/assets/img/error.png' + ); + $this->load->view('appointments/message', $view); + return; } - $google_analytics_code = $this->settings_model->get_setting('google_analytics_code'); - - // Load the book appointment view. - $view = array ( - 'available_services' => $available_services, - 'available_providers' => $available_providers, - 'company_name' => $company_name, - 'manage_mode' => $manage_mode, - 'appointment_data' => $appointment, - 'provider_data' => $provider, - 'customer_data' => $customer, - 'google_analytics_code' => $google_analytics_code - ); - - } catch(Exception $exc) { - $view['exceptions'][] = $exc; - } - - $this->load->view('appointments/book', $view); - - } else { - // The page is a post-back. Register the appointment and send notification emails - // to the provider and the customer that are related to the appointment. If google - // sync is enabled then add the appointment to the provider's account. - - try { - $view = array(); - $post_data = json_decode($_POST['post_data'], true); - $appointment = $post_data['appointment']; - $customer = $post_data['customer']; - - if ($this->customers_model->exists($customer)) - $customer['id'] = $this->customers_model->find_record_id($customer); - - $customer_id = $this->customers_model->add($customer); - $appointment['id_users_customer'] = $customer_id; - - $appointment['id'] = $this->appointments_model->add($appointment); - $appointment['hash'] = $this->appointments_model->get_value('hash', $appointment['id']); - + $appointment = $results[0]; $provider = $this->providers_model->get_row($appointment['id_users_provider']); - $service = $this->services_model->get_row($appointment['id_services']); + $customer = $this->customers_model->get_row($appointment['id_users_customer']); - $company_settings = array( - 'company_name' => $this->settings_model->get_setting('company_name'), - 'company_link' => $this->settings_model->get_setting('company_link'), - 'company_email' => $this->settings_model->get_setting('company_email') - ); - - // :: SYNCHRONIZE APPOINTMENT WITH PROVIDER'S GOOGLE CALENDAR - // The provider must have previously granted access to his google calendar account - // in order to sync the appointment. - try { - $google_sync = $this->providers_model->get_setting('google_sync', - $appointment['id_users_provider']); - - if ($google_sync == TRUE) { - $google_token = json_decode($this->providers_model - ->get_setting('google_token', $appointment['id_users_provider'])); - - $this->load->library('google_sync'); - $this->google_sync->refresh_token($google_token->refresh_token); - - if ($post_data['manage_mode'] === FALSE) { - // Add appointment to Google Calendar. - $google_event = $this->google_sync->add_appointment($appointment, $provider, - $service, $customer, $company_settings); - $appointment['id_google_calendar'] = $google_event->id; - $this->appointments_model->add($appointment); - } else { - // Update appointment to Google Calendar. - $appointment['id_google_calendar'] = $this->appointments_model - ->get_value('id_google_calendar', $appointment['id']); - - $this->google_sync->update_appointment($appointment, $provider, - $service, $customer, $company_settings); - } - } - } catch(Exception $exc) { - $view['exceptions'][] = $exc; - } - - // :: SEND NOTIFICATION EMAILS TO BOTH CUSTOMER AND PROVIDER - try { - $this->load->library('Notifications'); - - $send_provider = $this->providers_model - ->get_setting('notifications', $provider['id']); - - if (!$post_data['manage_mode']) { - $customer_title = $this->lang->line('appointment_booked'); - $customer_message = $this->lang->line('thank_you_for_appointment'); - $customer_link = $this->config->item('base_url') . '/index.php/appointments/index/' - . $appointment['hash']; - - $provider_title = $this->lang->line('appointment_added_to_your_plan'); - $provider_message = $this->lang->line('appointment_link_description'); - $provider_link = $this->config->item('base_url') . '/index.php/backend/index/' - . $appointment['hash']; - } else { - $customer_title = $this->lang->line('appointment_changes_saved'); - $customer_message = ''; - $customer_link = $this->config->item('base_url') . '/index.php/appointments/index/' - . $appointment['hash']; - - $provider_title = $this->lang->line('appointment_details_changed'); - $provider_message = ''; - $provider_link = $this->config->item('base_url') . '/index.php/backend/index/' - . $appointment['hash']; - } - - $this->notifications->send_appointment_details($appointment, $provider, - $service, $customer,$company_settings, $customer_title, - $customer_message, $customer_link, $customer['email']); - - if ($send_provider == TRUE) { - $this->notifications->send_appointment_details($appointment, $provider, - $service, $customer, $company_settings, $provider_title, - $provider_message, $provider_link, $provider['email']); - } - } catch(Exception $exc) { - $view['exceptions'][] = $exc; - } - } catch(Exception $exc) { - $view['exceptions'][] = $exc; + } else { + // The customer is going to book a new appointment so there is no + // need for the manage functionality to be initialized. + $manage_mode = FALSE; + $appointment = array(); + $provider = array(); + $customer = array(); } - // Save any exceptions to the session and redirect to another page so that the user - // will not add a new appointment on page reload. - $view['exceptions'] = (!empty($view['exceptions'])) ? $view['exceptions'] : array(); - $this->session->set_flashdata('book_exceptions', $view['exceptions']); - redirect('appointments/book_success/'.$appointment['id']); + $google_analytics_code = $this->settings_model->get_setting('google_analytics_code'); + + // Load the book appointment view. + $view = array ( + 'available_services' => $available_services, + 'available_providers' => $available_providers, + 'company_name' => $company_name, + 'manage_mode' => $manage_mode, + 'appointment_data' => $appointment, + 'provider_data' => $provider, + 'customer_data' => $customer, + 'google_analytics_code' => $google_analytics_code + ); + + } catch(Exception $exc) { + $view['exceptions'][] = $exc; } + + $this->load->view('appointments/book', $view); } /** @@ -607,20 +504,6 @@ class Appointments extends CI_Controller { return array_values($available_periods_with_appointments); } - /** - * This method checks whether the application is installed. - * - * This method resides in this controller because the "index()" function will - * be the first to be launched after the files are on the server. NOTE that the - * "config.php" file must be already set because we won't be able to connect to - * the database otherwise. - * - * @return bool Returns false if an installation is required. - */ - public function check_installation() { - return $this->db->table_exists('ea_users'); - } - /** * GET an specific appointment book and redirect to the success screen. * @@ -654,6 +537,120 @@ class Appointments extends CI_Controller { } $this->load->view('appointments/book_success', $view); } + + /** + * [AJAX] Register the appointment to the database. + */ + public function ajax_register_appointment() { + try { + $view = array(); + $post_data = json_decode($_POST['post_data'], true); + $appointment = $post_data['appointment']; + $customer = $post_data['customer']; + + if ($this->customers_model->exists($customer)) + $customer['id'] = $this->customers_model->find_record_id($customer); + + $customer_id = $this->customers_model->add($customer); + $appointment['id_users_customer'] = $customer_id; + + $appointment['id'] = $this->appointments_model->add($appointment); + $appointment['hash'] = $this->appointments_model->get_value('hash', $appointment['id']); + + $provider = $this->providers_model->get_row($appointment['id_users_provider']); + $service = $this->services_model->get_row($appointment['id_services']); + + $company_settings = array( + 'company_name' => $this->settings_model->get_setting('company_name'), + 'company_link' => $this->settings_model->get_setting('company_link'), + 'company_email' => $this->settings_model->get_setting('company_email') + ); + + // :: SYNCHRONIZE APPOINTMENT WITH PROVIDER'S GOOGLE CALENDAR + // The provider must have previously granted access to his google calendar account + // in order to sync the appointment. + try { + $google_sync = $this->providers_model->get_setting('google_sync', + $appointment['id_users_provider']); + + if ($google_sync == TRUE) { + $google_token = json_decode($this->providers_model + ->get_setting('google_token', $appointment['id_users_provider'])); + + $this->load->library('google_sync'); + $this->google_sync->refresh_token($google_token->refresh_token); + + if ($post_data['manage_mode'] === FALSE) { + // Add appointment to Google Calendar. + $google_event = $this->google_sync->add_appointment($appointment, $provider, + $service, $customer, $company_settings); + $appointment['id_google_calendar'] = $google_event->id; + $this->appointments_model->add($appointment); + } else { + // Update appointment to Google Calendar. + $appointment['id_google_calendar'] = $this->appointments_model + ->get_value('id_google_calendar', $appointment['id']); + + $this->google_sync->update_appointment($appointment, $provider, + $service, $customer, $company_settings); + } + } + } catch(Exception $exc) { + log_message('error', $exc->getMessage()); + log_message('error', $exc->getTraceAsString()); + } + + // :: SEND NOTIFICATION EMAILS TO BOTH CUSTOMER AND PROVIDER + try { + $this->load->library('Notifications'); + + $send_provider = $this->providers_model + ->get_setting('notifications', $provider['id']); + + if (!$post_data['manage_mode']) { + $customer_title = $this->lang->line('appointment_booked'); + $customer_message = $this->lang->line('thank_you_for_appointment'); + $customer_link = $this->config->item('base_url') . '/index.php/appointments/index/' + . $appointment['hash']; + + $provider_title = $this->lang->line('appointment_added_to_your_plan'); + $provider_message = $this->lang->line('appointment_link_description'); + $provider_link = $this->config->item('base_url') . '/index.php/backend/index/' + . $appointment['hash']; + } else { + $customer_title = $this->lang->line('appointment_changes_saved'); + $customer_message = ''; + $customer_link = $this->config->item('base_url') . '/index.php/appointments/index/' + . $appointment['hash']; + + $provider_title = $this->lang->line('appointment_details_changed'); + $provider_message = ''; + $provider_link = $this->config->item('base_url') . '/index.php/backend/index/' + . $appointment['hash']; + } + + $this->notifications->send_appointment_details($appointment, $provider, + $service, $customer,$company_settings, $customer_title, + $customer_message, $customer_link, $customer['email']); + + if ($send_provider == TRUE) { + $this->notifications->send_appointment_details($appointment, $provider, + $service, $customer, $company_settings, $provider_title, + $provider_message, $provider_link, $provider['email']); + } + } catch(Exception $exc) { + log_message('error', $exc->getMessage()); + log_message('error', $exc->getTraceAsString()); + } + + echo AJAX_SUCCESS; + + } catch(Exception $exc) { + echo json_encode(array( + 'exceptions' => array(exceptionToJavaScript($exc)) + )); + } + } } /* End of file appointments.php */ diff --git a/src/application/controllers/installation.php b/src/application/controllers/installation.php index e887704e..51b9051e 100644 --- a/src/application/controllers/installation.php +++ b/src/application/controllers/installation.php @@ -20,12 +20,27 @@ */ class Installation extends CI_Controller { + /** + * Class Constructor + */ + public function __construct() { + parent::__construct(); + $this->load->helper('installation'); + } + + /** * Display the installation page. */ public function index() { - $view['base_url'] = $this->config->item('base_url'); - $this->load->view('general/installation', $view); + if (is_ea_installed()) { + redirect('appointments/index'); + return; + } + + $this->load->view('general/installation', array( + 'base_url' => $this->config->item('base_url') + )); } /** @@ -37,6 +52,10 @@ class Installation extends CI_Controller { */ public function ajax_install() { try { + if (is_ea_installed()) { + return; + } + // Create E!A database structure. $file_contents = file_get_contents(BASEPATH . 'assets/sql/structure.sql'); $sql_queries = explode(';', $file_contents); @@ -75,6 +94,8 @@ class Installation extends CI_Controller { } } + + } /* End of file installation.php */