Update xml_cdr_statistics.php (#6557)

* Update xml_cdr_statistics.php

* Build the xml cdr statistics with a query
This commit is contained in:
FusionPBX
2023-02-16 22:09:00 -07:00
committed by GitHub
parent ae98ad2d49
commit 712b1e7281
2 changed files with 283 additions and 152 deletions

View File

@@ -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'])."&nbsp;</td>\n";
echo " <td>".$row['date']."</td>\n";
echo " <td>".$row['time']."&nbsp;</td>\n";
}
else {
echo " <td>".date('j M', $row['start_epoch'])."&nbsp;</td>\n";
echo " <td>".date('H:i', $row['start_epoch'])." - ".date('j M H:i', $row['stop_epoch'])."&nbsp;</td>\n";
echo " <td>".$row['date']."</td>\n";
echo " <td>".$row['time']."&nbsp;</td>\n";
}
echo " <td>".escape($row['volume'])."&nbsp;</td>\n";
echo " <td>".(round(escape($row['minutes']),2))."&nbsp;</td>\n";

View File

@@ -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;