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