• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/office365/eventmanager.php
  • Класс: Bitrix\Calendar\Sync\Office365\EventManager
  • Вызов: EventManager::saveRecurrence
public function saveRecurrence(
	SyncEvent $recurrenceEvent,
	SectionConnection $sectionConnection,
	Context $context
): Result
{
	$result = new Result();

	if ($recurrenceEvent->getEventConnection())
	{
		try
		{
			$masterResult = $this->updateRecurrenceInstance($recurrenceEvent, $context);
		}
		catch(Calendar\Sync\Exceptions\NotFoundException $e)
		{
			$this->getEventConnectionMapper()->delete($recurrenceEvent->getEventConnection());
			$recurrenceEvent->setEventConnection(null);
			return $this->saveRecurrence($recurrenceEvent, $sectionConnection, $context);
		}
	}
	else
	{
		$masterResult = $this->createRecurrenceInstance($recurrenceEvent, $sectionConnection, $context);
	}

	if (!$masterResult->isSuccess())
	{
		$result->addErrors($masterResult->getErrors());
		return $result;
	}

	if ($recurrenceEvent->getEventConnection())
	{
		$recurrenceEvent->getEventConnection()
			->setLastSyncStatus(Calendar\Sync\Dictionary::SYNC_STATUS['success']);
	}
	$recurrenceEvent
		->setAction(Calendar\Sync\Dictionary::SYNC_STATUS['success']);

	$excludes = $this->getExcludedDatesCollection($recurrenceEvent);
	if ($recurrenceEvent->getInstanceMap())
	{
		/** @var SyncEvent $instance */
		foreach ($recurrenceEvent->getInstanceMap()->getCollection() as $instance)
		{
			if ($instance->getEvent()->getOriginalDateFrom() === null)
			{
				$result->addError(
					new Main\Error('Instance is invalid - there is not original date from. ['.$instance->getEvent()->getId().']', 400));
				continue;
			}

			if ($instance->getEventConnection())
			{
				try
				{
					$instanceResult = $this->updateRecurrenceInstance($instance, $context, $recurrenceEvent->getEventConnection());
				}
				catch(Calendar\Sync\Exceptions\NotFoundException $e)
				{
					$this->getEventConnectionMapper()->delete($instance->getEventConnection());
					$instance->setEventConnection(null);
					$instanceResult = $this->createRecurrenceInstance(
						$instance,
						$sectionConnection,
						$context,
						$recurrenceEvent->getEventConnection()
					);
				}
			}
			else
			{
				$instanceResult = $this->createRecurrenceInstance(
					$instance,
					$sectionConnection,
					$context,
					$recurrenceEvent->getEventConnection()
				);
			}
			$excludes->removeDateFromCollection($instance->getEvent()->getOriginalDateFrom());
			if (
				$instance->getEvent()->getStart()->format('Ymd')
				!== $instance->getEvent()->getOriginalDateFrom()->format('Ymd')
			)
			{
				$excludes->removeDateFromCollection($instance->getEvent()->getStart());
			}
			if (!$instanceResult->isSuccess())
			{
				$result->addErrors($instanceResult->getErrors());
			}
			if ($instance->getEventConnection())
			{
				$instance->getEventConnection()->setLastSyncStatus(Calendar\Sync\Dictionary::SYNC_STATUS['success']);
			}
		}
	}

	if ($excludes->count() > 0)
	{
		$context = (new EventContext())->setEventConnection($recurrenceEvent->getEventConnection());
		/** @var Main\Type\Date $excludedDate */
		foreach ($excludes as $excludedDate)
		{
			$context->add('sync', 'excludeDate', $excludedDate);
			$this->deleteInstance($recurrenceEvent->getEvent(), $context);
		}
	}

	return $result;
}