From bf6a8dd2b0d141749046d15573825bd8181c8a29 Mon Sep 17 00:00:00 2001 From: Nate Jones Date: Sat, 6 Dec 2014 10:30:44 +0000 Subject: [PATCH] CDR: Added ability to export records in PDF format. --- app/xml_cdr/app_languages.php | 30 +++- app/xml_cdr/xml_cdr.php | 51 ++++-- app/xml_cdr/xml_cdr_csv.php | 84 ---------- app/xml_cdr/xml_cdr_export.php | 281 +++++++++++++++++++++++++++++++++ 4 files changed, 341 insertions(+), 105 deletions(-) delete mode 100644 app/xml_cdr/xml_cdr_csv.php create mode 100644 app/xml_cdr/xml_cdr_export.php diff --git a/app/xml_cdr/app_languages.php b/app/xml_cdr/app_languages.php index 7388ba47f1..e712d29164 100644 --- a/app/xml_cdr/app_languages.php +++ b/app/xml_cdr/app_languages.php @@ -155,6 +155,21 @@ $text['label-to']['pt-pt'] = "Final"; $text['label-to']['fr-fr'] = "Fin"; + $text['label-total']['en-us'] = "Total"; + $text['label-total']['es-cl'] = "Total"; + $text['label-total']['pt-pt'] = "Total"; + $text['label-total']['fr-fr'] = "Total"; + + $text['label-average']['en-us'] = "Average"; + $text['label-average']['es-cl'] = "Promedio"; + $text['label-average']['pt-pt'] = "Média"; + $text['label-average']['fr-fr'] = "Moyenne"; + + $text['button-export']['en-us'] = 'Export'; + $text['button-export']['es-cl'] = 'Exportación'; + $text['button-export']['pt-pt'] = 'Exportação'; + $text['button-export']['fr-fr'] = 'Exportation'; + $text['button-statistics']['en-us'] = "Statistics"; $text['button-statistics']['es-cl'] = "Estadísticas"; $text['button-statistics']['pt-pt'] = "Estatísticas"; @@ -185,6 +200,11 @@ $text['button-advanced_search']['pt-pt'] = "Pesquisa Avançada"; $text['button-advanced_search']['fr-fr'] = "Recherche Avancée"; + $text['message-preparing_download']['en-us'] = 'Preparing file for download, please wait...'; + $text['message-preparing_download']['es-cl'] = 'Archivo de Preparación para la descarga, por favor espere ...'; + $text['message-preparing_download']['pt-pt'] = 'Preparando arquivos para download, por favor aguarde ...'; + $text['message-preparing_download']['fr-fr'] = 'Préparation fichier à télécharger, se il vous plaît patienter ...'; + //xml_cdr_details $text['title2']['en-us'] = "Call Details"; $text['title2']['es-cl'] = "Detalles dw Llamadas"; @@ -261,10 +281,12 @@ $text['label-application-log']['fr-fr'] = "Log de l'Application"; $text['label-a-leg']['en-us'] = "A-leg"; + $text['label-a-leg']['es-cl'] = "A-leg"; $text['label-a-leg']['pt-pt'] = "A-leg"; $text['label-a-leg']['fr-fr'] = "A-leg"; $text['label-b-leg']['en-us'] = "B-leg"; + $text['label-b-leg']['es-cl'] = "B-leg"; $text['label-b-leg']['pt-pt'] = "B-leg"; $text['label-b-leg']['fr-fr'] = "B-leg"; @@ -309,10 +331,10 @@ $text['label-caller_id_number']['pt-pt'] = "Número CID"; $text['label-caller_id_number']['fr-fr'] = "Numéro de l'Appelant"; - $text['label-destination']['en-us'] = "Destination Number"; - $text['label-destination']['es-cl'] = "Número de destino"; - $text['label-destination']['pt-pt'] = "Número Destino"; - $text['label-destination']['fr-fr'] = "Numéro de Destinations"; + $text['label-destination']['en-us'] = "Destination"; + $text['label-destination']['es-cl'] = "Destino"; + $text['label-destination']['pt-pt'] = "Destino"; + $text['label-destination']['fr-fr'] = "Destination"; $text['label-context']['en-us'] = "Context"; $text['label-context']['es-cl'] = "Contexto"; diff --git a/app/xml_cdr/xml_cdr.php b/app/xml_cdr/xml_cdr.php index ab8e3b7090..afa0549f34 100644 --- a/app/xml_cdr/xml_cdr.php +++ b/app/xml_cdr/xml_cdr.php @@ -27,7 +27,7 @@ require_once "root.php"; require_once "resources/require.php"; require_once "resources/check_auth.php"; -require_once "app_languages.php"; + if (permission_exists('xml_cdr_view')) { //access granted } @@ -37,6 +37,7 @@ else { } //add multi-lingual support + require_once "app_languages.php"; foreach($text as $key => $value) { $text[$key] = $value[$_SESSION['domain']['language']['code']]; } @@ -81,22 +82,22 @@ else { echo " }"; echo ""; +//javascript to toggle export select box + echo ""; + //page title and description echo "\n"; echo "\n"; echo "\n"; echo "\n"; - echo "
".$text['title']."


\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo ""; - echo "\n"; + echo "
\n"; - if (permission_exists('xml_cdr_search_advanced')) { - echo " \n"; - } - echo " \n"; - echo " \n"; - echo "
\n"; + echo " "; echo " \n"; echo " \n"; echo " \n"; @@ -106,6 +107,7 @@ else { echo " \n"; echo " \n"; echo " \n"; + echo " \n"; echo " \n"; echo " \n"; echo " \n"; @@ -119,11 +121,26 @@ else { echo " \n"; echo " \n"; echo " \n"; - echo " \n"; - echo "
\n"; + echo " \n"; + echo " "; + echo " \n"; + echo " \n"; + echo "
\n"; + if (permission_exists('xml_cdr_search_advanced')) { + echo " \n"; + } + echo " \n"; + echo " \n"; + echo " \n"; + echo " "; + echo " \n"; + echo "
\n"; echo " \n"; - echo "
\n"; echo "\n"; echo "\n"; @@ -377,7 +394,7 @@ else { $hangup_cause = ucwords($hangup_cause); //If they cancelled, show the ring time, not the bill time. - $seconds = ($row['hangup_cause']=="ORIGINATOR_CANCEL") ? $row['duration'] : $row['billsec']; + $seconds = ($row['hangup_cause']=="ORIGINATOR_CANCEL") ? $row['duration'] : round(($row['billmsec'] / 1000), 0, PHP_ROUND_HALF_UP); $tmp_dir = $_SESSION['switch']['recordings']['dir'].'/'.$path_mod.'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day; $tmp_name = ''; diff --git a/app/xml_cdr/xml_cdr_csv.php b/app/xml_cdr/xml_cdr_csv.php deleted file mode 100644 index 71263a13aa..0000000000 --- a/app/xml_cdr/xml_cdr_csv.php +++ /dev/null @@ -1,84 +0,0 @@ - - Portions created by the Initial Developer are Copyright (C) 2008-2014 - the Initial Developer. All Rights Reserved. - - Contributor(s): - Mark J Crane -*/ -include "root.php"; -require_once "resources/require.php"; -require_once "resources/check_auth.php"; -if (permission_exists('xml_cdr_view')) { - //access granted -} -else { - echo "access denied"; - exit; -} - -//additional includes - $rows_per_page = 0; - require_once "xml_cdr_inc.php"; - -//set the http headers - header('Content-type: application/octet-binary'); - header('Content-Disposition: attachment; filename=cdr.csv'); - -//set the csv headers - $z = 0; - foreach($result[0] as $key => $val) { - if ($key != "xml" && $key != "json") { - if ($z == 0) { - echo '"'.$key.'"'; - } - else { - echo ',"'.$key.'"'; - } - } - $z++; - } - echo "\n"; - -//show the csv data - $x=0; - while(true) { - $z = 0; - foreach($result[0] as $key => $val) { - if ($key != "xml" && $key != "json") { - if ($z == 0) { - echo '"'.$result[$x][$key].'"'; - } - else { - echo ',"'.$result[$x][$key].'"'; - } - } - $z++; - } - echo "\n"; - ++$x; - if ($x > ($result_count-1)) { - break; - } - //$row++; - } - - -?> \ No newline at end of file diff --git a/app/xml_cdr/xml_cdr_export.php b/app/xml_cdr/xml_cdr_export.php new file mode 100644 index 0000000000..2b854345cd --- /dev/null +++ b/app/xml_cdr/xml_cdr_export.php @@ -0,0 +1,281 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2014 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "resources/require.php"; +require_once "resources/check_auth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//add multi-lingual support + require_once "app_languages.php"; + foreach($text as $key => $value) { + $text[$key] = $value[$_SESSION['domain']['language']['code']]; + } + +//additional includes + $rows_per_page = 0; + require_once "xml_cdr_inc.php"; + +$export_format = check_str($_REQUEST['export_format']); + +if ($export_format == 'csv') { + + //define file name + $csv_filename = "cdr_".$_SESSION['domain_name']."_".date("Ymd_His").".csv"; + + //set the http headers + header('Content-type: application/octet-binary'); + header('Content-Disposition: attachment; filename='.$csv_filename); + + //set the csv headers + $z = 0; + foreach($result[0] as $key => $val) { + if ($key != "xml" && $key != "json") { + if ($z == 0) { + echo '"'.$key.'"'; + } + else { + echo ',"'.$key.'"'; + } + } + $z++; + } + echo "\n"; + + //show the csv data + $x=0; + while(true) { + $z = 0; + foreach($result[0] as $key => $val) { + if ($key != "xml" && $key != "json") { + if ($z == 0) { + echo '"'.$result[$x][$key].'"'; + } + else { + echo ',"'.$result[$x][$key].'"'; + } + } + $z++; + } + echo "\n"; + ++$x; + if ($x > ($result_count-1)) { + break; + } + //$row++; + } + +} +else if ($export_format == 'pdf') { + + //load pdf libraries + require_once("resources/tcpdf/tcpdf.php"); + require_once("resources/fpdi/fpdi.php"); + + //determine page size + switch ($_SESSION['fax']['page_size']['text']) { + case 'a4' : + $page_width = 11.7; //in + $page_height = 8.3; //in + break; + case 'legal' : + $page_width = 14; //in + $page_height = 8.5; //in + break; + case 'letter' : + default : + $page_width = 11; //in + $page_height = 8.5; //in + } + + // initialize pdf + $pdf = new FPDI('L', 'in'); + $pdf -> SetAutoPageBreak(false); + $pdf -> setPrintHeader(false); + $pdf -> setPrintFooter(false); + $pdf -> SetMargins(0.5, 0.5, 0.5, true); + + //set default font + $pdf -> SetFont('helvetica', '', 7); + //add new page + $pdf -> AddPage('L', array($page_width, $page_height)); + + $chunk = 0; + + //write the table column headers + $data_start = ''; + $data_end = '
'; + + $data_head = ''; + $data_head .= ''.$text['label-direction'].''; + $data_head .= ''.$text['label-cid-name'].''; + $data_head .= ''.$text['label-cid-number'].''; + $data_head .= ''.$text['label-destination'].''; + $data_head .= ''.$text['label-start'].''; + $data_head .= ''.$text['label-tta'].''; + $data_head .= ''.$text['label-duration'].''; + $data_head .= ''.$text['label-billsec'].''; + $data_head .= ''."PDD".''; + $data_head .= ''."MOS".''; + $data_head .= ''; + $data_head .= ''.$text['label-hangup_cause'].''; + $data_head .= ''; + $data_head .= '
'; + + //initialize total variables + $total['duration'] = 0; + $total['billmsec'] = 0; + $total['pdd_ms'] = 0; + $total['rtp_audio_in_mos'] = 0; + $total['tta'] = 0; + + //write the row cells + $z = 0; // total counter + $p = 0; // per page counter + if (sizeof($result) > 0) { + foreach($result as $cdr_num => $fields) { + $data_body[$p] .= ''; + $data_body[$p] .= ''.$text['label-'.$fields['direction']].''; + $data_body[$p] .= ''.$fields['caller_id_name'].''; + $data_body[$p] .= ''.$fields['caller_id_number'].''; + $data_body[$p] .= ''.format_phone($fields['destination_number']).''; + $data_body[$p] .= ''.$fields['start_stamp'].''; + $total['tta'] += ($fields['tta'] > 0) ? $fields['tta'] : 0; + $data_body[$p] .= ''.(($fields['tta'] > 0) ? $fields['tta'].'s' : null).''; + $seconds = ($fields['hangup_cause'] == "ORIGINATOR_CANCEL") ? $fields['duration'] : round(($fields['billmsec'] / 1000), 0, PHP_ROUND_HALF_UP); + $total['duration'] += $seconds; + $data_body[$p] .= ''.gmdate("G:i:s", $seconds).''; + $total['billmsec'] += $fields['billmsec']; + $data_body[$p] .= ''.number_format(round($fields['billmsec'] / 1000, 2), 2).'s'; + $data_body[$p] .= ''; + if (permission_exists("xml_cdr_pdd")) { + $total['pdd_ms'] += $fields['pdd_ms']; + $data_body[$p] .= number_format(round($fields['pdd_ms'] / 1000, 2), 2).'s'; + } + $data_body[$p] .= ''; + $data_body[$p] .= ''; + if (permission_exists("xml_cdr_mos")) { + $total['rtp_audio_in_mos'] += $fields['rtp_audio_in_mos']; + $data_body[$p] .= (strlen($total['rtp_audio_in_mos']) > 0) ? $fields['rtp_audio_in_mos'] : null; + } + $data_body[$p] .= ''; + $data_body[$p] .= ''; + $data_body[$p] .= ''.ucwords(strtolower(str_replace("_", " ", $fields['hangup_cause']))).''; + $data_body[$p] .= ''; + + $z++; + $p++; + + if ($p == 60) { + //output data + $data_body_chunk = $data_start.$data_head; + foreach ($data_body as $data_body_row) { + $data_body_chunk .= $data_body_row; + } + $data_body_chunk .= $data_end; + $pdf -> writeHTML($data_body_chunk, true, false, false, false, ''); + unset($data_body_chunk); + unset($data_body); + $p = 0; + + //add new page + $pdf -> AddPage('L', array($page_width, $page_height)); + } + + } + + } + + //write divider + $data_footer = ''; + + //write totals + $data_footer .= ''; + $data_footer .= ''.$text['label-total'].''; + $data_footer .= ''.$z.''; + $data_footer .= ''; + $data_footer .= ''.number_format(round($total['tta'], 1), 0).'s'; + $data_footer .= ''.gmdate("G:i:s", $total['duration']).''; + $data_footer .= ''.gmdate("G:i:s", round($total['billmsec'] / 1000, 0)).''; + $data_footer .= ''.number_format(round(($total['pdd_ms'] / 1000), 2), 2).'s'; + $data_footer .= ''; + $data_footer .= ''; + + //write divider + $data_footer .= '
'; + + //write averages + $data_footer .= ''; + $data_footer .= ''.$text['label-average'].''; + $data_footer .= ''; + $data_footer .= ''.round(($total['tta'] / $z), 1).''; + $data_footer .= ''.gmdate("G:i:s", ($total['duration'] / $z)).''; + $data_footer .= ''.gmdate("G:i:s", round($total['billmsec'] / $z / 1000, 0)).''; + $data_footer .= ''.number_format(round(($total['pdd_ms'] / $z / 1000), 2), 2).'s'; + $data_footer .= ''.round(($total['rtp_audio_in_mos'] / $z), 2).''; + $data_footer .= ''; + $data_footer .= ''; + + //write divider + $data_footer .= '
'; + + //add last page + if ($p >= 55) { + $pdf -> AddPage('L', array($page_width, $page_height)); + } + //output remaining data + $data_body_chunk = $data_start.$data_head; + foreach ($data_body as $data_body_row) { + $data_body_chunk .= $data_body_row; + } + $data_body_chunk .= $data_footer.$data_end; + $pdf -> writeHTML($data_body_chunk, true, false, false, false, ''); + unset($data_body_chunk); + + //define file name + $pdf_filename = "cdr_".$_SESSION['domain_name']."_".date("Ymd_His").".pdf"; + + header("Content-Type: application/force-download"); + header("Content-Type: application/octet-stream"); + header("Content-Type: application/download"); + header("Content-Description: File Transfer"); + header('Content-Disposition: attachment; filename="'.$pdf_filename.'"'); + header("Content-Type: application/pdf"); + header('Accept-Ranges: bytes'); + header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // date in the past + + // push pdf download + $pdf -> Output($pdf_filename, 'D'); // Display [I]nline, Save to [F]ile, [D]ownload + +} + +?> \ No newline at end of file