diff --git a/UPGRADE b/UPGRADE index 7feba578..a02a165d 100644 --- a/UPGRADE +++ b/UPGRADE @@ -524,6 +524,12 @@ OTHER CHANGES: 147. Added campaigns_list & hopper_list functions to the Non-Agent API +148. Added code and instructions for multi-campaign outbound agents, see the + AGENT_MULTI-CAMPAIGN_DIALING.txt doc + +149. Added Screen Colors option to set the submit button color on the admin + screens and reports. + diff --git a/bin/AST_VDadapt.pl b/bin/AST_VDadapt.pl index aca77a4c..06c27c2c 100644 --- a/bin/AST_VDadapt.pl +++ b/bin/AST_VDadapt.pl @@ -6,7 +6,7 @@ # adjusts the auto_dial_level for vicidial adaptive-predictive campaigns. # gather call stats for campaigns and in-groups # -# Copyright (C) 2019 Matt Florell LICENSE: AGPLv2 +# Copyright (C) 2020 Matt Florell LICENSE: AGPLv2 # # CHANGELOG # 60823-1302 - First build from AST_VDhopper.pl @@ -51,9 +51,9 @@ # 190216-0809 - Fix for user-group, in-group and campaign allowed/permissions matching issues # 190720-2122 - Added audit and fixing of missing outbound auto-dial logs if Call Quotas is enabled # 190722-1004 - Added more logging and log-audit portions to Call Quotas log audit code +# 200811-1600 - Include live agents from other campaigns if they have the campaign Drop-InGroup selected and drop sec < 0 # - # constants $DB=0; # Debug flag, set to 0 for no debug messages, On an active system this will generate lots of lines of output per minute $US='__'; @@ -61,6 +61,7 @@ $MT[0]=''; $run_check=1; # concurrency check $VLhour_counts=1; # use cached hour counts for vicidial_log entries per campaign $VCLhour_counts=1; # use cached hour counts for vicidial_closer_log entries per in-group +$new_agent_multicampaign=1; # new process for handling multi-campaign agents ##### table definitions(used to force index usage for better performance): $vicidial_log = 'vicidial_log FORCE INDEX (call_date) '; @@ -455,7 +456,7 @@ while ($master_loop < $CLIloops) } else { - $stmtA = "SELECT campaign_id,lead_order,hopper_level,auto_dial_level,local_call_time,lead_filter_id,use_internal_dnc,dial_method,available_only_ratio_tally,adaptive_dropped_percentage,adaptive_maximum_level,adaptive_latest_server_time,adaptive_intensity,adaptive_dl_diff_target,UNIX_TIMESTAMP(campaign_changedate),campaign_stats_refresh,campaign_allow_inbound,drop_rate_group,UNIX_TIMESTAMP(campaign_calldate),realtime_agent_time_stats,available_only_tally_threshold,available_only_tally_threshold_agents,dial_level_threshold,dial_level_threshold_agents,ofcom_uk_drop_calc from vicidial_campaigns where ( (active='Y') or (campaign_stats_refresh='Y') )"; + $stmtA = "SELECT campaign_id,lead_order,hopper_level,auto_dial_level,local_call_time,lead_filter_id,use_internal_dnc,dial_method,available_only_ratio_tally,adaptive_dropped_percentage,adaptive_maximum_level,adaptive_latest_server_time,adaptive_intensity,adaptive_dl_diff_target,UNIX_TIMESTAMP(campaign_changedate),campaign_stats_refresh,campaign_allow_inbound,drop_rate_group,UNIX_TIMESTAMP(campaign_calldate),realtime_agent_time_stats,available_only_tally_threshold,available_only_tally_threshold_agents,dial_level_threshold,dial_level_threshold_agents,ofcom_uk_drop_calc,drop_call_seconds,drop_action,drop_inbound_group from vicidial_campaigns where ( (active='Y') or (campaign_stats_refresh='Y') )"; } $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; @@ -492,6 +493,9 @@ while ($master_loop < $CLIloops) $dial_level_threshold[$rec_count] = $aryA[22]; $dial_level_threshold_agents[$rec_count] = $aryA[23]; $ofcom_uk_drop_calc[$rec_count] = $aryA[24]; + $drop_call_seconds[$rec_count] = $aryA[25]; + $drop_action[$rec_count] = $aryA[26]; + $drop_inbound_group[$rec_count] = $aryA[27]; $rec_count++; } @@ -524,7 +528,16 @@ while ($master_loop < $CLIloops) $sthA->finish(); ### Find out how many agents are logged in to a specific campaign - $stmtA = "SELECT count(*) from vicidial_live_agents where campaign_id='$campaign_id[$i]' and last_update_time > '$VDL_one';"; + # check if drop-in-group agents should be included ---NONE--- + $drop_ingroup_SQL[$i]=''; + if ( ($drop_call_seconds[$i] < 0) && ($drop_action[$i] =~ /IN_GROUP/i) && ($drop_inbound_group[$i] !~ /^---NONE---$/) && (length($drop_inbound_group[$i]) > 0) && ($new_agent_multicampaign > 0) ) + { + $SQL_group_id=$drop_inbound_group[$i]; $SQL_group_id =~ s/_/\\_/gi; + $drop_ingroup_SQL[$i] = " or ( (campaign_id!='$campaign_id[$i]') and (closer_campaigns LIKE \"% $SQL_group_id %\") )"; + if ($DB) {print " $campaign_id[$i] Drop In-Group agents included from: $drop_inbound_group[$i]";} + $debug_camp_output .= " $campaign_id[$i] Drop In-Group agents included from: $drop_inbound_group[$i]\n"; + } + $stmtA = "SELECT count(*) from vicidial_live_agents where ( (campaign_id='$campaign_id[$i]') $drop_ingroup_SQL[$i] ) and last_update_time > '$VDL_one';"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -2148,7 +2161,7 @@ sub count_agents_lines $total_agents_avg[$i]=0; $stat_differential[$i]=0; - $stmtA = "SELECT count(*),status from vicidial_live_agents where campaign_id='$campaign_id[$i]' and last_update_time > '$VDL_one' group by status;"; + $stmtA = "SELECT count(*),status from vicidial_live_agents where ( (campaign_id='$campaign_id[$i]') $drop_ingroup_SQL[$i] ) and last_update_time > '$VDL_one' group by status;"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -2205,7 +2218,7 @@ sub count_agents_lines # LIVE CAMPAIGN CALLS RIGHT NOW if ($daily_stats > 0) { - $stmtA = "SELECT count(*) from vicidial_live_agents where campaign_id='$campaign_id[$i]' and last_update_time > '$VDL_one' and extension LIKE \"R/%\";"; + $stmtA = "SELECT count(*) from vicidial_live_agents where ( (campaign_id='$campaign_id[$i]') $drop_ingroup_SQL[$i] ) and last_update_time > '$VDL_one' and extension LIKE \"R/%\";"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -5946,7 +5959,7 @@ sub calculate_dial_level $adaptive_string .= "CAMPAIGN: $campaign_id[$i] $i\n"; # COUNTS OF STATUSES OF AGENTS IN THIS CAMPAIGN - $stmtA = "SELECT count(*),status from vicidial_live_agents where campaign_id='$campaign_id[$i]' and last_update_time > '$VDL_one' group by status;"; + $stmtA = "SELECT count(*),status from vicidial_live_agents where ( (campaign_id='$campaign_id[$i]') $drop_ingroup_SQL[$i] ) and last_update_time > '$VDL_one' group by status;"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; diff --git a/bin/AST_VDauto_dial.pl b/bin/AST_VDauto_dial.pl index 9b6e16ae..c4c4c54f 100644 --- a/bin/AST_VDauto_dial.pl +++ b/bin/AST_VDauto_dial.pl @@ -133,6 +133,7 @@ # 191108-0922 - Added Dial Timeout Lead override function # 200108-1315 - Added CID Group type of NONE # 200122-1851 - Added code for CID Group auto-rotate feature +# 200825-0032 - Include live agents from other campaigns if they have the campaign Drop-InGroup selected and drop sec < 0 # ### begin parsing run-time options ### @@ -200,6 +201,7 @@ $RECprefix='7'; ### leave blank for no REC prefix $useJAMdebugFILE='1'; ### leave blank for no Jam call debug file writing $max_vicidial_trunks=0; ### setting a default value for max_vicidial_trunks $run_check=1; # concurrency check +$new_agent_multicampaign=1; # new process for handling multi-campaign agents # default path to astguiclient configuration file: $PATHconf = '/etc/astguiclient.conf'; @@ -256,6 +258,8 @@ use DBI; ### connect to MySQL database defined in the conf file $dbhA = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") or die "Couldn't connect to database: " . DBI->errstr; +$dbhC = DBI->connect("DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port", "$VARDB_user", "$VARDB_pass") +or die "Couldn't connect to database: " . DBI->errstr; ### Grab Server values from the database $stmtA = "SELECT telnet_host,telnet_port,ASTmgrUSERNAME,ASTmgrSECRET,ASTmgrUSERNAMEupdate,ASTmgrUSERNAMElisten,ASTmgrUSERNAMEsend,max_vicidial_trunks,answer_transfer_agent,local_gmt,ext_context,vd_server_logs,vicidial_recording_limit,asterisk_version,routing_prefix FROM servers where server_ip = '$server_ip';"; @@ -413,7 +417,13 @@ while($one_day_interval > 0) @DBIPdial_level_threshold_agents=@MT; @DBIPadaptive_dl_diff_target=@MT; @DBIPdl_diff_target_method=@MT; - + @DBIPscheduled_callbacks_auto_reschedule=@MT; + @DBIPcall_quota_lead_ranking=@MT; + @DBIPdial_timeout_lead_container=@MT; + @DBIPdial_timeout_lead_container_entry=@MT; + @DBIPdrop_call_seconds=@MT; + @DBIPdrop_action=@MT; + @DBIPdrop_inbound_group=@MT; $active_line_counter=0; $user_counter=0; $user_campaigns = '|'; @@ -648,7 +658,7 @@ while($one_day_interval > 0) ### grab the dial_level and multiply by active agents to get your goalcalls $DBIPadlevel[$user_CIPct]=0; - $stmtA = "SELECT auto_dial_level,local_call_time,dial_timeout,dial_prefix,campaign_cid,active,campaign_vdad_exten,closer_campaigns,omit_phone_code,available_only_ratio_tally,auto_alt_dial,campaign_allow_inbound,queue_priority,dial_method,use_custom_cid,inbound_queue_no_dial,available_only_tally_threshold,available_only_tally_threshold_agents,dial_level_threshold,dial_level_threshold_agents,adaptive_dl_diff_target,dl_diff_target_method,inbound_no_agents_no_dial_container,inbound_no_agents_no_dial_threshold,cid_group_id,scheduled_callbacks_auto_reschedule,call_quota_lead_ranking,dial_timeout_lead_container FROM vicidial_campaigns where campaign_id='$DBIPcampaign[$user_CIPct]'"; + $stmtA = "SELECT auto_dial_level,local_call_time,dial_timeout,dial_prefix,campaign_cid,active,campaign_vdad_exten,closer_campaigns,omit_phone_code,available_only_ratio_tally,auto_alt_dial,campaign_allow_inbound,queue_priority,dial_method,use_custom_cid,inbound_queue_no_dial,available_only_tally_threshold,available_only_tally_threshold_agents,dial_level_threshold,dial_level_threshold_agents,adaptive_dl_diff_target,dl_diff_target_method,inbound_no_agents_no_dial_container,inbound_no_agents_no_dial_threshold,cid_group_id,scheduled_callbacks_auto_reschedule,call_quota_lead_ranking,dial_timeout_lead_container,drop_call_seconds,drop_action,drop_inbound_group FROM vicidial_campaigns where campaign_id='$DBIPcampaign[$user_CIPct]'"; $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; $sthArows=$sthA->rows; @@ -688,24 +698,70 @@ while($one_day_interval > 0) $DBIPcall_quota_lead_ranking[$user_CIPct] = $aryA[26]; $DBIPdial_timeout_lead_container[$user_CIPct] = $aryA[27]; $DBIPdial_timeout_lead_container_entry[$user_CIPct]=''; + $DBIPdrop_call_seconds[$user_CIPct] = $aryA[28]; + $DBIPdrop_action[$user_CIPct] = $aryA[29]; + $DBIPdrop_inbound_group[$user_CIPct] = $aryA[30]; # check for Dial Timeout Lead override if ( (length($DBIPdial_timeout_lead_container[$user_CIPct]) > 1) && ($DBIPdial_timeout_lead_container[$user_CIPct] !~ /^DISABLED$/i) ) { # Gather settings container for Call Quota Lead Ranking - $stmtA = "SELECT container_entry FROM vicidial_settings_containers where container_id='$DBIPdial_timeout_lead_container[$user_CIPct]';"; - $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; - $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; - $sthArows=$sthA->rows; - if ($sthArows > 0) + $stmtC = "SELECT container_entry FROM vicidial_settings_containers where container_id='$DBIPdial_timeout_lead_container[$user_CIPct]';"; + $sthC = $dbhC->prepare($stmtC) or die "preparing: ",$dbhC->errstr; + $sthC->execute or die "executing: $stmtC ", $dbhC->errstr; + $sthCrows=$sthC->rows; + if ($sthCrows > 0) { - @aryA = $sthA->fetchrow_array; - $DBIPdial_timeout_lead_container_entry[$user_CIPct] = $aryA[0]; + @aryC = $sthC->fetchrow_array; + $DBIPdial_timeout_lead_container_entry[$user_CIPct] = $aryC[0]; $DBIPdial_timeout_lead_container_entry[$user_CIPct] =~ s/\r|\t|\'|\"|\\//gi; } - $sthA->finish(); + $sthC->finish(); } + # BEGIN check if drop-in-group agents should be included ---NONE--- # + if ( ($DBIPdrop_call_seconds[$user_CIPct] < 0) && ($DBIPdrop_action[$user_CIPct] =~ /IN_GROUP/i) && ($DBIPdrop_inbound_group[$user_CIPct] !~ /^---NONE---$/) && (length($DBIPdrop_inbound_group[$user_CIPct]) > 0) && ($new_agent_multicampaign > 0) ) + { + if ($DBIPcount[$user_CIPct] > 0) {$DBIPcount[$user_CIPct] = ($DBIPcount[$user_CIPct] - 1);} + if ($DBIPACTIVEcount[$user_CIPct] > 0) {$DBIPACTIVEcount[$user_CIPct] = ($DBIPACTIVEcount[$user_CIPct] - 1);} + $SQL_group_id=$DBIPdrop_inbound_group[$user_CIPct]; $SQL_group_id =~ s/_/\\_/gi; + $temp_drop_ingroup_SQL = "and ( (campaign_id!='$DBIPcampaign[$user_CIPct]') and (closer_campaigns LIKE \"% $SQL_group_id %\") )"; + + $stmtC = "SELECT user,status from vicidial_live_agents where last_update_time > '$BDtsSQLdate' $temp_drop_ingroup_SQL;"; + $sthC = $dbhC->prepare($stmtC) or die "preparing: ",$dbhC->errstr; + $sthC->execute or die "executing: $stmtC ", $dbhC->errstr; + $sthCrows=$sthC->rows; + $temp_dig_ct=0; + $temp_dig_ACTIVE=0; + $temp_dig_INCALL=0; + while ($sthCrows > $temp_dig_ct) + { + @aryC = $sthC->fetchrow_array; + $temp_agent_status = $aryC[1]; + + if ($temp_agent_status =~ /READY|DONE|CLOSER/) + { + $DBIPcount[$user_CIPct]++; + $DBIPACTIVEcount[$user_CIPct]++; + $temp_dig_ACTIVE++; + } + else + { + if ($temp_agent_status =~ /INCALL/) + { + $DBIPcount[$user_CIPct]++; + $DBIPINCALLcount[$user_CIPct]++; + $temp_dig_INCALL++; + } + } + $temp_dig_ct++; + } + $sthC->finish(); + if ($DB) {print " $DBIPcampaign[$user_CIPct] Drop In-Group agents included from $DBIPdrop_inbound_group[$user_CIPct]: READY $temp_dig_ACTIVE + INCALL $temp_dig_INCALL ($temp_dig_ct)\n";} + $debug_string .= " $DBIPcampaign[$user_CIPct] Drop In-Group agents included from $DBIPdrop_inbound_group[$user_CIPct]: READY $temp_dig_ACTIVE + INCALL $temp_dig_INCALL ($temp_dig_ct)\n"; + } + # END check if drop-in-group agents should be included ---NONE--- # + if ($DBIPdl_diff_target_method[$user_CIPct] =~ /ADAPT_CALC_ONLY/) { if ( ($DBIPadaptive_dl_diff_target[$user_CIPct] < 0) || ($DBIPadaptive_dl_diff_target[$user_CIPct] > 0) ) @@ -1077,6 +1133,25 @@ while($one_day_interval > 0) } $sthA->finish(); + # check for drop-ingroup calls active in the system + if ( ($DBIPdrop_call_seconds[$user_CIPct] < 0) && ($DBIPdrop_action[$user_CIPct] =~ /IN_GROUP/i) && ($DBIPdrop_inbound_group[$user_CIPct] !~ /^---NONE---$/) && (length($DBIPdrop_inbound_group[$user_CIPct]) > 0) && ($new_agent_multicampaign > 0) ) + { + $stmtA = "SELECT count(*) FROM vicidial_auto_calls where (campaign_id='$DBIPdrop_inbound_group[$user_CIPct]' and call_type IN('IN','OUT','OUTBALANCE')) and status IN('LIVE');"; + $sthA = $dbhA->prepare($stmtA) or die "preparing: ",$dbhA->errstr; + $sthA->execute or die "executing: $stmtA ", $dbhA->errstr; + $sthArows=$sthA->rows; + if ($sthArows > 0) + { + @aryA = $sthA->fetchrow_array; + $event_string=" $DBIPcampaign[$user_CIPct] Drop In-Group calls: $aryA[0] ($waiting_calls_OUT)\n"; + $debug_string .= "$event_string\n"; + &event_logger; + + $waiting_calls_OUT = ($aryA[0] + $waiting_calls_OUT); + } + $sthA->finish(); + } + $waiting_calls = ($waiting_calls_IN + $waiting_calls_OUT); $stat_ready_agents[$user_CIPct][$stat_count] = $ready_agents; diff --git a/docs/AGENT_MULTI-CAMPAIGN_DIALING.txt b/docs/AGENT_MULTI-CAMPAIGN_DIALING.txt new file mode 100644 index 00000000..0fc5a977 --- /dev/null +++ b/docs/AGENT_MULTI-CAMPAIGN_DIALING.txt @@ -0,0 +1,102 @@ +AGENT MULTI-CAMPAIGN DIALING DOC Started: 2020-08-24 Updated: 2020-08-26 + +NOTE: Requires VICIdial svn/trunk code revision 3284 or higher to work properly!!! + +NOTE: THIS FEATURE IS OPTIONAL, AND SHOULD ONLY BE CONFIGURED AFTER YOUR SYSTEM + HAS BEEN INSTALLED AND TESTED! + + + +DESCRIPTION: + +In cases where a company wants the same group of agents to be able to outbound auto-dial on more than one campaign, you can configure your system to be able to operate in this way. Although it will often lead to a higher total dropped call rate than using separated campaigns or using separate lists within the same campaign and the list override settings to achieve unique configurations per list. + +First, a description of how to use List Overrides on multiple lists in a single campaign to achieve the goals of most of our clients that initially say they want to run multiple campaigns for the same group of agents. In the List Modification screen, you will see a series of settings that allow you to override campaign settings for calls placed from that list. For example, all of the following settings can be overriden at the list level: + +- Agent Script Override +- Inbound Script Override +- Inbound Drop Voicemail Override +- Inbound After Hours Voicemail Override +- Campaign CID Override +- Answering Machine Message Override +- Drop Inbound Group Override +- Status Group Override +- Web Form +- Web Form Two +- Web Form Three +- No Agent Call URL +- Transfer-Conf Number 1 Override +- Transfer-Conf Number 2 Override +- Transfer-Conf Number 3 Override +- Transfer-Conf Number 4 Override +- Transfer-Conf Number 5 Override +- Default Transfer Group + +The above settings will allow calls to go out and back in with unique settings, allowing for unique calls paths and agent screens for each list. So if you have a set of services to perform on a customer list, you can define one per list and have the same group of agents call on all of those separate lists all in one single campaign. + + +In some cases, like different agent spoken language skills, the above approach will not work, so you have to set up different campaigns(and lists) for each spoken language. In the example below we will detail each of the settings that need to be configured in Campaigns and In-Groups for this to work. We will use the example of an outbound appointment confirmation program that calls people who speak both English and Spanish and have agents who speak one or both of those languages. + +NOTE: The following instructions below assume that you already know how to set up and run an outbound auto-dialing campaign. + +1. Set up three campaigns: + APPTENG(Appointments English) + APPTSPA(Appointments Spanish) + APPTAGNT(Appointments All Agents) + +2. Set up two lists: + 1101(Appointments English List), assigned to the APPTENG campaign + 1102(Appointments English List), assigned to the APPTSPA campaign + +3. Set up two Inbound Groups to use as Drop In-Groups: + DROP_APPT_ENG(Appointments English Drop InGroup) + DROP_APPT_SPA(Appointments Spanish Drop InGroup) + * RECOMMENDATIONS: + - You may want to set the In-Group "Drop Call Seconds" to a lower number and send the call to a Call Menu if no agent is available + +4. Set the following settings on both the APPTENG & APPTSPA campaigns (these are your two outbound dialing campaigns) + * Start by setting these campaigns up as you would to be normal outbound auto-dialing campaigns + Dial Method: ADAPT_AVERAGE or RATIO + Available Only Tally: Y + Drop Call Seconds: -1 + Drop Action: IN_GROUP + Drop Transfer Group: DROP_APPT_ENG(for the APPTENG campaign) or DROP_APPT_SPA(for the APPTSPA campaign) + * RECOMMENDATIONS: + - You may want to enable "Available Only Tally" or "Available Only Tally Threshold" to reduce the drop levels on these campaigns + - Depending on the number of agents, you may want to set "Dial Level Difference Target" to a negative number to reduce drops + - For high-contact lists, you should use a RATIO dial method and a Dial Level of '1' + +5. Set the following settings on the APPTAGNT campaign: + Allow Inbound and Blended: Y + Dial Method: RATIO + Allow No-Hopper-Leads Logins: Y + Allowed Inbound Groups: select both "DROP_APPT_ENG" & "DROP_APPT_SPA" + +6. Set the following settings on both the DROP_APPT_ENG & DROP_APPT_SPA inbound groups + Welcome Message Filename: ---NONE--- + Play Welcome Message: NEVER + No Delay Call Route: Y + +7. Set up two Users(which will be used for Remote Agents) + User Number: 900000 & 910000 + +8. Set up two Remote Agents + User ID Start: 900000 & 910000 + Number of Lines: 1 + Server IP: + NOTE: On a multi-dialer cluster with multiple outbound campaigns, you will want to spread out Remote Agents across your active dialers + External Extension: 8300 + Status: ACTIVE + Campaign: assign one to the APPTENG campaign and the other to the APPTSPA campaign + +9. All agents will log into the "APPTAGNT" campaign and will select the "DROP_APPT_ENG" and/or "DROP_APPT_SPA" in-groups to take calls from when they log in, or managers can select those in-groups for the agents in the User Modify screen for those agents if they don't want their agents to have the ability to choose. + + + + + +HOW IT WORKS: + +When an outbound dialing campaign has the "Drop Call Seconds" set to '-1' and the "Drop Action" set to 'IN_GROUP' then the predictive dialing system will look for active agents logged in to other campaigns that have selected that campaign's "Drop Transfer Group" and will count them as agents in the outbound campaign, for the purposes of calculating how many calls to place outbound. For this reason, we recommend enabling the campaign "Available Only Tally" settings, to ensure too many calls are not being placed for agents already in phone calls since any agent with more than one campaign "drop in-group" selected will appear as more than one agent to the dialing system. The Remote Agents are used as a way of telling the system that the outbound dialing campaigns should be active, and when the "Drop Call Seconds" set to '-1' and the "Drop Action" set to 'IN_GROUP' then the first remote agent entry will be ignored for a campaign when the system calculates how many calls to place outbound. + +When "Drop Call Seconds" set to '-1' in a campaign, and a call is answered by a customer, the system will not even look for an agent in that campaign to send a call to, it will immediately drop the call to the selected drop in-group. With the In-Group "No Delay Call Route" set to 'Y', the system will attempt to send the call to an agent as fast as possible.