%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/calendar/helpers/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/calendar/helpers/RecurrenceHelper.php |
<?php
namespace humhub\modules\calendar\helpers;
use DateTime;
use DateTimeZone;
use humhub\modules\calendar\interfaces\event\CalendarEventIF;
use humhub\modules\calendar\interfaces\recurrence\RecurrentEventIF;
use humhub\modules\calendar\interfaces\VCalendar;
use Sabre\VObject\Component\VEvent;
class RecurrenceHelper
{
const ICAL_TIME_FORMAT = 'Ymd\THis';
public static function getRecurrenceIds(CalendarEventIF $event, DateTime $start, DateTime $end)
{
$result = [];
$recurrences = static::calculateRecurrenceInstances($event, $start, $end);
foreach ($recurrences as $vEvent) {
$result[] = static::getRecurrenceIdFromVEvent($vEvent, $event->getTimezone());
}
return $result;
}
public static function getRecurrenceIdFromVEvent(VEvent $vEvent, $eventTZ)
{
if(is_string($eventTZ)) {
$eventTZ = new DateTimeZone($eventTZ);
}
$recurrence_id = $vEvent->{'RECURRENCE-ID'}->getValue();
// We only need to translate from UTC to event timezone for non all day events
$tz = (strrpos($recurrence_id, 'T') === false) ? null : $eventTZ;
return static::getRecurrentId($vEvent->{'RECURRENCE-ID'}->getValue(), $tz);
}
public static function calculateRecurrenceInstances(CalendarEventIF $event, DateTime $start, DateTime $end)
{
// Note: VObject supports the EXDATE property for exclusions, but not yet the RDATE and EXRULE properties
// Note: VCalendar expand will translate all dates with time to UTC
$tz = (is_string($event->getTimezone())) ? new DateTimeZone($event->getTimezone()) : $event->getTimezone();
$vCalendar = (new VCalendar())->add($event);
$expandedVCalendar = $vCalendar->getInstance()->expand($start, $end, $tz);
return $expandedVCalendar->select('VEVENT');
}
/**
* @param $recurrentId
* @param null $targetTZ
* @return string
* @throws \Exception
*/
public static function getRecurrentId($recurrentId, $targetTZ = null)
{
if($recurrentId instanceof CalendarEventIF) {
$recurrentId = $recurrentId->getStartDateTime();
}
$date = ($recurrentId instanceof \DateTimeInterface) ? $recurrentId : new DateTime($recurrentId, new DateTimeZone('UTC'));
if($targetTZ) {
$date->setTimezone(CalendarUtils::getDateTimeZone($targetTZ));
}
return $date->format(static::ICAL_TIME_FORMAT);
}
public static function isRecurrent(CalendarEventIF $evt)
{
if(!$evt instanceof RecurrentEventIF) {
return false;
}
return $evt->isRecurringEnabled() && !empty($evt->getRrule());
}
public static function isRecurrentInstance(CalendarEventIF $evt)
{
if(!$evt instanceof RecurrentEventIF) {
return false;
}
return static::isRecurrent($evt) && $evt->getRecurrenceId() && $evt->getRecurrenceRootId();
}
public static function isRecurrentRoot(CalendarEventIF $evt)
{
if(!$evt instanceof RecurrentEventIF) {
return false;
}
return static::isRecurrent($evt) && !$evt->getRecurrenceRootId();
}
public static function recurrenceIdToDate($recurrenceId, $format = CalendarUtils::DB_DATE_FORMAT)
{
$date = DateTime::createFromFormat(static::ICAL_TIME_FORMAT, $recurrenceId);
if($format) {
return $date->format($format);
}
return $date;
}
/**
* @param $root RecurrentEventIF
* @param $instance RecurrentEventIF
* @param null $recurrence_id
*/
public static function syncRecurrentEventData($root, $instance, $recurrence_id = null)
{
$instance->setUid($root->getUid());
$instance->setRecurrenceRootId($root->getId());
$instance->setRrule($root->getRrule());
if($recurrence_id) {
$instance->setRecurrenceId($recurrence_id);
}
}
/**
* @param RecurrentEventIF $root
* @param RecurrentEventIF $exdate
* @return string
*/
public static function addExdates(RecurrentEventIF $root, RecurrentEventIF $exdate)
{
$exdateStr = $root->getExdate();
if(empty($exdateStr)) {
return $exdate->getRecurrenceId();
}
$exdateArr = explode(',', $exdateStr);
if(!in_array($exdate->getRecurrenceId(), $exdateArr)) {
$exdateArr[] = $exdate->getRecurrenceId();
}
CalendarUtils::incrementSequence($root);
return implode(',', $exdateArr);
}
}