- Модуль: timeman
- Путь к файлу: ~/bitrix/modules/timeman/classes/general/timeman.php
- Класс: CTimeMan
- Вызов: CTimeMan::GetAccess
static function GetAccess()
{
global $USER;
// simplest caching. is it enough? maybe...
static $access = null;
if (!is_array($access))
{
$access = [
'READ' => [],
'WRITE' => [],
];
$arAccessSettings = null;
$subordinateList = [];
$userPermissionManager = DependencyManager::getInstance()->getUserPermissionsManager($USER);
if ($userPermissionManager->canReadWorktimeAll())
{
$access['READ'][] = '*';
}
elseif ($userPermissionManager->canReadWorktimeSubordinate())
{
$arAccessSettings = self::GetAccessSettings();
if ($arAccessSettings['READ']['EMPLOYEE'] >= 2)
{
$access['READ'][] = '*';
}
else
{
// everybody can read his own entries
$access['READ'][] = $USER->GetID();
if ($arAccessSettings['READ']['EMPLOYEE'] >= 1)
{
$dbUsers = CIntranetUtils::GetDepartmentColleagues(null, false, false, 'Y', ['ID']);
while ($arRes = $dbUsers->Fetch())
{
$access['READ'][] = $arRes['ID'];
}
}
$dbUsers = CIntranetUtils::GetSubordinateEmployees($USER->GetID(), $arAccessSettings['READ']['HEAD'] == 1, 'Y', ['ID']);
while ($arRes = $dbUsers->Fetch())
{
if ($arAccessSettings['READ']['HEAD'] == 2)
{
$access['READ'] = ['*'];
break;
}
if (!isset($subordinateList[intval($arAccessSettings['READ']['HEAD'])]))
{
$subordinateList[intval($arAccessSettings['READ']['HEAD'])] = [];
}
$subordinateList[intval($arAccessSettings['READ']['HEAD'])][] = $arRes;
$access['READ'][] = $arRes['ID'];
}
$access['READ'] = array_values(array_unique($access['READ']));
}
}
if ($userPermissionManager->canUpdateWorktimeAll())
{
$access['WRITE'][] = '*';
}
elseif ($userPermissionManager->canUpdateWorktimeSubordinate())
{
if (($arAccessSettings['WRITE']['EMPLOYEE'] ?? 0) >= 2)
{
$access['WRITE'][] = '*';
}
else
{
// check if current user is The Boss.
$arManagers = self::GetUserManagers($USER->GetID());
if (count($arManagers) == 1 && $arManagers[0] == $USER->GetID())
{
$access['WRITE'][] = $USER->GetID();
}
if (!is_array($arAccessSettings))
{
$arAccessSettings = self::GetAccessSettings();
}
if (isset($subordinateList[intval($arAccessSettings['WRITE']['HEAD'])]))
{
foreach ($subordinateList[intval($arAccessSettings['WRITE']['HEAD'])] as $arRes)
{
$access['WRITE'][] = $arRes['ID'];
}
}
else
{
$dbUsers = CIntranetUtils::GetSubordinateEmployees($USER->GetID(), $arAccessSettings['WRITE']['HEAD'] == 1, 'Y', ['ID']);
while ($arRes = $dbUsers->Fetch())
{
$access['WRITE'][] = $arRes['ID'];
}
}
$access['WRITE'] = array_values(array_unique($access['WRITE']));
}
}
}
return $access;
}