• Модуль: voximplant
  • Путь к файлу: ~/bitrix/modules/voximplant/classes/general/vi_incoming.php
  • Класс: CVoxImplantIncoming
  • Вызов: CVoxImplantIncoming::RegisterCall
static function RegisterCall($config, $params)
{
	$call = VICall::load($params['CALL_ID']);

	$portalNumber = $config['SEARCH_ID'];
	$externalLineId = null;

	if($config['PORTAL_MODE'] === CVoxImplantConfig::MODE_SIP && $config['SIP_DETECT_LINE_NUMBER'] === 'Y' && is_array($params['SIP_HEADERS']))
	{
		// try to guess portal number from sip headers
		$portalNumber = static::guessPortalNumber($config, $params['SIP_HEADERS']);

		if($portalNumber !== $config['SEARCH_ID'])
		{
			$normalizedNumber = BitrixMainPhoneNumberParser::getInstance()->parse($portalNumber)->format(BitrixMainPhoneNumberFormat::E164);
			VIModelExternalLineTable::merge([
				'TYPE' => VIModelExternalLineTable::TYPE_SIP,
				'NUMBER' => $portalNumber,
				'NORMALIZED_NUMBER' => $normalizedNumber,
				'SIP_ID' => $config['SIP_ID'],
				'IS_MANUAL' => 'N'
			]);

			$row = VIModelExternalLineTable::getRow([
				'filter' => [
					'=SIP_ID' => $config['SIP_ID'],
					'=NUMBER' => $portalNumber
				]
			]);
			if($row)
			{
				$externalLineId = $row['ID'];
			}
		}
	}

	if($call)
	{
		// callback calls are pre-created
		$callFields = [
			'STATUS' => VIModelCallTable::STATUS_WAITING,
			//'CRM' => $config['CRM'],
			'ACCESS_URL' => $params['ACCESS_URL'],
			'DATE_CREATE' => new BitrixMainTypeDateTime(),
			'WORKTIME_SKIPPED' => $config['WORKTIME_SKIP_CALL'] == 'Y',
			'PORTAL_NUMBER' => $config['SEARCH_ID'],
			'SESSION_ID' => $params['SESSION_ID'],
		];
		$call->update($callFields);
	}
	else
	{
		$call = VICall::create([
			'CONFIG_ID' => $config['ID'],
			'CALL_ID' => $params['CALL_ID'],
			'USER_ID' => 0,
			'CALLER_ID' => $params['CALLER_ID'],
			'STATUS' => VIModelCallTable::STATUS_WAITING,
			'INCOMING' => CVoxImplantMain::CALL_INCOMING,
			//'CRM' => $config['CRM'],
			'ACCESS_URL' => $params['ACCESS_URL'],
			'DATE_CREATE' => new BitrixMainTypeDateTime(),
			'WORKTIME_SKIPPED' => $config['WORKTIME_SKIP_CALL'] == 'Y',
			'PORTAL_NUMBER' => $portalNumber,
			'EXTERNAL_LINE_ID' => $externalLineId,
			'SESSION_ID' => $params['SESSION_ID'],
			'SIP_HEADERS' => is_array($params['SIP_HEADERS']) ? $params['SIP_HEADERS'] : [],
			'LAST_PING'=> null,
			'QUEUE_ID' => null,
		]);
	}

	//if ($config['CRM'] == 'Y')
	$crmData = CVoxImplantCrmHelper::getCrmEntities($call);
	$call->updateCrmEntities($crmData);
	$activityBindings = CVoxImplantCrmHelper::getActivityBindings($call);
	if(is_array($activityBindings))
	{
		$call->updateCrmBindings($activityBindings);
	}
	if(CVoxImplantConfig::GetLeadWorkflowExecution() == CVoxImplantConfig::WORKFLOW_START_IMMEDIATE)
	{
		CVoxImplantCrmHelper::StartCallTrigger($call);
	}

	if ($config['WORKTIME_SKIP_CALL'] == 'Y')
	{
		$config['WORKTIME_USER_ID'] = 0;
		if($call->getPrimaryEntityId() > 0 && $call->getPrimaryEntityType() != '')
		{
			$config['WORKTIME_USER_ID'] = CVoxImplantCrmHelper::getResponsible($call->getPrimaryEntityType(), $call->getPrimaryEntityId());
		}
		else
		{
			$queue =  VIQueue::createWithId($config['QUEUE_ID']);
			$queueUserId = ($queue instanceof VIQueue) ?$queue->getFirstUserId($config['TIMEMAN'] == 'Y'): false;

			if ($queueUserId)
			{
				$queue->touchUser($queueUserId);
				$config['WORKTIME_USER_ID'] = $queueUserId;
			}
		}

		if($config['WORKTIME_USER_ID'] > 0)
		{
			$call->updateUserId($config['WORKTIME_USER_ID']);
			CVoxImplantCrmHelper::registerCallInCrm($call);

			if(CVoxImplantConfig::GetLeadWorkflowExecution() == CVoxImplantConfig::WORKFLOW_START_IMMEDIATE)
			{
				CVoxImplantCrmHelper::StartCallTrigger($call, true);
			}
		}
		else
		{
			$queue = VIQueue::createWithId($config['QUEUE_ID']);
			$queueUserId = ($queue instanceof VIQueue) ? $queue->getFirstUserId($config['TIMEMAN'] == 'Y') : false;
			if($queueUserId)
			{
				$queue->touchUser($queueUserId);
				$config['WORKTIME_USER_ID'] = $queueUserId;
			}
		}
	}

	return $config;
}