From 712b1e7281138f9d07f68dd59bc411c4adc950af Mon Sep 17 00:00:00 2001 From: FusionPBX Date: Thu, 16 Feb 2023 22:09:00 -0700 Subject: [PATCH] Update xml_cdr_statistics.php (#6557) * Update xml_cdr_statistics.php * Build the xml cdr statistics with a query --- app/xml_cdr/xml_cdr_statistics.php | 14 +- app/xml_cdr/xml_cdr_statistics_inc.php | 421 ++++++++++++++++--------- 2 files changed, 283 insertions(+), 152 deletions(-) diff --git a/app/xml_cdr/xml_cdr_statistics.php b/app/xml_cdr/xml_cdr_statistics.php index 8eaa642d3f..ce9bd71ce4 100644 --- a/app/xml_cdr/xml_cdr_statistics.php +++ b/app/xml_cdr/xml_cdr_statistics.php @@ -17,7 +17,7 @@ The Initial Developer of the Original Code is Mark J Crane - 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 "\n"; if ($i <= $hours) { - echo " ".($i+1)."\n"; + echo " ".$row['hours']."\n"; } else if ($i == $hours+1) { echo "

\n"; @@ -314,15 +314,15 @@ echo "\n"; } if ($i > $hours) { - echo " " . floor(escape($row['hours'])/24) . "\n"; + echo " " . floor(escape($row['s_hour'])/24) . "\n"; } if ($i <= $hours) { - echo " ".date('j M', $row['start_epoch'])."\n"; - echo " ".date('H:i', $row['start_epoch'])." - ".date('H:i', $row['stop_epoch'])." \n"; + echo " ".$row['date']."\n"; + echo " ".$row['time']." \n"; } else { - echo " ".date('j M', $row['start_epoch'])." \n"; - echo " ".date('H:i', $row['start_epoch'])." - ".date('j M H:i', $row['stop_epoch'])." \n"; + echo " ".$row['date']."\n"; + echo " ".$row['time']." \n"; } echo " ".escape($row['volume'])." \n"; echo " ".(round(escape($row['minutes']),2))." \n"; diff --git a/app/xml_cdr/xml_cdr_statistics_inc.php b/app/xml_cdr/xml_cdr_statistics_inc.php index a5dadf4326..f62757f2df 100644 --- a/app/xml_cdr/xml_cdr_statistics_inc.php +++ b/app/xml_cdr/xml_cdr_statistics_inc.php @@ -17,7 +17,7 @@ The Initial Developer of the Original Code is Mark J Crane - 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;