myContactCenterHandbuch

Beispiele für Agentenskripte

Vollständige C#-Beispiele für Kundenmasken, zeitabhängige Abmeldung und Tätigkeit, Qualifikationsabfragen und Statuslampen in der V10.

Jeder Codeblock ist ein eigenständiges Agentenskript. Im System gibt es nur ein solches Skript: Verbinden Sie bei Bedarf die benötigten Ereignisse in einer Klasse AgentScript, statt mehrere Klassen zusammenzukopieren. Ein Ereignis darf dabei nur einmal überschrieben werden. Die Beispiele verwenden die öffentliche Schnittstelle der V10, keine alten VB-Skripte.

Zur Einrichtung siehe Agentenskript, zu den Daten Produktdaten. CRM-Adresse, Uhrzeiten und Kennungen müssen Sie anpassen. Prüfen Sie Aktionen zunächst mit Testagenten.

Vorlage und Ereignisse

Die Agenten-API ist im Konstruktor noch nicht gesetzt; verwenden Sie sie erst in Ereignissen. Diese Vorlage reagiert auf den Zustandswechsel einer eigenen Konversation. Für diesen Wechsel gilt der Parameter state; conversation.State kann beim Verarbeiten bereits einen neueren Stand haben.

using System;
using ilogixx.SharedFiles.GeneralDefinitions;
using ilogixx.SharedFiles.GeneralEnums;

namespace ilogixx.Agent;

public sealed class AgentScript : MyCCAgentScript
{
    public override void My_ConversationStateChanged(Struct_Conversation conversation, ConversationState previousState, ConversationState state)
    {
        try
        {
            if (conversation is null) return;

            Trace.Info("Conversation state changed", state);
        }
        catch (Exception ex)
        {
            Trace.Error(ex);
        }
    }
}

Befehle und Antworten

Befehl Wirkung und Grenze
BrowseTo(url, true) öffnet eine Adresse in einem neuen Reiter des Moduls Browser
Logoff() fragt die Abmeldung an; Antwort und gegebenenfalls ein Dialog bestimmen den weiteren Ablauf
Activity(true) fragt den Beginn einer Tätigkeit an; die Tätigkeit wird im vorgesehenen Dialog gewählt
Activity(false) beendet die laufende Tätigkeit
Wrapup(true) fragt normale Nacharbeit an
Agent.GetLanguageQualification(languageId) liest eine wirksame Sprachqualifikation als Zahl
Agent.GetSkillQualification(skillId, qualificationType) liest eine wirksame Wissensgebietsqualifikation für die gewählte Konversationsart
ShowBusyLight(state) setzt eine angeschlossene, unterstützte Statuslampe anhand eines Zustands

Eine Anfrage bestätigt noch keine ausgeführte Aktion. Beschränkungen, Rechte und Benutzerentscheidungen gelten weiterhin. My_AgentLogoffPermissionReceived und My_AgentActivityPermissionReceived liefern die jeweilige Antwort. Fragen Sie dort nicht dieselbe Aktion erneut an; dadurch könnte eine Schleife entstehen. Weitere Signaturen stehen unter Ereignisse und Befehle.

Kundenmaske einmal je Konversation öffnen

Ein Flow hat „Kundennummer“ als Zusatzdatum angehängt. Das Beispiel öffnet die Kundenmaske beim ersten Verbinden eines eingehenden Anrufs. Es merkt sich alle geöffneten Konversationen, damit auch bei paralleler Bearbeitung Halten und Zurückholen kein zweites Fenster erzeugen. Beim Entfernen einer Konversation wird die Kennung aus dem lokalen Speicher entfernt.

using System;
using System.Collections.Generic;
using ilogixx.SharedFiles.GeneralDefinitions;
using ilogixx.SharedFiles.GeneralEnums;

namespace ilogixx.Agent;

public sealed class AgentScript : MyCCAgentScript
{
    private readonly HashSet<string> openedConversations = [];
    private const string customerNumberKey = "Kundennummer";
    private const string customerPage = "https://crm.example.com/kunde";

    public override void My_ConversationStateChanged(Struct_Conversation conversation, ConversationState previousState, ConversationState state)
    {
        try
        {
            if (conversation is null || state != ConversationState.Connected || !conversation.IsInboundCall) return;
            if (openedConversations.Contains(conversation.Id)) return;

            string customerNumber = conversation.AttachedData?.StringValue(customerNumberKey);
            if (string.IsNullOrEmpty(customerNumber)) return;

            string url = $"{customerPage}?nr={Uri.EscapeDataString(customerNumber)}";
            BrowseTo(url, true);
            openedConversations.Add(conversation.Id);
        }
        catch (Exception ex)
        {
            Trace.Error(ex);
        }
    }

    public override void My_ConversationUnregistered(Struct_Conversation conversation)
    {
        if (conversation is null) return;

        openedConversations.Remove(conversation.Id);
    }
}

Fehlt die Kundennummer beim Verbinden, öffnet sich keine Seite. Das Beispiel fragt das CRM nicht ab und ersetzt dessen Anmeldung nicht. Der Speicher gilt nur für diese Skriptinstanz und ist nach Skriptwechsel oder Neustart leer.

Abmeldung ab einer Uhrzeit anfragen

Ab 18:00 Uhr nach lokaler Arbeitsplatzzeit fragt das Beispiel eine Abmeldung an, sobald keine Konversation mehr bearbeitet wird. Es beendet keine Konversation. Geprüft wird bei Anmeldung, Änderung des Idle-Zustands und Entfernen einer eigenen Konversation. Ohne eines dieser Ereignisse gibt es keine Anfrage genau um 18:00 Uhr. Das gilt auch nach einem Skriptwechsel: Die erste Prüfung erfolgt erst beim nächsten passenden Ereignis.

using System;
using ilogixx.SharedFiles.GeneralDefinitions;

namespace ilogixx.Agent;

public sealed class AgentScript : MyCCAgentScript
{
    private DateTime lastRequestDate = DateTime.MinValue;
    private static readonly TimeSpan logoffTime = new(18, 0, 0);

    private void CheckLogoff()
    {
        try
        {
            DateTime now = DateTime.Now;
            if (Agent is null || !Agent.IsLogin || now.TimeOfDay < logoffTime) return;
            if (lastRequestDate == now.Date || Agent.TotalNumberOfConversations != 0) return;

            lastRequestDate = now.Date;
            Logoff();
        }
        catch (Exception ex)
        {
            Trace.Error(ex);
        }
    }

    public override void My_AgentLogon()
    {
        CheckLogoff();
    }

    public override void My_AgentIdleChanged(bool state)
    {
        CheckLogoff();
    }

    public override void My_ConversationUnregistered(Struct_Conversation conversation)
    {
        CheckLogoff();
    }
}

Es wird höchstens einmal pro Kalendertag und Skriptinstanz angefragt. Eine verweigerte oder abgebrochene Anfrage wird nicht automatisch wiederholt. Der Tagesmerker wird bei Skriptwechsel und Neustart zurückgesetzt. Das Beispiel ist kein genauer Zeitgeber oder dauerhaft gespeicherter Arbeitszeitplan.

Tätigkeit ab einer Uhrzeit für ein Wissensgebiet anfragen

Ab 12:00 Uhr wird eine Tätigkeit angefragt, wenn der Agent im Wissensgebiet mit Kennung 42 für eingehende Anrufe qualifiziert ist, keine Konversation bearbeitet und nicht bereits pausiert. Ändern Sie die Kennung. Es wird bei denselben Ereignissen wie im Abmeldebeispiel geprüft, nicht durch einen Timer.

Activity(true) wählt keine bestimmte Tätigkeit automatisch aus. Die Erlaubnisprüfung und Tätigkeitsauswahl im Agenten bleiben erhalten. Für automatische Zustände siehe auch Verfügbarkeit.

using System;
using ilogixx.SharedFiles.GeneralDefinitions;
using ilogixx.SharedFiles.GeneralEnums;

namespace ilogixx.Agent;

public sealed class AgentScript : MyCCAgentScript
{
    private DateTime lastRequestDate = DateTime.MinValue;
    private static readonly TimeSpan activityTime = new(12, 0, 0);
    private const int targetSkillId = 42;

    private void CheckActivity()
    {
        try
        {
            DateTime now = DateTime.Now;
            if (Agent is null || !Agent.IsLogin || now.TimeOfDay < activityTime) return;
            if (lastRequestDate == now.Date || Agent.IsPausing || Agent.TotalNumberOfConversations != 0) return;
            if (!Agent.HasSkillQualification(targetSkillId, SkillQualificationType.InboundCall)) return;

            lastRequestDate = now.Date;
            Activity(true);
        }
        catch (Exception ex)
        {
            Trace.Error(ex);
        }
    }

    public override void My_AgentLogon()
    {
        CheckActivity();
    }

    public override void My_AgentIdleChanged(bool state)
    {
        CheckActivity();
    }

    public override void My_ConversationUnregistered(Struct_Conversation conversation)
    {
        CheckActivity();
    }
}

Es gilt derselbe Tagesmerker wie im Abmeldebeispiel. Eine Qualifikation nur für Chat löst die Anfrage nicht aus: Die gewählte Art ist InboundCall.

Wirksame Qualifikationen auslesen

Bei Anmeldung und Konfigurationsänderung werden die wirksamen Stufen für ein Wissensgebiet und eine Sprache protokolliert. Passen Sie die Kennungen an. Eine kleinere gültige Zahl ist besser; KnowledgeLevel.None steht für nicht qualifiziert. Zuordnungen werden nicht verändert.

using System;
using ilogixx.SharedFiles.GeneralEnums;

namespace ilogixx.Agent;

public sealed class AgentScript : MyCCAgentScript
{
    private const int targetSkillId = 42;
    private const int targetLanguageId = 7;

    private void ReadQualifications()
    {
        try
        {
            if (Agent is null) return;

            int skillLevel = Agent.GetSkillQualification(targetSkillId, SkillQualificationType.InboundCall);
            int languageLevel = Agent.GetLanguageQualification(targetLanguageId);
            Trace.Info("Effective qualification levels", skillLevel, languageLevel);
        }
        catch (Exception ex)
        {
            Trace.Error(ex);
        }
    }

    public override void My_AgentLogon()
    {
        ReadQualifications();
    }

    public override void My_AgentConfigurationChanged()
    {
        ReadQualifications();
    }
}

Mehr dazu unter Qualifikationsdaten.

Statuslampe aktualisieren

Die Lampe zeigt bei Konversationsänderungen den wirksamen Zustand des Agenten, einschließlich parallel bearbeiteter Konversationen. Ohne wirksame Konversation wird der Präsenzzustand verwendet. Eine unterstützte und eingerichtete Lampe ist Voraussetzung; das ist nicht die Symbolfarbe der Oberfläche.

using System;
using ilogixx.SharedFiles.GeneralDefinitions;
using ilogixx.SharedFiles.GeneralEnums;

namespace ilogixx.Agent;

public sealed class AgentScript : MyCCAgentScript
{
    private void UpdateBusyLight()
    {
        try
        {
            if (Agent is null) return;

            ConversationState state = Agent.EffectiveState;
            if (state == ConversationState.Inactive)
            {
                ShowBusyLight(Agent.RichPresenceState);
            }
            else
            {
                ShowBusyLight(state);
            }
        }
        catch (Exception ex)
        {
            Trace.Error(ex);
        }
    }

    public override void My_ConversationStateChanged(Struct_Conversation conversation, ConversationState previousState, ConversationState state)
    {
        UpdateBusyLight();
    }

    public override void My_AgentPresenceStateChanged(RichPresenceState richPresenceState)
    {
        UpdateBusyLight();
    }
}

Vor dem Einsatz prüfen

Prüfen Sie Anmeldung nach der Zielzeit, aktive und parallele Konversationen, fehlende Zusatzdaten, verweigerte Aktionen und Skriptwechsel. Die Zeitbeispiele arbeiten mit Ereignissen und einem Merker im Arbeitsspeicher. Sie starten weder eigene Timer noch Hintergrundthreads. Die Kundenmaske soll bei Halten und Zurückholen einer bereits geöffneten Konversation nicht erneut geöffnet werden.

    ↑ ↓ auswählen · Eingabe öffnen · Esc schließen