22 'workingElsewhere' =>
'absent',
23 'tentative' =>
'quest',
29 'quest' =>
'tentative',
44 $endDate =
$event->isFullDayEvent()
45 ? (clone
$event->getEnd())->add(
'1 day')
49 'subject' =>
$event->getName(),
51 'contentType' =>
'HTML',
52 'content' => $this->prepareDescription(
$event),
54 'isAllDay' =>
$event->isFullDayEvent(),
56 'dateTime' =>
$event->getStart()->getDate()->format(Helper::TIME_FORMAT_LONG),
57 'timeZone' => $this->prepareTimeZone(
59 $event->getStartTimeZone(),
64 'dateTime' => $endDate->getDate()->format(Helper::TIME_FORMAT_LONG),
65 'timeZone' => $this->prepareTimeZone(
71 'isCancelled' =>
$event->isDeleted(),
73 'displayName' => $this->prepareLocation(
$event->getLocation()),
77 if (
$event->isRecurrence())
79 $data[
'recurrence'] = $this->prepareRecurringForDto(
$event->getRecurringRule(),
$event->getStart()->getDate());
82 if (
$event->getRemindCollection())
87 if ($accessibility = $this->convertAccessibility(
$event->getAccessibility()))
89 $data[
'showAs'] = $accessibility;
100 private function convertAccessibility(?
string $ourValue): ?string
102 return self::ACCESSIBILITY_EXPORT_MAP[$ourValue] ??
null;
115 'interval' => $rule->getInterval(),
128 if ($rule->getFrequency() ===
'WEEKLY')
130 $result[
'pattern'][
'type'] =
'weekly';
132 $firstDayOfWeek = \COption::GetOptionString(
'calendar',
'week_start',
'MO');
133 $result[
'pattern'][
'firstDayOfWeek'] = $dayMap[$firstDayOfWeek];
135 if ($rule->getByday())
137 $result[
'pattern'][
'daysOfWeek'] = array_map(
function (
$val) use ($dayMap) {
138 return $dayMap[
$val] ??
'';
139 }, array_values($rule->getByday()));
142 elseif ($rule->getFrequency() ===
'DAILY')
144 $result[
'pattern'][
'type'] =
'daily';
146 elseif ($rule->getFrequency() ===
'MONTHLY')
148 $result[
'pattern'][
'type'] =
'absoluteMonthly';
149 $result[
'pattern'][
'interval'] = $rule->getInterval();
153 elseif ($rule->getFrequency() ===
'YEARLY')
155 $result[
'pattern'][
'type'] =
'absoluteYearly';
161 if ($rule->getCount())
163 $result[
'range'][
'type'] =
'numbered';
164 $result[
'range'][
'numberOfOccurrences'] = $rule->getCount();
165 $result[
'range'][
'endDate'] =
'0001-01-01';
167 elseif ($rule->getUntil())
169 $result[
'range'][
'type'] =
'endDate';
170 $result[
'range'][
'endDate'] = $rule->getUntil()->format(
'Y-m-d');
174 $result[
'range'][
'type'] =
'noEnd';
175 $result[
'range'][
'endDate'] = $this->getFarFarAwayDate();
184 private function getFarFarAwayDate(): string
197 $remindCollection =
$event->getRemindCollection();
201 foreach ($remindCollection as $remind)
203 if (!$remind->isBeforeEventStart() && !
$event->isFullDayEvent())
208 $newDelta = $remind->getTimeBeforeStartInMinutes();
210 if ($newDelta < -1440)
221 $data[
'isReminderOn'] =
true;
226 $data[
'isReminderOn'] =
false;
227 $data[
'reminderMinutesBeforeStart'] = 0;
237 private function prepareLocation(?Location
$location)
254 private function prepareTimeZone(
256 ?Base\DateTimeZone $timeZone,
262 return $timeZone->getTimeZone()->getName();
267 $coreDate = $date->getDate();
268 if ($coreDate instanceof Type\DateTime)
270 return $coreDate->getTimeZone()->getName();
274 return $this->getDefaultTimezone();
280 private function getDefaultTimezone(): string
290 private function prepareDescription(Event
$event): string
302 private function parseImagesInDescription(
string $description): string
305 "#\[img]((cid):[.\\-_:a-z0-9@]+)*\[/img]#isu",
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)