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