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 @@
= lang('go_to_booking_page') ?>
-
-
-
+
+
+ = lang('add_to_google_calendar') ?>
+
-
-
-
-
-
-
-
-
-
-
-
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 {};
-})();