static function registerExternalCall(array $fields)
{
$fields['USER_ID'] = (int)$fields['USER_ID'];
$result = new Result();
$callId = 'externalCall.'.md5(uniqid($fields['REST_APP_ID'].$fields['USER_ID'].$fields['PHONE_NUMBER'], true)).'.'.time();
$phoneNumber = CVoxImplantPhone::stripLetters($fields['PHONE_NUMBER']);
if (!$phoneNumber)
{
$result->addError(new Error('Unsupported phone number format'));
return $result;
}
$userCheck = BitrixMainUserTable::getRow([
'select' => ['ID'],
'filter' => ['=ID' => $fields['USER_ID'], '=ACTIVE' => 'Y', '=IS_REAL_USER' => 'Y']
]);
if (!$userCheck)
{
$result->addError(new Error('User is not found or is not active'));
return $result;
}
if (isset($fields['LINE_NUMBER']))
{
$fields['LINE_NUMBER'] = trim($fields['LINE_NUMBER']);
if ($fields['LINE_NUMBER'] != '')
{
$lineNumber = trim($fields['LINE_NUMBER']);
$row = ExternalLineTable::getRow([
'filter' => [
'=NUMBER' => $lineNumber,
'=REST_APP_ID' => $fields['REST_APP_ID']
]
]);
if ($row)
{
$lineId = $row['ID'];
}
else
{
$insertResult = ExternalLineTable::add([
'NUMBER' => $lineNumber,
'REST_APP_ID' => $fields['REST_APP_ID']
]);
if ($insertResult->isSuccess())
{
$lineId = $insertResult->getId();
}
}
}
}
$initEventData = [
'CALL_ID' => $callId,
'CALL_TYPE' => $fields['TYPE'],
'CALLER_ID' => $phoneNumber,
'REST_APP_ID' => $fields['REST_APP_ID']
];
$initEvent = new Event('voximplant', 'onCallInit', $initEventData);
$initEvent->send();
if ($initEvent->getResults() != null)
{
foreach ($initEvent->getResults() as $eventResult)
{
if ($eventResult->getType() === EventResult::SUCCESS)
{
$eventResultData = $eventResult->getParameters();
if (isset($eventResultData['CALLER_ID']))
{
$phoneNumber = $eventResultData['CALLER_ID'];
}
}
}
}
// checking for the internal call
$portalCall = false;
$portalUserId = null;
$userData = PhoneTable::getList([
'select' => ['USER_ID'],
'filter' => [
'=PHONE_NUMBER' => $phoneNumber,
'=PHONE_MNEMONIC' => 'UF_PHONE_INNER',
'=USER.ACTIVE' => 'Y'
],
])->fetch();
if ($userData)
{
$portalCall = true;
$portalUserId = $userData['USER_ID'];
}
$duplicateFilter = [
'=USER_ID' => $fields['USER_ID'],
'=CALLER_ID' => $phoneNumber,
'=INCOMING' => $fields['TYPE'],
'>DATE_CREATE' => (new DateTime())->add('-T30M'),
'=REST_APP_ID' => $fields['REST_APP_ID'],
];
if ($lineId)
{
$duplicateFilter['=EXTERNAL_LINE_ID'] = $lineId;
}
if (isset($fields['EXTERNAL_CALL_ID']))
{
$duplicateFilter['=EXTERNAL_CALL_ID'] = $fields['EXTERNAL_CALL_ID'];
}
$duplicateCall = CallTable::getRow([
'filter' => $duplicateFilter
]);
if ($duplicateCall)
{
$callId = $duplicateCall['CALL_ID'];
$call = Call::load($callId);
if ($call)
{
if ($fields['SHOW'] ?? null)
{
self::showExternalCall([
'CALL_ID' => $callId
]);
}
$createdEntities = array_map(
function($e)
{
return [
'ENTITY_TYPE' => $e['ENTITY_TYPE'],
'ENTITY_ID' => $e['ENTITY_ID'],
];
},
$call->getCreatedCrmEntities()
);
return $result->setData([
'CALL_ID' => $call->getCallId(),
'CRM_CREATED_LEAD' => (int)$call->getCreatedCrmLead() ?: null,
'CRM_CREATED_ENTITIES' => $createdEntities,
'CRM_ENTITY_TYPE' => $call->getPrimaryEntityType(),
'CRM_ENTITY_ID' => $call->getPrimaryEntityId() ?: null,
]);
}
}
$crmCreate = (($fields['CRM'] ?? null) || $fields['CRM_CREATE']) && !$portalCall;
$callFields = [
'USER_ID' => $fields['USER_ID'],
'CALL_ID' => $callId,
'INCOMING' => $fields['TYPE'],
'DATE_CREATE' => (($fields['CALL_START_DATE'] ?? null) ?: new DateTime()),
'CALLER_ID' => $phoneNumber,
'PORTAL_USER_ID' => $portalUserId,
'CRM' => $portalCall ? 'N' : 'Y',
'REST_APP_ID' => $fields['REST_APP_ID'],
'EXTERNAL_LINE_ID' => $lineId ?? null,
'PORTAL_NUMBER' => $lineNumber ?: CVoxImplantConfig::MODE_REST_APP . ":" . $fields['REST_APP_ID'],
'LAST_PING' => null,
'QUEUE_ID' => null,
];
if (isset($fields['EXTERNAL_CALL_ID']))
{
$callFields['EXTERNAL_CALL_ID'] = $fields['EXTERNAL_CALL_ID'];
}
if ($fields['CALL_LIST_ID'] > 0)
{
$callFields['CRM_CALL_LIST'] = (int)$fields['CALL_LIST_ID'];
}
if ($fields['CRM_ACTIVITY_ID'] > 0)
{
$callFields['CRM_ACTIVITY_ID'] = (int)$fields['CRM_ACTIVITY_ID'];
}
$call = Call::create($callFields);
if (isset($fields['CRM_ENTITY_TYPE'], $fields['CRM_ENTITY_ID']))
{
$call->addCrmEntities([
[
'ENTITY_TYPE' => $fields['CRM_ENTITY_TYPE'],
'ENTITY_ID' => $fields['CRM_ENTITY_ID'],
'IS_CREATED' => 'N',
'IS_PRIMARY' => 'Y'
]
]);
if (is_array($fields['CRM_BINDINGS']))
{
$activityBindings = CVoxImplantCrmHelper::createActivityBindings([
'CRM_ENTITY_TYPE' => $fields['CRM_ENTITY_TYPE'],
'CRM_ENTITY_ID' => $fields['CRM_ENTITY_ID'],
'CRM_BINDINGS' => $fields['CRM_BINDINGS']
]);
}
else
{
$activityBindings = CVoxImplantCrmHelper::getActivityBindings($call);
}
if (is_array($activityBindings))
{
$call->updateCrmBindings($activityBindings);
}
}
else
{
$crmData = CVoxImplantCrmHelper::getCrmEntities($call);
$call->updateCrmEntities($crmData);
$activityBindings = CVoxImplantCrmHelper::getActivityBindings($call);
if (is_array($activityBindings))
{
$call->updateCrmBindings($activityBindings);
}
}
if ($crmCreate)
{
$createResult = CVoxImplantCrmHelper::registerCallInCrm(
$call,
[
'CRM' => 'Y',
'CRM_CREATE' => CVoxImplantConfig::CRM_CREATE_LEAD,
'CRM_CREATE_CALL_TYPE' => CVoxImplantConfig::CRM_CREATE_CALL_TYPE_ALL,
'CRM_SOURCE' => $fields['CRM_SOURCE']
]
);
if (!$createResult)
{
$leadCreationError = CVoxImplantCrmHelper::$lastError;
}
}
if (CVoxImplantConfig::GetLeadWorkflowExecution() == CVoxImplantConfig::WORKFLOW_START_IMMEDIATE)
{
CVoxImplantCrmHelper::StartCallTrigger($call);
}
CVoxImplantMain::sendCallStartEvent([
'CALL_ID' => $callId,
'USER_ID' => $fields['USER_ID']
]);
if ($fields['SHOW'])
{
self::showExternalCall([
'CALL_ID' => $callId
]);
}
$createdEntities = array_map(
function($e)
{
return [
'ENTITY_TYPE' => $e['ENTITY_TYPE'],
'ENTITY_ID' => $e['ENTITY_ID'],
];
},
$call->getCreatedCrmEntities()
);
$resultData = [
'CALL_ID' => $call->getCallId(),
'CRM_CREATED_LEAD' => (int)$call->getCreatedCrmLead() ?: null,
'CRM_CREATED_ENTITIES' => $createdEntities,
'CRM_ENTITY_TYPE' => (string)$call->getPrimaryEntityType(),
'CRM_ENTITY_ID' => (int)$call->getPrimaryEntityId() ?: null,
];
if (isset($leadCreationError))
{
$resultData['LEAD_CREATION_ERROR'] = $leadCreationError;
}
$result->setData($resultData);
return $result;
}