• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_event.php
  • Класс: CCalendarEvent
  • Вызов: CCalendarEvent::GetAbsent
static function GetAbsent($users = false, $params = [])
{
	// Can be called from agent... So we have to create $USER if it is not exists
	$tempUser = CCalendar::TempUser(false, true);
	$checkPermissions = $params['checkPermissions'] !== false;
	$curUserId = isset($params['userId']) ? (int)$params['userId'] : CCalendar::GetCurUserId();
	$arUsers = [];

	if ($users !== false && is_array($users))
	{
		foreach($users as $id)
		{
			if ($id > 0)
			{
				$arUsers[] = (int)$id;
			}
		}
		if (empty($arUsers))
		{
			$users = false;
		}
	}

	$arFilter = array(
		'DELETED' => 'N',
		'ACCESSIBILITY' => 'absent',
	);

	if ($users)
	{
		$arFilter['CREATED_BY'] = $users;
	}

	if (isset($params['fromLimit']))
	{
		$arFilter['FROM_LIMIT'] = CCalendar::Date(CCalendar::Timestamp($params['fromLimit'], false), true, false);
	}

	if (isset($params['toLimit']))
	{
		$arFilter['TO_LIMIT'] = CCalendar::Date(CCalendar::Timestamp($params['toLimit'], false), true, false);
	}

	$eventList = self::GetList(
		array(
			'arFilter' => $arFilter,
			'parseRecursion' => true,
			'getUserfields' => false,
			'fetchAttendees' => false,
			'userId' => $curUserId,
			'preciseLimits' => true,
			'checkPermissions' => false,
			'parseDescription' => false,
			'skipDeclined' => true
		)
	);

	//$bSocNet = Loader::includeModule("socialnetwork");
	$result = [];
	$settings = false;

	foreach($eventList as $event)
	{
		$userId = $event['CREATED_BY'];
		if ($users !== false && !in_array($userId, $arUsers))
		{
			continue;
		}

		//if ($bSocNet && !CSocNetFeatures::IsActiveFeature(SONET_ENTITY_USER, $userId, "calendar"))
		//	continue;

		if ($event['IS_MEETING'] && $event["MEETING_STATUS"] === 'N')
		{
			continue;
		}

		if (
			$checkPermissions
			&& ($event['CAL_TYPE'] !== 'user' || $curUserId !== (int)$event['OWNER_ID'])
			&& $curUserId !== (int)$event['CREATED_BY'])
		{
			$sectId = $event['SECT_ID'];
			if (empty($event['ACCESSIBILITY']))
			{
				$event['ACCESSIBILITY'] = 'busy';
			}

			if ($settings === false)
			{
				$settings = CCalendar::GetSettings(array('request' => false));
			}
			$private = $event['PRIVATE_EVENT'] && $event['CAL_TYPE'] === 'user';

			$accessController = new EventAccessController($userId);
			$eventModel = EventModel::createFromArray($event);
			$eventModel->setSectionId((int)$sectId);

			if ($private || !$accessController->check(ActionDictionary::ACTION_EVENT_VIEW_FULL, $eventModel))
			{
				$event = self::ApplyAccessRestrictions($event, $userId);
			}
		}

		$skipTime = $event['DT_SKIP_TIME'] === 'Y';
		$fromTs = CCalendar::Timestamp($event['DATE_FROM'], false, !$skipTime);
		$toTs = CCalendar::Timestamp($event['DATE_TO'], false, !$skipTime);
		if ($event['DT_SKIP_TIME'] !== 'Y')
		{
			$fromTs -= $event['~USER_OFFSET_FROM'];
			$toTs -= $event['~USER_OFFSET_TO'];
		}
		$result[] = array(
			'ID' => $event['ID'],
			'NAME' => $event['NAME'],
			'DATE_FROM' => CCalendar::Date($fromTs, !$skipTime, false),
			'DATE_TO' => CCalendar::Date($toTs, !$skipTime, false),
			'DT_FROM_TS' => $fromTs,
			'DT_TO_TS' => $toTs,
			'CREATED_BY' => $userId,
			'DETAIL_TEXT' => '',
			'USER_ID' => $userId
		);
	}

	// Sort by DATE_FROM_TS_UTC
	usort($result, static function($a, $b){
		if ($a['DT_FROM_TS'] === $b['DT_FROM_TS'])
		{
			return 0;
		}
		return $a['DT_FROM_TS'] < $b['DT_FROM_TS'] ? -1 : 1;
	});

	CCalendar::TempUser($tempUser, false);
	return $result;
}