Added SHARED_... campaign dial method auto-dial options, for more efficient agent multi-campaign dialing. Read the AGENT_MULTI-CAMPAIGN_DIALING.txt document for more information.

git-svn-id: svn://192.168.202.10@3339 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
mattf
2021-01-02 22:05:07 +00:00
parent d23f5e1dbf
commit e8fff646ab
12 changed files with 600 additions and 73 deletions
+75 -23
View File
@@ -1,7 +1,9 @@
AGENT MULTI-CAMPAIGN DIALING DOC Started: 2020-08-24 Updated: 2020-11-17
AGENT MULTI-CAMPAIGN DIALING DOC Started: 2020-08-24 Updated: 2021-01-02
NOTE: Requires VICIdial svn/trunk code revision 3284 or higher to work properly!!!
NOTE: The new SHARED campaign dial method requires VICIdial svn/trunk code revision 3339 or higher to work properly!!!
NOTE: THIS FEATURE IS OPTIONAL, AND SHOULD ONLY BE CONFIGURED AFTER YOUR SYSTEM
HAS BEEN INSTALLED AND TESTED!
@@ -35,7 +37,7 @@ First, a description of how to use List Overrides on multiple lists in a single
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.
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. (There is also a newer and more efficient option for Shared Agent Multi-Campaign outbound dialing using the "SHARED_" Dial Methods that you can read about below this section.)
NOTE: The following instructions below assume that you already know how to set up and run an outbound auto-dialing campaign.
@@ -71,6 +73,7 @@ NOTE: The following instructions below assume that you already know how to set u
Dial Method: RATIO
Allow No-Hopper-Leads Logins: Y
Allowed Inbound Groups: select both "DROP_APPT_ENG" & "DROP_APPT_SPA"
* Do not assign any active lists to this campaign
6. Set the following settings on both the DROP_APPT_ENG & DROP_APPT_SPA inbound groups
Welcome Message Filename: ---NONE---
@@ -106,11 +109,9 @@ When "Drop Call Seconds" set to '-1' in a campaign, and a call is answered by a
THE PROBLEM OF "OVER-DIALING":
When you allow a single agent to have multiple calls placed for them, there can always be a problem with "over-dialing", even when only using a single campaign. This issue is more complicated though when that same level of dialing is happening across multiple campaigns. At a minimum, the campaign "Available Only Tally" settings should be the first things you check to see if they are active. Beyond that, there really are not any simple solutions for it.
When you allow a single agent to have multiple calls placed for them, there can always be a problem with "over-dialing", even when only using a single campaign. This issue is more complicated though when that same level of dialing is happening across multiple campaigns. At a minimum, the campaign "Available Only Tally" settings should be the first things you check to see if they are active. Beyond that, there really are not any simple solutions for it. Because of this, we added a new campaign feature, detailed below.
One possible development option would be allowing for campaigns to have their dial levels set to a value below "1.0", which would not dial any calls unless there were more agents available to take calls from a specific campaign. There are multiple issues with making this work on the back-end that will need to be programmed around, as well as the problem that some campaigns which can't get above the 1.0 threshold to place a call with the number of agents logged-in not being able to place any calls at all. But if you aren't planning on having single agents dialing by themselves for a campaign at any point, this would be the simplest and quickest solution to try. This option would be 12 hours of development time.
Another much more complex development option would be to add a new campaign dialing method "SHARED_RATIO" that would be specifically for shared agent campaigns that would operate somewhat like a round-robin system for shared campaign dialing. For instance, if only one agent is logged-in with dialing happening for that agent across 3 campaigns, each of those 3 campaigns would take turns dialing for that one agent. The number of calls would be calculated based on the number of agents that could take calls from each campaign, and the number of campaigns each agent is set to take calls from. This would be a very complex project to complete, but it would be the most efficient option with the best possibility for a balance between keeping agents on the phone and not dropping calls under all conditions(even single-agent dialing). This option would be 40 hours of development time.
We have added a new campaign dialing method "SHARED_..." that is specifically for shared agent campaigns that will operate somewhat like a round-robin system for shared agent campaign dialing. For instance, if only one agent is logged-in with dialing happening for that agent across 3 campaigns, each of those 3 campaigns would take turns dialing for that one agent. The number of calls would be calculated based on the number of agents that could take calls from each campaign, and the number of campaigns each agent is set to take calls from. This was a very complex project to complete, but it is the most efficient option with the best possibility for a balance between keeping agents on the phone and not dropping calls under all conditions(even single-agent dialing).
@@ -118,28 +119,78 @@ Another much more complex development option would be to add a new campaign dial
*********************** The following are notes for how this second option might work:
*********************** The following are notes for how the new "SHARED_..." campaign Dial Methods work:
How a "SHARED_RATIO" dial method would work:
1. New code added to the AST_VDadapt.pl and AST_VDauto_dial.pl(and FILL) scripts that would(for agents logged into shared-dialing campaigns, for dialing purposes only) rotate them among the campaigns that they are able to take calls from, while still allowing them to have calls from any of those campaigns sent to them any time they are available.
2. Change the dialing algorithm(for campaigns with a "SHARED_" dial method only) to use a count of calls placed by all shared campaigns on the system as a total, instead of only each campaign. This would prevent over-dialing as agents are rotated from dialing-campaign to dialing-campaign.
3. The agent-dialing-campaign-rotation process would attempt to balance agents by time(round-robin-like) across the campaigns that they are assigned to take calls from.
4. New database fields/tables to store the temporary dialing campaign designations for each agent and what other campaigns they had just been assigned to
5. New debug Admin Utilities report that would show everything that is going on for shared campaigns in the process of agent rotation and shared ratio dialing
How a "SHARED_..." dial methods work:
1. New code added to the AST_VDadapt.pl and AST_VDauto_dial.pl scripts that will(for agents logged into shared-dialing campaigns, for dialing purposes only) rotate them among the campaigns that they are able to take calls from, while still allowing them to have calls from any of those campaigns sent to them any time they are available.
2. Change the dialing algorithm(for campaigns with a "SHARED_" dial method only) to prevent over-dialing as agents are rotated from dialing-campaign to dialing-campaign.
3. The agent-dialing-campaign-rotation process attempts to balance agents by time(round-robin-like) across the campaigns that they are assigned to take calls from.
4. New database fields/tables were added to store the temporary dialing campaign designations for each agent and what other campaigns they had just been assigned to
5. Add shared debug output to existing Admin Utilities "Campaign Debug Report" that will show everything that is going on for shared campaigns in the process of agent rotation and shared outbound dialing
Agent rotation steps, added to the AST_VDadapt.pl script: (see new database changes below for details on the DB storage of this data)
- runs once every interval[2.5 sec, 15 sec, 1 minute] <- haven't decided this yet
- runs once every 1 minute
- for each agent, gather all campaigns they can dial for, and their current dial_campaign
- delete from vicidial_agent_dial_campaigns any campaigns agent is no longer dialing for, update validate_time for others
- set dial_campaign to ''(blank)
- grab oldest vicidial_agent_dial_campaigns.dial_time campaign_id for each agent and update vicidial_live_agents.dial_campaign_id then update dial_time
- set dial_campaign to ''(blank) if no active campaigns or agent had removed all drop in-groups
- at Timeclock-end-of-day, wipe out everything in vicidial_agent_dial_campaigns table older than 5 minutes and optimize table
Shared campaigns outbound dialing steps:
- gather all campaigns that are using a SHARED_ dial method, use that list to count current calls and calculate how many new calls can be placed for all shared campaigns
- when counting for agents in the campaign, use the vicidial_live_agents.dial_campaign_id field
- when allocating dials for each campaign, sort by oldest dial first(vicidial_campaigns.campaign_calldate) or by new ranking field(vicidial_campaigns.shared_dial_rank)
- gather all campaigns that are using a SHARED_ dial method, use that list to count current calls and calculate how many new calls can be placed for each of the shared campaigns
- when counting for agents in the campaign to dial for, use the vicidial_live_agents.dial_campaign_id field
- when allocating dials for each campaign, sort by:
- campaign shared agent dial ranking field(vicidial_campaigns.shared_dial_rank) *then*
- oldest agent call handled(vicidial_live_agents.last_call_time)
The following are instructions for how to set up a "SHARED_" set of campaigns:
1. Set up three campaigns:
SHIPENG(Shipping English)
SHIPFRE(Shipping French)
SHIPAGNT(Shipping All Agents)
2. Set up two lists:
1201(Shipping English List), assigned to the SHIPENG campaign
1202(Shipping French List), assigned to the SHIPFRE campaign
3. Set up two Inbound Groups to use as Drop In-Groups:
DROP_SHIP_ENG(Shipping English Drop InGroup)
DROP_SHIP_FRE(Shipping French 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 SHIPENG & SHIPFRE 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: SHARED_ADAPT_AVERAGE or SHARED_RATIO
Available Only Tally: Y
Drop Call Seconds: -1
Drop Action: IN_GROUP
Drop Transfer Group: DROP_SHIP_ENG(for the SHIPENG campaign) or DROP_SHIP_FRE(for the SHIPFRE campaign)
5. Set the following settings on the SHIPAGNT campaign:
Allow Inbound and Blended: Y
Dial Method: RATIO
Allow No-Hopper-Leads Logins: Y
Allowed Inbound Groups: select both "DROP_SHIP_ENG" & "DROP_SHIP_FRE"
* Do not assign any active lists to this campaign
6. Set the following settings on both the DROP_SHIP_ENG & DROP_SHIP_FRE inbound groups
Welcome Message Filename: ---NONE---
Play Welcome Message: NEVER
No Delay Call Route: Y
7. All agents will log into the "SHIPAGNT" campaign and will select the "DROP_SHIP_ENG" and/or "DROP_SHIP_FRE" in-groups to take calls from as well as selecting the "BLENDED CALLING" checkbox when they log in, or managers can select those in-groups and the "Closer Default Blended" for the agents in the User Modify screen for those agents if they don't want their agents to have the ability to choose.
* NOTES:
- The "SHARED_..." campaign dial method does not require the use of Remote Agents at all, and the live agents do need to select to take blended (outbound) calls or no calls will be placed for them as they rotate through the shared agent campaigns.
- For SHARED agent campaigns, there will be an additional campaign setting: "Shared Dial Rank", which will allow you to prioritize the dialing of your shared campaigns as calls are placed for them.
@@ -147,8 +198,14 @@ DATABASE CHANGES: !!!!!! FOR DOCUMENTATION PURPOSES ONLY !!!!!
ALTER TABLE system_settings ADD allow_shared_dial ENUM('0','1') default '0';
ALTER TABLE vicidial_campaigns ADD shared_dial_rank TINYINT(3) default '99';
ALTER TABLE vicidial_campaigns MODIFY dial_method ENUM('MANUAL','RATIO','ADAPT_HARD_LIMIT','ADAPT_TAPERED','ADAPT_AVERAGE','INBOUND_MAN','SHARED_RATIO','SHARED_ADAPT_HARD_LIMIT','SHARED_ADAPT_TAPERED','SHARED_ADAPT_AVERAGE') default 'MANUAL';
ALTER TABLE vicidial_live_agents ADD dial_campaign_id VARCHAR(8) default '';
CREATE TABLE vicidial_agent_dial_campaigns (
campaign_id VARCHAR(8),
group_id VARCHAR(20),
user VARCHAR(20),
validate_time DATETIME,
dial_time DATETIME,
@@ -158,8 +215,3 @@ index (campaign_id)
CREATE UNIQUE INDEX vadc_key on vicidial_agent_dial_campaigns(campaign_id, user);
ALTER TABLE vicidial_live_agents ADD dial_campaign_id VARCHAR(8) default '';
ALTER TABLE vicidial_campaigns ADD shared_dial_rank TINYINT(3) default '0';
ALTER TABLE vicidial_campaigns MODIFY dial_method ENUM('MANUAL','RATIO','ADAPT_HARD_LIMIT','ADAPT_TAPERED','ADAPT_AVERAGE','INBOUND_MAN','SHARED_RATIO','SHARED_ADAPT_HARD_LIMIT','SHARED_ADAPT_TAPERED','SHARED_ADAPT_AVERAGE') default 'MANUAL';