• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/call/calllog.php
  • Класс: BitrixImCallCallLog
  • Вызов: CallLog::get
static function get($params = [])
{
	$filterType = in_array($params['TYPE'], self::getTypes(), true)? $params['TYPE']: self::TYPE_ALL;
	$filterCallId = $params['TYPE'] === self::TYPE_SEARCH? intval($params['CALL_ID']): 0;

	$select = [
		'ID', 'TYPE', 'INITIATOR_ID', 'PROVIDER', 'STATE', 'LOG_URL',
		'ENTITY_TYPE', 'ENTITY_ID',
		'START_DATE', 'END_DATE',
		'CHAT_TITLE' => 'CHAT.TITLE'
	];

	$runtime = [
		new BitrixMainEntityReferenceField(
			'CHAT',
			BitrixImModelChatTable::class,
			[
				"=ref.ID" => "this.CHAT_ID",
			],
			["join_type"=>"LEFT"]
		)
	];

	$filter = [];

	if ($filterType == self::TYPE_SEARCH)
	{
		$filter = [
			'=ID' => $filterCallId
		];
	}
	else
	{
		if ($filterType == self::TYPE_NOW)
		{
			$filter = [
				'!=STATE' => BitrixImCallCall::STATE_FINISHED
			];
		}

		if ($params['LAST_ID'])
		{
			$filter[' $select,
		'runtime' => $runtime,
		'filter' => $filter,
		'order' => ['ID' => 'DESC'],
		'limit' => '50'
	]);

	$list = [];
	while($row = $result->fetch())
	{
		$call = $row;

		if (!$call['CHAT_TITLE'])
		{
			$call['CHAT_TITLE'] = User::getInstance($call['INITIATOR_ID'])->getLastName(false);

			if ($call['ENTITY_TYPE'] === 'chat' && !Common::isChatId($call['ENTITY_ID']))
			{
				$call['CHAT_TITLE'] .= ' -> '.User::getInstance($call['ENTITY_ID'])->getLastName(false);
			}
			else
			{
				$call['CHAT_TITLE'] .= ' -> '.ucfirst($call['ENTITY_TYPE']);
			}
		}

		$call['DURATION'] = 0;
		$startDate = $call['START_DATE'] instanceof DateTime? $call['START_DATE']->getTimestamp(): 0;
		$endDate = $call['END_DATE'] instanceof DateTime? $call['END_DATE']->getTimestamp(): (new DateTime())->getTimestamp();

		$call['DURATION'] = $endDate - $startDate;
		$call['DURATION_TEXT'] = CModule::includeModule('voximplant') ? CVoxImplantHistory::convertDurationToText($call['DURATION']) : $call['DURATION'];

		$call['CONNECTIONS'] = [];

		$list[$row['ID']] = $call;
	}

	$result = BitrixImModelCallUserTable::getList([
		'select' => ['CALL_ID', 'USER_ID', 'STATE', 'LAST_SEEN'],
		'filter' => [
			'=CALL_ID' => array_keys($list)
		],
	]);

	while($row = $result->fetch())
	{
		$connection = $row;

		$connection['INITIATOR'] = $list[$row['CALL_ID']]['INITIATOR_ID'] === $row['USER_ID'];
		$connection['USER_NAME'] = User::getInstance($row['USER_ID'])->getFullName(false);
		$connection['USER_AVATAR'] = User::getInstance($row['USER_ID'])->getAvatar();
		$connection['USER_COLOR'] = User::getInstance($row['USER_ID'])->getColor();

		if (defined('IM_CALL_LOG_PATH'))
		{
			$connection['LOG_URL'] = IM_CALL_LOG_PATH."{$row['CALL_ID']}-{$row['USER_ID']}.txt";
		}
		if ($list[$row['CALL_ID']]['PROVIDER'] === Call::PROVIDER_VOXIMPLANT && defined('IM_CALL_STAT_URL'))
		{
			$connection['STAT_URL'] = str_replace(
				[
					'#callId#',
					'#userId#',
					'#tsFrom#',
					'#tsTo#',
				],
				[
					$row['CALL_ID'],
					$row['USER_ID'],
					$list[$row['CALL_ID']]['START_DATE']->getTimestamp() * 1000,
					$list[$row['CALL_ID']]['END_DATE']
						? $list[$row['CALL_ID']]['END_DATE']->getTimestamp() * 1000
						: ($list[$row['CALL_ID']]['START_DATE']->getTimestamp() + 7200) * 1000
					,
				],
				IM_CALL_STAT_URL
			);
		}

		unset($connection['CALL_ID']);

		$list[$row['CALL_ID']]['CONNECTIONS'][] = $connection;
	}

	return $list;
}