Source of file api.asterisk.php
Size: 46,911 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.asterisk.php
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225 | <?php /** * Asterisk PBX basic integration class */ class Asterisk { /** * Contains Ubstorage data for Asterisk as key=>value * * @var array */ protected $config = array(); /** * Contains Ubstorage data for Number Alias Asterisk as key=>value * * @var array */ protected $NumAliases = array(); /** * Contains Login and mobiles from MySQL Databases as login=>data * * @var array */ protected $result_LoginByNumber; /** * Contains mobiles and Login from MySQL Databases as Number=>Login * * @var array */ protected $result_NumberLogin; /** * Contains only unniq mobiles and Login from MySQL Databases as Number=>Login * * @var array */ protected $result_NumberLoginUniq; /** * * * @var array */ protected $allrealnames; /** * * * @var array */ protected $alladdress; /** * Contains system mussages object placeholder * * @var object */ protected $messages = ''; /** * Comments caching time * * @var int */ protected $cacheTime = ''; //month by default /** * System alter.ini config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains default recorded calls path * * @var string */ protected $recordingsPath = ''; /** * Determines whether to use CEL table and contains CEL table name * * @var bool */ protected $recordingsCELTab = ''; /** * Contains default recorded files file extensions * * @var string */ protected $recordingsFormat = ''; /** * Placeholder for ASTERISK_GET_FULL_CDR_CEL_DATA alter.ini option * * @var bool */ protected $getFullCDRCELData = false; /** * Placeholder for MOBILES_EXT alter.ini option * * @var bool */ protected $extMobilesON = false; // Database's vars: private $connected; private $AsteriskDB; const URL_ME = '?module=asterisk'; const CACHE_PATH = 'exports/'; public function __construct() { $this->loadAlter(); $this->initMessages(); $this->AsteriskLoadConf(); $this->AsteriskLoadNumAliases(); $this->AsteriskConnectDB(); $this->initCache(); } /** * Loads system alter config into private property for further usage * * @global object $ubillingConfig * * @return void */ protected function loadAlter() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); $this->recordingsPath = ($ubillingConfig->getAlterParam('ASTERISK_CALLRECS_PATH')) ? $ubillingConfig->getAlterParam('ASTERISK_CALLRECS_PATH') : ''; $this->recordingsCELTab = ($ubillingConfig->getAlterParam('ASTERISK_CALLRECS_CEL_TAB_NAME')) ? $ubillingConfig->getAlterParam('ASTERISK_CALLRECS_CEL_TAB_NAME') : ''; $this->recordingsFormat = ($ubillingConfig->getAlterParam('ASTERISK_CALLRECS_FORMAT')) ? $ubillingConfig->getAlterParam('ASTERISK_CALLRECS_FORMAT') : ''; $this->getFullCDRCELData = $ubillingConfig->getAlterParam('ASTERISK_GET_FULL_CDR_CEL_DATA'); $this->extMobilesON = $ubillingConfig->getAlterParam('MOBILES_EXT'); } /** * Load Asterisk config * * @return array */ protected function AsteriskLoadConf() { $this->config = $this->AsteriskGetConf(); $this->cacheTime = $this->config['cachetime']; } /** * Inits system messages helper object for further usage * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Initalizes system cache object for further usage * * @return void */ protected function initCache() { $this->cache = new UbillingCache(); } /** * Check for last cache data and if need clean * * @return void */ protected function AsterikCacheInfoClean($asteriskTable, $from, $to) { if (!empty($from) and ! empty($to)) { $query = "select uniqueid from `" . $asteriskTable . "` where `calldate` BETWEEN '" . $from . " 00:00:00' AND '" . $to . " 23:59:59' AND (`lastapp`='dial' OR `lastapp`='queue') ORDER BY `calldate` DESC LIMIT 1"; $cacheName = $from . $to; $cache_uniqueid_key = 'ASTERISK_UNI_' . $cacheName; $last_db_uniqueid = $this->AsteriskQuery($query); $last_cache_uniqueid = $this->cache->get($cache_uniqueid_key, $this->cacheTime); // Если `uniqueid` не равен записи в кеше, то очищаем весь кеш if (($uniqueid = @$last_db_uniqueid['0']['uniqueid']) != $last_cache_uniqueid) { $this->cache->delete('ASTERISK_CDR_' . $cacheName, $this->cacheTime); $this->cache->set($cache_uniqueid_key, $uniqueid, $this->cacheTime); } } } /** * Gets Asterisk config from DB, or sets default values * * @return array */ protected function AsteriskGetConf() { $result = array(); //getting url $host = zb_StorageGet('ASTERISK_HOST'); if (empty($host)) { $host = 'localhost'; zb_StorageSet('ASTERISK_HOST', $host); } //getting login $login = zb_StorageGet('ASTERISK_LOGIN'); if (empty($login)) { $login = 'asterisk'; zb_StorageSet('ASTERISK_LOGIN', $login); } //getting DB name $db = zb_StorageGet('ASTERISK_DB'); if (empty($db)) { $db = 'asteriskdb'; zb_StorageSet('ASTERISK_DB', $db); } //getting CDR table name $table = zb_StorageGet('ASTERISK_TABLE'); if (empty($table)) { $table = 'cdr'; zb_StorageSet('ASTERISK_TABLE', $table); } //getting password $password = zb_StorageGet('ASTERISK_PASSWORD'); if (empty($password)) { $password = 'password'; zb_StorageSet('ASTERISK_PASSWORD', $password); } //getting caching time $cache = zb_StorageGet('ASTERISK_CACHETIME'); if (empty($cache)) { $cache = '2592000'; zb_StorageSet('ASTERISK_CACHETIME', $cache); } //getting caching time $dopmobile = zb_StorageGet('ASTERISK_DOPMOBILE'); if (empty($dopmobile)) { $dopmobile = ''; zb_StorageSet('ASTERISK_DOPMOBILE', $dopmobile); } $result['host'] = $host; $result['db'] = $db; $result['table'] = $table; $result['login'] = $login; $result['password'] = $password; $result['cachetime'] = $cache; $result['dopmobile'] = $dopmobile; return ($result); } /** * Initialises connection with Asterisk database server and selects needed db * * @param MySQL Connection Id $connection * @return MySQLDB */ protected function AsteriskConnectDB() { $this->AsteriskDB = new mysqli($this->config['host'], $this->config['login'], $this->config['password'], $this->config['db']); if (!$this->AsteriskDB->connect_error) { $this->connected = TRUE; return $this->connected; } else { $this->connected = FALSE; return $this->connected; } } /** * Another database query execution * * @param string $query - query to execute * * @return array */ public function AsteriskQuery($query) { if ($this->connected) { $result = array(); $result_query = $this->AsteriskDB->query($query, MYSQLI_USE_RESULT); while ($row = $result_query->fetch_assoc()) { $result[] = $row; } mysqli_free_result($result_query); //$this->AsteriskDB->close(); return ($result); } else { $result = rcms_redirect(self::URL_ME . '&config=true'); return ($result); } } /** * Load numbers aliases * * @return array */ protected function AsteriskLoadNumAliases() { $this->NumAliases = $this->AsteriskGetNumAliases(); } /** * Get numbers aliases from database, or set default empty array * * @return array */ protected function AsteriskGetNumAliases() { $result = array(); $rawAliases = zb_StorageGet('ASTERISK_NUMALIAS'); if (empty($rawAliases)) { $newAliasses = serialize($result); $newAliasses = base64_encode($newAliasses); zb_StorageSet('ASTERISK_NUMALIAS', $newAliasses); } else { $readAlias = base64_decode($rawAliases); $readAlias = unserialize($readAlias); $result = $readAlias; } return ($result); } /** * Returns Asterisk module configuration form * * @return string */ public function AsteriskConfigForm() { $result = wf_BackLink(self::URL_ME, '', true); $result .= wf_tag('br'); if (cfr('ASTERISKCONF')) { $inputs = ''; if (!$this->connected) { $inputs .= $this->messages->getStyledMessage(__('Connection error for Asterisk Database'), 'error') . wf_tag('br/', false); } $inputs .= wf_TextInput('newhost', __('Asterisk host'), $this->config['host'], true); $inputs .= wf_TextInput('newdb', __('Database name'), $this->config['db'], true); $inputs .= wf_TextInput('newtable', __('CDR table name'), $this->config['table'], true); $inputs .= wf_TextInput('newlogin', __('Database login'), $this->config['login'], true); $inputs .= wf_TextInput('newpassword', __('Database password'), $this->config['password'], true); $inputs .= wf_TextInput('newcachetime', __('Cache time'), $this->config['cachetime'], true); $inputs .= wf_TextInput('dopmobile', __('Additional mobile - Profile field ID'), $this->config['dopmobile'], true); $inputs .= wf_Submit(__('Save')); $result .= wf_Form("", "POST", $inputs, 'glamour'); } else { $result = $this->messages->getStyledMessage(__('Access denied'), 'error'); } return ($result); } /** * Returns number aliases aka phonebook form * * @return string */ public function AsteriskAliasesForm() { $result = ''; if (cfr('ASTERISKALIAS')) { $createinputs = wf_TextInput('newaliasnum', __('Phone'), '', true); $createinputs .= wf_TextInput('newaliasname', __('Alias'), '', true); $createinputs .= wf_Submit(__('Create')); $createform = wf_Form('', 'POST', $createinputs, 'glamour'); $result = $createform; if (!empty($this->NumAliases)) { $delArr = array(); foreach ($this->NumAliases as $num => $eachname) { $delArr[$num] = $num . ' - ' . $eachname; } $delinputs = wf_Selector('deletealias', $delArr, __('Delete alias'), '', false); $delinputs .= wf_Submit(__('Delete')); $delform = wf_Form('', 'POST', $delinputs, 'glamour'); $result .= $delform; } } else { $result = $this->messages->getStyledMessage(__('Access denied'), 'error'); } return ($result); } /** * Delete aliase for number on Ubstorage * * @return void */ public function AsteriskDeleteAlias($deleteAliasNum) { $newStoreAliases = $this->NumAliases; $deleteAliasNum = mysql_real_escape_string($deleteAliasNum); if (isset($newStoreAliases[$deleteAliasNum])) { unset($newStoreAliases[$deleteAliasNum]); $newStoreAliases = serialize($newStoreAliases); $newStoreAliases = base64_encode($newStoreAliases); zb_StorageSet('ASTERISK_NUMALIAS', $newStoreAliases); log_register("ASTERISK ALIAS DELETE `" . $deleteAliasNum . "`"); rcms_redirect(self::URL_ME . '&config=true'); } } /** * Create aliases for number on Ubstorage * * @return void */ public function AsteriskCreateAlias($newAliasNum, $newAliasName) { $newStoreAliases = $this->NumAliases; $newAliasNum = mysql_real_escape_string($newAliasNum); $newAliasName = mysql_real_escape_string($newAliasName); $newStoreAliases[$newAliasNum] = $newAliasName; $newStoreAliases = serialize($newStoreAliases); $newStoreAliases = base64_encode($newStoreAliases); zb_StorageSet('ASTERISK_NUMALIAS', $newStoreAliases); log_register("ASTERISK ALIAS ADD `" . $newAliasNum . "` NAME `" . $newAliasName . "`"); rcms_redirect(self::URL_ME . '&config=true'); } /** * Update parametrs for Asterisk configs on Ubstorage * * @return void */ public function AsteriskUpdateConfig($newhost, $newdb, $newtable, $newlogin, $newpassword, $newcachetime = '2592000', $dopmobile = '') { zb_StorageSet('ASTERISK_HOST', $newhost); zb_StorageSet('ASTERISK_DB', $newdb); zb_StorageSet('ASTERISK_TABLE', $newtable); zb_StorageSet('ASTERISK_LOGIN', $newlogin); zb_StorageSet('ASTERISK_PASSWORD', $newpassword); zb_StorageSet('ASTERISK_CACHETIME', ($newcachetime < 2592000) ? $newcachetime : 2592000); zb_StorageSet('ASTERISK_DOPMOBILE', $dopmobile); log_register('ASTERISK settings changed'); rcms_redirect(self::URL_ME . '&config=true'); } /** * Returns CDR date selection form * * @return string */ public function panel() { global $user_login; $inputs = ''; if (isset($user_login)) { $inputs .= wf_BackLink(self::URL_ME, '', false); } if (cfr('ASTERISKCONF')) { $inputs .= wf_Link(self::URL_ME . '&config=true', wf_img('skins/icon_extended.png') . ' ' . __('Settings'), false, 'ubButton') . ' '; } $inputs .= wf_DatePickerPreset('datefrom', curdate()) . ' ' . __('From'); $inputs .= wf_DatePickerPreset('dateto', curdate()) . ' ' . __('To'); if (!isset($user_login)) { $inputs .= wf_Trigger('countnum', __('Show the most annoying'), false); } $inputs .= wf_Submit(__('Show')); $result = wf_Form("", "POST", $inputs, 'glamour'); if (!$this->connected) { $result .= $this->messages->getStyledMessage(__('Connection error for Asterisk Database'), 'error') . wf_tag('br/', false); } return ($result); } /** * Get comment for user * * @param int $idComments - comment id * * @return string */ protected function AsteriskGetCommentsForUser($idComments) { $query = "SELECT `text` from `adcomments` WHERE `scope`='ASTERISK' AND `item`='" . $idComments . "' ORDER BY `date` ASC LIMIT 1;"; $result = simple_query($query); $comments = $result["text"]; return ($comments); } /** * Get status switch for user * * @param int $login - user login * * @return string */ protected function AsteriskGetSWStatus($login) { $alldeadswitches = zb_SwitchesGetAllDead(); $query = "SELECT `login`,`ip` FROM `switchportassign` LEFT JOIN `switches` ON switchportassign.switchid=switches.id WHERE `login`='" . $login . "';"; $result_q = simple_query($query); if (empty($result_q)) { $result = 'ERROR: USER NOT HAVE SWITCH'; } else { $result = isset($alldeadswitches[$result_q['ip']]) ? "DIE" : "OK"; } return ($result); } /** * Get status switch and other for user, if his bumber have database. Use only in remote API. * * @param int $number, $param * * @return mixed */ public function AsteriskGetInfoApi($number, $param) { $this->AsteriskGetLoginByNumberQuery(); $number_cut = substr($number, -10); $login = @$this->result_NumberLogin[$number_cut]; if (!empty($login)) { if ($param == "login") { $result = $login; } elseif ($param == "loginuniq") { $result = isset($this->result_NumberLoginUniq[$number_cut]) ? $this->result_NumberLoginUniq[$number_cut] : 'ERROR: USER HAVE MANY LOGINS'; } elseif ($param == "swstatus") { $result = $this->AsteriskGetSWStatus($login); } elseif ($param == "realname") { $this->AsteriskGetUserAllRealnames(); $realname = @$this->allrealnames[$login]; $realname = preg_replace('/[^a-zA-Zа-яА-Я0-9ё\d ]+/iu', '', $realname); $realname = zb_TranslitString($realname, TRUE); $result = $login . "-" . $realname; } else { $result = 'ERROR: MISTAKE PARAMETR'; } } else { $result = 'ERROR: NOT OUR USER'; } return ($result); } /** * Converts per second time values to human-readable format * * @param int $seconds - time interval in seconds * * @return string */ protected function AsteriskFormatTime($seconds) { $init = $seconds; $hours = floor($seconds / 3600); $minutes = floor(($seconds / 60) % 60); $seconds = $seconds % 60; if ($init < 3600) { //less than 1 hour if ($init < 60) { //less than minute $result = $seconds . ' ' . __('sec.'); } else { //more than one minute $result = $minutes . ' ' . __('minutes') . ' ' . $seconds . ' ' . __('seconds'); } } else { //more than hour $result = $hours . ' ' . __('hour') . ' ' . $minutes . ' ' . __('minutes') . ' ' . $seconds . ' ' . __('seconds'); } return ($result); } /** * Gets Login by caller number from DB * * @return void */ protected function AsteriskGetLoginByNumberQuery() { if (!isset($this->result_LoginByNumber) and empty($this->result_LoginByNumber)) { $result = array(); $result_a = array(); $resultUniq = array(); $resultTempUniq = array(); $resultNotUniq = array(); // It's need for future $queryPhone = "SELECT `phones`.`login`,`phone`,`mobile` FROM `phones`"; $resultPhone = simple_queryall($queryPhone); foreach ($resultPhone as $data) { $result[$data['login']]['phone'] = substr($data['phone'], -10); $result_a[substr($data['phone'], -10)] = $data['login']; $result[$data['login']]['mobile'] = substr($data['mobile'], -10); $result_a[substr($data['mobile'], -10)] = $data['login']; if (!empty($result[$data['login']]['phone'])) { $resultTempUniq[substr($data['phone'], -10)][] = $data['login']; } if (!empty($result[$data['login']]['mobile'])) { $resultTempUniq[substr($data['mobile'], -10)][] = $data['login']; } } if ($this->config['dopmobile']) { $query_mobile_dop = "SELECT `login`,`content` FROM `cfitems` WHERE `typeid`='" . $this->config['dopmobile'] . "'"; $result_md = simple_queryall($query_mobile_dop); foreach ($result_md as $data) { $result[$data['login']]['dop_mob'] = substr($data['content'], -10); $result_a[substr($data['content'], -10)] = $data['login']; $resultTempUniq[substr($data['content'], -10)][] = $data['login']; } } if ($this->altCfg['MOBILES_EXT']) { $query_mobileext = "SELECT `login`,`mobile` as `mobileext` FROM `mobileext`"; $result_me = simple_queryall($query_mobileext); foreach ($result_me as $data) { $result[$data['login']]['mobileext'][] = substr($data['mobileext'], -10); $result_a[substr($data['mobileext'], -10)] = $data['login']; if (!empty($result[$data['login']]['mobileext'])) { $resultTempUniq[substr($data['mobileext'], -10)][] = $data['login']; } } } } // Try remove duplicate phone and mobile from one users foreach ($resultTempUniq as $phone => $dataArr) { $rawArr = array_unique($dataArr); if (count($rawArr) == 1) { $resultUniq[$phone] = $rawArr[0]; } else { $resultNotUniq[$phone] = $rawArr; } } /* print "<pre>"; print_r ($resultUniq); print "</pre>"; */ $this->result_LoginByNumber = $result; $this->result_NumberLogin = $result_a; $this->result_NumberLoginUniq = $resultUniq; } /** * Returns all of users realnames records as login=>realname array * * @return void */ protected function AsteriskGetUserAllRealnames() { $this->allrealnames = zb_UserGetAllRealnames(); } /** * Returns user address by some user login * * @return void */ protected function AsteriskGetFulladdress() { $this->alladdress = zb_AddressGetFulladdresslistCached(); } /** * Returns human readable alias from phone book by phone number * * @param string $number - phone number * * @return string */ protected function AsteriskGetNumAlias($number) { if (!empty($this->NumAliases)) { if (isset($this->NumAliases[$number])) { return($number . ' - ' . $this->NumAliases[$number]); } else { return ($number); } } else { return ($number); } } /** * Gets Ubilling user login by number mobile * * @param string $number - number * * @return array */ protected function AsteriskGetLoginByNumber($number) { if (strlen($number) == 13 or strlen(substr($number, -10)) == 10) { $number_cut = substr($number, -10); $user_by_number = @$this->result_NumberLogin[$number_cut]; $result = array(); if (!empty($user_by_number)) { $result['link'] = wf_Link('?module=userprofile&username=' . $user_by_number, $number, false); $result['login'] = $user_by_number; $result['name'] = @$this->allrealnames[$user_by_number]; $result['adres'] = @$this->alladdress[$user_by_number]; return ($result); } else { $result['link'] = $number; $result['login'] = ''; $result['name'] = ''; $result['adres'] = ''; return ($result); } } else { $result['link'] = $this->AsteriskGetNumAlias($number); $result['login'] = ''; $result['name'] = ''; $result['adres'] = ''; return ($result); } } /** * Gets Asterisk CDR data from database and manage cache * Load AsteriskGetLoginByNumberQuery, AsteriskGetUserAllRealnames, AsteriskGetFulladdress * * @return mixed */ protected function AsteriskGetCDR() { $result = ''; // Load needed function $this->AsteriskGetLoginByNumberQuery(); $this->AsteriskGetUserAllRealnames(); $this->AsteriskGetFulladdress(); $from = isset($_GET['datefrom']) ? mysql_real_escape_string($_GET['datefrom']) : '2000-01-01'; $to = isset($_GET['dateto']) ? mysql_real_escape_string($_GET['dateto']) : curdate(); $asteriskTable = mysql_real_escape_string($this->config['table']); $user_login = isset($_GET['username']) ? vf($_GET['username']) : ''; if (!empty($this->recordingsPath) and ! empty($this->recordingsCELTab)) { $cel = $this->recordingsCELTab; $query_flds = $asteriskTable . ".*, " . $cel . ".id, " . $cel . ".appname, SUBSTRING_INDEX(" . $cel . ".appdata, ',', 1) AS app_data "; $query_voice_join = " LEFT JOIN " . $cel . " ON " . $asteriskTable . ".calldate = " . $cel . ".eventtime " . " AND " . $asteriskTable . ".cnum = " . $cel . ".cid_num " . " AND (lower(" . $cel . ".appname) = 'monitor' OR lower(" . $cel . ".appname) = 'mixmonitor') "; } else { $query_flds = ' * '; $query_voice_join = ''; } if (!empty($user_login)) { //fetch some data from Asterisk database $phone = @$this->result_LoginByNumber[$user_login]['phone']; $mobile = @$this->result_LoginByNumber[$user_login]['mobile']; $mobileext_arr = @$this->result_LoginByNumber[$user_login]['mobileext']; $dop_mobile = @$this->result_LoginByNumber[$user_login]['dop_mob']; // Building a query to the database $where_part = ''; $query = "select " . $query_flds . " from `" . $asteriskTable . "` " . $query_voice_join . " where `calldate` BETWEEN '" . $from . " 00:00:00' AND '" . $to . " 23:59:59' AND ("; if (!empty($phone) AND empty($where_part)) { $where_part .= "`src` LIKE '%" . $phone . "' OR `dst` LIKE '%" . $phone . "'"; } elseif (!empty($phone) AND ! empty($where_part)) { $where_part .= " OR `src` LIKE '%" . $phone . "' OR `dst` LIKE '%" . $phone . "'"; } if (!empty($mobile) AND empty($where_part)) { $where_part .= "`src` LIKE '%" . $mobile . "' OR `dst` LIKE '%" . $mobile . "'"; } elseif (!empty($mobile) AND ! empty($where_part)) { $where_part .= " OR `src` LIKE '%" . $mobile . "' OR `dst` LIKE '%" . $mobile . "'"; } if (!empty($mobileext_arr) AND empty($where_part)) { foreach ($mobileext_arr as $id => $mobileext) { if ($id == 0) { $where_part .= "`src` LIKE '%" . $mobileext . "' OR `dst` LIKE '%" . $mobileext . "'"; } else { $where_part .= " OR `src` LIKE '%" . $mobileext . "' OR `dst` LIKE '%" . $mobileext . "'"; } } } elseif (!empty($mobileext_arr) AND ! empty($where_part)) { foreach ($mobileext_arr as $mobileext) { $where_part .= " OR `src` LIKE '%" . $mobileext . "' OR `dst` LIKE '%" . $mobileext . "'"; } } if (!empty($dop_mobile) AND empty($where_part)) { $where_part .= "`src` LIKE '%" . $dop_mobile . "' OR `dst` LIKE '%" . $dop_mobile . "'"; } elseif (!empty($dop_mobile) AND ! empty($where_part)) { $where_part .= " OR `src` LIKE '%" . $dop_mobile . "' OR `dst` LIKE '%" . $dop_mobile . "'"; } $query .= $where_part; $query .= ") AND (`lastapp`='dial' OR `lastapp`='queue') ORDER BY `calldate` DESC"; if (!empty($where_part)) { $rawResult = $this->AsteriskQuery($query); } } elseif (wf_CheckGet(array('countnum')) and empty($user_login)) { $query = "select *,count(`src`) as `countnum` from `" . $asteriskTable . "` where `calldate` BETWEEN '" . $from . " 00:00:00' AND '" . $to . " 23:59:59' AND (`lastapp`='dial' OR `lastapp`='queue') GROUP BY `src`"; $rawResult = $this->AsteriskQuery($query); } else { // check if need clean cache $this->AsterikCacheInfoClean($asteriskTable, $from, $to); // Start check cache and get result $query = "select " . $query_flds . " from `" . $asteriskTable . "` " . $query_voice_join . " where `calldate` BETWEEN '" . $from . " 00:00:00' AND '" . $to . " 23:59:59' AND (`lastapp`='dial' OR `lastapp`='queue') ORDER BY `calldate` DESC"; $obj = $this; $cacheName = $from . $to; $rawResult = $this->cache->getCallback('ASTERISK_CDR_' . $cacheName, function() use ($query, $obj) { return ($obj->AsteriskQuery($query)); }, $this->cacheTime); } // Check for rawResult if (!empty($rawResult)) { //here is data parsing $result = $rawResult; } return $result; } /** * Returns container of Asterisk * * @return string */ public function renderAsteriskCDR() { $result = ''; if (empty($this->recordingsPath)) { $columns = array('#', 'ID', 'Time', 'From', 'Real Name', 'Address', 'To', 'Type', 'Status', 'Talk time'); } else { $columns = array('#', 'ID', 'Time', 'From', 'Real Name', 'Address', 'To', 'Type', 'Status', 'Talk time', 'Call recording'); } if (wf_CheckPost(array('countnum')) and ! isset($user_login) and $_POST['countnum']) { $columns[] = __('Annoyance'); $countnum = '&countnum=true'; } else { $columns[] = 'Comments'; $countnum = ''; } $from = isset($_POST['datefrom']) ? $_POST['datefrom'] : '2000-01-01'; $to = isset($_POST['dateto']) ? $_POST['dateto'] : curdate(); $user_login = isset($_GET['username']) ? '&username=' . vf($_GET['username']) : ''; $opts = '"order": [[ 0, "asc" ]]'; $result = wf_JqDtLoader($columns, '?module=asterisk&ajax=true&datefrom=' . $from . '&dateto=' . $to . $user_login . $countnum, false, 'Calls', 100, $opts); return ($result); } /** * Parse Asterisk RAW CDR data * * @return void */ public function ajaxAvaibleCDR() { $cdrData = $this->AsteriskGetCDR(); $adcomments = new ADcomments('ASTERISK'); // minus one SQL query per call $json = new wf_JqDtHelper(); if (!empty($cdrData)) { $totalTime = 0; $callsCounter = 0; $allVoiceFiles = (empty($this->recordingsPath)) ? array() : $this->getCallsRecords(); foreach ($cdrData as $io => $each) { if (!$this->getFullCDRCELData and isset($cdrData[$io - 1]['src'])) { if ($cdrData[$io]['src'] == $cdrData[$io - 1]['src'] and $cdrData[$io - 1]['disposition'] == 'NO ANSWER' and $cdrData[$io]['disposition'] != 'ANSWERED') continue; if ($cdrData[$io]['src'] == $cdrData[$io - 1]['src'] and $cdrData[$io - 1]['dst'] == 'hangup') continue; if ($cdrData[$io]['src'] == $cdrData[$io - 1]['src'] and $cdrData[$io - 1]['dst'] == 'musiconhold') continue; } $callsCounter++; $AsteriskGetLoginByNumberAraySrc = array($this->AsteriskGetLoginByNumber($each['src'])); foreach ($AsteriskGetLoginByNumberAraySrc as $tempDataSrc) { $link_src = $tempDataSrc['link']; $login = $tempDataSrc['login']; $name_src = $tempDataSrc['name']; $adres_src = $tempDataSrc['adres']; } $AsteriskGetLoginByNumberArayDst = array($this->AsteriskGetLoginByNumber($each['dst'])); foreach ($AsteriskGetLoginByNumberArayDst as $tempDataDst) { $link_dst = $tempDataDst['link']; if (!empty($tempDataDst['login'])) { $login = $tempDataDst['login']; } } $debugData = wf_tag('pre') . print_r($each, true) . wf_tag('pre', true); $startTime = $each['calldate']; $tmpTime = strtotime($each['calldate']); $endTime = $tmpTime + $each['duration']; $endTime = date("H:i:s", $endTime); $answerTime = $tmpTime + ($each['duration'] - $each['billsec']); $answerTime = date("H:i:s", $answerTime); $tmpStats = __('Taken up the phone') . ': ' . $answerTime . "\n"; $tmpStats .= __('End of call') . ': ' . $endTime; $sessionTimeStats = wf_tag('abbr', false, '', 'title="' . $tmpStats . '"'); $sessionTimeStats .= $startTime; $sessionTimeStats .= wf_tag('abbr', true); $callDirection = ''; $CallType = __('Dial'); if (ispos($each['lastapp'], 'internal-caller-transfer')) { $CallType = __('Call transfer'); } $callStatus = $each['disposition']; $statusIcon = ''; if (ispos($each['disposition'], 'ANSWERED')) { $callStatus = __('Answered'); $statusIcon = wf_img('skins/calls/phone_green.png'); } if (ispos($each['disposition'], 'NO ANSWER')) { $callStatus = __('No answer'); $statusIcon = wf_img('skins/calls/phone_red.png'); } if (ispos($each['disposition'], 'BUSY')) { $callStatus = __('Busy'); $statusIcon = wf_img('skins/calls/phone_yellow.png'); } if (ispos($each['disposition'], 'FAILED')) { $callStatus = __('Failed'); $statusIcon = wf_img('skins/calls/phone_fail.png'); } $speekTime = $each['billsec']; $totalTime = $totalTime + $each['billsec']; $speekTime = $this->AsteriskFormatTime($speekTime); $data[] = $callsCounter; $data[] = wf_modal($callsCounter, $callsCounter, $debugData, '', '500', '600'); $data[] = $sessionTimeStats; $data[] = $link_src; $data[] = $name_src; $data[] = $adres_src; $data[] = $link_dst; $data[] = $CallType; $data[] = $statusIcon . ' ' . $callStatus; $data[] = $speekTime; if (!empty($this->recordingsPath)) { if (isset($each['app_data']) and array_key_exists($each['app_data'], $allVoiceFiles)) { $callrecPath = $allVoiceFiles[$each['app_data']] . $each['app_data']; $fileUrl = self::URL_ME . '&astercallrecs=' . urlencode($callrecPath); $data[] = $this->getSoundcontrolsHTML5($fileUrl, $callrecPath); } elseif (isset($each['recordingfile']) and array_key_exists($each['recordingfile'], $allVoiceFiles)) { $callrecPath = $allVoiceFiles[$each['recordingfile']] . $each['recordingfile']; $fileUrl = self::URL_ME . '&astercallrecs=' . urlencode($callrecPath); $data[] = $this->getSoundcontrolsHTML5($fileUrl, $callrecPath); } elseif (isset($each['filename']) and array_key_exists($each['filename'], $allVoiceFiles)) { $callrecPath = $allVoiceFiles[$each['filename']] . $each['filename']; // То, что в each - это название столбца, в моём случае у меня всё было в filename $fileUrl = self::URL_ME . '&astercallrecs=' . urlencode($callrecPath); $data[] = $this->getSoundcontrolsHTML5($fileUrl, $callrecPath); } else { $data[] = ''; } } if (wf_CheckGet(array('countnum')) and ! isset($user_login) and $_GET['countnum']) { $data[] = $each['countnum']; } else { $itemId = $each['uniqueid'] . $each['disposition'][0]; if ($adcomments->haveComments($itemId)) { $link_text = wf_tag('center') . $adcomments->getCommentsIndicator($itemId) . wf_tag('br') . wf_tag('span', false, '', 'style="font-size:14px;color: black;"') . $this->AsteriskGetCommentsForUser($itemId) . wf_tag('span', true) . wf_tag('center', true); } else { $link_text = wf_tag('center') . __('Add comments') . wf_tag('center', true); } if (!empty($login)) { $data[] = wf_Link(self::URL_ME . '&addComments=' . $itemId . '&username=' . $login . '#profileending', $link_text, false); } else { $data[] = wf_Link(self::URL_ME . '&addComments=' . $itemId . '&AsteriskWindow=1', $link_text, false); } } $json->addRow($data); unset($data); } } $json->getJson(); } /** * Inits gsm/wav player for further usage * @DEPRECATED * * @return string */ public function initPlayer() { $result = ''; $result .= wf_tag('script', false, '', 'src="modules/jsc/wavplay/embed/domready.js"') . wf_tag('script', true); $result .= wf_tag('script', false, '', 'src="modules/jsc/wavplay/embed/swfobject.js"') . wf_tag('script', true); $result .= wf_tag('script', false, '', 'src="modules/jsc/wavplay/embed/tinywav.js"') . wf_tag('script', true); return ($result); } /** * Returns controls for some recorded call file * @DEPRECATED * * @param string $fileUrl * * @return string */ public function getSoundControls($fileUrl) { $result = ''; if (!empty($fileUrl)) { $result .= wf_tag('a', false, '', 'onclick="try{window.TinyWav.Play(\'' . $fileUrl . '\')}catch(E){alert(E)}"') . wf_img('skins/play.png', __('Play')) . wf_tag('a', true) . ' '; $result .= wf_tag('a', false, '', 'onclick="try{window.TinyWav.Pause()}catch(E){alert(E)}"') . wf_img('skins/pause.png', __('Pause')) . wf_tag('a', true) . ' '; $result .= wf_tag('a', false, '', 'onclick="try{window.TinyWav.Resume()}catch(E){alert(E)}"') . wf_img('skins/continue.png', __('Continue')) . wf_tag('a', true) . ' '; $result .= wf_Link($fileUrl, wf_img('skins/icon_download.png', __('Download'))); } return ($result); } protected function getSoundcontrolsHTML5($fileUrl, $filename) { $result = ''; if (!empty($fileUrl)) { $playableUrl = $fileUrl . '&playable=true'; $playerId = 'player_' . wf_InputId(); if ($filename != "" && file_exists($filename)) { $result.= wf_tag('audio', false, '', 'controls id="' . $playerId . '" src="' . $playableUrl . '" preload="none" style="width: 300px;"'); $result.= wf_tag('audio', true); } } return ($result); } /** * Catches file download * * @return void */ public function catchFileDownload() { if (wf_CheckGet(array('astercallrecs'))) { zb_DownloadFile(ubRouting::get('astercallrecs'), 'default'); } } /** * Returns available calls files array * * @return array */ protected function getCallsRecords() { $result = array(); $exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $this->recordingsFormat)) . '$/'; $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->recordingsPath)); foreach ($rii as $file) { if (!$file->isDir()) { if (!empty($this->recordingsFormat) and preg_match($exp, $file->getPathname())) { $dirPath = rtrim($file->getPath(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; $result[$file->getFilename()] = $dirPath; } else { $dirPath = rtrim($file->getPath(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; $result[$file->getFilename()] = $dirPath; } } } return ($result); } /** * Returns all logins for a given phone number or a part of phone number * * @param $mobile * @param bool $returnJSON * * @return array|string */ public function getLoginsByMobile($mobile, $returnJSON = true) { $logins = array(); $query = "(SELECT `login` FROM `phones` WHERE `mobile` LIKE '%" . $mobile . "%') UNION ALL (SELECT `login` FROM `mobileext` WHERE `mobile` LIKE '%" . $mobile . "%')"; $queryResult = simple_queryall($query); if (!empty($queryResult)) { foreach ($queryResult as $eachRec) { $logins[] = $eachRec['login']; } } $logins = ($returnJSON) ? json_encode($logins) : $logins; return ($logins); } /** * Returns all contracts for a given phone number or a part of phone number * * @param $mobile * @param bool $returnJSON * * @return array|string */ public function getContractsByMobile($mobile, $returnJSON = true) { $contracts = array(); $logins = $this->getLoginsByMobile($mobile, false); if (!empty($logins)) { foreach ($logins as $eachLogin) { $contracts[] = zb_UserGetContract($eachLogin); } } $contracts = ($returnJSON) ? json_encode($contracts) : $contracts; return ($contracts); } /** * Returns some user data by login with optional auth by login + password * * @param $login * @param string $passwd * @param bool $getExtMobiles * @param bool $returnJSON * * @return array|string */ public function getUserData($login, $passwd = '', $getExtMobiles = true, $returnJSON = true) { $userData = array(); if (!is_array($login) and ! empty($passwd)) { $allUsers = zb_UserGetAllDataCache(); if (empty($allUsers[$login]) or $allUsers[$login]['Password'] !== $passwd) { $userData['ERROR'] = 'Auth failed'; $userData = ($returnJSON) ? json_encode($userData) : $userData; return ($userData); } } if (is_array($login)) { $login = "'" . implode("','", $login) . "'"; $whereStr = "WHERE `users`.`login` IN (" . $login . ")"; } else { $whereStr = "WHERE `users`.`login` = '" . $login . "'"; } $query = "SELECT `login`, `Password`, `Cash`, `Credit`, `CreditExpire`, `Passive`, `Down`, `AlwaysOnline`, `Tariff`, `tariffs`.`Fee`, `tariffs`.`period`, `contracts`.`contract`, `phones`.`mobile`, `tAgents`.`agentid`, `tAgents`.`contrname` FROM `users` LEFT JOIN `tariffs` ON (`users`.`Tariff` = `tariffs`.`name`) LEFT JOIN `contracts` USING(`login`) LEFT JOIN `phones` USING(`login`) LEFT JOIN (SELECT `agentid`, `login`, `contrahens`.`contrname` FROM `ahenassignstrict` LEFT JOIN `contrahens` ON `ahenassignstrict`.`agentid` = `contrahens`.`id`) AS `tAgents` USING(`login`) " . $whereStr; $queryResult = simple_queryall($query); if (!empty($queryResult)) { foreach ($queryResult as $eachRec) { $tmpLogin = $eachRec['login']; if ($this->extMobilesON and $getExtMobiles) { $extMob = new MobilesExt(); $allExtMobs = $extMob->getUserMobiles($eachRec['login'], true); $eachRec['ext_mobiles'] = (empty($allExtMobs[$tmpLogin])) ? array() : $allExtMobs[$tmpLogin]; } $userData[$tmpLogin] = $eachRec; } } $userData = ($returnJSON) ? json_encode($userData) : $userData; return ($userData); } /** * Adds or creates user mobiles with max mobiles count threshold support * * @param $login * @param $mobile * @param int $maxMobilesCnt * @param bool $returnJSON * * @return array|string */ public function addUserMobile($login, $mobile, $maxMobilesCnt = 0, $returnJSON = true) { $allPhones = zb_GetAllAllPhonesCache(); $result = array(); if (!empty($allPhones[$login])) { $curUserPhones = $allPhones[$login]; $noMainMobileSet = empty($curUserPhones['mobile']); //check if such mobile already exists for this user if ($curUserPhones['mobile'] == $mobile or in_array($mobile, $curUserPhones['mobiles'])) { $result['ERROR'] = 'Such mobile already exists for this user'; $result = ($returnJSON) ? json_encode($result) : $result; return ($result); } // check if user mobiles count reached $maxMobilesCnt if (!empty($maxMobilesCnt)) { $curMobsCnt = ($noMainMobileSet) ? 0 : 1; $curMobsCnt += count($curUserPhones['mobiles']); if ($curMobsCnt >= $maxMobilesCnt) { $result['ERROR'] = 'Max mobiles count threshold reached'; $result = ($returnJSON) ? json_encode($result) : $result; return ($result); } } if ($noMainMobileSet) { zb_UserChangeMobile($login, $mobile); } else { $extMob = new MobilesExt(); $extMob->createUserMobile($login, $mobile, 'Added by Asterisk'); } } else { zb_UserCreatePhone($login, '', $mobile); } $cache = new UbillingCache(); $cache->delete('USER_ALL_PHONES_DATA'); $result['SUCCES'] = 'Mobile added'; $result = ($returnJSON) ? json_encode($result) : $result; return ($result); } } ?> |