• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_sync.php
  • Класс: CCalendarSync
  • Вызов: CCalendarSync::DoSaveToDav
static function DoSaveToDav(&$arFields, $params = [], $event = false)
{
	// if (self::$doNotSendToGoogle)
	// {
	// 	return true;
	// }

	$sectionId = $params['sectionId'];
	$modeSync = $params['modeSync'];
	$parameters['editInstance'] = $params['editInstance'];
	// $parameters['originalDavXmlId'] = $params['originalDavXmlId'];
	// $parameters['editParentEvents'] = $params['editParentEvents'];
	// $parameters['editNextEvents'] = $params['editNextEvents'];
	// $parameters['instanceTz'] = $params['instanceTz'];
	$bExchange = $params['bExchange'];
	$bCalDav = $params['bCalDav'];
	$parameters['syncCaldav'] = $params['syncCaldav'];

	if (isset($event['DAV_XML_ID']))
	{
		$arFields['DAV_XML_ID'] = $event['DAV_XML_ID'];
	}
	if (isset($event['DAV_EXCH_LABEL']))
	{
		$arFields['DAV_EXCH_LABEL'] = $event['DAV_EXCH_LABEL'];
	}
	if (isset($event['CAL_DAV_LABEL']))
	{
		$arFields['CAL_DAV_LABEL'] = $event['CAL_DAV_LABEL'];
	}
	if (!isset($arFields['DATE_CREATE']) && isset($event['DATE_CREATE']))
	{
		$arFields['DATE_CREATE'] = $event['DATE_CREATE'];
	}
	if (!isset($arFields['G_EVENT_ID']) && isset($event['G_EVENT_ID']))
	{
		$arFields['G_EVENT_ID'] = $event['G_EVENT_ID'];
	}


	$section = CCalendarSect::GetById($sectionId, false);

	if ($event && (int)$event['SECT_ID'] !== (int)$sectionId)
	{
		$bCalDavCur = CCalendar::IsCalDAVEnabled() && $event['CAL_TYPE'] === 'user' && $event['CAL_DAV_LABEL'] <> '';
		$bExchangeEnabledCur = CCalendar::IsExchangeEnabled() && $event['CAL_TYPE'] === 'user';

		if ($bExchangeEnabledCur || $bCalDavCur)
		{
			$res = self::DoDeleteToDav(array(
				'bCalDav' => $bCalDavCur,
				'bExchangeEnabled' => $bExchangeEnabledCur,
				'sectionId' => $event['SECT_ID']
			), $event);

			if ($event['DAV_EXCH_LABEL'])
			{
				$event['DAV_EXCH_LABEL'] = '';
			}

			if ($res !== true)
			{
				return CCalendar::ThrowError($res);
			}

			//to save as a new event, not update an existing one
			$newSection = CCalendarSect::GetById($event['SECT_ID'], false);

			if ($section['CAL_DAV_CON'] === $newSection['CAL_DAV_CON']
				&& $section['ID'] !== $newSection['ID'])
			{
				unset($arFields['DAV_XML_ID']);
			}
		}
	}

	$arDavFields = $arFields;
	CCalendarEvent::CheckFields($arDavFields);

	if ($arDavFields['RRULE'] != '')
	{
		$arDavFields['RRULE'] = $arFields['RRULE'];
	}

	if ($arDavFields['LOCATION']['NEW'] !== '')
	{
		$arDavFields['LOCATION']['NEW'] = CCalendar::GetTextLocation($arDavFields['LOCATION']['NEW']);
	}
	$arDavFields['PROPERTY_IMPORTANCE'] = $arDavFields['IMPORTANCE'];
	$arDavFields['PROPERTY_LOCATION'] = $arDavFields['LOCATION']['NEW'];

	$arDavFields['PROPERTY_REMIND_SETTINGS'] = '';
	if (!empty($arFields['REMIND'][0]) && is_array($arFields['REMIND'][0]))
	{
		$arDavFields['PROPERTY_REMIND_SETTINGS'] = floatVal($arFields['REMIND'][0]['count'] ?? null)
			. '_' . $arFields['REMIND'][0]['type'];
	}

	if (isset($arDavFields['RRULE']['BYDAY']) && is_array($arDavFields['RRULE']['BYDAY']))
	{
		$arDavFields['RRULE']['BYDAY'] = implode(',',$arDavFields['RRULE']['BYDAY']);
	}

	// **** Synchronize with CalDav ****
	if ($bCalDav && ($section['CAL_DAV_CON'] ?? null) > 0 && empty($parameters['syncCaldav']))
	{
		// New event or move existent event to DAV calendar
		if ((int)($arFields['ID'] ?? null) <= 0 || ($event && empty($event['CAL_DAV_LABEL'])))
		{
			$DAVRes = CDavGroupdavClientCalendar::DoAddItem(
				$section['CAL_DAV_CON'],
				$section['CAL_DAV_CAL'] ?? null,
				$arDavFields
			);
		}
		else // Edit existent event
		{
			$DAVRes = CDavGroupdavClientCalendar::DoUpdateItem(
				$section['CAL_DAV_CON'],
				$section['CAL_DAV_CAL'] ?? null,
				$event['DAV_XML_ID'] ?? null,
				$event['CAL_DAV_LABEL'] ?? null,
				$arDavFields
			);
		}

		if (!is_array($DAVRes) || !isset($DAVRes['XML_ID']))
		{
			return CCalendar::CollectCalDAVErros($DAVRes);
		}

		// // It's ok, we successfuly save event to caldav calendar - and save it to DB
		$arFields['DAV_XML_ID'] = $DAVRes['XML_ID'];
		$arFields['CAL_DAV_LABEL'] = $DAVRes['MODIFICATION_LABEL'];
	}
	// **** Synchronize with Exchange ****
	elseif ($bExchange && $section['IS_EXCHANGE'] && $section['DAV_EXCH_CAL'] <> '' && $section['DAV_EXCH_CAL'] !== 0 && $modeSync)
	{
		$ownerId = $arFields['OWNER_ID'] ?? null;

		// Here we check if parent event was created in exchange calendar and if it is meeting
		// If yes, we expect that it was already created in MS Exchange server
		// and we don't need to dublicate this entry.
		if (
			self::isExchangeMeetingEnabled()
			&& ($arFields['IS_MEETING'] ?? null)
			&& ($arFields['MEETING_HOST'] ?? null) != $ownerId
			&& CCalendar::IsExchangeEnabled($arFields['MEETING_HOST'] ?? null)
		)
		{
			$parentEvent = CCalendarEvent::GetById($arFields['PARENT_ID']);
			if ($parentEvent['DAV_EXCH_LABEL'])
			{
				$parentSection = CCalendarSect::GetById($parentEvent['SECT_ID'], false);
				if (
					$parentSection['IS_EXCHANGE']
					&& $parentSection['DAV_EXCH_CAL'] <> ''
					&& $parentSection['DAV_EXCH_CAL'] !== 0)
				{
					return;
				}
			}
		}

		if (
			self::isExchangeMeetingEnabled()
			&& $arFields['IS_MEETING']
			&& (int)$arFields['MEETING_HOST'] === (int)$ownerId
			&& !empty($arFields['ATTENDEES'])
		)
		{
			$arDavFields['REQUIRED_ATTENDEES'] = self::GetExchangeEmailForUser($arFields['ATTENDEES']);
			if (empty($arDavFields['REQUIRED_ATTENDEES']))
			{
				unset($arDavFields['REQUIRED_ATTENDEES']);
			}
		}

		$fromTo = CCalendarEvent::GetEventFromToForUser($arDavFields, $ownerId);
		$arDavFields["DATE_FROM"] = $fromTo['DATE_FROM'];
		$arDavFields["DATE_TO"] = $fromTo['DATE_TO'];

		// Convert BBcode to HTML for exchange
		$arDavFields["DESCRIPTION"] = CCalendarEvent::ParseText($arDavFields['DESCRIPTION']);
		$updateEvent = !($params['editInstance']);

		if ($params['editParentEvents'] && !empty($arDavFields['RRULE']['UNTIL']))
		{
			$until = TypeDate::createFromTimestamp($arDavFields['DATE_TO_TS_UTC']);
			$arDavFields['DATE_TO_TS_UTC'] = $until->add('-1 day')->getTimestamp();
		}

		// New event  or move existent event to Exchange calendar
		if (
			(int)($arFields['ID'] ?? null) === 0
			|| ($event && !$event['DAV_EXCH_LABEL'] && $updateEvent)
		)
		{
			$exchRes = CDavExchangeCalendar::DoAddItem($ownerId, $section['DAV_EXCH_CAL'], $arDavFields);
		}
		else
		{
			$exchRes = CDavExchangeCalendar::DoUpdateItem($ownerId, $event['DAV_XML_ID'], $event['DAV_EXCH_LABEL'], $arDavFields, $params);
		}

		if (!is_array($exchRes) || !array_key_exists("XML_ID", $exchRes))
		{
			return CCalendar::CollectExchangeErrors($exchRes);
		}

		// It's ok, we successfuly save event to exchange calendar - and save it to DB
		$arFields['DAV_XML_ID'] = $exchRes['XML_ID'];
		$arFields['DAV_EXCH_LABEL'] = $exchRes['MODIFICATION_LABEL'];
	}

	return true;
}