• Модуль: voximplant
  • Путь к файлу: ~/bitrix/modules/voximplant/classes/general/vi_outgoing.php
  • Класс: CVoxImplantOutgoing
  • Вызов: CVoxImplantOutgoing::Init
static function Init($params)
{
	$config = CVoxImplantConfig::GetConfig($params['CONFIG_ID']);
	if ($params['CALL_ID'])
	{
		$call = VICall::load($params['CALL_ID']);
		if($call)
		{
			$callFields = [
				'CONFIG_ID' => $params['CONFIG_ID'],
				'CRM' => $params['CRM'],
				'USER_ID' => $params['USER_ID'],
				'CALLER_ID' => $params['PHONE_NUMBER'],
				'STATUS' => VIModelCallTable::STATUS_WAITING,
				'ACCESS_URL' => $params['ACCESS_URL'],
				'PORTAL_NUMBER' => $config['SEARCH_ID'],
			];

			if($params['CRM_ENTITY_TYPE'] && $params['CRM_ENTITY_ID'])
			{
				$callFields['CRM_ENTITY_TYPE'] = $params['CRM_ENTITY_TYPE'];
				$callFields['CRM_ENTITY_ID'] = $params['CRM_ENTITY_ID'];
			}
			if($params['CRM_ACTIVITY_ID'])
			{
				$callFields['CRM_ACTIVITY_ID'] = $params['CRM_ACTIVITY_ID'];
			}
			if($params['CRM_CALL_LIST'])
			{
				$callFields['CRM_CALL_LIST'] = $params['CRM_CALL_LIST'];
			}
			if(is_array($params['CRM_BINDINGS']))
			{
				$callFields['CRM_BINDINGS'] = $params['CRM_BINDINGS'];
			}
			if($params['SESSION_ID'])
			{
				$callFields['SESSION_ID'] = (int)$params['SESSION_ID'];
			}

			$call->update($callFields);

		}
	}
	if (!$call)
	{
		$call = VICall::create([
			'INCOMING' => CVoxImplantMain::CALL_OUTGOING,
			'CONFIG_ID' => $params['CONFIG_ID'],
			'CALL_ID' => $params['CALL_ID'],
			'SESSION_ID' => (int)$params['SESSION_ID'],
			'CRM' => $params['CRM'],
			'CRM_ACTIVITY_ID' => $params['CRM_ACTIVITY_ID'] ?? null,
			'CRM_CALL_LIST' => $params['CRM_CALL_LIST'] ?? null,
			'CRM_BINDINGS' => $params['CRM_BINDINGS'] ?? [],
			'USER_ID' => $params['USER_ID'],
			'CALLER_ID' => $params['PHONE_NUMBER'],
			'STATUS' => VIModelCallTable::STATUS_WAITING,
			'ACCESS_URL' => $params['ACCESS_URL'],
			'DATE_CREATE' => new FieldTypeDateTime(),
			'PORTAL_NUMBER' => $config['SEARCH_ID'],
			'LAST_PING' => null,
			'QUEUE_ID' => null,
		]);
	}
	$call->addUsers([$params['USER_ID']], VIModelCallUserTable::ROLE_CALLER, VIModelCallUserTable::STATUS_CONNECTED);

	if((string)$params['CRM_ENTITY_TYPE'] !== '' && $params['CRM_ENTITY_ID'] > 0)
	{
		$entity = [
			'ENTITY_TYPE' => (string)$params['CRM_ENTITY_TYPE'],
			'ENTITY_ID' => $params['CRM_ENTITY_ID'],
			'IS_PRIMARY' => 'Y',
			'IS_CREATED' => 'N'
		];
		$call->updateCrmEntities([$entity]);
	}

	$router = new VIRoutingRouter($call);
	$firstAction = $router->getNextAction();

	if (
		in_array($firstAction->getCommand(), [VIRoutingCommand::INVITE, VIRoutingCommand::BUSY], true)
		|| ($firstAction->getCommand() === VIRoutingCommand::HANGUP && isset($firstAction->getParameters()['USERS']))
	)
	{
		// looks like internal call
		$queueFields = $firstAction->getParameter('QUEUE');
		if ($queueFields)
		{

		}
		else
		{
			$firstUser = $firstAction->getParameter('USERS')[0];
			$call->updatePortalUserId($firstUser['USER_ID']);
		}
	}

	if (!$call->isInternalCall())
	{
		if($call->getPrimaryEntityType() && $call->getPrimaryEntityId())
		{
			//nop
		}
		else
		{
			$crmEntities = CVoxImplantCrmHelper::getCrmEntities($call);
			$call->updateCrmEntities($crmEntities);
		}

		$activityBindings = CVoxImplantCrmHelper::getActivityBindings($call);
		if(is_array($activityBindings))
		{
			$call->updateCrmBindings($activityBindings);
		}

		CVoxImplantCrmHelper::registerCallInCrm($call);
	}

	$call->getSignaling()->sendOutgoing($call->getUserId(), $params['CALL_DEVICE']);

	return $firstAction;
}