• Модуль: 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;
}