mirror of
https://github.com/fusionpbx/fusionpbx.git
synced 2026-01-06 11:43:50 +00:00
Update xml_cdr_statistics.php (#6557)
* Update xml_cdr_statistics.php * Build the xml cdr statistics with a query
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
|
||||
The Initial Developer of the Original Code is
|
||||
Mark J Crane <markjcrane@fusionpbx.com>
|
||||
Portions created by the Initial Developer are Copyright (C) 2008-2019
|
||||
Portions created by the Initial Developer are Copyright (C) 2008-2023
|
||||
the Initial Developer. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
@@ -290,7 +290,7 @@
|
||||
foreach ($stats as $row) {
|
||||
echo "<tr class='list-row'>\n";
|
||||
if ($i <= $hours) {
|
||||
echo " <td>".($i+1)."</td>\n";
|
||||
echo " <td>".$row['hours']."</td>\n";
|
||||
}
|
||||
else if ($i == $hours+1) {
|
||||
echo " <br /><br />\n";
|
||||
@@ -314,15 +314,15 @@
|
||||
echo "<tr class='list-row'>\n";
|
||||
}
|
||||
if ($i > $hours) {
|
||||
echo " <td>" . floor(escape($row['hours'])/24) . "</td>\n";
|
||||
echo " <td>" . floor(escape($row['s_hour'])/24) . "</td>\n";
|
||||
}
|
||||
if ($i <= $hours) {
|
||||
echo " <td>".date('j M', $row['start_epoch'])."</td>\n";
|
||||
echo " <td>".date('H:i', $row['start_epoch'])." - ".date('H:i', $row['stop_epoch'])." </td>\n";
|
||||
echo " <td>".$row['date']."</td>\n";
|
||||
echo " <td>".$row['time']." </td>\n";
|
||||
}
|
||||
else {
|
||||
echo " <td>".date('j M', $row['start_epoch'])." </td>\n";
|
||||
echo " <td>".date('H:i', $row['start_epoch'])." - ".date('j M H:i', $row['stop_epoch'])." </td>\n";
|
||||
echo " <td>".$row['date']."</td>\n";
|
||||
echo " <td>".$row['time']." </td>\n";
|
||||
}
|
||||
echo " <td>".escape($row['volume'])." </td>\n";
|
||||
echo " <td>".(round(escape($row['minutes']),2))." </td>\n";
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
The Initial Developer of the Original Code is
|
||||
Mark J Crane <markjcrane@fusionpbx.com>
|
||||
Portions created by the Initial Developer are Copyright (C) 2008-2019
|
||||
Portions created by the Initial Developer are Copyright (C) 2008-2023
|
||||
the Initial Developer. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
@@ -78,13 +78,14 @@
|
||||
*/
|
||||
|
||||
//get post or get variables from http
|
||||
if (count($_REQUEST) > 0) {
|
||||
if (isset($_REQUEST)) {
|
||||
$cdr_id = $_REQUEST["cdr_id"];
|
||||
$missed = $_REQUEST["missed"];
|
||||
$direction = $_REQUEST["direction"];
|
||||
$caller_id_name = $_REQUEST["caller_id_name"];
|
||||
$caller_id_number = $_REQUEST["caller_id_number"];
|
||||
$caller_extension_uuid = $_REQUEST["caller_extension_uuid"];
|
||||
$extension_uuid = $_REQUEST["extension_uuid"];
|
||||
$destination_number = $_REQUEST["destination_number"];
|
||||
$context = $_REQUEST["context"];
|
||||
$start_stamp_begin = $_REQUEST["start_stamp_begin"];
|
||||
@@ -142,7 +143,7 @@
|
||||
}
|
||||
else {
|
||||
$show_all = permission_exists('xml_cdr_all') && ($_GET['showall'] == 'true');
|
||||
$direction = 'inbound';
|
||||
//$direction = 'inbound';
|
||||
}
|
||||
|
||||
//if we do not see b-leg then use only a-leg to generate statistics
|
||||
@@ -151,47 +152,52 @@
|
||||
}
|
||||
|
||||
//build the sql where string
|
||||
if (!$show_all) {
|
||||
$sql_where_ands[] = "domain_uuid = :domain_uuid ";
|
||||
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
|
||||
}
|
||||
//if (!$show_all) {
|
||||
// $sql_where_ands[] = "c.domain_uuid = :domain_uuid ";
|
||||
// $parameters['domain_uuid'] = $_SESSION['domain_uuid'];
|
||||
//}
|
||||
if ($missed == true) {
|
||||
$sql_where_ands[] = "missed_call = true ";
|
||||
$sql_where_ands[] = "c.missed_call = true ";
|
||||
$sql_where_ands[] = "c.and hangup_cause <> 'LOSE_RACE' ";
|
||||
}
|
||||
if (strlen($start_epoch) > 0 && strlen($stop_epoch) > 0) {
|
||||
$sql_where_ands[] = "start_epoch between :start_epoch and :stop_epoch";
|
||||
$sql_where_ands[] = "c.start_epoch between :start_epoch and :stop_epoch";
|
||||
$parameters['start_epoch'] = $start_epoch;
|
||||
$parameters['stop_epoch'] = $stop_epoch;
|
||||
}
|
||||
if (strlen($cdr_id) > 0) {
|
||||
$sql_where_ands[] = "cdr_id like :cdr_id";
|
||||
$sql_where_ands[] = "c.cdr_id like :cdr_id";
|
||||
$parameters['cdr_id'] = '%'.$cdr_id.'%';
|
||||
}
|
||||
if (strlen($direction) > 0) {
|
||||
$sql_where_ands[] = "direction = :direction";
|
||||
$sql_where_ands[] = "c.direction = :direction";
|
||||
$parameters['direction'] = $direction;
|
||||
}
|
||||
if (strlen($caller_id_name) > 0) {
|
||||
$mod_caller_id_name = str_replace("*", "%", $caller_id_name);
|
||||
$sql_where_ands[] = "caller_id_name like :mod_caller_id_name";
|
||||
$sql_where_ands[] = "c.caller_id_name like :mod_caller_id_name";
|
||||
$parameters['mod_caller_id_name'] = $mod_caller_id_name;
|
||||
}
|
||||
if (strlen($caller_extension_uuid) > 0) {
|
||||
$sql_where_ands[] = "extension_uuid = :caller_extension_uuid";
|
||||
$sql_where_ands[] = "c.extension_uuid = :caller_extension_uuid";
|
||||
$parameters['caller_extension_uuid'] = $caller_extension_uuid;
|
||||
}
|
||||
if (strlen($extension_uuid) > 0) {
|
||||
$sql_where_ands[] = "c.extension_uuid = :extension_uuid";
|
||||
$parameters['extension_uuid'] = $extension_uuid;
|
||||
}
|
||||
if (strlen($caller_id_number) > 0) {
|
||||
$mod_caller_id_number = str_replace("*", "%", $caller_id_number);
|
||||
$sql_where_ands[] = "caller_id_number like :mod_caller_id_number";
|
||||
$sql_where_ands[] = "c.caller_id_number like :mod_caller_id_number";
|
||||
$parameters['mod_caller_id_number'] = $mod_caller_id_number;
|
||||
}
|
||||
if (strlen($destination_number) > 0) {
|
||||
$mod_destination_number = str_replace("*", "%", $destination_number);
|
||||
$sql_where_ands[] = "destination_number like :mod_destination_number";
|
||||
$sql_where_ands[] = "c.destination_number like :mod_destination_number";
|
||||
$parameters['mod_destination_number'] = $mod_destination_number;
|
||||
}
|
||||
if (strlen($context) > 0) {
|
||||
$sql_where_ands[] = "context like :context";
|
||||
$sql_where_ands[] = "c.context like :context";
|
||||
$parameters['context'] = '%'.$context.'%';
|
||||
}
|
||||
/*
|
||||
@@ -210,88 +216,87 @@
|
||||
}
|
||||
*/
|
||||
if (strlen($answer_stamp_begin) > 0 && strlen($answer_stamp_end) > 0) {
|
||||
$sql_where_ands[] = "answer_stamp between :answer_stamp_begin and :answer_stamp_end";
|
||||
$sql_where_ands[] = "c.answer_stamp between :answer_stamp_begin and :answer_stamp_end";
|
||||
$parameters['answer_stamp_begin'] = $answer_stamp_begin.':00.000';
|
||||
$parameters['answer_stamp_end'] = $answer_stamp_end.':59.999';
|
||||
}
|
||||
else if (strlen($answer_stamp_begin) > 0) {
|
||||
$sql_where_ands[] = "answer_stamp >= :answer_stamp_begin";
|
||||
$sql_where_ands[] = "c.answer_stamp >= :answer_stamp_begin";
|
||||
$parameters['answer_stamp_begin'] = $answer_stamp_begin.':00.000';
|
||||
}
|
||||
else if (strlen($answer_stamp_end) > 0) {
|
||||
$sql_where_ands[] = "answer_stamp <= :answer_stamp_end";
|
||||
$sql_where_ands[] = "c.answer_stamp <= :answer_stamp_end";
|
||||
$parameters['answer_stamp_end'] = $answer_stamp_end.':59.999';
|
||||
}
|
||||
if (strlen($end_stamp_begin) > 0 && strlen($end_stamp_end) > 0) {
|
||||
$sql_where_ands[] = "end_stamp between :end_stamp_begin and :end_stamp_end";
|
||||
$sql_where_ands[] = "c.end_stamp between :end_stamp_begin and :end_stamp_end";
|
||||
$parameters['end_stamp_begin'] = $end_stamp_begin.':00.000';
|
||||
$parameters['end_stamp_end'] = $end_stamp_end.':59.999';
|
||||
}
|
||||
else if (strlen($end_stamp_begin) > 0) {
|
||||
$sql_where_ands[] = "end_stamp >= :end_stamp_begin";
|
||||
$sql_where_ands[] = "c.end_stamp >= :end_stamp_begin";
|
||||
$parameters['end_stamp_begin'] = $end_stamp_begin.':00.000';
|
||||
}
|
||||
else if (strlen($end_stamp_end) > 0) {
|
||||
$sql_where_ands[] = "end_stamp <= :end_stamp_end";
|
||||
$sql_where_ands[] = "c.end_stamp <= :end_stamp_end";
|
||||
$parameters['end_stamp_end'] = $end_stamp_end.':59.999';
|
||||
}
|
||||
if (strlen($duration) > 0) {
|
||||
$sql_where_ands[] = "duration like :duration";
|
||||
$sql_where_ands[] = "c.duration like :duration";
|
||||
$parameters['duration'] = '%'.$duration.'%';
|
||||
}
|
||||
if (strlen($billsec) > 0) {
|
||||
$sql_where_ands[] = "billsec like :billsec";
|
||||
$sql_where_ands[] = "c.billsec like :billsec";
|
||||
$parameters['billsec'] = '%'.$billsec.'%';
|
||||
}
|
||||
if (strlen($hangup_cause) > 0) {
|
||||
$sql_where_ands[] = "hangup_cause like :hangup_cause";
|
||||
$sql_where_ands[] = "c.hangup_cause like :hangup_cause";
|
||||
$parameters['hangup_cause'] = '%'.$hangup_cause.'%';
|
||||
}
|
||||
if (is_uuid($uuid)) {
|
||||
$sql_where_ands[] = "uuid = :uuid";
|
||||
$sql_where_ands[] = "c.uuid = :uuid";
|
||||
$parameters['uuid'] = $uuid;
|
||||
}
|
||||
if (is_uuid($bleg_uuid)) {
|
||||
$sql_where_ands[] = "bleg_uuid = :bleg_uuid";
|
||||
$sql_where_ands[] = "c.bleg_uuid = :bleg_uuid";
|
||||
$parameters['bleg_uuid'] = $bleg_uuid;
|
||||
}
|
||||
if (strlen($accountcode) > 0) {
|
||||
$sql_where_ands[] = "accountcode = :accountcode";
|
||||
$sql_where_ands[] = "c.accountcode = :accountcode";
|
||||
$parameters['accountcode'] = $accountcode;
|
||||
}
|
||||
if (strlen($read_codec) > 0) {
|
||||
$sql_where_ands[] = "read_codec like :read_codec";
|
||||
$sql_where_ands[] = "c.read_codec like :read_codec";
|
||||
$parameters['read_codec'] = '%'.$read_codec.'%';
|
||||
}
|
||||
if (strlen($write_codec) > 0) {
|
||||
$sql_where_ands[] = "write_codec like :write_codec";
|
||||
$sql_where_ands[] = "c.write_codec like :write_codec";
|
||||
$parameters['write_codec'] = '%'.$write_codec.'%';
|
||||
}
|
||||
if (strlen($remote_media_ip) > 0) {
|
||||
$sql_where_ands[] = "remote_media_ip like :remote_media_ip";
|
||||
$sql_where_ands[] = "c.remote_media_ip like :remote_media_ip";
|
||||
$parameters['remote_media_ip'] = '%'.$remote_media_ip.'%';
|
||||
}
|
||||
if (strlen($network_addr) > 0) {
|
||||
$sql_where_ands[] = "network_addr like :network_addr";
|
||||
$sql_where_ands[] = "c.network_addr like :network_addr";
|
||||
$parameters['network_addr'] = '%'.$network_addr.'%';
|
||||
}
|
||||
if (strlen($mos_comparison) > 0 && strlen($mos_score) > 0 ) {
|
||||
$sql_where_ands[] = "rtp_audio_in_mos ".$mos_comparison." :mos_score";
|
||||
$sql_where_ands[] = "c.rtp_audio_in_mos ".$mos_comparison." :mos_score";
|
||||
$parameters['mos_score'] = $mos_score;
|
||||
}
|
||||
if (strlen($leg) > 0) {
|
||||
$sql_where_ands[] = "leg = :leg";
|
||||
$sql_where_ands[] = "c.leg = :leg";
|
||||
$parameters['leg'] = $leg;
|
||||
}
|
||||
//Exclude enterprise ring group and follow me originated legs
|
||||
//Exclude enterprise ring group legs
|
||||
if (!permission_exists('xml_cdr_enterprise_leg')) {
|
||||
$sql_where_ands[] .= "originating_leg_uuid IS NULL";
|
||||
$sql_where_ands[] .= "c.originating_leg_uuid IS NULL";
|
||||
}
|
||||
//If you can't see lose_race, don't run stats on it
|
||||
if (!permission_exists('xml_cdr_lose_race')) {
|
||||
$sql_where_ands[] = "hangup_cause != 'LOSE_RACE'";
|
||||
elseif (!permission_exists('xml_cdr_lose_race')) {
|
||||
$sql_where_ands[] = "c.hangup_cause != 'LOSE_RACE'";
|
||||
}
|
||||
|
||||
|
||||
//if not admin or superadmin, only show own calls
|
||||
if (!permission_exists('xml_cdr_domain')) {
|
||||
@@ -307,9 +312,9 @@
|
||||
array_search($caller_id_number, $user_extensions) === false &&
|
||||
array_search($destination_number, $user_extensions) === false
|
||||
) {
|
||||
$sql_where_ors[] = "caller_id_number like :user_extension";
|
||||
$sql_where_ors[] = "destination_number like :user_extension";
|
||||
$sql_where_ors[] = "destination_number like :star_99_user_extension";
|
||||
$sql_where_ors[] = "c.caller_id_number like :user_extension";
|
||||
$sql_where_ors[] = "c.destination_number like :user_extension";
|
||||
$sql_where_ors[] = "c.destination_number like :star_99_user_extension";
|
||||
$parameters['user_extension'] = $user_extension;
|
||||
$parameters['star_99_user_extension'] = '*99'.$user_extension;
|
||||
}
|
||||
@@ -317,7 +322,7 @@
|
||||
if ($caller_id_number == '') { // if source criteria is blank, then restrict to assigned ext
|
||||
foreach ($user_extensions as $user_extension) {
|
||||
if (strlen($user_extension) > 0) {
|
||||
$sql_where_ors[] = "caller_id_number like :user_extension";
|
||||
$sql_where_ors[] = "c.caller_id_number like :user_extension";
|
||||
$parameters['user_extension'] = $user_extension;
|
||||
}
|
||||
}
|
||||
@@ -326,8 +331,8 @@
|
||||
if ($destination_number == '') {
|
||||
foreach ($user_extensions as $user_extension) {
|
||||
if (strlen($user_extension) > 0) {
|
||||
$sql_where_ors[] = "destination_number like :user_extension";
|
||||
$sql_where_ors[] = "destination_number like :star_99_user_extension";
|
||||
$sql_where_ors[] = "c.destination_number like :user_extension";
|
||||
$sql_where_ors[] = "c.destination_number like :star_99_user_extension";
|
||||
$parameters['user_extension'] = $user_extension;
|
||||
$parameters['star_99_user_extension'] = '*99'.$user_extension;
|
||||
}
|
||||
@@ -343,10 +348,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
$sql_where = ' where ';
|
||||
//$sql_where = ' where ';
|
||||
// concatenate the 'ands's array, add to where clause
|
||||
if (is_array($sql_where_ands) && @sizeof($sql_where_ands) > 0) {
|
||||
$sql_where .= implode(" and ", $sql_where_ands)." and ";
|
||||
$sql_where .= "and ".implode(" and ", $sql_where_ands)." ";
|
||||
}
|
||||
|
||||
//calculate the seconds in different time frames
|
||||
@@ -355,112 +360,238 @@
|
||||
$seconds_week = $seconds_day * 7;
|
||||
$seconds_month = $seconds_day * 30;
|
||||
|
||||
//get the call volume between a start end end time in seconds
|
||||
function get_call_volume_between($start, $end, $where, $parameters) {
|
||||
$sql = "select count(*) as count, sum(billsec) as seconds, sum(answer_stamp - start_stamp) as tta from v_xml_cdr ";
|
||||
$sql .= $where." ";
|
||||
$sql .= "start_epoch between :start and :end ";
|
||||
$parameters['start'] = $start;
|
||||
$parameters['end'] = $end;
|
||||
$database = new database;
|
||||
$row = $database->select($sql, $parameters, 'row');
|
||||
if (is_array($row) && @sizeof($row) != 0) {
|
||||
return array(
|
||||
'volume' => $row['count'],
|
||||
'seconds' => $row['seconds'],
|
||||
'tta' => $row['tta'],
|
||||
);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function append_stats(&$stats, $hours, $start_epoch, $stop_epoch) {
|
||||
global $sql_where, $parameters, $missed;
|
||||
|
||||
$i = count($stats);
|
||||
|
||||
$stats[$i]['hours'] = $hours;
|
||||
$stats[$i]['start_stamp'] = date('Y-m-d h:n:s', $start_epoch);
|
||||
$stats[$i]['stop_stamp'] = date('Y-m-d h:n:s', $stop_epoch);
|
||||
$stats[$i]['start_epoch'] = $start_epoch;
|
||||
$stats[$i]['stop_epoch'] = $stop_epoch;
|
||||
$stat_range = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where, $parameters);
|
||||
$stats[$i]['volume'] = $stat_range ? $stat_range['volume'] : 0;
|
||||
$stats[$i]['seconds'] = $stat_range ? $stat_range['seconds'] : 0;
|
||||
$stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
|
||||
|
||||
if ($missed) {
|
||||
//we select only missed calls at first place - no reasons to select it again
|
||||
$stats[$i]['missed'] = $stats[$i]['volume'];
|
||||
}
|
||||
else {
|
||||
$where = $sql_where."missed_call = true and ";
|
||||
$stat_range = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where, $parameters);
|
||||
$stats[$i]['missed'] = $stat_range ? $stat_range['volume'] : 0;
|
||||
}
|
||||
|
||||
$delta_min = ($stop_epoch - $start_epoch) / 60;
|
||||
$success_volume = $stats[$i]['volume'] == 0 ? 0 : ($stats[$i]['volume'] - $stats[$i]['missed']);
|
||||
|
||||
//calls per minute (answered)
|
||||
$stats[$i]['cpm_ans'] = $success_volume / $delta_min;
|
||||
|
||||
//calls per minute
|
||||
$stats[$i]['avg_min'] = $stats[$i]['volume'] / $delta_min;
|
||||
|
||||
//answer / seizure ratio
|
||||
$stats[$i]['asr'] = $stats[$i]['volume'] == 0 ? 0 : ($success_volume / $stats[$i]['volume'] * 100);
|
||||
|
||||
//average time to answer
|
||||
$stats[$i]['avg_tta'] = $stats[$i]['volume'] == 0 ? 0 : round($stat_range['tta'] / $success_volume);
|
||||
|
||||
//average length of call
|
||||
$stats[$i]['aloc'] = $success_volume == 0 ? 0 : $stats[$i]['minutes'] / $success_volume;
|
||||
}
|
||||
|
||||
if (strlen($_GET['start_stamp_begin']) > 0 && strlen($_GET['start_stamp_end']) > 0 ) {
|
||||
$start_date = new DateTime($_GET['start_stamp_begin']);
|
||||
$end_date = new DateTime($_GET['start_stamp_end']);
|
||||
$time = $end_date->getTimestamp();
|
||||
$time = $time - $time % 3600;
|
||||
$hours = floor(($end_date->getTimestamp() - $start_date->getTimestamp()) / 3600);
|
||||
//set the time zone
|
||||
if (isset($_SESSION['domain']['time_zone']['name'])) {
|
||||
$time_zone = $_SESSION['domain']['time_zone']['name'];
|
||||
}
|
||||
else {
|
||||
//round down to the nearest hour
|
||||
$time = time() - time() % 3600;
|
||||
$hours = 23;
|
||||
$time_zone = date_default_timezone_get();
|
||||
}
|
||||
$parameters['time_zone'] = $time_zone;
|
||||
|
||||
//build the sql query for xml cdr statistics
|
||||
$sql = "select ";
|
||||
$sql .= "row_number() over() as hours, ";
|
||||
$sql .= "to_char(start_date at time zone :time_zone, 'DD Mon') as date, \n";
|
||||
$sql .= "to_char(start_date at time zone :time_zone, 'HH12:MI am') || ' - ' || to_char(end_date at time zone :time_zone, 'HH12:MI am') as time, \n";
|
||||
$sql .= "extract(epoch from start_date) as start_epoch, ";
|
||||
$sql .= "extract(epoch from end_date) as end_epoch, ";
|
||||
$sql .= "s_hour, start_date, end_date, volume, answered, (round(d.seconds / 60, 1)) as minutes, \n";
|
||||
$sql .= "(volume / (s_hour * 60)) as calls_per_minute, \n";
|
||||
$sql .= "(volume / s_hour) as calls_per_hour, missed, \n";
|
||||
$sql .= "(answered::numeric / (s_hour * 60)) as cpm_answered, \n"; //used in the graph
|
||||
$sql .= "(volume / (s_hour * 60)) as avg_min, \n"; //used in the graph
|
||||
$sql .= "(round(100 * (answered::numeric / NULLIF(volume, 0)),2)) as asr, \n";
|
||||
$sql .= "(round(seconds / NULLIF(answered, 0) / 60, 2)) as aloc, seconds \n";
|
||||
$sql .= "from \n";
|
||||
$sql .= "( \n";
|
||||
$sql .= " select \n";
|
||||
$sql .= " (count(*) filter ( \n";
|
||||
$sql .= " where start_stamp between s.start_date and s.end_date \n";
|
||||
$sql .= " )) as volume, \n";
|
||||
$sql .= " (count(*) filter ( \n";
|
||||
$sql .= " where start_stamp between s.start_date and s.end_date \n";
|
||||
$sql .= " and c.originating_leg_uuid IS NULL \n";
|
||||
$sql .= " and (c.answer_stamp IS NOT NULL and c.bridge_uuid IS NOT NULL) \n";
|
||||
$sql .= " and (c.cc_side IS NULL or c.cc_side !='agent') \n";
|
||||
$sql .= " )) as answered, \n";
|
||||
$sql .= " (count(*) filter ( \n";
|
||||
$sql .= " where start_stamp between s.start_date and s.end_date \n";
|
||||
$sql .= " and missed_call = true \n";
|
||||
$sql .= " )) as missed, \n";
|
||||
$sql .= " (sum(c.billsec) filter ( \n";
|
||||
$sql .= " where c.start_stamp between s.start_date and s.end_date \n";
|
||||
$sql .= " )) as seconds, \n";
|
||||
$sql .= " s.start_date, \n";
|
||||
$sql .= " s.end_date, \n";
|
||||
$sql .= " s.s_hour \n";
|
||||
$sql .= " from v_xml_cdr as c, \n";
|
||||
$sql .= " ( \n";
|
||||
$sql .= " select h.s_id, h.s_start, h.s_end, h.s_hour, \n";
|
||||
$sql .= " ('today'::timestamptz + (interval '1 hour') - (h.s_start * (interval '1 hour'))) as start_date, \n";
|
||||
$sql .= " ('today'::timestamptz + (interval '1 hour') - (h.s_end * (interval '1 hour'))) as end_date \n";
|
||||
$sql .= " from ( \n";
|
||||
$sql .= " select generate_series(0, 23) as s_id, generate_series(1, 24) as s_start, generate_series(0, 23) as s_end, 1 s_hour \n";
|
||||
$sql .= " union \n";
|
||||
$sql .= " select 25 s_id, 24 as s_start, 0 as s_end, 24 s_hour \n";
|
||||
$sql .= " union \n";
|
||||
$sql .= " select 26 s_id, 168 as s_start, 0 as s_end, 168 s_hour \n";
|
||||
$sql .= " union \n";
|
||||
$sql .= " select 27 s_id, 720 as s_start, 0 as s_end, 720 s_hour \n";
|
||||
$sql .= " ) as h \n";
|
||||
$sql .= " where true \n";
|
||||
$sql .= " group by s_id, s_hour, s_start, s_end \n";
|
||||
$sql .= " order by s_id asc \n";
|
||||
$sql .= " ) as s \n";
|
||||
$sql .= "where true \n";
|
||||
|
||||
//add the sql where string
|
||||
if (isset($sql_where)) {
|
||||
$sql .= $sql_where."\n";
|
||||
}
|
||||
|
||||
if (isset($_SESSION['cdr']['stat_hours_limit']['numeric'])) {
|
||||
$limit = $_SESSION['cdr']['stat_hours_limit']['numeric'] - 1;
|
||||
if ($hours > $limit) {
|
||||
$hours = $limit;
|
||||
}
|
||||
unset($limit);
|
||||
/*
|
||||
if (!$show_all) {
|
||||
$sql .= "and c.domain_uuid = :domain_uuid \n";
|
||||
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
|
||||
}
|
||||
if ($missed == true) {
|
||||
$sql .= "and c.missed_call = true ";
|
||||
}
|
||||
if (strlen($start_epoch) > 0 && strlen($stop_epoch) > 0) {
|
||||
$sql .= "and c.start_epoch between :start_epoch and :stop_epoch \n";
|
||||
$parameters['start_epoch'] = $start_epoch;
|
||||
$parameters['stop_epoch'] = $stop_epoch;
|
||||
}
|
||||
if (strlen($start_date) > 0 && strlen($stop_date) > 0) {
|
||||
$sql .= "and c.start_stamp between :start_date and :stop_date \n";
|
||||
$parameters['start_date'] = $start_date;
|
||||
$parameters['stop_date'] = $stop_date;
|
||||
}
|
||||
//if (strlen($start_stamp) == 0 && strlen($end_stamp) == 0) {
|
||||
// $sql .= "and c.start_stamp between NOW() - INTERVAL '24 HOURS' AND NOW() \n";
|
||||
//}
|
||||
if (strlen($cdr_id) > 0) {
|
||||
$sql .= "and c.cdr_id like :cdr_id \n";
|
||||
$parameters['cdr_id'] = '%'.$cdr_id.'%';
|
||||
}
|
||||
if (strlen($direction) > 0) {
|
||||
$sql .= "and c.direction = :direction \n";
|
||||
$parameters['direction'] = $direction;
|
||||
}
|
||||
if (strlen($caller_id_name) > 0) {
|
||||
$mod_caller_id_name = str_replace("*", "%", $caller_id_name);
|
||||
$sql .= "and c.caller_id_name like :mod_caller_id_name";
|
||||
$parameters['mod_caller_id_name'] = $mod_caller_id_name;
|
||||
}
|
||||
if (strlen($caller_extension_uuid) > 0) {
|
||||
$sql .= "and c.extension_uuid = :caller_extension_uuid \n";
|
||||
$parameters['caller_extension_uuid'] = $caller_extension_uuid;
|
||||
}
|
||||
if (strlen($extension_uuid) > 0) {
|
||||
$sql .= "and c.extension_uuid = :extension_uuid \n";
|
||||
$parameters['extension_uuid'] = $extension_uuid;
|
||||
}
|
||||
if (strlen($caller_id_number) > 0) {
|
||||
$mod_caller_id_number = str_replace("*", "%", $caller_id_number);
|
||||
$sql .= "and c.caller_id_number like :mod_caller_id_number \n";
|
||||
$parameters['mod_caller_id_number'] = $mod_caller_id_number;
|
||||
}
|
||||
if (strlen($destination_number) > 0) {
|
||||
$mod_destination_number = str_replace("*", "%", $destination_number);
|
||||
$sql .= "and c.destination_number like :mod_destination_number \n";
|
||||
$parameters['mod_destination_number'] = $mod_destination_number;
|
||||
}
|
||||
if (strlen($context) > 0) {
|
||||
$sql .= "and c.context like :context \n";
|
||||
$parameters['context'] = '%'.$context.'%';
|
||||
}
|
||||
if (strlen($start_stamp_begin) > 0 && strlen($start_stamp_end) > 0) {
|
||||
$sql .= "and c.start_stamp between :start_stamp_begin and :start_stamp_end \n";
|
||||
$parameters['start_stamp_begin'] = $start_stamp_begin.':00.000';
|
||||
$parameters['start_stamp_end'] = $start_stamp_end.':59.999';
|
||||
}
|
||||
else if (strlen($start_stamp_begin) > 0) {
|
||||
$sql .= "and c.start_stamp >= :start_stamp_begin \n";
|
||||
$parameters['start_stamp_begin'] = $start_stamp_begin.':00.000';
|
||||
}
|
||||
else if (strlen($start_stamp_end) > 0) {
|
||||
$sql .= "and c.start_stamp <= :start_stamp_end \n";
|
||||
$parameters['start_stamp_end'] = $start_stamp_end.':59.999';
|
||||
}
|
||||
if (strlen($answer_stamp_begin) > 0 && strlen($answer_stamp_end) > 0) {
|
||||
$sql .= "and c.answer_stamp between :answer_stamp_begin and :answer_stamp_end \n";
|
||||
$parameters['answer_stamp_begin'] = $answer_stamp_begin.':00.000';
|
||||
$parameters['answer_stamp_end'] = $answer_stamp_end.':59.999';
|
||||
}
|
||||
else if (strlen($answer_stamp_begin) > 0) {
|
||||
$sql .= "and c.answer_stamp >= :answer_stamp_begin \n";
|
||||
$parameters['answer_stamp_begin'] = $answer_stamp_begin.':00.000';
|
||||
}
|
||||
else if (strlen($answer_stamp_end) > 0) {
|
||||
$sql .= "and c.answer_stamp <= :answer_stamp_end \n";
|
||||
$parameters['answer_stamp_end'] = $answer_stamp_end.':59.999';
|
||||
}
|
||||
if (strlen($end_stamp_begin) > 0 && strlen($end_stamp_end) > 0) {
|
||||
$sql .= "and c.end_stamp between :end_stamp_begin and :end_stamp_end \n";
|
||||
$parameters['end_stamp_begin'] = $end_stamp_begin.':00.000';
|
||||
$parameters['end_stamp_end'] = $end_stamp_end.':59.999';
|
||||
}
|
||||
else if (strlen($end_stamp_begin) > 0) {
|
||||
$sql .= "and c.end_stamp >= :end_stamp_begin \n";
|
||||
$parameters['end_stamp_begin'] = $end_stamp_begin.':00.000';
|
||||
}
|
||||
else if (strlen($end_stamp_end) > 0) {
|
||||
$sql .= "and c.end_stamp <= :end_stamp_end \n";
|
||||
$parameters['end_stamp_end'] = $end_stamp_end.':59.999';
|
||||
}
|
||||
if (strlen($duration) > 0) {
|
||||
$sql .= "and c.duration like :duration \n";
|
||||
$parameters['duration'] = '%'.$duration.'%';
|
||||
}
|
||||
if (strlen($billsec) > 0) {
|
||||
$sql .= "and c.billsec like :billsec \n";
|
||||
$parameters['billsec'] = '%'.$billsec.'%';
|
||||
}
|
||||
if (strlen($hangup_cause) > 0) {
|
||||
$sql .= "and c.hangup_cause like :hangup_cause \n";
|
||||
$parameters['hangup_cause'] = '%'.$hangup_cause.'%';
|
||||
}
|
||||
if (is_uuid($uuid)) {
|
||||
$sql .= "and c.uuid = :uuid \n";
|
||||
$parameters['uuid'] = $uuid;
|
||||
}
|
||||
if (is_uuid($bleg_uuid)) {
|
||||
$sql .= "and c.bleg_uuid = :bleg_uuid \n";
|
||||
$parameters['bleg_uuid'] = $bleg_uuid;
|
||||
}
|
||||
if (strlen($accountcode) > 0) {
|
||||
$sql .= "and c.accountcode = :accountcode \n";
|
||||
$parameters['accountcode'] = $accountcode;
|
||||
}
|
||||
if (strlen($read_codec) > 0) {
|
||||
$sql .= "and c.read_codec like :read_codec \n";
|
||||
$parameters['read_codec'] = '%'.$read_codec.'%';
|
||||
}
|
||||
if (strlen($write_codec) > 0) {
|
||||
$sql .= "and c.write_codec like :write_codec \n";
|
||||
$parameters['write_codec'] = '%'.$write_codec.'%';
|
||||
}
|
||||
if (strlen($remote_media_ip) > 0) {
|
||||
$sql .= "and c.remote_media_ip like :remote_media_ip \n";
|
||||
$parameters['remote_media_ip'] = '%'.$remote_media_ip.'%';
|
||||
}
|
||||
if (strlen($network_addr) > 0) {
|
||||
$sql .= "and c.network_addr like :network_addr \n";
|
||||
$parameters['network_addr'] = '%'.$network_addr.'%';
|
||||
}
|
||||
if (strlen($mos_comparison) > 0 && strlen($mos_score) > 0 ) {
|
||||
$sql .= "and c.rtp_audio_in_mos ".$mos_comparison." :mos_score \n";
|
||||
$parameters['mos_score'] = $mos_score;
|
||||
}
|
||||
if (strlen($leg) > 0) {
|
||||
$sql .= "and c.leg = :leg \n";
|
||||
$parameters['leg'] = $leg;
|
||||
}
|
||||
|
||||
$stats = array();
|
||||
//exclude enterprise ring group and follow me originated legs
|
||||
if (!permission_exists('xml_cdr_enterprise_leg')) {
|
||||
$sql .= "and c.originating_leg_uuid IS NULL \n";
|
||||
}
|
||||
//if you can't see lose_race, don't run stats on it
|
||||
if (!permission_exists('xml_cdr_lose_race')) {
|
||||
$sql .= "and c.hangup_cause != 'LOSE_RACE' \n";
|
||||
}
|
||||
*/
|
||||
|
||||
//call info hour by hour for last n hours
|
||||
for ($i = $hours; $i >= 0 ; $i--) {
|
||||
$start_epoch = $time - 3600 * $i;
|
||||
$stop_epoch = $start_epoch + 3600;
|
||||
append_stats($stats, 1, $start_epoch, $stop_epoch);
|
||||
}
|
||||
$sql .= " group by s.s_id, s.start_date, s.end_date, s.s_hour \n";
|
||||
$sql .= " order by s.s_id asc \n";
|
||||
$sql .= ") as d; \n";
|
||||
$database = new database;
|
||||
$stats = $database->select($sql, $parameters, 'all');
|
||||
|
||||
//call info for entire period
|
||||
if (strlen($_GET['start_stamp_begin']) > 0 && strlen($_GET['start_stamp_end']) > 0 ) {
|
||||
$start_epoch = new DateTime($_GET['start_stamp_begin']);
|
||||
$stop_epoch = new DateTime($_GET['start_stamp_end']);
|
||||
$days = $start_epoch->diff($stop_epoch)->d;
|
||||
append_stats($stats, 24 * $days, $start_epoch->getTimestamp(), $stop_epoch->getTimestamp() );
|
||||
}
|
||||
else {
|
||||
$stop_epoch = time();
|
||||
append_stats($stats, 24, $stop_epoch - $seconds_day, $stop_epoch );
|
||||
append_stats($stats, 24 * 7, $stop_epoch - $seconds_week, $stop_epoch );
|
||||
append_stats($stats, 24 * 30, $stop_epoch - $seconds_month, $stop_epoch );
|
||||
}
|
||||
//set the hours
|
||||
$hours = 23;
|
||||
|
||||
//show the graph
|
||||
$x = 0;
|
||||
|
||||
Reference in New Issue
Block a user