• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_sync.php
  • Класс: CCalendarSync
  • Вызов: CCalendarSync::syncCalendarSections
static function syncCalendarSections($connectionType, $arCalendars, $entityType, $entityId, $connectionId = null): array
{
	//Array(
	//	[0] => Array(
	//		[XML_ID] => calendar
	//		[NAME] => calendar
	//	)
	//	[1] => Array(
	//		[XML_ID] => AQATAGFud...
	//		[NAME] => geewgvwe 1
	//		[DESCRIPTION] => gewgvewgvw
	//		[COLOR] => #FF0000
	//		[MODIFICATION_LABEL] => af720e7c7b6a
	//	)
	//)

	$result = [];
	if (
            $connectionType === BitrixCalendarSyncCaldavHelper::EXCHANGE_TYPE
		|| $connectionType === BitrixCalendarSyncCaldavHelper::CALDAV_TYPE
        )
	{
		CCalendar::SetSilentErrorMode();
		$entityType = mb_strtolower($entityType);
		$entityId = (int)$entityId;

		$tempUser = CCalendar::TempUser(false, true);
		$calendarNames = [];
		foreach ($arCalendars as $value)
		{
			$calendarNames[$value["XML_ID"]] = $value;
		}

		if ($connectionType === BitrixCalendarSyncCaldavHelper::CALDAV_TYPE)
		{
			$arFilter = [
				'CAL_TYPE' => $entityType,
				'OWNER_ID' => $entityId,
				'!CAL_DAV_CAL' => false,
				'CAL_DAV_CON' => $connectionId
			];
			$xmlIdField = "CAL_DAV_CAL";
			$xmlIdModLabel = "CAL_DAV_MOD";
		}
 			else // Exchange
		{
			$arFilter = [
				'CAL_TYPE' => $entityType,
				'OWNER_ID' => $entityId,
				'!DAV_EXCH_CAL' => false,
				'IS_EXCHANGE' => 1
			];
			$xmlIdField = "DAV_EXCH_CAL";
			$xmlIdModLabel = "DAV_EXCH_MOD";
		}

		$res = CCalendarSect::GetList([
			'arFilter' => $arFilter,
			'checkPermissions' => false,
			'getPermissions' => false
		]);

		foreach($res as $section)
		{
			$xmlId = $section[$xmlIdField];
			$modificationLabel = $section[$xmlIdModLabel];

			if (
				empty($xmlId)
				|| ($connectionType === BitrixCalendarSyncCaldavHelper::CALDAV_TYPE && $section['DAV_EXCH_CAL'])
			)
			{
				continue;
			}

			if (!array_key_exists($xmlId, $calendarNames))
			{
				CCalendarSect::Delete($section["ID"]);
			}
			else
			{
				if ($modificationLabel !== $calendarNames[$xmlId]["MODIFICATION_LABEL"])
				{
					CCalendarSect::Edit([
						'arFields' => [
							"ID" => $section["ID"],
							"NAME" => $calendarNames[$xmlId]["NAME"],
							"OWNER_ID" => $entityType === 'user' ? $entityId : 0,
							"CREATED_BY" => $entityType === 'user' ? $entityId : 0,
							"DESCRIPTION" => $calendarNames[$xmlId]["DESCRIPTION"],
							"COLOR" => $calendarNames[$xmlId]["COLOR"],
							$xmlIdModLabel => $calendarNames[$xmlId]["MODIFICATION_LABEL"],
						]
					]);
				}

				if (empty($modificationLabel) || ($modificationLabel !== $calendarNames[$xmlId]["MODIFICATION_LABEL"]))
				{
					$result[] = [
						"XML_ID" => $xmlId,
						"CALENDAR_ID" => [$section["ID"], $entityType, $entityId]
					];
				}

				unset($calendarNames[$xmlId]);
			}
		}

		foreach($calendarNames as $key => $value)
		{
			$arFields = [
				'CAL_TYPE' => $entityType,
				'OWNER_ID' => $entityId,
				'NAME' => $value["NAME"],
				'DESCRIPTION' => $value["DESCRIPTION"] ?? null,
				'COLOR' => $value["COLOR"] ?? null,
				'EXPORT' => ['ALLOW' => false],
				'CREATED_BY' => $entityType === 'user' ? $entityId : 0,
				'ACCESS' => [],
				'EXTERNAL_TYPE' => $connectionType,
				$xmlIdField => $key,
				$xmlIdModLabel => $value["MODIFICATION_LABEL"] ?? null
			];

			if ($connectionType === BitrixCalendarSyncCaldavHelper::CALDAV_TYPE)
			{
				$arFields["CAL_DAV_CON"] = $connectionId;
			}
			if ($entityType === 'user')
			{
				$arFields["CREATED_BY"] = $entityId;
			}
			if ($connectionType === BitrixCalendarSyncCaldavHelper::EXCHANGE_TYPE)
			{
				$arFields["IS_EXCHANGE"] = 1;
			}

			$id = (int)CCalendar::SaveSection(['arFields' => $arFields, 'bAffectToDav' => false]);
			if ($id)
			{
				$result[] =
					[
						"XML_ID" => $key,
						"CALENDAR_ID" => [
							$id,
							$entityType,
							$entityId
						]
					];
			}
		}

		CCalendar::TempUser($tempUser, false);
		CCalendar::SetSilentErrorMode(false);
	}

	return $result;
}