Joywork/engine/classes/AlloincognitoApiClass.php

439 lines
14 KiB
PHP
Raw Normal View History

2026-05-22 20:21:54 +02:00
<?php
class AlloincognitoApiClass extends MangoApiClass {
private $authorization_token;
private $created_authorization_token;
private $access_token;
private $refresh_token;
private $header = [];
private $agency_id = 0;
private $base_url = "https://webapi.alloincognito.ru:4431/api/v1/";
private $metod = '';
private $users = array();
private $phone_type;
private $phone_types = [0 => 'alloAbonentNoAnswer',
1 => 'alloAbonentAnswer',
2 => 'abonentAlloAnswer',
3 => 'abonentAlloNoAnswer'];
public $account = '';
private $operator_id = 7;
private $operator = 'alloincognito';
public $pdo = null;
public function __construct($agency_id, $db=null){
$this->agency_id = $agency_id;
if (!is_null($db)) {
$this->pdo = $db;
} else {
$pdo = new MysqlPdo(hst, ndb, user, pass);
$pdo->query("SET NAMES 'utf8'");
$this->pdo = $pdo;
}
if($this->agency_id > 0){
$this->pre_set_users();
} else {
die("Не определено агенство");
}
}
/**
*
*/
private function pre_set_users(){
$usersIds = array();
$agency_id = $this->agency_id;
$sql_users = "SELECT id FROM users WHERE id in (select id from users where id=$agency_id or id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id)))";
$q_users = $this->pdo->query($sql_users);
while($r_users = $this->pdo->fetch_assoc($q_users)){
$usersIds[] = (int)$r_users['id'];
}
$this->set_users($usersIds);
}
/**
*
*/
public function set_authorization_token($authorization_token, $created_authorization_token){
if(!empty($authorization_token) && $this->date_diff($created_authorization_token) < 365){
$this->authorization_token = $authorization_token;
$this->created_authorization_token = $created_authorization_token;
$this->header = ['accept: application/json',
'Authorization: Bearer '.$this->authorization_token
];
} else {
//
}
//echo $this->date_diff($created_authorization_token, false);
// if($this->date_diff($created_authorization_token) < ;
/*$this->metod = 'auth/integrationapi/create';
$this->sendCurl(); */
}
/**
*
*/
public function set_access_token($arrTokens){
if(empty($arrTokens['access_token']) || $this->date_diff($arrTokens['access_token_expired_in'], false) > 23){
$this->metod = 'auth/integrationapi/create';
$tokens = json_decode($this->sendCurl(), true);
$this->access_token = $tokens['accessToken'];
$sql_tokens_up = "UPDATE agency_alloincognito SET
access_token='{$tokens['accessToken']}',
access_token_expired_in = NOW(),
refresh_token = '{$tokens['refreshToken']}',
refresh_token_expired_in = NOW()
WHERE agency_id = {$this->agency_id}";
$this->pdo->query($sql_tokens_up);
} else {
$this->access_token = $arrTokens['access_token'];
}
$this->header = ['Content-Type: application/json',
'Authorization: Bearer ' . $this->access_token
];
}
/**
*
*/
private function date_diff($date_old, $day=true){
$hour = 1;
if($day){
$hour = 24;
}
$diff = 0;
$data_now = date('Y-m-d H:i:s');
$diff = floor((strtotime($data_now) - strtotime($date_old))/(60*60*$hour));
return $diff;
}
/**
*
*/
private function sendCurl($post = false, $custom = false){
$response = 0;
$url = $this->base_url . $this->metod;
//echo $url."\n";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//if($header){
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
if($post){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->post);
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->header);
if($custom){
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $custom['type']);
curl_setopt($ch, CURLOPT_POSTFIELDS,$custom['body']);
}
$response = curl_exec($ch);
$response_info = curl_getinfo($ch);
//var_dump($response);
//var_dump($response_info);
if($response_info['http_code'] != 200){
$response = 0;
}
if($errno = curl_errno($ch)) {
$error_message = curl_strerror($errno);
echo "cURL error ({$errno}):\n {$error_message}";
}
curl_close($ch);
return $response;
}
/**
*
*/
public function get_emp(){
$this->metod = "Request/GetEmpList";
$emps = json_decode($this->sendCurl(), true);
return $emps;
}
/*public function get_setting(){
$this->metod = 'Vats/settings/get';
$this->post = json_encode(array(
'nums' => ['3433025010'],
));
$emps = json_decode($this->sendCurl(true), true);
var_dump($emps);
}*/
public function get_calls($start, $end, $nums){
$this->metod = 'Request/GetCallList';
$this->post = json_encode(array(
'nums' => $nums,
"periodStart"=>$start,
"periodEnd"=>$end,
));
$calls = json_decode($this->sendCurl(true), true);
//var_dump($calls);
return $calls;
}
public function get_phone_type($call){
$this->type_phone($call);
return $this->phone_type;
}
private function type_phone($call){
$type = 0;
if($call['dDirection'] == 1 && $call['callRecordDuration'] != '00:00:00'){ //Исходящий 2- входящий
$type = 1;
} else if($call['dDirection'] == 2 && $call['callRecordDuration'] != '00:00:00') {
$type = 2;
} else if($call['dDirection'] == 2) {
$type = 3;
}
$this->phone_type = $this->phone_types[$type];
}
/**
*
*/
public function recordSaveAllo($call, $agency_id){
$records = array();
if(!empty($call['callRecordId'])){
$fileName = $this->get_record($call['callRecordId'], $agency_id);
if(!empty($fileName)){
$records[] = $fileName;
}
sleep(5);
}
return json_encode($records);
}
/**
*
*/
public function get_record($callRecordId, $agency_id){
$req = '';
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/server/allo")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/server/allo", 0777);
}
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/server/allo/".$agency_id)) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/server/allo/".$agency_id, 0777);
}
$this->metod = 'Request/GetCallRecordFile?recordFileId='.$callRecordId;
$fileInfo = json_decode($this->sendCurl());
//var_dump($fileInfo);
if(isset($fileInfo->result->filE_NAME) && isset($fileInfo->result->fileContent)){
$name = $fileInfo->result->filE_NAME;
if(!empty($fileInfo->result->fileContent)){
if(!file_exists($_SERVER['DOCUMENT_ROOT'].'/server/allo/'.$agency_id.'/'.$name)){
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/server/allo/'.$agency_id.'/'.$name, base64_decode($fileInfo->result->fileContent));
}
$req = str_replace('.mp3','',$fileInfo->result->filE_NAME);
}
}
return $req;
}
/**
*
*/
public function findRecord($call_id){
$record = '';
$sql = "SELECT * FROM mango_calls WHERE id = {$call_id}";
$q = $this->pdo->query($sql);
$r = $this->pdo->fetch_assoc($q);
$record = $r['records'];
return $record;
}
/**
*
*/
public function checkUser($phone_ats, $agency_id){
$phone = $this->ver_phone($phone_ats);
$sql_user = "SELECT id FROM allo_users WHERE ext = '{$phone_ats}' AND phone = '{$phone}'";
$q_user = $this->pdo->query($sql_user);
if($this->pdo->num_rows($q_user) == 0){
//Поиск в юзерах
$sql_main_user = "SELECT * FROM users WHERE phone = '{$phone}' and blocked = 0";
$q_main_user = $this->pdo->query($sql_main_user);
if($this->pdo->num_rows($q_main_user) > 0){
$r_user_main = $this->pdo->fetch_assoc($q_main_user);
$name = trim($r_user_main['last_name'].' '.$r_user_main['first_name'].' '.$r_user_main['middle_name']);
$sql_allo_user = "INSERT INTO allo_users SET user_id={$r_user_main['id']}, agency_id={$agency_id}, ext='{$phone_ats}', phone='{$phone}', name='{$name}'";
$this->pdo->query($sql_allo_user);
$sql_allo_user = "INSERT INTO mango_call_users SET user_id='{$phone_ats}', agency_id={$agency_id}, extension='{$phone_ats}', number_phone='{$phone}', fio='{$name}', number_sip='{$phone_ats}'";
$this->pdo->query($sql_allo_user);
}
}
}
public function stat($call, $agency_id){
// var_dump($call);
$id = 0;
$from_extension = '';
$to_extension = '';
if($call['dDirection'] == 1){ //Исходящий 2- входящий
$to_number = $call['extNum'];
$from_number = $call['abonentNum'];
$from_extension = $call['abonentNum'];
if(!empty($call['redirectNum'])){
//$to_number = $call['abonentNum'];
$from_number = $call['redirectNum'];
$from_extension = $call['redirectNum'];
}
$entry_id = $call['extNum'];
} else {
$to_number = $call['abonentNum'];
$from_number = $call['extNum'];
$to_extension = $call['abonentNum'];
$entry_id = $call['abonentNum'];
if(!empty($call['redirectNum'])){
$to_number = $call['redirectNum'];
$to_extension = $call['redirectNum'];
}
}
$operator_call_id = strtotime($call['callDate']);
$date = strtotime($call['callDate']);
$answerResult = 'answered';
$answer = $date;
if($call['callRecordDuration'] == '00:00:00'){
$answerResult = 'not answered';
$answer = 0;
}
$arrDuration = explode(':',$call['callDuration']);
$finish = strtotime(date('Y-m-d H:i:s', strtotime('+'.(int)$arrDuration[0].' hours '.(int)$arrDuration[1].' minutes '.(int)$arrDuration[2].' seconds', $date)));
$update = false;
$_sql = "SELECT id FROM mango_calls WHERE operator_id={$this->operator_id} and operator_call_id = {$operator_call_id}";
$_c = $this->pdo->fetch_assoc($this->pdo->query($_sql));
if(isset($_c['id'])){
$update = true;
$id = (int)$_c['id'];
}
if($update){
$in = "UPDATE `mango_calls` SET
`start`= $date,
`finish`=$finish,
`answer`=$answer,
`from_extension`='" . $from_extension . "',
`from_number`= '" . $from_number . "',
`to_extension`='" . $to_extension . "',
`to_number`='" . $to_number . "',
`disconnect_reason`='" . $answerResult . "',
`entry_id`='" . $entry_id . "',
`operator_call_id`='".$operator_call_id."',
`operator_id`={$this->operator_id},
`agency_id`=".$agency_id."
WHERE id =".$_c['id'];
}
else {
$record = $this->recordSaveAllo($call, $agency_id);
$in = "INSERT INTO `mango_calls` SET
`records`='" . $record . "',
`start`= $date,
`finish`=$finish,
`answer`=$answer,
`from_extension`='" . $from_extension . "',
`from_number`= '" . $from_number . "',
`to_extension`='" . $to_extension . "',
`to_number`='" . $to_number . "',
`disconnect_reason`='" . $answerResult . "',
`entry_id`='" . $entry_id . "',
`line_number`='{$this->operator}',
`location`='',
`agency_id`=$agency_id,
`operator_id`={$this->operator_id},
`operator_call_id`='{$operator_call_id}'
";
//}
}
// echo $in."\n";
$this->pdo->query($in);
if(!$update){
$id = $this->pdo->insert_id();
}
return $id;
}
public function find_user($phone_ats){
$phone = $this->ver_phone($phone_ats);
$user_id = 0;
$sql_user = "SELECT user_id FROM allo_users WHERE phone = '".$phone."'";
$q_user = $this->pdo->query($sql_user);
if($this->pdo->num_rows($q_user) > 0){
$r_user = $this->pdo->fetch_assoc($q_user);
$user_id = $r_user['user_id'];
}
return $user_id;
}
public function save_user_call($id_call, $user_find, $main_user){
$user_id = 0;
if($id_call > 0){
$user_id = (int)$this->find_user($user_find);
if($user_id == 0){
$user_id = (int)$main_user;
}
}
if($user_id > 0){
$sql = "SELECT id FROM user_call WHERE call_id = {$id_call}";
//echo $sql."\n";
$q = $this->pdo->query($sql);
if($this->pdo->num_rows($q) == 0){
$sql_in = "INSERT INTO user_call SET call_id = {$id_call}, user_id = {$user_id}";
$this->pdo->query($sql_in);
}
}
}
}