2013-05-04 00:26:04 +03:00
|
|
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
|
|
|
|
|
|
|
// Google API PHP Client is necessary to perform sync operations.
|
2013-05-17 16:09:10 +03:00
|
|
|
require_once dirname(__FILE__) . '/external/google-api-php-client/Google_Client.php';
|
|
|
|
require_once dirname(__FILE__) . '/external/google-api-php-client/contrib/Google_CalendarService.php';
|
2013-05-04 00:26:04 +03:00
|
|
|
require_once dirname(dirname(dirname(__FILE__))) . '/configuration.php';
|
|
|
|
|
2013-06-10 18:51:23 +03:00
|
|
|
/**
|
|
|
|
* Google Synchronization Class
|
|
|
|
*
|
|
|
|
* This class implements all the core synchronization between the Google Calendar
|
|
|
|
* and the Easy!Appointments system.
|
|
|
|
*/
|
2013-05-04 00:26:04 +03:00
|
|
|
class Google_Sync {
|
2013-06-19 22:29:00 +03:00
|
|
|
private $CI;
|
2013-05-04 00:26:04 +03:00
|
|
|
private $client;
|
|
|
|
private $service;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Class Constructor
|
|
|
|
*
|
2013-06-10 18:51:23 +03:00
|
|
|
* This method initializes the Google client class and the Calendar service
|
|
|
|
* class so that they can be used by the other methods.
|
2013-05-04 00:26:04 +03:00
|
|
|
*/
|
2013-06-19 22:29:00 +03:00
|
|
|
public function __construct() {
|
|
|
|
$this->CI =& get_instance();
|
2013-05-04 00:26:04 +03:00
|
|
|
|
2013-06-19 22:29:00 +03:00
|
|
|
if (!isset($_SESSION)) {
|
|
|
|
@session_start();
|
|
|
|
}
|
2013-05-04 00:26:04 +03:00
|
|
|
|
|
|
|
// Initialize google client and calendar service.
|
|
|
|
$this->client = new Google_Client();
|
2013-06-24 12:52:23 +03:00
|
|
|
$this->client->setUseObjects(true);
|
|
|
|
|
2013-05-04 00:26:04 +03:00
|
|
|
$this->client->setApplicationName(SystemConfiguration::$google_product_name);
|
|
|
|
$this->client->setClientId(SystemConfiguration::$google_client_id);
|
|
|
|
$this->client->setClientSecret(SystemConfiguration::$google_client_secret);
|
|
|
|
$this->client->setDeveloperKey(SystemConfiguration::$google_api_key);
|
2013-06-19 22:29:00 +03:00
|
|
|
$this->client->setRedirectUri($this->CI->config->item('base_url') . 'google/oauth_callback');
|
2013-06-24 12:52:23 +03:00
|
|
|
|
2013-05-04 00:26:04 +03:00
|
|
|
$this->service = new Google_CalendarService($this->client);
|
|
|
|
}
|
|
|
|
|
2013-06-19 22:29:00 +03:00
|
|
|
/**
|
|
|
|
* Get Google OAuth authorization url.
|
|
|
|
*
|
|
|
|
* This url must be used to redirect the user to the Google user consent page,
|
|
|
|
* where the user grants access to his data for the Easy!Appointments app.
|
|
|
|
*/
|
|
|
|
public function get_auth_url() {
|
|
|
|
// "max_auth_age" is needed because the user needs to always log in
|
|
|
|
// and not use an existing session.
|
|
|
|
return $this->client->createAuthUrl() . '&max_auth_age=0';
|
|
|
|
}
|
|
|
|
|
2013-05-04 00:26:04 +03:00
|
|
|
/**
|
2013-06-12 18:31:16 +03:00
|
|
|
* Authenticate the Google API usage.
|
2013-05-04 00:26:04 +03:00
|
|
|
*
|
2013-06-19 22:29:00 +03:00
|
|
|
* When the user grants consent for his data usage, google is going to redirect
|
|
|
|
* the browser back to the given redirect url. There a authentication code is
|
|
|
|
* provided. Using this code, we can authenticate the API usage and store the
|
|
|
|
* token information to the database.
|
|
|
|
*
|
|
|
|
* @see Google Controller
|
|
|
|
*/
|
|
|
|
public function authenticate($auth_code) {
|
|
|
|
$this->client->authenticate($auth_code);
|
|
|
|
return $this->client->getAccessToken();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Refresh the Google Client access token.
|
|
|
|
*
|
2013-06-12 18:31:16 +03:00
|
|
|
* This method must be executed every time we need to make actions on a
|
|
|
|
* provider's Google Calendar account. A new token is necessary and the
|
|
|
|
* only way to get it is to use the stored refresh token that was provided
|
|
|
|
* when the provider granted consent to Easy!Appointments for use his
|
|
|
|
* Google Calendar account.
|
2013-05-04 00:26:04 +03:00
|
|
|
*
|
2013-06-12 18:31:16 +03:00
|
|
|
* @param string $refresh_token The provider's refresh token. This value is
|
|
|
|
* stored in the database and used every time we need to make actions to his
|
|
|
|
* Google Caledar account.
|
2013-05-04 00:26:04 +03:00
|
|
|
*/
|
2013-06-19 22:29:00 +03:00
|
|
|
public function refresh_token($refresh_token) {
|
|
|
|
$this->client->refreshToken($refresh_token);
|
2013-05-04 00:26:04 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-06-10 18:51:23 +03:00
|
|
|
* Add an appointment record to its providers Google Calendar account.
|
2013-05-04 00:26:04 +03:00
|
|
|
*
|
2013-06-10 18:51:23 +03:00
|
|
|
* This method checks whether the appointment's provider has enabled the Google
|
|
|
|
* Sync utility of Easy!Appointments and the stored access token is still valid.
|
|
|
|
* If yes, the selected appointment record is going to be added to the Google
|
|
|
|
* Calendar account.
|
2013-05-04 00:26:04 +03:00
|
|
|
*
|
2013-07-09 17:46:48 +03:00
|
|
|
* @param array $appointment Contains the appointment record data.
|
|
|
|
* @param array $provider Contains the provider record data.
|
|
|
|
* @param array $service Contains the service record data.
|
|
|
|
* @param array $customer Contains the customer recod data.
|
2013-06-26 12:31:57 +03:00
|
|
|
* @parma array $company_settings Contains some company settings that are used
|
|
|
|
* by this method. By the time the following values must be in the array:
|
|
|
|
* 'company_name'.
|
2013-05-04 00:26:04 +03:00
|
|
|
* @return Google_Event Returns the Google_Event class object.
|
|
|
|
*/
|
2013-07-09 17:46:48 +03:00
|
|
|
public function add_appointment($appointment, $provider, $service, $customer, $company_settings) {
|
2013-05-04 00:26:04 +03:00
|
|
|
|
2013-06-19 22:29:00 +03:00
|
|
|
$this->CI->load->helper('general');
|
2013-05-04 00:26:04 +03:00
|
|
|
|
|
|
|
$event = new Google_Event();
|
2013-07-09 17:46:48 +03:00
|
|
|
$event->setSummary($service['name']);
|
2013-06-26 12:31:57 +03:00
|
|
|
$event->setLocation($company_settings['company_name']);
|
2013-05-04 00:26:04 +03:00
|
|
|
|
|
|
|
$start = new Google_EventDateTime();
|
2013-07-09 17:46:48 +03:00
|
|
|
$start->setDateTime(date3339(strtotime($appointment['start_datetime'])));
|
2013-05-04 00:26:04 +03:00
|
|
|
$event->setStart($start);
|
|
|
|
|
|
|
|
$end = new Google_EventDateTime();
|
2013-07-09 17:46:48 +03:00
|
|
|
$end->setDateTime(date3339(strtotime($appointment['end_datetime'])));
|
2013-05-04 00:26:04 +03:00
|
|
|
$event->setEnd($end);
|
|
|
|
|
|
|
|
$eventProvider = new Google_EventAttendee();
|
2013-07-09 17:46:48 +03:00
|
|
|
$eventProvider->setDisplayName($provider['first_name'] . ' '
|
|
|
|
. $provider['last_name']);
|
|
|
|
$eventProvider->setEmail($provider['email']);
|
2013-05-04 00:26:04 +03:00
|
|
|
|
|
|
|
$eventCustomer = new Google_EventAttendee();
|
2013-07-09 17:46:48 +03:00
|
|
|
$eventCustomer->setDisplayName($customer['first_name'] . ' '
|
|
|
|
. $customer['last_name']);
|
|
|
|
$eventCustomer->setEmail($customer['email']);
|
2013-05-04 00:26:04 +03:00
|
|
|
|
2013-06-10 18:51:23 +03:00
|
|
|
$event->attendees = array(
|
|
|
|
$eventProvider,
|
|
|
|
$eventCustomer
|
|
|
|
);
|
2013-05-04 00:26:04 +03:00
|
|
|
|
2013-06-10 18:51:23 +03:00
|
|
|
// Add the new event to the "primary" calendar.
|
2013-05-04 00:26:04 +03:00
|
|
|
$created_event = $this->service->events->insert('primary', $event);
|
|
|
|
|
|
|
|
return $created_event;
|
|
|
|
}
|
2013-06-10 18:51:23 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Update an existing appointment that is already synced with Google Calendar.
|
|
|
|
*
|
2013-06-24 09:04:30 +03:00
|
|
|
* This method updates the google calendar event item that is connected with the
|
|
|
|
* provided appointment record of Easy!Appointments.
|
|
|
|
*
|
2013-07-09 17:46:48 +03:00
|
|
|
* @param array $appointment Contains the appointment record data.
|
|
|
|
* @param array $provider Contains the provider record data.
|
|
|
|
* @param array $service Contains the service record data.
|
|
|
|
* @param array $customer Contains the customer recod data.
|
2013-06-24 12:52:23 +03:00
|
|
|
* @parma array $company_settings Contains some company settings that are used
|
|
|
|
* by this method. By the time the following values must be in the array:
|
|
|
|
* 'company_name'.
|
|
|
|
* @return Google_Event Returns the Google_Event class object.
|
2013-06-10 18:51:23 +03:00
|
|
|
*/
|
2013-07-09 17:46:48 +03:00
|
|
|
public function update_appointment($appointment, $provider, $service, $customer, $company_settings) {
|
2013-06-19 22:29:00 +03:00
|
|
|
$this->CI->load->helper('general');
|
2013-06-10 18:51:23 +03:00
|
|
|
|
2013-07-09 17:46:48 +03:00
|
|
|
$event = $this->service->events->get('primary', $appointment['id_google_calendar']);
|
2013-06-24 12:52:23 +03:00
|
|
|
|
2013-07-09 17:46:48 +03:00
|
|
|
$event->setSummary($service['name']);
|
2013-06-24 12:52:23 +03:00
|
|
|
$event->setLocation($company_settings['company_name']);
|
|
|
|
|
|
|
|
$start = new Google_EventDateTime();
|
2013-07-09 17:46:48 +03:00
|
|
|
$start->setDateTime(date3339(strtotime($appointment['start_datetime'])));
|
2013-06-24 12:52:23 +03:00
|
|
|
$event->setStart($start);
|
|
|
|
|
|
|
|
$end = new Google_EventDateTime();
|
2013-07-09 17:46:48 +03:00
|
|
|
$end->setDateTime(date3339(strtotime($appointment['end_datetime'])));
|
2013-06-24 12:52:23 +03:00
|
|
|
$event->setEnd($end);
|
|
|
|
|
|
|
|
$event_provider = new Google_EventAttendee();
|
2013-07-09 17:46:48 +03:00
|
|
|
$event_provider->setDisplayName($provider['first_name'] . ' '
|
|
|
|
. $provider['last_name']);
|
|
|
|
$event_provider->setEmail($provider['email']);
|
2013-06-24 12:52:23 +03:00
|
|
|
|
|
|
|
$event_customer = new Google_EventAttendee();
|
2013-07-09 17:46:48 +03:00
|
|
|
$event_customer->setDisplayName($customer['first_name'] . ' '
|
|
|
|
. $customer['last_name']);
|
|
|
|
$event_customer->setEmail($customer['email']);
|
2013-06-24 12:52:23 +03:00
|
|
|
|
|
|
|
$event->attendees = array(
|
|
|
|
$event_provider,
|
|
|
|
$event_customer
|
|
|
|
);
|
|
|
|
|
|
|
|
$updated_event = $this->service->events->update('primary', $event->getId(), $event);
|
|
|
|
|
|
|
|
return $updated_event;
|
2013-06-10 18:51:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete an existing appointment from Google Calendar.
|
|
|
|
*
|
2013-06-19 22:29:00 +03:00
|
|
|
* @param string $google_calendar_id The Google Calendar event id to
|
|
|
|
* be deleted.
|
2013-06-10 18:51:23 +03:00
|
|
|
*/
|
2013-06-19 22:29:00 +03:00
|
|
|
public function delete_appointment($google_calendar_id) {
|
|
|
|
$this->service->events->delete('primary', $google_calendar_id);
|
2013-06-10 18:51:23 +03:00
|
|
|
}
|
2013-07-09 17:46:48 +03:00
|
|
|
|
2013-07-10 16:57:24 +03:00
|
|
|
/**
|
|
|
|
* Add unavailable period event to Google Calendar.
|
|
|
|
*
|
|
|
|
* @param array $unavailable Contains unavailable period's data.
|
|
|
|
* @return Google_Event Returns the google event's object.
|
|
|
|
*/
|
|
|
|
public function add_unavailable($unavailable) {
|
|
|
|
$this->CI->load->helper('general');
|
|
|
|
|
|
|
|
$event = new Google_Event();
|
|
|
|
$event->setSummary('Unavailalbe');
|
|
|
|
$event->setDescription($unavailable['notes']);
|
|
|
|
|
|
|
|
$start = new Google_EventDateTime();
|
|
|
|
$start->setDateTime(date3339(strtotime($unavailable['start_datetime'])));
|
|
|
|
$event->setStart($start);
|
|
|
|
|
|
|
|
$end = new Google_EventDateTime();
|
|
|
|
$end->setDateTime(date3339(strtotime($unavailable['end_datetime'])));
|
|
|
|
$event->setEnd($end);
|
|
|
|
|
|
|
|
// Add the new event to the "primary" calendar.
|
|
|
|
$created_event = $this->service->events->insert('primary', $event);
|
|
|
|
|
|
|
|
return $created_event;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update Google Calendar unavailable period event.
|
|
|
|
*
|
|
|
|
* @param array $unavailable Contains the unavailable period data.
|
|
|
|
* @return Google_Event Returns the Google_Event object.
|
|
|
|
*/
|
|
|
|
public function update_unavailable($unavailable) {
|
|
|
|
$this->CI->load->helper('general');
|
|
|
|
|
|
|
|
$event = $this->service->events->get('primary', $unavailable['id_google_calendar']);
|
|
|
|
$event->setDescription($unavailable['notes']);
|
|
|
|
|
|
|
|
$start = new Google_EventDateTime();
|
|
|
|
$start->setDateTime(date3339(strtotime($unavailable['start_datetime'])));
|
|
|
|
$event->setStart($start);
|
|
|
|
|
|
|
|
$end = new Google_EventDateTime();
|
|
|
|
$end->setDateTime(date3339(strtotime($unavailable['end_datetime'])));
|
|
|
|
$event->setEnd($end);
|
|
|
|
|
|
|
|
$updated_event = $this->service->events->update('primary', $event->getId(), $event);
|
|
|
|
|
|
|
|
return $updated_event;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete unavailable period event from Google Calendar.
|
|
|
|
*
|
|
|
|
* @param string $google_calendar_id Google Calendar event id to be deleted.
|
|
|
|
*/
|
|
|
|
public function delete_unavailable($google_calendar_id) {
|
|
|
|
$this->service->events->delete('primary', $google_calendar_id);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get an event object from gcal
|
|
|
|
*
|
|
|
|
* @param string $google_calendar_id Id of the google calendar event
|
|
|
|
* @return Google_Event Returns the google event object.
|
|
|
|
*/
|
|
|
|
public function get_event($google_calendar_id) {
|
|
|
|
return $this->service->events->get('primary', $google_calendar_id);
|
2013-07-09 17:46:48 +03:00
|
|
|
}
|
2013-07-15 10:32:19 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get all the events between the sync period.
|
|
|
|
*
|
|
|
|
* @param date $start The start date of sync period.
|
|
|
|
* @param date $end The end date of sync period.
|
|
|
|
* @return object Returns an array with Google_Event objects that belong on the given
|
|
|
|
* sync period (start, end).
|
|
|
|
*/
|
|
|
|
public function get_sync_events($start, $end) {
|
|
|
|
$this->CI->load->helper('general');
|
|
|
|
|
|
|
|
$params = array(
|
|
|
|
'timeMin' => date3339($start),
|
|
|
|
'timeMax' => date3339($end)
|
|
|
|
);
|
|
|
|
|
|
|
|
return $this->service->events->listEvents('primary', $params);
|
|
|
|
}
|
2013-05-04 00:26:04 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* End of file google_sync.php */
|
|
|
|
/* Location: ./application/libraries/google_sync.php */
|