• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_sect.php
  • Класс: CCalendarSect
  • Вызов: CCalendarSect::onCreateSync
static function onCreateSync(int $id, array $params): ?Result
{
	if (!Loader::includeModule('dav'))
	{
		return null;
	}

	$originalFrom = $params['params']['originalFrom'] ?? null;
	if ($originalFrom === ($params['sectionFields']['EXTERNAL_TYPE'] ?? null))
	{
		return null;
	}

	if (
		!empty($params['sectionFields']['EXTERNAL_TYPE'])
		&& (
			$params['sectionFields']['EXTERNAL_TYPE'] === BitrixCalendarSyncCaldavHelper::CALDAV_TYPE
			|| $params['sectionFields']['EXTERNAL_TYPE'] === BitrixCalendarSyncCaldavHelper::EXCHANGE_TYPE
		)
	)
	{
		return null;
	}

	if ($params['params']['arFields']['CAL_TYPE'] !== 'user')
	{
		return null;
	}

	/** @var BitrixCalendarCoreSectionSection $section */
	$section = (new BitrixCalendarCoreMappersSection())->getById($id);
	if (!$section)
	{
		return null;
	}

	$factories = FactoriesCollection::createByUserId($params['userId']);
	if ($factories->count() === 0)
	{
		return null;
	}

	$syncManager = new Synchronization($factories);
	$context = new Context([]);
	if (!empty($originalFrom))
	{
		$context->add('sync', 'originalFrom', $originalFrom);
	}

	$result = $syncManager->createSection($section, $context);

	// TODO: temporary. Need to move into separated method
	if ($result->isSuccess())
	{
		/** @var FactoryInterface $factory */
		foreach ($factories as $factory)
		{
			if ($factory->canSubscribeSection())
			{
				$outgoingManager = new BitrixCalendarSyncManagersOutgoingManager($factory->getConnection());
				/** @var Result $vendorResult */
				if (
					($vendorResult = $result->getData()[$factory->getCode()])
					&& $sectionConnection = $vendorResult->getData()['sectionConnection']
				)
				{
					$outgoingManager->subscribeSection($sectionConnection);
				}
			}
		}
	}


	return $result;
}