Skip to content

Commit da999d6

Browse files
committed
#102 Доработка регистрации телефонных звонков
1 parent d3e29b1 commit da999d6

4 files changed

+85
-35
lines changed

Lib/Bitrix24Integration.php

+32-10
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ class Bitrix24Integration extends PbxExtensionBase
7272
public $lastContactId;
7373
public $lastCompanyId;
7474
public $lastLeadId;
75-
public $lastDealId;
7675

7776
public function __construct(string $logPrefix = '')
7877
{
@@ -133,7 +132,7 @@ public function updateSettings($settings=null):void
133132
$this->lastContactId = $settings->lastContactId;
134133

135134
$this->usersSettingsB24 = $this->getUsersSettings();
136-
$this->backgroundUpload = ($settings->backgroundUpload === '1');
135+
$this->backgroundUpload = intval($settings->backgroundUpload) === 1;
137136
$default_action = IncomingRoutingTable::findFirst('priority = 9999');
138137
if(!empty($settings->callbackQueue)){
139138
$filter = [
@@ -1155,7 +1154,7 @@ public function telephonyExternalCallRegister(array $options): array
11551154
$res_data = $this->getCache($cache_key);
11561155
if ($res_data) {
11571156
$this->mainLogger->writeInfo("Igonre $id 'telephonyExternalCallRegister' id dublicate...");
1158-
return [];
1157+
return [[], ''];
11591158
}
11601159
// Сохраним кэш.
11611160
$this->saveCache($cache_key, '1', 180);
@@ -1194,7 +1193,7 @@ public function telephonyExternalCallRegister(array $options): array
11941193
$options['time'] = time();
11951194
$this->mem_cache[$key] = $options;
11961195

1197-
return $arg;
1196+
return [$arg, $key];
11981197
}
11991198

12001199
/**
@@ -1203,14 +1202,16 @@ public function telephonyExternalCallRegister(array $options): array
12031202
* @param $key
12041203
* @param $response
12051204
*/
1206-
public function telephonyExternalCallPostRegister($key, $response): void
1205+
public function telephonyExternalCallPostRegister($key, $response): array
12071206
{
12081207
$request = $this->mem_cache[$key] ?? null;
12091208
if ( ! $request) {
1210-
return;
1209+
return [];
12111210
}
12121211
unset($this->mem_cache[$key]);
12131212
ConnectorDb::invoke(ConnectorDb::FUNC_UPDATE_CDR_BY_UID, [$request['UNIQUEID'], $request, $response]);
1213+
1214+
return [$request['linkedid'], $response['CALL_ID']];
12141215
}
12151216

12161217
/**
@@ -1243,8 +1244,9 @@ protected function fillPropertyValues($options, array &$params): void
12431244
*
12441245
* @return array|null
12451246
*/
1246-
public function telephonyExternalCallFinish($options): array
1247+
public function telephonyExternalCallFinish($options, &$tmpCallsData): array
12471248
{
1249+
$arg = [];
12481250
$CALL_ID = '';
12491251
$result = ConnectorDb::invoke(ConnectorDb::FUNC_GET_CDR_BY_LINKED_ID, [$options]);
12501252
if(!empty($result)){
@@ -1255,7 +1257,28 @@ public function telephonyExternalCallFinish($options): array
12551257
$this->mainLogger->writeInfo($options);
12561258
return [];
12571259
}
1258-
$userId = ($CALL_DATA['answer'] === '1') ? $CALL_DATA['user_id'] : '';
1260+
1261+
$id = $options['linkedid'];
1262+
1263+
///////////////////////////////////////////////////////////////
1264+
// Проверим, была ли уже отправлена запись разговора.
1265+
$callData = &$tmpCallsData[$id];
1266+
$regData = $tmpCallsData[$id]['ARGS_REGISTER_'.$options['UNIQUEID']]??[];
1267+
if( file_exists($options['FILE']) &&
1268+
isset($callData['MAIN_FILE']) && !isset($callData['FILE_'.$options['UNIQUEID']] ) &&
1269+
!empty($regData)) {
1270+
// Нужно зарегистрировать новый вызов
1271+
[$arg, $key] = $tmpCallsData[$id]['ARGS_REGISTER_'.$options['UNIQUEID']];
1272+
$CALL_ID = '$result['.$key.'][CALL_ID]';
1273+
$callData['FILE_'.$options['UNIQUEID']] = $options['FILE'];
1274+
}
1275+
if(!isset($callData['MAIN_FILE'])){
1276+
$callData['MAIN_FILE'] = $options['FILE'];
1277+
}
1278+
//
1279+
///////////////////////////////////////////////////////////////
1280+
1281+
$userId = (intval($CALL_DATA['answer']) === 1) ? $CALL_DATA['user_id'] : '';
12591282
$params = [
12601283
'CALL_ID' => $CALL_ID,
12611284
'USER_ID' => $userId,
@@ -1271,8 +1294,7 @@ public function telephonyExternalCallFinish($options): array
12711294

12721295
$this->fillPropertyValues($options, $params);
12731296

1274-
$arg = [];
1275-
$finishKey = self::API_CALL_FINISH.'_'.$options['linkedid'].'_' . uniqid('', true);
1297+
$finishKey = self::API_CALL_FINISH.'_'.$id.'_' . uniqid('', true);
12761298
$arg[$finishKey] = self::API_CALL_FINISH.'?' . http_build_query($params);
12771299
if ($options['export_records']) {
12781300
$this->telephonyExternalCallAttachRecord($options['FILE'], $CALL_ID, $arg);

bin/ConnectorDb.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,8 @@ private function getCdrDataByLinkedId(array $options): array
891891
break;
892892
}
893893
}
894-
if(empty($result) && $options['GLOBAL_STATUS'] === 'NOANSWER'){
894+
// if(empty($result) && $options['GLOBAL_STATUS'] === 'NOANSWER'){
895+
if(empty($result) && !empty($rows)){
895896
// Пропущенный вызов.
896897
// Берем первую попавшуюся CDR.
897898
return [$rows[0], $rows[0]['call_id']];
@@ -909,7 +910,7 @@ private function getCdrDataByLinkedId(array $options): array
909910
$result[0]['contact_user'] = $row['user_id'];
910911
}
911912
if(!empty($row['lead_id'])){
912-
$result[0]['lead_id'] = max($row['lead_id'],$result[0]['lead_id']);
913+
$result[0]['lead_id'] = max($row['lead_id'],$result[0]['lead_id']);
913914
$result[0]['lead_user'] = $row['user_id'];
914915
}
915916
}

bin/WorkerBitrix24IntegrationAMI.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -591,11 +591,11 @@ private function actionCompleteCdr($data):void
591591
if(!empty($responsible)
592592
&& !$this->b24->getCache($finishKeyID)){
593593

594+
$LINE_NUMBER = $this->external_lines[$data['did']]??'';
594595
if(!$isOutgoing && strlen($data['src_num']) > $this->extensionLength
595596
&& !$this->b24->getCache('reg-cdr-'.$data['linkedid'])){
596597
$this->logger->writeInfo("Send Register event... For incoming users only. If it is a missed one, then you need to register it first.".$linkedId);
597598
$createLead = ($this->leadType !== Bitrix24Integration::API_LEAD_TYPE_OUT && $this->crmCreateLead)?'1':'0';
598-
$LINE_NUMBER = $this->external_lines[$data['did']]??'';
599599
$req_data = [
600600
'UNIQUEID' => $data['UNIQUEID'],
601601
'linkedid' => $data['linkedid'],
@@ -623,6 +623,7 @@ private function actionCompleteCdr($data):void
623623
'disposition' => $data['disposition'],
624624
"export_records" => $this->export_records,
625625
'linkedid' => $data['linkedid'],
626+
'LINE_NUMBER' => $LINE_NUMBER,
626627
'action' => 'telephonyExternalCallFinish',
627628
];
628629
$this->Action_SendToBeanstalk($params);

bin/WorkerBitrix24IntegrationHTTP.php

+48-22
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,30 @@ private function addDataToQueue(array $data):void
211211
$data['CRM_ENTITY_ID'] = $contactsData['b24id']??'';
212212
$data['CRM_ENTITY_TYPE'] = $contactsData['contactType']??'';
213213
}
214-
$arg = $this->b24->telephonyExternalCallRegister($data);
214+
215+
$callId = &$this->tmpCallsData[$data['linkedid']]['CALL_ID'];
216+
if(empty($callId)){
217+
[$arg, $key] = $this->b24->telephonyExternalCallRegister($data);
218+
if(!empty($key)){
219+
// Это Метод register
220+
$callId = $key;
221+
}
222+
}elseif(stripos($callId,Bitrix24Integration::API_CALL_REGISTER) === false){
223+
$this->tmpCallsData[$data['linkedid']]['ARR_REGISTER_'.$data['UNIQUEID']] = $data;
224+
$this->tmpCallsData[$data['linkedid']]['ARGS_REGISTER_'.$data['UNIQUEID']] = $this->b24->telephonyExternalCallRegister($data);
225+
$data['CALL_ID'] = $callId;
226+
$arg = $this->b24->telephonyExternalCallShow($data);
227+
}else{
228+
$this->tmpCallsData[$data['linkedid']]['ARR_REGISTER_'.$data['UNIQUEID']] = $data;
229+
$this->tmpCallsData[$data['linkedid']]['ARGS_REGISTER_'.$data['UNIQUEID']] = $this->b24->telephonyExternalCallRegister($data);
230+
$data['CALL_ID'] = '$result['.$callId.'][CALL_ID]';
231+
$arg = $this->b24->telephonyExternalCallShow($data);
232+
}
215233
if (count($arg) > 0) {
216234
// Основная очередь запросов.
217-
$this->q_req = array_merge($arg, $this->q_req);
235+
$this->q_req = array_merge($this->q_req, $arg);
218236
}
237+
unset($callId);
219238
}
220239
} else {
221240
// Дополнительная очередь ожидания.
@@ -264,16 +283,17 @@ public function checkPreAction(&$data): bool
264283
private function createTmpCallData($data):void
265284
{
266285
$this->tmpCallsData[$data['linkedid']] = [
267-
'wait' => true,
268-
'events' => [],
269-
'search' => -1, // -1 - запрос не отправлен, 0 - запрос отправлен, 1 ответ получен
270-
'lead' => -1,
271-
'list-lead' => -1,
272-
'company' => -1,
273-
'data' => $data,
274-
'crm-data' => [],
275-
'inbox_tube'=> $data['inbox_tube']??'',
276-
'responsible'=> ''
286+
'wait' => true,
287+
'events' => [],
288+
'search' => -1, // -1 - запрос не отправлен, 0 - запрос отправлен, 1 ответ получен
289+
'lead' => -1,
290+
'list-lead' => -1,
291+
'company' => -1,
292+
'data' => $data,
293+
'crm-data' => [],
294+
'inbox_tube' => $data['inbox_tube']??'',
295+
'responsible'=> '',
296+
'CALL_ID' => '',
277297
];
278298
$phone = $data['PHONE_NUMBER'] ?? '';
279299
if(empty($phone)){
@@ -411,17 +431,14 @@ private function syncProcContacts()
411431
}
412432
}
413433
}
414-
415434
$response = $this->b24->sendBatch($syncProcReqCompany);
416435
if(!empty($response)){
417436
ConnectorDb::invoke(ConnectorDb::FUNC_UPDATE_LINKS, [$response['result']['result']??[]], false);
418437
}
419-
420438
$response = $this->b24->sendBatch($syncProcReqContact);
421439
if(!empty($response)) {
422440
ConnectorDb::invoke(ConnectorDb::FUNC_UPDATE_LINKS, [$response['result']['result']??[]], false);
423441
}
424-
425442
// Это дочерний процесс, завершаем его.
426443
exit(0);
427444
}
@@ -474,11 +491,13 @@ public function executeTasks(): void
474491
$tmpArr = [$this->q_req];
475492
foreach ($this->q_pre_req as $data) {
476493
if ('action_hangup_chan' === $data['action']) {
477-
$cdr = ConnectorDb::invoke(ConnectorDb::FUNC_FIND_CDR_BY_UID,[$data['UNIQUEID']]);
478-
if ($cdr) {
479-
$data['CALL_ID'] = $cdr->call_id;
480-
$data['USER_ID'] = (int)$cdr->user_id;
481-
$tmpArr[] = $this->b24->telephonyExternalCallHide($data);
494+
$callId = $this->tmpCallsData[$data['linkedid']]['CALL_ID'];
495+
if (!empty($callId)) {
496+
$data['CALL_ID'] = $callId;
497+
$data['USER_ID'] = $this->tmpCallsData[$data['linkedid']]['ARR_REGISTER_'.$data['UNIQUEID']]['USER_ID']??'';
498+
if(!empty($data['USER_ID'])){
499+
$tmpArr[] = $this->b24->telephonyExternalCallHide($data);
500+
}
482501
}
483502
} elseif ('action_dial_answer' === $data['action']) {
484503
$cdr = null;
@@ -552,7 +571,7 @@ public function executeTasks(): void
552571
$tmpArr[] = $this->b24->crmDealUpdate($dealId, $userId, $data['linkedid']);
553572
}
554573
} elseif ('telephonyExternalCallFinish' === $data['action']) {
555-
$tmpArr[] = $this->b24->telephonyExternalCallFinish($data);
574+
$tmpArr[] = $this->b24->telephonyExternalCallFinish($data, $this->tmpCallsData);
556575
}
557576
}
558577
$this->q_req = array_merge(...$tmpArr);
@@ -585,7 +604,14 @@ public function postReceivingResponseProcessing(array $result): void
585604
}
586605

587606
if ($actionName === Bitrix24Integration::API_CALL_REGISTER) {
588-
$this->b24->telephonyExternalCallPostRegister($key, $partResponse);
607+
$resultRegister = $this->b24->telephonyExternalCallPostRegister($key, $partResponse);
608+
if(!empty($resultRegister)){
609+
[$linkedId, $callId] = $resultRegister;
610+
$this->b24->logger->writeInfo("Update call_id for $linkedId - $callId");
611+
$this->tmpCallsData[$linkedId]['CALL_ID'] = $callId;
612+
}else{
613+
$this->b24->logger->writeInfo("fail Update call_id for $key");
614+
}
589615
} elseif (in_array($actionName,[Bitrix24Integration::API_CRM_CONTACT_COMPANY,Bitrix24Integration::API_CRM_COMPANY_CONTACT], true)) {
590616
ConnectorDb::invoke(ConnectorDb::FUNC_UPDATE_LINKS, [[$key => $partResponse]], false);
591617
} elseif (in_array($id,['init', 'update'], true)){

0 commit comments

Comments
 (0)