• V20: 3CX Re-engineered. Get V20 for increased security, better call management, a new admin console and Windows softphone. Learn More.

Different queue prompts ("No agents logged on" and "All agents busy")

Status
Not open for further replies.

bpgaw

Joined
Nov 22, 2018
Messages
2
Reaction score
0
Hello,

We are currently trying to build a queue system which can distinguish between the following cases:

  • Case 1: No agents logged into the queue: Play audio prompt "Please send us an e-mail instead" immediately and disconnect.
  • Case 2: Agents logged in, but all of them are busy: Play audio prompt "Please try again later" immediately and disconnect.
  • Case 3: Agents logged in and available: Transfer call to agent.
We wanted to use the "Destination if no answer" setting of our queue, but it cannot distinguish between calls that are not answered because no agent is logged on (Case 1) and calls that are not answered because all agents are busy (Case 2).

As an alternative, we tried to build a two-queue system. On Queue 1, all incoming calls are accepted. Using a CFD call flow, we determine if any agents are logged in to Queue 2 at all ("Get Queue Extensions" component). If there aren't any, a prompt is played immediately and the caller is disconnected (Case 1). If there are agents logged in to Queue 2, the call is transferred to Queue 2. This covers Case 1, but we are still stuck distinguishing between Cases 2 and 3.

We tried to use "Destination if no answer" in the settings of Queue 2. If we could set the "Maximum queue wait time" to 1 second, calls that land in the queue (because agents are logged on, but no one is available) are immediately forwarded to a digital receptionist which can play the prompt "Please call again later". Unfortunately, for some reason, 3CX only allows us to set 15 seconds or more. That means that even if no agents are available, the phone will ring for 15 seconds before the call can be redirected to the digital receptionist.

We thought about using Call Groups, because we can more freely define the ring time there, but we need our agents to be able to log in and out, so we need to use queues.

We also tried moving the logic into the CFD call flow by using a slightly modified script from https://www.3cx.com/community/threads/find-amount-of-available-call-queue-agents.49551/#post-201302, but couldn't get it working. dnAgent.GetActiveConnections().Length always returns 0, so we cannot find out whether the agent is currently calling someone. And checking whether extAgent.CurrentProfile.Name == "Available" does not seem to account for agents that are currently "Busy".

Has anyone tried to implement a similar queue logic? Did you use CFD or is there a way to implement this using the "regular" 3CX settings?

Thanks in advance!
 
I would place a CFD in front of your queue. Have the CFD determine whether anyone is logged into the queue, or if all the agents are busy, and then either forward the call on to the queue, or play the appropriate promt and hang up. It may be necessary to use an external c# script and the Call Control API to get some of the needed information, but it can all be done with a CFD.
 
Thank you for your quick response!

Okay, so at least our idea to implement it as a CFD wasn't too bad. We did toy around with the script I mentioned in the other post (https://www.3cx.com/community/threads/find-amount-of-available-call-queue-agents.49551/#post-201302), but could not get it to work. It does not properly distinguish between Case 2 and 3, because it does not correctly recognize agents that are logged on, but busy. We used the following script (relevant lines emphasised):

using TCX.Configuration;

namespace FAgentsCount
{
public class FreeAgentsCheck
{
public bool CheckFreeAgents(string strExtNumber)
{
Queue quCallQueue = (Queue) PhoneSystem.Root.GetDNByNumber(strExtNumber);
DN[] dnQueueMembers = quCallQueue.Members; /* Array mit allen in der Queue angemeldeten Agenten */
bool bAgentFree = false;
bool bAgentLoggedIn = false;
bool bAgentAvailable = false;

foreach (DN dnAgent in dnQueueMembers)
{
Extension extAgent = (Extension) dnAgent;
bAgentFree = dnAgent.GetActiveConnections().Length == 0; /* Nicht im Gespräch */
bAgentLoggedIn = extAgent.QueueStatus == QueueStatusType.LoggedIn; /* Im Queue angemeldet */
bAgentAvailable = extAgent.CurrentProfile.Name == "Available"; /* Status ist "Available" */
if (bAgentFree && bAgentLoggedIn && bAgentAvailable)
{
return true;
}
}
return false;
}
}
}

The method GetActiveConnections always returns 0, so the script always assumes the agent is not currently calling any one. It also thinks that agents are "Available", even if they are currently in a call (it does not recognise "Busy"). This means the script always returns true and therefore the call is always transferred to Queue 2, even if no agents are available.

Are we not using the proper methods? The API documentation mentions that GetActiveConnections is obsolete, but does not offer an alternative.
 
Status
Not open for further replies.
Get 3CX - Absolutely Free!

Link up your team and customers Phone System Live Chat Video Conferencing

Hosted or Self-managed. Up to 10 users free forever. No credit card. Try risk free.

3CX
A 3CX Account with that email already exists. You will be redirected to the Customer Portal to sign in or reset your password if you've forgotten it.