• Модуль: voximplant
  • Путь к файлу: ~/bitrix/modules/voximplant/lib/rest/helper.php
  • Класс: BitrixVoximplantRestHelper
  • Вызов: Helper::registerExternalCall
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;
}