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