mirror of
https://github.com/fusionpbx/fusionpbx.git
synced 2025-12-30 00:53:50 +00:00
* Use settings-get method - get default, domain and user settings - Replace _SESSION * Simplify get domain paging * Change isset using empty * Fix token name and hash * Add new default settings category: contact, name: default_sort_column, and default_sort_order * Update app_config.php * Update footer.php * Fix require.php and core/dashboard/index.php (#7563) * Fix require.php and core/dashboard/index.php * Fix require.php and core/dashboard/index.php * Fix require.php and core/dashboard/index.php * Fix require.php and core/dashboard/index.php * Fix require.php and core/dashboard/index.php * Fix require.php and core/dashboard/index.php * Fix require.php and core/dashboard/index.php * Fix require.php and core/dashboard/index.php * Fix require.php and core/dashboard/index.php * Update destinations.php * Update permission.php * Update require.php --------- Co-authored-by: FusionPBX <markjcrane@gmail.com> Co-authored-by: FusionPBX <mark@fusionpbx.com> * Update header.php * Use settings get classes (#7567) * access_control * azure * azure * basic_operator_panel * bridges * call_block * call_broadcast * call_center * call_flows * call_forward * call_recordings * do_not_disturb * feature_event_notify * follow_me * remove unused object properties * fix esl command * fix esl command * conference_centers * conference_centers - remove whitespace * conference_controls * conference_profiles * conference_profiles * Delete core/websockets/resources/classes/socket_exception.php.original~ * Delete core/websockets/resources/classes/websocket_server.php.original~ * conferences * destinations * device * dialplan * email_queue * event_guard * extension_settings * extension * fax * fax_queue * fifo * gateways * ivr_menu * modules * switch_music_on_hold * number_translations * phrases * pin_numbers * provision * switch_recordings * registrations * ring_groups * sip_profiles * sofia_global_settings * streams * presence * switch_files * time_conditions * vars * voicemail_greetings * voicemail * ringbacks * contacts * xml_cdr * authentication * dashboard * default_settings * domain_settings * email_templates * permission * user_logs * user_settings * users * button * cache * captcha * remove cli_option * remove directory.php for switch_directory class * email * file * groups * event_socket use config object * Use intval to give an integer port * switch_settings * tones * fix object used before initialization * menu * fix copy paste error for switch_files.php * always include require.php for framework files * Fix missing properties * set the action * Use the $database object * Add missing class properties * Fix the domain_name * Use public scope for domain_uuid and domain_name * Add missing parameters * Correct the user_uuid parameter * Add json_validate and use it in the dashboard update indentation on functions.php * Intialize the active_registrations variable * Define the $parameters * Set a default value for user_setting_enabled * Add condition domain_uuid not empty * Add not empty condition for domain_uuid * Declare the global variables * Update how the defaults are set use ?? * Use ?? to set the default values * Update call_center_queue_edit.php * Prevent an error * Add domain_name property * Fix the null coalescing operator * Removed domain_uuid from the URL * Change condition to check sip_profile_domain_name * Refactor domain_uuid declaration and comments Removed redundant domain_uuid declaration and updated comments. * Account for an empty value * Refactor constructor to use settings array Updated constructor to accept settings array for domain UUID and database initialization. * Refactor xml_cdr.php to improve variable organization Removed duplicate domain_uuid declaration and reorganized private variables for better structure. * Enhance transcription button logic and icon display Updated transcription button visibility conditions and improved application icon handling in the call flow summary. * Refactor settings initialization in domains.php Updated settings initialization to include domain_uuid and user_uuid. * Modify domain change condition in require.php Updated condition to check if 'domain_change' is not empty before proceeding. * Set default_setting_enabled to true by default * Enhance domain UUID check in access controls * Enhance domain UUID check in settings list * Refactor category display logic in vars.php * Simplify list row URL generation Removed domain UUID check from list row URL construction. * Refactor module category display logic * Fix SQL query by removing parameters variable * Initialize result_count variable for call recordings * Refactor leg variable usage in xml_cdr_details.php * Update conference_room_edit.php * Change GET to REQUEST for order and search variables * Set timezone and SQL time format in recordings.php Added timezone and SQL time format settings. * Set default for ring group greeting * Improve domain UUID check in stream listing * Handle null voicemail_option_param safely * Add file existence check for greeting files Check if greeting file exists before getting size and date. * Improve domain UUID check in email templates * Update FIFO strategy dropdown and description text * Add multilingual agent descriptions Added multilingual descriptions for agents in the app_languages.php file. * Add music on hold descriptions * Add the chime list description Updated copyright year from 2024 to 2025. * Fix domain UUID check and handle email subject decoding * Add null coalescing for $value in email_test.php Ensure $value is not null by providing a default empty string. * Handle undefined dialplan_uuid in input field * Add translations for 'Status' label in multiple languages * Fix typo in config instance check --------- Co-authored-by: frytimo <tim@fusionpbx.com>
303 lines
12 KiB
PHP
303 lines
12 KiB
PHP
<?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) 2017-2025
|
|
the Initial Developer. All Rights Reserved.
|
|
|
|
Contributor(s):
|
|
Mark J Crane <markjcrane@fusionpbx.com>
|
|
*/
|
|
|
|
//includes files
|
|
require_once dirname(__DIR__, 4) . "/resources/require.php";
|
|
require_once "resources/check_auth.php";
|
|
|
|
//check permissions
|
|
if (permission_exists('call_center_queue_view')) {
|
|
//access granted
|
|
}
|
|
else {
|
|
echo "access denied";
|
|
exit;
|
|
}
|
|
|
|
//add multi-lingual support
|
|
$language = new text;
|
|
$text = $language->get($settings->get('domain', 'language', 'en-us'), 'app/call_centers');
|
|
|
|
//get http variables and set as php variables
|
|
$order_by = $_GET["order_by"] ?? null;
|
|
$order = $_GET["order"] ?? null;
|
|
|
|
//setup the event socket connection
|
|
$esl = event_socket::create();
|
|
|
|
//get the http post values and set them as php variables
|
|
if (!empty($_POST['agents'])) {
|
|
|
|
//get the agent id
|
|
if (is_uuid($_POST['agents'][0]['id'])) {
|
|
$agent_uuid = $_POST['agents'][0]['id'];
|
|
}
|
|
|
|
//get the agent details from event socket
|
|
if (is_uuid($agent_uuid)) {
|
|
$switch_cmd = 'callcenter_config agent list '.$agent['call_center_agent_uuid'];
|
|
$event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd));
|
|
$call_center_agent = csv_to_named_array($event_socket_str, '|');
|
|
$agent['agent_status'] = $call_center_agent[1]['status'];
|
|
}
|
|
|
|
//find the agent_status - used for mod_call_center as there is only one agent status not one per queue
|
|
$agent_status = 'Logged Out';
|
|
foreach ($_POST['agents'] as $row) {
|
|
if ($row['agent_status'] == 'Available') {
|
|
$agent_status = 'Available';
|
|
break;
|
|
}
|
|
if ($row['agent_status'] == 'On Break') {
|
|
$agent_status = 'On Break';
|
|
break;
|
|
}
|
|
}
|
|
|
|
//save the agent_stat change to the database
|
|
$array['call_center_agents'][0]['call_center_agent_uuid'] = $agent_uuid;
|
|
$array['call_center_agents'][0]['domain_uuid'] = $_SESSION['user']['domain_uuid'];
|
|
$array['call_center_agents'][0]['agent_status'] = $agent_status;
|
|
$result = $database->save($array);
|
|
|
|
//send the agent status status to mod_call_center
|
|
$cmd = "callcenter_config agent set status ".$agent_uuid." '".$agent_status."'";
|
|
$response = event_socket::api($cmd);
|
|
|
|
//add or delete agents from the queue assigned by the tier
|
|
foreach ($_POST['agents'] as $row) {
|
|
|
|
//agent set status
|
|
if ($fp && is_numeric($row['queue_extension']) && is_uuid($row['id'])) {
|
|
|
|
//set the agent status to available and assign the agent to the queue with the tier
|
|
if ($row['agent_status'] == 'Available') {
|
|
//assign the agent to the queue
|
|
$cmd = "callcenter_config tier add ".$row['queue_extension']."@".$_SESSION['domain_name']." ".$row['id']." 1 1";
|
|
$response = event_socket::api($cmd);
|
|
}
|
|
|
|
//set the agent status to available and assign the agent to the queue with the tier
|
|
if ($row['agent_status'] == 'On Break') {
|
|
//assign the agent to the queue
|
|
$cmd = "callcenter_config tier add ".$row['queue_extension']."@".$_SESSION['domain_name']." ".$row['id']." 1 1";
|
|
$response = event_socket::api($cmd);
|
|
}
|
|
|
|
//un-assign the agent from the queue
|
|
if ($row['agent_status'] == 'Logged Out') {
|
|
$cmd = "callcenter_config tier del ".$row['queue_extension']."@".$_SESSION['domain_name']." ".$row['id'];
|
|
$response = event_socket::api($cmd);
|
|
}
|
|
|
|
//small sleep
|
|
usleep(200);
|
|
}
|
|
}
|
|
|
|
//redirect
|
|
header('Location: '.PROJECT_PATH.'/core/dashboard/');
|
|
exit;
|
|
}
|
|
|
|
//get the agent list from event socket
|
|
$switch_cmd = 'callcenter_config tier list';
|
|
$event_socket_str = trim(event_socket::api($switch_cmd));
|
|
$call_center_tiers = csv_to_named_array($event_socket_str, '|');
|
|
|
|
//get the agents from the database
|
|
$sql = "select * from v_call_center_agents ";
|
|
$sql .= "where user_uuid = :user_uuid ";
|
|
$sql .= "and domain_uuid = :domain_uuid";
|
|
$parameters['user_uuid'] = $_SESSION['user_uuid'];
|
|
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
|
|
$agents = $database->select($sql, $parameters, 'all');
|
|
if (!empty($agents)) {
|
|
$agent = $agents[0];
|
|
}
|
|
unset($sql, $parameters);
|
|
|
|
//get the call center queues from the database
|
|
//if ($settings->get('call_center, queue_login', '') == 'dynamic') {
|
|
$sql = "select * from v_call_center_queues ";
|
|
$sql .= "where domain_uuid = :domain_uuid ";
|
|
$sql .= "and call_center_queue_uuid in ( ";
|
|
$sql .= " select call_center_queue_uuid from v_call_center_tiers ";
|
|
$sql .= " where call_center_agent_uuid = :call_center_agent_uuid ";
|
|
$sql .= ") ";
|
|
$parameters['call_center_agent_uuid'] = $agent['call_center_agent_uuid'];
|
|
$sql .= "order by queue_extension asc ";
|
|
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
|
|
$call_center_queues = $database->select($sql, $parameters, 'all');
|
|
$num_rows = !is_array($call_center_queues) ? 0 : @sizeof($call_center_queues);
|
|
unset($sql, $parameters);
|
|
//}
|
|
|
|
//get the agent details from event socket
|
|
$switch_cmd = 'callcenter_config agent list '.($agent['call_center_agent_uuid'] ?? null);
|
|
$event_socket_str = trim(event_socket_request($fp ?? null, 'api '.$switch_cmd));
|
|
$call_center_agent = csv_to_named_array($event_socket_str, '|');
|
|
|
|
//set the agent status
|
|
$agent['agent_status'] = $call_center_agent[1]['status'];
|
|
|
|
//update the queue status
|
|
$x = 0;
|
|
if (!empty($call_center_queues) && is_array($call_center_queues)) {
|
|
foreach ($call_center_queues as $queue) {
|
|
$call_center_queues[$x]['queue_status'] = 'Logged Out';
|
|
foreach ($call_center_tiers as $tier) {
|
|
if ($queue['queue_extension'] .'@'. $_SESSION['user']['domain_name'] == $tier['queue'] && $agent['call_center_agent_uuid'] == $tier['agent']) {
|
|
$call_center_queues[$x]['queue_status'] = $agent['agent_status'];
|
|
}
|
|
}
|
|
$x++;
|
|
}
|
|
}
|
|
|
|
//includes the header
|
|
require_once "resources/header.php";
|
|
|
|
//radio button cycle script
|
|
echo "<script>\n";
|
|
echo "\n";
|
|
|
|
echo " function get_selected(radio_group) {\n";
|
|
echo " for (var i = 0; i < radio_group.length; i++) {\n";
|
|
echo " if (radio_group[i].checked) { return i; }\n";
|
|
echo " }\n";
|
|
echo " return 0;\n";
|
|
echo " }\n";
|
|
echo "\n";
|
|
|
|
echo " function cycle(radio_group_name) {\n";
|
|
echo " var radios = document.getElementsByName(radio_group_name);\n";
|
|
echo " var i = get_selected(radios);\n";
|
|
echo " if (i+1 == radios.length) {\n";
|
|
echo " radios[0].checked = true;\n";
|
|
echo " }\n";
|
|
echo " else {\n";
|
|
echo " radios[i+1].checked = true;\n";
|
|
echo " }\n";
|
|
echo " }\n";
|
|
echo "\n";
|
|
|
|
echo " function handle_status_change(agent_index) {\n";
|
|
echo " var agent_status = document.querySelector('input[name=\"agents[' + agent_index + '][agent_status]\"]:checked').value;\n";
|
|
echo " var radio_buttons = document.querySelectorAll('#form_list_call_center_agent_dashboard input[type=\"radio\"]');\n";
|
|
//echo "console.log('status: '+agent_status);\n";
|
|
//echo " radio_checked_value = '';\n";
|
|
echo " radio_buttons.forEach(function(radio_button) {\n";
|
|
//echo " if (radio_button.checked == true && radio_button.value === 'Available') {\n";
|
|
//echo " radio_checked_value = 'Available';\n";
|
|
//echo " }\n";
|
|
//echo " if (radio_button.checked == true && radio_button.value === 'On Break') {\n";
|
|
//echo " radio_checked_value = 'On Break';\n";
|
|
//echo " }\n";
|
|
//echo " if (radio_button.value === 'Logged Out') {\n";
|
|
//echo " radio_checked_value = 'Logged Out';\n";
|
|
//echo " }\n";
|
|
echo " if (radio_button.checked) { console.log('checked: '+radio_button.value) }\n";
|
|
echo " if (radio_button.value === 'Available' && agent_status === 'Available') {\n"; // radio_checked_value == 'On Break' &&
|
|
//echo " radio_button.checked = true;\n";
|
|
//echo " radio_button.value = 'Available';\n";
|
|
//echo " radio_button[agent_status]\"]:checked').value == 'On Break';\n";
|
|
//echo " console.log('--'+radio_button.value+'--');\n";
|
|
//echo " console.log('need to change status On Break to Available');\n";
|
|
//echo " console.log('---');\n";
|
|
echo " }\n";
|
|
echo " if (radio_button.value === 'On Break' && agent_status === 'On Break') {\n"; // radio_checked_value == 'Available' &&
|
|
//echo " radio_button.checked = true;\n";
|
|
//echo " radio_button.value = 'On Break';\n";
|
|
//echo " radio_button[agent_status]\"]:checked').value == 'On Break';\n";
|
|
//echo " console.log('--'+radio_button.value+'--');\n";
|
|
//echo " console.log('need to change status Available to On Break');\n";
|
|
//echo " console.log('---');\n";
|
|
echo " }\n";
|
|
|
|
//echo " console.log('checked: '+radio_button.checked+' value:'+radio_button.value);\n";
|
|
//echo " console.log('radio checked value: '+ radio_checked_value +' checked: '+radio_button.checked+' value:'+radio_button.value);\n";
|
|
//else if (agent_status === 'Available') {\n";
|
|
//echo " radio_button.checked = true;\n";
|
|
//echo " }\n";
|
|
echo " });\n";
|
|
|
|
echo " }\n";
|
|
|
|
echo "\n";
|
|
echo "</script>\n";
|
|
|
|
//show the content
|
|
echo "<div class='hud_box'>";
|
|
|
|
echo "<div class='hud_content' style='display: block;'>\n";
|
|
echo " <div class='action_bar sub'>\n";
|
|
echo " <div class='heading' style='padding-left: 5px;'><b>".$text['header-call_center_queues'].(!empty($agent['agent_name']) ? " </b> Agent: <strong>".$agent['agent_name']."</strong>" : "</b>")."</div>\n";
|
|
echo " <div class='actions' style='padding-top: 2px;'>\n";
|
|
echo button::create(['type'=>'button','label'=>$text['button-save'],'icon'=>$settings->get('theme', 'button_icon_save'),'collapse'=>false,'onclick'=>"document.getElementById('form_list_call_center_agent_dashboard').submit();"]);
|
|
echo " </div>\n";
|
|
echo " <div style='clear: both;'></div>\n";
|
|
echo " </div>\n";
|
|
|
|
echo " <form id='form_list_call_center_agent_dashboard' method='post'>\n";
|
|
|
|
echo " <table class='list' style='padding: 0 5px;'>\n";
|
|
echo " <tr class='list-header'>\n";
|
|
echo " <th>".$text['label-queue_name']."</th>\n";
|
|
echo " <th class='shrink'>".$text['label-status']."</th>\n";
|
|
echo " </tr>\n";
|
|
|
|
if (!empty($call_center_queues) && is_array($call_center_queues) && @sizeof($call_center_queues) != 0) {
|
|
$x = 0;
|
|
foreach ($call_center_queues as $row) {
|
|
$onclick = "onclick=\"cycle('agents[".$x."][agent_status]');\"";
|
|
$onclick = '';
|
|
echo "<tr class='list-row'>\n";
|
|
echo " <td ".$onclick.">".escape($row['queue_name'])."</td>\n";
|
|
echo " <td class='no-wrap right'>\n";
|
|
echo " <input type='hidden' name='agents[".$x."][queue_extension]' value='".escape($row['queue_extension'])."'>\n";
|
|
echo " <input type='hidden' name='agents[".$x."][agent_name]' value='".escape($agent['agent_name'])."'>\n";
|
|
echo " <input type='hidden' name='agents[".$x."][id]' value='".escape($agent['call_center_agent_uuid'])."'>\n";
|
|
echo " <label style='margin: 0; cursor: pointer; margin-right: 10px;'><input type='radio' name='agents[".$x."][agent_status]' value='Available' ".($row['queue_status'] == 'Available' ? "checked='checked'" : null)." onchange='handle_status_change(".$x.")'> ".$text['option-available']."</label>\n";
|
|
echo " <label style='margin: 0; cursor: pointer; margin-right: 10px;'><input type='radio' name='agents[".$x."][agent_status]' value='Logged Out' ".($row['queue_status'] == 'Logged Out' ? "checked='checked'" : null)." onchange='handle_status_change(".$x.")'> ".$text['option-logged_out']."</label>\n";
|
|
echo " <label style='margin: 0; cursor: pointer;'><input type='radio' name='agents[".$x."][agent_status]' value='On Break' ".($row['queue_status'] == 'On Break' ? "checked='checked'" : null)." onchange='handle_status_change(".$x.")'> ".$text['option-on_break']."</label>\n";
|
|
echo " </td>\n";
|
|
echo "</tr>\n";
|
|
$x++;
|
|
}
|
|
unset($call_center_queues);
|
|
}
|
|
|
|
echo " </table>\n";
|
|
echo " <br />\n";
|
|
echo " <input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
|
|
echo " </form>\n";
|
|
echo "</div>\n";
|
|
|
|
echo "</div>\n";
|
|
|
|
?>
|