• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/classes/general/timeman.php
  • Класс: CTimeMan
  • Вызов: CTimeMan::getRuntimeInfo
static function getRuntimeInfo($bFull = false)
{
	global $USER;

	$TMUSER = CTimeManUser::instance();
	$STATE = $TMUSER->State();

	$info = ['ID' => '', 'STATE' => $STATE, 'CAN_EDIT' => 'N'];
	$actionsBuilder = DependencyManager::getInstance()->getWorktimeActionList()->buildPossibleActionsListForUser($TMUSER->GetID());
	if ($STATE == 'CLOSED')
	{
		$info['CAN_OPEN'] = $TMUSER->OpenAction();
	}
	elseif ($STATE == 'EXPIRED')
	{
		$info['EXPIRED_DATE'] = $TMUSER->GetExpiredRecommendedDate();
	}

	$arSettings = $TMUSER->GetSettings(['UF_TM_REPORT_REQ']);
	$info['REPORT_REQ'] = $arSettings['UF_TM_REPORT_REQ'] ?? null;
	$info['TM_FREE'] = false;
	if ($arInfo = $TMUSER->GetCurrentInfo())
	{
		$record = WorktimeRecord::wakeUpRecord($arInfo);
		foreach ($actionsBuilder->getAllActions() as $worktimeAction)
		{
			$info['TM_FREE'] = $worktimeAction->getSchedule() && $worktimeAction->getSchedule()->isFlextime();
		}
		foreach ($actionsBuilder->getStartActions() as $startAction)
		{
			// for cases, when user had fixed schedule and now user has flextime
			$info['TM_FREE'] = $startAction->getSchedule() && $startAction->getSchedule()->isFlextime();
		}
		$info['ID'] = $arInfo['ID'];

		$info['CAN_EDIT'] = !empty($actionsBuilder->getEditActions()) ? 'Y' : 'N';
		$timeFinish = $arInfo['TIME_FINISH'];
		if ((int)$arInfo['TIME_FINISH'] === 0)
		{
			if (!WorktimeRecord::isRecordPaused($arInfo) && !WorktimeRecord::isRecordClosed($arInfo))
			{
				$timeFinish = null;
			}
		}
		$info['INFO'] = [
			'DATE_START' => MakeTimeStamp($arInfo['DATE_START']) - CTimeZone::GetOffset(),
			'DATE_FINISH' => $arInfo['DATE_FINISH']
				? (MakeTimeStamp($arInfo['DATE_FINISH']) - CTimeZone::GetOffset())
				: '',
			'TIME_START' => $arInfo['TIME_START'],
			'TIME_FINISH' => $timeFinish,
			'DURATION' => $arInfo['RECORDED_DURATION'],
			'TIME_LEAKS' => $arInfo['TIME_LEAKS'],
			'ACTIVE' => ($arInfo['ACTIVE'] == 'Y'),
			'PAUSED' => ($arInfo['PAUSED'] == 'Y'),
			'CURRENT_STATUS' => $arInfo['CURRENT_STATUS'],
		];
		if (!empty($actionsBuilder->getStopActions()))
		{
			foreach ($actionsBuilder->getStopActions() as $stopAction)
			{
				if ($stopAction->getRecord() && $stopAction->getRecord()->getId() === $record->getId()
					&& $stopAction->getRecordManager())
				{
					$info['INFO']['RECOMMENDED_CLOSE_TIMESTAMP'] = $stopAction->getRecordManager()->getRecommendedStopTimestamp();
				}
			}
		}
		if (isset($arInfo['LAST_PAUSE']) && $arInfo['LAST_PAUSE'])
		{
			$info['LAST_PAUSE'] = $arInfo['LAST_PAUSE'];
		}
		elseif (isset($arInfo['PAUSED']) && $arInfo['PAUSED'] === 'Y')
		{
			$info['LAST_PAUSE'] = [
				'DATE_START' => $info['INFO']['DATE_FINISH'],
			];
		}

		$info['SOCSERV_ENABLED'] = IsModuleInstalled('socialservices')
								   && (COption::GetOptionString("socialservices", "allow_send_user_activity", "Y") == 'Y');
		if ($bFull && $info['SOCSERV_ENABLED'])
		{
			$info['SOCSERV_ENABLED_USER'] = $TMUSER->isSocservEnabledByUser();
		}
	}
	else
	{
		foreach ($actionsBuilder->getStartActions() as $worktimeAction)
		{
			$info['TM_FREE'] = $worktimeAction->getSchedule() && $worktimeAction->getSchedule()->isFlextime();
		}
	}

	$planner = CIntranetPlanner::getData(SITE_ID, $bFull);
	$plannerData = $planner['DATA'];

	$eventsLimit = 50;
	if (is_array($plannerData['EVENTS']) && count($plannerData['EVENTS']) > $eventsLimit)
	{
		$plannerData['EVENTS'] = self::limitEvents($eventsLimit, $plannerData['EVENTS']);

		$planner['DATA'] = $plannerData;
	}

	$info['PLANNER'] = $planner;

	$info["FULL"] = $bFull;

	if (!empty($actionsBuilder->getStartActions()) && !empty($actionsBuilder->getReopenActions()))
	{
		$info["CAN_OPEN_AND_RELAUNCH"] = true;
	}

	return $info;
}