Joywork/engine/classes/BeelineApiClass.php

723 lines
24 KiB
PHP
Raw Normal View History

2026-05-22 20:21:54 +02:00
<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
class BeelineApiClass extends MangoApiClass {
private $api_key;
private $base_url = "https://cloudpbx.beeline.ru/apis/portal/";
private $metod;
private $post='';
private $client_id;
private $header;
private $users = array();
private $phone_type;
private $phone_types = [0 => 'beelineAbonentNoAnswer',
1 => 'beelineAbonentAnswer',
2 => 'abonentBeelineAnswer',
3 => 'abonentBeelineNoAnswer'];
private $client_stage = 0;
public $subscription_url;
private $dbpg = null;
public function __construct($api_key){
$this->api_key = $api_key;
$this->header = ['Content-type:application/json',
'X-MPBX-API-AUTH-TOKEN:'.$api_key];
$this->dbpg = new MysqlPdo(hstpg, ndbpg, userpg, passpg, false, '5432', true);
}
public function set_users($users){
$this->users = $users;
}
public function checkSubscription($id)
{
$sql = "SELECT * FROM call_subscription WHERE batc_id = $id";
$subscription = mysql_fetch_assoc(mysql_query($sql));
if(!$subscription){
$result = $this->setSubscription();
if(isset($result['subscriptionId'])) {
$sql = "INSERT INTO `call_subscription`(`batc_id`, `api_key`, `subscriptionId`, `expires`) VALUES ($id,'".$this->api_key."','".$result['subscriptionId']."',".$result['expires'].")";
mysql_query($sql);
}
} else {
$result = $this->doSubscription($subscription);
if(isset($result['subscriptionId'])){
if($result['expires'] > 172800){
$sql = "UPDATE `call_subscription` SET `expires`=".$result['expires']." WHERE id=".$subscription['id'];
mysql_query($sql);
} else {
$result = $this->setSubscription();
if(!empty($result['subscriptionId'])) {
$sql = "UPDATE `call_subscription` SET `expires`=" . $result['expires'] . ", `subscriptionId`='" . $result['subscriptionId'] . "' WHERE id=" . $subscription['id'];
mysql_query($sql);
$this->deleteSubscription($subscription);
}
}
} else {
$result = $this->setSubscription();
if(!empty($result['subscriptionId'])) {
$sql = "UPDATE `call_subscription` SET `expires`=" . $result['expires'] . ", `subscriptionId`='" . $result['subscriptionId'] . "' WHERE id=" . $subscription['id'];
mysql_query($sql);
$this->deleteSubscription($subscription);
}
}
}
}
public function renewSubscription($subscriptionId){
$sql = "SELECT * FROM call_subscription WHERE subscriptionId = '$subscriptionId'";
$subscription = mysql_fetch_assoc(mysql_query($sql));
if($subscription){
$this->api_key = $subscription['api_key'];
$result = $this->setSubscription();
if(!empty($result['subscriptionId'])) {
$sql = "UPDATE `call_subscription` SET `expires`=" . $result['expires'] . ", `subscriptionId`='" . $result['subscriptionId'] . "' WHERE id=" . $subscription['id'];
mysql_query($sql);
}
}
}
private function doSubscription($subscription){
$subscriptionId = $subscription['subscriptionId'];
$this->metod = "subscription?subscriptionId=$subscriptionId";
return json_decode($this->sendCurl(),true);
}
private function deleteSubscription($subscription){
$subscriptionId = $subscription['subscriptionId'];
$this->metod = "subscription?subscriptionId= $subscriptionId";
return json_decode($this->sendCurl(false, ["type"=>"DELETE", "body"=>""]),true);
}
private function setSubscription(){
$this->metod = 'subscription';
$body = [
"expires" => 2592000,
"subscriptionType" => "BASIC_CALL",
"url" => $this->subscription_url,
];
return json_decode($this->sendCurl(false,['type'=>"PUT","body"=>json_encode($body)]), true);
}
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){
$this->header = ['X-MPBX-API-AUTH-TOKEN:'.$this->api_key];
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);
// var_dump($response);
if($errno = curl_errno($ch)) {
$error_message = curl_strerror($errno);
echo "cURL error ({$errno}):\n {$error_message}";
}
curl_close($ch);
return $response;
}
public function callTransfer($user_id,$call_id,$phone)
{
$this->metod = "abonents/$user_id/callTransfer";
$this->post = "callId=$call_id&phoneNumber=$phone";
$res = $this->sendCurl(true);
//$result['ps'] = "abonents/$user_id/callTransfer callId=$call_id&phoneNumber=$phone";
return $res;
}
public function callTransferConsult($user_id,$call_id,$phone)
{
$this->metod = "abonents/$user_id/callTransferConsult";
$this->post = "callId=$call_id&callIdConsult=$phone";
$this->sendCurl(true);
}
public function callrelease($user_id,$call_id,$phone)
{
$this->metod = "abonents/$user_id/callTransferConsult";
$this->post = "callId=$call_id&callIdConsult=$phone";
$this->sendCurl(true);
}
public function getRoute(){
$this->metod = "icr/route";
$res = $this->sendCurl();
return $res;
}
public function put_route($phone, $extension){
$phone = str_replace('+7', '', $phone);
$this->metod = 'icr/route';
$body = [array(
"inboundNumber" => $phone,
"extension" => $extension,
)
];
return json_decode($this->sendCurl(false,['type'=>"PUT","body"=>json_encode($body)]), true);
}
public function checkRoute($call, $agency_id){
$department = isset($call->department) ? $call->department : '';
if(strpos(mb_strtolower($department), 'sip') !== false){
$phone = $call->phone;
$extension = $call->abonent->extension;
if(!empty($phone) && !empty($extension)){
$sql = "SELECT * FROM rule_route WHERE phone = '{$phone}' AND extension = '{$extension}' AND agency_id = {$agency_id}";
$q = $this->dbpg->query($sql);
if($this->dbpg->num_rows($q) == 0){
$result = $this->put_route($phone, $extension);
if($result[0]['status'] == 'SUCCESS'){
$sql_in = "INSERT INTO rule_route (phone, extension, agency_id) VALUES ('{$phone}', '{$extension}', {$agency_id})";
$this->dbpg->query($sql_in);
}
}
}
}
}
public function getUsers(){
$this->metod = 'abonents';
$res = $this->sendCurl(false);
return $res;
}
public function stat_records($start_datetime, $lastId = false){
$this->metod = 'records?dateFrom='.$start_datetime;//.'&dateTo='.$end_date;//api/ver1.0/client/'.$this->client_id.'/call_history/?start_datetime='.$start_datetime.'&order=asc&end_datetime='.$end_datetime.'&per_page=100000&page=1';
if($lastId > 0){
$this->metod = 'records?id='.$lastId;
}
// echo $this->metod."\n";
$res = $this->sendCurl(false);
return $res;
}
public function calls($start_datetime){
$this->metod = 'statistics?dateFrom='.$start_datetime.'&page=0&pageSize=100';
$res = $this->sendCurl(false);
return $res;
}
public function get_record($record_uuid){
$this->metod = 'v2/records/'.$record_uuid.'/download';
$res = $this->sendCurl(false);
return $res;
}
private function type_phone($call){
//call);
//var_dump($call);
$result = '';
$find_user = '';
//$result = $call->result;
//if(isset($call->abonent->))
$find_user = $call->abonent->userId;
$part_user = explode('@', $call->abonent->userId);
if(isset($part_user[0])){
$find_user = $part_user[0];
}
if(isset($call->status) && $call->status == 'MISSED'){
if($call->direction == 'INBOUND'){
$type = 3;
} else {
$type = 0;
}
} else {
if($call->direction == 'INBOUND'){
$type = 2;
} else {
$type = 1;
}
}
$this->phone_type = $this->phone_types[$type];
// echo $find_user.'*****<br>';
return $find_user;
}
public function get_phone_type($phone){
$find_user = $this->type_phone($phone);
return json_encode(array('type'=>$this->phone_type, 'find_user'=>$find_user));
}
//Установка стадии клиента
private function set_client_stage($stage){
$this -> client_stage = $stage;
}
public function find_user($phone, $agency_id=0){
// echo $phone."\n";
$user_id = 0;
$part_user = explode('@', $phone);
if(isset($part_user[0])){
$phone = $part_user[0];
}
$phone = $this->ver_phone($phone);
$sql_user = "SELECT id FROM users WHERE phone = '".$phone."' and blocked=0";
// echo $sql_user."\n";
$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;
}
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 (phone = '$phone_client' OR id in (SELECT client_id FROM clients_phone2 WHERE phone = '$phone_client')) and (who_work in (".implode(',', $this->users).") or id_agent in (".implode(',', $this->users)."))";
if($no){
$sql_cl = "SELECT `id`, `stage` FROM `clients` WHERE (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;
}
public function recordSave($p){
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/server/beeline")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/server/beeline", 0777);
}
$records = array();
$records[] = $p->externalId;
$file = trim($this->get_record($p->id));
$name = $p->externalId.'.mp3';
if(!file_exists($_SERVER['DOCUMENT_ROOT'].'/server/beeline/'.$name)){
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/server/beeline/'.$name, $file);
}
//var_dump($file);*/
return json_encode($records);
}
public function find_user_comment($call, $type){
$number = $call->abonent->userId;
$mes = '';
$sql = "SELECT fio FROM mango_call_users WHERE number_sip = '".$number."'";
//echo $sql;
$q = mysql_query($sql);
if(mysql_num_rows($q) > 0){
$r = mysql_fetch_assoc($q);
$mes = '(Сотрудник '.$r['fio'].')';
}
return $mes;
}
public function stat($call, $agency_id){
$id = 0;
$idpg = 0;
$from_extension = '';
$to_extension = '';
if($call->direction == 'INBOUND'){
$to_number = $call->abonent->userId;
$from_number = $call->phone;
$to_extension = $call->abonent->extension;
if(empty($to_extension)){
$to_extension = $call->abonent->userId;
}
$entry_id = $call->abonent->userId;
} else {
$to_number = $call->phone;
$from_number = $call->abonent->userId;
$from_extension = $call->abonent->extension;
if(empty($from_extension)){
$from_extension = $call->abonent->userId;
}
$entry_id = $call->phone;
}
$call_id = false;
$operator_call_id = 0;
if(isset($call->callId)){
$operator_call_id = (int)str_replace(['callhalf-',':'],'',$call->callId);
}
if(!isset($call->id)){
$call->id = $call->startDate+$call->duration;
}
//echo $to_number.'<br>';
$sql = "SELECT id FROM mango_calls WHERE uuid = '".$call->id."'";
$q = mysql_query($sql);
$qpg = $this->dbpg->query($sql);
$date = floor($call->date/1000);
/* if(mysql_num_rows($q) == 0){
if(isset($call->externalId)){
$record = $this->recordSave($call);
} else {
$record = json_encode([]);
}
$answerResult = 'answered';
$answer = $date;
if(isset($call->status) && $call->status == 'MISSED'){
$answerResult = 'not answered';
$answer = 0;
}
$start = $date;
$finish = floor(($call->date + $call->duration)/1000);
// проверка записанных звонков с виджета
$update = false;
if($call->direction == 'INBOUND'){
//$uuid = $entry_id .".".($call->startDate);
$_sql = "SELECT id FROM mango_calls WHERE operator_id = 2 and `operator_call_id`=$operator_call_id";
if(!empty($from_number)){
$_sql .= "and from_number = '$from_number'";
}
$_c = mysql_fetch_assoc(mysql_query($sql));
if(isset($_c['id'])){
$update = true;
}
}
if($update){
$in = "UPDATE `mango_calls` SET
`records`='" . $record . "',
`start`= $start,
`finish`=$finish,
`to_extension`='" . $to_extension . "',
`operator_id`=2,
`operator_call_id`=$operator_call_id,
`uuid`='" . $call->id . "' WHERE id =".$_c['id'];
$id = (int)$_c['id'];
}
else {
$in = "INSERT INTO `mango_calls` SET
`records`='" . $record . "',
`start`= $start,
`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`='beeline',
`location`='',
`uuid`='" . $call->id . "',
`agency_id`=$agency_id,
`operator_id`=2,
`operator_call_id`=$operator_call_id,
`vpbx_id`='" . $call->abonent->userId ."'
";
}
mysql_query($in);
if(!$update){
$id = mysql_insert_id();
}
} else {
$r = mysql_fetch_assoc($q);
$id = (int)$r['id'];
}
*/
if($this->dbpg->num_rows($qpg) == 0){
if(isset($call->externalId)){
$record = $this->recordSave($call);
} else {
$record = json_encode([]);
}
$answerResult = 'answered';
$answer = $date;
if(isset($call->status) && $call->status == 'MISSED'){
$answerResult = 'not answered';
$answer = 0;
}
$start = $date;
$finish = floor(($call->date + $call->duration)/1000);
// проверка записанных звонков с виджета
$update = false;
if($call->direction == 'INBOUND'){
//$uuid = $entry_id .".".($call->startDate);
$_sql = "SELECT id FROM mango_calls WHERE operator_id = 2 and operator_call_id='{$operator_call_id}'";
if(!empty($from_number)){
$_sql .= "and from_number = '$from_number'";
}
$_c = $this->dbpg->fetch_assoc($this->dbpg->query($sql));
if(isset($_c['id'])){
$update = true;
}
}
if($update){
$in = "UPDATE mango_calls SET
records='" . $record . "',
start= $start,
finish=$finish,
to_extension='" . $to_extension . "',
from_extension='".$from_extension."',
operator_id=2,
operator_call_id='{$operator_call_id}',
uuid='" . $call->id . "' WHERE id =".$_c['id'];
$id = (int)$_c['id'];
}
else {
$in = "INSERT INTO mango_calls (records,
start,
finish,
answer,
from_extension,
from_number,
to_extension,
to_number,
disconnect_reason,
entry_id,
line_number,
location,
uuid,
agency_id,
operator_id,
operator_call_id,
vpbx_id
)
VALUES (
'" . $record . "',
$start,
$finish,
$answer,
'" . $from_extension . "',
'" . $from_number . "',
'" . $to_extension . "',
'" . $to_number . "',
'" . $answerResult . "',
'" . $entry_id . "',
'beeline',
'',
'" . $call->id . "',
$agency_id,
2,
'{$operator_call_id}',
'" . $call->abonent->userId ."'
)";
}
//file_put_contents($_SERVER['DOCUMENT_ROOT']."/webhooks/log_call_sql.txt", $in."\n", FILE_APPEND);
$this->dbpg->query($in);
if(!$update){
$idpg = $this->dbpg->insert_id();
}
} else {
$r = $this->dbpg->fetch_assoc($qpg);
$idpg = (int)$r['id'];
}
$result['id'] = $id;
$result['idpg'] = $idpg;
$result['call_id'] = $call->id;
return $result;
}
public function saveUser($user, $agency_id){
$phone = '';
if(isset($user->email) && !empty($user->email)){
$user_id = $user->userId;
$part_user = explode('@', $user_id);
if(isset($part_user[0])){
$user_id = $part_user[0];
}
$sql = "SELECT id, number_phone FROM mango_call_users WHERE user_id='".$user_id."'";
$q = mysql_query($sql);
$sql_p = "SELECT phone FROM users WHERE email = '".$user->email."' AND company_id = {$agency_id}";
if($agency_id == 19895){
//echo $sql_p."\n";
}
$q_p = mysql_query($sql_p);
if(mysql_num_rows($q_p) > 0){
$r_p = mysql_fetch_assoc($q_p);
$phone = $r_p['phone'];
} else {
$part_phone = str_replace('@ip.beeline.ru', '', $user_id);
$in_vdx = "'".$user_id."', '".$part_phone."', '".$this->ver_phone($part_phone)."'";
$sql_p = "SELECT phone FROM users WHERE vpbx_id in ({$in_vdx}) AND company_id = {$agency_id}";
if($agency_id == 19895){
//echo $sql_p."\n";
}
$q_p = mysql_query($sql_p);
if(mysql_num_rows($q_p) > 0){
$r_p = mysql_fetch_assoc($q_p);
$phone = $r_p['phone'];
}
}
$user_name = '';
if(isset($user->lastName) && !empty($user->lastName)){
$user_name .= $user->lastName;
}
if(isset($user->firstName) && !empty($user->firstName)){
if($user_name != ''){
$user_name .= ' ';
}
$user_name .= $user->firstName;
}
$department = '';
if(isset($user->department)){
$department = $user->department;
}
//Записываем
if(mysql_num_rows($q) == 0){
/*f($phone == ''){
$phone = mysql_fetch_assoc($q)['number_phone'];
}*/
$in = "INSERT INTO `mango_call_users` SET
user_id = '".$user_id."',
fio = '".$user_name."',
number_phone = '".$phone."',
number_sip = '".$user_id."',
department = '".trim($department)."',
extension = '".(isset($user->extension) ? $user->extension : '')."',
agency_id = $agency_id
";
// echo $in."\n";
mysql_query($in);
} else {
$up = "UPDATE `mango_call_users` SET
fio = '".$user_name."',
number_phone = '".$phone."',
number_sip = '".$user_id."',
department = '".trim($department)."',
extension = '".(isset($user->extension) ? $user->extension : '')."',
agency_id = $agency_id
WHERE user_id = '".$user_id."'";
// echo $up."\n";
mysql_query($up);
}
}
return $phone;
}
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;
}
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 save_user_call_pg($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 = $this->dbpg->query($sql);
if($this->dbpg->num_rows($q) == 0){
$sql_in = "INSERT INTO user_call (call_id, user_id) VALUES ($id_call, $user_id)";
if($agency_id == 11916){
//file_put_contents($_SERVER['DOCUMENT_ROOT']."/webhooks/log_call_sql.txt", $sql_in."\n", FILE_APPEND);
}
$this->dbpg->query($sql_in);
}
}
}
}