Added agent_hide_dial_fail system_settings feature

Fix for ConfBridge issue

git-svn-id: svn://192.168.202.10@3919 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
mattf
2025-03-27 01:28:20 +00:00
parent 0c176c8c74
commit 3f9ddd7247
6 changed files with 248 additions and 75 deletions
+195 -65
View File
@@ -10,6 +10,7 @@
# CHANGES
# 220414-1210 - Initial build
# 250305-2104 - Fix for missing vicidial_confbridges limit purge code
# 250326-2102 - Fixes for ConfBridge issues
#
# constants
@@ -316,7 +317,7 @@ else
{
print "|No active conferences.\n";
$event_string = "|No active conferences.";
event_logger($SYSLOG,$event_string);
event_logger($SYSLOG,$event_string);
}
else
{
@@ -506,11 +507,21 @@ else
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$conf_hash{ "$aryA[1]" } = { "extension" => $aryA[0], "type" => "c" };
$conf_hash{ "$aryA[1]" } = { "extension" => $aryA[0], "type" => "c", "processed" => 0};
$rec_count++;
}
$sthA->finish();
# detect error conferences
$stmtA = "UPDATE vicidial_conferences set extension='ConfError' where server_ip='$server_ip' and leave_3way='1' and extension = '';";
$affected_rows = $dbhA->do($stmtA);
if ( $affected_rows > 0 )
{
if($DB){print STDERR "Conference Error Detected!\n$stmtA\n Detected $affected_rows conferences with extension set to '' but leave_3way set to 1\n";}
event_logger($SYSLOG,"Conference Error Detected!\n$stmtA\n Detected $affected_rows conferences with extension set to '' but leave_3way set to 1\n");
}
# get vicidial_conferences data
$stmtA = "SELECT extension,conf_exten from vicidial_conferences where server_ip='$server_ip' and leave_3way='1';";
if ($DB) {print "|$stmtA|\n";}
@@ -522,13 +533,22 @@ else
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$conf_hash{ "$aryA[1]" } = { "extension" => $aryA[0], "type" => "vc" };
$conf_hash{ "$aryA[1]" } = { "extension" => $aryA[0], "type" => "vc", "processed" => 0 };
$rec_count++;
}
$sthA->finish();
}
else
{
# detect error conferences
$stmtA = "UPDATE vicidial_confbridges set extension='ConfError' where server_ip='$server_ip' and leave_3way='1' and extension = '';";
$affected_rows = $dbhA->do($stmtA);
if ( $affected_rows > 0 )
{
if($DB){print STDERR "Conference Error Detected!\n$stmtA\n Detected $affected_rows conferences with extension set to '' but leave_3way set to 1\n";}
event_logger($SYSLOG,"Conference Error Detected!\n$stmtA\n Detected $affected_rows conferences with extension set to '' but leave_3way set to 1\n");
}
# get vicidial_confbridges data
$stmtA = "SELECT extension,conf_exten from vicidial_confbridges where server_ip='$server_ip' and leave_3way='1';";
if ($DB) {print "|$stmtA|\n";}
@@ -540,7 +560,7 @@ else
while ($sthArows > $rec_count)
{
@aryA = $sthA->fetchrow_array;
$conf_hash{ "$aryA[1]" } = { "extension" => $aryA[0], "type" => "vcb" };
$conf_hash{ "$aryA[1]" } = { "extension" => $aryA[0], "type" => "vcb", "processed" => 0 };
$rec_count++;
}
$sthA->finish()
@@ -550,73 +570,181 @@ else
foreach $room (@room_array)
{
$conf_id = $room->{'Conference'};
if (( $room->{'Parties'} == 0 ) && ($conf_hash{"$conf_id"}{"type"} eq "c"))
{
# we are just a conference so dont kicking people out
$new_exten = $conf_hash{"$conf_id"}{"extension"};
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout3$/i) {$new_exten =~ s/Xtimeout3$/Xtimeout2/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout2$/i) {$new_exten =~ s/Xtimeout2$/Xtimeout1/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout1$/i) {$new_exten = '';}
if ( ($conf_hash{"$conf_id"}{"extension"} !~ /Xtimeout\d$/i) and (length($conf_hash{"$conf_id"}{"extension"})> 0) ) {$new_exten .= 'Xtimeout3';}
if($DB) { print $conf_hash{"$conf_id"}{"extension"} . "|$new_exten|$leave_3waySQL|\n"; }
$stmtA = "UPDATE vicidial_conferences set extension='$new_exten' where server_ip='$server_ip' and conf_exten='$conf_id';";
if($DB){print STDERR "\n|$stmtA|\n";}
event_logger($SYSLOG,"|$stmtA|");
$affected_rows = $dbhA->do($stmtA);
}
elsif (( $room->{'Parties'} <= 1 ) && (($conf_hash{"$conf_id"}{"type"} eq "vc") || ($conf_hash{"$conf_id"}{"type"} eq "vcb")))
# check if the room exists in the $conf_hash
if ( exists $conf_hash{"$conf_id"} )
{
# we are a vicidial conference so we can single partisipants out.
$new_exten = $conf_hash{"$conf_id"}{"extension"};
$leave_3waySQL = '1';
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout3$/i) {$new_exten =~ s/Xtimeout3$/Xtimeout2/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout2$/i) {$new_exten =~ s/Xtimeout2$/Xtimeout1/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout1$/i) {$new_exten = ''; $leave_3waySQL='0';}
if ( ($conf_hash{"$conf_id"}{"extension"} !~ /Xtimeout\d$/i) and (length($conf_hash{"$conf_id"}{"extension"})> 0) ) {$new_exten .= 'Xtimeout3';}
# if so mark it as processed
$conf_hash{"$conf_id"}{"processed"} = 1;
if($DB) { print $conf_hash{"$conf_id"}{"extension"} . "|$new_exten|$leave_3waySQL|\n";}
event_logger($SYSLOG, $conf_hash{"$conf_id"}{"extension"} . "|$new_exten|$leave_3waySQL|");
$kick = 0;
if ($new_exten =~ /Xtimeout1$/i)
# give debug info if the conference has a ConfError
if ($conf_hash{"$conf_id"}{"extension"} =~ /ConfError/i)
{
### Kick all participants if there are any left in the conference so it can be reused
$local_DEF = 'Local/5555';
$local_AMP = '@';
$kick_local_channel = $local_DEF . $conf_id . $local_AMP . $ext_context;
$padTDinc = sprintf("%03s", $TDinc); while (length($padTDinc) > 3) {chop($padTDinc);}
$queryCID = "ULGC$padTDinc$TDnum";
$stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$server_ip','','Originate','$queryCID','Channel: $kick_local_channel','Context: $ext_context','Exten: 8300','Priority: 1','Callerid: $queryCID','','','','','');";
$affected_rows = $dbhA->do($stmtA); # or die "Couldn't execute query:|$stmtA|\n";
if($DB){print STDERR "\n|$affected_rows|$stmtA|\n";}
event_logger($SYSLOG,"|$affected_rows|$stmtA|");
$TDinc++;
$kick = 1;
if($DB){print STDERR "Conference Error Detected in " . $conf_hash{"$conf_id"}{"type"} . " conferernce $conf_id\n";}
event_logger($SYSLOG,"Conference Error Detected in " . $conf_hash{"$conf_id"}{"type"} . " conferernce $conf_id\n");
}
if ($conf_hash{"$conf_id"}{"type"} eq "vc")
# if it is an astGUIclient conference and has 0 parties process it
if (( $room->{'Parties'} == 0 ) && ($conf_hash{"$conf_id"}{"type"} eq "c"))
{
# we are just a conference so dont kicking people out
$new_exten = $conf_hash{"$conf_id"}{"extension"};
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout3$/i) {$new_exten =~ s/Xtimeout3$/Xtimeout2/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout2$/i) {$new_exten =~ s/Xtimeout2$/Xtimeout1/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout1$/i) {$new_exten = '';}
if ( ($conf_hash{"$conf_id"}{"extension"} !~ /Xtimeout\d$/i) and (length($conf_hash{"$conf_id"}{"extension"})> 0) ) {$new_exten .= 'Xtimeout3';}
if($DB) { print $conf_hash{"$conf_id"}{"extension"} . "|$new_exten|$leave_3waySQL|\n"; }
$stmtA = "UPDATE conferences set extension='$new_exten' where server_ip='$server_ip' and conf_exten='$conf_id';";
if($DB){print STDERR "\n|$stmtA|\n";}
event_logger($SYSLOG,"|$stmtA|");
$affected_rows = $dbhA->do($stmtA);
}
# if it is a vicidial conference or confbridge and there are more than one party in it clear the timeout flag
elsif (( $room->{'Parties'} > 1 ) && (($conf_hash{"$conf_id"}{"type"} eq "vc") || ($conf_hash{"$conf_id"}{"type"} eq "vcb")) && ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout/i) )
{
$stmtA = "UPDATE vicidial_conferences set extension='$new_exten',leave_3way='$leave_3waySQL' where server_ip='$server_ip' and conf_exten='$conf_id';";
}
else
# room has 2 parties but a timeout was set. Clear the timeout
$new_exten = $conf_hash{"$conf_id"}{"extension"};
$new_exten =~ s/Xtimeout\d$//gi;
if ($conf_hash{"$conf_id"}{"type"} eq "vc")
{
$stmtA = "UPDATE vicidial_conferences set extension='$new_exten' where server_ip='$server_ip' and conf_exten='$conf_id';";
}
else
{
$stmtA = "UPDATE vicidial_confbridges set extension='$new_exten' where server_ip='$server_ip' and conf_exten='$conf_id';"
}
if($DB){print STDERR "\n|fix|$stmtA|\n";}
event_logger($SYSLOG,"\n|fix|$stmtA|");
$affected_rows = $dbhA->do($stmtA);
}
# if it is a vicidial conference or confbridge and there is one or less parties in it set the timeout
elsif (( $room->{'Parties'} <= 1) && (($conf_hash{"$conf_id"}{"type"} eq "vc") || ($conf_hash{"$conf_id"}{"type"} eq "vcb")))
{
$stmtA = "UPDATE vicidial_confbridges set extension='$new_exten',leave_3way='$leave_3waySQL' where server_ip='$server_ip' and conf_exten='$conf_id';"
# we are a vicidial conference so we can single partisipants out.
$new_exten = $conf_hash{"$conf_id"}{"extension"};
$leave_3waySQL = '1';
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout3$/i) {$new_exten =~ s/Xtimeout3$/Xtimeout2/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout2$/i) {$new_exten =~ s/Xtimeout2$/Xtimeout1/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout1$/i) {$new_exten = ''; $leave_3waySQL='0';}
if ( ($conf_hash{"$conf_id"}{"extension"} !~ /Xtimeout\d$/i) and (length($conf_hash{"$conf_id"}{"extension"})> 0) ) {$new_exten .= 'Xtimeout3';}
if($DB){print STDERR "\n$conf_id|" . $conf_hash{"$conf_id"}{"extension"} . "|$new_exten|$leave_3waySQL|\n";}
event_logger($SYSLOG, "\n$conf_id|" . $conf_hash{"$conf_id"}{"extension"} . "|$new_exten|$leave_3waySQL|\n");
$kick = 0;
# timeout 1 has been reached kick the conference
if ($new_exten =~ /Xtimeout1$/i)
{
### Kick all participants if there are any left in the conference so it can be reused
$local_DEF = 'Local/5555';
$local_AMP = '@';
$kick_local_channel = $local_DEF . $conf_id . $local_AMP . $ext_context;
$padTDinc = sprintf("%03s", $TDinc); while (length($padTDinc) > 3) {chop($padTDinc);}
$queryCID = "ULGC$padTDinc$TDnum";
$stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$server_ip','','Originate','$queryCID','Channel: $kick_local_channel','Context: $ext_context','Exten: 8300','Priority: 1','Callerid: $queryCID','','','','','');";
$affected_rows = $dbhA->do($stmtA); # or die "Couldn't execute query:|$stmtA|\n";
if($DB){print STDERR "\n|$affected_rows|$stmtA|\n";}
event_logger($SYSLOG,"|$affected_rows|$stmtA|");
$TDinc++;
$kick = 1;
}
# update the conference records
if ($conf_hash{"$conf_id"}{"type"} eq "vc")
{
$stmtA = "UPDATE vicidial_conferences set extension='$new_exten',leave_3way='$leave_3waySQL' where server_ip='$server_ip' and conf_exten='$conf_id';";
}
else
{
$stmtA = "UPDATE vicidial_confbridges set extension='$new_exten',leave_3way='$leave_3waySQL' where server_ip='$server_ip' and conf_exten='$conf_id';"
}
if($DB){print STDERR "|room|$stmtA|\n";}
event_logger($SYSLOG,"|room|$stmtA|\n");
$affected_rows = $dbhA->do($stmtA);
# only sleep if we did a kick
if ($kick) { usleep(1*100*1000); }
}
if($DB){print STDERR "\n|$stmtA|\n";}
event_logger($SYSLOG,"\n|$stmtA|");
$affected_rows = $dbhA->do($stmtA);
# only sleep if we did a kick
if ($kick) { usleep(1*100*1000); }
}
}
# loop through the conferences
foreach $conf_id (keys %conf_hash)
{
# make sure the extension exists and is not blank
if (( exists $conf_hash{"$conf_id"}{"extension"} ) && ($conf_hash{"$conf_id"}{"extension"} ne ''))
{
# give debug details if there is a ConfError
if ($conf_hash{"$conf_id"}{"extension"} =~ /ConfError/i)
{
if($DB){print STDERR "Conference Error Detected in " . $conf_hash{"$conf_id"}{"type"} . " conferernce $conf_id\n";}
event_logger($SYSLOG,"Conference Error Detected in " . $conf_hash{"$conf_id"}{"type"} . " conferernce $conf_id\n");
}
# and deal with any that did not get processed
if (( exists $conf_hash{"$conf_id"}{"processed"} ) && ($conf_hash{"$conf_id"}{"processed"} == 0))
{
# we are a vicidial conference that did not appear in the AMI results
$new_exten = $conf_hash{"$conf_id"}{"extension"};
$leave_3waySQL = '1';
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout3$/i) {$new_exten =~ s/Xtimeout3$/Xtimeout2/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout2$/i) {$new_exten =~ s/Xtimeout2$/Xtimeout1/gi;}
if ($conf_hash{"$conf_id"}{"extension"} =~ /Xtimeout1$/i) {$new_exten = ''; $leave_3waySQL='0';}
if ( ($conf_hash{"$conf_id"}{"extension"} !~ /Xtimeout\d$/i) and (length($conf_hash{"$conf_id"}{"extension"})> 0) ) {$new_exten .= 'Xtimeout3';}
if($DB){print STDERR "\n$conf_id|" . $conf_hash{"$conf_id"}{"extension"} . "|$new_exten|$leave_3waySQL|\n";}
event_logger($SYSLOG, "\n$conf_id|" . $conf_hash{"$conf_id"}{"extension"} . "|$new_exten|$leave_3waySQL|\n");
$kick = 0;
# timeout 1 has been reached kick the conference
if ($new_exten =~ /Xtimeout1$/i)
{
### Kick all participants if there are any left in the conference so it can be reused
$local_DEF = 'Local/5555';
$local_AMP = '@';
$kick_local_channel = $local_DEF . $conf_id . $local_AMP . $ext_context;
$padTDinc = sprintf("%03s", $TDinc); while (length($padTDinc) > 3) {chop($padTDinc);}
$queryCID = "ULGC$padTDinc$TDnum";
$stmtA="INSERT INTO vicidial_manager values('','','$now_date','NEW','N','$server_ip','','Originate','$queryCID','Channel: $kick_local_channel','Context: $ext_context','Exten: 8300','Priority: 1','Callerid: $queryCID','','','','','');";
$affected_rows = $dbhA->do($stmtA); # or die "Couldn't execute query:|$stmtA|\n";
if($DB){print STDERR "\n|$affected_rows|$stmtA|\n";}
event_logger($SYSLOG,"|$affected_rows|$stmtA|");
$TDinc++;
$kick = 1;
}
# update the conference records
if ($conf_hash{"$conf_id"}{"type"} eq "vc")
{
$stmtA = "UPDATE vicidial_conferences set extension='$new_exten',leave_3way='$leave_3waySQL' where server_ip='$server_ip' and conf_exten='$conf_id';";
}
else
{
$stmtA = "UPDATE vicidial_confbridges set extension='$new_exten',leave_3way='$leave_3waySQL' where server_ip='$server_ip' and conf_exten='$conf_id';"
}
if($DB){print STDERR "|conf|$stmtA|\n";}
event_logger($SYSLOG,"|conf|$stmtA|");
$affected_rows = $dbhA->do($stmtA);
$conf_hash{"$conf_id"}{"processed"} = 1;
# only sleep if we did a kick
if ($kick) { usleep(1*100*1000); }
}
}
}
# reload the settings from the DB at a fixed interval
$epoch = time();
@@ -636,7 +764,7 @@ else
$settings_ref = get_server_settings($dbhA,$server_ip);
$loop_time_usec = $settings_ref->{'conf_update_interval'} * 1000000;
$loop_time_usec = ceil($loop_time_usec); # take care of any floating point math
$loop_time_usec = ceil($loop_time_usec); # take care of any floating point math
$vicidial_recording_limit = $settings_ref->{'vicidial_recording_limit'};
@@ -812,7 +940,9 @@ sub clear_conf_records
######################################################################
##### CLEAR vicidial_conferences ENTRIES IN LEAVE-3WAY FOR MORE THAN ONE HOUR
######################################################################
@MT = ();
##### Find date-time one hour in the past
$secX = time();
$TDtarget = ($secX - ($vicidial_recording_limit * 60));
@@ -830,7 +960,7 @@ sub clear_conf_records
$TDinc = 1;
@PTextensions=@MT; @PT_conf_extens=@MT; @PTmessages=@MT; @PTold_messages=@MT; @NEW_messages=@MT; @OLD_messages=@MT;
$stmtA = "SELECT conf_exten,extension from vicidial_conferences where server_ip='$server_ip' and leave_3way='1' and leave_3way_datetime < \"$TDSQLdate\";";
$stmtA = "SELECT conf_exten,extension from vicidial_conferences where server_ip='$server_ip' and leave_3way='1' and leave_3way_datetime < \"$TDSQLdate\" and leave_3way_datetime IS NOT NULL;";
if ($DB) {print "Conf Purge|$stmtA|\n";}
event_logger($SYSLOG,"Conf Purge|$stmtA|");
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
@@ -868,7 +998,7 @@ sub clear_conf_records
}
@PTextensions=@MT; @PT_conf_extens=@MT; @PTmessages=@MT; @PTold_messages=@MT; @NEW_messages=@MT; @OLD_messages=@MT;
$stmtA = "SELECT conf_exten,extension from vicidial_confbridges where server_ip='$server_ip' and leave_3way='1' and leave_3way_datetime < \"$TDSQLdate\";";
$stmtA = "SELECT conf_exten,extension from vicidial_confbridges where server_ip='$server_ip' and leave_3way='1' and leave_3way_datetime < \"$TDSQLdate\" and leave_3way_datetime IS NOT NULL;";
if ($DB) {print "ConfBridge Purge|$stmtA|\n";}
event_logger($SYSLOG,"ConfBridge Purge|$stmtA|");
$sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr;
+4 -2
View File
@@ -2052,7 +2052,8 @@ coldstorage_login VARCHAR(50) default '',
coldstorage_pass VARCHAR(50) default '',
coldstorage_port VARCHAR(10) default '',
stereo_recording ENUM('0','1','2','3','4','5','6') default '0',
enhanced_agent_monitoring ENUM('0','1','2','3','4','5','6') default '0'
enhanced_agent_monitoring ENUM('0','1','2','3','4','5','6') default '0',
agent_hide_dial_fail ENUM('0','1','2','3','4','5','6') default '0'
) ENGINE=MyISAM;
CREATE TABLE vicidial_campaigns_list_mix (
@@ -5731,6 +5732,7 @@ INSERT INTO vicidial_settings_containers(container_id,container_notes,container_
INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('EXAMPLE_VID_PROMPT_SPECIAL','Example Call Menu VID Special Container settings','CM_VIDPROMPT_SPECIAL','---ALL---','list_ingroup => 102,TEST_IN2\r\nlist_ingroup => 103,TEST_IN3\r\nlist_ingroup => 104,TEST_IN4\r\ndefault_ingroup => TEST_IN5\r\nnot_found_action => new_lead\r\nnew_lead_ingroup => TEST_IN');
INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('VERM_STATUS_NAMES_OVERRIDE','Override dialer status names in enhanced reporting','OTHER','---ALL---','; For each status name you want overridden, type the status followed by\r\n; a pipe, then the new status name\r\n; Ex:\r\n; NZ|Taumatawhakatangihangakoauauotamateaturipukakapikimaungahoronukupoka\r\n201214|Request To Cancel\r\n210200|No Answer-Incomplete Call\r\n210201|Contact Established\r\n210202|Provider Review - HB\r\n210203|Promise to Pay\r\n210204|Setup Payment Plan\r\n210205|Research-Inquiry\r\n210206|Voice Mail Left - HB\r\n210207|Do Not Call\r\n210208|Appeal Verification\r\n210209|Bad Phone\r\n210210|Bad Address\r\n210211|Direct Pay Verification\r\n210213|Provider Approved\r\n210215|Update Notes Only\r\n210216|Voicemail-No Status Change\r\n210217|Sent Letter Request - HB\r\n210218|Auto VoiceMail Left - HB\r\n210219|Auto VoiceMail-No Status Change\r\n210302|Provider Review - LB\r\n210306|Voice Mail Left - LB\r\n210317|Sent Letter Request - LB\r\n210318|Auto VoiceMail Left - LB\r\n211503|Provider - COVID-19\r\n211603|Transferred Call to MLA\r\n'), ('VERM_REPORT_OPTIONS','Container for customizing VERM report output','OTHER','---ALL---','; This is the report queue used if none is chosen by the user\r\n; It\'s preloaded in some forms as well\r\nVERM_default_report_queue => ALL\r\n\r\n; If there are statuses to exclude from reports, list them here\r\n; Separate with commas. Default is AFTHRS\r\nexc_addtl_statuses => AFTHRS\r\n\r\n; Set the below value to 1 (or anything non-blank/non-zero) in order to \r\n; show the agents ID in addition to their full name in the report results\r\nshow_full_agent_info => 1\r\n\r\n; Some reports count \"lost\" calls - which are defined by the below variable\r\n; listing what you define as \"lost\" dispos. Separate with commas.\r\nlost_statuses => LOST,210208,DISPO\r\n\r\n; You can create a detailed IVR survey report for ingroups by defining\r\n; \"ivr_survey_ingroups_detail\" and \"ivr_survey_ingroups_voicemails.\"\r\n; For \"details\", supply an ingroup used as a tracking group on call menus.\r\n; Then, add a pipe and after that list all call menus that use the ingroup\r\n; as the tracking group, separating each with a comma\r\n; To track whether the calls went to voicemail, list every call menu/option\r\n; combination that goes to voicemail, separating the call menu from the \r\n; option with a pipe. One callmenu/option combo per line.\r\nivr_survey_ingroups_detail => 521205|561401,561402,561403,561404,561505\r\nivr_survey_ingroups_voicemails => 561505|t\r\n\r\n; #####################################################\r\n; # ALL of the below are used in the wallboard report #\r\n; #####################################################\r\nVERM_default_outb_widget_queue => ALL_OUT\r\nVERM_default_inb_widget_queue1 => 514915v_USA_Shared\r\nVERM_default_inb_widget_queue2 => 515915v_MLA_Shared\r\n\r\n; Used specifically for the SLA widget\r\n; Uses ingroups - separate multiple ingroups by commas\r\n; Comment out or leave blank to count all ingroups\r\nSLA_LEVEL_PCT_ingroups => 514915v,515915v\r\n\r\n; This removes remote agents from the wallboard reports\r\n; Comment out to include remote agents (or set to zero)\r\nomit_remote_agents => 1\r\n\r\n\r\n; #### AUTO DOWNLOAD ####\r\n; If the "total calls" value on any report requested exceeds the below \r\n; limit, automatically download the three "DETAILS" reports instead\r\n; of attempting to display that many records on-screen\r\nauto_download_limit => 50000\r\n\r\n; #### OUTCOMES report overrides ####\r\n; Use "outcome_lagged_status_overrides" for conditions where the call \r\n; record in the vicidial_log or vicidial_closer_log table has no uniqueid\r\n; value despite having a status/outcome, which can indicate a call \r\n; affected by network lag for certain statuses. This will change the call \r\n; status to "LAGGED". Separate statuses with commas. Default is the \r\n; automatic "PU" status.\r\noutcome_lagged_status_overrides => PU\r\n\r\n; Use "unknown_network_statuses" to change call statuses to read "Network/\r\n; LAGGED" on the OUTCOMES report. Separate statuses with commas.\r\n; IMPORTANT: if you are using the outcome_lagged_status_overrides option \r\n; above, make sure "LAGGED" is one of the unknown_network_statuses here\r\n; unknown_network_statuses => LAGGED\r\n\r\n; Use "outcome_status_overrides" to change one status to another on the \r\n; OUTCOMES report. Overrides are comma-separated pairs of dispositions \r\n; where the first disposition is the disposition to change, and the second\r\n; is the disposition to change to. Separate pairs with a pipe character as\r\n; in the below example. Off by default.\r\n; outcome_status_overrides => CBHOLD,DISPO|XFER,AL');
INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('VICIDIAL_TIMEOFF_SETTINGS','Settings for time-off admin utility','OTHER','---ALL---','; Comma-delimited time-off codes - MANDATORY, must have at least one defined. \r\n; Default is \'VAC\' for vacation\r\ntimeoff_types => VAC\r\n\r\n; optional, if set to \'1\' will show all viewable agents, even ones with no \r\n; time off for month. Default is 0\r\ndisplay_all_agents => 0\r\n\r\n; optional, used to filter users displayed, in addition to user_group \r\n; permissions\r\nuser_filter_SQL => \r\n\r\n; optional, uses columns from vicidial_users table. Defaults to \r\n; full_name asc, user asc if commented out or non-existent\r\n; sort_SQL => full_name asc, user asc\r\n\r\n; include custom coding for misc download coding where \"custom_download\" \r\n; marked in agent_timeoff_script.php - DO NOT USE WITHOUT CODING KNOWLEDGE\r\n; set to \'1\' to activate\r\ncustom_download => 0');
INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('FAILED_DIAL_MESSAGE_OVERRIDE','Failed Dial Message Override','OTHER','---ALL---',"Unable to complete the call at this time.\nPlease try again later.");
INSERT INTO `wallboard_widgets` VALUES ('queues_widget_1','AGENTS_AND_QUEUES','queues','','TEXT',5,'N',1,'Queue Information','','',NULL,'','',NULL,2),('queues_widget_0','AGENTS_AND_QUEUES','queues','','LOGO',2,'N',1,NULL,'','',NULL,'','',NULL,1),('queues_widget_2','AGENTS_AND_QUEUES','queues','SLA Level %','SLA_LEVEL_PCT',1,'N',1,NULL,'','>60',NULL,'','',NULL,3),('queues_widget_3','AGENTS_AND_QUEUES','queues','Outbound calls','LIVE_QUEUE_INFO',1,'N',1,'','201201','','','','','yellow_alarm,|red_alarm,',4),('queues_widget_4','AGENTS_AND_QUEUES','queues','USA Ded Inbound','LIVE_QUEUE_INFO',1,'N',1,'','ALL_IN','','','','','yellow_alarm,|red_alarm,',5),('queues_widget_5','AGENTS_AND_QUEUES','queues','MLA Ded Inbound','LIVE_QUEUE_INFO',1,'N',1,'','514911','','','','','yellow_alarm,|red_alarm,',6),('queues_widget_6','AGENTS_AND_QUEUES','queues','N Waiting Calls','N_WAITING_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,7),('queues_widget_7','AGENTS_AND_QUEUES','queues','Offered Calls','OFFERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,8),('queues_widget_8','AGENTS_AND_QUEUES','queues','Answered Calls','ANSWERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,9),('queues_widget_9','AGENTS_AND_QUEUES','queues','Lost Calls','LOST_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,10),('queues_widget_10','AGENTS_AND_QUEUES','queues','Longest Wait','LONGEST_WAIT',1,'N',1,NULL,'','',NULL,'','',NULL,11),('queues_widget_11','AGENTS_AND_QUEUES','queues','Live Queues','LIVE_QUEUES',1,'Y',1,NULL,'','',NULL,'','',NULL,12),('queues_widget_12','AGENTS_AND_QUEUES','queues','Live Calls','LIVE_CALLS',1,'Y',2,NULL,'','',NULL,'','',NULL,13),('agent_widget_0','AGENTS_AND_QUEUES','agents','','LOGO',2,'N',1,NULL,'','',NULL,'','',NULL,1),('agent_widget_1','AGENTS_AND_QUEUES','agents','N Waiting Calls','N_WAITING_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,2),('agent_widget_2','AGENTS_AND_QUEUES','agents','Agents Ready','AGENTS_READY',1,'N',1,NULL,'','',NULL,'','',NULL,3),('agent_widget_3','AGENTS_AND_QUEUES','agents','Agents On Call','N_AGENTS_ON_CALL',1,'N',1,NULL,'','',NULL,'','',NULL,4),('agent_widget_4','AGENTS_AND_QUEUES','agents','N Answered Calls','N_ANSWERED_CALLS',1,'N',1,NULL,'','',NULL,'','',NULL,5),('agent_widget_5','AGENTS_AND_QUEUES','agents','Clock','CLOCK',1,'N',1,NULL,'','',NULL,'','',NULL,6),('agent_widget_6','AGENTS_AND_QUEUES','agents','Live Agents','LIVE_AGENTS',1,'Y',3,NULL,'','',NULL,'','',NULL,7);
@@ -5738,4 +5740,4 @@ INSERT INTO `wallboard_reports` VALUES ('AGENTS_AND_QUEUES','Agents and Queues',
UPDATE system_settings set vdc_agent_api_active='1';
UPDATE system_settings SET db_schema_version='1724',db_schema_update_date=NOW(),reload_timestamp=NOW();
UPDATE system_settings SET db_schema_version='1725',db_schema_update_date=NOW(),reload_timestamp=NOW();
+6
View File
@@ -2865,3 +2865,9 @@ ALTER TABLE inbound_disabled_entries MODIFY modify_date TIMESTAMP NOT NULL DEFAU
ALTER TABLE vicidial_timeoff_log MODIFY modify_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
UPDATE system_settings SET db_schema_version='1724',db_schema_update_date=NOW() where db_schema_version < 1724;
INSERT INTO vicidial_settings_containers(container_id,container_notes,container_type,user_group,container_entry) VALUES ('FAILED_DIAL_MESSAGE_OVERRIDE','Failed Dial Message Override','OTHER','---ALL---',"Unable to complete the call at this time.\nPlease try again later.");
ALTER TABLE system_settings ADD agent_hide_dial_fail ENUM('0','1','2','3','4','5','6') default '0';
UPDATE system_settings SET db_schema_version='1725',db_schema_update_date=NOW() where db_schema_version < 1725;
+31 -3
View File
@@ -745,10 +745,11 @@
# 240630-0920 - Fix for Group Alias issue #1515
# 240830-1112 - Added campaign manual_minimum_... settings
# 250207-1821 - Fix for JavaScript error if chat disabled
# 250326-2032 - Added agent_hide_dial_fail system_setting
#
$version = '2.14-711c';
$build = '250207-1821';
$version = '2.14-712c';
$build = '250326-2032';
$php_script = 'vicidial.php';
$mel=1; # Mysql Error Log enabled = 1
$mysql_log_count=103;
@@ -858,7 +859,7 @@ $random = (rand(1000000, 9999999) + 10000000);
#############################################
##### START SYSTEM_SETTINGS AND USER LANGUAGE LOOKUP #####
$stmt = "SELECT use_non_latin,vdc_header_date_format,vdc_customer_date_format,vdc_header_phone_format,webroot_writable,timeclock_end_of_day,vtiger_url,enable_vtiger_integration,outbound_autodial_active,enable_second_webform,user_territories_active,static_agent_url,custom_fields_enabled,pllb_grouping_limit,qc_features_active,allow_emails,callback_time_24hour,enable_languages,language_method,meetme_enter_login_filename,meetme_enter_leave3way_filename,enable_third_webform,default_language,active_modules,allow_chats,chat_url,default_phone_code,agent_screen_colors,manual_auto_next,agent_xfer_park_3way,admin_web_directory,agent_script,agent_push_events,agent_push_url,agent_logout_link,agentonly_callback_campaign_lock,manual_dial_validation,mute_recordings,enable_second_script,enable_first_webform,recording_buttons,outbound_cid_any,browser_call_alerts,manual_dial_phone_strip,require_password_length,pass_hash_enabled,agent_hidden_sound_seconds,agent_hidden_sound,agent_hidden_sound_volume,agent_screen_timer,agent_hide_hangup,allow_web_debug,max_logged_in_agents,login_kickall,agent_notifications,inbound_credits,two_factor_auth_agent_hours,two_factor_container,sip_event_logging,stereo_recording FROM system_settings;";
$stmt = "SELECT use_non_latin,vdc_header_date_format,vdc_customer_date_format,vdc_header_phone_format,webroot_writable,timeclock_end_of_day,vtiger_url,enable_vtiger_integration,outbound_autodial_active,enable_second_webform,user_territories_active,static_agent_url,custom_fields_enabled,pllb_grouping_limit,qc_features_active,allow_emails,callback_time_24hour,enable_languages,language_method,meetme_enter_login_filename,meetme_enter_leave3way_filename,enable_third_webform,default_language,active_modules,allow_chats,chat_url,default_phone_code,agent_screen_colors,manual_auto_next,agent_xfer_park_3way,admin_web_directory,agent_script,agent_push_events,agent_push_url,agent_logout_link,agentonly_callback_campaign_lock,manual_dial_validation,mute_recordings,enable_second_script,enable_first_webform,recording_buttons,outbound_cid_any,browser_call_alerts,manual_dial_phone_strip,require_password_length,pass_hash_enabled,agent_hidden_sound_seconds,agent_hidden_sound,agent_hidden_sound_volume,agent_screen_timer,agent_hide_hangup,allow_web_debug,max_logged_in_agents,login_kickall,agent_notifications,inbound_credits,two_factor_auth_agent_hours,two_factor_container,sip_event_logging,stereo_recording,agent_hide_dial_fail FROM system_settings;";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'01001',$VD_login,$server_ip,$session_name,$one_mysql_log);}
#if ($DB) {echo "$stmt\n";}
@@ -926,6 +927,7 @@ if ($qm_conf_ct > 0)
$SStwo_factor_container = $row[57];
$SSsip_event_logging = $row[58];
$SSstereo_recording = $row[59];
$SSagent_hide_dial_fail = $row[60];
if ( ($SSagent_hidden_sound == '---NONE---') or ($SSagent_hidden_sound == '') ) {$SSagent_hidden_sound_seconds=0;}
}
else
@@ -1142,6 +1144,25 @@ if ( ($SSweb_logo!='default_new') and ($SSweb_logo!='default_old') )
}
##### END Define colors and logo #####
# gather dial error override message, if enabled
$agent_hide_dial_fail_MESSAGE='';
if (preg_match("/1|2/",$SSagent_hide_dial_fail))
{
$agent_hide_dial_fail_MESSAGE='Dial Failed';
$stmt="SELECT container_entry FROM vicidial_settings_containers WHERE container_id='FAILED_DIAL_MESSAGE_OVERRIDE';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($mel > 0) {mysql_error_logging($NOW_TIME,$link,$mel,$stmt,'01XXX',$VD_login,$server_ip,$session_name,$one_mysql_log);}
if ($DB) {echo "$stmt\n";}
$stde_ct = mysqli_num_rows($rslt);
if ($stde_ct > 0)
{
$row=mysqli_fetch_row($rslt);
$agent_hide_dial_fail_MESSAGE = preg_replace("/\r|\n|\"/",'<br>',$row[0]);
}
}
$hide_gender=0;
$dialRegExten_enabled=0;
$US='_';
@@ -6801,6 +6822,8 @@ if ($enable_fast_refresh < 1) {echo "\tvar refresh_interval = 1000;\n";}
var HTheight='<?php echo $HTheight ?>';
var HKheightS='<?php echo $HKheightS ?>';
var HTheightS='<?php echo $HTheightS ?>';
var agent_hide_dial_fail='<?php echo $SSagent_hide_dial_fail ?>';
var agent_hide_dial_fail_MESSAGE="<?php echo $agent_hide_dial_fail_MESSAGE ?>";
var DiaLControl_auto_HTML = "<a href=\"#\" onclick=\"AutoDial_ReSume_PauSe('VDADready','','','','','','','YES');\"><img src=\"./images/<?php echo _QXZ("vdc_LB_paused.gif") ?>\" border=\"0\" alt=\"You are paused\" /></a>";
var DiaLControl_auto_HTML_ready = "<a href=\"#\" onclick=\"AutoDial_ReSume_PauSe('VDADpause','','','','','','','YES');\"><img src=\"./images/<?php echo _QXZ("vdc_LB_active.gif") ?>\" border=\"0\" alt=\"You are active\" /></a>";
var DiaLControl_auto_HTML_OFF = "<img src=\"./images/<?php echo _QXZ("vdc_LB_blank_OFF.gif") ?>\" border=\"0\" alt=\"pause button disabled\" />";
@@ -21267,6 +21290,11 @@ function phone_number_format(formatphone) {
var next_action=0;
if (taskaction == 'DiaLAlerT')
{
if ( (agent_hide_dial_fail == '1') && (agent_hide_dial_fail_MESSAGE.length > 0) )
{
taskdialalert = agent_hide_dial_fail_MESSAGE;
}
document.getElementById("TimerContentSpan").innerHTML = "<b><?php echo _QXZ("DIAL ALERT:"); ?><br /><br />" + taskdialalert.replace("\n","<br />") + "</b>";
showDiv('TimerSpan');
+10 -4
View File
File diff suppressed because one or more lines are too long
+2 -1
View File
@@ -1,4 +1,4 @@
# version: 20250131191301
# version: 20250326201901
users-user User ID <QXZ>This field is where you put the users ID number, can be up to 20 digits in length, Must be at least 2 characters in length. We strongly recommend not reusing user accounts for different users, for reporting accuracy. To disable a user account, set the Active option to -N-.</QXZ>
users-pass Password <QXZ>This field is where you put the users password. Must be at least 2 characters in length, unless the User Password Minimum Length system setting is enabled, which will require a longer password. Only letters and numbers are allowed in user passwords. A medium strength user password will be at least 10 characters in length, and a strong user password will be at least 20 characters in length and have letters as well as at least one number. It is recommended that you use a longer password if possible, stringing together several unrelated words with no spaces, and a number somewhere in the string. The maximum size of a password is 100 characters.</QXZ>
users-force_change_password Force Change Password <QXZ>If this option is set to Y then the user will be prompted to change their password the next time they log in to the administration webpage or the agent screen. Default is N.</QXZ>
@@ -1131,6 +1131,7 @@ settings-agent_xfer_park_3way Agent Screen Park Xfer Button <QXZ>This option def
settings-agent_logout_link Agent Screen Logout Link Credentials <QXZ>This option controls whether the agent screen logout link will contain the agent credentials as a part of the link, or if the link will go to a blank login page. -0- will go to a blank form and -1- will go to a form that has the user credentials filled in.</QXZ>
settings-agent_soundboards Agent Soundboards <QXZ>This option allows you to create agent soundboards that allow an agent in the user screen to click on audio files to have them play in their session. Default is 0 for disabled.</QXZ>
settings-browser_call_alerts Agent Browser Call Alerts <QXZ>This option, if enabled, will allow you to select a sound, at the campaign level, when a call arrives in an agent session, to be played by the web browser program that the agent is using to log into the Agent Screen with. This is only recommended for agents using softphones or webphones. If you decide to use this option, you may want to contact your system administrator to disable the default enter and leave session sounds on your dialers. Default is 0 for disabled.</QXZ>
settings-agent_hide_dial_fail Hide Agent Failed Dial Codes <QXZ>This option will hide the agent screen DIAL ALERT messages for failed manual dial outbound calls and replace them with the contents of the FAILED_DIAL_MESSAGE_OVERRIDE Settings Container. Default is 0 for disabled.</QXZ>
settings-login_kickall Agent Login Kick-all <QXZ>If enabled, when an agent logs into the agent screen, any channels that were already in the agent session will be hung up before the agent is placed into the session. This will delay the agent login by a couple of seconds. Default is 0 for disabled.</QXZ>
settings-agent_hidden_sound Agent Hidden Browser Sound <QXZ>This feature will allow you to have the selected sound file played to the Agent Screen when the web browser window with the Agent Screen in it is hidden or the agent changes to a different application on their computer. To enable this feature, the Agent Hidden Browser Sound Seconds below must be greater than 0. This feature can be used to disable web browser javascript throttling if set to an audible sound at a 20 second interval. We have tested this with the -click_quiet- sound file at a volume of -25-. We have also tested the -20Hz_tone- sound file at the same volume and Sound Seconds set to -5-.</QXZ>
settings-agent_hidden_sound_seconds Agent Hidden Browser Sound Seconds <QXZ>This is the interval at which the selected Agent Hidden Browser Sound above will be played. If this is set to 20, then the Agent Hidden Browser Sound will be played every 20 seconds that the agent screen is hidden from view. Default is 0 for disabled.</QXZ>