- Модуль: voximplant
- Путь к файлу: ~/bitrix/modules/voximplant/classes/general/vi_crm_helper.php
- Класс: CVoxImplantCrmHelper
- Вызов: CVoxImplantCrmHelper::AddCall
static function AddCall(array $callFields, array $additionalParams = array())
{
static::$lastError = '';
if (!CModule::IncludeModule('crm'))
{
static::$lastError = 'CRM is not installed';
return false;
}
if ($callFields['PHONE_NUMBER'] == '')
{
static::$lastError = 'Can not create activity for call without caller id';
return false;
}
CVoxImplantHistory::WriteToLog($callFields, 'CRM ADD CALL');
$bindings = $additionalParams['CRM_BINDINGS'];
if(!is_array($bindings) || empty($bindings))
{
$entityManager = new BitrixCrmEntityManageFacility();
$entityManager->getSelector()->appendPhoneCriterion($callFields['PHONE_NUMBER']);
$entityManager->getSelector()->search();
$bindings = $entityManager->getActivityBindings();
}
if(empty($bindings) && isset($callFields['CRM_ENTITY_TYPE']) && isset($callFields['CRM_ENTITY_ID']))
{
$entityManager = new BitrixCrmEntityManageFacility();
$entityManager->getSelector()->setEntity(
CCrmOwnerType::ResolveID($callFields['CRM_ENTITY_TYPE']),
$callFields['CRM_ENTITY_ID']
);
$entityManager->getSelector()->search();
$bindings = $entityManager->getActivityBindings();
}
$bindings = array_values($bindings);
if (empty($bindings))
{
static::$lastError = 'Could not find associated crm entity for the current call';
return false;
}
if(
isset($callFields['INCOMING'])
&& (
intval($callFields['INCOMING']) === CVoxImplantMain::CALL_INCOMING
|| intval($callFields['INCOMING']) === CVoxImplantMain::CALL_INCOMING_REDIRECT
)
)
{
$direction = CCrmActivityDirection::Incoming;
}
else
{
$direction = CCrmActivityDirection::Outgoing;
}
$activityFields = array(
'TYPE_ID' => CCrmActivityType::Call,
'PROVIDER_ID' => ProviderCall::ACTIVITY_PROVIDER_ID,
//'ASSOCIATED_ENTITY_ID' => $params['ID'],
'CREATED' => $callFields['CALL_START_DATE'],
'START_TIME' => $callFields['CALL_START_DATE'],
'END_TIME' => static::getCallEndTime($callFields),
'DEADLINE' => static::getCallEndTime($callFields),
'PRIORITY' => CCrmActivityPriority::Medium,
'LOCATION' => '',
'NOTIFY_TYPE' => CCrmActivityNotifyType::None,
'SUBJECT' => self::createActivitySubject($callFields),
'RESPONSIBLE_ID' => $callFields['PORTAL_USER_ID'],
'ORIGIN_ID' => 'VI_'.$callFields['CALL_ID'],
'BINDINGS' => $bindings,
'SETTINGS' => array(),
'AUTHOR_ID' => $callFields['PORTAL_USER_ID'],
);
if (static::isNewCallScenarioEnabled())
{
$activityFields['IS_INCOMING_CHANNEL'] = ($direction === CCrmActivityDirection::Incoming ? 'Y' : 'N');
}
if($callFields['INCOMING'] === CVoxImplantMain::CALL_CALLBACK)
{
$activityFields['PROVIDER_TYPE_ID'] = ProviderCall::ACTIVITY_PROVIDER_TYPE_CALLBACK;
}
else
{
$activityFields['PROVIDER_TYPE_ID'] = ProviderCall::ACTIVITY_PROVIDER_TYPE_CALL;
$activityFields['DIRECTION'] = $direction;
}
$activityFields['COMMUNICATIONS'] = array(
array(
'ID' => 0,
'TYPE' => 'PHONE',
'VALUE' => $callFields['PHONE_NUMBER'],
'ENTITY_ID' => $callFields['CRM_ENTITY_ID'],
'ENTITY_TYPE_ID' => CCrmOwnerType::ResolveID($callFields['CRM_ENTITY_TYPE'])
)
);
if (static::isNewCallScenarioEnabled())
{
$activityFields['DESCRIPTION'] = $additionalParams['DESCRIPTION'] ?? '';
$activityFields['SETTINGS']['IS_DESCRIPTION_ONLY'] = true;
}
else
{
$description = '';
$params = CVoxImplantHistory::PrepereData($callFields);
if (isset($additionalParams['DESCRIPTION']) && $additionalParams['DESCRIPTION'] <> '')
{
$description = $additionalParams['DESCRIPTION'];
}
else if ($additionalParams['WORKTIME_SKIPPED'] == 'Y')
{
$description = GetMessage('VI_WORKTIME_SKIPPED_CALL');
}
else
{
if ($params['CALL_DURATION'] > 0)
{
$description = GetMessage('VI_CRM_CALL_DURATION', ['#DURATION#' => $params['CALL_DURATION_TEXT']]);
}
}
if ($callFields['INCOMING'] == CVoxImplantMain::CALL_INCOMING)
{
$portalNumbers = array_map(
function($line)
{
return $line["SHORT_NAME"];
},
CVoxImplantConfig::GetLinesEx([
"showRestApps" => true,
"showInboundOnly" => true
])
);
$portalNumber = isset($portalNumbers[$callFields['PORTAL_NUMBER']])? $portalNumbers[$callFields['PORTAL_NUMBER']]: '';
if ($portalNumber)
{
$description = $description."n".GetMessage('VI_CRM_CALL_TO_PORTAL_NUMBER', array('#PORTAL_NUMBER#' => $portalNumber));
}
}
$activityFields['DESCRIPTION'] = $description;
}
$activityFields['DESCRIPTION_TYPE'] = CCrmContentType::PlainText;
if (
$callFields['INCOMING'] == CVoxImplantMain::CALL_INCOMING
|| $callFields['INCOMING'] == CVoxImplantMain::CALL_CALLBACK
)
{
if (!static::isNewCallScenarioEnabled())
{
$activityFields['COMPLETED'] = $callFields['CALL_FAILED_CODE'] != '304';
}
if ($callFields['CALL_FAILED_CODE'] === '304')
{
$activityFields['SETTINGS']['MISSED_CALL'] = true;
}
}
else
{
$activityFields['COMPLETED'] = 'Y';
}
if($callFields['CALL_FAILED_CODE'] == '200')
{
if($callFields['INCOMING'] == CVoxImplantMain::CALL_INCOMING)
$activityFields['RESULT_STREAM'] = BitrixCrmActivityStatisticsStream::Incoming;
else if($callFields['INCOMING'] == CVoxImplantMain::CALL_INCOMING_REDIRECT)
$activityFields['RESULT_STREAM'] = BitrixCrmActivityStatisticsStream::Incoming;
else if($callFields['INCOMING'] == CVoxImplantMain::CALL_OUTGOING)
$activityFields['RESULT_STREAM'] = BitrixCrmActivityStatisticsStream::Outgoing;
else if($callFields['INCOMING'] == CVoxImplantMain::CALL_CALLBACK)
$activityFields['RESULT_STREAM'] = BitrixCrmActivityStatisticsStream::Reversing;
}
else
{
$activityFields['RESULT_STREAM'] = BitrixCrmActivityStatisticsStream::Missing;
}
if ($callFields['CALL_VOTE'] > 3)
{
$activityFields['RESULT_MARK'] = BitrixCrmActivityStatisticsMark::Positive;
}
else if ($callFields['CALL_VOTE'] == 3 && static::isNewCallScenarioEnabled())
{
$activityFields['RESULT_MARK'] = BitrixCrmActivityStatisticsMark::Neutral;
}
else if ($callFields['CALL_VOTE'] > 0)
{
$activityFields['RESULT_MARK'] = BitrixCrmActivityStatisticsMark::Negative;
}
else
{
$activityFields['RESULT_MARK'] = BitrixCrmActivityStatisticsMark::None;
}
$activityId = CCrmActivity::Add(
$activityFields,
false,
true, [
'REGISTER_SONET_EVENT' => true,
'PRESERVE_CREATION_TIME' => true
]
);
if($activityId > 0)
{
BitrixCrmIntegrationChannelVoxImplantTracker::getInstance()->registerActivity($activityId, array(
'ORIGIN_ID' => $callFields['PORTAL_NUMBER']
));
CVoxImplantHistory::WriteToLog($activityFields, 'CREATED CRM ACTIVITY '.$activityId);
return $activityId;
}
else
{
global $APPLICATION;
if ($exception = $APPLICATION->GetException())
static::$lastError = $exception->GetString();
static::$lastError .= "nDEBUG: Activity bindings: " . var_export($bindings, true);
CVoxImplantHistory::WriteToLog(static::$lastError, 'ERROR CAUGHT DURING CREATING CRM ACTIVITY');
return false;
}
}