- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/lib/sync/managers/datasyncmanager.php
- Класс: BitrixCalendarSyncManagersDataSyncManager
- Вызов: DataSyncManager::modifyRecurrenceEvent
private function modifyRecurrenceEvent(
Connection $connection,
array $importInstances,
array $additionalParams
): void
{
[$importInstances, $importedInstancesDates] = $this->prepareInstanceEvents($importInstances);
$parentEvent = CCalendarEvent::GetById($additionalParams['PARENT_ID']);
if ($parentEvent && CCalendarEvent::CheckRecurcion($parentEvent))
{
$exDates = CCalendarEvent::GetExDate($parentEvent['EXDATE']);
$localInstances = EventConnectionTable::query()
->setSelect([
'EVENT_ID',
'VERSION',
'DATE_FROM' => 'EVENT.DATE_FROM',
'EVENT_CONNECTION_ID' => 'ID',
'MEETING' => 'EVENT.MEETING',
'IS_MEETING' => 'EVENT.IS_MEETING',
'MEETING_HOST' => 'EVENT.MEETING_HOST',
'ATTENDEES_CODES' => 'EVENT.ATTENDEES_CODES',
'ACCESSIBILITY' => 'EVENT.ACCESSIBILITY',
])
->where('EVENT.RECURRENCE_ID', $additionalParams['PARENT_ID'])
->where('EVENT.DELETED', 'N')
->where('EVENT.OWNER_ID', $connection->getOwner()->getId())
->whereNot('EVENT.MEETING_STATUS', 'N')
->exec()
;
$importedInstancesCount = count($importInstances);
while ($localInstance = $localInstances->fetch())
{
$isActive = false;
$localInstanceDate = CCalendar::Date(CCalendar::Timestamp($localInstance['DATE_FROM']), false);
for ($i = 0; $i < $importedInstancesCount; $i++)
{
if ($localInstanceDate === $importedInstancesDates[$i])
{
$this->mergeInstanceParams($importInstances[$i], $localInstance);
$isActive = true;
break;
}
}
if (!$isActive)
{
CCalendarEvent::Delete([
'id' => $localInstance['EVENT_ID'],
'bMarkDeleted' => true,
'bAffectToDav' => false,
'originalFrom' => $connection->getVendor()->getCode(),
'userId' => $connection->getOwner()->getId(),
]);
EventConnectionTable::delete($localInstance['EVENT_CONNECTION_ID']);
}
}
foreach ($importInstances as $instance)
{
if (
$additionalParams['PERIOD_UNTIL']
&& CCalendar::Timestamp($instance['DATE_FROM']) > CCalendar::Timestamp($additionalParams['PERIOD_UNTIL'])
)
{
continue;
}
$instance = $this->addParentDataToInstance($instance, $parentEvent);
if ($instance && $instance['RECURRENCE_ID'])
{
unset($instance['RRULE'], $instance['EXDATE']);
$this->modifySingleEvent(
$connection,
$instance,
[
'SECTION_ID' => $additionalParams['SECTION_ID'],
'VERSION' => $instance['VERSION'] ?? 1,
'EVENT_CONNECTION_ID' => $instance['EVENT_CONNECTION_ID'] ?? 0,
]
);
if (!empty($instance['RECURRENCE_ID_DATE']))
{
$exDates[] = CCalendar::Date(CCalendar::Timestamp($instance['RECURRENCE_ID_DATE']), false);
}
}
}
$exDate = CCalendarEvent::SetExDate($exDates);
$eventIdList = $this->getAllEventByParentId($parentEvent['ID']);
EventTable::updateMulti($eventIdList, ['EXDATE' => $exDate]);
}
}