• Модуль: 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; }