« Back to CTIOS Toolkit Questions

Killing an unanswered call before rerouting to queue

Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Hi,
      I have a case where i have to disconnect the call if the receiving agent does not answer the call instead of re-routing to the queue. To describe it in detail.
1) User calls agent. Agent and User are on call
2) Agent issues a MakeConsultCall to expert-agent
3) Expert does not answer the call since he/she is away from desk.
4) By the ACD configuration, the Expert-Agent's status is changed to "Not Ready" and the call is routed to the Queue or the next available agent in the queue.
5) The problem is that, whether an agent answers the call or not, The OnCallEstablished event is received on the originating agent's desk. There is no way to determine if the expert-agent answered or not.
 
In order to resolve this problem, i tried sending the following parameters while issuing the MakeConsultCall
1) POSTROUTE - false: Per the API guide, this is to enable or disable the post routing capabilities of the ICM to determine the new call destination.
 
2) CALLPLACEMENTTYPE - 5 (or CPT_DIRECT_AGENT): This specifies that the call is placed directly to the agent.
 
3) CALLOPTION - 1 (or COPT_CALLING_AGENT_ONLINE): This ensures that the cal is attempted only if the called agent is online.
 
None of these parameters helped me disconnect the consultcall if the expert did not answer. I tried sending them individually as well as together. What am doing wrong here? Any ideas?

I had a similar problem counting the times that a agent did not answer the call. From the opposite end of the dilema. There is an interesting thing that will tell you what happened. The Reason code  on an agent state event is set to 32767(-1 short int). Now this does not help the calling agent desktop as they do not see agent state events for other agents but what I did was create a web service that allowed me to message the calling desktop the result. There are various ways to do this such as a pub/sub web service or a central web service that monitors all events( monitor mode app ) and allows queries to be made by clients. Its a much more invloved way to solve the problem but I have used both very successfully. I could not find a way to solve several problems "out-of-box" so I simply made my own box emoticon  Hope this helps some. Below is a snippet from my code where I am processing the problem you described.
 
 
if ((AgentState)agentState == AgentState.eNotReady &&
   a_Args.GetValueInt(Enum_CtiOs.CTIOS_EVENTREASONCODE, out reasonCode) &&
   reasonCode == 32767)
   {
   // Agent did not answer phone and state was changed to Not Ready.
   }

Is the callEstablished received because the call gets answered by the next agent in the Queue? Have you tried to configure your UCCE for the Agent not to forward calls on no answer.

Interesting work around.

Shannon: Great suggestion. It works fine. Thanks.
 
David: Callestablished is fired. I will not be able to change the configuration to drop the call if unanswered, since that is how they need it to be in the production setup. I was wondering if there was any parameters that i can pass to bypass this configuration. I tried three of them that i have mentioned in the previous post. Not sure if there is anything else that i can try. Still looking...
 
In continuation of my question, is it possible to get a list of all the agents on the conference if i am trying a singlestepconference instead. I know that singlestepconference is not a suggested way, but i have no choice. I have to implement that too. After a conference is established, is there a way to get a list of all the folks on the conference?

Shannon: Great suggestion. It works fine. Thanks.
 
David: Callestablished is fired. I will not be able to change the configuration to drop the call if unanswered, since that is how they need it to be in the production setup. I was wondering if there was any parameters that i can pass to bypass this configuration. I tried three of them that i have mentioned in the previous post. Not sure if there is anything else that i can try. Still looking...
 
In continuation of my question, is it possible to get a list of all the agents on the conference if i am trying a singlestepconference instead. I know that singlestepconference is not a suggested way, but i have no choice. I have to implement that too. After a conference is established, is there a way to get a list of all the folks on the conference?




 
The eCallConferenceEvent has a Arguments Array of ConnectedParty that lists everyone on the call. That should do the trick for you. The previous web service/monitor mode app works well for this too.
 
Here is an example of the event.
 
MessageID:eCallConferencedEvent ICMEnterpriseUniqueID:icm.149463.112 DeviceUniqueObjectID:device.5000.4000 ConnectedParty[1]: (ConnectedPartyCallID:16779634 ConnectedPartyDeviceIDType:1 ConnectedPartyDeviceID:4004) ConnectedParty[2]: (ConnectedPartyCallID:16779634 ConnectedPartyDeviceIDType:0 ConnectedPartyDeviceID:4000) ConnectedParty[3]: (ConnectedPartyCallID:16779634 ConnectedPartyDeviceIDType:0 ConnectedPartyDeviceID:4001))
Got Event eCallEndEvent - (CallType:12 DeviceID:4000 UniqueObjectID:call.5000.16779635.4000 CallStatus:eCallConnectionConnect MessageID:eCallEndEvent ICMEnterpriseUniqueID:icm.149463.112 DeviceUniqueObjectID:device.5000.4000)
 
edited to remove the emoticons embedded in the syntax

That doesn't work because this event is fired well before the agent-2 answers the call and hence will always have all 3 parties (user, agent1, agent2). I am looking for a way to remove only agent2 from the conference if he doesn't answer. But because of a script, the call is routed to the queue. How can i remove only one person from a conference call programmatically? In my case the code at Agent1's end should remove Agent 2 from the call.

That doesn't work because this event is fired well before the agent-2 answers the call and hence will always have all 3 parties (user, agent1, agent2). I am looking for a way to remove only agent2 from the conference if he doesn't answer. But because of a script, the call is routed to the queue. How can i remove only one person from a conference call programmatically? In my case the code at Agent1's end should remove Agent 2 from the call.

 
In that case I would use TAPI. CtiOs is not great at traditional CTI so sometimes you have to revert to Telephony specific APIs to do pbx specific stuff. I also had this problem trying to track private line usage by agents because CtiOs doesn't track private lines. So I used TAPI in a web service that connected all all the agent private lines and allowed me to do things that CtiOs just woudn't do. There is no reason TAPI cannot control the agent line just as easily and give you full control.

David Lender (467)
Shannon McCoy (91)
Arthur Shats (57)
Christopher Nagel (47)
GEOFFREY THOMPSON (38)