• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/lib/provider/schedule/scheduleprovider.php
  • Класс: BitrixTimemanProviderScheduleScheduleProvider
  • Вызов: ScheduleProvider::buildUserToDepartmentsMapByAssignments
public function buildUserToDepartmentsMapByAssignments($userAssignments, $departmentAssignments)
{
	$userToDepartmentsMap = [];
	$excludedDepartmentCodes = [];
	$excludedUserCodes = [];
	$departmentRepository = parent::getDepartmentRepository();
	foreach ($userAssignments as $userAssignment)
	{
		$userId = $userAssignment->getUserId();
		if ($userAssignment->isIncluded())
		{
			if (!array_key_exists($userId, $userToDepartmentsMap))
			{
				$userToDepartmentsMap[EntityCodesHelper::buildUserCode($userId)] = [];
			}
			$userToDepartmentsMap[EntityCodesHelper::buildUserCode($userId)] = EntityCodesHelper::buildDepartmentCodes(
				$departmentRepository->getDirectParentIdsByUserId($userId)
			);
		}
		elseif ($userAssignment->isExcluded())
		{
			$excludedUserCodes[] = EntityCodesHelper::buildUserCode($userId);
		}
	}
	foreach ($departmentAssignments as $departmentAssignment)
	{
		if ($departmentAssignment->isExcluded())
		{
			$excludedDepartmentCodes[] = EntityCodesHelper::buildDepartmentCode($departmentAssignment->getDepartmentId());
		}
		elseif ($departmentAssignment->isIncluded())
		{
			$childDepartments = $departmentRepository->getAllChildDepartmentsIds($departmentAssignment->getDepartmentId());
			$childDepartments[] = $departmentAssignment->getDepartmentId();
			foreach ($childDepartments as $childDepartmentId)
			{
				// manager first
				$managerId = $departmentRepository->getDepartmentManagerId($childDepartmentId);
				$userToDepartmentsMap[EntityCodesHelper::buildUserCode($managerId)][] = EntityCodesHelper::buildDepartmentCode($childDepartmentId);

				$users = $departmentRepository->getUsersOfDepartment($childDepartmentId);
				foreach ($users as $userId)
				{
					$userCode = EntityCodesHelper::buildUserCode($userId);
					if (!array_key_exists($userCode, $userToDepartmentsMap))
					{
						$userToDepartmentsMap[$userCode] = [];
					}
					$userToDepartmentsMap[$userCode] = array_merge(
						$userToDepartmentsMap[$userCode],
						EntityCodesHelper::buildDepartmentCodes(
							$departmentRepository->getDirectParentIdsByUserId($userId)
						)
					);
				}
			}
		}
	}
	foreach ($userToDepartmentsMap as $index => $userToDepartments)
	{
		$userToDepartmentsMap[$index] = array_unique($userToDepartments);
	}

	//
	foreach ($excludedUserCodes as $excludedUserCode)
	{
		if (isset($userToDepartmentsMap[$excludedUserCode]))
		{
			unset($userToDepartmentsMap[$excludedUserCode]);
		}
	}
	//
	foreach ($userToDepartmentsMap as $userCode => $userDepartmentsCodes)
	{
		foreach ($userDepartmentsCodes as $userDepartmentCodeIndex => $userDepartmentCode)
		{
			$allParents = $departmentRepository->getAllParentDepartmentsIds(EntityCodesHelper::getDepartmentId($userDepartmentCode));
			$allDepCodes = array_merge(EntityCodesHelper::buildDepartmentCodes($allParents), [$userDepartmentCode]);
			if (!empty(array_intersect($excludedDepartmentCodes, $allDepCodes)))
			{
				unset($userToDepartmentsMap[$userCode][$userDepartmentCodeIndex]);
				$userToDepartmentsMap[$userCode] = array_filter($userToDepartmentsMap[$userCode]);
			}
		}

	}
	$userToDepartmentsMap = array_filter($userToDepartmentsMap);
	return $userToDepartmentsMap;
}