Joywork/engine/classes/BeelineApiClass.php
2026-05-22 21:21:54 +03:00

723 lines
24 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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);
}
}
}
}