From c35a32b1c1053709a5ed6bbf9ef43f9456a48cb2 Mon Sep 17 00:00:00 2001 From: mattf Date: Sun, 9 Sep 2018 13:28:03 +0000 Subject: [PATCH] Added force_fronter_leave_3way Agent API function git-svn-id: svn://192.168.202.10@3026 3d104415-ff17-0410-8863-d5cf3c621b8a --- agc_2-X/trunk/UPGRADE | 3 + agc_2-X/trunk/agi/cm_sc_ccc_lookup_insert.agi | 11 +- agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl | 31 ++- agc_2-X/trunk/docs/AGENT_API.txt | 33 ++- .../docs/CROSS_CLUSTER_COMMUNICATION.txt | 5 +- .../trunk/extras/MySQL_AST_CREATE_tables.sql | 6 +- agc_2-X/trunk/extras/upgrade_2.14.sql | 8 + agc_2-X/trunk/www/agc/api.php | 207 +++++++++++++++++- agc_2-X/trunk/www/vicidial/admin.php | 7 +- 9 files changed, 300 insertions(+), 11 deletions(-) diff --git a/agc_2-X/trunk/UPGRADE b/agc_2-X/trunk/UPGRADE index f588058e..a558578b 100644 --- a/agc_2-X/trunk/UPGRADE +++ b/agc_2-X/trunk/UPGRADE @@ -348,6 +348,9 @@ OTHER CHANGES: updated on your system using the following command: /usr/share/astguiclient/ADMIN_area_code_populate.pl --purge-table --debug +96. Added new 'force_fronter_leave_3way' Agent API function, allowing an API + command to be sent to the fronter of a call to leave-3way their call. + diff --git a/agc_2-X/trunk/agi/cm_sc_ccc_lookup_insert.agi b/agc_2-X/trunk/agi/cm_sc_ccc_lookup_insert.agi index 7fdef1ad..1bad19b8 100644 --- a/agc_2-X/trunk/agi/cm_sc_ccc_lookup_insert.agi +++ b/agc_2-X/trunk/agi/cm_sc_ccc_lookup_insert.agi @@ -23,10 +23,11 @@ # by the administrator of the external system. It should look something like this: # http://server/vicidial/non_agent_api.php?user=6666&pass=1234&source=test&function=ccc_lead_info&call_id=--A--call_id--B-- # -# Copyright (C) 2017 Matt Florell LICENSE: AGPLv2 +# Copyright (C) 2018 Matt Florell LICENSE: AGPLv2 # # changes: # 170609-1326 - First build +# 180908-1414 - Added extra logging # $script = 'cm_sc_ccc_lookup_insert.agi'; @@ -151,14 +152,19 @@ $extension =~ s/\'|\"|\\\\|\\\|\\|\\;|\\\;|\;|;//gi; $blind_xfer=0; $three_way=0; +$remote_lead_id=0; if ($calleridname =~ /^V\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d|^Y\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d|^M\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d|^J\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d/) { $blind_xfer=1; + $remote_lead_id = substr($calleridname, 10, 10); + $remote_lead_id = ($remote_lead_id + 0); } elsif ($calleridname =~ /^DC\d\d\d\d\d\dW\d\d\d\d\d\d\d\d\d\dW/) { $three_way=1; + $remote_lead_id = substr($calleridname, 9, 10); + $remote_lead_id = ($remote_lead_id + 0); } else { @@ -395,6 +401,9 @@ if ( (length($Wdocline_cat) > 29) && ($Wdocline_cat !~ /ERROR: ccc_lead_info /) $AGI->set_callerid($Ynewcallerid); if ($AGILOG) {$agi_string = "callerID changed: $Ynewcallerid"; &agi_output;} + $stmtA = "INSERT INTO vicidial_ccc_log SET call_date=NOW(),remote_call_id='$calleridname',local_call_id='$YqueryCID',lead_id='$new_lead_id',uniqueid='$uniqueid',channel='$channel',server_ip='$VARserver_ip',list_id='$LEADlist_id',container_id='$container_id',remote_lead_id='$remote_lead_id';"; + $affected_rows = $dbhA->do($stmtA); + $external_found=1; } } diff --git a/agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl b/agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl index 0c6e00ff..902a6c67 100644 --- a/agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl +++ b/agc_2-X/trunk/bin/ADMIN_keepalive_ALL.pl @@ -130,9 +130,10 @@ # 180301-1257 - Added more teodDB logging # 180512-2214 - Added reset of hopper_calls_today # 180818-2229 - Added rolling of vicidial_recent_ascb_calls records +# 180908-1428 - Added daily rolling of vicidial_ccc_log records # -$build = '180818-2229'; +$build = '180908-1428'; $DB=0; # Debug flag $teodDB=0; # flag to log Timeclock End of Day processes to log file @@ -1436,6 +1437,34 @@ if ($timeclock_end_of_day_NOW > 0) $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; } + + # roll of vicidial_ccc_log records, keep only 1 day of records in active table + if (!$Q) {print "\nProcessing vicidial_ccc_log table...\n";} + $stmtA = "INSERT IGNORE INTO vicidial_ccc_log_archive SELECT * from vicidial_ccc_log;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows = $sthA->rows; + $event_string = "$sthArows rows inserted into vicidial_ccc_log_archive table"; + if (!$Q) {print "$event_string \n";} + if ($teodDB) {&teod_logger;} + + $rv = $sthA->err(); + if (!$rv) + { + $stmtA = "DELETE FROM vicidial_ccc_log WHERE call_date < \"$RMSQLdate\";"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows = $sthA->rows; + $event_string = "$sthArows rows deleted from vicidial_ccc_log table"; + if (!$Q) {print "$event_string \n";} + if ($teodDB) {&teod_logger;} + + $stmtA = "optimize table vicidial_ccc_log;"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + } + + # reset in-group closing_time_now_trigger trigger flag $stmtA = "UPDATE vicidial_inbound_groups SET closing_time_now_trigger='N' WHERE closing_time_now_trigger='Y';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; diff --git a/agc_2-X/trunk/docs/AGENT_API.txt b/agc_2-X/trunk/docs/AGENT_API.txt index 95862a2c..ace10aa1 100644 --- a/agc_2-X/trunk/docs/AGENT_API.txt +++ b/agc_2-X/trunk/docs/AGENT_API.txt @@ -1,4 +1,4 @@ -AGENT API DOCUMENT Started: 2008-07-03 Updated: 2018-03-23 +AGENT API DOCUMENT Started: 2008-07-03 Updated: 2018-09-08 This document describes the functions of an API(Application Programming Interface) for the VICIDIAL Agent screen. This functionality will be rather limited at first @@ -35,6 +35,7 @@ pause_code - set a pause code if the agent is paused audio_playback - basic play/pause/resume/stop/restart audio in agent session switch_lead - for inbound calls, switches lead_id of live inbound call on agent screen calls_in_queue_count - display a count of the calls waiting in queue for the specific agent +force_fronter_leave_3way - will send a command to fronter agent to leave-3way call that executing agent is on New scripts: @@ -912,6 +913,36 @@ SUCCESS: calls_in_queue_count - 0 +-------------------------------------------------------------------------------- +force_fronter_leave_3way - + +DESCRIPTION: +will send a command to fronter agent to leave-3way call that executing agent is on. Will not execute command for the named 'agent_user', but will look for oldest other user currently on a call with the same lead_id that the named agent_user is on the phone with. + +VALUES: + value - + REQUIRED, choices are below: + LOCAL_ONLY - looks for fronter only on local cluster + LOCAL_AND_CCC - looks on local cluster and remote CCC to send command to (will always check local first) + CCC_REMOTE - use this when the closer is not on this cluster + lead_id - + OPTIONAL, only to be used with CCC_REMOTE value commands + +EXAMPLE URLS: +http://server/agc/api.php?source=test&user=6666&pass=1234&agent_user=1000&function=force_fronter_leave_3way&value=LOCAL_ONLY +http://server/agc/api.php?source=test&user=6666&pass=1234&agent_user=1000&function=force_fronter_leave_3way&value=LOCAL_AND_CCC + +RESPONSES: +ERROR: no user found - 6666 +ERROR: agent_user is not logged in - 6666 +ERROR: agent_user is not on a phone call - 6666 +ERROR: no fronter found - 6666 +SUCCESS: force_fronter_leave_3way SENT - 6667 +SUCCESS: force_fronter_leave_3way command sent over CCC - test_ccc + + + + -------------------------------------------------------------------------------- Other information: diff --git a/agc_2-X/trunk/docs/CROSS_CLUSTER_COMMUNICATION.txt b/agc_2-X/trunk/docs/CROSS_CLUSTER_COMMUNICATION.txt index 57c6fcbe..0a12f726 100644 --- a/agc_2-X/trunk/docs/CROSS_CLUSTER_COMMUNICATION.txt +++ b/agc_2-X/trunk/docs/CROSS_CLUSTER_COMMUNICATION.txt @@ -1,4 +1,4 @@ -CROSS-CLUSTER COMMUNICATION Started: 2011-05-27 Updated: 2017-08-09 +CROSS-CLUSTER COMMUNICATION Started: 2011-05-27 Updated: 2018-09-08 -------------------------------- @@ -25,7 +25,7 @@ Below is a description of a simple cross-cluster option, which is to send lead d # 2- local list_id to insert lead into(if not populated, will use external system's list_id for the lead) - The AGI script will use parameters defined in a Settings Container for the URL of the originating system's Non-Agent API and credentials - The originating server will need to set up a user of level 8 with view reports and Agent API abilities, and the ccc_lead_info API function enabled + The originating server will need to set up a user of level 8 with view reports and Agent API abilities, and the 'ccc_lead_info' API function enabled You will need to add a Settings Container to hold the URL for the originating system to look up the lead data, something like this: http://server/vicidial/non_agent_api.php?user=6666&pass=1234&source=test&function=ccc_lead_info&call_id=--A--call_id--B-- @@ -42,6 +42,7 @@ NOTES: # If lead is not found on external system, call will go to the 'B' option in the call menu # If container is not found, call will go to the 'C' option in the call menu # If call_id is not defined, call will go to the 'D' option in the call menu + # If you are planning to use the 'force_fronter_leave_3way' function across this CCC connection, make sure you have that API permission set for the API user above diff --git a/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql b/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql index 4dee520e..6d8e384a 100644 --- a/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql +++ b/agc_2-X/trunk/extras/MySQL_AST_CREATE_tables.sql @@ -3979,6 +3979,7 @@ channel VARCHAR(100) default '', server_ip VARCHAR(60) NOT NULL, list_id BIGINT(14) UNSIGNED, container_id VARCHAR(40) default '', +remote_lead_id INT(9) UNSIGNED, index (call_date), index (local_call_id), index (lead_id) @@ -4216,6 +4217,9 @@ CREATE UNIQUE INDEX vdidla_key on vicidial_did_log_archive(uniqueid, call_date, CREATE TABLE vicidial_recent_ascb_calls_archive LIKE vicidial_recent_ascb_calls; +CREATE TABLE vicidial_ccc_log_archive LIKE vicidial_ccc_log; +CREATE UNIQUE INDEX ccc_unq_key on vicidial_ccc_log_archive(uniqueid, call_date, lead_id); + GRANT RELOAD ON *.* TO cron@'%'; GRANT RELOAD ON *.* TO cron@localhost; @@ -4295,4 +4299,4 @@ INSERT INTO vicidial_settings_containers(container_id,container_notes,container_ UPDATE system_settings set vdc_agent_api_active='1'; -UPDATE system_settings SET db_schema_version='1555',db_schema_update_date=NOW(),reload_timestamp=NOW(); +UPDATE system_settings SET db_schema_version='1556',db_schema_update_date=NOW(),reload_timestamp=NOW(); diff --git a/agc_2-X/trunk/extras/upgrade_2.14.sql b/agc_2-X/trunk/extras/upgrade_2.14.sql index da38ccf9..ce8bfc90 100644 --- a/agc_2-X/trunk/extras/upgrade_2.14.sql +++ b/agc_2-X/trunk/extras/upgrade_2.14.sql @@ -672,6 +672,7 @@ channel VARCHAR(100) default '', server_ip VARCHAR(60) NOT NULL, list_id BIGINT(14) UNSIGNED, container_id VARCHAR(40) default '', +remote_lead_id INT(9) UNSIGNED, index (call_date), index (local_call_id), index (lead_id) @@ -747,3 +748,10 @@ UPDATE system_settings SET db_schema_version='1554',db_schema_update_date=NOW() CREATE INDEX vicidial_email_group_key on vicidial_email_list(group_id); UPDATE system_settings SET db_schema_version='1555',db_schema_update_date=NOW() where db_schema_version < 1555; + +ALTER TABLE vicidial_ccc_log ADD remote_lead_id INT(9) UNSIGNED; + +CREATE TABLE vicidial_ccc_log_archive LIKE vicidial_ccc_log; +CREATE UNIQUE INDEX ccc_unq_key on vicidial_ccc_log_archive(uniqueid, call_date, lead_id); + +UPDATE system_settings SET db_schema_version='1556',db_schema_update_date=NOW() where db_schema_version < 1556; diff --git a/agc_2-X/trunk/www/agc/api.php b/agc_2-X/trunk/www/agc/api.php index 7d86ce34..7a0f93e9 100644 --- a/agc_2-X/trunk/www/agc/api.php +++ b/agc_2-X/trunk/www/agc/api.php @@ -96,10 +96,11 @@ # 180301-2302 - Added GET-AND-POST URL logging # 180323-2227 - Fix for dial_ingroup error message on external_dial function # 180903-1606 - Added count for waiting emails to calls_in_queue_count function +# 180908-1433 - Added force_fronter_leave_3way function # -$version = '2.14-62'; -$build = '180903-1606'; +$version = '2.14-63'; +$build = '180908-1433'; $startMS = microtime(); @@ -4185,6 +4186,208 @@ if ($function == 'calls_in_queue_count') +################################################################################ +### BEGIN - force_fronter_leave_3way - will send a command to fronter agent to leave-3way call that executing agent is on +################################################################################ +if ($function == 'force_fronter_leave_3way') + { + if ( ( ($value!='LOCAL_ONLY') and ($value!='LOCAL_AND_CCC') and ($value!='CCC_REMOTE') ) or ( (strlen($agent_user)<1) and (strlen($alt_user)<2) ) ) + { + $result = _QXZ("ERROR"); + $result_reason = _QXZ("force_fronter_leave_3way not valid"); + echo "$result: $result_reason - $value|$agent_user\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + } + else + { + if ( (!preg_match("/ $function /",$VUapi_allowed_functions)) and (!preg_match("/ALL_FUNCTIONS/",$VUapi_allowed_functions)) ) + { + $result = _QXZ("ERROR"); + $result_reason = _QXZ("auth USER DOES NOT HAVE PERMISSION TO USE THIS FUNCTION"); + echo "$result: $result_reason - $value|$user|$function|$VUuser_group\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + exit; + } + if (strlen($alt_user)>1) + { + $stmt = "select count(*) from vicidial_users where custom_three='$alt_user';"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + if ($row[0] > 0) + { + $stmt = "select user from vicidial_users where custom_three='$alt_user' order by user;"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + $agent_user = $row[0]; + } + else + { + $result = _QXZ("ERROR"); + $result_reason = _QXZ("no user found"); + echo "$result: $result_reason - $alt_user\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + } + } + $stmt = "SELECT count(*) from vicidial_live_agents where user='$agent_user';"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $row=mysqli_fetch_row($rslt); + if ( ($row[0] > 0) or ($value == 'CCC_REMOTE') ) + { + $Alead_id=0; + ### grab the lead_id for this logged-in agent + $stmt="SELECT lead_id from vicidial_live_agents where user='$agent_user';"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $vla_ct = mysqli_num_rows($rslt); + if ($vla_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $Alead_id = $row[0]; + } + + if ( ($Alead_id > 0) or ( (strlen($lead_id) > 0) and ($value == 'CCC_REMOTE') ) ) + { + $QUERYlead_id = $Alead_id; + if ($value == 'CCC_REMOTE') + {$QUERYlead_id = $lead_id;} + + $other_user=''; + $fronter_found=0; + ### user ID of fronter agent + $stmt="SELECT user from vicidial_live_agents where user!='$agent_user' and lead_id='$QUERYlead_id' order by last_call_time limit 1;"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $vla_ct = mysqli_num_rows($rslt); + if ($vla_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $other_user = $row[0]; + $fronter_found++; + + $external_transferconf = "LEAVE_3WAY_CALL---------NO------------$epoch"; + $stmt="UPDATE vicidial_live_agents set external_transferconf='$external_transferconf' where user='$other_user';"; + $rslt=mysql_to_mysqli($stmt, $link); + $affected_rows = mysqli_affected_rows($link); + + $result = _QXZ("SUCCESS"); + $result_reason = _QXZ("SUCCESS: force_fronter_leave_3way SENT")." - $other_user"; + echo "$result_reason"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + } + else + { + if ($value == 'LOCAL_AND_CCC') + { + # check for CCC-fronted call on this server + $stmt="SELECT remote_lead_id,container_id from vicidial_ccc_log where lead_id='$QUERYlead_id';"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $vcl_ct = mysqli_num_rows($rslt); + if ($vcl_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $remote_lead_id = $row[0]; + $container_id = $row[1]; + + $stmt="SELECT container_entry from vicidial_settings_containers where container_id='$container_id';"; + if ($DB) {echo "|$stmt|\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $vsc_ct = mysqli_num_rows($rslt); + if ($vsc_ct > 0) + { + $row=mysqli_fetch_row($rslt); + $container_entry = $row[0]; + $container_entry = preg_replace("/ccc_lead_info/","force_fronter_leave_3way&value=CCC_REMOTE&lead_id=$remote_lead_id&agent_user=CCC_REMOTE",$container_entry); + $container_entry = preg_replace("/vicidial\/non_agent_|admin\/non_agent_/","agc/",$container_entry); + + $SQL_log = "$container_entry"; + $SQL_log = preg_replace('/;/','',$SQL_log); + $SQL_log = addslashes($SQL_log); + $stmt = "INSERT INTO vicidial_url_log SET uniqueid='$uniqueid',url_date='$NOW_TIME',url_type='start',url='$SQL_log',url_response='';"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $affected_rows = mysqli_affected_rows($link); + $url_id = mysqli_insert_id($link); + + $URLstart_sec = date("U"); + + ### grab the call_start_url ### + if ($DB > 0) {echo "$container_entry
\n";} + $SCUfile = file("$container_entry"); + if ( !($SCUfile) ) + { + $error_array = error_get_last(); + $error_type = $error_array["type"]; + $error_message = $error_array["message"]; + $error_line = $error_array["line"]; + $error_file = $error_array["file"]; + } + + if ($DB > 0) {echo "$SCUfile[0]
\n";} + + ### update url log entry + $URLend_sec = date("U"); + $URLdiff_sec = ($URLend_sec - $URLstart_sec); + if ($SCUfile) + { + $SCUfile_contents = implode("", $SCUfile); + $SCUfile_contents = preg_replace('/;/','',$SCUfile_contents); + $SCUfile_contents = addslashes($SCUfile_contents); + $fronter_found++; + + $result = _QXZ("SUCCESS"); + $result_reason = _QXZ("force_fronter_leave_3way command sent over CCC")." - $container_id"; + echo "$result: $result_reason\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + } + else + { + $SCUfile_contents = "PHP ERROR: Type=$error_type - Message=$error_message - Line=$error_line - File=$error_file"; + } + $stmt = "UPDATE vicidial_url_log SET response_sec='$URLdiff_sec',url_response='$SCUfile_contents' where url_log_id='$url_id';"; + if ($DB) {echo "$stmt\n";} + $rslt=mysql_to_mysqli($stmt, $link); + $affected_rows = mysqli_affected_rows($link); + } + } + } + } + if ($fronter_found < 1) + { + $result = _QXZ("ERROR"); + $result_reason = _QXZ("no fronter found"); + echo "$result: $result_reason - $agent_user\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + } + } + else + { + $result = _QXZ("ERROR"); + $result_reason = _QXZ("agent_user is not on a phone call"); + echo "$result: $result_reason - $agent_user\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + } + } + else + { + $result = _QXZ("ERROR"); + $result_reason = _QXZ("agent_user is not logged in"); + echo "$result: $result_reason - $agent_user\n"; + api_log($link,$api_logging,$api_script,$user,$agent_user,$function,$value,$result,$result_reason,$source,$data); + } + } + } +################################################################################ +### END - force_fronter_leave_3way +################################################################################ + + + + + ################################################################################ ### BEGIN - optional "close window" link ################################################################################ diff --git a/agc_2-X/trunk/www/vicidial/admin.php b/agc_2-X/trunk/www/vicidial/admin.php index e6ebce66..3c641adf 100644 --- a/agc_2-X/trunk/www/vicidial/admin.php +++ b/agc_2-X/trunk/www/vicidial/admin.php @@ -126,7 +126,7 @@ $UGreports = 'ALL REPORTS, NONE, Real-Time Main Report, Real-Time Campaign Summa $Vtables = 'NONE,log_noanswer,did_agent_log,contact_information'; -$APIfunctions = 'ALL_FUNCTIONS add_group_alias add_lead add_list add_phone add_phone_alias add_user agent_ingroup_info agent_stats_export agent_status audio_playback blind_monitor call_agent callid_info change_ingroups check_phone_number did_log_export external_add_lead external_dial external_hangup external_pause external_status in_group_status logout moh_list park_call pause_code preview_dial_action ra_call_control recording recording_lookup send_dtmf server_refresh set_timer_action sounds_list st_get_agent_active_lead st_login_log transfer_conference update_fields update_lead update_list update_log_entry update_phone update_phone_alias update_user user_group_status vm_list webphone_url webserver logged_in_agents update_campaign update_did lead_field_info phone_number_log switch_lead ccc_lead_info lead_status_search call_status_stats calls_in_queue_count'; +$APIfunctions = 'ALL_FUNCTIONS add_group_alias add_lead add_list add_phone add_phone_alias add_user agent_ingroup_info agent_stats_export agent_status audio_playback blind_monitor call_agent callid_info change_ingroups check_phone_number did_log_export external_add_lead external_dial external_hangup external_pause external_status in_group_status logout moh_list park_call pause_code preview_dial_action ra_call_control recording recording_lookup send_dtmf server_refresh set_timer_action sounds_list st_get_agent_active_lead st_login_log transfer_conference update_fields update_lead update_list update_log_entry update_phone update_phone_alias update_user user_group_status vm_list webphone_url webserver logged_in_agents update_campaign update_did lead_field_info phone_number_log switch_lead ccc_lead_info lead_status_search call_status_stats calls_in_queue_count force_fronter_leave_3way'; ### BEGIN housecleaning of old static report files, if not done before ### @@ -4441,12 +4441,13 @@ else # 180812-0902 - Added scheduled_callbacks_auto_reschedule campaign setting # 180825-2100 - Added scheduled_callbacks_timezones_container campaign setting and timezones display # 180904-1206 - Added copying of in-group user grades/ranks when copying an in-group +# 180908-1618 - Added force_fronter_leave_3way API function # # make sure you have added a user to the vicidial_users MySQL table with at least user_level 9 to access this page the first time -$admin_version = '2.14-686a'; -$build = '180904-1206'; +$admin_version = '2.14-687a'; +$build = '180908-1618'; $STARTtime = date("U"); $SQLdate = date("Y-m-d H:i:s");