- Модуль: timeman
- Путь к файлу: ~/bitrix/modules/timeman/lib/helper/form/schedule/scheduleformhelper.php
- Класс: BitrixTimemanHelperFormScheduleScheduleFormHelper
- Вызов: ScheduleFormHelper::calculateScheduleAssignmentsMap
private function calculateScheduleAssignmentsMap($checkingSchedule, $checkNestedEntities = false)
{
$codesToCheck = [];
foreach ($checkingSchedule->obtainUserAssignments()->getAll() as $assignment)
{
if ($assignment->isIncluded())
{
$codesToCheck[] = $assignment->getEntityCode();
}
}
foreach ($checkingSchedule->obtainDepartmentAssignments()->getAll() as $scheduleDepartment)
{
if ($scheduleDepartment->isIncluded())
{
$codesToCheck[] = $scheduleDepartment->getEntityCode();
}
}
if ($checkingSchedule->getIsForAllUsers())
{
$codesToCheck[] = EntityCodesHelper::getAllUsersCode();
}
$codesToCheck = $this->prepareEntitiesCodes($codesToCheck);
if ($checkNestedEntities)
{
$codesToCheck = $this->extendWithNestedEntitiesCodes($codesToCheck);
}
$result = [];
$schedulesWithAssignments = $this->findSchedulesByAssignmentsCodes($codesToCheck, $checkingSchedule);
if ($schedulesWithAssignments->count() === 0)
{
return $result;
}
$checkingCodesMap = $this->buildSignMapBySchedule($checkingSchedule);
$signMaps = [];
$baseDepartment = $this->departmentRepository->getBaseDepartmentId();
foreach ($schedulesWithAssignments->getAll() as $schedule)
{
$signMap = $this->buildSignMapBySchedule($schedule);
foreach ($checkingCodesMap as $codeToCheck => $codeIncluded)
{
if (
mb_substr($signMap[$codeToCheck] ?? '', 0, 8) === 'included'
&& mb_substr($codeIncluded, 0, 8) === 'included'
)
{
$result[$codeToCheck][$schedule->getId()] = $schedule;
}
}
$signMaps[$schedule->getId()] = $signMap;
}
$resultToShow = [];
foreach ($result as $code => $schedules)
{
foreach ($schedules as $schedule)
{
$directParentCodes = [];
if (EntityCodesHelper::isUser($code))
{
$directParentCodes = EntityCodesHelper::buildDepartmentCodes(
$this->departmentRepository->getDirectParentIdsByUserId(EntityCodesHelper::getUserId($code))
);
}
elseif (EntityCodesHelper::isDepartment($code))
{
$directParentCodes = EntityCodesHelper::buildDepartmentCodes(
$this->departmentRepository->getDirectParentIdsByDepartmentId(EntityCodesHelper::getDepartmentId($code))
);
}
$includedPersonal = false;
if (!empty($result[$code]))
{
foreach ($result[$code] as $codeSchedule)
{
if ($signMaps[$codeSchedule->getId()][$code] === 'includedPersonal')
{
$includedPersonal = true;
}
}
}
$includedByParent = false;
foreach ($directParentCodes as $directParentCode)
{
if (!empty($result[$directParentCode]) && in_array($schedule->getId(), array_keys($result[$directParentCode])))
{
$includedByParent = true;
}
}
if (!$includedByParent || $includedPersonal)
{
if (EntityCodesHelper::getDepartmentId($code) === $baseDepartment)
{
$resultToShow[EntityCodesHelper::getAllUsersCode()][$schedule->getId()] = $schedule;
}
else
{
$resultToShow[$code][$schedule->getId()] = $schedule;
}
}
}
}
return $resultToShow;
}