Portions created by the Initial Developer are Copyright (C) 2008-2022 the Initial Developer. All Rights Reserved. Contributor(s): Mark J Crane Luis Daniel Lucio Quiroz */ //includes require_once "root.php"; require_once "resources/require.php"; require_once "resources/check_auth.php"; //check permissions if (permission_exists('follow_me') || permission_exists('call_forward') || permission_exists('do_not_disturb')) { //access granted } else { echo "access denied"; exit; } //add multi-lingual support $language = new text; $text = $language->get(); //define the destination_select function function destination_select($select_name, $select_value, $select_default) { if (strlen($select_value) == 0) { $select_value = $select_default; } echo " \n"; } //get the extension_uuid $extension_uuid = $_REQUEST["id"]; //get the extension number $sql = "select * from v_extensions "; $sql .= "where domain_uuid = :domain_uuid "; $sql .= "and extension_uuid = :extension_uuid "; if (!permission_exists('extension_edit')) { if (count($_SESSION['user']['extension']) > 0) { $sql .= "and ("; $x = 0; foreach($_SESSION['user']['extension'] as $index => $row) { if ($x > 0) { $sql .= "or "; } $sql .= "extension = :extension_".$index." "; $parameters['extension_'.$index] = $row['user']; $x++; } $sql .= ")"; } else { //hide any results when a user has not been assigned an extension $sql .= "and extension = 'disabled' "; } } $parameters['domain_uuid'] = $_SESSION['domain_uuid']; $parameters['extension_uuid'] = $extension_uuid; $database = new database; $row = $database->select($sql, $parameters, 'row'); if (is_array($row) && sizeof($row) != 0) { $extension = $row["extension"]; $number_alias = $row["number_alias"]; $accountcode = $row["accountcode"]; $effective_caller_id_name = $row["effective_caller_id_name"]; $effective_caller_id_number = $row["effective_caller_id_number"]; $outbound_caller_id_name = $row["outbound_caller_id_name"]; $outbound_caller_id_number = $row["outbound_caller_id_number"]; $do_not_disturb = $row["do_not_disturb"] != '' ? $row["do_not_disturb"] : 'false'; $forward_all_destination = $row["forward_all_destination"]; $forward_all_enabled = $row["forward_all_enabled"]; $forward_busy_destination = $row["forward_busy_destination"]; $forward_busy_enabled = $row["forward_busy_enabled"]; $forward_no_answer_destination = $row["forward_no_answer_destination"]; $forward_no_answer_enabled = $row["forward_no_answer_enabled"]; $forward_user_not_registered_destination = $row["forward_user_not_registered_destination"]; $forward_user_not_registered_enabled = $row["forward_user_not_registered_enabled"]; $follow_me_uuid = $row["follow_me_uuid"]; } else { echo "access denied"; exit; } unset($sql, $parameters, $row); //process post vars if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) { //get http post variables and set them to php variables if (count($_POST) > 0) { $forward_all_enabled = $_POST["forward_all_enabled"]; $forward_all_destination = $_POST["forward_all_destination"]; $forward_busy_enabled = $_POST["forward_busy_enabled"]; $forward_busy_destination = $_POST["forward_busy_destination"]; $forward_no_answer_enabled = $_POST["forward_no_answer_enabled"]; $forward_no_answer_destination = $_POST["forward_no_answer_destination"]; $forward_user_not_registered_enabled = $_POST["forward_user_not_registered_enabled"]; $forward_user_not_registered_destination = $_POST["forward_user_not_registered_destination"]; $cid_name_prefix = $_POST["cid_name_prefix"]; $cid_number_prefix = $_POST["cid_number_prefix"]; $follow_me_enabled = $_POST["follow_me_enabled"]; $follow_me_ignore_busy = $_POST["follow_me_ignore_busy"]; $n = 0; $destination_found = false; foreach ($_POST["destinations"] as $field) { $destinations[$n]['uuid'] = $field['uuid']; $destinations[$n]['destination'] = $field['destination']; $destinations[$n]['delay'] = $field['delay']; $destinations[$n]['prompt'] = $field['prompt']; $destinations[$n]['timeout'] = $field['timeout']; if ($field['destination'] != '') { $destination_found = true; } $n++; } $dnd_enabled = $_POST["dnd_enabled"]; } //validate the token $token = new token; if (!$token->validate($_SERVER['PHP_SELF'])) { message::add($text['message-invalid_token'],'negative'); header('Location: call_forward.php'); exit; } //check for all required data if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { $document['title'] = $text['title-call_routing']; require_once "resources/header.php"; require_once "resources/persist_form_var.php"; echo "
\n"; echo "
\n"; echo $msg."
"; echo "
\n"; persistformvar($_POST); echo "
\n"; require_once "resources/footer.php"; return; } //include the classes include "resources/classes/call_forward.php"; include "resources/classes/follow_me.php"; include "resources/classes/do_not_disturb.php"; //call forward config if (permission_exists('call_forward')) { //sanitize the destinations $forward_all_destination = preg_replace('#[^\*0-9]#', '', $forward_all_destination); $forward_busy_destination = preg_replace('#[^\*0-9]#', '', $forward_busy_destination); $forward_no_answer_destination = preg_replace('#[^\*0-9]#', '', $forward_no_answer_destination); $forward_user_not_registered_destination = preg_replace('#[^\*0-9]#', '', $forward_user_not_registered_destination); //build the array $array['extensions'][0]['domain_uuid'] = $_SESSION['domain_uuid']; $array['extensions'][0]['extension_uuid'] = $extension_uuid; $array['extensions'][0]['forward_all_enabled'] = $forward_all_enabled; $array['extensions'][0]['forward_all_destination'] = $forward_all_destination; $array['extensions'][0]['forward_busy_enabled'] = $forward_busy_enabled; $array['extensions'][0]['forward_busy_destination'] = $forward_busy_destination; $array['extensions'][0]['forward_no_answer_enabled'] = $forward_no_answer_enabled; $array['extensions'][0]['forward_no_answer_destination'] = $forward_no_answer_destination; $array['extensions'][0]['forward_user_not_registered_enabled'] = $forward_user_not_registered_enabled; $array['extensions'][0]['forward_user_not_registered_destination'] = $forward_user_not_registered_destination; } //do not disturb (dnd) config if (permission_exists('do_not_disturb')) { $array['extensions'][0]['domain_uuid'] = $_SESSION['domain_uuid']; $array['extensions'][0]['extension_uuid'] = $extension_uuid; $array['extensions'][0]['do_not_disturb'] = $dnd_enabled; } //follow me config if (permission_exists('follow_me')) { //add follow_me_uuid and follow_me_enabled to the extensions array if ($follow_me_uuid == '') { $follow_me_uuid = uuid(); $array['extensions'][0]['domain_uuid'] = $_SESSION['domain_uuid']; $array['extensions'][0]['extension_uuid'] = $extension_uuid; $array['extensions'][0]['follow_me_uuid'] = $follow_me_uuid; } if ($destination_found) { $array['extensions'][0]['follow_me_enabled'] = $follow_me_enabled; } else { $array['extensions'][0]['follow_me_enabled'] = 'false'; } //build the follow me array $array['follow_me'][0]['domain_uuid'] = $_SESSION['domain_uuid']; $array['follow_me'][0]['follow_me_uuid'] = $follow_me_uuid; $array['follow_me'][0]['cid_name_prefix'] = $cid_name_prefix; $array['follow_me'][0]['cid_number_prefix'] = $cid_number_prefix; $array['follow_me'][0]['follow_me_ignore_busy'] = $follow_me_ignore_busy; if ($destination_found) { $array['follow_me'][0]['follow_me_enabled'] = $follow_me_enabled; } else { $array['follow_me'][0]['follow_me_enabled'] = 'false'; } $d = 0; $destination_found = false; foreach ($destinations as $field) { if ($field['destination'] != '') { //sanitize the destination $field['destination'] = preg_replace('#[^\*0-9]#', '', $field['destination']); //build the array $array['follow_me'][0]['follow_me_destinations'][$d]['domain_uuid'] = $_SESSION['domain_uuid']; $array['follow_me'][0]['follow_me_destinations'][$d]['follow_me_uuid'] = $follow_me_uuid; $array['follow_me'][0]['follow_me_destinations'][$d]['follow_me_destination_uuid'] = $field['uuid']; $array['follow_me'][0]['follow_me_destinations'][$d]['follow_me_destination'] = $field['destination']; $array['follow_me'][0]['follow_me_destinations'][$d]['follow_me_delay'] = $field['delay']; $array['follow_me'][0]['follow_me_destinations'][$d]['follow_me_prompt'] = $field['prompt']; $array['follow_me'][0]['follow_me_destinations'][$d]['follow_me_timeout'] = $field['timeout']; $array['follow_me'][0]['follow_me_destinations'][$d]['follow_me_order'] = $d; $destination_found = true; $d++; } else { $follow_me_delete_uuids[] = $field['uuid']; } } } //add the dialplan permission $p = new permissions; $p->add("extension_edit", "temp"); //save the data $database = new database; $database->app_name = 'call_routing'; $database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d'; $database->save($array); unset($array); //$message = $database->message; //remove the temporary permission $p->delete("extension_edit", "temp"); //delete empty destination records if (is_array($follow_me_delete_uuids) && sizeof($follow_me_delete_uuids) > 0) { foreach ($follow_me_delete_uuids as $follow_me_delete_uuid) { $array['follow_me_destinations'][]['follow_me_destination_uuid'] = $follow_me_delete_uuid; } $database = new database; $database->app_name = 'call_routing'; $database->app_uuid = '19806921-e8ed-dcff-b325-dd3e5da4959d'; $database->delete($array); unset($array); } /* //call forward config if (permission_exists('call_forward')) { $call_forward = new call_forward; $call_forward->domain_uuid = $_SESSION['domain_uuid']; $call_forward->domain_name = $_SESSION['domain_name']; $call_forward->extension_uuid = $extension_uuid; $call_forward->forward_all_destination = $forward_all_destination; $call_forward->forward_all_enabled = $forward_all_enabled; } //do not disturb (dnd) config if (permission_exists('do_not_disturb')) { $dnd = new do_not_disturb; $dnd->domain_uuid = $_SESSION['domain_uuid']; $dnd->domain_name = $_SESSION['domain_name']; $dnd->extension_uuid = $extension_uuid; $dnd->extension = $extension; $dnd->enabled = $dnd_enabled; } //if follow me is enabled then process call forward and dnd first if ($follow_me_enabled == "true") { //call forward $call_forward->set(); unset($call_forward); //dnd $dnd->set(); $dnd->user_status(); unset($dnd); } //follow me config and process if (permission_exists('follow_me')) { $follow_me = new follow_me; $follow_me->domain_uuid = $_SESSION['domain_uuid']; $follow_me->extension_uuid = $extension_uuid; $follow_me->follow_me_uuid = $follow_me_uuid; $follow_me->follow_me_ignore_busy = $follow_me_ignore_busy; $follow_me->follow_me_enabled = $follow_me_enabled; $follow_me->set(); unset($follow_me); } //if dnd or call forward are enabled process them last if ($follow_me_enabled != "true") { if ($forward_all_enabled == "true") { //dnd $dnd->set(); $dnd->user_status(); unset($dnd); //call forward $call_forward->set(); unset($call_forward); } else{ //call forward $call_forward->set(); unset($call_forward); //dnd $dnd->set(); $dnd->user_status(); unset($dnd); } } */ //send feature event notify to the phone if ($_SESSION['device']['feature_sync']['boolean'] == "true") { $ring_count = ceil($call_timeout / 6); $feature_event_notify = new feature_event_notify; $feature_event_notify->domain_name = $_SESSION['domain_name']; $feature_event_notify->extension = $extension; $feature_event_notify->do_not_disturb = $dnd_enabled; $feature_event_notify->ring_count = $ring_count; $feature_event_notify->forward_all_enabled = $forward_all_enabled; $feature_event_notify->forward_busy_enabled = $forward_busy_enabled; $feature_event_notify->forward_no_answer_enabled = $forward_no_answer_enabled; //workaround for freeswitch not sending NOTIFY when destination values are nil. Send 0. if ($forward_all_destination == "") { $feature_event_notify->forward_all_destination = "0"; } else { $feature_event_notify->forward_all_destination = $forward_all_destination; } if ($forward_busy_destination == "") { $feature_event_notify->forward_busy_destination = "0"; } else { $feature_event_notify->forward_busy_destination = $forward_busy_destination; } if ($forward_no_answer_destination == "") { $feature_event_notify->forward_no_answer_destination = "0"; } else { $feature_event_notify->forward_no_answer_destination = $forward_no_answer_destination; } $feature_event_notify->send_notify(); unset($feature_event_notify); } //send presence event if (permission_exists('do_not_disturb')) { if ($dnd_enabled == 'true') { //build the event $cmd = "sendevent PRESENCE_IN\n"; $cmd .= "proto: sip\n"; $cmd .= "login: ".$extension."@".$_SESSION['domain_name']."\n"; $cmd .= "from: ".$extension."@".$_SESSION['domain_name']."\n"; $cmd .= "status: Active (1 waiting)\n"; $cmd .= "rpid: unknown\n"; $cmd .= "event_type: presence\n"; $cmd .= "alt_event_type: dialog\n"; $cmd .= "event_count: 1\n"; $cmd .= "unique-id: ".uuid()."\n"; $cmd .= "Presence-Call-Direction: outbound\n"; $cmd .= "answer-state: confirmed\n"; //send the event $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); $switch_result = event_socket_request($fp, $cmd); unset($fp); } else { $presence = new presence; if (!$presence->active($extension."@".$_SESSION['domain_name'])) { //build the event $cmd = "sendevent PRESENCE_IN\n"; $cmd .= "proto: sip\n"; $cmd .= "login: ".$extension."@".$_SESSION['domain_name']."\n"; $cmd .= "from: ".$extension."@".$_SESSION['domain_name']."\n"; $cmd .= "status: Active (1 waiting)\n"; $cmd .= "rpid: unknown\n"; $cmd .= "event_type: presence\n"; $cmd .= "alt_event_type: dialog\n"; $cmd .= "event_count: 1\n"; $cmd .= "unique-id: ".uuid()."\n"; $cmd .= "Presence-Call-Direction: outbound\n"; $cmd .= "answer-state: terminated\n"; //send the event $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); $switch_result = event_socket_request($fp, $cmd); unset($fp); } } } //synchronize configuration if (is_readable($_SESSION['switch']['extensions']['dir'])) { require_once "app/extensions/resources/classes/extension.php"; $ext = new extension; $ext->xml(); unset($ext); } //clear the cache $cache = new cache; $cache->delete("directory:".$extension."@".$_SESSION['domain_name']); if (strlen($number_alias) > 0) { $cache->delete("directory:".$number_alias."@".$_SESSION['domain_name']); } //add the message message::add($text['confirm-update']); } //show the header $document['title'] = $text['title-call_routing']; require_once "resources/header.php"; //pre-populate the form if (is_uuid($follow_me_uuid)) { $sql = "select * from v_follow_me "; $sql .= "where domain_uuid = :domain_uuid "; $sql .= "and follow_me_uuid = :follow_me_uuid "; $parameters['domain_uuid'] = $_SESSION['domain_uuid']; $parameters['follow_me_uuid'] = $follow_me_uuid; $database = new database; $row = $database->select($sql, $parameters, 'row'); unset($sql, $parameters); if (is_array($row) && sizeof($row) != 0) { $cid_name_prefix = $row["cid_name_prefix"]; $cid_number_prefix = $row["cid_number_prefix"]; $follow_me_enabled = $row["follow_me_enabled"]; $follow_me_ignore_busy = $row["follow_me_ignore_busy"]; unset($row); $sql = "select * from v_follow_me_destinations "; $sql .= "where follow_me_uuid = :follow_me_uuid "; $sql .= "order by follow_me_order asc "; $parameters['follow_me_uuid'] = $follow_me_uuid; $database = new database; $result = $database->select($sql, $parameters, 'all'); unset($destinations); foreach ($result as $x => &$row) { $destinations[$x]['uuid'] = $row["follow_me_destination_uuid"]; $destinations[$x]['destination'] = $row["follow_me_destination"]; $destinations[$x]['delay'] = $row["follow_me_delay"]; $destinations[$x]['prompt'] = $row["follow_me_prompt"]; $destinations[$x]['timeout'] = $row["follow_me_timeout"]; } unset($sql, $parameters, $result, $row); } } //get the extensions array - used with autocomplete $sql = "select * from v_extensions "; $sql .= "where domain_uuid = :domain_uuid "; $sql .= "order by extension, number_alias asc "; $parameters['domain_uuid'] = $_SESSION['domain_uuid']; $database = new database; $extensions = $database->select($sql, $parameters, 'all'); unset($sql, $parameters, $row); //set the default if (!isset($dnd_enabled)) { //set the value from the database $dnd_enabled = $do_not_disturb; } //prepare the autocomplete if($_SESSION['follow_me']['follow_me_autocomplete']['boolean'] == 'true') { echo "\n"; echo "\n"; echo "\n"; } //create token $object = new token; $token = $object->create($_SERVER['PHP_SELF']); //show the content echo "
\n"; echo "
\n"; echo "
".$text['title-call_forward']."
\n"; echo "
\n"; echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','link'=>'call_forward.php']); echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save','style'=>'margin-left: 15px;']); echo "
\n"; echo "
\n"; echo "
\n"; echo $text['description']." ".escape($extension)."\n"; echo "

\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
\n"; echo " ".$text['label-call_forward']."\n"; echo "\n"; $on_click .= "$('#tr_follow_me_settings').slideUp('fast'); "; $on_click .= "document.getElementById('dnd_disabled').checked=true; "; $on_click .= "document.getElementById('forward_all_destination').focus(); "; $on_click2 .= "(document.getElementById('follow_me_enabled').checked) ? $('#tr_follow_me_settings').slideDown('fast') : '' "; echo " \n"; echo " \n"; unset($on_click); echo "   "; echo " \n"; echo "
".$text['description-call_forward']."\n"; echo "
\n"; echo " ".$text['label-on-busy']."\n"; echo "\n"; $on_click = "document.getElementById('dnd_disabled').checked=true;"; $on_click .= "document.getElementById('forward_busy_destination').focus();"; echo " \n"; echo " \n"; unset($on_click); echo "   "; echo " \n"; echo "
".$text['description-on-busy']."\n"; echo "
\n"; echo " ".$text['label-no_answer']."\n"; echo "\n"; $on_click = "document.getElementById('dnd_disabled').checked=true;"; $on_click .= "document.getElementById('forward_no_answer_destination').focus();"; echo " \n"; echo " \n"; unset($on_click); echo "   "; echo " \n"; echo "
".$text['description-no_answer']."\n"; echo "
\n"; echo " ".$text['label-not_registered']."\n"; echo "\n"; $on_click = "document.getElementById('forward_user_not_registered_destination').focus();"; echo " \n"; echo " \n"; unset($on_click); echo "   "; echo " \n"; echo "
".$text['description-not_registered']."\n"; echo "

\n"; echo " ".$text['label-follow_me']."\n"; echo "\n"; $on_click = "document.getElementById('forward_all_disabled').checked=true; "; $on_click .= "document.getElementById('dnd_disabled').checked=true; "; echo " \n"; echo " \n"; unset($on_click); echo "
\n"; if ($follow_me_enabled == "true" && $dnd_enabled != "true" && $forward_all_enabled != "true") { $style = ''; } else { $style = 'display: none;'; } echo "
\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; if (permission_exists('follow_me_ignore_busy')) { echo " \n"; echo " \n"; echo " \n"; echo " \n"; } if (permission_exists('follow_me_cid_name_prefix')) { echo "\n"; echo "\n"; echo "\n"; echo "\n"; } if (permission_exists('follow_me_cid_number_prefix')) { echo "\n"; echo "\n"; echo "\n"; echo "\n"; } echo "
\n"; echo " ".$text['label-destinations']."\n"; echo "\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; if (permission_exists('follow_me_prompt')) { echo " \n"; } echo " \n"; //output destinations for ($n = 0; $n <= ((($_SESSION['follow_me']['max_destinations']['numeric'] != '') ? $_SESSION['follow_me']['max_destinations']['numeric'] : 5) - 1); $n++) { echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; if (permission_exists('follow_me_prompt')) { echo " \n"; } echo " \n"; } echo "
".$text['label-destination_number']."".$text['label-destination_delay']."".$text['label-destination_timeout']."".$text['label-destination_prompt']."
\n"; destination_select('destinations['.$n.'][delay]', $destinations[$n]['delay'], '0'); echo " \n"; destination_select('destinations['.$n.'][timeout]', $destinations[$n]['timeout'], (($_SESSION['follow_me']['timeout']['numeric'] != '') ? $_SESSION['follow_me']['timeout']['numeric'] : 30)); echo " \n"; echo " \n"; echo "
\n"; echo "
"; echo $text['label-ignore_busy']; echo " \n"; echo " \n"; echo " \n"; echo "
\n"; echo $text['description-ignore_busy']."\n"; echo "
\n"; echo " ".$text['label-cid-name-prefix']."\n"; echo "\n"; echo " \n"; echo "
\n"; echo $text['description-cid-name-prefix']."\n"; echo "
\n"; echo " ".$text['label-cid-number-prefix']."\n"; echo "\n"; echo " \n"; echo "
\n"; echo $text['description-cid-number-prefix']."\n"; echo "
\n"; echo "
\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "

\n"; echo " ".$text['label-dnd']."\n"; echo "\n"; $on_click = "document.getElementById('forward_all_disabled').checked=true;"; $on_click .= "$('#tr_follow_me_settings').slideUp('fast'); "; $on_click2 .= "(document.getElementById('follow_me_enabled').checked) ? $('#tr_follow_me_settings').slideDown('fast') : '' "; echo " \n"; echo " \n"; echo "
\n"; echo "
"; echo "

"; if ($action == "update") { echo "\n"; } echo "\n"; echo "
"; //include the footer require_once "resources/footer.php"; ?>