MaketRandevu/application/libraries/Synchronization.php

231 lines
8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* IFLRandevu - İzmir Fen Lisesi Randevu Portalı
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) Alex Tselegidis
* @license https://opensource.org/licenses/GPL-3.0 - GPLv3
* @link https://easyappointments.org
* @since v1.4.0
* ---------------------------------------------------------------------------- */
/**
* Synchronization library.
*
* Handles external calendar synchronization functionality.
*
* @package Libraries
*/
class Synchronization
{
/**
* @var EA_Controller|CI_Controller
*/
protected EA_Controller|CI_Controller $CI;
/**
* Synchronization constructor.
*/
public function __construct()
{
$this->CI = &get_instance();
$this->CI->load->model('providers_model');
$this->CI->load->model('appointments_model');
$this->CI->load->library('google_sync');
}
/**
* Synchronize changes made to the appointment with external calendars.
*
* @param array $appointment Appointment record.
* @param array $service Service record.
* @param array $provider Provider record.
* @param array $customer Customer record.
* @param array $settings Required settings for the notification content.
*/
public function sync_appointment_saved(
array $appointment,
array $service,
array $provider,
array $customer,
array $settings,
): void {
try {
if (!$provider['settings']['google_sync']) {
return;
}
if (empty($provider['settings']['google_token'])) {
throw new RuntimeException('No google token available for the provider: ' . $provider['id']);
}
$google_token = json_decode($provider['settings']['google_token'], true);
$this->CI->google_sync->refresh_token($google_token['refresh_token']);
if (empty($appointment['id_google_calendar'])) {
$google_event = $this->CI->google_sync->add_appointment(
$appointment,
$provider,
$service,
$customer,
$settings,
);
$appointment['id_google_calendar'] = $google_event->getId();
$this->CI->appointments_model->save($appointment);
} else {
$this->CI->google_sync->update_appointment($appointment, $provider, $service, $customer, $settings);
}
} catch (Throwable $e) {
log_message(
'error',
'Synchronization - Could not sync confirmation details of appointment (' .
($appointment['id'] ?? '-') .
') : ' .
$e->getMessage(),
);
log_message('error', $e->getTraceAsString());
}
}
/**
* Synchronize changes made to the unavailability with external calendars.
*
* @param array $unavailability Unavailability record.
* @param array $provider Provider record.
*/
public function sync_unavailability_saved(array $unavailability, array $provider): void
{
try {
if (!$provider['settings']['google_sync']) {
return;
}
if (empty($provider['settings']['google_token'])) {
throw new RuntimeException('No google token available for the provider: ' . $provider['id']);
}
$google_token = json_decode($provider['settings']['google_token'], true);
$this->CI->google_sync->refresh_token($google_token['refresh_token']);
if (empty($unavailability['id_google_calendar'])) {
$google_event = $this->CI->google_sync->add_unavailability($provider, $unavailability);
$unavailability['id_google_calendar'] = $google_event->getId();
$this->CI->unavailabilities_model->save($unavailability);
} else {
$this->CI->google_sync->update_unavailability($provider, $unavailability);
}
} catch (Throwable $e) {
log_message(
'error',
'Synchronization - Could not sync cancellation details of unavailability (' .
($appointment['id'] ?? '-') .
') : ' .
$e->getMessage(),
);
log_message('error', $e->getTraceAsString());
}
}
/**
* Synchronize removal of an unavailability with external calendars.
*
* @param array $unavailability Unavailability record.
* @param array $provider Provider record.
*/
public function sync_unavailability_deleted(array $unavailability, array $provider): void
{
try {
if (!$provider['settings']['google_sync'] || empty($unavailability['id_google_calendar'])) {
return;
}
if (empty($provider['settings']['google_token'])) {
throw new RuntimeException('No google token available for the provider: ' . $provider['id']);
}
$google_token = json_decode($provider['settings']['google_token'], true);
$this->CI->google_sync->refresh_token($google_token['refresh_token']);
$this->CI->google_sync->delete_unavailability($provider, $unavailability['id_google_calendar']);
} catch (Throwable $e) {
log_message(
'error',
'Synchronization - Could not sync cancellation details of unavailability (' .
($appointment['id'] ?? '-') .
') : ' .
$e->getMessage(),
);
log_message('error', $e->getTraceAsString());
}
}
/**
* Make sure a synced appointment is removed from Google Calendar, if its provider is changed.
*
* @throws Exception
*/
public function remove_appointment_on_provider_change($appointment_id): void
{
$existing_appointment = $this->CI->appointments_model->find($appointment_id);
$existing_google_id = $existing_appointment['id_google_calendar'];
$existing_provider_id = $existing_appointment['id_users_provider'];
if (
!empty($existing_google_id) &&
(int) $existing_provider_id !== (int) $existing_appointment['id_users_provider']
) {
$existing_provider = $this->CI->providers_model->find($existing_provider_id);
if ($existing_provider['settings']['google_sync']) {
$this->sync_appointment_deleted($existing_appointment, $existing_provider);
}
}
}
/**
* Synchronize removal of an appointment with external calendars.
*
* @param array $appointment Appointment record.
* @param array $provider Provider record.
*/
public function sync_appointment_deleted(array $appointment, array $provider): void
{
try {
if (!$provider['settings']['google_sync'] || empty($appointment['id_google_calendar'])) {
return;
}
if (empty($provider['settings']['google_token'])) {
throw new RuntimeException('No google token available for the provider: ' . $provider['id']);
}
$google_token = json_decode($provider['settings']['google_token'], true);
$this->CI->google_sync->refresh_token($google_token['refresh_token']);
$this->CI->google_sync->delete_appointment($provider, $appointment['id_google_calendar']);
} catch (Throwable $e) {
log_message(
'error',
'Synchronization - Could not sync cancellation details of appointment (' .
($appointment['id'] ?? '-') .
') : ' .
$e->getMessage(),
);
log_message('error', $e->getTraceAsString());
}
}
}