• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/factories/syncsectionfactory.php
  • Класс: BitrixCalendarSyncFactoriesSyncSectionFactory
  • Вызов: SyncSectionFactory::getExternalSyncSectionMapByUserId
public function getExternalSyncSectionMapByUserId(
	int $userId,
	int $connectionId,
	SyncEntitiesSyncSectionMap $syncSectionMap,
	array $externalType
): void
{
	$sectionDb = SectionTable::query()
		->where('OWNER_ID', $userId)
		->whereIn('EXTERNAL_TYPE', $externalType)
		->where('CAL_TYPE', CoreRoleUser::TYPE)
		->registerRuntimeField('SECTION_CONNECTION',
			new ReferenceField(
				'SYNC_DATA',
				SectionConnectionTable::getEntity(),
				Join::on('ref.SECTION_ID', 'this.ID'),
				['join_type' => Join::TYPE_LEFT]
			)
		)
		->registerRuntimeField('CONNECTION',
			new ReferenceField(
				'CONNECTION',
				DavConnectionTable::getEntity(),
				Join::on('ref.ID', 'this.SECTION_CONNECTION.CONNECTION_ID'),
				['join_type' => Join::TYPE_LEFT]
			)
		)
		->setSelect([
			'ID',
			'NAME',
			'XML_ID',
			'ACTIVE',
			'DESCRIPTION',
			'COLOR',
			'CAL_TYPE',
			'OWNER_ID',
			'EXTERNAL_TYPE',
			'CONNECTION.ACCOUNT_TYPE',
			'SECTION_CONNECTION.*',
			'SECTION_CONNECTION.SECTION',
			'SECTION_CONNECTION.CONNECTION',
		])
		->exec()
	;

	while ($sectionDM = $sectionDb->fetchObject())
	{
		$sectionId = null;
		$syncSection = new SyncEntitiesSyncSection();

		$section = (new SectionBuilderFromDataManager($sectionDM))->build();
		$syncSection
			->setSection($section)
			->setAction('success')
		;

		/** @var EO_SectionConnection $sectionConnectionDM */
		if ($sectionConnectionDM = $sectionDM->get('SECTION_CONNECTION'))
		{
			$sectionConnection = (new SyncBuildersBuilderSectionConnectionFromDM($sectionConnectionDM))->build();
			if (
				($sectionConnection->getConnection() !== null)
				&& ($sectionConnection->getConnection()->getId() !== $connectionId)
			)
			{
				continue;
			}

			$sectionConnection->setSection($section);
			$syncSection->setSectionConnection($sectionConnection);
			$sectionId = $sectionConnection->getVendorSectionId();
		}
		else
		{
			continue;
		}

		/** @var EO_DavConnection $connectionDM */
		if ($sectionDM->getExternalType() !== Section::SECTION_TYPE_LOCAL && ($connectionDM = $sectionDM->get('CONNECTION')))
		{
			$syncSection->setVendorName($connectionDM->getAccountType());
		}
		else
		{
			$syncSection->setVendorName($sectionDM->getExternalType() ?? Section::SECTION_TYPE_LOCAL);
		}

		$sectionId = $sectionId ?? (string)$section->getId();

		$syncSectionMap->add($syncSection, $sectionId);
	}
}