20 private Event $eventObject;
24 $icalEvent = $this->buildIcalEvent();
25 $icalCalendar = $this->buildIcalCalendar();
26 $icalCalendar->addEvent($icalEvent);
28 return $icalCalendar->get();
33 $eventFields = self::prepareArrayFields($eventObject);
34 $manager = self::createInstance($eventFields);
35 $manager->eventObject = $eventObject;
40 private static function prepareArrayFields(
Event $eventObject):
array
44 'TZ_FROM' => $eventObject->getStartTimeZone(),
46 'TZ_TO' => $eventObject->getEndTimeZone(),
50 $parentId = $eventObject->getParentId();
51 $hostId = $eventObject->getEventHost()?->getId();
52 $fields[
'ICAL_ORGANIZER'] = Helper::getAttendee(
53 $eventObject->getEventHost()?->getId(),
57 $fields[
'ICAL_ORGANIZER']->setEmail(
null);
58 $fields[
'ICAL_ORGANIZER']->setMailto(
null);
59 if (!$eventObject->getMeetingDescription()?->getHideGuests())
61 $fields[
'ICAL_ATTENDEES'] = Helper::getAttendeesByEventParentId($parentId);
64 $fields[
'ICAL_ATTACHES'] = Helper::getMailAttaches(
null, $hostId, $parentId);
69 private function buildIcalEvent(): IcalEvent
71 $location = $this->eventObject->getLocation()?->toString()
72 ? \Bitrix\Calendar\Rooms\Util::getTextLocation($this->eventObject->getLocation()->toString())
74 $excludeDates = array_map(
75 fn($ed) => $ed->getDate(),
76 $this->eventObject->getExcludedDateCollection()->getCollection()
78 $rrule = $this->eventObject->getRecurringRule()?->toArray();
84 if (($rrule[
'COUNT'] ??
null) && ($rrule[
'UNTIL'] ??
null))
86 unset($rrule[
'UNTIL']);
89 $rrule =
new RecurrenceRuleProperty($rrule);
91 $skipTime = $this->eventObject->isFullDayEvent();
92 $priority = Dictionary::PRIORITY_MAP[$this->eventObject->getImportance()] ?? Dictionary::PRIORITY_MAP[
'default'];
94 $icalEvent = (
new IcalEvent($this->eventObject->getUid()))
95 ->setName($this->eventObject->getName())
96 ->setStartsAt(
Util::getDateObject($this->event[
'DATE_FROM'], $skipTime, $this->event[
'TZ_FROM']))
98 ->setCreatedAt(
Util::getDateObject($this->event[
'CREATED'],
false, $this->event[
'TZ_FROM']))
100 ->setModified(
Util::getDateObject($this->event[
'MODIFIED'],
false, $this->event[
'TZ_FROM']))
101 ->setWithTimezone(!$skipTime)
102 ->setWithTime(!$skipTime)
104 Dictionary::TRANSPARENT[$this->eventObject->getAccessibility()] ?? Dictionary::TRANSPARENT[
'busy']
107 ->setExdates($excludeDates)
109 ->setSequence($this->eventObject->getVersion())
110 ->setStatus(Dictionary::INVITATION_STATUS[
'confirmed'])
111 ->setPriority($priority)
114 if ($this->eventObject->getDescription())
116 $icalEvent->setDescription($this->prepareDescription($this->eventObject->getDescription()));
119 if ($reminders = $this->eventObject->getRemindCollection()?->getCollection())
124 function ($r) use ($skipTime) {
125 [
$value, $valueType] = ReminderHelper::prepareReminderValue($r, $skipTime);
127 return new Alarm(type: $valueType, value: $value);
135 if (!empty(
$event[
'ICAL_ATTENDEES']) && !(
$event[
'MEETING'][
'HIDE_GUESTS'] ??
true))
137 $icalEvent->setAttendees(
$event[
'ICAL_ATTENDEES']);
140 if (!empty(
$event[
'ICAL_ORGANIZER']))
142 $icalEvent->setOrganizer(
$event[
'ICAL_ORGANIZER'],
'');
148 private function buildIcalCalendar():
Calendar
151 ->setMethod(
'REQUEST')
152 ->setTimezones(Timezone::createInstance()
153 ->setTimezoneId(Helper::getTimezoneObject($this->eventObject->getStartTimeZone()))
154 ->setObservance(StandardObservances::createInstance()
155 ->setOffsetFrom(Helper::getTimezoneObject($this->eventObject->getStartTimeZone()))
156 ->setOffsetTo(Helper::getTimezoneObject($this->eventObject->getEndTimeZone()))