Portions created by the Initial Developer are Copyright (C) 2008-2019 the Initial Developer. All Rights Reserved. Contributor(s): Mark J Crane */ //includes require_once "root.php"; require_once "resources/require.php"; require_once "resources/check_auth.php"; //check permissions if (permission_exists('xml_cdr_view')) { //access granted } else { echo "access denied"; exit; } //additional includes require_once "resources/paging.php"; //set 24hr or 12hr clock define('TIME_24HR', 1); //get post or get variables from http if (count($_REQUEST) > 0) { $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_destination = $_REQUEST["caller_destination"]; $caller_extension_uuid = $_REQUEST["caller_extension_uuid"]; $destination_number = $_REQUEST["destination_number"]; $context = $_REQUEST["context"]; $start_stamp_begin = $_REQUEST["start_stamp_begin"]; $start_stamp_end = $_REQUEST["start_stamp_end"]; $answer_stamp_begin = $_REQUEST["answer_stamp_begin"]; $answer_stamp_end = $_REQUEST["answer_stamp_end"]; $end_stamp_begin = $_REQUEST["end_stamp_begin"]; $end_stamp_end = $_REQUEST["end_stamp_end"]; $start_epoch = $_REQUEST["start_epoch"]; $stop_epoch = $_REQUEST["stop_epoch"]; $duration = $_REQUEST["duration"]; $billsec = $_REQUEST["billsec"]; $hangup_cause = $_REQUEST["hangup_cause"]; $call_result = $_REQUEST["call_result"]; $xml_cdr_uuid = $_REQUEST["xml_cdr_uuid"]; $bleg_uuid = $_REQUEST["bleg_uuid"]; $accountcode = $_REQUEST["accountcode"]; $read_codec = $_REQUEST["read_codec"]; $write_codec = $_REQUEST["write_codec"]; $remote_media_ip = $_REQUEST["remote_media_ip"]; $network_addr = $_REQUEST["network_addr"]; $bridge_uuid = $_REQUEST["network_addr"]; $order_by = $_REQUEST["order_by"]; $order = $_REQUEST["order"]; if (is_array($_SESSION['cdr']['field'])) { foreach ($_SESSION['cdr']['field'] as $field) { $array = explode(",", $field); $field_name = end($array); if (isset($_REQUEST[$field_name])) { $$field_name = $_REQUEST[$field_name]; } } } if (strlen($_REQUEST["mos_comparison"]) > 0) { switch($_REQUEST["mos_comparison"]) { case 'less': $mos_comparison = "<"; break; case 'greater': $mos_comparison = ">"; break; case 'lessorequal': $mos_comparison = "<="; break; case 'greaterorequal': $mos_comparison = ">="; break; case 'equal': $mos_comparison = "<"; break; case 'notequal': $mos_comparison = "<>"; break; } } else { $mos_comparison = ''; } //$mos_comparison = $_REQUEST["mos_comparison"]; $mos_score = $_REQUEST["mos_score"]; $leg = $_REQUEST["leg"]; } //check to see if permission does not exist if(!permission_exists(xml_cdr_b_leg)){ $leg = 'a'; } //get variables used to control the order $order_by = $_REQUEST["order_by"]; $order = $_REQUEST["order"]; //validate the order switch ($order) { case 'asc': break; case 'desc': break; default: $order = ''; } //set the assigned extensions if (!permission_exists('xml_cdr_domain')) { foreach ($_SESSION['user']['extension'] as $row) { if (is_uuid($row['extension_uuid'])) { $extension_uuids[] = $row['extension_uuid']; } } } //set the param variable which is used with paging $param = "&cdr_id=".escape($cdr_id); $param .= "&missed=".escape($missed); $param .= "&direction=".escape($direction); $param .= "&caller_id_name=".escape($caller_id_name); $param .= "&caller_id_number=".escape($caller_id_number); $param .= "&caller_destination=".escape($caller_destination); $param .= "&caller_extension_uuid=".escape($caller_extension_uuid); $param .= "&destination_number=".escape($destination_number); $param .= "&context=".escape($context); $param .= "&start_stamp_begin=".escape($start_stamp_begin); $param .= "&start_stamp_end=".escape($start_stamp_end); $param .= "&answer_stamp_begin=".escape($answer_stamp_begin); $param .= "&answer_stamp_end=".escape($answer_stamp_end); $param .= "&end_stamp_begin=".escape($end_stamp_begin); $param .= "&end_stamp_end=".escape($end_stamp_end); $param .= "&start_epoch=".escape($start_epoch); $param .= "&stop_epoch=".escape($stop_epoch); $param .= "&duration=".escape($duration); $param .= "&billsec=".escape($billsec); $param .= "&hangup_cause=".escape($hangup_cause); $param .= "&call_result=".escape($call_result); $param .= "&xml_cdr_uuid=".escape($xml_cdr_uuid); $param .= "&bleg_uuid=".escape($bleg_uuid); $param .= "&accountcode=".escape($accountcode); $param .= "&read_codec=".escape($read_codec); $param .= "&write_codec=".escape($write_codec); $param .= "&remote_media_ip=".escape($remote_media_ip); $param .= "&network_addr=".escape($network_addr); $param .= "&bridge_uuid=".escape($bridge_uuid); $param .= "&mos_comparison=".escape($mos_comparison); $param .= "&mos_score=".escape($mos_score); if (is_array($_SESSION['cdr']['field'])) { foreach ($_SESSION['cdr']['field'] as $field) { $array = explode(",", $field); $field_name = end($array); if (isset($$field_name)) { $param .= "&".$field_name."=".escape($$field_name); } } } if ($_GET['show'] == 'all' && permission_exists('xml_cdr_all')) { $param .= "&show=all"; } if (isset($order_by)) { $param .= "&order_by=".escape($order_by)."&order=".escape($order); } //create the sql query to get the xml cdr records if (strlen($order_by) == 0) { $order_by = "start_epoch"; } if (strlen($order) == 0) { $order = "desc"; } //set a default number of rows to show $num_rows = '0'; //disable the paging if ($_REQUEST['export_format'] == "csv") { $rows_per_page = 0; } if ($_REQUEST['export_format'] == "pdf") { $rows_per_page = 0; } //count the records in the database /* if ($_SESSION['cdr']['limit']['numeric'] == 0) { $sql = "select count(xml_cdr_uuid) as num_rows from v_xml_cdr "; $sql .= "where domain_uuid = '".$domain_uuid."' ".$sql_where; $prep_statement = $db->prepare(check_sql($sql)); if ($prep_statement) { $prep_statement->execute(); $row = $prep_statement->fetch(PDO::FETCH_ASSOC); if ($row['num_rows'] > 0) { $num_rows = $row['num_rows']; } else { $num_rows = '0'; } } unset($prep_statement, $result); } */ //limit the number of results if ($_SESSION['cdr']['limit']['numeric'] > 0) { $num_rows = $_SESSION['cdr']['limit']['numeric']; } //set the default paging $rows_per_page = $_SESSION['domain']['paging']['numeric']; //prepare to page the results //$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50; //set on the page that includes this page if (is_numeric($_GET['page'])) { $page = $_GET['page']; } if (!isset($_GET['page'])) { $page = 0; $_GET['page'] = 0; } $offset = $rows_per_page * $page; //get the results from the db $sql = "select \n"; $sql .= "c.domain_uuid, \n"; $sql .= "e.extension, \n"; $sql .= "c.start_stamp, \n"; $sql .= "c.end_stamp, \n"; $sql .= "c.start_epoch, \n"; $sql .= "c.hangup_cause, \n"; $sql .= "c.duration, \n"; $sql .= "c.billmsec, \n"; $sql .= "c.record_path, \n"; $sql .= "c.record_name, \n"; $sql .= "c.xml_cdr_uuid, \n"; $sql .= "c.bridge_uuid, \n"; $sql .= "c.direction, \n"; $sql .= "c.billsec, \n"; $sql .= "c.caller_id_name, \n"; $sql .= "c.caller_id_number, \n"; $sql .= "c.caller_destination, \n"; $sql .= "c.source_number, \n"; $sql .= "c.destination_number, \n"; $sql .= "c.leg, \n"; $sql .= "(c.xml IS NOT NULL OR c.json IS NOT NULL) AS raw_data_exists, \n"; $sql .= "c.json, \n"; if (is_array($_SESSION['cdr']['field'])) { foreach ($_SESSION['cdr']['field'] as $field) { $array = explode(",", $field); $field_name = end($array); $sql .= $field_name.", \n"; } } if (is_array($_SESSION['cdr']['export'])) { foreach ($_SESSION['cdr']['export'] as $field) { $sql .= $field.", \n"; } } $sql .= "c.accountcode, \n"; $sql .= "c.answer_stamp, \n"; $sql .= "c.sip_hangup_disposition, \n"; if (permission_exists("xml_cdr_pdd")) { $sql .= "c.pdd_ms, \n"; } if (permission_exists("xml_cdr_mos")) { $sql .= "c.rtp_audio_in_mos, \n"; } $sql .= "(c.answer_epoch - c.start_epoch) as tta "; if ($_REQUEST['show'] == "all" && permission_exists('xml_cdr_all')) { $sql .= ", c.domain_name \n"; } $sql .= "from v_xml_cdr as c \n"; $sql .= "left join v_extensions as e on e.extension_uuid = c.extension_uuid \n"; $sql .= "inner join v_domains as d on d.domain_uuid = c.domain_uuid \n"; if ($_REQUEST['show'] == "all" && permission_exists('xml_cdr_all')) { $sql .= "where 1 = 1 "; } else { $sql .= "where c.domain_uuid = :domain_uuid \n"; $parameters['domain_uuid'] = $domain_uuid; } if (!permission_exists('xml_cdr_domain')) { //only show the user their calls $sql .= "and (c.extension_uuid = '".implode("' or c.extension_uuid = '", $extension_uuids)."') "; } if ($missed == true) { $sql .= "and missed_call = 1 \n"; } if (strlen($start_epoch) > 0 && strlen($stop_epoch) > 0) { $sql .= "and start_epoch BETWEEN :start_epoch AND :stop_epoch \n"; $parameters['start_epoch'] = $start_epoch; $parameters['stop_epoch'] = $stop_epoch; } if (strlen($cdr_id) > 0) { $sql .= "and cdr_id like :cdr_id \n"; $parameters['cdr_id'] = '%'.$cdr_id.'%'; } if (strlen($direction) > 0) { $sql .= "and direction = :direction \n"; $parameters['direction'] = $direction; } if (strlen($caller_id_name) > 0) { $mod_caller_id_name = str_replace("*", "%", $caller_id_name); $sql .= "and caller_id_name like :caller_id_name \n"; $parameters['caller_id_name'] = '%'.$mod_caller_id_name.'%'; } if (strlen($caller_id_number) > 0) { $mod_caller_id_number = preg_replace("#[^0-9./]#", "", $caller_id_number); if (strlen($mod_caller_id_number) == 0) { $mod_caller_id_number = trim($caller_id_number); } $sql .= "and caller_id_number like :caller_id_number \n"; $parameters['caller_id_number'] = '%'.$mod_caller_id_number.'%'; } if (strlen($caller_extension_uuid) > 0 && is_uuid($caller_extension_uuid)) { $sql .= "and e.extension_uuid = :extension_uuid \n"; $parameters['extension_uuid'] = $caller_extension_uuid; } if (strlen($caller_destination) > 0) { $mod_caller_destination = preg_replace("#[^0-9./]#", "", $caller_destination); if (strlen($mod_caller_destination) == 0) { $mod_caller_destination = trim($caller_destination); } $sql .= "and caller_destination like :caller_destination \n"; $parameters['caller_destination'] = '%'.$mod_caller_destination.'%'; } if (strlen($destination_number) > 0) { $mod_destination_number = preg_replace("#[^0-9./]#", "", $destination_number); if (strlen($mod_destination_number) == 0) { $mod_destination_number = trim($destination_number); } $sql .= "and destination_number like :destination_number \n"; $parameters['destination_number'] = '%'.$mod_destination_number.'%'; } if (strlen($context) > 0) { $sql .= "and context like :context \n"; $parameters['context'] = '%'.$context.'%'; } if (is_array($_SESSION['cdr']['field'])) { foreach ($_SESSION['cdr']['field'] as $field) { $array = explode(",", $field); $field_name = end($array); if (isset($$field_name)) { $$field_name = $_REQUEST[$field_name]; if (strlen($$field_name) > 0) { $sql .= "and $field_name like :".$field_name." \n"; $parameters[$field_name] = '%'.$$field_name.'%'; } } } } if (strlen($start_stamp_begin) > 0 && strlen($start_stamp_end) > 0) { $sql .= "and start_stamp BETWEEN :start_stamp_begin AND :start_stamp_end "; $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 start_stamp >= :start_stamp_begin "; $parameters['start_stamp_begin'] = $start_stamp_begin.':00.000'; } if (strlen($start_stamp_end) > 0) { $sql .= "and start_stamp <= :start_stamp_end "; $parameters['start_stamp_end'] = $start_stamp_end.':59.999'; } } if (strlen($answer_stamp_begin) > 0 && strlen($answer_stamp_end) > 0) { $sql .= "and 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 .= "and answer_stamp >= :answer_stamp_begin "; $parameters['answer_stamp_begin'] = $answer_stamp_begin.':00.000'; } if (strlen($answer_stamp_end) > 0) { $sql .= "and 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 .= "and 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 .= "and end_stamp >= :end_stamp_begin "; $parameters['end_stamp_begin'] = $end_stamp_begin.':00.000'; } if (strlen($end_stamp_end) > 0) { $sql .= "and end_stamp <= :end_stamp_end "; $parameters['end_stamp'] = $end_stamp_end.':59.999'; } } if (strlen($duration) > 0) { $sql .= "and duration like :duration "; $parameters['duration'] = '%'.$duration.'%'; } if (strlen($billsec) > 0) { $sql .= "and billsec like :billsec "; $parameters['billsec'] = '%'.$billsec.'%'; } if (strlen($hangup_cause) > 0) { $sql .= "and hangup_cause like :hangup_cause "; $parameters['hangup_cause'] = '%'.$hangup_cause.'%'; } if (strlen($call_result) > 0) { switch ($call_result) { case 'answered': $sql .= "and (answer_stamp is not null and bridge_uuid is not null) "; break; case 'voicemail': $sql .= "and (answer_stamp is not null and bridge_uuid is null) "; break; case 'missed': $sql .= "and missed_call = '1' "; break; case 'cancelled': if ($direction == 'inbound' || $direction == 'local' || $call_result == 'missed') { $sql = "and (answer_stamp is null and bridge_uuid is null and sip_hangup_disposition <> 'send_refuse') "; } else if ($direction == 'outbound') { $sql = "and (answer_stamp is null and bridge_uuid is not null) "; } else { $sql .= " and (( (direction = 'inbound' or direction = 'local') and answer_stamp is null and bridge_uuid is null and sip_hangup_disposition <> 'send_refuse' ) or ( direction = 'outbound' and answer_stamp is null and bridge_uuid is not null ))"; } break; default: //failed //$sql .= "and (answer_stamp is null and bridge_uuid is null and billsec = 0 and sip_hangup_disposition = 'send_refuse') "; } } if (strlen($xml_cdr_uuid) > 0) { $sql .= "and xml_cdr_uuid = :xml_cdr_uuid "; $parameters['xml_cdr_uuid'] = $xml_cdr_uuid; } if (strlen($bleg_uuid) > 0) { $sql .= "and bleg_uuid = :bleg_uuid "; $parameters['bleg_uuid'] = $bleg_uuid; } if (strlen($accountcode) > 0) { $sql .= "and accountcode = :accountcode "; $parameters['accountcode'] = $accountcode; } if (strlen($read_codec) > 0) { $sql .= "and read_codec like :read_codec "; $parameters['read_codec'] = '%'.$read_codec.'%'; } if (strlen($write_codec) > 0) { $sql .= "and write_codec like :write_codec "; $parameters['write_codec'] = '%'.$write_codec.'%'; } if (strlen($remote_media_ip) > 0) { $sql .= "and remote_media_ip like :remote_media_ip "; $parameters['remote_media_ip'] = $remote_media_ip; } if (strlen($network_addr) > 0) { $sql .= "and network_addr like :network_addr "; $parameters['network_addr'] = '%'.$network_addr.'%'; } //if (strlen($mos_comparison) > 0 && strlen($mos_score) > 0 ) { // $sql .= "and rtp_audio_in_mos = :mos_comparison :mos_score "; // $parameters['mos_comparison'] = $mos_comparison; // $parameters['mos_score'] = $mos_score; //} if (strlen($leg) > 0) { $sql .= "and leg = :leg "; $parameters['leg'] = $leg; } //end where if (strlen($order_by) > 0) { $sql .= " order by $order_by $order "; } if ($_REQUEST['export_format'] != "csv" && $_REQUEST['export_format'] != "pdf") { if ($rows_per_page == 0) { $sql .= " limit :limit offset 0 \n"; $parameters['limit'] = $_SESSION['cdr']['limit']['numeric']; } else { $sql .= " limit :limit offset :offset \n"; $parameters['limit'] = $rows_per_page; $parameters['offset'] = $offset; } } $sql = str_replace(" ", " ", $sql); //$sql= str_replace("where and", "where", $sql); $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']; } } $result = $database->select($sql, $parameters, 'all'); $result_count = count($result); unset($database, $sql); //return the paging list($paging_controls_mini, $rows_per_page, $offset) = paging($num_rows, $param, $rows_per_page, true, $result_count); //top list($paging_controls, $rows_per_page, $offset) = paging($num_rows, $param, $rows_per_page, false, $result_count); //bottom //set the row style $c = 0; $row_style["0"] = "row_style0"; $row_style["1"] = "row_style1"; ?>