• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/office365/incomingmanager.php
  • Класс: Bitrix\Calendar\Sync\Office365\IncomingManager
  • Вызов: IncomingManager::getEvents
public function getEvents(SyncSection $syncSection): Result
{
	$syncEventMap = new SyncEventMap();
	$result = (new Result())->setData([
		'externalSyncEventMap' => $syncEventMap,
	]);
	$service = $this->context->getVendorSyncService();
	$this->lastSectionConnection = $syncSection->getSectionConnection();
	foreach ($service->getCalendarDelta($syncSection->getSectionConnection()) as $eventId => $eventPack)
	{
		/** @var EventDto $dto */
		if ($dto = ($eventPack[Helper::EVENT_TYPES['deleted']] ?? null))
		{
			$this->pushIntoSyncEventMap(
				$syncEventMap,
				$eventId,
				$this->prepareDeletedSyncEvent($dto, $syncSection),
				'delete' // change to dictionary constant
			);
		}
		elseif ($dto = ($eventPack[Helper::EVENT_TYPES['single']] ?? null))
		{
			$this->pushIntoSyncEventMap($syncEventMap, $eventId, $this->prepareSyncEvent($dto, $syncSection));
		}
		elseif ($dto = ($eventPack[Helper::EVENT_TYPES['series']] ?? null))
		{
			$master = $this->prepareSyncEvent($dto, $syncSection);
			$this->pushIntoSyncEventMap($syncEventMap, $eventId, $master);
			if ($master->getEvent()->getRecurringRule())
			{
				$master->getEvent()
					->setExcludedDateCollection(new Core\Event\Properties\ExcludedDatesCollection([]));
				if ($exceptions = ($eventPack[Helper::EVENT_TYPES['exception']] ?? null))
				{
					foreach ($exceptions as $exceptionDto)
					{
						$exception = $this->prepareSyncEvent($exceptionDto, $syncSection)
							->setAction(Dictionary::SYNC_EVENT_ACTION['create'])
						;
						$master->addInstance($exception);
					}
				}
				/** @var DateTimeDto[] $instances */
				$instances = array_map(function (DateTimeDto $val) use ($master) {
					$result = (new DateTime(
						$val->dateTime,
						new DateTimeZone($val->timeZone)
					))->setTimezone($master->getEvent()->getStartTimeZone()->getTimeZone());

					return $result->format('d.m.Y');
				}, ($eventPack[Helper::EVENT_TYPES['occurrence']] ?? []));
				$deltaPeriod = $this->context->getHelper()->getDeltaInterval();
				$computedInstances = (new Core\Event\Tools\Recurrence())->getEventOccurenceDates(
					$master->getEvent(),
					[
						'limitDateFrom' => $deltaPeriod['from'],
						'limitDateTo' => $deltaPeriod['to'],
					]
				);
				foreach ($computedInstances as $date => $dateTime)
				{
					if (!in_array($date, $instances))
					{
						$master->getEvent()->getExcludedDateCollection()->add(
							Core\Base\Date::createDateFromFormat($date, 'd.m.Y')
								->resetTime()
								->setDateTimeFormat('d.m.Y')
						);
					}
				}
			}
		}
	}

	return $result;
}