- Модуль: timeman
- Путь к файлу: ~/bitrix/modules/timeman/lib/repository/schedule/schedulerepository.php
- Класс: BitrixTimemanRepositoryScheduleScheduleRepository
- Вызов: ScheduleRepository::findSchedulesByEntityCodes
public function findSchedulesByEntityCodes($entityCodesParams, $options = [])
{
$userIdsParams = EntityCodesHelper::extractUserIdsFromEntityCodes($entityCodesParams);
$departmentIdsParams = EntityCodesHelper::extractDepartmentIdsFromEntityCodes($entityCodesParams);
$allDepartmentIdsForEntities = $departmentIdsParams;
$assignments = [];
$entitiesPriorityTree = [];
if (!empty($userIdsParams))
{
foreach ($userIdsParams as $userIdForSearch)
{
$entitiesPriorityTree['U' . $userIdForSearch] = $this->departmentRepository->buildUserDepartmentsPriorityTrees($userIdForSearch);
$allDepartmentIdsForEntities = array_merge($allDepartmentIdsForEntities, $this->departmentRepository->getAllUserDepartmentIds($userIdForSearch));
}
$userAssignments = $this->findUserAssignmentsByIds($userIdsParams);
foreach ($userAssignments as $userAssignment)
{
$assignments[$userAssignment['SCHEDULE_ID']]['U' . $userAssignment['USER_ID']] = (int)$userAssignment['STATUS'];
}
}
if (!empty($departmentIdsParams))
{
foreach ($departmentIdsParams as $departmentIdForSearch)
{
$entitiesPriorityTree['DR' . $departmentIdForSearch] = [$this->departmentRepository->buildDepartmentsPriorityTree($departmentIdForSearch)];
$allDepartmentIdsForEntities = array_merge($allDepartmentIdsForEntities, $this->departmentRepository->getAllParentDepartmentsIds($departmentIdForSearch));
}
}
$allDepartmentIdsForEntities = array_unique($allDepartmentIdsForEntities);
if (!empty($allDepartmentIdsForEntities))
{
$departmentsAssignments = $this->findDepartmentAssignmentsByIds($allDepartmentIdsForEntities);
foreach ($departmentsAssignments as $assignment)
{
$assignments[$assignment['SCHEDULE_ID']]['DR' . $assignment['DEPARTMENT_ID']] = (int)$assignment['STATUS'];
}
}
$commonScheduleId = $this->findFirstScheduleIdForAllUsers();
if ($commonScheduleId)
{
$firstTree = reset($entitiesPriorityTree);
if (is_array($firstTree))
{
$secondTree = reset($firstTree);
if (is_array($secondTree))
{
$assignments[$commonScheduleId][end($secondTree)] = ScheduleDepartmentTable::INCLUDED;
}
}
}
$entityToSchedulesMap = [];
foreach ($assignments as $scheduleId => $scheduleAssignData)
{
foreach ($entitiesPriorityTree as $entityAssignCode => $departmentsPriorityTreeData)
{
foreach ($departmentsPriorityTreeData as $priorityTree)
{
foreach ($priorityTree as $assignCode)
{
if (array_key_exists($assignCode, $scheduleAssignData))
{
if ($scheduleAssignData[$assignCode] === ScheduleDepartmentTable::EXCLUDED)
{
break;
}
$entityToSchedulesMap[$entityAssignCode][$scheduleId] = (int)$scheduleId;
}
}
}
}
}
$uniqueScheduleIds = empty($entityToSchedulesMap) ? [] : array_unique(array_merge(...array_values($entityToSchedulesMap)));
if (empty($uniqueScheduleIds))
{
return [];
}
$schedules = $this->findSchedulesByIdsForEntity($uniqueScheduleIds, empty($options['select']) ? [] : $options['select']);
$res = [];
foreach ($entityToSchedulesMap as $entityMapCode => $schedulesIdsOfEntity)
{
foreach ($schedules as $schedule)
{
if (in_array((int)$schedule['ID'], $schedulesIdsOfEntity, true))
{
$res[$entityMapCode][$schedule['ID']] = $schedule;
}
}
}
foreach ($entityCodesParams as $entityCode)
{
if ($res[$entityCode] === null)
{
$res[$entityCode] = [];
}
}
return $res;
}