- Модуль: 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;
}