• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/managers/datasyncmanager.php
  • Класс: BitrixCalendarSyncManagersDataSyncManager
  • Вызов: DataSyncManager::syncCalendarEvents
private function syncCalendarEvents(
	Connection $connection,
	int $sectionId,
	array $events
): array
{
	$linksMap = [];
	$result = [];

	$eventsLink = EventConnectionTable::query()
		->setSelect([
            'EVENT_CONNECTION_ID' => 'ID',
            'VENDOR_EVENT_ID',
            'VERSION',
            'ENTITY_TAG',
            'EVENT_ID',
			'IS_MEETING' => 'EVENT.IS_MEETING',
            'MEETING' => 'EVENT.MEETING',
            'EXDATE' => 'EVENT.EXDATE',
            'EVENT_PARENT_ID' => 'EVENT.PARENT_ID',
            'EVENT_TYPE' => 'EVENT.EVENT_TYPE',
            'EVENT_NAME' => 'EVENT.NAME',
            'EVENT_OWNER_ID' => 'EVENT.OWNER_ID',
			'EVENT_DATE_FROM' => 'EVENT.DATE_FROM',
			'EVENT_DATE_TO' => 'EVENT.DATE_TO',
			'EVENT_TZ_FROM' => 'EVENT.TZ_FROM',
			'EVENT_TZ_TO' => 'EVENT.TZ_TO',
			'EVENT_VERSION' => 'EVENT.VERSION',
            'ATTENDEES_CODES' => 'EVENT.ATTENDEES_CODES',
            'ACCESSIBILITY' => 'EVENT.ACCESSIBILITY',
		])
		->where('EVENT.CAL_TYPE', self::ENTITY_TYPE)
		->where('EVENT.OWNER_ID', $connection->getOwner()->getId())
		->where('EVENT.SECTION_ID', $sectionId)
		->where('EVENT.DELETED', 'N')
		->where(Query::filter()
			->logic('or')
			->whereNot('EVENT.MEETING_STATUS', 'N')
			->whereNull('EVENT.MEETING_STATUS')
		)
		->whereNotNull('ENTITY_TAG')
		->exec()
	;

	while ($event = $eventsLink->fetch())
	{
		$linksMap[$event['VENDOR_EVENT_ID']] = $event;
	}

	foreach ($events as $index => $event)
	{
		if (!empty($linksMap[$event['XML_ID']]))
		{
			$existEvent = $linksMap[$event['XML_ID']];

			if (($existEvent['ENTITY_TAG'] ?? null) === ($event['SYNC_TOKEN'] ?? null))
			{
				continue;
			}
			if ($this->isBlockedChange($existEvent, $event))
			{
				continue;
			}

			if ((int)$event['STATUS'] === 200)
			{
				if (($linksMap[$event['XML_ID']]['ENTITY_TAG'] ?? null) !== ($event['SYNC_TOKEN'] ?? null))
				{
					$result[] = $this->prepareExistedEventParams($event['XML_ID'], $linksMap[$event['XML_ID']]);
				}
				else
				{
					unset($events[$index]);
				}
			}
			else if ((int)$event['STATUS'] === 404)
			{
				CCalendar::DeleteEvent(
					$linksMap[$event['XML_ID']]['EVENT_ID'],
					false,
					[
						'markDeleted' => true,
						'originalFrom' => $connection->getVendor()->getCode(),
						'checkPermissions' => false,
					]
				);

				EventConnectionTable::delete($linksMap[$event['XML_ID']]['EVENT_CONNECTION_ID']);
			}
		}
		else if (!empty($event['SYNC_TOKEN']) && (int)$event['STATUS'] === 200)
		{
			$result[] = $this->prepareExistedEventParams($event['XML_ID']);
		}
	}

	return $result;
}