diff --git a/application/controllers/Booking_confirmation.php b/application/controllers/Booking_confirmation.php index a84b6292..858f58e5 100755 --- a/application/controllers/Booking_confirmation.php +++ b/application/controllers/Booking_confirmation.php @@ -30,6 +30,8 @@ class Booking_confirmation extends EA_Controller { $this->load->model('providers_model'); $this->load->model('services_model'); $this->load->model('customers_model'); + + $this->load->library('google_sync'); } /** @@ -50,44 +52,13 @@ class Booking_confirmation extends EA_Controller { $appointment = $occurrences[0]; - unset($appointment['notes']); - - $provider = $this->providers_model->find($appointment['id_users_provider']); - - $this->providers_model->only($provider, [ - 'id', - 'first_name', - 'last_name', - 'email', - 'timezone' - ]); - - $service = $this->services_model->find($appointment['id_services']); - - $this->services_model->only($service, [ - 'id', - 'first_name', - 'last_name', - 'email', - 'timezone' - ]); - - $company_name = setting('company_name'); - - script_vars([ - 'appointment_data' => $appointment, - 'provider_data' => $provider, - 'service_data' => $service, - 'company_name' => $company_name, - 'google_api_scope' => 'https://www.googleapis.com/auth/calendar', - 'google_api_key' => config('google_api_key'), - 'google_client_id' => config('google_api_key'), - ]); + $add_to_google_url = $this->google_sync->get_add_to_google_url($appointment['id']); html_vars([ 'page_title' => lang('success'), 'google_analytics_code' => setting('google_analytics_code'), 'matomo_analytics_url' => setting('matomo_analytics_url'), + 'add_to_google_url' => $add_to_google_url, ]); $this->load->view('pages/booking_confirmation'); diff --git a/application/libraries/Google_sync.php b/application/libraries/Google_sync.php index 7760706b..91f9d99d 100644 --- a/application/libraries/Google_sync.php +++ b/application/libraries/Google_sync.php @@ -46,10 +46,15 @@ class Google_sync { { $this->CI =& get_instance(); + $this->CI->load->model('appointments_model'); + $this->CI->load->model('services_model'); + $this->CI->load->model('providers_model'); + $this->CI->load->model('customers_model'); + $http = new GuzzleHttp\Client([ - 'verify' => false + 'verify' => FALSE ]); - + $this->client = new Google_Client(); $this->client->setHttpClient($http); $this->client->setApplicationName(config('google_application_name')); @@ -62,6 +67,7 @@ class Google_sync { $this->client->addScope([ Google_Service_Calendar::CALENDAR, ]); + $this->service = new Google_Service_Calendar($this->client); } @@ -369,4 +375,56 @@ class Google_sync { return $calendars; } + + /** + * Get the Add-To-Google-URL, that can be used by anyone to quickly add the event to Google Calendar (no API needed). + * + * @param int $appointment_id + * + * @return string + * + * @throws Exception + */ + public function get_add_to_google_url(int $appointment_id): string + { + $appointment = $this->CI->appointments_model->find($appointment_id); + + $service = $this->CI->services_model->find($appointment['id_services']); + + $provider = $this->CI->providers_model->find($appointment['id_users_provider']); + + $customer = $this->CI->customers_model->find($appointment['id_users_customer']); + + $provider_timezone_instance = new DateTimeZone($provider['timezone']); + + $utc_timezone_instance = new DateTimeZone('UTC'); + + $appointment_start_instance = new DateTime($appointment['start_datetime'], $provider_timezone_instance); + + $appointment_start_instance->setTimezone($utc_timezone_instance); + + $appointment_end_instance = new DateTime($appointment['end_datetime'], $provider_timezone_instance); + + $appointment_end_instance->setTimezone($utc_timezone_instance); + + $add = [ + $provider['email'] + ]; + + if ( ! empty($customer['email'])) + { + $add[] = $customer['email']; + } + + $add_to_google_url_params = [ + 'action' => 'TEMPLATE', + 'text' => $service['name'], + 'dates' => $appointment_start_instance->format('Ymd\THis\Z') . '/' . $appointment_end_instance->format('Ymd\THis\Z'), + 'location' => setting('company_name'), + 'details' => 'View/Change Appointment: ' . site_url('appointments/index/' . $appointment['hash']), + 'add' => implode(', ', $add) + ]; + + return 'https://calendar.google.com/calendar/render?' . http_build_query($add_to_google_url_params); + } } diff --git a/application/views/pages/booking_confirmation.php b/application/views/pages/booking_confirmation.php index 8573adc4..b246366e 100755 --- a/application/views/pages/booking_confirmation.php +++ b/application/views/pages/booking_confirmation.php @@ -24,23 +24,10 @@ - - - + + + + - - - - - - - - - - - diff --git a/assets/js/pages/booking_confirmation.js b/assets/js/pages/booking_confirmation.js deleted file mode 100644 index 215c0737..00000000 --- a/assets/js/pages/booking_confirmation.js +++ /dev/null @@ -1,147 +0,0 @@ -/* ---------------------------------------------------------------------------- - * Easy!Appointments - Online Appointment Scheduler - * - * @package EasyAppointments - * @author A.Tselegidis - * @copyright Copyright (c) Alex Tselegidis - * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 - * @link https://easyappointments.org - * @since v1.5.0 - * ---------------------------------------------------------------------------- */ - -/** - * Booking confirmation page. - * - * This module implements the functionality of the booking confirmation page. - */ -App.Pages.BookingConfirmation = (function () { - const $addToGoogleCalendar = $('#add-to-google-calendar'); - - /** - * Handle Authorization Result - * - * This method handles the authorization result. If the user granted access to his data, then the - * appointment is going to be added to his calendar. - * - * @param {Object} authResult The user's authorization result. - */ - function handleAuthResult(authResult) { - try { - if (authResult.error) { - throw new Error('Could not authorize user.'); - } - - // The user has granted access, add the appointment to his calendar. Before making the event.insert request - // the event resource data must be prepared. - const providerData = vars('provider_data'); - - const appointmentData = vars('appointment_data'); - - // Create a valid Google Calendar API resource for the new event. - const resource = { - summary: vars('service_data').name, - location: vars('company_name'), - start: { - dateTime: moment.tz(appointmentData.start_datetime, providerData.timezone).format() - }, - end: { - dateTime: moment.tz(appointmentData.end_datetime, providerData.timezone).format() - }, - attendees: [ - { - email: vars('provider_data').email, - displayName: vars('provider_data').first_name + ' ' + vars('provider_data').last_name - } - ] - }; - - gapi.client.load('calendar', 'v3', () => { - const request = gapi.client.calendar.events.insert({ - calendarId: 'primary', - resource: resource - }); - - request.execute((response) => { - if (response.error) { - throw new Error('Could not add the event to Google Calendar.'); - } - - $('#success-frame').append( - $('
'), - $('
', { - 'class': 'alert alert-success col-xs-12', - 'html': [ - $('

', { - 'text': lang('success') - }), - $('

', { - 'text': lang('appointment_added_to_google_calendar') - }), - $('', { - 'href': response.htmlLink, - 'text': lang('view_appointment_in_google_calendar') - }) - ] - }) - ); - $addToGoogleCalendar.hide(); - }); - }); - } catch (error) { - // The user denied access or something else happened, display corresponding message on the screen. - $('#success-frame').append( - $('
'), - $('

', { - 'class': 'alert alert-danger col-xs-12', - 'html': [ - $('

', { - 'text': lang('oops_something_went_wrong') - }), - $('

', { - 'text': lang('could_not_add_to_google_calendar') - }), - $('

', {
-                            'text': error.message
-                        })
-                    ]
-                })
-            );
-        }
-    }
-
-    /**
-     * Add the page event listeners.
-     */
-    function addEventListeners() {
-        /**
-         * Event: Add Appointment to Google Calendar "Click"
-         *
-         * This event handler adds the appointment to the users Google Calendar Account. The event is going to
-         * be added to the "primary" calendar. In order to use the API the javascript client library provided by
-         * Google is necessary.
-         */
-        $addToGoogleCalendar.on('click', () => {
-            gapi.client.setApiKey(vars('google_api_key'));
-
-            gapi.auth.authorize(
-                {
-                    client_id: vars('google_client_id'),
-                    scope: vars('google_api_scope'),
-                    immediate: false
-                },
-                handleAuthResult
-            );
-        });
-    }
-
-    /**
-     * Initialize the module.
-     */
-    function initialize() {
-        addEventListeners();
-    }
-
-    document.addEventListener('DOMContentLoaded', initialize);
-
-    return {};
-})();