• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/rooms/accessibilitymanager.php
  • Класс: BitrixCalendarRoomsAccessibilityManager
  • Вызов: AccessibilityManager::checkAccessibility
static function checkAccessibility(string $location = '', array $params = []): bool
{
	$location = Util::parseLocation($location);
	
	$res = true;
	if ($location['room_id'] || $location['mrid'])
	{
		$fromTs = CCalendar::Timestamp($params['fields']['DATE_FROM']);
		$toTs = CCalendar::Timestamp($params['fields']['DATE_TO']);
		if ($params['fields']['SKIP_TIME'])
		{
			$toTs += CCalendar::GetDayLen();
		}
		
		$eventId = (int)$params['fields']['ID'];
		
		$from = CCalendar::Date($fromTs, false);
		$to = CCalendar::Date($toTs, false);
		
		$curUserId = CCalendar::GetCurUserId();
		$deltaOffset = isset($params['timezone'])
			? (CCalendar::GetTimezoneOffset($params['timezone']) - CCalendar::GetCurrentOffsetUTC($curUserId))
			: 0
		;
		
		if ($location['mrid'])
		{
			$meetingRoomRes = IBlockMeetingRoom::getAccessibilityForMeetingRoom([
				'allowReserveMeeting' => true,
				'id' => $location['mrid'],
				'from' => CCalendar::Date(
					$fromTs - CCalendar::DAY_LENGTH,
					false
				),
				'to' => CCalendar::Date(
					$toTs + CCalendar::DAY_LENGTH,
					false
				),
				'curEventId' => $location['mrevid'],
			]);
			
			foreach ($meetingRoomRes as $entry)
			{
				if ((int)$entry['ID'] !== (int)$location['mrevid'])
				{
					$entryFromTs = CCalendar::Timestamp($entry['DT_FROM']);
					$entryToTs = CCalendar::Timestamp($entry['DT_TO']);
					
					if ($entryFromTs < $toTs && $entryToTs > $fromTs)
					{
						$res = false;
						break;
					}
				}
			}
		}
		elseif ($location['room_id'])
		{
			$entries = self::getRoomAccessibility($location['room_id'], $from, $to);
			foreach ($entries as $entry)
			{
				if ((int)$entry['ID'] !== (int)$location['room_event_id']
					&& (int)$entry['PARENT_ID'] !== $eventId)
				{
					$entryFromTs = CCalendar::Timestamp($entry['DATE_FROM']);
					$entryToTs = CCalendar::Timestamp($entry['DATE_TO']);
					if ($entry['DT_SKIP_TIME'] !== 'Y')
					{
						$entryFromTs -= $entry['~USER_OFFSET_FROM'];
						$entryToTs -= $entry['~USER_OFFSET_TO'];
						$entryFromTs += $deltaOffset;
						$entryToTs += $deltaOffset;
					}
					else
					{
						$entryToTs += CCalendar::GetDayLen();
					}
					
					if ($entryFromTs < $toTs && $entryToTs > $fromTs)
					{
						$res = false;
						break;
					}
				}
			}
		}
	}
	
	return $res;
}