Updates for CDR archives database server (#3036)

* Updates for CDR archives database server

* Add CDR Archive Server

* Updates for CDR archive server

* Updates for CDR Archive server

* Updates for CDR Archive server

* Create xml_cdr_archive.php
This commit is contained in:
konradSC 2018-04-23 15:24:30 -04:00 committed by FusionPBX
parent 222bb23321
commit c7510768c7
6 changed files with 861 additions and 5 deletions

View File

@ -84,6 +84,10 @@
$apps[$x]['permissions'][$y]['name'] = "caller_destination";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "xml_cdr_archive";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
//default settings
$y=0;
@ -150,7 +154,63 @@
$apps[$x]['default_settings'][$y]['default_setting_value'] = "true";
$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'] = "f39db4b4-86bc-4d5d-9580-0f17c7934fe8";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "archive_database";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "boolean";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Enable Dedicated CDR Database Access";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "c655308c-476c-4f60-ac12-6aaf2b79c344";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "archive_database_driver";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "pgsql";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Archive Database Driver";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "eec7b6d7-6955-4ae2-8c6c-b853b3016200";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "archive_database_host";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "IP/Hostname of Archive Database";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "73a1ad24-82d0-492a-86bb-36376a87348e";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "archive_database_password";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Archive Database Password";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "a05be23e-b1cf-4c0b-9ded-e6f06a7a7946";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "archive_database_port";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "5432";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Archive Database Port";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "e92612b1-ed97-40a7-a641-78c8a79ff774";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "archive_database_username";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Archive Database Username";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "38c507f5-fce2-40de-99d5-5aa4e8d718de";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "cdr";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "archive_database_name";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "fusionpbx";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Archive Database Name";
//schema details
$y=0;
$apps[$x]['db'][$y]['table']['name'] = "v_xml_cdr";

View File

@ -61,6 +61,26 @@ $text['title']['ru-ru'] = "Детализация Вызовов";
$text['title']['sv-se'] = "Detaljerad Samtalsinformation";
$text['title']['uk-ua'] = "Параметри облікового запису";
$text['title-archive']['en-us'] = "Call Detail Records Archive";
$text['title-archive']['ar-eg'] = "";
$text['title-archive']['de-at'] = "Meine Gespräche Archiv"; //copied from de-de
$text['title-archive']['de-ch'] = "Meine Gespräche Archiv"; //copied from de-de
$text['title-archive']['de-de'] = "Meine Gespräche Archiv";
$text['title-archive']['es-cl'] = "Registro de Detalle de Llamadas Archivo";
$text['title-archive']['es-mx'] = "Registro de Detalle de Llamadas Archivo"; //copied from es-cl
$text['title-archive']['fr-ca'] = "Historique détaillé des appels Archiver"; //copied from fr-fr
$text['title-archive']['fr-fr'] = "Historique détaillé des appels Archiver";
$text['title-archive']['he-il'] = "";
$text['title-archive']['it-it'] = "Cartellini di Chiamata Archivio";
$text['title-archive']['nl-nl'] = "";
$text['title-archive']['pl-pl'] = "Wykaz rozmów Archiwum";
$text['title-archive']['pt-br'] = "Configurações da Conta Archiwum";
$text['title-archive']['pt-pt'] = "Registo de Chamadas Arquivo";
$text['title-archive']['ro-ro'] = "";
$text['title-archive']['ru-ru'] = "Детализация Вызовов архив";
$text['title-archive']['sv-se'] = "Detaljerad Samtalsinformation archív";
$text['title-archive']['uk-ua'] = "Параметри облікового запису архів";
$text['table-time']['en-us'] = "Time";
$text['table-time']['ar-eg'] = "";
$text['table-time']['de-at'] = "Zeit"; //copied from de-de
@ -2421,6 +2441,26 @@ $text['description-mos']['ru-ru'] = "Средний оценочный пока
$text['description-mos']['sv-se'] = "Genomsnittlig bedömning poäng";
$text['description-mos']['uk-ua'] = "Середнє число думок";
$text['button-archive']['en-us'] = "Archive";
$text['button-archive']['ar-eg'] = "";
$text['button-archive']['de-at'] = "Archiv"; //copied from de-de
$text['button-archive']['de-ch'] = "Archiv"; //copied from de-de
$text['button-archive']['de-de'] = "Archiv";
$text['button-archive']['es-cl'] = "Archivo";
$text['button-archive']['es-mx'] = "Archivo"; //copied from es-cl
$text['button-archive']['fr-ca'] = "Archiver"; //copied from fr-fr
$text['button-archive']['fr-fr'] = "Archiver";
$text['button-archive']['he-il'] = "";
$text['button-archive']['it-it'] = "Archivio";
$text['button-archive']['nl-nl'] = "";
$text['button-archive']['pl-pl'] = "Archiwum";
$text['button-archive']['pt-br'] = "Archiwum";
$text['button-archive']['pt-pt'] = "Arquivo";
$text['button-archive']['ro-ro'] = "";
$text['button-archive']['ru-ru'] = "архив";
$text['button-archive']['sv-se'] = "archív";
$text['button-archive']['uk-ua'] = "архів";
$text['button-update']['en-us'] = "Update";
$text['button-update']['ar-eg'] = "";
$text['button-update']['de-at'] = "Aktualisieren"; //copied from de-de

View File

@ -145,6 +145,12 @@
echo " <input type='button' class='btn' value='".$text['button-missed']."' onclick=\"document.location.href='xml_cdr.php?call_result=missed';\">\n";
}
echo " <input type='button' class='btn' value='".$text['button-statistics']."' onclick=\"document.location.href='xml_cdr_statistics.php';\">\n";
if (permission_exists('xml_cdr_archive')) {
if ($_REQUEST['show'] == 'all') {
$query_string = "show=all";
}
echo " <input type='button' class='btn' value='".$text['button-archive']."' onclick=\"window.location='xml_cdr_archive.php?$query_string';\">\n";
}
echo " <input type='button' class='btn' value='".$text['button-export']."' onclick=\"toggle_select('export_format');\">\n";
echo " <input type='button' class='btn' value='".$text['button-refresh']."' onclick=\"document.location.href='xml_cdr.php';\" />\n";
echo " </td>";

View File

@ -0,0 +1,731 @@
<?php
/*
FusionPBX
Version: MPL 1.1
The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the
License.
The Original Code is FusionPBX
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2017
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
*/
//includes
require_once "root.php";
require_once "resources/require.php";
require_once "resources/check_auth.php";
//check permisions
if (permission_exists('xml_cdr_view')) {
//access granted
}
else {
echo "access denied";
exit;
}
//add multi-lingual support
$language = new text;
$text = $language->get();
//additional includes
require_once "resources/header.php";
require_once "resources/paging.php";
//xml cdr include
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$archive_request = 'true';
require_once "xml_cdr_inc.php";
//javascript function: send_cmd
echo "<script type=\"text/javascript\">\n";
echo "function send_cmd(url) {\n";
echo " if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari\n";
echo " xmlhttp=new XMLHttpRequest();\n";
echo " }\n";
echo " else {// code for IE6, IE5\n";
echo " xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");\n";
echo " }\n";
echo " xmlhttp.open(\"GET\",url,true);\n";
echo " xmlhttp.send(null);\n";
echo " document.getElementById('cmd_reponse').innerHTML=xmlhttp.responseText;\n";
echo "}\n";
echo "</script>\n";
//javascript to toggle export select box
echo "<script language='javascript' type='text/javascript'>";
echo " var fade_speed = 400;";
echo " function toggle_select(select_id) {";
echo " $('#'+select_id).fadeToggle(fade_speed, function() {";
echo " document.getElementById(select_id).selectedIndex = 0;";
echo " });";
echo " }";
echo "</script>";
//page title and description
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
echo "<td align='left' nowrap='nowrap' style='vertical-align: top;'><b>".$text['title-archive']."</b><br><br><br></td>\n";
echo "<td align='right' width='100%' style='vertical-align: top;'>\n";
echo " <form id='frm_export' method='post' action='xml_cdr_export.php?archive_request=true'>\n";
echo " <input type='hidden' name='cdr_id' value='".$cdr_id."'>\n";
echo " <input type='hidden' name='direction' value='".$direction."'>\n";
echo " <input type='hidden' name='caller_id_name' value='".$caller_id_name."'>\n";
echo " <input type='hidden' name='start_stamp_begin' value='".$start_stamp_begin."'>\n";
echo " <input type='hidden' name='start_stamp_end' value='".$start_stamp_end."'>\n";
echo " <input type='hidden' name='hangup_cause' value='".$hangup_cause."'>\n";
echo " <input type='hidden' name='call_result' value='".$call_result."'>\n";
echo " <input type='hidden' name='caller_extension_uuid' value='".$caller_extension_uuid."'>\n";
echo " <input type='hidden' name='caller_id_number' value='".$caller_id_number."'>\n";
echo " <input type='hidden' name='caller_destination' value='".$caller_destination."'>\n";
echo " <input type='hidden' name='destination_number' value='".$destination_number."'>\n";
echo " <input type='hidden' name='context' value='".$context."'>\n";
echo " <input type='hidden' name='answer_stamp_begin' value='".$answer_stamp_begin."'>\n";
echo " <input type='hidden' name='answer_stamp_end' value='".$answer_stamp_end."'>\n";
echo " <input type='hidden' name='end_stamp_begin' value='".$end_stamp_begin."'>\n";
echo " <input type='hidden' name='end_stamp_end' value='".$end_stamp_end."'>\n";
echo " <input type='hidden' name='start_epoch' value='".$start_epoch."'>\n";
echo " <input type='hidden' name='stop_epoch' value='".$stop_epoch."'>\n";
echo " <input type='hidden' name='duration' value='".$duration."'>\n";
echo " <input type='hidden' name='billsec' value='".$billsec."'>\n";
echo " <input type='hidden' name='uuid' value='".$uuid."'>\n";
echo " <input type='hidden' name='bleg_uuid' value='".$bleg_uuid."'>\n";
echo " <input type='hidden' name='accountcode' value='".$accountcode."'>\n";
echo " <input type='hidden' name='read_codec' value='".$read_codec."'>\n";
echo " <input type='hidden' name='write_codec' value='".$write_codec."'>\n";
echo " <input type='hidden' name='remote_media_ip' value='".$remote_media_ip."'>\n";
echo " <input type='hidden' name='network_addr' value='".$network_addr."'>\n";
echo " <input type='hidden' name='bridge_uuid' value='".$bridge_uuid."'>\n";
echo " <input type='hidden' name='leg' value='".$leg."'>\n";
if (is_array($_SESSION['cdr']['field'])) {
foreach ($_SESSION['cdr']['field'] as $field) {
$array = explode(",", $field);
$field_name = $array[count($array) - 1];
if (isset($_REQUEST[$field_name])) {
echo " <input type='hidden' name='$field_name' value='".$$field_name."'>\n";
}
}
}
if (isset($order_by)) {
echo " <input type='hidden' name='order_by' value='".$order_by."'>\n";
echo " <input type='hidden' name='order' value='".$order."'>\n";
}
if (permission_exists('xml_cdr_all') && $_REQUEST['show'] == 'all') {
echo " <input type='hidden' name='show' value='all'>\n";
}
echo " <table cellpadding='0' cellspacing='0' border='0'>\n";
echo " <tr>\n";
echo " <td style='vertical-align: top;'>\n";
if (permission_exists('xml_cdr_all')) {
if ($_REQUEST['show'] != 'alll') {
echo " <input type='button' class='btn' value='".$text['button-show_all']."' onclick=\"window.location='xml_cdr_archive.php?show=all';\">\n";
}
}
// if (permission_exists('xml_cdr_search_advanced')) {
// if ($_REQUEST['show'] == 'all') {
// $query_string = "show=all";
// }
// echo " <input type='button' class='btn' value='".$text['button-advanced_search']."' onclick=\"window.location='xml_cdr_search.php?$query_string';\">\n";
// }
if ($_GET['call_result'] != 'missed') {
echo " <input type='button' class='btn' value='".$text['button-missed']."' onclick=\"document.location.href='xml_cdr_archive.php?call_result=missed';\">\n";
}
// echo " <input type='button' class='btn' value='".$text['button-statistics']."' onclick=\"document.location.href='xml_cdr_statistics.php';\">\n";
echo " <input type='button' class='btn' value='".$text['button-export']."' onclick=\"toggle_select('export_format');\">\n";
echo " <input type='button' class='btn' name='' alt='back' onclick=\"window.location='xml_cdr.php'\" value='Back'>";
echo " </td>";
echo " <td style='vertical-align: top;'>";
echo " <select class='formfld' style='display: none; width: auto; margin-left: 3px;' name='export_format' id='export_format' onchange=\"display_message('".$text['message-preparing_download']."'); toggle_select('export_format'); document.getElementById('frm_export').submit();\">\n";
echo " <option value=''>...</option>\n";
echo " <option value='csv'>CSV</option>\n";
echo " <option value='pdf'>PDF</option>\n";
echo " </select>\n";
echo " </td>\n";
if ($result_count == $rows_per_page && $paging_controls_mini != '') {
echo " <td style='vertical-align: top; padding-left: 15px;'>".$paging_controls_mini."</td>\n";
}
echo " </tr>\n";
echo " </table>\n";
echo " </form>\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td align='left' colspan='2'>\n";
echo $text['description']." \n";
echo $text['description2']." \n";
echo $text['description-3']." \n";
echo $text['description-4']." \n";
echo "<br /><br />\n";
echo "</td>\n";
echo "</tr>\n";
echo "</table>\n";
//basic search of call detail records
if (permission_exists('xml_cdr_search')) {
echo "<form method='get' action=''>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
echo "<td width='".((if_group("admin") || if_group("superadmin") || if_group("cdr")) ? '19%' : '30%')."' style='vertical-align: top;'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo " <tr>\n";
echo " <td class='vncell' valign='top' nowrap='nowrap'>\n";
echo " ".$text['label-direction']."\n";
echo " </td>\n";
echo " <td class='vtable' align='left'>\n";
echo " <select name='direction' class='formfld'>\n";
echo " <option value=''></option>\n";
echo " <option value='inbound' ".(($direction == "inbound") ? "selected='selected'" : null).">".$text['label-inbound']."</option>\n";
echo " <option value='outbound' ".(($direction == "outbound") ? "selected='selected'" : null).">".$text['label-outbound']."</option>\n";
echo " <option value='local' ".(($direction == "local") ? "selected='selected'" : null).">".$text['label-local']."</option>\n";
echo " </select>\n";
echo " </td>\n";
echo " </tr>\n";
echo " <tr>\n";
echo " <td class='vncell' valign='top' nowrap='nowrap'>\n";
echo " ".$text['label-status']."\n";
echo " </td>\n";
echo " <td class='vtable' align='left'>\n";
echo " <select name='call_result' class='formfld'>\n";
echo " <option value=''></option>\n";
echo " <option value='answered' ".(($call_result == 'answered') ? 'selected' : null).">".$text['label-answered']."</option>\n";
echo " <option value='missed' ".(($call_result == 'missed') ? 'selected' : null).">".$text['label-missed']."</option>\n";
echo " <option value='voicemail' ".(($call_result == 'voicemail') ? 'selected' : null).">".$text['label-voicemail']."</option>\n";
echo " <option value='cancelled' ".(($call_result == 'cancelled') ? 'selected' : null).">".$text['label-cancelled']."</option>\n";
echo " <option value='failed' ".(($call_result == 'failed') ? 'selected' : null).">".$text['label-failed']."</option>\n";
echo " </select>\n";
echo " </td>\n";
echo " </tr>\n";
echo "</table>\n";
echo "</td>";
echo "<td width='".((if_group("admin") || if_group("superadmin") || if_group("cdr")) ? '24%' : '30%')."' style='vertical-align: top;'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo " <tr>\n";
echo " <td class='vncell' valign='top' nowrap='nowrap'>\n";
echo " ".$text['label-source']."\n";
echo " </td>\n";
echo " <td class='vtable' align='left' style='white-space: nowrap;'>\n";
echo " <input type='text' class='formfld' style='".$style['caller_id_number']."' name='caller_id_number' id='caller_id_number' value='".$caller_id_number."'>\n";
echo " </td>\n";
echo " </tr>\n";
echo " <tr>\n";
echo " <td class='vncell' valign='top' nowrap='nowrap'>\n";
echo " ".$text['label-destination']."\n";
echo " </td>\n";
echo " <td class='vtable' align='left' style='white-space: nowrap;'>\n";
echo " <input type='text' class='formfld' name='destination_number' id='destination_number' value='".$destination_number."'>\n";
echo " </td>\n";
echo " </tr>\n";
echo "</table>\n";
echo "</td>";
echo "<td width='".((if_group("admin") || if_group("superadmin") || if_group("cdr")) ? '30%' : '40%')."' style='vertical-align: top;'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo " <tr>\n";
echo " <td class='vncell' valign='top' nowrap='nowrap'>\n";
echo " ".$text['label-start_range']."\n";
echo " </td>\n";
echo " <td class='vtable' align='left' style='position: relative; min-width: 250px;'>\n";
echo " <input type='text' class='formfld datetimepicker' style='min-width: 115px; width: 115px;' name='start_stamp_begin' placeholder='".$text['label-from']."' value='$start_stamp_begin'>\n";
echo " <input type='text' class='formfld datetimepicker' style='min-width: 115px; width: 115px;' name='start_stamp_end' placeholder='".$text['label-to']."' value='$start_stamp_end'>\n";
echo " </td>\n";
echo " </tr>\n";
echo " <tr>\n";
echo " <td class='vncell' valign='top' nowrap='nowrap'>\n";
echo " ".$text['label-cid-name']."\n";
echo " </td>\n";
echo " <td class='vtable' align='left'>\n";
echo " <input type='text' class='formfld' name='caller_id_name' value='$caller_id_name'>\n";
echo " </td>\n";
echo " </tr>\n";
echo "</table>\n";
echo "</td>";
// show hangup clause filter to super/admin
echo "<td width='27%' style='vertical-align: top;'>\n";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo " <tr>\n";
if (permission_exists('hangup_cause')) {
echo " <td class='vncell' valign='top' nowrap='nowrap'>\n";
echo " ".$text['label-hangup_cause']."\n";
echo " </td>\n";
echo " <td class='vtable' align='left'>\n";
echo " <select name='hangup_cause' class='formfld'>\n";
echo " <option value=''></option>\n";
$cdr_status_options = array(
'NORMAL_CLEARING',
'ORIGINATOR_CANCEL',
'BLIND_TRANSFER',
'LOSE_RACE',
'NO_ANSWER',
'NORMAL_UNSPECIFIED',
'NO_USER_RESPONSE',
'NO_ROUTE_DESTINATION',
'SUBSCRIBER_ABSENT',
'NORMAL_TEMPORARY_FAILURE',
'ATTENDED_TRANSFER',
'PICKED_OFF',
'USER_BUSY',
'CALL_REJECTED',
'INVALID_NUMBER_FORMAT',
'NETWORK_OUT_OF_ORDER',
'DESTINATION_OUT_OF_ORDER',
'RECOVERY_ON_TIMER_EXPIRE',
'MANAGER_REQUEST',
'MEDIA_TIMEOUT',
'UNALLOCATED_NUMBER',
'NONE',
'EXCHANGE_ROUTING_ERROR',
'ALLOTTED_TIMEOUT',
'CHAN_NOT_IMPLEMENTED',
'INCOMPATIBLE_DESTINATION',
'USER_NOT_REGISTERED',
'SYSTEM_SHUTDOWN',
'MANDATORY_IE_MISSING'
);
sort($cdr_status_options);
foreach ($cdr_status_options as $cdr_status) {
$selected = ($hangup_cause == $cdr_status) ? "selected='selected'" : null;
$cdr_status_label = ucwords(strtolower(str_replace("_", " ", $cdr_status)));
echo " <option value='".$cdr_status."' ".$selected.">".$cdr_status_label."</option>\n";
}
echo " </select>\n";
echo " </td>\n";
echo " </tr>\n";
}
if (permission_exists('caller_destination')) {
echo " <tr>\n";
echo " <td class='vncell' valign='top' nowrap='nowrap'>\n";
echo " ".$text['label-caller_destination']."\n";
echo " </td>\n";
echo " <td class='vtable' align='left'>\n";
echo " <input type='text' class='formfld' name='caller_destination' value='$caller_destination'>\n";
echo " </td>\n";
echo " </tr>\n";
}
echo "</table>\n";
echo "</td>";
echo "</tr>";
echo "</table>";
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>";
echo "<td style='padding-top: 8px;' align='left'>";
echo $text['description_search'];
echo "</td>";
echo "<td style='padding-top: 8px;' align='right' nowrap>";
if (permission_exists('xml_cdr_all') && $_REQUEST['show'] == 'all') {
echo "<input type='hidden' name='show' value='all'>\n";
}
echo "<input type='button' class='btn' value='".$text['button-reset']."' onclick=\"document.location.href='xml_cdr.php';\">\n";
echo "<input type='submit' class='btn' name='submit' value='".$text['button-search']."'>\n";
echo "</td>";
echo "</tr>";
echo "</table>";
echo "</form>";
echo "<br /><br />";
}
//mod paging parameters for inclusion in column sort heading links
$param = substr($param, 1); //remove leading '&'
$param = substr($param, 0, strrpos($param, '&order_by=')); //remove trailing order by
//show the results
$col_count = 8;
//echo "<form name='frm' method='post' action='xml_cdr_delete.php?archive_request=true'>\n";
echo "<table class='tr_hover' width='100%' cellpadding='0' cellspacing='0' border='0'>\n";
echo "<tr>\n";
//if (permission_exists('xml_cdr_delete') && $result_count > 0) {
// echo "<th style='width: 30px; text-align: center; padding: 0px;'><input type='checkbox' id='chk_all' onchange=\"(this.checked) ? check('all') : check('none');\"></th>";
// $col_count++;
//}
//column headings
echo "<th>&nbsp;</th>\n";
if ($_REQUEST['show'] == "all" && permission_exists('xml_cdr_all')) {
echo th_order_by('domain_name', $text['label-domain'], $order_by, $order, null, null, $param);
$col_count++;
}
echo th_order_by('caller_id_name', $text['label-cid-name'], $order_by, $order, null, null, $param);
echo th_order_by('caller_id_number', $text['label-source'], $order_by, $order, null, null, $param);
if (permission_exists('caller_destination')) {
echo th_order_by('caller_destination', $text['label-caller_destination'], $order_by, $order, null, null, $param);
}
echo th_order_by('destination_number', $text['label-destination'], $order_by, $order, null, null, $param);
if (permission_exists('recording_play') || permission_exists('recording_download')) {
echo "<th>".$text['label-recording']."</th>\n";
$col_count++;
}
if (is_array($_SESSION['cdr']['field'])) {
foreach ($_SESSION['cdr']['field'] as $field) {
$array = explode(",", $field);
$field_name = $array[count($array) - 1];
$field_label = ucwords(str_replace("_", " ", $field_name));
$field_label = str_replace("Sip", "SIP", $field_label);
if ($field_name != "destination_number") {
echo th_order_by($field_name, $field_label, $order_by, $order, null, "style='text-align: right;'", $param);
}
}
}
echo th_order_by('start_stamp', $text['label-start'], $order_by, $order, null, "style='text-align: center;'", $param);
echo th_order_by('tta', $text['label-tta'], $order_by, $order, null, "style='text-align: right;'", $param, $text['description-tta']);
echo th_order_by('duration', $text['label-duration'], $order_by, $order, null, "style='text-align: center;'", $param);
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/billing/app_config.php")){
echo "<th>".$text['label-price']."</th>\n";
$col_count++;
}
if (permission_exists('xml_cdr_pdd')) {
echo th_order_by('pdd_ms', $text['label-pdd'], $order_by, $order, null, "style='text-align: right;'", $param, $text['description-pdd']);
$col_count++;
}
if (permission_exists('xml_cdr_mos')) {
echo th_order_by('rtp_audio_in_mos', $text['label-mos'], $order_by, $order, null, "style='text-align: center;'", $param, $text['description-mos']);
$col_count++;
}
if (permission_exists('hangup_cause')) {
echo th_order_by('hangup_cause', $text['label-hangup_cause'], $order_by, $order, null, null, $param);
}
else {
echo "<th>".$text['label-status']."</th>\n";
}
/* if (if_group("admin") || if_group("superadmin") || if_group("cdr")) {
echo "<td class='list_control_icon'>";
if (permission_exists('xml_cdr_delete') && $result_count > 0) {
echo "<a href='javascript:void(0);' onclick=\"if (confirm('".$text['confirm-delete']."')) { document.forms.frm.submit(); }\" alt='".$text['button-delete']."'>".$v_link_label_delete."</a>";
}
echo "</td>\n";
$col_count++;
}
*/ echo "</tr>\n";
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/billing/app_config.php")){
require_once "app/billing/resources/functions/rating.php";
require_once "resources/classes/database.php";
$database = new database;
}
if ($result_count > 0) {
//determine if theme images exist
$theme_image_path = $_SERVER["DOCUMENT_ROOT"]."/themes/".$_SESSION['domain']['template']['name']."/images/";
$theme_cdr_images_exist = (
file_exists($theme_image_path."icon_cdr_inbound_answered.png") &&
file_exists($theme_image_path."icon_cdr_inbound_voicemail.png") &&
file_exists($theme_image_path."icon_cdr_inbound_cancelled.png") &&
file_exists($theme_image_path."icon_cdr_inbound_failed.png") &&
file_exists($theme_image_path."icon_cdr_outbound_answered.png") &&
file_exists($theme_image_path."icon_cdr_outbound_cancelled.png") &&
file_exists($theme_image_path."icon_cdr_outbound_failed.png") &&
file_exists($theme_image_path."icon_cdr_local_answered.png") &&
file_exists($theme_image_path."icon_cdr_local_voicemail.png") &&
file_exists($theme_image_path."icon_cdr_local_cancelled.png") &&
file_exists($theme_image_path."icon_cdr_local_failed.png")
) ? true : false;
foreach($result as $index => $row) {
//get the date and time
$tmp_year = date("Y", strtotime($row['start_stamp']));
$tmp_month = date("M", strtotime($row['start_stamp']));
$tmp_day = date("d", strtotime($row['start_stamp']));
$tmp_start_epoch = ($_SESSION['domain']['time_format']['text'] == '12h') ? date("j M Y g:i:sa", $row['start_epoch']) : date("j M Y H:i:s", $row['start_epoch']);
//get the hangup cause
$hangup_cause = $row['hangup_cause'];
$hangup_cause = str_replace("_", " ", $hangup_cause);
$hangup_cause = strtolower($hangup_cause);
$hangup_cause = ucwords($hangup_cause);
//if call cancelled, show the ring time, not the bill time.
$seconds = ($row['hangup_cause']=="ORIGINATOR_CANCEL") ? $row['duration'] : round(($row['billmsec'] / 1000), 0, PHP_ROUND_HALF_UP);
//determine recording properties
if (permission_exists('recording_play') || permission_exists('recording_download')) {
$record_path = $row['record_path'];
$record_name = $row['record_name'];
//$record_name = strtolower(pathinfo($tmp_name, PATHINFO_BASENAME));
$record_extension = pathinfo($record_name, PATHINFO_EXTENSION);
switch ($record_extension) {
case "wav" : $record_type = "audio/wav"; break;
case "mp3" : $record_type = "audio/mpeg"; break;
case "ogg" : $record_type = "audio/ogg"; break;
}
}
//recording playback
if (permission_exists('recording_play') && $record_path != '') {
echo "<tr id='recording_progress_bar_".$row['uuid']."' style='display: none;'><td class='".$row_style[$c]." playback_progress_bar_background' style='padding: 0; border: none;' colspan='".$col_count."'><span class='playback_progress_bar' id='recording_progress_".$row['uuid']."'></span></td></tr>\n";
}
// if ($row['raw_data_exists'] && permission_exists('xml_cdr_details')) {
// $tr_link = "href='xml_cdr_details.php?uuid=".$row['uuid'].(($_REQUEST['show']) ? "&show=all" : null)."'";
// }
// else {
// $tr_link = null;
// }
// echo "<tr ".$tr_link.">\n";
/* if (permission_exists('xml_cdr_delete')) {
echo " <td valign='top' class='".$row_style[$c]." tr_link_void' style='text-align: center; vertical-align: middle; padding: 0px;'>";
echo " <input type='checkbox' name='id[".$index."]' id='checkbox_".$row['uuid']."' value='".$row['uuid']."' onclick=\"if (this.checked) { document.getElementById('recording_".$row['uuid']."').value='".base64_encode($record_path.'/'.$record_name)."' } else { document.getElementById('recording_".$row['uuid']."').value=''; document.getElementById('chk_all').checked = false; }\">";
echo " <input type='hidden' name='rec[".$index."]' id='recording_".$row['uuid']."'>";
echo " </td>";
$xml_ids[] = 'checkbox_'.$row['uuid'];
}
*/ //determine call result and appropriate icon
echo "<td valign='top' class='".$row_style[$c]."'>\n";
if ($theme_cdr_images_exist) {
if ($row['direction'] == 'inbound' || $row['direction'] == 'local') {
if ($row['answer_stamp'] != '' && $row['bridge_uuid'] != '') { $call_result = 'answered'; }
else if ($row['answer_stamp'] != '' && $row['bridge_uuid'] == '') { $call_result = 'voicemail'; }
else if ($row['answer_stamp'] == '' && $row['bridge_uuid'] == '' && $row['sip_hangup_disposition'] != 'send_refuse') { $call_result = 'cancelled'; }
else { $call_result = 'failed'; }
}
else if ($row['direction'] == 'outbound') {
if ($row['answer_stamp'] != '' && $row['bridge_uuid'] != '') { $call_result = 'answered'; }
else if ($row['answer_stamp'] == '' && $row['bridge_uuid'] != '') { $call_result = 'cancelled'; }
else { $call_result = 'failed'; }
}
if (strlen($row['direction']) > 0) {
$image_name = "icon_cdr_" . $row['direction'] . "_" . $call_result;
if($row['leg'] == 'b'){
$image_name .= '_b';
}
$image_name .= ".png";
echo "<img src='".PROJECT_PATH."/themes/".$_SESSION['domain']['template']['name']."/images/$image_name' width='16' style='border: none; cursor: help;' title='".$text['label-'.$row['direction']].": ".$text['label-'.$call_result]. ($row['leg']=='b'?'(b)':'') . "'>\n";
}
}
else { echo "&nbsp;"; }
echo "</td>\n";
//domain name
if ($_REQUEST['show'] == "all" && permission_exists('xml_cdr_all')) {
echo " <td valign='top' class='".$row_style[$c]."'>";
echo $row['domain_name'].'&nbsp;';
echo " </td>\n";
}
//caller id name
echo " <td valign='top' class='".$row_style[$c]."'>".$row['caller_id_name']."&nbsp;</td>\n";
//source
echo " <td valign='top' class='".$row_style[$c]." tr_link_void' nowrap='nowrap'>";
echo " <a href=\"javascript:void(0)\" onclick=\"send_cmd('".PROJECT_PATH."/app/click_to_call/click_to_call.php?src_cid_name=".urlencode($row['caller_id_name'])."&src_cid_number=".urlencode($row['caller_id_number'])."&dest_cid_name=".urlencode($_SESSION['user']['extension'][0]['outbound_caller_id_name'])."&dest_cid_number=".urlencode($_SESSION['user']['extension'][0]['outbound_caller_id_number'])."&src=".urlencode($_SESSION['user']['extension'][0]['user'])."&dest=".urlencode($row['caller_id_number'])."&rec=false&ringback=us-ring&auto_answer=true');\">\n";
if (is_numeric($row['caller_id_number'])) {
echo " ".format_phone($row['caller_id_number']).' ';
}
else {
echo " ".$row['caller_id_number'].' ';
}
echo " </a>";
echo " </td>\n";
//caller destination
if (permission_exists('caller_destination')) {
echo " <td valign='top' class='".$row_style[$c]." tr_link_void' nowrap='nowrap'>";
echo " <a href=\"javascript:void(0)\" onclick=\"send_cmd('".PROJECT_PATH."/app/click_to_call/click_to_call.php?src_cid_name=".urlencode($row['caller_id_name'])."&src_cid_number=".urlencode($row['caller_id_number'])."&dest_cid_name=".urlencode($_SESSION['user']['extension'][0]['outbound_caller_id_name'])."&dest_cid_number=".urlencode($_SESSION['user']['extension'][0]['outbound_caller_id_number'])."&src=".urlencode($_SESSION['user']['extension'][0]['user'])."&dest=".urlencode($row['caller_destination'])."&rec=false&ringback=us-ring&auto_answer=true');\">\n";
if (is_numeric($row['caller_destination'])) {
echo " ".format_phone($row['caller_destination']).' ';
}
else {
echo " ".$row['caller_destination'].' ';
}
echo " </a>";
echo " </td>\n";
}
//destination
echo " <td valign='top' class='".$row_style[$c]." tr_link_void' nowrap='nowrap'>";
echo " <a href=\"javascript:void(0)\" onclick=\"send_cmd('".PROJECT_PATH."/app/click_to_call/click_to_call.php?src_cid_name=".urlencode($row['destination_number'])."&src_cid_number=".urlencode($row['destination_number'])."&dest_cid_name=".urlencode($_SESSION['user']['extension'][0]['outbound_caller_id_name'])."&dest_cid_number=".urlencode($_SESSION['user']['extension'][0]['outbound_caller_id_number'])."&src=".urlencode($_SESSION['user']['extension'][0]['user'])."&dest=".urlencode($row['destination_number'])."&rec=false&ringback=us-ring&auto_answer=true');\">\n";
if (is_numeric($row['destination_number'])) {
echo format_phone($row['destination_number'])."\n";
}
else {
echo " ".$row['destination_number']."\n";
}
echo " </a>\n";
echo " </td>\n";
//recording
if (permission_exists('recording_play') || permission_exists('recording_download')) {
if ($record_path != '' && file_exists($record_path.'/'.$record_name)) {
echo " <td valign='top' align='center' class='".$row_style[$c]." row_style_slim tr_link_void' nowrap='nowrap'>";
if (permission_exists('recording_play')) {
echo "<audio id='recording_audio_".$row['uuid']."' style='display: none;' preload='none' ontimeupdate=\"update_progress('".$row['uuid']."')\" onended=\"recording_reset('".$row['uuid']."');\" src=\"download.php?id=".$row['uuid']."&t=record\" type='".$record_type."'></audio>";
echo "<span id='recording_button_".$row['uuid']."' onclick=\"recording_play('".$row['uuid']."')\" title='".$text['label-play']." / ".$text['label-pause']."'>".$v_link_label_play."</span>";
}
else {
echo "don't have recording_play permission ";
}
if (permission_exists('recording_download')) {
echo "<a href=\"download.php?id=".$row['uuid']."&t=bin\" title='".$text['label-download']."'>".$v_link_label_download."</a>";
}
echo " </td>\n";
}
else {
echo " <td valign='top' align='center' class='".$row_style[$c]."'>&nbsp;</td>\n";
}
}
//dynamic cdr fields
if (is_array($_SESSION['cdr']['field'])) {
foreach ($_SESSION['cdr']['field'] as $field) {
$array = explode(",", $field);
$field_name = $array[count($array) - 1];
if ($field_name != "destination_number") {
echo " <td valign='top' class='".$row_style[$c]."' style='text-align: center;' nowrap='nowrap'>".$row[$field_name] ."</td>\n";
}
}
}
//start
echo " <td valign='top' class='".$row_style[$c]."' style='text-align: center;' nowrap='nowrap'>".$tmp_start_epoch."</td>\n";
//tta (time to answer)
echo " <td valign='top' class='".$row_style[$c]."' style='text-align: right;'>".(($row['tta'] > 0) ? $row['tta']."s" : "&nbsp;")."</td>\n";
//duration
echo " <td valign='top' class='".$row_style[$c]."' style='text-align: center;'>".gmdate("G:i:s", $seconds)."</td>\n";
//billing
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/billing/app_config.php")){
$database->table = "v_xml_cdr";
$accountcode = (strlen($row["accountcode"])?$row["accountcode"]:$_SESSION[domain_name]);
$database->sql = "SELECT currency FROM v_billings WHERE type_value='$accountcode'";
$database->result = $database->execute();
$billing_currency = (strlen($database->result[0]['currency'])?$database->result[0]['currency']:'USD');
$billing_currency = (strlen($database->result[0]['currency'])?$database->result[0]['currency']:
(strlen($_SESSION['billing']['currency']['text'])?$_SESSION['billing']['currency']['text']:'USD')
);
unset($database->sql);
unset($database->result);
$sell_price = strlen($row['call_sell'])?$row['call_sell']:0;
$lcr_direction = (strlen($row['direction'])?$row['direction']:"outbound");
$xml_string = trim($row["xml"]);
$json_string = trim($row["json"]);
if (strlen($xml_string) > 0) {
$format = "xml";
}
if (strlen($json_string) > 0) {
$format = "json";
}
try {
if ($format == 'json') {
$array = json_decode($json_string,true);
}
if ($format == 'xml') {
$array = json_decode(json_encode((array)simplexml_load_string($xml_string)),true);
}
}
catch(Exception $e) {
echo $e->getMessage();
}
$n = (($lcr_direction == "inbound")?
check_str(urldecode($array["caller_profile"]["caller_id_number"])):
check_str(urldecode($array["variables"]["lcr_query_digits"]))
);
$database->table = "v_lcr";
$database->sql = "SELECT currency FROM v_lcr WHERE v_lcr.carrier_uuid IS NULL AND v_lcr.enabled='true' AND v_lcr.lcr_direction='$lcr_direction' AND v_lcr.digits IN (".number_series($n).") ORDER BY digits DESC, rate ASC, date_start DESC LIMIT 1";
$database->result = $database->execute();
// print "<pre>"; print $database->sql . ":";print "[".$database->result[0]['currency']."]"; print_r($array); print "</pre>";
$lcr_currency = ((is_string($database->result[0]['currency']) && strlen($database->result[0]['currency']))?$database->result[0]['currency']:
(strlen($_SESSION['billing']['currency']['text'])?$_SESSION['billing']['currency']['text']:'USD')
); //billed currency
unset($database->sql);
unset($database->result);
if ($sell_price){
$price = currency_convert($sell_price, $billing_currency, $lcr_currency);
}
else {
$price = 0;
}
echo " <td valign='top' class='".$row_style[$c]."'>".number_format($price,6)." $billing_currency</td>\n";
unset ($sell_price, $price);
}
//pdd (post dial delay)
if (permission_exists("xml_cdr_pdd")) {
echo " <td valign='top' class='".$row_style[$c]."' style='text-align: right;'>".number_format($row['pdd_ms']/1000,2)."s</td>\n";
}
//mos (mean opinion score)
if (permission_exists("xml_cdr_mos")) {
if(strlen($row['rtp_audio_in_mos']) > 0){
$title = " title='".$text['label-mos_score-'.round($row['rtp_audio_in_mos'])]."'";
$value = $row['rtp_audio_in_mos'];
}
echo " <td valign='top' class='".$row_style[$c]."'$title style='text-align: center;'>$value</td>\n";
}
//hangup cause/call result
if (permission_exists('hangup_cause')) {
echo " <td valign='top' class='".$row_style[$c]."' nowrap='nowrap'><a ".$tr_link.">".$hangup_cause."</a></td>\n";
}
else {
echo " <td valign='top' class='".$row_style[$c]."' nowrap='nowrap'>".ucwords($call_result)."</td>\n";
}
//control icons
if (permission_exists('xml_cdr_details')) {
echo " <td class='list_control_icons tr_link_void' nowrap='nowrap'>";
if ($tr_link!=null) {
echo " <a $tr_link title='".$text['button-view']."'>$v_link_label_view</a>"; //CJB
}
// if (permission_exists('xml_cdr_delete')) {
// echo "<a href='xml_cdr_delete.php?archive_request=true&id[]=".$row['uuid']."&rec[]=".(($record_path != '') ? base64_encode($record_path.'/'.$record_name) : null)."' alt='".$text['button-delete']."' onclick=\"return confirm('".$text['confirm-delete']."')\">".$v_link_label_delete."</a>";
// }
echo " </td>\n";
}
echo "</tr>\n";
$c = ($c) ? 0 : 1;
} //end foreach
unset($sql, $result, $row_count);
} //end if results
echo "<tr>\n";
echo "</table>";
echo "</form>";
echo "<br><br>";
if ($result_count == $rows_per_page) {
echo $paging_controls;
}
echo "<br><br>";
// check or uncheck all checkboxes
if (sizeof($xml_ids) > 0) {
echo "<script>\n";
echo " function check(what) {\n";
foreach ($xml_ids as $xml_id) {
echo "document.getElementById('".$xml_id."').checked = (what == 'all') ? true : false;\n";
}
echo " }\n";
echo "</script>\n";
}
//store last search/sort query parameters in session
$_SESSION['xml_cdr']['last_query'] = $_SERVER["QUERY_STRING"];
//show the footer
require_once "resources/footer.php";
?>

View File

@ -40,6 +40,9 @@ else {
//additional includes
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
if ($_REQUEST['archive_request'] == 'true') {
$archive_request = 'true';
}
require_once "xml_cdr_inc.php";
//get the format
@ -286,4 +289,4 @@ else {
}
?>
?>

View File

@ -422,9 +422,25 @@
}
$sql= str_replace(" ", " ", $sql);
$sql= str_replace("where and", "where", $sql);
$prep_statement = $db->prepare(check_sql($sql));
$prep_statement->execute();
$result = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
//$prep_statement = $db->prepare(check_sql($sql));
//$prep_statement->execute();
//$result = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
$database = new database;
if ($archive_request == 'true') {
if ($_SESSION['cdr']['archive_database']['boolean'] == 'true') {
$database->driver = $_SESSION['cdr']['archive_database_driver']['text'];
$database->host = $_SESSION['cdr']['archive_database_host']['text'];
$database->type = $_SESSION['cdr']['archive_database_type']['text'];
$database->port = $_SESSION['cdr']['archive_database_port']['text'];
$database->db_name = $_SESSION['cdr']['archive_database_name']['text'];
$database->username = $_SESSION['cdr']['archive_database_username']['text'];
$database->password = $_SESSION['cdr']['archive_database_password']['text'];
}
}
$database->select($sql);
$result = $database->result;
$result_count = count($result);
unset($database);
$result_count = count($result);
unset ($prep_statement, $sql);