45 $this->connection = $connection;
46 $this->syncSection = $syncSection;
74 $owner = $this->syncSection->getSection()->getOwner();
76 ->setName($this->getName())
77 ->setUid($this->item[
'iCalUID'])
78 ->setSection($this->syncSection->getSection())
81 ->setEventHost($owner)
82 ->setAttendeesCollection($this->getAttendeeCollection($owner->getId()))
83 ->setMeetingDescription($this->getDefaultMeeting($owner->getId()))
84 ->setDescription($this->getDescription())
85 ->setLocation($this->getLocation())
86 ->setColor($this->item[
'colorId'] ??
null)
90 if (!empty($this->item[
'start']))
92 if (!empty($this->item[
'start'][
'date']))
94 $event->setIsFullDay(
true);
95 $date =
new Type\Date($this->item[
'start'][
'date'], \DateTimeInterface::ATOM);
98 elseif (!empty($this->item[
'start'][
'dateTime']))
100 $event->setIsFullDay(
false);
103 $this->item[
'start'][
'dateTime'],
104 \DateTimeInterface::ATOM,
107 $date->setTimeZone($timeZone);
114 if (!empty($this->item[
'end']))
116 if (!empty($this->item[
'end'][
'date']))
118 $date =
new Type\Date($this->item[
'end'][
'date'], \DateTimeInterface::ATOM);
121 elseif (!empty($this->item[
'end'][
'dateTime']))
125 $this->item[
'end'][
'dateTime'],
126 \DateTimeInterface::ATOM,
129 $date->setTimeZone($timeZone);
136 if (isset($this->item[
'transparency']) && ($this->item[
'transparency'] ===
'transparent'))
138 $event->setAccessibility(
'free');
141 if (isset($this->item[
'visibility']) && $this->item[
'visibility'] ===
'private')
143 $event->setIsPrivate(
true);
146 if (!empty($this->item[
'reminders']))
148 $event->setRemindCollection($this->getReminders(
$event->getStart()));
151 $event->setRecurringRule($this->prepareRecurringRule(
$event->getStart()));
152 $event->setExcludedDateCollection($this->prepareExcludedDatesCollection());
166 ->setConnection($this->connection)
167 ->setEntityTag($this->item[
'etag'] ??
null)
168 ->setVendorEventId($this->item[
'id'] ??
null)
169 ->setVendorVersionId($this->item[
'etag'] ??
null)
170 ->setVersion(($this->item[
'sequence'] ?? 0))
172 ->setRecurrenceId($this->item[
'recurringEventId'] ??
null)
174 ->setData($this->getEventConnectionData(
$event))
184 if (empty($this->item[
'recurrence']))
188 foreach ($this->item[
'recurrence'] as $row)
190 if (strpos($row,
'RRULE:') === 0)
194 $rules = explode(
';', substr($row, 6));
196 foreach ($rules as $rule)
202 [
$name, $value] = explode(
'=', $rule);
204 if (empty(
$name) || empty($value))
209 $rrule[
$name] = $value;
212 if (!empty($rrule[
'FREQ']) && in_array($rrule[
'FREQ'], RecurringEventRules::FREQUENCY,
true))
214 $property =
new RecurringEventRules($rrule[
'FREQ']);
221 if (!empty($rrule[
'COUNT']))
223 $property->setCount((
int)$rrule[
'COUNT']);
225 if (!empty($rrule[
'INTERVAL']))
227 $property->setInterval((
int)$rrule[
'INTERVAL']);
229 if (!empty($rrule[
'UNTIL']))
233 $phpDate = new \DateTime($rrule[
'UNTIL']);
234 $date =
new Core\Base\Date(Type\DateTime::createFromPhp($phpDate));
236 $property->setUntil($date);
238 catch (\Exception $e)
243 if ($rrule[
'FREQ'] === RecurringEventRules::FREQUENCY_WEEKLY)
245 if (!empty($rrule[
'BYDAY']))
247 $property->setByDay(explode(
',', $rrule[
'BYDAY']));
251 $dayOfWeek =
$start->format(
'w');
252 $day = \CCalendar::WeekDayByInd($dayOfWeek);
255 $property->setByDay([$day]);
271 private function prepareExcludedDatesCollection(): ?ExcludedDatesCollection
273 if (empty($this->item[
'recurrence']))
278 $exDatesCollection =
new ExcludedDatesCollection();
279 foreach ($this->item[
'recurrence'] as $row)
281 if (strpos($row,
'EXDATE;') === 0)
283 $exDate = explode(
':', substr($row, 7));
285 if ($exDate[0] ===
'VALUE=DATE-TIME')
287 $date = Core\Base\Date::createDateTimeFromFormat(
289 Sync\Google\Helper::EXCLUDED_DATE_TIME_FORMAT
294 $exDatesCollection->add($date);
297 else if ($exDate[0] ===
'VALUE=DATE')
299 $date = Core\Base\Date::createDateTimeFromFormat(
301 Sync\Google\Helper::EXCLUDED_DATE_FORMAT
306 $exDatesCollection->add($date);
312 if ($exDatesCollection->count())
314 return $exDatesCollection;
326 if (!empty($this->item[
'originalStartTime']))
328 if (!empty($this->item[
'originalStartTime'][
'dateTime']))
331 $this->item[
'originalStartTime'][
'dateTime'],
332 \DateTimeInterface::ATOM
336 if (!empty($this->item[
'originalStartTime'][
'date']))
339 $this->item[
'originalStartTime'][
'date'],
353 if (!empty($this->item[
'location']))
355 $parsedLocation = \Bitrix\Calendar\Rooms\Util::unParseTextLocation($this->item[
'location']);
366 private function getDescription(): string
368 if (!empty($this->item[
'description']))
370 $languageId = \CCalendar::getUserLanguageId($this->syncSection->getSection()->getOwner()->getId());
371 $this->item[
'description'] = \CCalendar::ParseHTMLToBB($this->item[
'description']);
373 return (
new Sync\
Util\EventDescription())->prepareAfterImport($this->item[
'description'], $languageId);
383 private function getReminders(Core\Base\Date
$start): RemindCollection
385 $collection =
new RemindCollection();
386 $collection->setEventStart(
$start);
388 if (!empty($this->item[
'reminders'][
'overrides']) && is_array($this->item[
'reminders'][
'overrides']))
390 foreach ($this->item[
'reminders'][
'overrides'] as $remind)
392 $collection->add((
new Core\Event\Properties\Remind())
393 ->setTimeBeforeEvent($remind[
'minutes'])
399 if (!empty($this->item[
'reminders'][
'useDefault']))
401 $collection->add((
new Core\Event\Properties\Remind())
402 ->setTimeBeforeEvent(30)
413 private function getName()
415 if (empty($this->item[
'summary']))
418 $this->item[
'summary'] = Loc::getMessage(
'EC_DEFAULT_ENTRY_NAME');
421 return $this->item[
'summary'];
429 private function getAttendeeCollection(
int $userId): AttendeeCollection
431 return (
new AttendeeCollection())
432 ->setAttendeesCodes([
'U' .
$userId])
441 private function getDefaultMeeting(
int $userId): MeetingDescription
443 return (
new MeetingDescription())
444 ->setHostName(\CCalendar::GetUserName(
$userId))
447 ->setAllowInvite(
false)
449 ->setHideGuests(
true)
450 ->setLanguageId(\CCalendar::getUserLanguageId(
$userId))
459 private function getEventConnectionData(Core\Event\Event
$event):
array
462 if (!empty($this->item[
'attendees']))
464 $data[
'attendees'] = $this->item[
'attendees'];
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)