• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/userfield/resourcebooking.php
  • Класс: BitrixCalendarUserFieldResourceBooking
  • Вызов: ResourceBooking::getFillFormData
static function getFillFormData($data = [], $params = [])
{
	global $USER;
	$resultData = [];
	$curUserId = $USER->GetID();

	if (isset($params['from']) && $params['from'] instanceof Date
		&& isset($params['to']) && $params['to'] instanceof Date

	)
	{
		$from = $params['from']->toString();
		$to = $params['to']->toString();
	}
	else
	{
		$fromTs = (isset($params['from']) && $params['from']) ? CCalendar::timestamp($params['from']) : time();
		$from = CCalendar::date($fromTs, false);
		$to = (isset($params['to']) && $params['to'])
			? CCalendar::date(CCalendar::timestamp($params['to']), false)
			: CCalendar::date($fromTs + CCalendar::DAY_LENGTH * 60, false);
	}

	if (isset($params['timezone']))
	{
		$deltaOffset = CCalendar::GetTimezoneOffset($params['timezone']) - CCalendar::GetCurrentOffsetUTC($curUserId);
	}
	else
	{
		$deltaOffset = 0;
	}
	$resultData['timezoneOffset'] = 0;

	// Fetch fetch UF properties
	if ($params['fieldName'])
	{
		$r = CUserTypeEntity::getList(array("ID" => "ASC"), array("FIELD_NAME" => $params['fieldName']));
		if ($r)
		{
			$fieldProperties = $r->fetch();
			$resultData['fieldSettings'] = $fieldProperties['SETTINGS'];

			if ($resultData['fieldSettings']['USE_USER_TIMEZONE'] === 'N')
			{
				$resultData['timezoneOffset'] = $resultData['fieldSettings']['TIMEZONE'] ? CCalendar::GetTimezoneOffset($resultData['fieldSettings']['TIMEZONE']) : intval(date("Z"));
				$resultData['timezoneOffsetLabel'] = 'UTC'.($resultData['timezoneOffset'] <> 0 ? ' '.($resultData['timezoneOffset'] < 0? '-':'+').sprintf("%02d", ($h = floor(abs($resultData['timezoneOffset'])/3600))).':'.sprintf("%02d", abs($resultData['timezoneOffset']) / 60 - $h * 60) : '');
			}
		}
	}

	if (isset($data['users']))
	{
		$userIdList = is_array($data['users']['value'])
			? $data['users']['value']
			: explode('|', $data['users']['value']);
		array_walk($userIdList, 'intval');

		$resultData['usersAccessibility'] = [];
		$accessibility = CCalendar::getAccessibilityForUsers(array(
			'users' => $userIdList,
			'from' => $from, // date or datetime in UTC
			'to' => $to, // date or datetime in UTC
			'getFromHR' => true,
			'checkPermissions' => false
		));

		foreach($accessibility as $userId => $entries)
		{
			$resultData['usersAccessibility'][$userId] = [];

			foreach($entries as $entry)
			{
				if (isset($entry['DT_FROM']) && !isset($entry['DATE_FROM']))
				{
					$resultData['usersAccessibility'][$userId][] = array(
						'id' => $entry['ID'],
						'dateFrom' => $entry['DT_FROM'],
						'dateTo' => $entry['DT_TO'],
					);
				}
				else
				{
					$fromTs = CCalendar::Timestamp($entry['DATE_FROM']);
					$toTs = CCalendar::Timestamp($entry['DATE_TO']);

					if ($entry['DT_SKIP_TIME'] !== "Y")
					{
						if ($resultData['fieldSettings']['USE_USER_TIMEZONE'] === 'N')
						{
							$fromTs -= CCalendar::GetTimezoneOffset($entry['TZ_FROM']) - $resultData['timezoneOffset'];
							$toTs -= CCalendar::GetTimezoneOffset($entry['TZ_TO']) - $resultData['timezoneOffset'];
						}
						else
						{
							$fromTs -= $entry['~USER_OFFSET_FROM'];
							$toTs -= $entry['~USER_OFFSET_TO'];
							$fromTs += $deltaOffset;
							$toTs += $deltaOffset;
						}
					}

					$resultData['usersAccessibility'][$userId][] = array(
						'id' => $entry['ID'],
						'dateFrom' => CCalendar::Date($fromTs, $entry['DT_SKIP_TIME'] != 'Y'),
						'dateTo' => CCalendar::Date($toTs, $entry['DT_SKIP_TIME'] != 'Y'),
						'fullDay' => $entry['DT_SKIP_TIME'] === "Y"
					);
				}
			}
		}

		// User Index
		$orm = UserTable::getList(
			[
				'filter' => [
					'=ID' => $userIdList,
					'=ACTIVE' => 'Y'
				],
				'select' => ['ID', 'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'EMAIL']
			]
		);

		$resultData['SETTINGS']['USER_INDEX'] = [];
		while($user = $orm->fetch())
		{
			$resultData['userIndex'][$user['ID']] = [
				'id' => $user['ID'],
				'displayName' => CCalendar::getUserName($user)
			];
		}
	}

	if (isset($data['resources']))
	{
		$resultData['resourcesAccessibility'] = [];

		$resourceIdList = is_array($data['resources']['value'])
			? $data['resources']['value']
			: explode('|', $data['resources']['value']);

		array_walk($resourceIdList, 'intval');

		$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 $row)
		{
			$fromTs = CCalendar::timestamp($row["DATE_FROM"]);
			$toTs = CCalendar::timestamp($row['DATE_TO']);

			if ($row['DT_SKIP_TIME'] !== "Y" && $resultData['fieldSettings']['USE_USER_TIMEZONE'] !== 'N')
			{
				if ($resultData['fieldSettings']['USE_USER_TIMEZONE'] === 'N')
				{
					$fromTs -= CCalendar::GetTimezoneOffset($entry['TZ_FROM']) - $resultData['timezoneOffset'];
					$toTs -= CCalendar::GetTimezoneOffset($entry['TZ_TO']) - $resultData['timezoneOffset'];
				}
				else
				{
					$fromTs -= $row['~USER_OFFSET_FROM'];
					$toTs -= $row['~USER_OFFSET_TO'];
					$fromTs += $deltaOffset;
					$toTs += $deltaOffset;
				}
			}

			$resultData['resourcesAccessibility'][$row['SECT_ID']][] = array(
				'id' => $row["ID"],
				'dateFrom' => CCalendar::date($fromTs, $row['DT_SKIP_TIME'] !== 'Y'),
				'dateTo' => CCalendar::date($toTs, $row['DT_SKIP_TIME'] !== 'Y'),
				'fullDay' => $row['DT_SKIP_TIME'] === "Y"
			);
		}
	}

	$resultData['workTimeStart'] = floor(floatVal(COption::GetOptionString('calendar', 'work_time_start', 9)));
	$resultData['workTimeEnd'] = ceil(floatVal(COption::GetOptionString('calendar', 'work_time_end', 19)));

	return $resultData;
}