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