• Модуль: voximplant
  • Путь к файлу: ~/bitrix/modules/voximplant/classes/general/vi_user.php
  • Класс: CVoxImplantUser
  • Вызов: CVoxImplantUser::getAllowedLines
static function getAllowedLines($userId)
{
	if(!BitrixVoximplantLimits::canSelectLine())
		return array();

	$cacheManager = BitrixMainApplication::getInstance()->getManagedCache();
	$cacheTag = static::$cacheTagAllowedLines.$userId;

	if ($cacheManager->read(static::$cacheTtl, $cacheTag, static::$cacheTable))
		return $cacheManager->get($cacheTag);

	$userAccessCodes = CAccess::GetUserCodesArray($userId);
	if(!is_array($userAccessCodes) || empty($userAccessCodes))
		return array();

	$cursor = BitrixVoximplantModelLineAccessTable::getList(array(
		'select' => array(
			new BitrixMainEntityExpressionField('DISTINCT_CONFIG_ID', 'DISTINCT %s', 'CONFIG_ID'),
			'PHONE_NAME' => 'CONFIG.PHONE_NAME',
			'PORTAL_MODE' => 'CONFIG.PORTAL_MODE',
			'SEARCH_ID' => 'CONFIG.SEARCH_ID',
			'RENTED_PHONE_NUMBER' => 'CONFIG.NUMBER.NUMBER',
			'GROUP_PHONE_NUMBER' => 'CONFIG.GROUP_NUMBER.NUMBER',
			'CALLER_ID_NUMBER' => 'CONFIG.CALLER_ID.NUMBER'
		),
		'filter' => array(
				'=ACCESS_CODE' => $userAccessCodes,
				'=CONFIG.CAN_BE_SELECTED' => 'Y',
			)
		)
	);

	$defaultLineId = static::getUserOutgoingLine($userId);
	$defaultLineFound = false;
	$result = array();
	while ($row = $cursor->fetch())
	{
		if ($row['PORTAL_MODE'] == CVoxImplantConfig::MODE_RENT)
		{
			$line = $row['RENTED_PHONE_NUMBER'];
		}
		else if ($row['PORTAL_MODE'] == CVoxImplantConfig::MODE_LINK)
		{
			$line = $row['CALLER_ID_NUMBER'];
		}
		else if ($row['PORTAL_MODE'] == CVoxImplantConfig::MODE_GROUP)
		{
			$line = $row['GROUP_PHONE_NUMBER'];
		}
		else
		{
			$line = $row['SEARCH_ID'];
		}

		if($line == $defaultLineId) $defaultLineFound = true;
		$result[] = $line;
	}
	if(!$defaultLineFound)
	{
		$result[] = $defaultLineId;
	}

	//rest apps and their lines are available unconditionally
	$restApps = VIRestHelper::getExternalCallHandlers();
	$externalNumbers = array();
	$externalNumbersCursor = VIModelExternalLineTable::getList(array(
		'filter' => array(
			'=REST_APP_ID' => array_keys($restApps)
		)
	));
	foreach ($externalNumbersCursor->getIterator() as $row)
	{
		$externalNumbers[$row['REST_APP_ID']][] = $row;
	}
	foreach ($restApps as $restAppId => $restAppName)
	{
		$prefixedRestAppId = CVoxImplantConfig::MODE_REST_APP . ':' . $restAppId;
		$result[] = $prefixedRestAppId;

		if($externalNumbers[$restAppId])
		{
			foreach ($externalNumbers[$restAppId] as $externalNumber)
			{
				$result[] = $externalNumber['NUMBER'];
			}
		}
	}

	$cacheManager->set($cacheTag, $result);
	return $result;
}