easyappointments/application/libraries/Ics_file.php

232 lines
7.9 KiB
PHP
Raw Normal View History

<?php defined('BASEPATH') or exit('No direct script access allowed');
2017-11-01 16:24:25 +03:00
/* ----------------------------------------------------------------------------
2022-01-18 15:05:42 +03:00
* Easy!Appointments - Online Appointment Scheduler
2017-11-01 16:24:25 +03:00
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
2021-12-18 19:43:45 +03:00
* @copyright Copyright (c) Alex Tselegidis
* @license https://opensource.org/licenses/GPL-3.0 - GPLv3
* @link https://easyappointments.org
2017-11-01 16:24:25 +03:00
* @since v1.3.0
* ---------------------------------------------------------------------------- */
use Jsvrcek\ICS\CalendarExport;
use Jsvrcek\ICS\CalendarStream;
use Jsvrcek\ICS\Exception\CalendarEventException;
use Jsvrcek\ICS\Model\CalendarAlarm;
2017-11-01 16:24:25 +03:00
use Jsvrcek\ICS\Model\CalendarEvent;
use Jsvrcek\ICS\Model\Description\Location;
2017-11-01 16:24:25 +03:00
use Jsvrcek\ICS\Model\Relationship\Attendee;
use Jsvrcek\ICS\Model\Relationship\Organizer;
use Jsvrcek\ICS\Utility\Formatter;
/**
2021-11-06 18:21:27 +03:00
* Ics file library.
2017-11-01 16:24:25 +03:00
*
* Handle ICS related functionality.
2017-11-01 16:24:25 +03:00
*
* An ICS file is a calendar file saved in a universal calendar format used by many email and calendar programs,
* including Microsoft Outlook, Google Calendar, and Apple Calendar.
*
* @package Libraries
2017-11-01 16:24:25 +03:00
*/
class Ics_file
{
2022-02-23 11:07:21 +03:00
/**
2023-03-13 11:06:18 +03:00
* @var EA_Controller|CI_Controller
2022-02-23 11:07:21 +03:00
*/
2023-03-13 11:06:18 +03:00
protected EA_Controller|CI_Controller $CI;
2022-02-23 11:07:21 +03:00
/**
* Availability constructor.
*/
public function __construct()
{
$this->CI = &get_instance();
2022-02-23 11:07:21 +03:00
$this->CI->load->library('ics_provider');
$this->CI->load->library('ics_calendar');
}
2017-11-01 16:24:25 +03:00
/**
* Get the ICS file contents for the provided arguments.
*
* @param array $appointment Appointment data.
* @param array $service Service data.
* @param array $provider Provider data.
* @param array $customer Customer data.
2017-11-01 16:24:25 +03:00
*
* @return string Returns the contents of the ICS file.
*
* @throws CalendarEventException
* @throws Exception
2017-11-01 16:24:25 +03:00
*/
public function get_stream(array $appointment, array $service, array $provider, array $customer): string
2017-11-01 16:24:25 +03:00
{
$appointment_timezone = new DateTimeZone($provider['timezone']);
$appointment_start = new DateTime($appointment['start_datetime'], $appointment_timezone);
$appointment_end = new DateTime($appointment['end_datetime'], $appointment_timezone);
2017-11-01 16:24:25 +03:00
// Set up the event.
2017-11-01 16:24:25 +03:00
$event = new CalendarEvent();
$event
->setStart($appointment_start)
->setEnd($appointment_end)
->setStatus('CONFIRMED')
2017-11-01 16:24:25 +03:00
->setSummary($service['name'])
->setUid($this->generate_uid($appointment['id']));
2017-11-01 16:24:25 +03:00
if (!empty($service['location'])) {
$location = new Location();
$location->setName((string) $service['location']);
$event->addLocation($location);
}
$description = [
'',
lang('provider'),
'',
lang('name') . ': ' . $provider['first_name'] . ' ' . $provider['last_name'],
lang('email') . ': ' . $provider['email'],
lang('phone_number') . ': ' . $provider['phone_number'],
lang('address') . ': ' . $provider['address'],
lang('city') . ': ' . $provider['city'],
lang('zip_code') . ': ' . $provider['zip_code'],
'',
lang('customer'),
'',
lang('name') . ': ' . $customer['first_name'] . ' ' . $customer['last_name'],
lang('email') . ': ' . $customer['email'],
lang('phone_number') . ': ' . ($customer['phone_number'] ?? '-'),
lang('address') . ': ' . $customer['address'],
lang('city') . ': ' . $customer['city'],
lang('zip_code') . ': ' . $customer['zip_code'],
'',
lang('notes'),
'',
$appointment['notes'],
];
$event->setDescription(implode("\\n", $description));
2017-11-01 16:24:25 +03:00
$attendee = new Attendee(new Formatter());
if (isset($customer['email']) && !empty($customer['email'])) {
2017-11-01 16:24:25 +03:00
$attendee->setValue($customer['email']);
}
// Add the event attendees.
2017-11-01 16:24:25 +03:00
$attendee->setName($customer['first_name'] . ' ' . $customer['last_name']);
$attendee
->setCalendarUserType('INDIVIDUAL')
->setRole('REQ-PARTICIPANT')
->setParticipationStatus('NEEDS-ACTION')
->setRsvp('TRUE');
$event->addAttendee($attendee);
$alarm = new CalendarAlarm();
$alarm_datetime = clone $appointment_start;
$alarm->setTrigger($alarm_datetime->modify('-15 minutes'));
$alarm->setSummary('Alarm notification');
$alarm->setDescription('This is an event reminder');
$alarm->setAction('EMAIL');
$alarm->addAttendee($attendee);
$event->addAlarm($alarm);
$alarm = new CalendarAlarm();
$alarm_datetime = clone $appointment_start;
$alarm->setTrigger($alarm_datetime->modify('-60 minutes'));
$alarm->setSummary('Alarm notification');
$alarm->setDescription('This is an event reminder');
$alarm->setAction('EMAIL');
$alarm->addAttendee($attendee);
$event->addAlarm($alarm);
$attendee = new Attendee(new Formatter());
if (isset($provider['email']) && !empty($provider['email'])) {
$attendee->setValue($provider['email']);
}
$attendee->setName($provider['first_name'] . ' ' . $provider['last_name']);
$attendee
->setCalendarUserType('INDIVIDUAL')
->setRole('REQ-PARTICIPANT')
->setParticipationStatus('ACCEPTED')
->setRsvp('FALSE');
2017-11-01 16:24:25 +03:00
$event->addAttendee($attendee);
// Set the organizer.
$organizer = new Organizer(new Formatter());
$organizer->setValue($provider['email'])->setName($provider['first_name'] . ' ' . $provider['last_name']);
2017-11-01 16:24:25 +03:00
$event->setOrganizer($organizer);
// Setup calendar.
2022-02-23 11:07:21 +03:00
$calendar = new Ics_calendar();
2017-11-01 16:24:25 +03:00
$calendar
->setProdId('-//EasyAppointments//Open Source Web Scheduler//EN')
->setTimezone(new DateTimeZone($provider['timezone']))
2017-11-01 16:24:25 +03:00
->addEvent($event);
// Setup exporter.
$calendarExport = new CalendarExport(new CalendarStream(), new Formatter());
2017-11-01 16:24:25 +03:00
$calendarExport->addCalendar($calendar);
return $calendarExport->getStream();
}
public function get_unavailability_stream(array $unavailability, array $provider): string
{
$unavailability_timezone = new DateTimeZone($provider['timezone']);
$unavailability_start = new DateTime($unavailability['start_datetime'], $unavailability_timezone);
$unavailability_end = new DateTime($unavailability['end_datetime'], $unavailability_timezone);
// Set up the event.
$event = new CalendarEvent();
$event
->setStart($unavailability_start)
->setEnd($unavailability_end)
->setStatus('CONFIRMED')
->setSummary('Unavailability')
->setUid($this->generate_uid($unavailability['id']));
$event->setDescription(str_replace("\n", "\\n", (string) $unavailability['notes']));
// Set the organizer.
$organizer = new Organizer(new Formatter());
$organizer->setValue($provider['email'])->setName($provider['first_name'] . ' ' . $provider['last_name']);
$event->setOrganizer($organizer);
// Setup calendar.
$calendar = new Ics_calendar();
$calendar
->setProdId('-//EasyAppointments//Open Source Web Scheduler//EN')
->setTimezone(new DateTimeZone($provider['timezone']))
->addEvent($event);
// Setup exporter.
$calendarExport = new CalendarExport(new CalendarStream(), new Formatter());
$calendarExport->addCalendar($calendar);
return $calendarExport->getStream();
}
public function generate_uid(int $db_record_id): string
{
return 'ea-' . md5($db_record_id);
}
2017-11-01 16:24:25 +03:00
}