- Модуль: 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;
}