myContactCenterManuel

Exemples de scripts d'agent

Exemples C# complets pour les fiches client, la déconnexion et l'activité selon l'heure, les qualifications et les voyants d'état dans la V10.

Chaque bloc de code est un script d'agent autonome. Le système ne possède qu’un seul script de ce type : réunissez les événements nécessaires dans une seule classe AgentScript, au lieu de copier plusieurs classes ensemble. Chaque événement ne peut être redéfini qu’une seule fois. Ces exemples utilisent l’interface publique de la V10, pas les anciens scripts VB.

Pour la configuration, voir Script d’agent ; pour les données, voir Données du produit. Adaptez l’adresse du CRM, les heures et les identifiants. Testez d’abord les actions avec des agents de test.

Modèle et événements

L’API de l’Agent n’est pas encore affectée dans le constructeur ; utilisez-la uniquement dans les événements. Ce modèle réagit au changement d’état d’une de vos propres conversations. Le paramètre state représente ce changement ; conversation.State peut déjà contenir un état plus récent lors du traitement.

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);
        }
    }
}

Commandes et réponses

Commande Effet et limites
BrowseTo(url, true) ouvre une adresse dans un nouvel onglet du module Navigateur
Logoff() demande la déconnexion ; la réponse et, le cas échéant, une boîte de dialogue déterminent la suite
Activity(true) demande le début d’une activité ; l’activité est choisie dans la boîte de dialogue prévue
Activity(false) termine l’activité en cours
Wrapup(true) demande un post-traitement normal
Agent.GetLanguageQualification(languageId) lit une qualification linguistique effective sous forme de nombre
Agent.GetSkillQualification(skillId, qualificationType) lit une qualification effective de compétence pour le type de conversation sélectionné
ShowBusyLight(state) règle un voyant d’état connecté et pris en charge en fonction d’un état

Une demande ne confirme pas qu’une action a été exécutée. Les restrictions, autorisations et décisions de l’utilisateur continuent de s’appliquer. My_AgentLogoffPermissionReceived et My_AgentActivityPermissionReceived fournissent la réponse correspondante. Ne redemandez pas la même action dans ces événements : cela pourrait créer une boucle. Pour les autres signatures, voir Événements et commandes.

Ouvrir la fiche client une fois par conversation

Un flux a ajouté « Kundennummer » (numéro de client) comme donnée jointe. L’exemple ouvre la fiche client à la première connexion d’un appel entrant. Il mémorise toutes les conversations pour lesquelles une fiche a été ouverte, afin que la mise en attente et la reprise ne créent pas un deuxième onglet, même en cas de traitement parallèle. Lorsqu’une conversation est retirée, son identifiant est supprimé de la mémoire locale.

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);
    }
}

Si le numéro de client manque à la connexion, aucune page ne s’ouvre. L’exemple n’interroge pas le CRM et ne remplace pas son authentification. La mémoire ne vaut que pour cette instance du script et est vidée lors du remplacement du script ou du redémarrage du programme.

Demander la déconnexion à partir d’une heure donnée

À partir de 18:00, selon l'heure locale du poste de travail, l’exemple demande la déconnexion dès qu’aucune conversation n’est traitée. Il ne met fin à aucune conversation. La vérification a lieu à la connexion, au changement de l’état d’inactivité et au retrait d’une de vos propres conversations. Sans l’un de ces événements, aucune demande n’est émise exactement à 18:00. Cela vaut aussi après le remplacement du script : la première vérification n’a lieu qu’au prochain événement pertinent.

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();
    }
}

La demande est émise au maximum une fois par jour civil et par instance du script. Une demande refusée ou annulée n’est pas répétée automatiquement. Le marqueur quotidien est réinitialisé lors du remplacement du script ou du redémarrage. Cet exemple n’est ni une minuterie précise ni un horaire de travail enregistré de façon persistante.

Demander une activité à partir d’une heure donnée pour une compétence

À partir de 12:00, une activité est demandée si l’agent est qualifié pour les appels entrants dans la compétence d’identifiant 42, ne traite aucune conversation et n’est pas déjà en pause. Modifiez l’identifiant. La vérification a lieu lors des mêmes événements que dans l’exemple de déconnexion, et non par une minuterie.

Activity(true) ne sélectionne pas automatiquement une activité précise. La vérification de l’autorisation et le choix de l’activité dans l’Agent sont conservés. Pour les états automatiques, voir aussi Disponibilité.

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();
    }
}

Le même marqueur quotidien que dans l’exemple de déconnexion s’applique. Une qualification uniquement pour le chat ne déclenche pas la demande : le type sélectionné est InboundCall.

Lire les qualifications effectives

À la connexion et lors d’un changement de configuration, les niveaux effectifs d’une compétence et d’une langue sont journalisés. Adaptez les identifiants. Un numéro valide plus petit est meilleur ; KnowledgeLevel.None signifie non qualifié. Les affectations ne changent pas.

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();
    }
}

Pour plus d’informations, voir Données de qualification.

Actualiser un voyant d’état

Lors des changements de conversation, le voyant indique l’état effectif de l’agent, y compris les conversations traitées en parallèle. Sans conversation effective, l’état de présence est utilisé. Un voyant pris en charge et configuré est nécessaire ; il ne s’agit pas de la couleur des icônes de l’interface.

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();
    }
}

Vérifier avant utilisation

Vérifiez la connexion après l’heure cible, les conversations actives et parallèles, les données jointes manquantes, les actions refusées et les changements de script. Les exemples horaires utilisent les événements et un marqueur en mémoire. Ils ne démarrent ni leurs propres minuteries ni des threads d’arrière-plan. La mise en attente et la reprise d’une conversation ne doivent pas rouvrir une fiche client déjà ouverte pour cette conversation.

    ↑ ↓ sélectionner · Entrée ouvrir · Échap fermer