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.