• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/utils.php
  • Класс: CIntranetUtils
  • Вызов: CIntranetUtils::GetAbsenceData
static function GetAbsenceData($arParams = array(), $MODE = BX_INTRANET_ABSENCE_ALL)
{
	global $DB;

	$arDefaultParams = [
		'CALENDAR_IBLOCK_ID' => false,
		'ABSENCE_IBLOCK_ID' => COption::GetOptionInt('intranet', 'iblock_absence'),
		'DATE_START' => date($DB->DateFormatToPHP(CSite::GetDateFormat('FULL')), strtotime(date('Y-m-01'))),
		'DATE_FINISH' => date($DB->DateFormatToPHP(CSite::GetDateFormat('FULL')), strtotime('+1 month', strtotime(date('Y-m-01')))),
		'USERS' => false,
		'PER_USER' => true,
		'SELECT' => ['ID', 'IBLOCK_ID', 'DATE_ACTIVE_FROM', 'DATE_ACTIVE_TO', 'NAME', 'PREVIEW_TEXT', 'DETAIL_TEXT', 'PROPERTY_USER', 'PROPERTY_FINISH_STATE', 'PROPERTY_STATE', 'PROPERTY_ABSENCE_TYPE'],
		'CHECK_PERMISSIONS' => 'Y',
	];

	foreach ($arDefaultParams as $key => $value)
	{
		if (!isset($arParams[$key]))
			$arParams[$key] = $value;
	}

	$arParams['SELECT'] = array_merge(
		$arParams['SELECT'],
		array_diff(array('DATE_ACTIVE_FROM', 'DATE_ACTIVE_TO', 'PROPERTY_USER'), $arParams['SELECT'])
	);

	$calendar2 = COption::GetOptionString("intranet", "calendar_2", "N") == "Y";
	$bLoadCalendar = ($arParams['CALENDAR_IBLOCK_ID'] > 0 || $calendar2) && (($MODE & BX_INTRANET_ABSENCE_PERSONAL) > 0);
	$bLoadAbsence = $arParams['ABSENCE_IBLOCK_ID'] > 0;

	$arResult = array();
	$arEntries = array();

	$format = $DB->DateFormatToPHP(CLang::GetDateFormat("FULL"));

	if ($bLoadCalendar)
	{
		$arMethodParams = array(
			'iblockId' => $arParams['CALENDAR_IBLOCK_ID'],
			'arUserIds' => $arParams['USERS'],
			'bList' => true,
			'checkPermissions' => $arParams['CHECK_PERMISSIONS'] !== 'N'
		);

		if ($arParams['DATE_START'])
			$arMethodParams['fromLimit'] = date($format, MakeTimeStamp($arParams['DATE_START'], FORMAT_DATE));
		if ($arParams['DATE_FINISH'])
			$arMethodParams['toLimit'] = date($format, MakeTimeStamp($arParams['DATE_FINISH'], FORMAT_DATE) + 86399);

		if ($calendar2 && CModule::IncludeModule('calendar'))
			$arCalendarEntries = CCalendar::GetAbsentEvents($arMethodParams);
		else
			$arCalendarEntries = CEventCalendar::GetAbsentEvents($arMethodParams);

		if (is_array($arCalendarEntries))
		{
			foreach ($arCalendarEntries as $key => $arEntry)
			{
				$arCalendarEntries[$key]['ENTRY_TYPE'] = BX_INTRANET_ABSENCE_PERSONAL;
			}
			$arEntries = array_merge($arEntries, $arCalendarEntries);
		}

		if ($arParams['PER_USER'])
		{
			foreach ($arEntries as $key => $arEntry)
			{
				if (!isset($arResult[$arEntry['USER_ID']]))
					$arResult[$arEntry['USER_ID']] = array();

				$arResult[$arEntry['USER_ID']][] = $arEntry;
			}
		}
		else
		{
			$arResult = $arEntries;
		}
	}

	if ($bLoadAbsence)
	{
		if ($arParams['USERS'] === false || (is_array($arParams['USERS']) && count($arParams['USERS']) > 0))
		{
			$arFilter = array(
				'IBLOCK_ID' => $arParams['ABSENCE_IBLOCK_ID'],
				'ACTIVE' => 'Y',
				//'PROPERTY_USER_ACTIVE' => 'Y',
			);

			if ($arParams['DATE_START'])
				$arFilter['>=DATE_ACTIVE_TO'] = date($format, MakeTimeStamp($arParams['DATE_START'], FORMAT_DATE));
			if ($arParams['DATE_FINISH'])
				$arFilter[' 'ASC', 'DATE_ACTIVE_TO' => 'ASC'),
				$arFilter,
				false,
				false,
				$arParams['SELECT']
			);

			while ($arRes = $dbRes->Fetch())
			{
				$arRes['USER_ID'] = $arRes['PROPERTY_USER_VALUE'];
				$arRes['DATE_FROM'] = $arRes['DATE_ACTIVE_FROM'];
				$arRes['DATE_TO'] = $arRes['DATE_ACTIVE_TO'];
				$arRes['ENTRY_TYPE'] = BX_INTRANET_ABSENCE_HR;

				if ($arParams['PER_USER'])
				{
					if (!isset($arResult[$arRes['USER_ID']]))
						$arResult[$arRes['USER_ID']] = array();

					$arResult[$arRes['USER_ID']][] = $arRes;
				}
				else
				{
					$arResult[] = $arRes;
				}
			}
		}
	}

	return $arResult;
}