- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/lib/sync/googleapisync.php
- Класс: BitrixCalendarSyncGoogleApiSync
- Вызов: GoogleApiSync::prepareEvent
private function prepareEvent($event): array
{
$returnData = [
'TZ_FROM' => $this->defaultTimezone,
'TZ_TO' => $this->defaultTimezone
];
foreach ($this->eventMapping as $internalKey => $externalKey)
{
$returnData[$internalKey] = (isset($event[$externalKey]) ? $event[$externalKey] : '');
}
$returnData['iCalUID'] = $event['iCalUID'];
$returnData['DAV_XML_ID'] = $event['iCalUID'];
$returnData['G_EVENT_ID'] = $event['id'];
if (!empty($event['description']))
{
$description = str_replace("
", "rn", $event['description']);
$returnData["DESCRIPTION"] = trim(CTextParser::clearAllTags($description));
}
if (empty($event['summary']))
{
$returnData['NAME'] = GetMessage('EC_T_NEW_EVENT');
}
if (!empty($event['transparency']) && $event['transparency'] == 'transparent')
{
$returnData['ACCESSIBILITY'] = 'free';
}
else
{
$returnData['ACCESSIBILITY'] = 'busy';
}
if (!empty($event['visibility']) && $event['visibility'] === 'private')
{
$returnData['PRIVATE_EVENT'] = true;
}
else
{
$returnData['PRIVATE_EVENT'] = false;
}
$returnData['OWNER_ID'] = $this->userId;
$returnData['CREATED_BY'] = $this->userId;
$returnData['CAL_TYPE'] = 'user';
if (!empty($event['start']['dateTime']) && !empty($event['end']['dateTime']))
{
$returnData['TZ_FROM'] = Util::isTimezoneValid($event['start']['timeZone']) ? $event['start']['timeZone'] : $this->defaultTimezone;
$returnData['TZ_TO'] = Util::isTimezoneValid($event['end']['timeZone']) ? $event['end']['timeZone'] : $this->defaultTimezone;
$eventStartDateTime = new TypeDateTime($event['start']['dateTime'], self::DATE_TIME_FORMAT, new DateTimeZone($this->defaultTimezone));
$returnData['DATE_FROM'] = CCalendar::Date(CCalendar::Timestamp($eventStartDateTime->setTimeZone(new DateTimeZone($returnData['TZ_FROM']))->format(TypeDate::convertFormatToPhp(FORMAT_DATETIME))));
$eventStartDateTime = new TypeDateTime($event['end']['dateTime'], self::DATE_TIME_FORMAT, new DateTimeZone($this->defaultTimezone));
$returnData['DATE_TO'] = CCalendar::Date(CCalendar::Timestamp($eventStartDateTime->setTimeZone(new DateTimeZone($returnData['TZ_TO']))->format(TypeDate::convertFormatToPhp(FORMAT_DATETIME))));
}
if (!empty($event['start']['date']))
{
$returnData['DATE_FROM'] = CCalendar::Date(strtotime($event['start']['date']), false);
}
if (!empty($event['end']['date']))
{
if ($event['end']['date'] === $event['start']['date'])
{
$dateStr = strtotime($event['end']['date']);
}
else
{
$dateStr = strtotime($event['end']['date']) - self::ONE_DAY;
}
$returnData['DATE_TO'] = CCalendar::Date($dateStr, false);
$returnData['DT_SKIP_TIME'] = 'Y';
}
else
{
$returnData['DT_SKIP_TIME'] = 'N';
}
$returnData['DATE_CREATE'] = CCalendar::Date(strtotime($event['created']));
if (!empty($event['colorId']))
{
$returnData['COLOR'] = $this->getEventColor($event['colorId']);
$returnData['TEXT_COLOR'] = $this->getEventColor($event['colorId'], false);
}
$returnData['DATE_CREATE'] = CCalendar::Date(time());
$returnData['status'] = $event['status'];
$returnData['hasMoved'] = "N";
$returnData['isRecurring'] = "N";
$exDates = [];
if ($event['recurrence'])
{
foreach ($event['recurrence'] as $recurrence)
{
if (preg_match('/(RRULE)/', $recurrence))
{
$rRuleData = preg_replace('/(RRULE:)/', '', $recurrence);
$rRuleList = explode(';', $rRuleData);
$rRuleSet = [];
foreach ($rRuleList as $rRuleElement)
{
[$rRuleProp, $rRuleVal] = explode('=', $rRuleElement);
switch ($rRuleProp)
{
case 'FREQ':
if (in_array($rRuleVal, ['HOURLY', 'DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY']))
{
$rRuleSet['FREQ'] = $rRuleVal;
}
break;
case 'COUNT':
$rRuleSet['COUNT'] = $rRuleVal;
break;
case 'INTERVAL':
$rRuleSet['INTERVAL'] = $rRuleVal;
break;
case 'BYDAY':
$rRuleByDay = array();
foreach(explode(',', $rRuleVal) as $day)
{
$matches = array();
if (preg_match('/((-|+)?d+)?(MO|TU|WE|TH|FR|SA|SU)/', $day, $matches))
{
$rRuleByDay[$matches[1] === ''
? $matches[3]
: $matches[1]] =
$matches[1] === ''
? $matches[3]
: $matches[1];
}
}
if (!empty($rRuleByDay))
{
$rRuleSet['BYDAY'] = $rRuleByDay;
}
break;
case 'UNTIL':
try
{
$rRuleValDateTime = new TypeDateTime($rRuleVal, 'YmdTHisZ', new DateTimeZone('UTC'));
$rRuleValDateTime->setTimeZone(new DateTimeZone($returnData['TZ_TO']));
$untilDateTime = explode("T", $rRuleVal);
if ($untilDateTime[1] === "000000Z")
{
$rRuleValDateTime = $rRuleValDateTime->add("-1 day");
}
$rRuleSet['UNTIL'] = CCalendar::Date(CCalendar::Timestamp($rRuleValDateTime->format(TypeDate::convertFormatToPhp(FORMAT_DATETIME))) - 60, false, false);
}
catch(Exception $e)
{
$rRuleSet['UNTIL'] = CCalendar::Date(strtotime($rRuleVal), false, false);
}
break;
}
}
$returnData["RRULE"] = CCalendarEvent::CheckRRULE($rRuleSet);
}
elseif (preg_match('/(d{4}-?d{2}-?d{2})(Z)?/', $recurrence, $date))
{
if (!empty($date[1]))
{
$exDates[] = CCalendar::Date(strtotime($date[1]), false);
}
}
}
}
if (!empty($event['recurringEventId']))
{
$returnData['isRecurring'] = "Y";
if ($event['status'] === 'cancelled')
{
$exDates[] = date(Date::convertFormatToPhp(FORMAT_DATE), strtotime(
!empty($event['originalStartTime']['dateTime'])
? $event['originalStartTime']['dateTime']
: $event['originalStartTime']['date']
));
}
elseif ($event['status'] === 'confirmed' && !empty($event['originalStartTime']))
{
$returnData['hasMoved'] = "Y";
$exDates[] = date(Date::convertFormatToPhp(FORMAT_DATE), strtotime(!empty($event['originalStartTime']['dateTime']) ? $event['originalStartTime']['dateTime'] : $event['originalStartTime']['date']));
if (!empty($event['originalStartTime']['dateTime']))
{
$originalTimeZone = Util::isTimezoneValid($event['originalStartTime']['timeZone']) ? $event['originalStartTime']['timeZone'] : $returnData['TZ_FROM'];
$eventOriginalDateFrom = new TypeDateTime($event['originalStartTime']['dateTime'], self::DATE_TIME_FORMAT, new DateTimeZone($this->defaultTimezone));
$returnData['ORIGINAL_DATE_FROM'] = CCalendar::Date(CCalendar::Timestamp($eventOriginalDateFrom->setTimeZone(new DateTimeZone($originalTimeZone))->format(TypeDate::convertFormatToPhp(FORMAT_DATETIME))));
}
if (!empty($event['originalStartTime']['date']))
{
$returnData['ORIGINAL_DATE_FROM'] = CCalendar::Date(strtotime($event['originalStartTime']['date']), false);
}
}
$returnData['recurringEventId'] = $event['recurringEventId'];
}
if (!empty($exDates))
{
$returnData['EXDATE'] = implode(';', $exDates);
}
$returnData['REMIND'] = [];
if (!empty($event['reminders']['overrides']))
{
foreach ($event['reminders']['overrides'] as $remindData)
{
$remindTimeout = $remindData['minutes'];
$returnData['REMIND'][] = [
'type' => 'min',
'count' => $remindTimeout
];
}
}
if (!empty($event['reminders']['useDefault']) && !empty($this->defaultReminderData) && $event['reminders']['useDefault'] === 1)
{
foreach ($this->defaultReminderData as $remindData)
{
$remindTimeout = $remindData['minutes'];
$returnData['REMIND'][] = [
'type' => 'min',
'count' => $remindTimeout
];
}
}
if (!empty($event['location']))
{
$returnData['LOCATION'] = RoomsUtil::unParseTextLocation($event['location']);
}
if (!empty($event['sequence']))
{
$returnData['VERSION'] = (int)$event['sequence'] + Util::VERSION_DIFFERENCE;
}
return $returnData;
}