26 private Event $originalEvent;
43 $this->originalEvent =
$event;
44 $this->eventConnection = $eventConnection;
56 $event[
'summary'] = $this->originalEvent->getName();
57 $event[
'description'] = $this->prepareDescription($this->originalEvent);
60 $event[
'reminders'] = $this->prepareReminders();
61 $event[
'location'] = $this->prepareLocation();
62 $event[
'visibility'] = $this->prepareVisibility();
65 if ($this->originalEvent->getUid() !==
null)
67 $event[
'iCalUID'] = $this->originalEvent->getUid();
70 if ($this->originalEvent->isRecurrence())
72 $event[
'recurrence'] = $this->prepareRecurrenceRule();
85 private function prepareDescription(
Event $event): string
98 if ($this->eventConnection ===
null)
100 throw new BaseException(
'you should initialize eventConnection before update event');
104 if ($this->eventConnection && $this->eventConnection->getVendorEventId() !==
null)
106 $event[
'id'] = $this->eventConnection->getVendorEventId();
108 if ($this->originalEvent->isInstance())
110 $event[
'recurringEventId'] = $this->eventConnection->getRecurrenceId();
114 $this->eventConnection->setData($this->eventConnection->fetchData());
116 if (($eventConnectionData = $this->eventConnection->getData()) && !empty($eventConnectionData[
'attendees']))
118 $event[
'attendees'] = $eventConnectionData[
'attendees'];
132 $event[
'status'] =
'cancelled';
142 return $this->originalEvent->getAccessibility() ===
'busy'
155 if ($this->originalEvent->isFullDayEvent())
157 $date[
'start'][
'date'] = $this->originalEvent->getStart()->format(
'Y-m-d');
158 $date[
'end'][
'date'] = $this->originalEvent->getEnd()->add((
'+1 day'))->format(
'Y-m-d');
162 $date[
'start'][
'dateTime'] = $this->originalEvent->getStart()->format(Helper::DATE_TIME_FORMAT);
163 $date[
'start'][
'timeZone'] = $this->originalEvent->getStartTimeZone()
164 ? $this->originalEvent->getStartTimeZone()->getTimeZone()->getName()
165 : (new \DateTime())->getTimezone()->getName()
167 $date[
'end'][
'dateTime'] = $this->originalEvent->getEnd()->format(Helper::DATE_TIME_FORMAT);
168 $date[
'end'][
'timeZone'] = $this->originalEvent->getEndTimeZone()
169 ? $this->originalEvent->getEndTimeZone()->getTimeZone()->getName()
170 : (new \DateTime())->getTimezone()->getName()
174 if ($this->originalEvent->getOriginalDateFrom() !==
null)
176 if ($this->originalEvent->isFullDayEvent())
178 $event[
'originalStartTime'][
'date'] = $this->originalEvent->getOriginalDateFrom()->format(Helper::DATE_FORMAT);
182 $event[
'originalStartTime'][
'dateTime'] = $this->originalEvent->getOriginalDateFrom()->format(Helper::DATE_TIME_FORMAT);
192 private function prepareReminders():
array
195 $reminders[
'useDefault'] =
false;
197 $remindCollection = $this->originalEvent->getRemindCollection();
198 if ($remindCollection && $remindCollection->count() > self::MAX_COUNT_REMINDERS_FOR_SYNC)
200 $remindCollection->sortFromStartEvent();
204 foreach ($remindCollection as $remind)
206 if (!$remind->isBeforeEventStart())
211 $reminders[
'overrides'][] = [
212 Remind::UNIT_MINUTES => $remind->getTimeBeforeStartInMinutes(),
216 if (
count($reminders[
'overrides']) >= self::MAX_COUNT_REMINDERS_FOR_SYNC)
231 private function prepareLocation(): string
233 if ($this->originalEvent->getLocation())
235 return \Bitrix\Calendar\Rooms\Util::getTextLocation((
string)$this->originalEvent->getLocation());
244 private function prepareVisibility(): string
246 return $this->originalEvent->isPrivate()
255 private function prepareRecurrenceRule():
array
259 if (!$this->originalEvent->isRecurrence())
264 $rule[] = $this->prepareDescriptionRecurrenceRule();
266 if ($this->originalEvent->getExcludedDateCollection() !==
null)
268 array_push($rule, ...$this->prepareExcludedDates());
277 public function prepareDescriptionRecurrenceRule(): string
280 $eventRule = $this->originalEvent->getRecurringRule();
281 $descriptionRule =
'RRULE:';
282 $descriptionRule .=
'FREQ=' . $eventRule->getFrequency();
283 $descriptionRule .=
';INTERVAL=' . $eventRule->getInterval();
285 if ($eventRule->hasDay())
287 $descriptionRule .=
';BYDAY=' . implode(
",", $eventRule->getByday());
290 if ($eventRule->hasCount())
292 $descriptionRule .=
';COUNT=' . $eventRule->getCount();
294 elseif ($eventRule->hasUntil())
296 $until = clone $eventRule->getUntil();
297 if (!$this->originalEvent->isFullDayEvent() && !$eventRule->isUntilEndOfTime())
299 $until = $until->add(
'1 day')->sub(
'1 second');
301 $descriptionRule .=
';UNTIL=' . $until->format(Helper::DATE_TIME_FORMAT_WITH_UTC_TIMEZONE);
304 return $descriptionRule;
310 public function prepareExcludedDates():
array
315 $this->originalEvent->getExcludedDateCollection()
316 && ($exdateCollection = $this->originalEvent->getExcludedDateCollection()->getDateCollectionNewerThanInterval())
319 $originalDateList = [];
320 if ($this->instanceCollection !==
null)
323 foreach ($this->instanceCollection as
$instance)
325 if ($originalDateFrom =
$instance->getEvent()->getOriginalDateFrom())
327 $originalDateList[] = $originalDateFrom->format(
'Ymd');
332 if ($this->originalEvent->isFullDayEvent())
334 foreach ($exdateCollection as $exDate)
336 $date = $exDate->format(
'Ymd');
337 if (!in_array($date, $originalDateList,
true))
339 $rule[] =
'EXDATE;VALUE=DATE:' . $date;
345 $postfix = (clone $this->originalEvent->getStart())
346 ->setTimezone(
new \DateTimeZone(
'UTC'))
347 ->format(
'\\THis\\Z')
350 foreach ($exdateCollection as $exDate)
352 $date = $exDate->format(
'Ymd');
353 if (!in_array($date, $originalDateList,
true))
355 $rule[] =
'EXDATE;TZID=UTC:' . $date . $postfix;
370 'sendUpdates' =>
'all',
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)