• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/ml/dataprovider/openlines.php
  • Класс: Bitrix\Crm\Ml\DataProvider\OpenLines
  • Вызов: OpenLines::getFeatures
public function getFeatures($entityTypeId, $entityId)
{
	if(!Loader::includeModule("imopenlines") || !Loader::includeModule("im"))
	{
		return false;
	}

	$activities = ActivityTable::getList([
		"select" => ["ID", "COMPLETED", "START_TIME", "END_TIME", "CREATED", "ASSOCIATED_ENTITY_ID"],
		"filter" => [
			"=PROVIDER_ID" => \Bitrix\Crm\Activity\Provider\OpenLine::ACTIVITY_PROVIDER_ID,
			"=BINDINGS.OWNER_TYPE_ID" => $entityTypeId,
			"=BINDINGS.OWNER_ID" => $entityId,
		],
		"order" => [
			"START_TIME" => "desc"
		],
		"limit" => static::MAX_DIALOGS

	])->fetchAll();

	$result["OL_SESSIONS_TOTAL"] = count($activities);

	// OL_SESSIONS_LAST_WEEK
	$weekBefore = clone $this->currentDate;
	$weekBefore->add("-1 weeks");
	$linesLastWeek = FeatureBuilder::filterActivitiesByDate($activities, $weekBefore, $this->currentDate);
	$result["OL_SESSIONS_LAST_WEEK"] = count($linesLastWeek);

	// OL_SESSIONS_LAST_MONTH
	$monthBefore = clone $this->currentDate;
	$monthBefore->add("-1 weeks");
	$linesLastMonth = FeatureBuilder::filterActivitiesByDate($activities, $monthBefore, $this->currentDate);
	$result["OL_SESSIONS_LAST_MONTH"] = count($linesLastMonth);

	// OL_SESSIONS_OLDER_MONTH
	$from = DateTime::createFromTimestamp(0);
	$linesOld = FeatureBuilder::filterActivitiesByDate($activities, $from, $monthBefore);
	$result["OL_SESSIONS_OLDER_MONTH"] = count($linesOld);

	$sessionIds = array_map(function($act){return $act["ASSOCIATED_ENTITY_ID"];}, $activities);
	$sessions = SessionTable::getList([
		"select" => ["*"],
		"filter" => [
			"=ID" => $sessionIds
		]
	])->fetchAll();

	// OL_SOURCE
	$sources = array_map(function($session){return $session["SOURCE"];}, $sessions);
	$sourcesCount = array_count_values($sources);
	$max = 0;
	$maxSource = "";
	foreach ($sourcesCount as $k => $v)
	{
		if($v > $max)
		{
			$max = $v;
			$maxSource = $k;
		}
	}
	$result["OL_SOURCE"] = $maxSource;

	$chatIds = array_map(function($session){return $session["CHAT_ID"];}, $sessions);

	$messages = MessageTable::getList([
		"select" => ["CHAT_ID", "AUTHOR_ID", "MESSAGE", "DATE_CREATE", "IS_OPERATOR" => "AUTHOR.IS_REAL_USER"],
		"filter" => [
			"=CHAT_ID" => $chatIds,
			">AUTHOR_ID" => 0
		]
	])->fetchAll();

	// OL_CLIENT_ANSWER_TIME
	// OL_OPERATOR_ANSWER_TIME
	$firstMessages = [];
	foreach ($messages as $messageFields)
	{
		$last = count($firstMessages) > 0 ? $firstMessages[count($firstMessages) - 1] : null;

		if(!$last || $last['IS_OPERATOR'] !== $messageFields['IS_OPERATOR'])
		{
			$firstMessages[] = [
				'IS_OPERATOR' => $messageFields['IS_OPERATOR'],
				'DATE_CREATE' => $messageFields['DATE_CREATE'],
			];
		}
	}

	$opAnswerTimes = [];
	$clientAnswerTimes = [];
	$firstMessagesCount = count($firstMessages);
	if($firstMessagesCount > 1)
	{
		for ($i = 1; $i < $firstMessagesCount; $i++)
		{
			$time = $firstMessages[$i]['DATE_CREATE']->getTimestamp() - $firstMessages[$i - 1]['DATE_CREATE']->getTimestamp();
			if($firstMessages[$i]['IS_OPERATOR'] === 'Y')
			{
				$opAnswerTimes[] = $time;
			}
			else
			{
				$clientAnswerTimes[] = $time;
			}
		}
		sort($opAnswerTimes);
		sort($clientAnswerTimes);

		$result["OL_CLIENT_ANSWER_TIME"] = FeatureBuilder::getMedianValue($clientAnswerTimes);
		$result["OL_OPERATOR_ANSWER_TIME"] = FeatureBuilder::getMedianValue($opAnswerTimes);
	}

	// OL_MESSAGE_COUNT
	$result["OL_MESSAGE_COUNT"] = count($messages);

	// OL_OPERATOR_MESSAGE_TEXT
	$operatorMessages = array_filter($messages, function($message){return $message["IS_OPERATOR"] === "Y";});
	$operatorMessages = array_map(function($message){return $message["MESSAGE"];}, $operatorMessages);
	$result["OL_OPERATOR_MESSAGE_TEXT"] = FeatureBuilder::clearText(join(" ", $operatorMessages));

	// OL_CLIENT_MESSAGE_TEXT
	$clientMessages = array_filter($messages, function($message){return $message["IS_OPERATOR"] !== "Y";});
	$clientMessages = array_map(function($message){return $message["MESSAGE"];}, $clientMessages);
	$result["OL_CLIENT_MESSAGE_TEXT"] = FeatureBuilder::clearText(join(" ", $clientMessages));

	return $result;
}