• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_planner.php
  • Класс: CCalendarPlanner
  • Вызов: CCalendarPlanner::prepareData
static function prepareData($params = [])
{
	$curEventId = (int)($params['entry_id'] ?? null);
	$curUserId = (int)($params['user_id'] ?? null);
	$hostUserId = (int)($params['host_id'] ?? null);

	$isPlannerFeatureEnabled = Bitrix24Manager::isPlannerFeatureEnabled();

	$skipEntryList = (isset($params['skipEntryList']) && is_array($params['skipEntryList']))
		? $params['skipEntryList']
		: [];

	$resourceIdList = [];
	$userIds = [];
	$users = [];
	$result = [
		'users' => [],
		'entries' => [],
		'accessibility' => []
	];

	if (isset($params['codes']) && is_array($params['codes']))
	{
		$params['codes'] = array_unique($params['codes']);
		$users = CCalendar::GetDestinationUsers($params['codes'], true);
	}

	$prevUsersId = (isset($params['prevUserList']) && is_array($params['prevUserList']))
		? array_unique(array_map('intval', $params['prevUserList']))
		: [];

	if (!empty($users))
	{
		foreach($users as $user)
		{
			if (!in_array((int)$user['USER_ID'], $prevUsersId, true))
			{
				$userIds[] = (int)$user['USER_ID'];
			}

			$status = (($hostUserId && $hostUserId === (int)$user['USER_ID'])
				|| (!$hostUserId && $curUserId === (int)$user['USER_ID']))
				? 'h'
				: '';

			$userSettings = BitrixCalendarUserSettings::get($user['USER_ID']);
			$result['entries'][] = array(
				'type' => 'user',
				'id' => $user['USER_ID'],
				'name' => CCalendar::GetUserName($user),
				'status' => $status,
				'url' => CCalendar::GetUserUrl($user['USER_ID']),
				'avatar' => CCalendar::GetUserAvatarSrc($user),
				'strictStatus' => $userSettings['denyBusyInvitation'],
				'emailUser' => isset($user['EXTERNAL_AUTH_ID']) && ($user['EXTERNAL_AUTH_ID'] === 'email'),
				'sharingUser' => isset($user['EXTERNAL_AUTH_ID']) && ($user['EXTERNAL_AUTH_ID'] === 'calendar_sharing'),
			);
		}
	}
	elseif(isset($params['entries']) && is_array($params['entries']))
	{
		foreach($params['entries'] as $userId)
		{
			$userIds[] = (int)$userId;
		}
	}

	if (isset($params['resources']) && is_array($params['resources']))
	{
		foreach($params['resources'] as $resource)
		{
			$resourceId = intval($resource['id']);
			$resourceIdList[] = $resourceId;
			$resource['type'] = preg_replace("/[^a-zA-Z0-9_]/i", "", $resource['type']);
			$result['entries'][] = array(
				'type' => $resource['type'],
				'id' => $resourceId,
				'name' => $resource['name']
			);
			$result['accessibility'][$resourceId] = [];
		}
	}

	$from = $params['date_from'] ?? null;
	$to = $params['date_to'] ?? null;

	if ($isPlannerFeatureEnabled)
	{
		$accessibility = (new Accessibility())
			->setCheckPermissions(false)
			->setSkipEventId($curEventId)
			->getAccessibility($userIds, CCalendar::TimestampUTC($from), CCalendar::TimestampUTC($to))
		;

		$timezoneName = CCalendar::GetUserTimezoneName(CCalendar::GetUserId());
		foreach ($accessibility as $userId => $entries)
		{
			$result['accessibility'][$userId] = [];
			foreach ($entries as $entry)
			{
				if (isset($entry['id']) && in_array($entry['id'], $skipEntryList))
				{
					continue;
				}

				if ($entry['isFullDay'])
				{
					$dateFrom = $entry['from'];
					$dateTo = $entry['to'];
				}
				else
				{
					$dateFrom = Util::formatDateTimeTimestamp(CCalendar::TimestampUTC($entry['from']), $timezoneName);
					$dateTo = Util::formatDateTimeTimestamp(CCalendar::TimestampUTC($entry['to']), $timezoneName);
				}

				$result['accessibility'][$userId][] = [
					'name' => $entry['name'],
					'dateFrom' => $dateFrom,
					'dateTo' => $dateTo,
					'isFullDay' => $entry['isFullDay'],
				];
			}
		}
	}

	if (isset($params['location']))
	{
		$location = BitrixCalendarRoomsUtil::parseLocation($params['location']);
		$entryLocation = BitrixCalendarRoomsUtil::parseLocation($params['entryLocation'] ?? null);
		$roomEventId = $entryLocation['room_event_id'] ?? null;

		if ($roomEventId && !in_array($roomEventId, $skipEntryList))
		{
			$skipEntryList[] = $roomEventId;
		}

		if ($location['mrid'] ?? null)
		{
			$mrid = 'MR_' . $location['mrid'];
			$entry = [
				'type' => 'room',
				'id' => $mrid,
				'name' => 'meeting room'
			];

			$roomList = RoomsIBlockMeetingRoom::getMeetingRoomList();
			foreach ($roomList as $room)
			{
				if ((int)$room['ID'] === (int)$location['mrid'])
				{
					$entry['name'] = $room['NAME'];
					$entry['url'] = $room['URL'];
					break;
				}
			}

			$result['entries'][] = $entry;
			$result['accessibility'][$mrid] = [];

			if ($isPlannerFeatureEnabled)
			{
				$meetingRoomRes = RoomsIBlockMeetingRoom::getAccessibilityForMeetingRoom([
					'allowReserveMeeting' => true,
					'id' => $location['mrid'],
					'from' => $from,
					'to' => $to,
					'curEventId' => $roomEventId
				]);

				foreach ($meetingRoomRes as $entry)
				{
					if (!in_array($entry['ID'], $skipEntryList))
					{
						$result['accessibility'][$mrid][] = [
							'id' => $entry['ID'],
							'dateFrom' => $entry['DT_FROM'],
							'dateTo' => $entry['DT_TO']
						];
					}
				}
			}
		}
		elseif ($location['room_id'])
		{
			$roomId = 'room_' . $location['room_id'];
			$entry = [
				'type' => 'room',
				'id' => $roomId,
				'roomId' => $location['room_id'],
				'name' => 'meeting room'
			];

			$sectionList = RoomsManager::getRoomsList();
			foreach($sectionList as $room)
			{
				if ((int)$room['ID'] === (int)$location['room_id'])
				{
					$entry['name'] = $room['NAME'];
					break;
				}
			}

			$result['entries'][] = $entry;
			$result['accessibility'][$roomId] = [];

			if ($isPlannerFeatureEnabled)
			{
				$meetingRoomRes = RoomsAccessibilityManager::getRoomAccessibility(
					$location['room_id'],
					$from,
					$to
				);

				foreach ($meetingRoomRes as $entry)
				{
					if (in_array((int)$entry['ID'], $skipEntryList))
					{
						continue;
					}

					$dateFrom = $entry['DATE_FROM'];
					if ($entry['DT_SKIP_TIME'] !== "Y")
					{
						$dateFrom = CCalendar::Date(
							CCalendar::Timestamp($entry['DATE_FROM']) - $entry['~USER_OFFSET_FROM']
						);
						$dateTo = CCalendar::Date(
							CCalendar::Timestamp($entry['DATE_TO']) - $entry['~USER_OFFSET_TO']
						);
					}
					else
					{
						$dateTo = CCalendar::Date(
							CCalendar::Timestamp($entry['DATE_TO']) + CCalendar::GetDayLen()
						);
					}

					$result['accessibility'][$roomId][] = [
						'id' => $entry['ID'],
						'name' => $entry['NAME'],
						'dateFrom' => $dateFrom,
						'dateTo' => $dateTo
					];
				}
			}
		}
	}

	if (!empty($resourceIdList) && $isPlannerFeatureEnabled)
	{
		$resEntries = CCalendarEvent::GetList(
			array(
				'arFilter' => array(
					"FROM_LIMIT" => $from,
					"TO_LIMIT" => $to,
					"CAL_TYPE" => 'resource',
					"ACTIVE_SECTION" => "Y",
					"SECTION" => $resourceIdList
				),
				'parseRecursion' => true,
				'setDefaultLimit' => false
			)
		);

		foreach($resEntries as $entry)
		{
			if (in_array($entry['ID'], $skipEntryList))
			{
				continue;
			}

			$dateFrom = $entry['DATE_FROM'];
			$dateTo = $entry['DATE_TO'];

			if ($entry['DT_SKIP_TIME'] !== "Y")
			{
				$dateFrom = CCalendar::Date(
					CCalendar::Timestamp($entry['DATE_FROM'])
					- $entry['~USER_OFFSET_FROM']
				);
				$dateTo = CCalendar::Date(
					CCalendar::Timestamp($entry['DATE_TO'])
					- $entry['~USER_OFFSET_TO']
				);
			}

			$result['accessibility'][$entry['SECT_ID']][] = array(
				'id' => $entry["ID"],
				'name' => $entry["NAME"],
				'dateFrom' => $dateFrom,
				'dateTo' => $dateTo
			);
		}
	}

	if (($params['initPullWatches'] ?? null) === true)
	{
		Util::initPlannerPullWatches(
			$curUserId,
			$userIds
		);
	}

	return $result;
}