diff --git a/app/xml_cdr/app_config.php b/app/xml_cdr/app_config.php
index 658cbd0f10..f676e774ad 100644
--- a/app/xml_cdr/app_config.php
+++ b/app/xml_cdr/app_config.php
@@ -123,6 +123,14 @@
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
+ $apps[$x]['default_settings'][$y]['default_setting_uuid'] = "dd09aca6-5663-11e7-907b-a6006ad3dba0";
+ $apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
+ $apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "stat_hours_limit";
+ $apps[$x]['default_settings'][$y]['default_setting_name'] = "numeric";
+ $apps[$x]['default_settings'][$y]['default_setting_value'] = "24";
+ $apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
+ $apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+ $y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "cea53099-96c0-405f-ada6-219d0b398944";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "http_enabled";
diff --git a/app/xml_cdr/xml_cdr_statistics.php b/app/xml_cdr/xml_cdr_statistics.php
index 860a8e52e1..5f2dfc1de2 100644
--- a/app/xml_cdr/xml_cdr_statistics.php
+++ b/app/xml_cdr/xml_cdr_statistics.php
@@ -215,14 +215,9 @@ else {
echo "
ALOC | \n";
echo "\n";
echo "\n";
- echo " | 1 | \n";
}
- elseif ($i == $hours+2) {
- echo "
\n";
- echo " | 7 | \n";
- }
- elseif ($i == $hours+3) {
- echo " 30 | \n";
+ if ($i > $hours) {
+ echo " " . floor($row['hours']/24) . " | \n";
}
if ($i <= $hours) {
echo " ".date('j M', $row['start_epoch'])." | \n";
@@ -235,7 +230,7 @@ else {
echo " ".$row['volume']." | \n";
echo " ".(round($row['minutes'],2))." | \n";
echo " ".(round($row['avg_min'],2))." | \n";
- echo " ".$row['missed']." | \n";
+ echo " ".$row['missed']." | \n";
echo " ".(round($row['asr'],2))." | \n";
echo " ".(round($row['aloc'],2))." | \n";
echo "
\n";
diff --git a/app/xml_cdr/xml_cdr_statistics_inc.php b/app/xml_cdr/xml_cdr_statistics_inc.php
index 1ada9e04cc..d8a36d5751 100644
--- a/app/xml_cdr/xml_cdr_statistics_inc.php
+++ b/app/xml_cdr/xml_cdr_statistics_inc.php
@@ -130,6 +130,11 @@ else {
if(permission_exists('xml_cdr_b_leg')){
$leg = check_str($_REQUEST["leg"]);
}
+ $show_all = permission_exists('xml_cdr_all') && ($_REQUEST['showall'] == 'true');
+ }
+ else {
+ $show_all = permission_exists('xml_cdr_all') && ($_GET['showall'] == 'true');
+ $direction = 'inbound';
}
//if we do not see b-leg then use only a-leg to generate statistics
@@ -138,6 +143,9 @@ else {
}
//build the sql where string
+ if (!$show_all) {
+ $sql_where_ands[] = "domain_uuid = '".$_SESSION['domain_uuid']."'";
+ }
if ($missed == true) {
$sql_where_ands[] = "billsec = '0'";
}
@@ -162,21 +170,15 @@ else {
$sql_where_ands[] = "destination_number like '".$mod_destination_number."'";
}
if (strlen($context) > 0) { $sql_where_ands[] = "context like '%".$context."%'"; }
-/* if (strlen($start_stamp_begin) > 0 && strlen($start_stamp_end) > 0) { $sql_where_ands[] = "start_stamp BETWEEN '".$start_stamp_begin.":00.000' AND '".$start_stamp_end.":59.999'"; }
- else {
- if (strlen($start_stamp_begin) > 0) { $sql_where_ands[] = "start_stamp >= '".$start_stamp_begin.":00.000'"; }
- if (strlen($start_stamp_end) > 0) { $sql_where_ands[] = "start_stamp <= '".$start_stamp_end.":59.999'"; }
- }
-*/ if (strlen($answer_stamp_begin) > 0 && strlen($answer_stamp_end) > 0) { $sql_where_ands[] = "answer_stamp BETWEEN '".$answer_stamp_begin.":00.000' AND '".$answer_stamp_end.":59.999'"; }
- else {
- if (strlen($answer_stamp_begin) > 0) { $sql_where_ands[] = "answer_stamp >= '".$answer_stamp_begin.":00.000'"; }
- if (strlen($answer_stamp_end) > 0) { $sql_where_ands[] = "answer_stamp <= '".$answer_stamp_end.":59.999'"; }
- }
+ // if (strlen($start_stamp_begin) > 0 && strlen($start_stamp_end) > 0) { $sql_where_ands[] = "start_stamp BETWEEN '".$start_stamp_begin.":00.000' AND '".$start_stamp_end.":59.999'"; }
+ // else if (strlen($start_stamp_begin) > 0) { $sql_where_ands[] = "start_stamp >= '".$start_stamp_begin.":00.000'"; }
+ // else if (strlen($start_stamp_end) > 0) { $sql_where_ands[] = "start_stamp <= '".$start_stamp_end.":59.999'"; }
+ if (strlen($answer_stamp_begin) > 0 && strlen($answer_stamp_end) > 0) { $sql_where_ands[] = "answer_stamp BETWEEN '".$answer_stamp_begin.":00.000' AND '".$answer_stamp_end.":59.999'"; }
+ else if (strlen($answer_stamp_begin) > 0) { $sql_where_ands[] = "answer_stamp >= '".$answer_stamp_begin.":00.000'"; }
+ else if (strlen($answer_stamp_end) > 0) { $sql_where_ands[] = "answer_stamp <= '".$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.":00.000' AND '".$end_stamp_end.":59.999'"; }
- else {
- if (strlen($end_stamp_begin) > 0) { $sql_where_ands[] = "end_stamp >= '".$end_stamp_begin.":00.000'"; }
- if (strlen($end_stamp_end) > 0) { $sql_where_ands[] = "end_stamp <= '".$end_stamp_end.":59.999'"; }
- }
+ else if (strlen($end_stamp_begin) > 0) { $sql_where_ands[] = "end_stamp >= '".$end_stamp_begin.":00.000'"; }
+ else if (strlen($end_stamp_end) > 0) { $sql_where_ands[] = "end_stamp <= '".$end_stamp_end.":59.999'"; }
if (strlen($duration) > 0) { $sql_where_ands[] = "duration like '%".$duration."%'"; }
if (strlen($billsec) > 0) { $sql_where_ands[] = "billsec like '%".$billsec."%'"; }
if (strlen($hangup_cause) > 0) { $sql_where_ands[] = "hangup_cause like '%".$hangup_cause."%'"; }
@@ -233,7 +235,7 @@ else {
// concatenate the 'ands's array, add to where clause
if (sizeof($sql_where_ands) > 0) {
- $sql_where = " where ".implode(" and ", $sql_where_ands)." and ";
+ $sql_where = " where ".implode(" and ", $sql_where_ands)." and ";
}
//calculate the seconds in different time frames
@@ -245,15 +247,7 @@ else {
//get the call volume between a start end end time in seconds
function get_call_volume_between($start, $end, $where) {
global $db;
- if (strlen($where) == 0) {
- if ($_GET['showall'] && permission_exists('xml_cdr_all')) {
- $where = "where ";
- }
- else {
- $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' and ";
- }
- }
- $sql = "select count(*) as count from v_xml_cdr ";
+ $sql = "select count(*) as count, sum(billsec) as seconds from v_xml_cdr ";
$sql .= $where;
$sql .= " start_epoch BETWEEN ".$start." AND ".$end." ";
@@ -262,170 +256,96 @@ else {
$result = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
unset ($prep_statement, $sql);
if (count($result) > 0) {
- foreach($result as $row) {
- return $row['count'];
+ foreach ($result as $row) {
+ return array(
+ 'volume' => $row['count'], 'seconds' => $row['seconds'],
+ );
}
}
- else {
- return false;
- }
- unset($prep_statement, $result, $sql);
+ return false;
}
-//get the call time in seconds between the start and end time in seconds
- function get_call_seconds_between($start, $end, $where) {
- global $db;
- if (strlen($where) == 0) {
- if ($_GET['showall'] && permission_exists('xml_cdr_all')) {
- $where = "where ";
- }
- else {
- $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' and ";
- }
- }
- $sql = "select sum(billsec) as seconds from v_xml_cdr ";
- $sql .= $where;
- $sql .= " start_epoch BETWEEN ".$start." AND ".$end." ";
- $prep_statement = $db->prepare(check_sql($sql));
- $prep_statement->execute();
- $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
- unset ($prep_statement, $sql);
- if (count($result) > 0) {
- foreach($result as $row) {
- $result = $row['seconds'];
- if (strlen($result) == 0) {
- return 0;
- }
- else {
- return $row['seconds'];
- }
- }
+ function append_stats(&$stats, $hours, $start_epoch, $stop_epoch){
+ global $db, $sql_where, $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);
+ $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;
+ $stats[$i]['avg_sec'] = ($stats[$i]['volume']==0) ? 0 : $stats[$i]['seconds'] / $stats[$i]['volume'];
+
+ if($missed) {
+ // we select only missed calls at first plase. so there no reasons to select it again.
+ $stats[$i]['missed'] = $stats[$i]['volume'];
}
else {
- return false;
+ $where = $sql_where . "billsec = '0' and ";
+ $stat_range = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where);
+ $stats[$i]['missed'] = $stat_range ? $stat_range['volume'] : 0;
}
- unset($prep_statement, $result, $sql);
+
+ $delta_min = ($stop_epoch - $start_epoch) / 60;
+ $success_volume = ($stats[$i]['volume']==0) ? 0 : ($stats[$i]['volume'] - $stats[$i]['missed']);
+
+ // Calls per minute
+ $stats[$i]['avg_min'] = $success_volume / $delta_min;
+
+ //answer / seizure ratio
+ $stats[$i]['asr'] = ($stats[$i]['volume']==0) ? 0 : ($success_volume / $stats[$i]['volume'] * 100);
+
+ //average length of call
+ $stats[$i]['aloc'] = ($success_volume==0) ? 0 : $stats[$i]['minutes'] / $success_volume;
}
- //$call_seconds_1st_hour = get_call_seconds_between(3600, 0);
- //if (strlen($call_seconds_1st_hour) == 0) { $call_seconds_1st_hour = 0; }
if (strlen(check_str($_GET['start_stamp_begin'])) > 0 && strlen(check_str($_GET['start_stamp_end'])) > 0 ) {
$start_date = new DateTime(check_str($_GET['start_stamp_begin']));
$end_date = new DateTime(check_str($_GET['start_stamp_end']));
$time = $end_date->getTimestamp();
$time = $time - $time % 3600;
- $hours = ($end_date->getTimestamp() - $start_date->getTimestamp()) / 3600;
+ $hours = floor(($end_date->getTimestamp() - $start_date->getTimestamp()) / 3600);
} else {
//round down to the nearest hour
$time = time() - time() % 3600;
$hours = 23;
}
-//call info hour by hour
- for ($i = 0; $i <= $hours; $i++) {
- $start_epoch = $time - 3600*$i;
- $stop_epoch = $start_epoch + 3600;
- $stats[$i]['hours'] = $i + 1;
- $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;
- $stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
- $stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
- $stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
- $stats[$i]['avg_sec'] = ($stats[$i]['volume']==0) ? 0 : $stats[$i]['seconds'] / $stats[$i]['volume'];
- $stats[$i]['avg_min'] = (($stats[$i]['volume']==0) ? 0 : $stats[$i]['volume'] - $stats[$i]['missed']) / 60;
-
- //answer / seizure ratio
- if ($_GET['showall'] && permission_exists('xml_cdr_all')) {
- $where = "where ";
- } else {
- $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' and ";
+ if (isset($_SESSION['cdr']['stat_hours_limit']['numeric'])) {
+ $limit = $_SESSION['cdr']['stat_hours_limit']['numeric'] - 1;
+ if ($hours > $limit) {
+ $hours = $limit;
}
- $where .= " billsec = '0' and ";
- $where .= " direction = 'inbound' and ";
- $stats[$i]['missed'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where);
- $stats[$i]['asr'] = ($stats[$i]['volume']==0) ? 0 : (($stats[$i]['volume'] - $stats[$i]['missed']) / ($stats[$i]['volume']) * 100);
-
- //average length of call
- $stats[$i]['aloc'] = ($stats[$i]['volume']==0) ? 0 : $stats[$i]['minutes'] / ($stats[$i]['volume'] - $stats[$i]['missed']);
+ unset($limit);
}
-//call info for a day
- $i = $hours+1;
- $start_epoch = time() - $seconds_day;
- $stop_epoch = time();
- $stats[$i]['hours'] = 24;
- $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;
- $stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
- $stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
- $stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
- $stats[$i]['avg_sec'] = ($stats[$i]['volume']==0) ? 0 : $stats[$i]['seconds'] / $stats[$i]['volume'];
- $stats[$i]['avg_min'] = ($stats[$i]['volume'] - $stats[$i]['missed']) / (60*24);
- if ($_GET['showall'] && permission_exists('xml_cdr_all')) {
- $where = "where ";
- } else {
- $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' and ";
- }
- $where .= " billsec = '0' and ";
- $where .= " direction = 'inbound' and ";
- $stats[$i]['missed'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where);
- $stats[$i]['asr'] = ($stats[$i]['volume']==0) ? 0 :(($stats[$i]['volume'] - $stats[$i]['missed']) / ($stats[$i]['volume']) * 100);
- $stats[$i]['aloc'] = ($stats[$i]['volume']==0) ? 0 :$stats[$i]['minutes'] / ($stats[$i]['volume'] - $stats[$i]['missed']);
- $i++;
+ $stats = array();
-//call info for a week
- $start_epoch = time() - $seconds_week;
- $stop_epoch = time();
- $stats[$i]['hours'] = 24 * 7;
- $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;
- $stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
- $stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
- $stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
- $stats[$i]['avg_sec'] = ($stats[$i]['volume']==0) ? 0 :$stats[$i]['seconds'] / $stats[$i]['volume'];
- $stats[$i]['avg_min'] = ($stats[$i]['volume']==0) ? 0 :($stats[$i]['volume'] - $stats[$i]['missed']) / (60*24*7);
- if ($_GET['showall'] && permission_exists('xml_cdr_all')) {
- $where = "where ";
- } else {
- $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' and ";
+//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);
}
- $where .= " billsec = '0' and ";
- $where .= " direction = 'inbound' and ";
- $stats[$i]['missed'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where);
- $stats[$i]['asr'] = ($stats[$i]['volume']==0) ? 0 :(($stats[$i]['volume'] - $stats[$i]['missed']) / ($stats[$i]['volume']) * 100);
- $stats[$i]['aloc'] = ($stats[$i]['volume']==0) ? 0 :$stats[$i]['minutes'] / ($stats[$i]['volume'] - $stats[$i]['missed']);
- $i++;
-//call info for a month
- $start_epoch = time() - $seconds_month;
- $stop_epoch = time();
- $stats[$i]['hours'] = 24 * 30;
- $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;
- $stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
- $stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
- $stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
- $stats[$i]['avg_sec'] = ($stats[$i]['volume']==0) ? 0 :$stats[$i]['seconds'] / $stats[$i]['volume'];
- $stats[$i]['avg_min'] = ($stats[$i]['volume'] - $stats[$i]['missed']) / (60*24*30);
- if ($_GET['showall'] && permission_exists('xml_cdr_all')) {
- $where = "where ";
- } else {
- $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' and ";
+//call info for entire period
+ if (strlen(check_str($_GET['start_stamp_begin'])) > 0 && strlen(check_str($_GET['start_stamp_end'])) > 0 ) {
+ $start_epoch = new DateTime(check_str($_GET['start_stamp_begin']));
+ $stop_epoch = new DateTime(check_str($_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 );
}
- $where .= " billsec = '0' and ";
- $where .= " direction = 'inbound' and ";
- $stats[$i]['missed'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where);
- $stats[$i]['asr'] = ($stats[$i]['volume']==0) ? 0 :(($stats[$i]['volume'] - $stats[$i]['missed']) / ($stats[$i]['volume']) * 100);
- $stats[$i]['aloc'] =($stats[$i]['volume']==0) ? 0 : $stats[$i]['minutes'] / ($stats[$i]['volume'] - $stats[$i]['missed']);
- $i++;
//show the graph
@@ -471,4 +391,4 @@ else {
if ($x == $hours) { break; }
$x++;
}
-?>
+?>
\ No newline at end of file