Для того чтобы выбрать сотрудников у которых начат рабочий день, сперва нужно составить список всех "активных" сотрудников, после пройтись по этому списку и сформировать список сотрудников которые стартовали рабочий день.
Получить список пользователей Битрикс 24
Чтобы получить список пользователей Битрикс24 воспользуемся функцией API CUser::getList()
$userResult = \CUser::getList(
'ID', 'ASC',
[
'ACTIVE' => 'Y'
],
array(
'FIELDS' => ['ID']
)
);
while($user = $userResult->fetch()){
$arUsers[] = $user['ID'];
}
Мы получили массив $arUsers который содержит идентификаторы ID пользователей.
Битрикс24. Получить список пользователей у которых начат рабочий день
Для получения информации о рабочем дне пользователя в Битрикс24 используется класс CTimeManUser()
Нам потребуются методы: GetSettings(), State()
Метод GetSettings() - получает настройки учёта времени для пользователя, это нам требуется для того, чтобы понимать ведётся ли для пользователя учёт времени, если учёт не ведётся то ты не получим возможность понять начат у сотрудника рабочий день или нет.
Метод State() - возвращает статус:
EXPIRED | рабочий день истёк - это значить что сотрудник не завершил предыдущий рабочий день |
OPENED | рабочий день начат |
PAUSED | рабочий день на паузе - обычно паузу ставят когда сотрудник отлучился ( например на обед ) |
CLOSED | рабочий день завершён/закрыт |
Нас интересует только статус OPENED. Код примет следующий вид:
if(CModule::IncludeModule('timeman')){
foreach($arUsers as $user){
$userTimeMan = new CTimeManUser($user);
$userSettings = $userTimeMan->GetSettings();
// Проверяем ведётся ли учёт рабочего времени у сотрудника UF_TIMEMAN
if($userSettings["UF_TIMEMAN"]){
if($userTimeMan->State() == "OPENED"){
$usersWithOpenedDay[] = $user;
}
}
}
}
В итоге мы получили массив $usersWithOpenedDay с ID сотрудников у которых в текущий момент начат рабочий день.
Получить сотрудников из определённого отдела у которых начат рабочий день
Обычно нужно получить список сотрудников которые относятся к какому-то отделу. Для этого нужно сперва получить список сотрудников отдела, а потом проверить их на "начало рабочего дня".
В переменно $departmentId необходимо указать ID отдела, список сотрудников которого Вы хотите получить. Из выборки так же будет исключён Руководитель отдела.
if(CModule::IncludeModule('timeman')){
$departmentId = '10'; // ID отдела
$arDepartmentManager = CIntranetUtils::GetDepartmentManagerID($departmentId); // получаем ID руководителя отдела
$arDepartmentUsersWithOpenDay = [];
$rsDep = CIntranetUtils::GetDepartmentEmployees($departmentId, $bRecursive = false, $bSkipSelf = false, $onlyActive = 'Y', ['ID','NAME']);
while($arDep = $rsDep->fetch()){
if ($arDepartmentManager == $arDep['ID'])
continue;
$userTimeMan = new CTimeManUser($arDep['ID']);
$userSettings = $userTimeMan->GetSettings();
//Проверяем ведётся ли учет времени
if($userSettings["UF_TIMEMAN"]){
if ($userTimeMan->State() == "OPENED"){
$arDepartmentUsersWithOpenDay[] = $arDep['ID'];
}
}
}
}
В итоге в массиве $arDepartmentUsersWithOpenDay получим ID сотрудников отдела в текущей момент "работающих". Исключение составляет Руководитель отдела, его из выборки исключил: переменная $arDepartmentManager содержит руководителя отдела.