Added the AUTONEXT hopper_hold_inserts campaign option

Updates for inbound email parser perl script

git-svn-id: svn://192.168.202.10@3808 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
mattf
2024-02-25 19:45:59 +00:00
parent 22d6975960
commit 69b9904b2b
11 changed files with 327 additions and 95 deletions
+5 -4
View File
@@ -158,9 +158,10 @@
# 231116-0911 - Added hopper_hold_inserts option # 231116-0911 - Added hopper_hold_inserts option
# 231129-0901 - Added vicidial_phone_number_call_daily_counts updates/inserts # 231129-0901 - Added vicidial_phone_number_call_daily_counts updates/inserts
# 240219-1524 - Added daily_limit in-group parameter # 240219-1524 - Added daily_limit in-group parameter
# 240225-0951 - Added AUTONEXT hopper_hold_inserts option
# #
$build='240219-1524'; $build='240225-0951';
$script='AST_VDauto_dial'; $script='AST_VDauto_dial';
### begin parsing run-time options ### ### begin parsing run-time options ###
if (length($ARGV[0])>1) if (length($ARGV[0])>1)
@@ -3297,7 +3298,7 @@ while($one_day_interval > 0)
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25',source='A';"; $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25',source='A';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
$event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &event_logger; $event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &event_logger;
@@ -3403,7 +3404,7 @@ while($one_day_interval > 0)
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20',source='A';"; $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20',source='A';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
$event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &event_logger; $event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &event_logger;
@@ -3555,7 +3556,7 @@ while($one_day_interval > 0)
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15',source='A';"; $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$CLlead_id',campaign_id='$CLcampaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15',source='A';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
$event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &event_logger; $event_string = "-- VDH record inserted: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &event_logger;
+8 -7
View File
@@ -22,7 +22,7 @@
# - S = Standard hopper load # - S = Standard hopper load
# - D = Campaign Drop-Run # - D = Campaign Drop-Run
# #
# Copyright (C) 2023 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2 # Copyright (C) 2024 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
# #
# CHANGELOG # CHANGELOG
# 50810-1613 - Added database server variable definitions lookup # 50810-1613 - Added database server variable definitions lookup
@@ -110,10 +110,11 @@
# 231116-0821 - Added hopper_hold_inserts system and campaign settings options # 231116-0821 - Added hopper_hold_inserts system and campaign settings options
# 231126-1748 - Added RQUEUE hopper status # 231126-1748 - Added RQUEUE hopper status
# 231129-1051 - Added daily_phone_number_call_limit campaign setting # 231129-1051 - Added daily_phone_number_call_limit campaign setting
# 240225-0954 - Added AUTONEXT hopper_hold_inserts campaign option
# #
# constants # constants
$build = '231129-1051'; $build = '240225-0954';
$script='AST_VDhopper'; $script='AST_VDhopper';
$DB=0; # Debug flag, set to 0 for no debug messages. Can be overriden with CLI --debug flag $DB=0; # Debug flag, set to 0 for no debug messages. Can be overriden with CLI --debug flag
$US='__'; $US='__';
@@ -761,7 +762,7 @@ if ($CBHOLD_count > 0)
&event_logger; &event_logger;
$hopper_statusSQL=''; $hopper_statusSQL='';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_statusSQL = ",status='RHOLD'";} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_statusSQL = ",status='RHOLD'";}
$stmtA = "INSERT INTO $vicidial_hopper SET lead_id='$CA_lead_id[$CAu]',campaign_id='$CA_campaign_id[$CAu]',list_id='$CA_list_id[$CAu]',gmt_offset_now='$CA_gmt_offset_now[$CAu]',user='',state=\"$CA_state[$CAu]\",priority='50',source='C',vendor_lead_code=\"$CA_vendor_lead_code[$CAu]\"$hopper_statusSQL;"; $stmtA = "INSERT INTO $vicidial_hopper SET lead_id='$CA_lead_id[$CAu]',campaign_id='$CA_campaign_id[$CAu]',list_id='$CA_list_id[$CAu]',gmt_offset_now='$CA_gmt_offset_now[$CAu]',user='',state=\"$CA_state[$CAu]\",priority='50',source='C',vendor_lead_code=\"$CA_vendor_lead_code[$CAu]\"$hopper_statusSQL;";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
if ($DB) {print "ANYONE Scheduled Callback Inserted into hopper: $affected_rows|$CA_lead_id[$CAu]\n";} if ($DB) {print "ANYONE Scheduled Callback Inserted into hopper: $affected_rows|$CA_lead_id[$CAu]\n";}
@@ -958,7 +959,7 @@ if ($hopper_dnc_count > 0)
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "UPDATE $vicidial_hopper SET status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25' where hopper_id='$AAD_hopper_id[$aad]';"; $stmtA = "UPDATE $vicidial_hopper SET status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25' where hopper_id='$AAD_hopper_id[$aad]';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
if ($DB) {$event_string = "-- VDH record updated: |$affected_rows| |$stmtA|"; &event_logger;} if ($DB) {$event_string = "-- VDH record updated: |$affected_rows| |$stmtA|"; &event_logger;}
@@ -1068,7 +1069,7 @@ if ($hopper_dnc_count > 0)
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "UPDATE $vicidial_hopper SET status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20' where hopper_id='$AAD_hopper_id[$aad]';"; $stmtA = "UPDATE $vicidial_hopper SET status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20' where hopper_id='$AAD_hopper_id[$aad]';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
if ($DB) {$event_string = "-- VDH record updated: |$affected_rows| |$stmtA|"; &event_logger;} if ($DB) {$event_string = "-- VDH record updated: |$affected_rows| |$stmtA|"; &event_logger;}
@@ -1222,7 +1223,7 @@ if ($hopper_dnc_count > 0)
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "UPDATE $vicidial_hopper SET status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15' where hopper_id='$AAD_hopper_id[$aad]';"; $stmtA = "UPDATE $vicidial_hopper SET status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15' where hopper_id='$AAD_hopper_id[$aad]';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
if ($DB) {$event_string = "-- VDH record updated: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &event_logger;} if ($DB) {$event_string = "-- VDH record updated: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &event_logger;}
@@ -3659,7 +3660,7 @@ foreach(@campaign_id)
if ( ($DCCLlead == '0') && ($TFHCCLlead == '0') ) if ( ($DCCLlead == '0') && ($TFHCCLlead == '0') )
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($hopper_hold_inserts[$i] =~ /ENABLED/) {$hopper_status='RHOLD';} if ($hopper_hold_inserts[$i] =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "INSERT INTO $vicidial_hopper (lead_id,campaign_id,status,user,list_id,gmt_offset_now,state,priority,source,vendor_lead_code) values('$leads_to_hopper[$h]','$campaign_id[$i]','$hopper_status','','$lists_to_hopper[$h]','$gmt_to_hopper[$h]',\"$state_to_hopper[$h]\",'$hopperPRIORITY','$source_to_hopper[$h]',\"$vlc_to_hopper[$h]\");"; $stmtA = "INSERT INTO $vicidial_hopper (lead_id,campaign_id,status,user,list_id,gmt_offset_now,state,priority,source,vendor_lead_code) values('$leads_to_hopper[$h]','$campaign_id[$i]','$hopper_status','','$lists_to_hopper[$h]','$gmt_to_hopper[$h]',\"$state_to_hopper[$h]\",'$hopperPRIORITY','$source_to_hopper[$h]',\"$vlc_to_hopper[$h]\");";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
$DBinserted = ($DBinserted + $affected_rows); $DBinserted = ($DBinserted + $affected_rows);
+60 -5
View File
@@ -10,7 +10,7 @@ use Encode qw(from_to decode encode);
use MIME::Base64; use MIME::Base64;
use MIME::QuotedPrint; use MIME::QuotedPrint;
# Copyright (C) 2017 Matt Florell, Joe Johnson <vicidial@gmail.com> LICENSE: AGPLv2 # Copyright (C) 2024 Matt Florell, Joe Johnson <vicidial@gmail.com> LICENSE: AGPLv2
# #
# AST_inbound_email_parser.pl - This script is essential for periodically checking any active POP3 or IMAP # AST_inbound_email_parser.pl - This script is essential for periodically checking any active POP3 or IMAP
# email accounts set up through the Vicidial admin. # email accounts set up through the Vicidial admin.
@@ -66,6 +66,7 @@ use MIME::QuotedPrint;
# 161014-2200 - Bug patch for "&nbsp;" string in email message # 161014-2200 - Bug patch for "&nbsp;" string in email message
# 170523-1319 - file attachment patch, issue #1014 # 170523-1319 - file attachment patch, issue #1014
# 171026-0106 - Added optional queue_log logging # 171026-0106 - Added optional queue_log logging
# 240225-1442 - Changes for perl module compatibility and attachment compatibility
# #
# default path to astguiclient configuration file: # default path to astguiclient configuration file:
@@ -291,7 +292,7 @@ while (@row=$rslt->fetchrow_array) {
( Proto => 'tcp', ( Proto => 'tcp',
PeerAddr => "$VARemail_server", PeerAddr => "$VARemail_server",
PeerPort => 993, # IMAP over SSL standard port PeerPort => 993, # IMAP over SSL standard port
SSL_verify_mode => 'SSL_VERIFY_NONE', SSL_verify_mode => SSL_VERIFY_NONE,
), ),
); );
} }
@@ -479,6 +480,30 @@ while (@row=$rslt->fetchrow_array) {
case "text/plain" {$attachment_fulltype="TXT";} case "text/plain" {$attachment_fulltype="TXT";}
case "application/vnd.oasis.opendocument.text" {$attachment_fulltype="ODT";} case "application/vnd.oasis.opendocument.text" {$attachment_fulltype="ODT";}
case "application/vnd.oasis.opendocument.spreadsheet" {$attachment_fulltype="ODS";} case "application/vnd.oasis.opendocument.spreadsheet" {$attachment_fulltype="ODS";}
case "application/vnd.ms-excel.sheet.binary.macroenabled.12" {$attachment_fulltype="XLSB";}
case "application/vnd.ms-excel.sheet.macroenabled.12" {$attachment_fulltype="XLSM";}
case "application/vnd.ms-excel.template.macroenabled.12" {$attachment_fulltype="XLTM";}
case "application/vnd.ms-word.document.macroenabled.12" {$attachment_fulltype="DOCM";}
case "application/vnd.ms-word.template.macroenabled.12" {$attachment_fulltype="DOTM";}
case "application/vnd.openxmlformats-officedocument.presentationml.presentation" {$attachment_fulltype="PPTX";}
case "application/vnd.openxmlformats-officedocument.presentationml.slideshow" {$attachment_fulltype="PPSX";}
case "application/vnd.openxmlformats-officedocument.presentationml.template" {$attachment_fulltype="POTX";}
case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" {$attachment_fulltype="XLSX";}
case "application/vnd.openxmlformats-officedocument.spreadsheetml.template" {$attachment_fulltype="XLTX";}
case "application/vnd.openxmlformats-officedocument.wordprocessingml.document" {$attachment_fulltype="DOCX";}
case "application/vnd.openxmlformats-officedocument.wordprocessingml.template" {$attachment_fulltype="DOTX";}
case "application/vnd.visio" {$attachment_fulltype="VSD";}
case "application/x-7z-compressed" {$attachment_fulltype="7Z";}
case "application/xhtml+xml" {$attachment_fulltype="XHTML";}
case "application/xml" {$attachment_fulltype="XML";}
case "application/x-msaccess" {$attachment_fulltype="MDB";}
case "application/x-mspublisher" {$attachment_fulltype="PUB";}
case "application/x-rar-compressed" {$attachment_fulltype="RAR";}
case "image/emf" {$attachment_fulltype="EMF";}
case "image/tiff" {$attachment_fulltype="TIF";}
case "image/wmf" {$attachment_fulltype="WMF";}
case "text/html" {$attachment_fulltype="HTML";}
case "text/vcard-contact" {$attachment_fulltype="VCF";}
} }
if ($sub_content_disposition=~/filename\=\"?(.*?)\"?$|filename=\"[^\"]+\"/i) {$attachment_filename=$&;} if ($sub_content_disposition=~/filename\=\"?(.*?)\"?$|filename=\"[^\"]+\"/i) {$attachment_filename=$&;}
if (length($attachment_filename)==0) { if (length($attachment_filename)==0) {
@@ -507,7 +532,7 @@ while (@row=$rslt->fetchrow_array) {
if ($DB) {print "!!!!WARNING - Found valid attachment, type $attachment_type \n Attachment does not have file name. Skipping...\n";} if ($DB) {print "!!!!WARNING - Found valid attachment, type $attachment_type \n Attachment does not have file name. Skipping...\n";}
} }
} else { } else {
if ($DB) {print "!!!!WARNING - Found attachment $attachment_filename, but is NOT a valid file type \n Attachment type is $attachment_type. Skipping...\n";} if ($DB) {print "!!!!WARNING - Found attachment $attachment_filename, but is NOT a valid file type \n Attachment type is $attachment_type ($attachment_fulltype). Skipping...\n";}
} }
} }
# print "\n"; # print "\n";
@@ -600,7 +625,10 @@ while (@row=$rslt->fetchrow_array) {
my @lead_id_row=$vicidial_lead_check_rslt->fetchrow_array; my @lead_id_row=$vicidial_lead_check_rslt->fetchrow_array;
$lead_id=$lead_id_row[0]; $lead_id=$lead_id_row[0];
} else { } else {
my $vicidial_list_stmt="insert into vicidial_list(list_id, email, comments, status, entry_date, phone_code) values('$default_list_id', '$email_from', '".substr($message,0,255)."', '$status', NOW(), '$SSdefault_phone_code')"; StripHTML();
$vl_message=substr($message,0,255);
$vl_message=~s/\\+$//gi;
my $vicidial_list_stmt="insert into vicidial_list(list_id, email, comments, status, entry_date, phone_code) values('$default_list_id', '$email_from', '$vl_message', '$status', NOW(), '$SSdefault_phone_code')";
if ($DBX) {print $vicidial_list_stmt;} if ($DBX) {print $vicidial_list_stmt;}
my $vicidial_list_rslt=$dbhA->prepare($vicidial_list_stmt); my $vicidial_list_rslt=$dbhA->prepare($vicidial_list_stmt);
if ($vicidial_list_rslt->execute()) { if ($vicidial_list_rslt->execute()) {
@@ -843,6 +871,30 @@ while (@row=$rslt->fetchrow_array) {
case "text/plain" {$attachment_fulltype="TXT";} case "text/plain" {$attachment_fulltype="TXT";}
case "application/vnd.oasis.opendocument.text" {$attachment_fulltype="ODT";} case "application/vnd.oasis.opendocument.text" {$attachment_fulltype="ODT";}
case "application/vnd.oasis.opendocument.spreadsheet" {$attachment_fulltype="ODS";} case "application/vnd.oasis.opendocument.spreadsheet" {$attachment_fulltype="ODS";}
case "application/vnd.ms-excel.sheet.binary.macroenabled.12" {$attachment_fulltype="XLSB";}
case "application/vnd.ms-excel.sheet.macroenabled.12" {$attachment_fulltype="XLSM";}
case "application/vnd.ms-excel.template.macroenabled.12" {$attachment_fulltype="XLTM";}
case "application/vnd.ms-word.document.macroenabled.12" {$attachment_fulltype="DOCM";}
case "application/vnd.ms-word.template.macroenabled.12" {$attachment_fulltype="DOTM";}
case "application/vnd.openxmlformats-officedocument.presentationml.presentation" {$attachment_fulltype="PPTX";}
case "application/vnd.openxmlformats-officedocument.presentationml.slideshow" {$attachment_fulltype="PPSX";}
case "application/vnd.openxmlformats-officedocument.presentationml.template" {$attachment_fulltype="POTX";}
case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" {$attachment_fulltype="XLSX";}
case "application/vnd.openxmlformats-officedocument.spreadsheetml.template" {$attachment_fulltype="XLTX";}
case "application/vnd.openxmlformats-officedocument.wordprocessingml.document" {$attachment_fulltype="DOCX";}
case "application/vnd.openxmlformats-officedocument.wordprocessingml.template" {$attachment_fulltype="DOTX";}
case "application/vnd.visio" {$attachment_fulltype="VSD";}
case "application/x-7z-compressed" {$attachment_fulltype="7Z";}
case "application/xhtml+xml" {$attachment_fulltype="XHTML";}
case "application/xml" {$attachment_fulltype="XML";}
case "application/x-msaccess" {$attachment_fulltype="MDB";}
case "application/x-mspublisher" {$attachment_fulltype="PUB";}
case "application/x-rar-compressed" {$attachment_fulltype="RAR";}
case "image/emf" {$attachment_fulltype="EMF";}
case "image/tiff" {$attachment_fulltype="TIF";}
case "image/wmf" {$attachment_fulltype="WMF";}
case "text/html" {$attachment_fulltype="HTML";}
case "text/vcard-contact" {$attachment_fulltype="VCF";}
} }
if ($sub_content_disposition=~/filename\=\"?(.*?)\"?$|filename=\"[^\"]+\"/i) {$attachment_filename=$&;} if ($sub_content_disposition=~/filename\=\"?(.*?)\"?$|filename=\"[^\"]+\"/i) {$attachment_filename=$&;}
if (length($attachment_filename)==0) { if (length($attachment_filename)==0) {
@@ -974,7 +1026,10 @@ while (@row=$rslt->fetchrow_array) {
my @lead_id_row=$vicidial_lead_check_rslt->fetchrow_array; my @lead_id_row=$vicidial_lead_check_rslt->fetchrow_array;
$lead_id=$lead_id_row[0]; $lead_id=$lead_id_row[0];
} else { } else {
my $vicidial_list_stmt="insert into vicidial_list(list_id, email, comments, status, entry_date, phone_code) values('$default_list_id', '$email_from', '".substr($message,0,255)."', '$status', NOW(), '$SSdefault_phone_code')"; StripHTML();
$vl_message=substr($message, 0, 255);
$vl_message=~s/\\+$//gi;
my $vicidial_list_stmt="insert into vicidial_list(list_id, email, comments, status, entry_date, phone_code) values('$default_list_id', '$email_from', '$vl_message', '$status', NOW(), '$SSdefault_phone_code')";
if ($DBX) {print $vicidial_list_stmt."\n";} if ($DBX) {print $vicidial_list_stmt."\n";}
my $vicidial_list_rslt=$dbhA->prepare($vicidial_list_stmt); my $vicidial_list_rslt=$dbhA->prepare($vicidial_list_stmt);
if ($vicidial_list_rslt->execute()) { if ($vicidial_list_rslt->execute()) {
+5 -4
View File
@@ -25,7 +25,7 @@
# exten => h,1,DeadAGI(agi://127.0.0.1:4577/call_log--HVcauses--PRI-----NODEBUG-----${HANGUPCAUSE}-----${DIALSTATUS}-----${DIALEDTIME}-----${ANSWEREDTIME}) # exten => h,1,DeadAGI(agi://127.0.0.1:4577/call_log--HVcauses--PRI-----NODEBUG-----${HANGUPCAUSE}-----${DIALSTATUS}-----${DIALEDTIME}-----${ANSWEREDTIME})
# #
# #
# Copyright (C) 2023 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2 # Copyright (C) 2024 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
# #
# CHANGELOG: # CHANGELOG:
# 61010-1007 - First test build # 61010-1007 - First test build
@@ -99,6 +99,7 @@
# 230120-1557 - Added CAMPDTO dialplan variable for ^DC 3-way agent screen calls # 230120-1557 - Added CAMPDTO dialplan variable for ^DC 3-way agent screen calls
# 231116-0846 - Added hopper_hold_inserts option # 231116-0846 - Added hopper_hold_inserts option
# 231118-1054 - Added hangup processing of 3-way press outside-agent calls # 231118-1054 - Added hangup processing of 3-way press outside-agent calls
# 240225-0957 - Added AUTONEXT hopper_hold_inserts campaign option
# #
# defaults for PreFork # defaults for PreFork
@@ -2290,7 +2291,7 @@ sub process_request
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25',source='A';"; $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ALT',user='',priority='25',source='A';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &agi_output;} if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &agi_output;}
@@ -2398,7 +2399,7 @@ sub process_request
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20',source='A';"; $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='ADDR3',user='',priority='20',source='A';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &agi_output;} if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|"; &agi_output;}
@@ -2548,7 +2549,7 @@ sub process_request
if ($passed_24hour_call_count > 0) if ($passed_24hour_call_count > 0)
{ {
$hopper_status='READY'; $hopper_status='READY';
if ($VD_hopper_hold_inserts =~ /ENABLED/) {$hopper_status='RHOLD';} if ($VD_hopper_hold_inserts =~ /ENABLED|AUTONEXT/) {$hopper_status='RHOLD';}
$stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15',source='A';"; $stmtA = "INSERT INTO vicidial_hopper SET lead_id='$VD_lead_id',campaign_id='$VD_campaign_id',status='$hopper_status',list_id='$VD_list_id',gmt_offset_now='$VD_gmt_offset_now',state='$VD_state',alt_dial='X$Xlast',user='',priority='15',source='A';";
$affected_rows = $dbhA->do($stmtA); $affected_rows = $dbhA->do($stmtA);
if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &agi_output;} if ($AGILOG) {$agi_string = "-- VDH record inserted: |$affected_rows| |$stmtA|X$Xlast|$VD_altdial_id|"; &agi_output;}
+9 -5
View File
@@ -1,10 +1,12 @@
HUMAN CALL INDICATOR(HCI) DOC Started: 2023-11-08 Updated: 2023-11-27 HUMAN CALL INDICATOR(HCI) DOC Started: 2023-11-08 Updated: 2024-02-25
This document will go over how to set up the Human Call Indicator screen on your system, with Hopper Hold Inserts for campaigns. This document will go over how to set up the Human Call Indicator screen on your system, with Hopper Hold Inserts for campaigns.
NOTE: This requires svn/trunk revision 3779 or higher!!! NOTE: This requires svn/trunk revision 3779 or higher!!!
NOTE: AUTONEXT mode was added in svn/trunk revision 3808.
What is an Human Call Indicator screen? What is an Human Call Indicator screen?
@@ -15,7 +17,7 @@ On the admin side, to enable the HCI screen, the System Settings "Lead Hopper Ho
For a user to log into the HCI screen, they must have their User's "HCI Enabled" option enabled. For a user to log into the HCI screen, they must have their User's "HCI Enabled" option enabled.
The user can get to the HCI screen from the link on the Welcome page(HOME). Once logged in to the HCI screen, the user must select the campaign that they want to initiate calls from, then they will see the active HCI screen with phone numbers to click on (on the left side), and a summary screen (on the right side). When an agent clicks on one of the phone numbers, they will see a confirmation pop-up panel asking them to confirm that they want this number to be called. If the user confirms this propt, then the call can be placed by the system and the phone number's button will disappear from the left side of the screen and the other phone numbers will shift to fill in the empty space. The user can get to the HCI screen from the link on the Welcome page(HOME). Once logged in to the HCI screen, the user must select the campaign that they want to initiate calls from, then they will see the active HCI screen with phone numbers to click on (on the left side), and a summary screen (on the right side). When an agent clicks on one of the phone numbers, they will see a confirmation pop-up panel asking them to confirm that they want this number to be called (in AUTONEXT mode, the confimation panel will pop-up automatically). If the user confirms this propt, then the call can be placed by the system and the phone number's button will disappear from the left side of the screen and the other phone numbers will shift to fill in the empty space. In AUTONEXT mode, the agent does not need to click on the next phone number, as soon as they confirm a phone number the next phone number's confirmation panel will automaticaly pop-up.
The statistics on the right side of the screen show the following metrics: The statistics on the right side of the screen show the following metrics:
1. Calls in Progress - the number of dialed but not-yet-answered calls active at this moment, does not include calls where agents are talking to customers 1. Calls in Progress - the number of dialed but not-yet-answered calls active at this moment, does not include calls where agents are talking to customers
@@ -33,15 +35,17 @@ How do I configure this on my system?
No configuration is needed other than activating Hopper Hold Inserts for the system and campaigns, as well as activating the HCI Enabled setting for the users that you want to access the HCI screen. No configuration is needed other than activating Hopper Hold Inserts for the system and campaigns, as well as activating the HCI Enabled setting for the users that you want to access the HCI screen.
You can also enable the AUTONEXT mode of the HCI screen by setting the System Setting "Hopper Hold Inserts" to '2', the campaign "Hopper Hold Inserts" setting to 'AUTONEXT' and the Users' "HCI Enabled" setting to '2'.
What are the limitations of the HCI screen? What are the limitations of the HCI screen?
The HCI screen will reserve leads from the hopper that are on HOLD for each user that is logged into the HCI screen, these HOLD hopper leads are refreshed as the HCI screen user confirms phone calls, and no more than 40 calls can be initiated within 4 seconds, although in our testing we've never been able to get anywhere close to that rate. The HCI screen will reserve leads from the hopper that are on HOLD for each user that is logged into the HCI screen, these HOLD hopper leads are refreshed as the HCI screen user confirms phone calls, and no more than 40 calls can be initiated within 4 seconds (or 120 calls in 2 seconds in AUTONEXT mode), although in our testing we've never been able to get anywhere close to that rate.
If the HCI screen user does not confirm any phone calls for 5 minutes, the system will reset their reserved hopper leads and allow their HCI screen to reserve new ones. This is done to ensure the freshness of the hopper leads being confirmed through the HCI screen. If the HCI screen user does not confirm any phone calls for 5 minutes, the system will reset their reserved hopper leads and allow their HCI screen to reserve new ones. This is done to ensure the freshness of the hopper leads being confirmed through the HCI screen.
Since the HCI screen will reserve 40 hopper HOLD leads for each logged-in HCI screen user, you may need to raise your campaign Hopper Level depending on how many HCI screen users you will want to have logged in at any one time. Since the HCI screen will reserve 40 hopper HOLD leads for each logged-in HCI screen user (or 120 leads in AUTONEXT mode), you may need to raise your campaign Hopper Level depending on how many HCI screen users you will want to have logged in at any one time.
@@ -59,7 +63,7 @@ DATABASE CHANGES FOR REFERENCE ONLY!!!!!!!!!
ALTER TABLE system_settings ADD hopper_hold_inserts ENUM('0','1','2','3','4','5','6','7') default '0'; ALTER TABLE system_settings ADD hopper_hold_inserts ENUM('0','1','2','3','4','5','6','7') default '0';
ALTER TABLE vicidial_campaigns ADD hopper_hold_inserts ENUM('ENABLED','DISABLED') default 'DISABLED'; ALTER TABLE vicidial_campaigns ADD hopper_hold_inserts ENUM('ENABLED','DISABLED','AUTONEXT') default 'DISABLED';
ALTER TABLE vicidial_hopper MODIFY status ENUM('READY','QUEUE','INCALL','DONE','HOLD','DNC','RHOLD','RQUEUE') default 'READY'; ALTER TABLE vicidial_hopper MODIFY status ENUM('READY','QUEUE','INCALL','DONE','HOLD','DNC','RHOLD','RQUEUE') default 'READY';
+2 -2
View File
@@ -1122,7 +1122,7 @@ dead_stop_recording ENUM('DISABLED','ALL_CALLS','OUTBOUND_ONLY','INBOUND_ONLY','
manual_vm_status_updates ENUM('ENABLED','DISABLED') default 'ENABLED', manual_vm_status_updates ENUM('ENABLED','DISABLED') default 'ENABLED',
force_per_call_notes ENUM('DISABLED','ENABLED','5_CHARACTERS','15_CHARACTERS','30_CHARACTERS','100_CHARACTERS') default 'DISABLED', force_per_call_notes ENUM('DISABLED','ENABLED','5_CHARACTERS','15_CHARACTERS','30_CHARACTERS','100_CHARACTERS') default 'DISABLED',
agent_search_ingroup_list ENUM('DISABLED','ENABLED','ENABLED_OVERRIDE') default 'DISABLED', agent_search_ingroup_list ENUM('DISABLED','ENABLED','ENABLED_OVERRIDE') default 'DISABLED',
hopper_hold_inserts ENUM('ENABLED','DISABLED') default 'DISABLED', hopper_hold_inserts ENUM('ENABLED','DISABLED','AUTONEXT') default 'DISABLED',
daily_phone_number_call_limit TINYINT(3) UNSIGNED default '0', daily_phone_number_call_limit TINYINT(3) UNSIGNED default '0',
state_descriptions VARCHAR(40) default '---DISABLED---' state_descriptions VARCHAR(40) default '---DISABLED---'
) ENGINE=MyISAM; ) ENGINE=MyISAM;
@@ -5631,4 +5631,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 vdc_agent_api_active='1';
UPDATE system_settings SET db_schema_version='1708',db_schema_update_date=NOW(),reload_timestamp=NOW(); UPDATE system_settings SET db_schema_version='1709',db_schema_update_date=NOW(),reload_timestamp=NOW();
+5 -1
View File
@@ -2436,7 +2436,7 @@ ALTER TABLE system_settings ADD highest_lead_id VARCHAR(20) default '0';
ALTER TABLE system_settings ADD hopper_hold_inserts ENUM('0','1','2','3','4','5','6','7') default '0'; ALTER TABLE system_settings ADD hopper_hold_inserts ENUM('0','1','2','3','4','5','6','7') default '0';
ALTER TABLE vicidial_campaigns ADD hopper_hold_inserts ENUM('ENABLED','DISABLED') default 'DISABLED'; ALTER TABLE vicidial_campaigns ADD hopper_hold_inserts ENUM('ENABLED','DISABLED','AUTONEXT') default 'DISABLED';
ALTER TABLE vicidial_hopper MODIFY status ENUM('READY','QUEUE','INCALL','DONE','HOLD','DNC','RHOLD','RQUEUE') default 'READY'; ALTER TABLE vicidial_hopper MODIFY status ENUM('READY','QUEUE','INCALL','DONE','HOLD','DNC','RHOLD','RQUEUE') default 'READY';
@@ -2661,3 +2661,7 @@ unique index livepartitions (server_ip, partition_path)
) ENGINE=MyISAM; ) ENGINE=MyISAM;
UPDATE system_settings SET db_schema_version='1708',db_schema_update_date=NOW() where db_schema_version < 1708; UPDATE system_settings SET db_schema_version='1708',db_schema_update_date=NOW() where db_schema_version < 1708;
ALTER TABLE vicidial_campaigns MODIFY hopper_hold_inserts ENUM('ENABLED','DISABLED','AUTONEXT') default 'DISABLED';
UPDATE system_settings SET db_schema_version='1709',db_schema_update_date=NOW() where db_schema_version < 1709;
+17 -5
View File
@@ -6131,12 +6131,13 @@ if ($SSscript_remove_js > 0)
# 240214-2120 - Added STATE_DESCRIPTIONS container type and state_descriptions campaign and in-group settings, change year to 2024 # 240214-2120 - Added STATE_DESCRIPTIONS container type and state_descriptions campaign and in-group settings, change year to 2024
# 240221-0331 - Changes for in-group daily limits, small changes for stats_descriptions # 240221-0331 - Changes for in-group daily limits, small changes for stats_descriptions
# 240223-0854 - Added INBOUND_DID In-Group populate option # 240223-0854 - Added INBOUND_DID In-Group populate option
# 240225-0933 - Added the AUTONEXT hopper_hold_inserts campaign option
# #
# 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 # 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-908a'; $admin_version = '2.14-909a';
$build = '240223-0854'; $build = '240225-0933';
$STARTtime = date("U"); $STARTtime = date("U");
$SQLdate = date("Y-m-d H:i:s"); $SQLdate = date("Y-m-d H:i:s");
@@ -25744,7 +25745,13 @@ if ($ADD==3)
if ($SShopper_hold_inserts > 0) if ($SShopper_hold_inserts > 0)
{ {
echo "<tr bgcolor=#$SSstd_row4_background><td align=right>"._QXZ("HCI Enabled").": </td><td align=left><select size=1 name=hci_enabled><option>0</option><option>1</option><option SELECTED>$hci_enabled</option></select>$NWB#users-hci_enabled$NWE</td></tr>\n"; echo "<tr bgcolor=#$SSstd_row4_background><td align=right>"._QXZ("HCI Enabled").": </td><td align=left><select size=1 name=hci_enabled><option>0</option><option>1</option>";
if ($SShopper_hold_inserts > 1)
{
echo "<option>2</option>";
}
echo "<option SELECTED>$hci_enabled</option></select>$NWB#users-hci_enabled$NWE</td></tr>\n";
} }
else else
{ {
@@ -27305,7 +27312,12 @@ if ($ADD==31)
if ($SShopper_hold_inserts > 0) if ($SShopper_hold_inserts > 0)
{ {
echo "<tr bgcolor=#$SSstd_row3_background><td align=right>"._QXZ("Hopper Hold Inserts").": </td><td align=left><select size=1 name=hopper_hold_inserts><option value='DISABLED'>"._QXZ("DISABLED")."</option><option value='ENABLED'>"._QXZ("ENABLED")."</option><option value='$hopper_hold_inserts' SELECTED>"._QXZ("$hopper_hold_inserts")."</option></select>$NWB#campaigns-hopper_hold_inserts$NWE</td></tr>\n"; echo "<tr bgcolor=#$SSstd_row3_background><td align=right>"._QXZ("Hopper Hold Inserts").": </td><td align=left><select size=1 name=hopper_hold_inserts><option value='DISABLED'>"._QXZ("DISABLED")."</option><option value='ENABLED'>"._QXZ("ENABLED")."</option>";
if ($SShopper_hold_inserts > 1)
{
echo "<option value='AUTONEXT'>"._QXZ("AUTONEXT")."</option>";
}
echo "<option value='$hopper_hold_inserts' SELECTED>"._QXZ("$hopper_hold_inserts")."</option></select>$NWB#campaigns-hopper_hold_inserts$NWE</td></tr>\n";
} }
else else
{ {
@@ -44238,7 +44250,7 @@ if ($ADD==311111111111111)
echo "<tr bgcolor=#$SSstd_row4_background><td align=right>"._QXZ("Outbound Auto-Dial Active").": </td><td align=left><select size=1 name=outbound_autodial_active><option>1</option><option>0</option><option selected>$outbound_autodial_active</option></select>$NWB#settings-outbound_autodial_active$NWE</td></tr>\n"; echo "<tr bgcolor=#$SSstd_row4_background><td align=right>"._QXZ("Outbound Auto-Dial Active").": </td><td align=left><select size=1 name=outbound_autodial_active><option>1</option><option>0</option><option selected>$outbound_autodial_active</option></select>$NWB#settings-outbound_autodial_active$NWE</td></tr>\n";
echo "<tr bgcolor=#$SSstd_row4_background><td align=right>"._QXZ("Lead Hopper Hold Inserts Allowed").": </td><td align=left><select size=1 name=hopper_hold_inserts><option>1</option><option>0</option><option selected>$hopper_hold_inserts</option></select>$NWB#settings-hopper_hold_inserts$NWE</td></tr>\n"; echo "<tr bgcolor=#$SSstd_row4_background><td align=right>"._QXZ("Lead Hopper Hold Inserts Allowed").": </td><td align=left><select size=1 name=hopper_hold_inserts><option>1</option><option>2</option><option>0</option><option selected>$hopper_hold_inserts</option></select>$NWB#settings-hopper_hold_inserts$NWE</td></tr>\n";
echo "<tr bgcolor=#$SSstd_row4_background><td align=right>"._QXZ("Shared Agent Campaign Dialing").": </td><td align=left><select size=1 name=allow_shared_dial><option>5</option><option>4</option><option>3</option><option>2</option><option>1</option><option>0</option><option selected>$allow_shared_dial</option></select>$NWB#settings-allow_shared_dial$NWE</td></tr>\n"; echo "<tr bgcolor=#$SSstd_row4_background><td align=right>"._QXZ("Shared Agent Campaign Dialing").": </td><td align=left><select size=1 name=allow_shared_dial><option>5</option><option>4</option><option>3</option><option>2</option><option>1</option><option>0</option><option selected>$allow_shared_dial</option></select>$NWB#settings-allow_shared_dial$NWE</td></tr>\n";
+196 -58
View File
@@ -1,20 +1,23 @@
<?php <?php
# hci_screen.php # hci_screen.php
# #
# Copyright (C) 2023 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2 # Copyright (C) 2024 Matt Florell <vicidial@gmail.com> LICENSE: AGPLv2
# #
# This script is designed to allow agents to work with the hopper_hold_inserts features and allow leads in the hopper to be changed from RHOLD to READY status so they can be called. # This script is designed to allow agents to work with the hopper_hold_inserts features and allow leads in the hopper to be changed from RHOLD to READY status so they can be called.
# #
# changes: # changes:
# 231119-1508 - First build # 231119-1508 - First build
# 240225-1000 - Added AUTONEXT hopper_hold_inserts campaign option
# #
$startMS = microtime(); $startMS = microtime();
$hci_version = '2.14-1h'; $hci_version = '2.14-2h';
$build = '231119-1508'; $build = '240225-1000';
$php_script='hci_screen.php'; $php_script='hci_screen.php';
$zi=0; $zi=0;
$default_batch_size=40;
$refresh_sec=4000;
require("dbconnect_mysqli.php"); require("dbconnect_mysqli.php");
require("functions.php"); require("functions.php");
@@ -29,6 +32,8 @@ if (isset($_GET["phone_number"])) {$phone_number=$_GET["phone_number"];}
elseif (isset($_POST["phone_number"])) {$phone_number=$_POST["phone_number"];} elseif (isset($_POST["phone_number"])) {$phone_number=$_POST["phone_number"];}
if (isset($_GET["campaign_id"])) {$campaign_id=$_GET["campaign_id"];} if (isset($_GET["campaign_id"])) {$campaign_id=$_GET["campaign_id"];}
elseif (isset($_POST["campaign_id"])) {$campaign_id=$_POST["campaign_id"];} elseif (isset($_POST["campaign_id"])) {$campaign_id=$_POST["campaign_id"];}
if (isset($_GET["batch_size"])) {$batch_size=$_GET["batch_size"];}
elseif (isset($_POST["batch_size"])) {$batch_size=$_POST["batch_size"];}
if (isset($_GET["stage"])) {$stage=$_GET["stage"];} if (isset($_GET["stage"])) {$stage=$_GET["stage"];}
elseif (isset($_POST["stage"])) {$stage=$_POST["stage"];} elseif (isset($_POST["stage"])) {$stage=$_POST["stage"];}
if (isset($_GET["DB"])) {$DB=$_GET["DB"];} if (isset($_GET["DB"])) {$DB=$_GET["DB"];}
@@ -66,6 +71,7 @@ if ($SSallow_web_debug < 1) {$DB=0;}
########################################### ###########################################
$phone_number = preg_replace('/[^0-9]/','',$phone_number); $phone_number = preg_replace('/[^0-9]/','',$phone_number);
$batch_size = preg_replace('/[^0-9]/','',$batch_size);
$stage = preg_replace('/[^-_0-9a-zA-Z]/','',$stage); $stage = preg_replace('/[^-_0-9a-zA-Z]/','',$stage);
if ($non_latin < 1) if ($non_latin < 1)
@@ -87,6 +93,8 @@ else
$SUBMIT = preg_replace('/[^- 0-9\p{L}]/u','',$SUBMIT); $SUBMIT = preg_replace('/[^- 0-9\p{L}]/u','',$SUBMIT);
} }
if ( ($batch_size < 10) or (strlen($batch_size) < 2) )
{$batch_size = $default_batch_size;}
$STARTtime = date("U"); $STARTtime = date("U");
$defaultappointment = date("Y-m-d"); $defaultappointment = date("Y-m-d");
@@ -300,7 +308,7 @@ if ( ($stage == 'LOGOUT') and (strlen($campaign_id) > 0) )
if ( ($stage == 'chosen_campaign') and (strlen($campaign_id) > 0) ) if ( ($stage == 'chosen_campaign') and (strlen($campaign_id) > 0) )
{ {
$valid_campaign=0; $valid_campaign=0;
$stmt="SELECT count(*) from vicidial_campaigns where campaign_id='$campaign_id' and active='Y' and hopper_hold_inserts='ENABLED' $LOGallowed_campaignsSQL;"; $stmt="SELECT count(*) from vicidial_campaigns where campaign_id='$campaign_id' and active='Y' and hopper_hold_inserts IN('ENABLED','AUTONEXT') $LOGallowed_campaignsSQL;";
$rslt=mysql_to_mysqli($stmt, $link); $rslt=mysql_to_mysqli($stmt, $link);
$camps_to_parse = mysqli_num_rows($rslt); $camps_to_parse = mysqli_num_rows($rslt);
if ($camps_to_parse > 0) if ($camps_to_parse > 0)
@@ -310,6 +318,15 @@ if ( ($stage == 'chosen_campaign') and (strlen($campaign_id) > 0) )
} }
if ($valid_campaign > 0) if ($valid_campaign > 0)
{ {
$autonext_campaign=0;
$stmt="SELECT count(*) from vicidial_campaigns where campaign_id='$campaign_id' and hopper_hold_inserts='AUTONEXT';";
$rslt=mysql_to_mysqli($stmt, $link);
$campANs_to_parse = mysqli_num_rows($rslt);
if ($campANs_to_parse > 0)
{
$rowx=mysqli_fetch_row($rslt);
$autonext_campaign = $rowx[0];
}
$stmt="INSERT INTO vicidial_hci_live_agents SET user='$PHP_AUTH_USER',campaign_id='$campaign_id',user_ip='$ip',login_time=NOW(),last_call_time=NOW(),last_update_time=NOW(),status='LOGIN',lead_id=0,phone_number='',random_id=0;"; $stmt="INSERT INTO vicidial_hci_live_agents SET user='$PHP_AUTH_USER',campaign_id='$campaign_id',user_ip='$ip',login_time=NOW(),last_call_time=NOW(),last_update_time=NOW(),status='LOGIN',lead_id=0,phone_number='',random_id=0;";
$rslt=mysql_to_mysqli($stmt, $link); $rslt=mysql_to_mysqli($stmt, $link);
@@ -327,7 +344,7 @@ if ( ($stage == 'chosen_campaign') and (strlen($campaign_id) > 0) )
} }
if ($hopper_hold_count > 0) if ($hopper_hold_count > 0)
{ {
$stmt="UPDATE vicidial_hopper SET user='$PHP_AUTH_USER',status='RQUEUE' WHERE campaign_id='$campaign_id' and status='RHOLD' and user='' order by priority desc,hopper_id limit 40;"; $stmt="UPDATE vicidial_hopper SET user='$PHP_AUTH_USER',status='RQUEUE' WHERE campaign_id='$campaign_id' and status='RHOLD' and user='' order by priority desc,hopper_id limit $batch_size;";
$rslt=mysql_to_mysqli($stmt, $link); $rslt=mysql_to_mysqli($stmt, $link);
$vh_affected_rows = mysqli_affected_rows($link); $vh_affected_rows = mysqli_affected_rows($link);
@@ -364,7 +381,7 @@ if ( ($stage == 'chosen_campaign') and (strlen($campaign_id) > 0) )
} }
} }
$notes = "$campaign_id $ip $vh_affected_rows $vhr_to_parse $vhr_ct $vhr_insert"; $notes = "$campaign_id $ip $vh_affected_rows $vhr_to_parse $vhr_ct $vhr_insert $autonext_campaign";
vicidial_ajax_log($NOW_TIME,$startMS,$link,$stage,$php_script,$PHP_AUTH_USER,$notes,$lead_id,$session_name,$stmt); vicidial_ajax_log($NOW_TIME,$startMS,$link,$stage,$php_script,$PHP_AUTH_USER,$notes,$lead_id,$session_name,$stmt);
} }
} }
@@ -379,7 +396,7 @@ if ( ($stage == 'chosen_campaign') and (strlen($campaign_id) > 0) )
if ( ($stage == 'switch_campaign') and (strlen($campaign_id) > 0) ) if ( ($stage == 'switch_campaign') and (strlen($campaign_id) > 0) )
{ {
$valid_campaign=0; $valid_campaign=0;
$stmt="SELECT count(*) from vicidial_campaigns where campaign_id='$campaign_id' and active='Y' and hopper_hold_inserts='ENABLED' $LOGallowed_campaignsSQL;"; $stmt="SELECT count(*) from vicidial_campaigns where campaign_id='$campaign_id' and active='Y' and hopper_hold_inserts IN('ENABLED','AUTONEXT') $LOGallowed_campaignsSQL;";
$rslt=mysql_to_mysqli($stmt, $link); $rslt=mysql_to_mysqli($stmt, $link);
$camps_to_parse = mysqli_num_rows($rslt); $camps_to_parse = mysqli_num_rows($rslt);
if ($camps_to_parse > 0) if ($camps_to_parse > 0)
@@ -389,6 +406,15 @@ if ( ($stage == 'switch_campaign') and (strlen($campaign_id) > 0) )
} }
if ($valid_campaign > 0) if ($valid_campaign > 0)
{ {
$autonext_campaign=0;
$stmt="SELECT count(*) from vicidial_campaigns where campaign_id='$campaign_id' and hopper_hold_inserts='AUTONEXT';";
$rslt=mysql_to_mysqli($stmt, $link);
$campANs_to_parse = mysqli_num_rows($rslt);
if ($campANs_to_parse > 0)
{
$rowx=mysqli_fetch_row($rslt);
$autonext_campaign = $rowx[0];
}
$stmt="SELECT campaign_id,status from vicidial_hci_live_agents where user='$PHP_AUTH_USER';"; $stmt="SELECT campaign_id,status from vicidial_hci_live_agents where user='$PHP_AUTH_USER';";
$rslt=mysql_to_mysqli($stmt, $link); $rslt=mysql_to_mysqli($stmt, $link);
$users_to_parse = mysqli_num_rows($rslt); $users_to_parse = mysqli_num_rows($rslt);
@@ -443,7 +469,7 @@ if ( ($stage == 'switch_campaign') and (strlen($campaign_id) > 0) )
} }
if ($hopper_hold_count > 0) if ($hopper_hold_count > 0)
{ {
$stmt="UPDATE vicidial_hopper SET user='$PHP_AUTH_USER',status='RQUEUE' WHERE campaign_id='$campaign_id' and status='RHOLD' and user='' order by priority desc,hopper_id limit 40;"; $stmt="UPDATE vicidial_hopper SET user='$PHP_AUTH_USER',status='RQUEUE' WHERE campaign_id='$campaign_id' and status='RHOLD' and user='' order by priority desc,hopper_id limit $batch_size;";
$rslt=mysql_to_mysqli($stmt, $link); $rslt=mysql_to_mysqli($stmt, $link);
$vh_affected_rows = mysqli_affected_rows($link); $vh_affected_rows = mysqli_affected_rows($link);
@@ -480,7 +506,7 @@ if ( ($stage == 'switch_campaign') and (strlen($campaign_id) > 0) )
} }
} }
$notes = "$campaign_id $old_campaign_id $VHLAstatus $vh_clear $vhr_clear $vh_affected_rows $vhr_insert"; $notes = "$campaign_id $old_campaign_id $VHLAstatus $vh_clear $vhr_clear $vh_affected_rows $vhr_insert $autonext_campaign";
vicidial_ajax_log($NOW_TIME,$startMS,$link,$stage,$php_script,$PHP_AUTH_USER,$notes,$lead_id,$session_name,$stmt); vicidial_ajax_log($NOW_TIME,$startMS,$link,$stage,$php_script,$PHP_AUTH_USER,$notes,$lead_id,$session_name,$stmt);
} }
else else
@@ -689,9 +715,9 @@ if ($stage == 'lead_display')
$rowx=mysqli_fetch_row($rslt); $rowx=mysqli_fetch_row($rslt);
$reserved_ct = $rowx[0]; $reserved_ct = $rowx[0];
} }
if ($reserved_ct < 40) if ($reserved_ct < $batch_size)
{ {
$reserve_more_hopper_leads = (40 - $reserved_ct); $reserve_more_hopper_leads = ($batch_size - $reserved_ct);
if ($reserve_more_hopper_leads > 0) if ($reserve_more_hopper_leads > 0)
{ {
@@ -780,6 +806,7 @@ if ($stage == 'lead_display')
} }
else else
{ {
$lead_phone_list='';
$stmt="SELECT lead_id,phone_number from vicidial_hci_reserve WHERE campaign_id='$campaign_id' and user='$PHP_AUTH_USER' order by reserve_date,lead_id;"; $stmt="SELECT lead_id,phone_number from vicidial_hci_reserve WHERE campaign_id='$campaign_id' and user='$PHP_AUTH_USER' order by reserve_date,lead_id;";
$rslt=mysql_to_mysqli($stmt, $link); $rslt=mysql_to_mysqli($stmt, $link);
$vhr_to_parse = mysqli_num_rows($rslt); $vhr_to_parse = mysqli_num_rows($rslt);
@@ -791,9 +818,11 @@ if ($stage == 'lead_display')
$rowx=mysqli_fetch_row($rslt); $rowx=mysqli_fetch_row($rslt);
$Elead_id[$vhr_ct] = $rowx[0]; $Elead_id[$vhr_ct] = $rowx[0];
$Ephone[$vhr_ct] = $rowx[1]; $Ephone[$vhr_ct] = $rowx[1];
$lead_phone_list .= $vhr_ct."_".$rowx[0]."_".$rowx[1]."|";
$vhr_ct++; $vhr_ct++;
} }
echo "<!-- LEADPHONELIST: $lead_phone_list -->\n";
echo "<FONT FACE=\"ARIAL,HELVETICA\" COLOR=BLACK SIZE=3>"._QXZ("Call Confirmation").": </FONT><BR><table width=530><tr><td>"; echo "<FONT FACE=\"ARIAL,HELVETICA\" COLOR=BLACK SIZE=3>"._QXZ("Call Confirmation").": </FONT><BR><table width=530><tr><td>";
$row_ct=0; $row_ct=0;
@@ -898,7 +927,7 @@ $camp_panel_code='<table cellspacing=2 cellpadding=2>';
$camp_form_code = "<select size=\"1\" name=\"campaign_id\" id=\"campaign_id\">\n"; $camp_form_code = "<select size=\"1\" name=\"campaign_id\" id=\"campaign_id\">\n";
$camp_form_code .= "<option value=\"\">-- "._QXZ("Select a Campaign")." --</option>\n"; $camp_form_code .= "<option value=\"\">-- "._QXZ("Select a Campaign")." --</option>\n";
$stmt="SELECT campaign_id,campaign_name from vicidial_campaigns where active='Y' and hopper_hold_inserts='ENABLED' $LOGallowed_campaignsSQL order by campaign_id;"; $stmt="SELECT campaign_id,campaign_name,hopper_hold_inserts from vicidial_campaigns where active='Y' and hopper_hold_inserts IN('ENABLED','AUTONEXT') $LOGallowed_campaignsSQL order by campaign_id;";
$rslt=mysql_to_mysqli($stmt, $link); $rslt=mysql_to_mysqli($stmt, $link);
$camps_to_print = mysqli_num_rows($rslt); $camps_to_print = mysqli_num_rows($rslt);
@@ -968,6 +997,28 @@ if ($users_to_parse < 1)
exit; exit;
} }
else
{
# See if campaign is set to AUTONEXT, and confirm system settings and user setting allow for that
$autonext_campaign=0;
$stmt="SELECT count(*) from vicidial_campaigns where campaign_id='$campaign_id' and hopper_hold_inserts='AUTONEXT';";
$rslt=mysql_to_mysqli($stmt, $link);
$campANs_to_parse = mysqli_num_rows($rslt);
if ($campANs_to_parse > 0)
{
$rowx=mysqli_fetch_row($rslt);
$autonext_campaign = $rowx[0];
}
if ( ($SShopper_hold_inserts < 2) and ($autonext_campaign > 0) )
{$autonext_campaign=0;}
if ( ($hci_enabled < 2) and ($autonext_campaign > 0) )
{$autonext_campaign=0;}
if ($autonext_campaign > 0)
{
$batch_size = ($batch_size * 3);
$refresh_sec = ($refresh_sec / 2);
}
}
?> ?>
@@ -984,6 +1035,14 @@ var confirming_call=0;
var confirming_call_lead_id=0; var confirming_call_lead_id=0;
var confirming_call_phone=''; var confirming_call_phone='';
var confirmed_ct_since_refresh=0; var confirmed_ct_since_refresh=0;
var autonext_campaign=<?php echo $autonext_campaign ?>;
var autonext_launch=<?php echo $autonext_campaign ?>;
var batch_size=<?php echo $batch_size ?>;
var refresh_sec=<?php echo $refresh_sec ?>;
var lead_phone_list='';
var next_lead='';
var next_phone='';
var next_lead_string='';
function StartRefresh() function StartRefresh()
{ {
@@ -1010,7 +1069,7 @@ function RefreshScreen()
// trigger refresh of hopper RHOLD leads available // trigger refresh of hopper RHOLD leads available
LeadsRefresh(); LeadsRefresh();
setTimeout("RefreshScreen()",4000); setTimeout("RefreshScreen()", refresh_sec);
} }
// function to gather dashboard content // function to gather dashboard content
@@ -1081,7 +1140,7 @@ function LeadsRefresh()
} }
if (xmlhttp) if (xmlhttp)
{ {
RTupdate_query = "stage=lead_display"; RTupdate_query = "stage=lead_display&batch_size=" + batch_size;
xmlhttp.open('POST', 'hci_screen.php'); xmlhttp.open('POST', 'hci_screen.php');
xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
xmlhttp.send(RTupdate_query); xmlhttp.send(RTupdate_query);
@@ -1089,9 +1148,36 @@ function LeadsRefresh()
{ {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{ {
// parse first LEADPHONELIST line to get a list of all leads received: "0_1234_9998887766|1_1235_9998887767|..."
LPLresponse = xmlhttp.responseText;
var LPLresponse_array=LPLresponse.split("\n");
var LEADPHONELIST = LPLresponse_array[0];
var LPLmatch = new RegExp("LEADPHONELIST","g");
if (LEADPHONELIST.match(LPLmatch))
{
var LPLresponse_array=LEADPHONELIST.split("LEADPHONELIST: ");
lead_phone_list = LPLresponse_array[1];
// alert(lead_phone_list);
var LPLnext_array=lead_phone_list.split("|");
current_lead_string = LPLnext_array[0];
var next_lead_array=current_lead_string.split("_");
next_lead = next_lead_array[1];
next_phone = next_lead_array[2];
// alert(next_lead_array[0] + " " + next_lead + " " + next_phone);
}
document.getElementById("LeadsContent").innerHTML = xmlhttp.responseText; document.getElementById("LeadsContent").innerHTML = xmlhttp.responseText;
confirmed_ct_since_refresh=0; confirmed_ct_since_refresh=0;
// alert(xmlhttp.responseText); // alert(xmlhttp.responseText);
if (autonext_launch > 0)
{
autonext_launch=0;
var temp_next_phone = next_phone;
let match = next_phone.match(/^(\d{3})(\d{3})(\d{4})$/);
if (match)
{temp_next_phone = '(' + match[1] + ') ' + match[2] + '-' + match[3];}
call_confirmation_button(next_lead,temp_next_phone);
}
} }
} }
delete xmlhttp; delete xmlhttp;
@@ -1139,6 +1225,35 @@ function LeadConfirmed()
confirming_call=0; confirming_call=0;
confirming_call_lead_id=0; confirming_call_lead_id=0;
confirming_call_phone=''; confirming_call_phone='';
var temp_LPL_current = "" + current_lead_string + "\\\|";
var LPLcurrent = new RegExp(temp_LPL_current,"g");
// alert(temp_LPL_current + " " + LPLcurrent);
lead_phone_list = lead_phone_list.replace(LPLcurrent, '');
var LPLnext_array=lead_phone_list.split("|");
current_lead_string = LPLnext_array[0];
var next_lead_array=current_lead_string.split("_");
next_lead = next_lead_array[1];
next_phone = next_lead_array[2];
if (autonext_campaign > 0)
{
var temp_next_phone = next_phone;
let match = next_phone.match(/^(\d{3})(\d{3})(\d{4})$/);
if (match)
{temp_next_phone = '(' + match[1] + ') ' + match[2] + '-' + match[3];}
// alert(next_lead + " " + temp_next_phone + " " + next_phone);
if (document.getElementById('button_' + next_lead))
{
call_confirmation_button(next_lead,temp_next_phone);
}
else
{
autonext_launch=1;
LeadsRefresh();
}
}
} }
} }
delete xmlhttp; delete xmlhttp;
@@ -1147,58 +1262,81 @@ function LeadConfirmed()
} }
// switch campaign for logged-in agent // switch campaign for logged-in agent
function SwitchCampaign(temp_campaign) function SwitchCampaign(temp_campaign)
{ {
window.location= hciPAGE + "?stage=switch_campaign&campaign_id=" + temp_campaign; window.location= hciPAGE + "?stage=switch_campaign&campaign_id=" + temp_campaign;
} }
function call_confirmation_button(temp_button_lead,temp_id) function call_confirmation_button(temp_button_lead,temp_id)
{ {
confirming_call=1; autonext_launch=0;
confirming_call_lead_id = temp_button_lead; confirming_call=1;
confirming_call_phone = temp_id; confirming_call_lead_id = temp_button_lead;
document.getElementById('button_' + temp_button_lead).style.backgroundColor = '#FFCC99'; confirming_call_phone = temp_id;
document.getElementById('VerifyBoxContent').innerHTML="<?php echo _QXZ("confirm call to") ?>: " + temp_id; document.getElementById('button_' + temp_button_lead).style.backgroundColor = '#FFCC99';
showDiv('VerifyBox'); var temp_counter_debug='';
document.getElementById('verify_button').focus(); // var temp_counter_debug = "<br>" + confirmed_ct_since_refresh + " " + loaded_sec;
} document.getElementById('VerifyBoxContent').innerHTML="<?php echo _QXZ("confirm call to") ?>: " + temp_id + temp_counter_debug;
showDiv('VerifyBox');
document.getElementById('verify_button').focus();
}
function call_confirmation_verify() function call_confirmation_verify()
{ {
// erase button span // erase button span
document.getElementById('button_span_' + confirming_call_lead_id).innerHTML=""; document.getElementById('button_span_' + confirming_call_lead_id).innerHTML="";
document.getElementById('VerifyBox').style.visibility = 'hidden'; document.getElementById('VerifyBox').style.visibility = 'hidden';
confirmed_ct_since_refresh++; confirmed_ct_since_refresh++;
LeadConfirmed(); LeadConfirmed();
} }
function call_confirmation_cancel() function call_confirmation_cancel()
{ {
document.getElementById('button_' + confirming_call_lead_id).style.backgroundColor = '#CCCCCC'; document.getElementById('button_' + confirming_call_lead_id).style.backgroundColor = '#CCCCCC';
confirming_call=0; confirming_call=0;
confirming_call_lead_id=0; confirming_call_lead_id=0;
confirming_call_phone=''; confirming_call_phone='';
document.getElementById('VerifyBox').style.visibility = 'hidden'; document.getElementById('VerifyBox').style.visibility = 'hidden';
}
// functions to hide and show different DIVs var temp_LPL_current = "" + current_lead_string + "\\\|";
function showDiv(divvar) var LPLcurrent = new RegExp(temp_LPL_current,"g");
// alert(temp_LPL_current + " " + LPLcurrent);
lead_phone_list = lead_phone_list.replace(LPLcurrent, '');
var LPLnext_array=lead_phone_list.split("|");
current_lead_string = LPLnext_array[0];
var next_lead_array=current_lead_string.split("_");
next_lead = next_lead_array[1];
next_phone = next_lead_array[2];
if (autonext_campaign > 0)
{ {
if (document.getElementById(divvar)) var temp_next_phone = next_phone;
{ let match = next_phone.match(/^(\d{3})(\d{3})(\d{4})$/);
divref = document.getElementById(divvar).style; if (match)
divref.visibility = 'visible'; {temp_next_phone = '(' + match[1] + ') ' + match[2] + '-' + match[3];}
} // alert(next_lead + " " + temp_next_phone + " " + next_phone);
call_confirmation_button(next_lead,temp_next_phone);
} }
function hideDiv(divvar) }
// functions to hide and show different DIVs
function showDiv(divvar)
{
if (document.getElementById(divvar))
{ {
if (document.getElementById(divvar)) divref = document.getElementById(divvar).style;
{ divref.visibility = 'visible';
divref = document.getElementById(divvar).style;
divref.visibility = 'hidden';
}
} }
}
function hideDiv(divvar)
{
if (document.getElementById(divvar))
{
divref = document.getElementById(divvar).style;
divref.visibility = 'hidden';
}
}
</script> </script>
+4 -4
View File
@@ -1,4 +1,4 @@
# version: 20240223085101 # version: 20240225093101
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-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-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> 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>
@@ -93,7 +93,7 @@ users-qc_user_level QC User Level <QXZ>This setting defines what the agent Quali
users-qc_pass QC Record Pass <QXZ>This option allows the agent to specify that a record has passed the first round of QC after reviewing the record.</QXZ> users-qc_pass QC Record Pass <QXZ>This option allows the agent to specify that a record has passed the first round of QC after reviewing the record.</QXZ>
users-qc_finish QC Record Finish <QXZ>This option allows the agent to specify that a record has finished the second round of QC after reviewing the passed record.</QXZ> users-qc_finish QC Record Finish <QXZ>This option allows the agent to specify that a record has finished the second round of QC after reviewing the passed record.</QXZ>
users-qc_commit QC Record Commit <QXZ>This option allows the agent to specify that a record has been committed in QC. It can no longer be modified by anyone.</QXZ> users-qc_commit QC Record Commit <QXZ>This option allows the agent to specify that a record has been committed in QC. It can no longer be modified by anyone.</QXZ>
users-hci_enabled HCI Enabled <QXZ>This option allows the user to have access to the HCI screen, which is accessible from the Welcome page, if Hopper Hold Inserts are allowed on your system.</QXZ> users-hci_enabled HCI Enabled <QXZ>This option allows the user to have access to the HCI screen, which is accessible from the Welcome page, if Hopper Hold Inserts are allowed on your system. The -2- option will allow this user to also use the AUTONEXT HCI Screen option, if it is enabled on the campaign and system. Default is disabled.</QXZ>
users-add_timeclock_log Add Timeclock Log Record <QXZ>This option allows the user to add records to the timeclock log.</QXZ> users-add_timeclock_log Add Timeclock Log Record <QXZ>This option allows the user to add records to the timeclock log.</QXZ>
users-modify_timeclock_log Modify Timeclock Log Record <QXZ>This option allows the user to modify records in the timeclock log.</QXZ> users-modify_timeclock_log Modify Timeclock Log Record <QXZ>This option allows the user to modify records in the timeclock log.</QXZ>
users-delete_timeclock_log Delete Timeclock Log Record <QXZ>This option allows the user to delete records in the timeclock log.</QXZ> users-delete_timeclock_log Delete Timeclock Log Record <QXZ>This option allows the user to delete records in the timeclock log.</QXZ>
@@ -166,7 +166,7 @@ campaigns-call_limit_24hour_override 24-Hour Called Count Limit Override <QXZ>If
campaigns-hopper_drop_run_trigger Hopper Drop-Run Trigger <QXZ>This setting, if activated, will ignore all hopper loading criteria for a single hopper run for this campaign and it will only load the DROP status leads from the active lists for the campaign into the hopper at the highest hopper priority, and once this single hopper run has happened, this setting will reset to N for this campaign and the hopper loading will go back to normal for the next minute when it runs. This process will also update any DROPs already in the hopper to the highest hopper priority if they are not already there. If the -All Drops- checkbox is checked, then any status with -DROP- in the status or status name will be selected, including all system statuses and campaign statuses whether they are for outbound or inbound calls. WARNING, when this runs it will not check to see if the lists have been reset, so you may be calling back DROP leads that were recently called. However, if the Drop Lockout Time has been enabled, that setting will be honored. Default is N, unselected, for inactive.</QXZ> campaigns-hopper_drop_run_trigger Hopper Drop-Run Trigger <QXZ>This setting, if activated, will ignore all hopper loading criteria for a single hopper run for this campaign and it will only load the DROP status leads from the active lists for the campaign into the hopper at the highest hopper priority, and once this single hopper run has happened, this setting will reset to N for this campaign and the hopper loading will go back to normal for the next minute when it runs. This process will also update any DROPs already in the hopper to the highest hopper priority if they are not already there. If the -All Drops- checkbox is checked, then any status with -DROP- in the status or status name will be selected, including all system statuses and campaign statuses whether they are for outbound or inbound calls. WARNING, when this runs it will not check to see if the lists have been reset, so you may be calling back DROP leads that were recently called. However, if the Drop Lockout Time has been enabled, that setting will be honored. Default is N, unselected, for inactive.</QXZ>
campaigns-drop_lockout_time Drop Lockout Time <QXZ>This is a number of hours that DROP abandon calls will be prevented from being dialed, to disable set to 0. This setting is very useful in countries like the UK where there are regulations preventing the attempted calling of customers within 72 hours of an Abandon, or DROP. Default is 0.</QXZ> campaigns-drop_lockout_time Drop Lockout Time <QXZ>This is a number of hours that DROP abandon calls will be prevented from being dialed, to disable set to 0. This setting is very useful in countries like the UK where there are regulations preventing the attempted calling of customers within 72 hours of an Abandon, or DROP. Default is 0.</QXZ>
campaigns-force_reset_hopper Force Reset of Hopper <QXZ>This allows you to wipe out the hopper contents upon form submission. It should be filled again when the VDhopper script runs.</QXZ> campaigns-force_reset_hopper Force Reset of Hopper <QXZ>This allows you to wipe out the hopper contents upon form submission. It should be filled again when the VDhopper script runs.</QXZ>
campaigns-hopper_hold_inserts Hopper Hold Inserts <QXZ>If enabled, this will insert leads into the hopper as a RHOLD status, so they can be activated by an outside process or utility. Default is DISABLED.</QXZ> campaigns-hopper_hold_inserts Hopper Hold Inserts <QXZ>If enabled, this will insert leads into the hopper as a RHOLD status, so they can be activated by an outside process or utility. The AUTONEXT option is also an enabled option, but in the HCI Screen, the user will only have to click once for each call instead of twice. Default is DISABLED.</QXZ>
campaigns-dial_method Dial Method <QXZ>This field is the way to define how dialing is to take place. If MANUAL then the auto_dial_level will be locked at 0 unless Dial Method is changed. If RATIO then the normal dialing a number of lines for Active agents. ADAPT_HARD_LIMIT will dial predictively up to the dropped percentage and then not allow aggressive dialing once the drop limit is reached until the percentage goes down again. ADAPT_TAPERED allows for running over the dropped percentage in the beginning of the shift -as defined by Latest Server Time set for campaign- and gets more strict as the shift goes on, for example, if there are 10 hours or more left in the shift, the TAPERED feature will not affect the adaptive dial level at all, as the number of hours left in the shift drops below 10 hours and gets closer to 0, the dial level will be dropped closer and closer to 1.0 as time goes on. ADAPT_AVERAGE tries to maintain an average or the dropped percentage not imposing hard limits as aggressively as the other two methods. You cannot change the Auto Dial Level if you are in any of the ADAPT dial methods. Only the Dialer can change the dial level when in predictive dialing mode. INBOUND_MAN allows the agent to place manual dial calls from a campaign list while being able to take inbound calls between manual dial calls.</QXZ> campaigns-dial_method Dial Method <QXZ>This field is the way to define how dialing is to take place. If MANUAL then the auto_dial_level will be locked at 0 unless Dial Method is changed. If RATIO then the normal dialing a number of lines for Active agents. ADAPT_HARD_LIMIT will dial predictively up to the dropped percentage and then not allow aggressive dialing once the drop limit is reached until the percentage goes down again. ADAPT_TAPERED allows for running over the dropped percentage in the beginning of the shift -as defined by Latest Server Time set for campaign- and gets more strict as the shift goes on, for example, if there are 10 hours or more left in the shift, the TAPERED feature will not affect the adaptive dial level at all, as the number of hours left in the shift drops below 10 hours and gets closer to 0, the dial level will be dropped closer and closer to 1.0 as time goes on. ADAPT_AVERAGE tries to maintain an average or the dropped percentage not imposing hard limits as aggressively as the other two methods. You cannot change the Auto Dial Level if you are in any of the ADAPT dial methods. Only the Dialer can change the dial level when in predictive dialing mode. INBOUND_MAN allows the agent to place manual dial calls from a campaign list while being able to take inbound calls between manual dial calls.</QXZ>
campaigns-auto_dial_level Auto Dial Level <QXZ>This is where you set how many lines the system should use per active agent. zero 0 means auto dialing is off and the agents will click to dial each number. Otherwise the system will keep dialing lines equal to active agents multiplied by the dial level to arrive at how many lines this campaign on each server should allow. The ADAPT OVERRIDE checkbox allows you to force a new dial level even though the dial method is in an ADAPT mode. This is useful if there is a dramatic shift in the quality of leads and you want to drastically change the dial_level manually.</QXZ> campaigns-auto_dial_level Auto Dial Level <QXZ>This is where you set how many lines the system should use per active agent. zero 0 means auto dialing is off and the agents will click to dial each number. Otherwise the system will keep dialing lines equal to active agents multiplied by the dial level to arrive at how many lines this campaign on each server should allow. The ADAPT OVERRIDE checkbox allows you to force a new dial level even though the dial method is in an ADAPT mode. This is useful if there is a dramatic shift in the quality of leads and you want to drastically change the dial_level manually.</QXZ>
campaigns-dial_level_threshold Auto Dial Level Threshold <QXZ>This setting only works with an ADAPT or RATIO Dial Method, and it must be set to something other than DISABLED and the number of agents setting must be above 0. This feature allows you to set a minimum number agents that predictive algorithm will work at. If the number of agents falls below the number that you have set, then the dial level will go to 1.0 until more agents log in or go into the selected state. LOGGED-IN_AGENTS will count all agents logged into the campaign, NON-PAUSED_AGENTS will only count agents that are waiting or talking, and WAITING_AGENTS will only count agents that are waiting for a call. Default is DISABLED.</QXZ> campaigns-dial_level_threshold Auto Dial Level Threshold <QXZ>This setting only works with an ADAPT or RATIO Dial Method, and it must be set to something other than DISABLED and the number of agents setting must be above 0. This feature allows you to set a minimum number agents that predictive algorithm will work at. If the number of agents falls below the number that you have set, then the dial level will go to 1.0 until more agents log in or go into the selected state. LOGGED-IN_AGENTS will count all agents logged into the campaign, NON-PAUSED_AGENTS will only count agents that are waiting or talking, and WAITING_AGENTS will only count agents that are waiting for a call. Default is DISABLED.</QXZ>
@@ -1140,7 +1140,7 @@ settings-agent_script Agent Screen Script <QXZ>This is the PHP script page of th
settings-active_voicemail_server Active Voicemail Server <QXZ>In multi-server systems, this is the server that will handle all voicemail boxes. This server is also where the dial-in generated prompts will be uploaded from, the 8168 recordings. It is important that this server is both Active and an Active Asterisk server.</QXZ> settings-active_voicemail_server Active Voicemail Server <QXZ>In multi-server systems, this is the server that will handle all voicemail boxes. This server is also where the dial-in generated prompts will be uploaded from, the 8168 recordings. It is important that this server is both Active and an Active Asterisk server.</QXZ>
settings-allow_voicemail_greeting Allow Voicemail Greeting Chooser <QXZ>If this setting is enabled it will allow you to choose an audio file from the audio store to be played as the voicemail greeting to a specific voicemail box. Default is 0 for disabled.</QXZ> settings-allow_voicemail_greeting Allow Voicemail Greeting Chooser <QXZ>If this setting is enabled it will allow you to choose an audio file from the audio store to be played as the voicemail greeting to a specific voicemail box. Default is 0 for disabled.</QXZ>
settings-outbound_autodial_active Outbound Auto-Dial Active <QXZ>This option allows you to enable or disable outbound auto-dialing within the system, setting this field to 0 will remove the LISTS and FILTERS sections and many fields from the Campaign Modification screens. Manual entry dialing will still be allowable from within the agent screen, but no list dialing will be possible. Default is 1 for active.</QXZ> settings-outbound_autodial_active Outbound Auto-Dial Active <QXZ>This option allows you to enable or disable outbound auto-dialing within the system, setting this field to 0 will remove the LISTS and FILTERS sections and many fields from the Campaign Modification screens. Manual entry dialing will still be allowable from within the agent screen, but no list dialing will be possible. Default is 1 for active.</QXZ>
settings-hopper_hold_inserts Lead Hopper Hold Inserts Allowed <QXZ>If enabled, this setting will allow campaigns to be set to insert leads into the hopper as a RHOLD status so that they can be activated by a separate process. Default is 0 for disabled.</QXZ> settings-hopper_hold_inserts Lead Hopper Hold Inserts Allowed <QXZ>If enabled, this setting will allow campaigns to be set to insert leads into the hopper as a RHOLD status so that they can be activated by a separate process. The -2- option will also allow the AUTONEXT campaign setting. Default is 0 for disabled.</QXZ>
settings-allow_shared_dial Shared Agent Campaign Dialing <QXZ>This option will allow you to set SHARED campaign Dial Methods in order to share agents across multiple outbound campaigns. For more details on how to set this up properly, read the AGENT_MULTI-CAMPAIGN_DIALING.txt document. Default is 0 for disabled.</QXZ> settings-allow_shared_dial Shared Agent Campaign Dialing <QXZ>This option will allow you to set SHARED campaign Dial Methods in order to share agents across multiple outbound campaigns. For more details on how to set this up properly, read the AGENT_MULTI-CAMPAIGN_DIALING.txt document. Default is 0 for disabled.</QXZ>
settings-agent_search_method Agent Search Method Override <QXZ>This option will allow you to override the agent search method that is defined in the dialplan on your dialers on a per in-group and-or per campaign basis. Setting this to -1- will enable the override for both in-groups and campaigns. -2- will enable only for in-groups. -3- will enable only for campaigns. Default is 0 for disabled. WARNING, we do not recommend enabling this setting, it can lead to greatly increased dropped calls if improperly used.</QXZ> settings-agent_search_method Agent Search Method Override <QXZ>This option will allow you to override the agent search method that is defined in the dialplan on your dialers on a per in-group and-or per campaign basis. Setting this to -1- will enable the override for both in-groups and campaigns. -2- will enable only for in-groups. -3- will enable only for campaigns. Default is 0 for disabled. WARNING, we do not recommend enabling this setting, it can lead to greatly increased dropped calls if improperly used.</QXZ>
settings-ofcom_uk_drop_calc UK OFCOM Drop Calculation <QXZ>This option allows you to enable the new UK OFCOM Drop calculation formula for individual campaigns. As of December 2015, OFCOM in the UK changed their method for calculating the drop,or abandon, percentage for an outbound dialing campaign. The new formula includes an estimate of the number of drops that were answering machines. They do this by using the agent-answered percentage of answering machines and subtracting that percentage from the number of drops. Then that new drop number is divided by the total agent-answered human-answered calls PLUS the number of drops. This differs in several ways from the way it had been done, as well as the way the drop percentage has been calculated in the USA and Canada. This new UK drop calculation method can be activated as a system setting AND a campaign option. Both must be enabled for the campaign to use the new method. In order for agent-statused answering machines to be calculated properly, we have added an answering machine status flag that is used to gather those statuses. Default is 0 for inactive.</QXZ> settings-ofcom_uk_drop_calc UK OFCOM Drop Calculation <QXZ>This option allows you to enable the new UK OFCOM Drop calculation formula for individual campaigns. As of December 2015, OFCOM in the UK changed their method for calculating the drop,or abandon, percentage for an outbound dialing campaign. The new formula includes an estimate of the number of drops that were answering machines. They do this by using the agent-answered percentage of answering machines and subtracting that percentage from the number of drops. Then that new drop number is divided by the total agent-answered human-answered calls PLUS the number of drops. This differs in several ways from the way it had been done, as well as the way the drop percentage has been calculated in the USA and Canada. This new UK drop calculation method can be activated as a system setting AND a campaign option. Both must be enabled for the campaign to use the new method. In order for agent-statused answering machines to be calculated properly, we have added an answering machine status flag that is used to gather those statuses. Default is 0 for inactive.</QXZ>
+16
View File
@@ -85,6 +85,22 @@ redalert {font-size: 18px; font-weight:bold; font-family: Arial, Sans-Serif; col
.alt_row3 {background-color: <?php echo $SSalt_row3_background; ?>} .alt_row3 {background-color: <?php echo $SSalt_row3_background; ?>}
.std_btn {background-color: <?php echo $SSbutton_background; ?>;} .std_btn {background-color: <?php echo $SSbutton_background; ?>;}
/* Special effects */
.blink {
animation: blinker 1.2s linear infinite;
color: #900;
font-family: Arial,Helvetica, sans-serif;
font-size: 14px;
font-weight: bold;
margin-bottom: 14px;
}
@keyframes blinker {
50% {
opacity: 0;
}
}
.border2px {border:solid 2px #<?php echo $SSmenu_background; ?>} .border2px {border:solid 2px #<?php echo $SSmenu_background; ?>}