77 $icalEvent = $this->icalComponent->getEvent();
78 $localEvent = Helper::getEventByUId($icalEvent->getUid());
79 if ($localEvent ===
null)
82 $parentId = $this->
saveEvent($preparedEvent);
83 $childEvent = EventTable::query()
84 ->setSelect([
'ID',
'PARENT_ID',
'OWNER_ID'])
85 ->where(
'PARENT_ID', $parentId)
86 ->where(
'OWNER_ID', $this->userId)
90 if ((
int)$childEvent[
'ID'] > 0)
92 $this->eventId = (int)$childEvent[
'ID'];
99 if ($this->
updateEvent($preparedEvent, $localEvent))
101 $this->eventId = $localEvent[
'ID'];
172 if ($icalEvent->getStart() !==
null)
174 if ($icalEvent->getStart()->getParameterValueByName(
'tzid') !==
null)
176 $event[
'DATE_FROM'] = Helper::getIcalDateTime(
177 $icalEvent->getStart()->getValue(),
178 $icalEvent->getStart()->getParameterValueByName(
'tzid')
182 $icalEvent->getStart()->getParameterValueByName(
'tzid')
187 $event[
'DATE_FROM'] = Helper::getIcalDate($icalEvent->getStart()->getValue())
191 $event[
'SKIP_TIME'] =
'Y';
195 if ($icalEvent->getEnd() !==
null)
197 if ($icalEvent->getEnd()->getParameterValueByName(
'tzid') !==
null)
199 $event[
'DATE_TO'] = Helper::getIcalDateTime(
200 $icalEvent->getEnd()->getValue(),
201 $icalEvent->getEnd()->getParameterValueByName(
'tzid')
204 $icalEvent->getEnd()->getParameterValueByName(
'tzid')
209 $event[
'DATE_TO'] = Helper::getIcalDate($icalEvent->getEnd()->getValue())
216 if ($icalEvent->getName() !==
null)
218 $event[
'NAME'] = !empty($icalEvent->getName()->getValue())
219 ? $icalEvent->getName()->getValue()
220 : Loc::getMessage(
'EC_DEFAULT_EVENT_NAME_V2')
224 if ($icalEvent->getUid() !==
null)
226 $event[
'DAV_XML_ID'] = $icalEvent->getUid();
229 if ($icalEvent->getModified() !==
null)
231 $event[
'TIMESTAMP_X'] = Helper::getIcalDateTime($icalEvent->getModified()->getValue())
235 if ($icalEvent->getCreated() !==
null)
237 $event[
'DATE_CREATE'] = Helper::getIcalDateTime($icalEvent->getCreated()->getValue())
241 if ($icalEvent->getDtStamp() !==
null)
243 $event[
'DT_STAMP'] = Helper::getIcalDateTime($icalEvent->getDtStamp()->getValue())
247 if ($icalEvent->getSequence() !==
null)
249 $event[
'VERSION'] = $icalEvent->getSequence()->getValue();
252 if ($icalEvent->getRRule() !==
null)
254 $rrule = $this->parseRRule($icalEvent->getRRule());
255 if (isset($rrule[
'FREQ']) && in_array($rrule[
'FREQ'], Dictionary::RRULE_FREQUENCY,
true))
257 $event[
'RRULE'][
'FREQ'] = $rrule[
'FREQ'];
259 if (isset($rrule[
'COUNT']) && (
int)$rrule[
'COUNT'] > 0)
261 $event[
'RRULE'][
'COUNT'] = $rrule[
'COUNT'];
263 elseif (isset($rrule[
'UNTIL']))
268 $until = Helper::getIcalDateTime($rrule[
'UNTIL']);
275 $until =
new DateTime($rrule[
'UNTIL']);
279 $until =
new DateTime(CCalendar::GetMaxDate());
283 if ($now < $until->getTimestamp())
285 $event[
'RRULE'][
'UNTIL'] = $until->format(Date::convertFormatToPhp(
FORMAT_DATE));
289 if ($rrule[
'FREQ'] === Dictionary::RRULE_FREQUENCY[
'weekly'] && isset($rrule[
'BYDAY']))
291 $event[
'RRULE'][
'BYDAY'] = $rrule[
'BYDAY'];
294 if (isset($rrule[
'INTERVAL']))
296 $event[
'RRULE'][
'INTERVAL'] = $rrule[
'INTERVAL'];
300 $event[
'RRULE'][
'INTERVAL'] = 1;
305 $event[
'DESCRIPTION'] = $icalEvent->getDescription() !==
null
306 ? $icalEvent->getDescription()->getValue()
311 $this->organizer = $this->
parseOrganizer($icalEvent->getOrganizer());
312 $event[
'MEETING_HOST'] = Helper::getUserIdByEmail($this->organizer);
316 $event[
'SECTION_CAL_TYPE'] =
'user';
317 $event[
'ATTENDEES_CODES'] = [
'U'.$event[
'OWNER_ID'],
'U'.$event[
'MEETING_HOST']];
321 $event[
'ACCESSIBILITY'] =
'free';
322 $event[
'IMPORTANCE'] =
'normal';
328 'HOST_NAME' => $icalEvent->getOrganizer() !==
null
329 ? $icalEvent->getOrganizer()->getParameterValueByName(
'cn')
330 : $this->organizer[
'EMAIL'],
334 'MEETING_CREATOR' =>
$event[
'MEETING_HOST'],
335 'EXTERNAL_TYPE' =>
'mail',
338 if ($this->decision ===
'declined')
340 $event[
'DELETED'] = self::SAFE_DELETED_YES;
343 if ($icalEvent->getLocation() !==
null)
345 $event[
'LOCATION'] = CCalendar::GetTextLocation($icalEvent->getLocation()->getValue() ??
null);
357 $preparedEvent[
'OWNER_ID'] = $preparedEvent[
'MEETING_HOST'];
358 $preparedEvent[
'MEETING'][
'MAILTO'] = $this->organizer[
'EMAIL'] ??
$this->emailTo;
361 if ($this->icalComponent->getEvent()->getAttendees())
363 $preparedEvent[
'DESCRIPTION'] .=
"\r\n"
364 . Loc::getMessage(
'EC_EDEV_GUESTS') .
": "
365 . $this->parseAttendeesForDescription($this->icalComponent->getEvent()->getAttendees());
368 if ($this->icalComponent->getEvent()->getAttachments())
370 $preparedEvent[
'DESCRIPTION'] .=
"\r\n"
371 . Loc::getMessage(
'EC_FILES_TITLE') .
': '
372 . $this->parseAttachmentsForDescription($this->icalComponent->getEvent()->getAttachments());
375 $id = (int)CCalendar::SaveEvent([
376 'arFields' => $preparedEvent,
377 'autoDetectSection' =>
true,
380 \CCalendarNotify::Send([
382 "name" => $preparedEvent[
'NAME'] ??
null,
383 "from" => $preparedEvent[
'DATE_FROM'] ??
null,
384 "to" => $preparedEvent[
'DATE_TO'] ??
null,
385 "location" => CCalendar::GetTextLocation($preparedEvent[
"LOCATION"] ??
null),
386 "guestId" => $this->userId ??
null,
388 "userId" => $preparedEvent[
'MEETING_HOST'],
389 "fields" => $preparedEvent,
391 \CCalendar::UpdateCounter([$this->userId], [$id]);
473 if ($icalEvent->getStart() !==
null)
475 if ($icalEvent->getStart()->getParameterValueByName(
'tzid') !==
null)
477 $event[
'DATE_FROM'] = Helper::getIcalDateTime(
478 $icalEvent->getStart()->getValue(),
479 $icalEvent->getStart()->getParameterValueByName(
'tzid')
482 $icalEvent->getStart()->getParameterValueByName(
'tzid')
484 $event[
'DT_SKIP_TIME'] =
'N';
485 $event[
'SKIP_TIME'] =
false;
489 $event[
'DATE_FROM'] = Helper::getIcalDate($icalEvent->getStart()->getValue())
492 $event[
'DT_SKIP_TIME'] =
'Y';
493 $event[
'SKIP_TIME'] =
true;
498 $event[
'DATE_FROM'] = $localEvent[
'DATE_FROM'];
499 $event[
'TZ_FROM'] = $localEvent[
'TZ_FROM'];
502 if ($icalEvent->getEnd() !==
null)
504 if ($icalEvent->getEnd()->getParameterValueByName(
'tzid') !==
null)
506 $event[
'DATE_TO'] = Helper::getIcalDateTime(
507 $icalEvent->getEnd()->getValue(),
508 $icalEvent->getEnd()->getParameterValueByName(
'tzid')
511 $icalEvent->getEnd()->getParameterValueByName(
'tzid')
516 $event[
'DATE_TO'] = Helper::getIcalDate($icalEvent->getEnd()->getValue())
524 $event[
'DATE_TO'] = $localEvent[
'DATE_TO'];
525 $event[
'TZ_TO'] = $localEvent[
'TZ_TO'];
528 if ($icalEvent->getName() !==
null)
530 $event[
'NAME'] = $icalEvent->getName()->getValue();
533 if ($icalEvent->getModified() !==
null)
535 $event[
'TIMESTAMP_X'] = Helper::getIcalDateTime($icalEvent->getModified()->getValue())
540 if ($icalEvent->getCreated() !==
null)
542 $invitationDateCreate = Helper::getIcalDateTime($icalEvent->getCreated()->getValue())->getTimestamp();
544 if ($invitationDateCreate === $localDateCreate)
546 $event[
'DATE_CREATE'] = Helper::getIcalDateTime($icalEvent->getCreated()->getValue())
552 if ($icalEvent->getDtStamp() !==
null)
554 $event[
'DT_STAMP'] = Helper::getIcalDateTime($icalEvent->getDtStamp()->getValue())
558 if ($icalEvent->getSequence() !==
null && $icalEvent->getSequence()->getValue() > $localEvent[
'VERSION'])
560 $event[
'VERSION'] = $icalEvent->getSequence()->getValue();
563 if ($icalEvent->getDescription() !==
null)
565 $event[
'DESCRIPTION'] = $icalEvent->getDescription()->getValue();
569 $event[
'DESCRIPTION'] =
null;
572 if ($icalEvent->getRRule() !==
null)
574 $rrule = $this->parseRRule($icalEvent->getRRule());
575 if (isset($rrule[
'FREQ']) && in_array($rrule[
'FREQ'], Dictionary::RRULE_FREQUENCY,
true))
577 $event[
'RRULE'][
'FREQ'] = $rrule[
'FREQ'];
579 if (isset($rrule[
'COUNT']) && (
int)$rrule[
'COUNT'] > 0)
581 $event[
'RRULE'][
'COUNT'] = $rrule[
'COUNT'];
583 elseif (isset($rrule[
'UNTIL']))
588 $until = Helper::getIcalDateTime($rrule[
'UNTIL']);
595 $until =
new DateTime($rrule[
'UNTIL']);
599 $until =
new DateTime(CCalendar::GetMaxDate());
603 if ($now < $until->getTimestamp())
605 $event[
'RRULE'][
'UNTIL'] = $until->format(Date::convertFormatToPhp(
FORMAT_DATE));
609 if ($rrule[
'FREQ'] === Dictionary::RRULE_FREQUENCY[
'weekly'] && isset($rrule[
'BYDAY']))
611 $event[
'RRULE'][
'BYDAY'] = $rrule[
'BYDAY'];
614 if (isset($rrule[
'INTERVAL']))
616 $event[
'RRULE'][
'INTERVAL'] = $rrule[
'INTERVAL'];
620 $event[
'RRULE'][
'INTERVAL'] = 1;
626 if ($icalEvent->getOrganizer() !==
null)
634 : $localEvent[
'MEETING_HOST']
637 $event[
'SECTION_CAL_TYPE'] =
'user';
638 $event[
'ATTENDEES_CODES'] = [
'U'.$event[
'OWNER_ID'],
'U'.$event[
'MEETING_HOST']];
639 $event[
'MEETING_STATUS'] = match ($this->decision) {
644 $event[
'ACCESSIBILITY'] =
'free';
645 $event[
'IMPORTANCE'] =
'normal';
650 $organizerCn = $icalEvent->getOrganizer()?->getParameterValueByName(
'cn');
651 $meeting = unserialize($localEvent[
'MEETING'], [
'allowed_classes' =>
false]);
653 'HOST_NAME' => $organizerCn ??
$organizer[
'EMAIL'] ?? $meeting[
'HOST_NAME'] ??
null,
654 'NOTIFY' => $meeting[
'NOTIFY'] ?? 1,
655 'REINVITE' => $meeting[
'REINVITE'] ?? 0,
656 'ALLOW_INVITE' => $meeting[
'ALLOW_INVITE'] ?? 0,
657 'MEETING_CREATOR' => $meeting[
'MEETING_CREATOR'] ??
$event[
'MEETING_HOST'],
658 'EXTERNAL_TYPE' =>
'mail',
660 $event[
'PARENT_ID'] = $localEvent[
'PARENT_ID'] ??
null;
661 $event[
'ID'] = $localEvent[
'ID'] ??
null;
662 $event[
'CAL_TYPE'] = $localEvent[
'CAL_TYPE'] ??
null;
664 if ($this->decision ===
'declined')
666 $event[
'DELETED'] = self::SAFE_DELETED_YES;
669 if ($icalEvent->getLocation() !==
null)
671 $event[
'LOCATION'] = CCalendar::GetTextLocation($icalEvent->getLocation()->getValue() ??
null);
684 $updatedEvent[
'ID'] = $updatedEvent[
'PARENT_ID'];
685 $updatedEvent[
'OWNER_ID'] = $updatedEvent[
'MEETING_HOST'];
686 $updatedEvent[
'MEETING'][
'MAILTO'] = $this->organizer[
'EMAIL'] ??
$this->emailTo;
689 if ($this->icalComponent->getEvent()->getAttendees())
691 $updatedEvent[
'DESCRIPTION'] .=
"\r\n"
692 . Loc::getMessage(
'EC_EDEV_GUESTS') .
": "
693 . $this->parseAttendeesForDescription($this->icalComponent->getEvent()->getAttendees());
696 if ($this->icalComponent->getEvent()->getAttachments())
698 $updatedEvent[
'DESCRIPTION'] .=
"\r\n"
699 . Loc::getMessage(
'EC_FILES_TITLE') .
': '
700 . $this->parseAttachmentsForDescription($this->icalComponent->getEvent()->getAttachments());
703 \CCalendar::SaveEvent([
704 'arFields' => $updatedEvent,
707 $entryChanges = \CCalendarEvent::CheckEntryChanges($updatedEvent, $localEvent);
709 \CCalendarNotify::Send([
710 'mode' =>
'change_notify',
711 'name' => $updatedEvent[
'NAME'] ??
null,
712 "from" => $updatedEvent[
'DATE_FROM'] ??
null,
713 "to" => $updatedEvent[
'DATE_TO'] ??
null,
714 "location" => CCalendar::GetTextLocation($updatedEvent[
"LOCATION"] ??
null),
715 "guestId" => $this->userId ??
null,
716 "eventId" => $updatedEvent[
'PARENT_ID'] ??
null,
717 "userId" => $updatedEvent[
'MEETING_HOST'],
718 "fields" => $updatedEvent,
719 "entryChanges" => $entryChanges,
721 \CCalendar::UpdateCounter([$this->userId], [$updatedEvent[
'ID']]);