Joywork/engine/classes/MtsApiClass.php

531 lines
16 KiB
PHP
Raw Normal View History

2026-05-22 20:21:54 +02:00
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of MtsApiClass
*
* @author Ira
*/
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
class MtsApiClass extends MangoApiClass {
private $api_key;
private $base_url = "https://vpbx.mts.ru/api/";
private $subscription_url = "https://joywork.ru/callevents/incall_mts.php";
private $metod;
private $header;
private $post;
private $users = array();
private $phone_type;
private $phone_types = [0 => 'mtsAbonentNoAnswer',
1 => 'mtsAbonentAnswer',
2 => 'abonentMtsAnswer',
3 => 'abonentMtsNoAnswer'];
public function __construct($api_key){
$this->api_key = $api_key;
$this->header = ['Content-type:application/json',
'X-AUTH-TOKEN:'.$api_key,
'cache-control:no-cache'
];
}
public function chechSubscription($user){
$abonentId = $user->userId;
$sql = "SELECT * FROM call_subscription WHERE operator_id = 5 AND batc_id = $abonentId";
$q = mysql_query($sql);
$row = mysql_num_rows($q);
if($row == 0){
$this->setSubscription($abonentId);
} else {
$sub = mysql_fetch_assoc($q);
if(!$this->getSubscription($sub)){
$this->doSubscription($sub);
}
}
}
private function getSubscription($sub){
$result = false;
$this->metod = 'subscription?abonentId='.$sub['batc_id'].'&subscriptionId='.$sub['subscriptionId'];
$body = [
"abonentId" => $sub['batc_id'],
"subscriptionId" => $sub['subscriptionId'],
];
$res = json_decode($this->sendCurl(false,['type'=>"GET","body"=>json_encode($body)]), true);
if(isset($res['expires'])){
if($res['expires'] > 25200){
$result = true;
}
$sql = "UPDATE call_subscription SET expires='$res[expires]' WHERE id = $sub[id]";
mysql_query($sql);
}
return $result;
}
private function setSubscription($abonentId){
$this->metod = 'subscription';
$this->post = json_encode ([
"abonentId" => $abonentId
]);
$res = json_decode($this->sendCurl(true));
if(isset($res->subscriptionId)){
$sql_in = "INSERT INTO call_subscription SET operator_id = 5, batc_id = $abonentId, api_key = '$this->api_key', subscriptionId='$res->subscriptionId', expires='$res->expires'";
mysql_query($sql_in);
}
return $res;
}
private function doSubscription($sub){
$this->metod = 'subscription';
$this->post = json_encode ([
"abonentId" => $sub['batc_id']
]);
$res = json_decode($this->sendCurl(true));
if(isset($res->subscriptionId)){
$sql_up = "UPDATE call_subscription SET subscriptionId='$res->subscriptionId', expires='$res->expires' WHERE id = $sub[id]";
mysql_query($sql_up);
}
return $res;
}
public function set_users($users){
$this->users = $users;
}
public function find_user($phone, $agency_id=0){
$user_id = 0;
$phone = $this->ver_phone($phone);
$sql_user = "SELECT id FROM users WHERE phone = '".$phone."' and blocked=0";
$q_user = mysql_query($sql_user);
if(mysql_num_rows($q_user) > 0){
$r_user = mysql_fetch_assoc($q_user);
$user_id = $r_user['id'];
}
return $user_id;
}
private function sendCurl($post = false, $custom = false){
$response = 0;
$url = $this->base_url . $this->metod;
//echo $url.'<br>';
$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_SSL_CIPHER_LIST, 'DEFAULT@SECLEVEL=1');
// var_dump($this->header);
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);
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 find_client($phone, $no = false){
$this -> set_client_stage(0);
$client_id = 0;
$phone_client = $this -> ver_phone($phone);
$sql_cl = "SELECT `id`, `stage` FROM `clients` WHERE cancel=0 AND (phone = '$phone_client' OR id in (SELECT client_id FROM clients_phone2 WHERE phone = '$phone_client')) and (id_agent in (".implode(',', $this->users).") or who_work in (".implode(',', $this->users)."))";
if($no){
$sql_cl = "SELECT `id`, `stage` FROM `clients` WHERE cancel=0 AND (phone = '$phone_client' OR id in (SELECT client_id FROM clients_phone2 WHERE phone = '$phone_client'))";
}
//echo $sql_cl.'****************';
$q_cl = mysql_query($sql_cl);
if(mysql_num_rows($q_cl) > 0){
$r_cl = mysql_fetch_assoc($q_cl);
$client_id = $r_cl['id'];
$this -> set_client_stage($r_cl['stage']);
}
return $client_id;
}
//Установка стадии клиента
private function set_client_stage($stage){
$this -> client_stage = $stage;
}
//Получение стадии клиента
public function get_client_stage(){
return $this -> client_stage;
}
public function getUsers(){
$this->metod = 'abonents';
$res = $this->sendCurl(false);
return $res;
}
//Сохранение пользователя МТС
private function saveUserMTS($user, $agency_id){
$user_id = 0;
$mts_id = $user->userId;
$fio = '';
$set = " SET ";
if(!empty($user->firstName)){
$fio .= $user->firstName;
}
if(!empty($user->lastname)){
if(!empty($fio)) $fio .= ' ';
$fio .= $user->lastname;
}
if(!empty($fio)){
if($set != " SET ") $set .= ", ";
$set .= "fio='$fio'";
}
if(!empty($user->phoneNumber)){
$phone = $this->ver_phone($user->phoneNumber);
if($set != " SET ") $set .= ", ";
$set .= "phone='$phone'";
}
if(!empty($user->extension)){
$ext = $user->extension;
if($set != " SET ") $set .= ", ";
$set .= "ext='$ext'";
}
if(!empty($user->email)){
$email = $user->email;
if($set != " SET ") $set .= ", ";
$set .= "email='$email'";
}
//Поиск user_id
if(isset($phone)){
$sql = "SELECT id FROM users WHERE phone='$phone'";
$q = mysql_query($sql);
if(mysql_num_rows($q) > 0){
$user_id = mysql_fetch_array($q)[0];
}
}
if(isset($email) && $user_id == 0){
$sql = "SELECT id FROM users WHERE email='$email'";
$q = mysql_query($sql);
if(mysql_num_rows($q) > 0){
$user_id = mysql_fetch_array($q)[0];
}
}
if($set != " SET ") $set .= ", ";
$set .= "user_id='$user_id'";
$sql = "SELECT id FROM mts_users WHERE mts_id = $mts_id";
$q = mysql_query($sql);
$row = mysql_num_rows($q);
if($row > 0){
$sql_up = "UPDATE mts_users $set WHERE mts_id = $mts_id";
mysql_query($sql_up);
} else {
if($set != " SET ") $set .= ", ";
$set .= "mts_id='$mts_id', agency_id=$agency_id";
$sql_in = "INSERT INTO mts_users $set";
mysql_query($sql_in);
}
}
//Сохранение данных пользователя телефонии
public function saveUser($user, $agensy_id){
$this->saveUserMTS($user, $agensy_id);
$user_id = $user->userId;
$poles = array();
$poles_up = array();
//Проверка есть ли запись
$sql = "SELECT id FROM mango_call_users WHERE user_id='".$user_id."'";
$q = mysql_query($sql);
//Записываем
$fio = '';
$poles[] = "user_id = '".$user_id."'";
if(!empty($user->firstName)){
$fio .= $user->firstName;
}
if(!empty($user->lastname)){
if(!empty($fio)) $fio .= ' ';
$fio .= $user->lastname;
}
if(!empty($fio)){
$poles[] = "fio = '".$fio."'";
$poles_up[] = "fio = '".$fio."'";
}
$number_sip = '';
if(!empty($user->phoneNumber)){
$poles[] = "number_phone = '".$this->ver_phone($user->phoneNumber)."'";
$number_sip = $this->ver_phone($user->phoneNumber);
$poles_up[] = "number_phone = '".$this->ver_phone($user->phoneNumber)."'";
}
if(!empty($user->extension)){
$poles[] = "extension = '".$user->extension."'";
if(empty($number_sip)){
$number_sip = $user->extension;
}
}
$poles[] = "number_sip = '".$number_sip."'";
$poles_up[] = "number_sip = '".$number_sip."'";
if(mysql_num_rows($q) == 0){
$poles[] = "agency_id = '".$agensy_id."'";
$insert = "INSERT INTO `mango_call_users` set ".implode(', ', $poles);
mysql_query($insert);
} else {
$insert = "UPDATE `mango_call_users` set ".implode(', ', $poles_up)." WHERE user_id = ".$user_id;
mysql_query($insert);
}
}
//Юзеры агенства
public function setUsers($agency_id){
$usersIds = array();
$w = new WebHookIn();
$usersIds = $w->getAllUserAgency($agency_id);
//var_dump($usersIds);
$this->set_users($usersIds);
}
public function get_phone_type($phone){
$this->type_phone($phone);
return $this -> phone_type;
}
private function type_phone($phone){
$type = 0;
if($phone->direction == 'TERMINATING'){
if($phone->status == 'MISSED'){
$type = 3;
} else {
$type = 2;
}
} else {
if($phone->status == 'MISSED'){
$type = 0;
} else {
$type = 1;
}
}
$this->phone_type = $this->phone_types[$type];
}
public function get_record($record_uuid){
$this->metod = 'callRecording/mp3/'.$record_uuid;
$res = $this->sendCurl();
return $res;
}
//
public function recordSaveMTS($call, $agency_id){
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/server/mts")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/server/mts", 0777);
}
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/server/mts/".$agency_id)) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/server/mts/".$agency_id, 0777);
}
$records = array();
if(isset($call->extTrackingId) && !empty($call->extTrackingId)){
$file = trim($this->get_record($call->extTrackingId));
if(!empty($file)){
$name = str_replace(":","",$call->extTrackingId).'.mp3';
if(!file_exists($_SERVER['DOCUMENT_ROOT'].'/server/mts/'.$agency_id.'/'.$name)){
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/server/mts/'.$agency_id.'/'.$name, $file);
}
$records[] = str_replace(":","",$call->extTrackingId);
}
}
return json_encode($records);
}
//История звонков
public function callHistory($start_date, $end_date, $page){
$this->metod = "v1/callHistory/enterprise?dateFrom=$start_date&dateTo=$end_date&page=$page&size=100";
// echo $this->metod."\n";
$res = json_decode($this->sendCurl());
return $res;
}
public function stat($call, $agency_id, $only_widget=0){
$id = 0;
$this->type_phone($call);
// echo $call->from_username.' - '.$type.'<br>';
$to_number = $call->calledNumber;
$from_number = $call->callingNumber;
$entry_id = $to_number;
$tempuiid = explode('-', $call->extTrackingId);
$id_uuid = str_replace([':', '-', 'callhalf'], '', $tempuiid[1]);
$record = $this->recordSaveMTS($call, $agency_id);
$answer = 0;
$answerResult = $call->terminationCause;
if($call->status == "PLACED"){
$answer = $call->callTime + $call->answerDuration;
}
$from_extension = '';
if($call->direction == 'ORIGINATING'){
$from_extension = $call->callingNumber;
$to_number = $call->callingNumber;
}
if($call->direction == 'TERMINATING'){
//$entry_id = $call->callingNumber;
}
$start = $call->callTime;
$finish = $call->callTime + $call->duration;
//echo $to_number.'<br>';
$sql = "SELECT id FROM mango_calls WHERE operator_id=5 and operator_call_id = '".$id_uuid."'";
$q = mysql_query($sql);
$row = mysql_num_rows($q);
if($row == 0 && $only_widget == 0){
$in = "INSERT INTO `mango_calls` SET
`records`='".$record."',
`start`= $start,
`finish`=$finish,
`answer`=$answer,
`from_extension`='".$from_extension."',
`from_number`= '".$from_number."',
`to_extension`='".$call->calledNumber."',
`to_number`='".$to_number."',
`disconnect_reason`='".$answerResult."',
`entry_id`='".$entry_id."',
`line_number`='mts',
`operator_id`=5,
`location`='',
`operator_call_id`='{$id_uuid}',
`uuid`='".$call->extTrackingId."',
`agency_id`=$agency_id
";
mysql_query($in);
$id = mysql_insert_id();
} else if($row > 0) {
$r = mysql_fetch_assoc($q);
$id = (int)$r['id'];
$in = "UPDATE `mango_calls` SET
`records`='".$record."',
`start`= $start,
`finish`=$finish,
`answer`=$answer,
`from_extension`='".$from_extension."',
`from_number`= '".$from_number."',
`to_extension`='".$call->calledNumber."',
`to_number`='".$to_number."',
`disconnect_reason`='".$answerResult."',
`entry_id`='".$entry_id."',
`line_number`='mts',
`agency_id`=$agency_id
WHERE
operator_id=5 and operator_call_id = '".$id_uuid."'
";
//echo $in;
mysql_query($in);
}
return $id;
}
public function save_user_call($id_call, $user_find, $main_user, $agency_id = 0){
$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}";
$q = mysql_query($sql);
if(mysql_num_rows($q) == 0){
$sql_in = "INSERT INTO user_call SET call_id = {$id_call}, user_id = {$user_id}";
mysql_query($sql_in);
}
}
}
public function findSource($phone){
$source = 0;
$sql = "SELECT * FROM advertising_phone WHERE phone = '".$phone."'";
$q = mysql_query($sql);
if(mysql_num_rows($q) > 0){
$r = mysql_fetch_assoc($q);
$sql_v = "SELECT id FROM advertising_sources WHERE id = ".$r['adv_id']." AND user_id in (".implode(', ',$this->users).")";
$q_v = mysql_query($sql_v);
if(mysql_num_rows($q_v) > 0){
$r_v = mysql_fetch_assoc($q_v);
$source = $r_v['id'];
}
}
return $source;
}
}