Intelligentes Anruf-Routing mit Swyx

Die Herausforderung

Unsere Support-Hotline ist intern eine parallel signalisierende Rufgruppe. Heißt: ein Anruf wird an alle Kollegen, die im Support arbeiten, gleichzeitig signalisiert. Das führt natürlich auch dazu, dass ein eingehender Anruf nicht immer von demjenigen entgegengenommen wird, der bereits zuvor mit dem Anrufenden gesprochen hat. Dadurch entstehen natürlich manchmal unnötige Wartezeiten für den Anrufer – und unnötige Störungen für andere Kollegen, die den Ruf weiterleiten müssen.

Natürlich ist das nicht nur für uns ärgerlich – und nicht besonders effizient, sondern stieß in Zufriedenheitsumfragen auch bei unseren Kunden auf Kritik. Daher habe ich die Herausforderung angenommen und nach einer besseren Lösung gesucht.

Die Lösung – Ausgangslage

Erfreulicherweise steht mir dafür seit Beginn des Jahres eine neue Telefonanlage zur Verfügung. Wir haben von einer etwas betagten Agfeo auf SwyxWare 11 umgestellt. Eine moderne und software-definierte Lösung, deren Grenzen – so scheint es mir – nur durch die Kreativität des Admins gesteckt sind. Sie zeichnet sich insbesondere durch ein extrem flexibles Anruf-Routing ("Extended Call Routing") aus, welches in einem visuellen Editor Flow Chart-ähnlich konfiguriert wird. Und falls die bereitgestellten Standardfunktionen nicht ausreichen, kann mit VBScript nachgeholfen werden.

Meine Idee war einfach: Wenn ein Kunde anruft, möchte ich wissen, ob er im Zeitraum x bereits mit uns gesprochen hat. Falls das der Fall ist, möchte ich ihn direkt mit dem Mitarbeiter verbinden, mit dem er zuletzt im Support telefoniert hat.

Die Lösung – benötigte Daten beschaffen

Etwas komplizierter war die Umsetzung. Zu allererst musste ich mir Informationen darüber beschaffen, mit wem ein Anrufer zuletzt gesprochen hat. Hierfür konnte ich eine Standardfunktionalität von SwyxWare heranziehen. Ein detailliertes Anrufprotokoll wird von der Anlage aufgezeichnet. Auf Wunsch auch in eine MSSQL-Datenbank. Das haben wir natürlich konfiguriert. Mit dem passenden T-SQL Statement kam ich so spielend an die nötige Information.

Um das einfach nutzbar zu machen, habe ich Unterstützung unserer Entwicklungsabteilung bekommen. Aus dem hergestellten T-SQL Statement wurde eine "stored procedure" mit den nötigen Eingabe- und Rückgabewerten.

Hinein geht natürlich die Rufnummer des Anrufenden, ein Intervall, in dem nach Anrufen gesucht werden soll sowie zuletzt ein Standardrückgabewert, falls nichts gefunden wird. Letzteres kann man natürlich auch hard-codieren. Aber da die Funktion später auch anderen Abteilungen / Rufgruppen zur Verfügung stehen sollte, ist er als dynamischer Übergabeparameter umgesetzt worden. Als Rückgabewert gibt es dann natürlich entweder die Nebenstelle, an die der Anruf direkt gehen soll, oder den Standardrückgabewert. Insgesamt sieht das dann so aus:

-- =============================================

-- Author:          R.iT GmbH, Simon Münstermann-Zimmermann & Markus Rüping

-- Create date: 2019/06/05

-- Description:     Ermittelt den letzten Anrufer innerhalb des übergebenen Zeitrahmens in Minuten

-- =============================================

CREATE PROCEDURE [dbo].[CheckForLastConnectedReceiver]

 

@callingNr NVARCHAR(MAX),

@searchTimeMinutesIntervall INT,

@defaultReturnValue INT,

@ReturnVal INT OUTPUT

 

AS

BEGIN

       -- SET NOCOUNT ON added to prevent extra result sets from

       -- interfering with SELECT statements.

       SET NOCOUNT ON;

 

       IF ((SELECT COUNT(*)

                    FROM [dbo].[IpPbxCDR]

                    WHERE OriginationNumber = @callingNr

                           AND ConnectTime IS NOT NULL

                           AND EndTime BETWEEN DATEADD(MI,-@searchTimeMinutesIntervall,GETDATE()) AND GETDATE())

                           > 0)

             BEGIN

                    SELECT TOP 1 @ReturnVal = DestinationNumber

                    FROM [dbo].[IpPbxCDR]

                           WHERE OriginationNumber = @callingNr

                           AND ConnectTime IS NOT NULL

                    ORDER BY CallId DESC

           END

       ELSE

             SET @ReturnVal = @defaultReturnValue

 

END

 

Die Lösung – Informationen verwerten

Mit einer fertigen Funktion im SQL-Server muss jetzt nur noch SwyxWare dazu gebracht werden, diese auch zu verwenden. Wie eingangs erwähnt, braucht es dazu VBScript.

Hier muss also bei eingehendem Anruf eine Datenbankverbindung hergestellt, die stored procedure mit den nötigen Übergabewerten aufgerufen und der Rückgabewert als Durchwahl verwendet werden. Klingt komplizierter, als es ist. Einzige Herausforderung ist, dass in der Laufzeitumgebung des VBScripts keine Standard-Konstanten zur Verfügung stellen. Die konkret benötigten wurden daher deklariert. Heraus kam folgendes:

Function CallerLookupandRouting (ByVal callerID)

 

  ' set ado consts

  Const adInteger = 3

  Const adVarChar = 200

  Const adParamInput = &H0001

  Const adParamOutput = &H0002

  Const adParamReturnValue = &H0004

 

  ' set basic constants

  const TimeWindow = 60

  const DefaultRoute = 228

 

  ' setup database connection

  Dim cmd

  Dim sp

 

  ' define stored procedure

  sp = "dbo.CheckForLastConnectedReceiver"

 

  ' build query

  Set cmd = CreateObject("ADODB.Command")

  cmd.ActiveConnection = "Provider=sqloledb;Data Source=DB02;Initial Catalog=SwyxCDR;Integrated Security=SSPI;MultiSubnetFailover=true"

  cmd.CommandType = 4

  cmd.CommandText = sp

  cmd.Parameters.Append cmd.CreateParameter(, adInteger, adParamReturnValue, , NULL)

  cmd.Parameters.Append cmd.CreateParameter("@callingNr", adVarChar, adParamInput, 30, callerID)

  cmd.Parameters.Append cmd.CreateParameter("@searchTimeMinutesIntervall", adInteger, adParamInput, , TimeWindow)

  cmd.Parameters.Append cmd.CreateParameter("@defaultReturnValue", adInteger, adParamInput, , DefaultRoute)

  cmd.Parameters.Append cmd.CreateParameter("@ReturnVal", adInteger, adParamOutput)

  cmd.Execute()

 

  ' some debug information

  PBXScript.OutputTrace "Eingabe SQL Anrufernummer = " &callerID

  PBXScript.OutputTrace "Eingabe SQL Suchintervall = " &TimeWindow

  PBXScript.OutputTrace "Eingabe SQL Standardrückgabewert = " &DefaultRoute

  PBXScript.OutputTrace "Rückgabe SQL Durchwahl = " &cmd.parameters("@ReturnVal")

 

  ' return sql result

  CallerLookupandRouting = cmd.parameters("@ReturnVal")

 

  ' close database connection

  Set cmd = Nothing

 

End Function

 

Die Lösung – Call Routing Script

Ich habe nun eine Funktion, die mir im Call Routing der SwyxWare zur Verfügung stehen soll. Diese wird im Start-Block des Anrufroutings definiert. Damit

kann ich dann später im "Durchstellen"-Block einfach die Funktion mit der anrufenden Nummer als Übergabewert aufrufen. Etwas vereinfacht aufgebaut sieht unser Anrufrouting dafür nun wie folgt aus:

 

Fazit

Die kleine Scriptlogik hat immense Auswirkungen. In den wenigen Tagen, seitdem wir sie nutzen, haben wir schon enormes positives Feedback von unseren Kunden eingesammelt. Aber auch die Kollegen sind deutlich zufriedener, denn niemand muss – wenn vermeidbar – Telefonist spielen.

Interesse geweckt? Lassen Sie uns telefonieren!

Sie erreichen unseren Vertrieb unter +49 (234) 438800-23

Beitrag teilen: