• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar.php
  • Класс: CCalendar
  • Вызов: CCalendar::syncChange
static function syncChange(int $id, array $arFields, array $params, ?array $curEvent): ?SyncUtilResult
{
	/** @var BitrixCalendarCoreMappersFactory $mapperFactory */
	$mapperFactory = ServiceLocator::getInstance()->get('calendar.service.mappers.factory');
	/** @var CoreEventEvent $event */
	$event = $mapperFactory->getEvent()->resetCacheById($id)->getById($id);
	if (!$event)
	{
		return null;
	}

	if (
		$curEvent
		&& !empty($curEvent['SECT_ID'])
		&& $event->getSection()
		&& (int)$curEvent['SECT_ID'] !== $event->getSection()->getId()
	)
	{
		return self::changeCalendarSync($event, $curEvent, $params);
	}

	$factories = FactoriesCollection::createBySection(
		$event->getSection()
	);

	if ($factories->count() === 0)
	{
		return null;
	}

	$syncManager = new Synchronization($factories);
	$context = new Context([]);

	if (
		$params['originalFrom']
		&& (int)$arFields['OWNER_ID'] === (int)$params['userId']
	)
	{
		$context->add('sync', 'originalFrom', $params['originalFrom']);

		$connection = (new BitrixCalendarCoreMappersConnection())->getMap([
			'=ACCOUNT_TYPE' => $params['originalFrom'],
			'=ENTITY_TYPE' => $event->getCalendarType(),
			'=ENTITY_ID' => $event->getOwner()->getId(),
		])->fetch();

		if ($connection)
		{
			$syncManager->upEventVersion(
				$event,
				$connection,
				$arFields['VERSION'] ?? 1
			);
		}
	}

	$pushManager = new SyncManagersPushManager();
	try
	{
		/** @var SyncFactoriesFactoryBase $factory */
		foreach ($factories as $factory)
		{
			$pushManager->unLockConnection($factory->getConnection());
			$pushManager->lockConnection($factory->getConnection(), 30);
		}
		if (($params['recursionEditMode'] ?? null) === 'skip')
		{
			if ($event->isInstance())
			{
				$params['editInstance'] = $event->isInstance();
				$params['modeSync'] = true;
			}

			if (!empty($params['modeSync']))
			{
				$recurrenceSyncMode = ($params['editInstance'] << 2)
					| ($params['editNextEvents'] << 1)
					| ($params['editEntryUntil'] << 1)
					| $params['editParentEvents']
				;
				switch ($recurrenceSyncMode)
				{
					case SyncDictionary::RECURRENCE_SYNC_MODE['exception']:
						if (
							(
								$event->getMeetingStatus() === 'H'
								&& !empty($params['editMeetingStatus'])
								&& $params['editMeetingStatus']['status'] === 'N'
							)
							||
							(
								$event->getMeetingStatus() !== 'N'
								&& (empty($params['editMeetingStatus']) || $params['editMeetingStatus']['status'] !== 'N')
							)
						)
						{
							$result = empty($curEvent)
								? $syncManager->createInstance($event, $context)
								: $syncManager->updateInstance($event, $context)
							;
						}
						break;
					case SyncDictionary::RECURRENCE_SYNC_MODE['deleteInstance']:
						$context->add('diff', 'EXDATE', $curEvent['EXDATE']);
						$result = $syncManager->deleteInstance($event, $context);
						break;
					default:
						if ($event->getMeetingStatus() !== 'N')
						{
							$result = empty($curEvent)
								? $syncManager->createEvent($event, $context)
								: $syncManager->updateEvent($event, $context)
							;
						}
				}
			}
		}
		elseif (empty($curEvent))
		{
			if ($event->isInstance())
			{
				$attendeeMasterEvent = $mapperFactory->getEvent()->getMap([
					'=PARENT_ID' => $event->getRecurrenceId(),
					'=OWNER_ID' => $event->getOwner()->getId(),
					'=CAL_TYPE' => 'user'
				])->fetch();

				if ($attendeeMasterEvent)
				{
					$result = $syncManager->reCreateRecurrence($attendeeMasterEvent, $context);
				}
				else
				{
					$result =  (new SyncUtilResult())
						->addError(new MainError("Master event not found", 404));
				}
			}
			else
			{
				$result = $syncManager->createEvent($event, $context);
			}
		}
		else
		{
			$syncManager->updateEvent($event, $context);
		}
	}
	catch(Throwable $e)
	{
	    throw $e;
	}
	finally
	{
		/** @var SyncFactoriesFactoryBase $factory */
		foreach ($factories as $factory)
		{
			// TODO: try to use it
			// $pushManager->unLockConnection($factory->getConnection());
		}
	}

	return $result ?? null;
}