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