Agent Dialer


For developer

Introduction

The Ozeki Phone System Agent Dialer, connected to Ozeki Phone System, makes it possible to make outgoing calls based on a specifed list. Ozeki Phone System Agent Dialer can forward the established calls to one of the available agents on a predictive way. It forwards the call to the agents, in the case if the call was successful. More calls can be established at the same time depending on the number of the available agents. This feature can save a great deal of time for agents and can increase productivity. The selection of the agents can take place by various algorithms.

Software requirements

  • Microsoft Windows 7, 8, 10, Vista
  • Microsoft Visual Studio 2012, .NET 4.0
  • Ozeki Phone System

Installation and Configuration of Ozeki Phone System

In order to connect to the server, Ozeki Phone System has to be installed. A Setup Guide can be found here: How to install and configurate your Ozeki Phone System, the installation package can be downloaded from the following page: Download. After the installation, the main page of the PBX can be accessed on the http://localhost:7777/Home address.


Figure 1 - Ozeki Phone System login screen

For the first login attempt, use the username and password, which was provided during the installation process.

New user can be added to the system with the Add user button. It can be found under the Office users menu item in the Connections menu.


Figure 2 - Add new user

The username and password specified here can be used to connect to the system, in the OPSClient LoginAsync method.


Figure 3 - New user configuration panel

Project development

  1. Let us create a new WPF Application project with the help of File/New/Project menu item.
  2. Let us add the OPSSDK.dll file to the project references in the Solution Explorer by clicking on Add Reference… menu item. This will ensure the connection interface to Ozeki Phone System.

Implementation

In the project the implementation uses the OzCommon and the OzCommonBroadcasts projects and the GUI elements of the Ozeki Phone System Agent Dialer are built upon these.

1. Model

The AgentDialerViewModel is a model class. The AgentDialer class is created, here the calls will be scheduled, the call forwarding process will be executed and it handles the agents. The AgentDialer gets those settings that are stored in IGenericSettingsRepository. The AppPreferences is a model class that represents settings, that includes the current agents (AgentInfo). This basically represents one user in Ozeki Phone System but during operation the AgentEntry class contains the status of the agent, the number of its calls. In the settings, there are the name of the statuses that needs to be retried, there are the maximum calls at the same time (which cannot be more than the number of the agents agents), the selection method of the agent and the set API extension identifier. In the InitSettings() method the default values will be set, the system will get the content of the phone book from the Ozeki Phone System client in order to select the agents from the users in the settings window. Since the AgentDialerViewModel derives from the BroadCastMainViewModel, the methods for importing the call list are inherited. The class of CustomerEntry will contain the data related to the client and the csv file will contain the name and the telephone number seperated with a comma (,).

The read elements will go to a ObservableCollection, this way, the client related entries in the DataGrid will be also displayed on the GUI that will represent the status of the current calls.

2. AgentDialer

The AgentDialer class handles the calls and their scheduling based on a client list. Its predecessor is Scheduler<CustomerEntry>, this way the functionalities can be easily used for scheduling. The StartWorks( ObservableCollectionEx<CustomerEntry>observableCollectionEx) method calls the InternalStart( ObservableCollectionEx<CustomerEntry> observableCollectionEx) method on a new thread. The InternalStart method through the surface of the IClient, gets the API extension from Ozeki Phone System where its ID was specified in the settings. In case of successful query, the method goes through the client list, skips the finished and the missed calls from the RetryStates list because the calling process can be restarted after the method went through the list. The API extension will call the next client on its assigned telephone number after the call has been established.

  ICallcall = apiExtension.CreateCall(customer.PhoneNumber);
  	…
  call.Start();

We are needed to be notified about the modification of the call’s status. That is why we have to subscribe for the CallStateChanged and the CallError events in the ICall before the establishment of the call. Before the call, we set set the state of the client to calling, this way this information can be displayed on the GUI because of the usage of binding and ObservableCollection. In this Task thread, if we reached the simultaneous calls establishment limit, then we will wait for the set of AutoResetEvent until the call ends.

If in the ApiCallStateChanged()method the call has a CallState.InCall status, (the client received the call) we select an available agent. Depending on the settings, we take it into consideration that how many calls the agents had so far and we select the agent with the fewest calls. After this, we transfer the active call (between the API extension and the client) to the selected agent and then we assign the selected AgentEntry to a CustomerEntry that we can reach based on the call ID from the stored ObservableCollection.

  var target = handlingAgent.AgentInfo.PhoneNumber;
  call.BlindTransfer(target);
  var handledCustomer = Customers.FirstOrDefault(customer => customer.CallId == call.CallId);

In case if the status of the call is CallState. Completed and no agent can be found for CustomerEntry , then the call ends before the AgentDialer could transfer it to an agent. We subscribed for the Ozeki Phone System XE Client SessionCompleted event in the constructor of the AgentDialer. This way, in the ClientOnSessionCompleted method we will get a notification about the call status changes that took place between the client and the agent. It is necessary because after transferring, the calling of the API extension terminates. After this, we will be notified through only sessions about the termination of the call between the two parties. We can distinguish the terminated calls between the parties if:

  • we check the caller ID of the terminated calls in the extensions of the agents
  • we check whether there are more active sessions where there is the extension of the agent

In case if all the conditions are met and we found the call at issue, then the CallEnded( AgentEntry agent, CustomerEntry customer, ProgressState state) is called that

  • updates the status of the agents (makes them available) if a terminated call is at an agent.
  • updates the status of the client based on the provided parameter and it is also displayed on the GUI.
  • with AutoResetEvent the Set()-et is called and therefore after the inspection it keeps going through the clients.


Download Installer    Download Source Code




More information