Discover R.iT Blog

Intelligentes Anruf-Routing mit Swyx

Geschrieben von Bastian Nowak | 19.06.19 10:00

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