Portions created by the Initial Developer are Copyright (C) 2008-2025 the Initial Developer. All Rights Reserved. Contributor(s): Mark J Crane */ //includes files require_once dirname(__DIR__, 2) . "/resources/require.php"; require_once "resources/paging.php"; //download the message if ( !empty($_REQUEST["action"]) && $_REQUEST["action"] == "download" && !empty($_REQUEST["id"]) && is_numeric($_REQUEST["id"]) && !empty($_REQUEST["uuid"]) && is_uuid($_REQUEST["uuid"]) && !empty($_REQUEST["voicemail_uuid"]) && is_uuid($_REQUEST["voicemail_uuid"]) ) { //set domain uuid and domain name from session, if defined if (!empty($_SESSION['domain_uuid']) && is_uuid($_SESSION['domain_uuid']) && !empty($_SESSION['domain_name'])) { $domain_uuid = $_SESSION['domain_uuid']; $domain_name = $_SESSION['domain_name']; } //session not available (due to direct vm download using emailed link, or otherwise), set domain uuid and name from database else { $sql = "select d.domain_uuid, d.domain_name "; $sql .= "from v_voicemail_messages as vm "; $sql .= "left join v_domains as d on vm.domain_uuid = d.domain_uuid "; $sql .= "where vm.voicemail_message_uuid = :voicemail_message_uuid "; $sql .= "and vm.voicemail_uuid = :voicemail_uuid "; $sql .= "and vm.domain_uuid = d.domain_uuid "; $parameters['voicemail_message_uuid'] = $_REQUEST["uuid"]; $parameters['voicemail_uuid'] = $_REQUEST["voicemail_uuid"]; $database = new database; $result = $database->select($sql, $parameters, 'row'); if ($result !== false) { $domain_uuid = $result['domain_uuid']; $domain_name = $result['domain_name']; } } //load settings $settings = new settings(['domain_uuid'=>$domain_uuid]); $voicemail = new voicemail(['settings'=>$settings]); $voicemail->domain_uuid = $domain_uuid; $voicemail->type = $_REQUEST['t'] ?? null; $voicemail->voicemail_id = $_REQUEST['id']; $voicemail->voicemail_uuid = $_REQUEST['voicemail_uuid']; $voicemail->voicemail_message_uuid = $_REQUEST['uuid']; if (isset($_REQUEST['intro'])) { if (!$voicemail->message_intro_download($domain_name)) { echo "unable to download voicemail intro"; } } else { if (!$voicemail->message_download($domain_name)) { echo "unable to download voicemail"; } } unset($voicemail); exit; } //include after download function require_once "resources/check_auth.php"; //check permissions if (permission_exists('voicemail_message_view')) { //access granted } else { echo "access denied"; exit; } //add the settings object $settings = new settings(["domain_uuid" => $_SESSION['domain_uuid'], "user_uuid" => $_SESSION['user_uuid']]); $transcribe_enabled = $settings->get('transcribe', 'enabled', false); $transcribe_engine = $settings->get('transcribe', 'engine', ''); //set the back button url $_SESSION['back'][$_SERVER['PHP_SELF']] = !empty($_GET['back']) ? urldecode($_GET['back']) : ($_SESSION['back'][$_SERVER['PHP_SELF']] ?? PROJECT_PATH.'/app/voicemails/voicemails.php'); //set the voicemail_uuid if (!empty($_REQUEST['id']) && is_uuid($_REQUEST['id'])) { $voicemail_uuid = $_REQUEST['id']; } else if (!empty($_REQUEST['id']) && is_numeric($_REQUEST['id'])) { $voicemail_id = $_REQUEST['id']; } //get the http post data if (!empty($_POST['voicemail_messages'])) { $action = $_POST['action']; $voicemail_messages = $_POST['voicemail_messages']; } //add multi-lingual support $language = new text; $text = $language->get(); //process the http post data by action if (!empty($action) && !empty($voicemail_messages)) { //set the referrer $http_referer = parse_url($_SERVER["HTTP_REFERER"]); $referer_path = $http_referer['path']; $referer_query = $http_referer['query']; //validate the token $token = new token; if (!$token->validate($_SERVER['PHP_SELF'])) { message::add($text['message-invalid_token'],'negative'); if ($referer_path == PROJECT_PATH."/app/voicemails/voicemail_messages.php") { header('Location: voicemail_messages.php?'.$referer_query); } else { header('Location: voicemails.php'); } exit; } //handle action switch ($action) { case 'mark_saved': //transcribe voicemail message $voicemail = new voicemail; $voicemail->domain_uuid = $_SESSION['domain_uuid']; $voicemail->voicemail_uuid = $voicemail_messages[0]['voicemail_uuid']; $voicemail->voicemail_message_uuid = $voicemail_messages[0]['uuid']; $voicemail->message_saved(); // no return, exit exit; case 'transcribe': if (permission_exists('voicemail_message_transcribe') && $transcribe_enabled && !empty($transcribe_engine) && is_array($voicemail_messages) && @sizeof($voicemail_messages) != 0) { $messages_transcribed = 0; foreach ($voicemail_messages as $voicemail_message) { if (!empty($voicemail_message['checked']) && $voicemail_message['checked'] == 'true' && is_uuid($voicemail_message['uuid']) && is_uuid($voicemail_message['voicemail_uuid'])) { //transcribe voicemail message $voicemail = new voicemail; $voicemail->domain_uuid = $_SESSION['domain_uuid']; $voicemail->voicemail_uuid = $voicemail_message['voicemail_uuid']; $voicemail->voicemail_message_uuid = $voicemail_message['uuid']; $result = $voicemail->message_transcribe(); unset($voicemail); //increment counter if ($result == true) { $messages_transcribed++; } } } //set message if ($messages_transcribed != 0) { message::add($text['message-audio_transcribed'].': '.$messages_transcribed); } } break; case 'toggle': if (is_array($voicemail_messages) && @sizeof($voicemail_messages) != 0) { $messages_toggled = 0; foreach ($voicemail_messages as $voicemail_message) { if (!empty($voicemail_message['checked']) && $voicemail_message['checked'] == 'true' && is_uuid($voicemail_message['uuid']) && is_uuid($voicemail_message['voicemail_uuid'])) { //toggle voicemail message $voicemail = new voicemail; $voicemail->domain_uuid = $_SESSION['domain_uuid']; $voicemail->voicemail_uuid = $voicemail_message['voicemail_uuid']; $voicemail->voicemail_message_uuid = $voicemail_message['uuid']; $voicemail->message_toggle(); unset($voicemail); //increment counter $messages_toggled++; } } //set message if ($messages_toggled != 0) { message::add($text['message-toggle'].': '.$messages_toggled); } } break; case 'resend': if (is_array($voicemail_messages) && @sizeof($voicemail_messages) != 0) { $messages_resent = 0; foreach ($voicemail_messages as $voicemail_message) { if (!empty($voicemail_message['checked']) && $voicemail_message['checked'] == 'true' && is_uuid($voicemail_message['uuid']) && is_uuid($voicemail_message['voicemail_uuid'])) { //resend (email) voicemail message $voicemail = new voicemail; $voicemail->domain_uuid = $_SESSION['domain_uuid']; $voicemail->voicemail_uuid = $voicemail_message['voicemail_uuid']; $voicemail->voicemail_message_uuid = $voicemail_message['uuid']; $voicemail->message_resend(); unset($voicemail); //increment counter $messages_resent++; } } //set message if ($messages_resent != 0) { message::add($text['message-emails_resent'].': '.$messages_resent); } } break; case 'delete': if (permission_exists('voicemail_message_delete')) { if (is_array($voicemail_messages) && @sizeof($voicemail_messages) != 0) { $messages_deleted = 0; foreach ($voicemail_messages as $voicemail_message) { if (!empty($voicemail_message['checked']) && $voicemail_message['checked'] == 'true' && is_uuid($voicemail_message['uuid']) && is_uuid($voicemail_message['voicemail_uuid'])) { //delete voicemail message $voicemail = new voicemail; $voicemail->domain_uuid = $_SESSION['domain_uuid']; $voicemail->voicemail_uuid = $voicemail_message['voicemail_uuid']; $voicemail->voicemail_message_uuid = $voicemail_message['uuid']; $voicemail->message_delete(); unset($voicemail); //increment counter $messages_deleted++; } } //set message if ($messages_deleted != 0) { message::add($text['message-delete'].': '.$messages_deleted); } } } break; } //redirect the user if ($referer_path == PROJECT_PATH."/app/voicemails/voicemail_messages.php") { header('Location: voicemail_messages.php?'.$referer_query); } else { header('Location: voicemails.php'); } exit; } //get the html values and set them as variables $order_by = $_GET["order_by"] ?? ''; $order = $_GET["order"] ?? ''; //prepare to page the results $vm = new voicemail; $vm->domain_uuid = $_SESSION['domain_uuid']; if (!empty($voicemail_uuid) && is_uuid($voicemail_uuid)) { $vm->voicemail_uuid = $voicemail_uuid; } else if (!empty($voicemail_id) && is_numeric($voicemail_id)) { $vm->voicemail_id = $voicemail_id; } $voicemails = $vm->messages(); $num_rows = 0; if (!empty($voicemails) && is_array($voicemails)) { foreach ($voicemails as $voicemail) { if (!empty($voicemail['messages']) && is_array($voicemail['messages'])) { $num_rows += @sizeof($voicemail['messages']); } } } $total_rows = $num_rows; //prepare to page the results $rows_per_page = $_SESSION['domain']['paging']['numeric'] != '' ? $_SESSION['domain']['paging']['numeric'] : 50; $page = empty($_GET['page']) ? 0 : $_GET['page']; $param = 'id='.urlencode($_REQUEST['id']).'&back='.$_SESSION['back'][$_SERVER['PHP_SELF']]; list($paging_controls, $rows_per_page) = paging($num_rows, $param, $rows_per_page); list($paging_controls_mini, $rows_per_page) = paging($num_rows, $param, $rows_per_page, true); $offset = $rows_per_page * $page; unset($num_rows); //get the voicemail $vm->order_by = $order_by; $vm->order = $order; $vm->offset = $offset; //count messages and detect if any transcriptions available $new_messages = $num_rows = 0; $transcriptions_exists = false; if (!empty($voicemails) && is_array($voicemails)) { foreach ($voicemails as $voicemail) { if (!empty($voicemail['messages']) && is_array($voicemail['messages'])) { $num_rows += sizeof($voicemail['messages']); foreach ($voicemail['messages'] as $message) { if ($message['message_status'] != 'saved') { $new_messages++; } if ($transcribe_enabled && !empty($transcribe_engine) && !empty($message['message_transcription'])) { $transcriptions_exists = true; } } } } } //create token $object = new token; $token = $object->create($_SERVER['PHP_SELF']); //additional includes $document['title'] = $text['title-voicemail_messages']; require_once "resources/header.php"; //show the content echo "
\n"; echo "
".$text['title-voicemail_messages']."
".number_format($total_rows)."
\n"; echo "
\n"; echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','link'=>$_SESSION['back'][$_SERVER['PHP_SELF']]]); $margin_left = false; if (permission_exists('voicemail_message_transcribe') && $transcribe_enabled && !empty($transcribe_engine) && $num_rows) { echo button::create(['type'=>'button','label'=>$text['button-transcribe'],'icon'=>'quote-right','id'=>'btn_transcribe','name'=>'btn_transcribe','collapse'=>'hide-xs','style'=>'display: none; margin-left: 15px;','onclick'=>"list_action_set('transcribe'); list_form_submit('form_list');"]); $margin_left = true; } if ($num_rows) { echo button::create(['type'=>'button','label'=>$text['button-resend'],'icon'=>$_SESSION['theme']['button_icon_email'],'id'=>'btn_resend','name'=>'btn_resend','collapse'=>'hide-xs','style'=>'display: none;'.(!$margin_left ? 'margin-left: 15px;' : null),'onclick'=>"modal_open('modal-resend','btn_resend');"]); $margin_left = true; echo button::create(['type'=>'button','label'=>$text['button-toggle'],'icon'=>$_SESSION['theme']['button_icon_toggle'],'id'=>'btn_toggle','name'=>'btn_toggle','collapse'=>'hide-xs','style'=>'display: none;'.(!$margin_left ? 'margin-left: 15px;' : null),'onclick'=>"modal_open('modal-toggle','btn_toggle');"]); $margin_left = true; } if (permission_exists('voicemail_message_delete') && $num_rows) { echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'id'=>'btn_delete','name'=>'btn_delete','collapse'=>'hide-xs','style'=>'display: none;'.(!$margin_left ? 'margin-left: 15px;' : null),'onclick'=>"modal_open('modal-delete','btn_delete');"]); } if (!empty($paging_controls_mini)) { echo "".$paging_controls_mini."\n"; } echo "
\n"; echo "
\n"; echo "
\n"; if ($num_rows) { echo modal::create([ 'id'=>'modal-resend', 'title'=>$text['modal_title-resend'], 'message'=>$text['modal_message-resend'], 'actions'=> button::create(['type'=>'button','label'=>$text['button-cancel'],'icon'=>$_SESSION['theme']['button_icon_cancel'],'collapse'=>'hide-xs','onclick'=>'modal_close();']). button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','collapse'=>'never','style'=>'float: right;','onclick'=>"modal_close(); list_action_set('resend'); list_form_submit('form_list');"]) ]); echo modal::create(['id'=>'modal-toggle','type'=>'toggle','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_toggle','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('toggle'); list_form_submit('form_list');"])]); } if (permission_exists('voicemail_message_delete') && $num_rows) { echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('delete'); list_form_submit('form_list');"])]); } echo $text['description-voicemail_message']."\n"; echo "

\n"; //loop through the voicemail messages if (is_array($voicemails) && @sizeof($voicemails) != 0) { echo "
\n"; echo "\n"; echo "
\n"; echo "\n"; echo "\n"; // dummy row to adjust the alternating background color $x = 0; $previous_voicemail_id = ''; foreach ($voicemails as $field) { if ($previous_voicemail_id != $field['voicemail_id']) { if ($previous_voicemail_id != '') { echo "\n"; } echo "\n"; echo " \n"; echo "\n"; echo "\n"; $col_count = 0; if (permission_exists('voicemail_message_delete')) { echo " \n"; $col_count++; } echo th_order_by('created_epoch', $text['label-received'], $order_by, $order, null, "class='pct-30'"); $col_count++; echo th_order_by('caller_id_name', $text['label-caller_id_name'], $order_by, $order, null, "class='pct-20'"); $col_count++; echo th_order_by('caller_id_number', $text['label-caller_id_number'], $order_by, $order, null, "class='hide-xs pct-15'"); $col_count++; echo "\n"; $col_count++; echo th_order_by('message_length', $text['label-message_length'], $order_by, $order, null, "class='hide-xs right pct-15'"); $col_count++; if (empty($_SESSION['voicemail']['storage_type']['text']) || $_SESSION['voicemail']['storage_type']['text'] != 'base64') { echo "\n"; $col_count++; } echo "\n"; } if (is_array($field['messages']) && @sizeof($field['messages']) > 0) { foreach ($field['messages'] as $row) { //set voicemail messages as bold if unread and normal font weight if read $bold = (empty($row['message_status'])) ? 'font-weight: bold;' : null; //set the list row url as a variable $list_row_url = "javascript:recording_play('".escape($row['voicemail_message_uuid'])."','".$row['voicemail_id'].'|'.$row['voicemail_uuid']."','message');"; //playback progress bar echo "\n"; echo "\n"; // dummy row to maintain alternating background color echo "\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; if (empty($_SESSION['voicemail']['storage_type']['text']) || $_SESSION['voicemail']['storage_type']['text'] != 'base64') { echo " \n"; } echo "\n"; if (!empty($row['message_transcription']) || ($transcribe_enabled && !empty($transcribe_engine) && $transcriptions_exists === true)) { echo "\n"; // dummy row to maintain same background color for transcription row echo "\n"; echo " \n"; echo "\n"; } $x++; } unset($row); } else { echo ""; } $previous_voicemail_id = $field['voicemail_id']; } echo "
\n"; echo " 0 ?: "style='visibility: hidden;'").">\n"; echo " ".$text['label-tools']."".$text['label-message_size']."
\n"; echo " \n"; echo " \n"; echo " \n"; echo " ".escape($row['created_date_formatted'])." ".escape($row['created_time_formatted'])."".escape($row['caller_id_name'])." ".escape($row['caller_id_number'])." ".escape($row['message_length_label'])."".escape($row['file_size_label'])."
".$text['message-messages_not_found']."
\n"; echo "
\n"; echo "
\n"; echo "
".$paging_controls."
\n"; echo "\n"; echo "
\n"; } else { echo "
".$text['message-messages_not_found']."

"; } echo "
"; //autoplay message if (!empty($_REQUEST["action"]) && $_REQUEST["action"] == "autoplay" && !empty($_REQUEST["uuid"]) && is_uuid($_REQUEST["uuid"])) { echo ""; } //unbold new message rows when clicked/played/downloaded echo "\n"; //if viewing transcription, mark message as read/saved if ($transcriptions_exists) { echo "\n"; } //include the footer require_once "resources/footer.php"; ?>