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