A propos | Laboratoire | Voisinage | Meilleurs articles | Nous aider | Forums

Panoramisk / Le druide de la VoIP 

Gestion d’agent dynamique - proposition

La version 1.4 d’Asterisk voit disparaître certaines fonctions de gestion des agents (cf AgentCallbackLogin) au profit de la possibilité de le faire dans le plan d’appel. Nous vous proposons ici une gestion simple d’agent et de file d’attente avec les fonctionnalités suivantes:

  • enregistrement de l’agent sur n’importe quel poste
  • inclusion automatique de l’agent dans une ou plusieurs files d’attente
  • acheminement d’appel vers les agents lors de l’appel en file
  • entrée/sortie dans une file spécifique
  • utilisation simple de la base de données interne

Cette proposition pourra servir de canevas, mais n’est pas complète, les usages dans les centres d’appels étant variés, le but n’est pas ici de proposer quelque chose de complet mais bien une base de travail.

Présentation générale

Le fonctionnement proposé ici est basé sur l’utilisation de la base de données interne afin de stocker les états de la gestion des agents et notamment l’association entre un poste et un agent. De plus, afin d’acheminer les appels vers les agents, on utilise un poste virtuel (Local/) interne à Asterisk qui sera inclus en file d’attente. Cette solution est simple mais limitative, notamment sur les statistiques en temps réel de gestion de file, les postes n’étant pas supervisés (en ligne / hors ligne).

Les fichiers sont proposés ici en format Asterisk::Configure (.ast) de façon à simplifier la lecture.

Entrée de l’agent

     context agent-login {
	  exten s {
	    ; get phone name (SIP/x)
	    Set(phone=${CUT(CHANNEL,-,1)})
	    ;
	    ; get agent id
	    Playback(agent-user)
	    Read(agent_id,,4,5)
	    ;
	    ; insert information in the database
	    Set(DB(agents/loc/agent/${agent_id})=${phone})
	    Set(DB(agents/loc/sip/${phone})=${agent_id})
	    ;
	    ; add agent in the static queues
	    Set(i=1)
	    Set(q=${DB(agents/queue/${agent_id})})
	    Set(add_queue=${CUT(q,',',${i})})
	    While($["${add_queue}" != ""])
	    AddQueueMember(${add_queue},Local/${agent_id}@agent_call)
	    Set(i=$[${i}+1])
	    Set(add_queue=${CUT(q,',',${i})})
	    EndWhile
	    Playback(agent-loginok)
	    Playback(privacy-thankyou)
	    Hangup()
	  }
     }

Ici, le principe est de déterminer sur quel poste est émis l’appel de l’agent qui se connecte au système, de lui demander son numéro d’agent et de lier les deux dans la base de données. Le numéro d’agent est sur 4 digits et aucun mot de passe n’est demandé, on pourra simplement coupler cela avec l’authentification de la boîte vocale si nécessaire.

Enfin, si l’agent doit automatiquement être ajouté à une ou plusieurs file d’attente, on vérifie les assignements statiques dans la base de données, l’arborescence utilisée est agents/queues. Chaque entrée est de la forme agent -> nom_de_file.

On couplera ce contexte avec une extension particulière, par exemple :

exten => 910,1,Goto(agent-login,s,1)

Sortie de l’agent

     context agent-logout {
	exten s {
	    Set(phone=${CUT(CHANNEL,-,1)})
	    Set(agent=${DB(agents/loc/sip/${phone})})
	    GotoIf($["${agent}" = ""]?%%HANG%%:%%L1%%)
	    ;
	    ; suppress agent from static queues
%%L1%%      Set(i=1)
	    Set(q=${DB(agents/queue/${agent})})
	    Set(del_queue=${CUT(q,',',${i})})
	    While($["${del_queue}" != ""])
	    RemoveQueueMember(${del_queue},Local/${agent}@agent_call)
	    Set(i=$[${i}+1])
	    Set(del_queue=${CUT(q,',',${i})})
	    EndWhile
	    ;
	    ; clear database from dynamic information
	    DbDel(agents/loc/sip/${phone})
	    DbDel(agents/loc/agent/${agent})
	    Playback(agent-loggedoff)
	    Playback(privacy-thankyou)
%%HANG%%    Hangup()
	}
     }

Le principe est similaire à l’entrée de l’agent. Ici, on cherche à supprimer les associations entre le poste SIP sur lequel celui-ci a travaillé et son numéro d’agent. On supprime également les files dans lesquelles il était inscrit.

Appel d’un agent

Les agents n’étant pas physiquement associés à un poste, on passe par la gestion de poste virtuel en mode Local. Il est donc nécessaire de créer un contexte afin de joindre le bon poste téléphonique en cas d’appel sur la file qui ne contient que des utilisateurs de type Local. Ce contexte est utilisé lors de l’inscription de l’agent dans une file d’attente spécifique.

     context agent_call {
	exten _XXXX {
	    Set(phone=${DB(agents/loc/agent/${EXTEN})})
	    GotoIf($["${phone}" != ""]?%%CALL%%)
	    ;
	    ; if agent is not registered, clear it from this queue
            Verbose(Delete agent)
            RemoveQueueMember(${queueName},Local/${EXTEN}@${CONTEXT})

%%CALL%%    Dial(${phone},20)
	}
     }

L’association se fait par rapport au contenu de la base de données qui est maintenue lors des entrées et sorties des agents. On en profite également pour supprimer les entrées invalides lorsqu’un appel arrive sur un identifiant qui n’est plus référencé dans la base, le système se gère de façon autonome donc. On révisera la commande Dial si besoin.

Entrée/sortie d’une file

Enfin, pour les files d’attente dans lesquelles les agents n’entrent pas automatiquement, voici de quoi les gérer.

     context macro-agent-join-queue {
        exten s {
	    Set(phone=${CUT(CHANNEL,-,1)})
	    Set(agent=${DB(agents/loc/sip/${phone})})
	    GotoIf($["${agent}" = ""]?%%HANG%%)
	    ;
	    ; join the queue
	    AddQueueMember(${ARG1},Local/${agent}@agent_call)
	    Wait(1)
	    Playback(privacy-thankyou)

%%HANG%%    Hangup()
	}
     }

     context macro-agent-leave-queue {
        exten s {
	    Set(phone=${CUT(CHANNEL,-,1)})
	    Set(agent=${DB(agents/loc/sip/${phone})})
	    GotoIf($["${agent}" = ""]?%%HANG%%)
	    ;
	    ; leave the queue
	    RemoveQueueMember(${ARG1},Local/${agent}@agent_call)
	    Wait(1)
	    Playback(privacy-thankyou)

%%HANG%%    Hangup()
	}
     }

Nous avons utilisé des macros ici, afin de pouvoir passer en argument le nom de la file en question. L’appel se fera, par exemple, avec un :

exten => 912,1,Macro(agent-join-queue,sales)

exten => 922,1,Macro(agent-leave-queue,sales)

Conclusion

Voici donc une proposition simpliste mais fonctionnelle de la gestion d’agent au sein du plan d’appel et qui fonctionne en 1.4.

Le fichier complet de configuration est disponible ici: agents.ast

Posté par: Alexandre Chauvin-Hameau, le 05/07/2007
Trackback | Popularité: 33%
marqué , , , , , et
AddThis Social Bookmark Button
UselessNothing newInformativeLearned a lotAmazingly helpful (3 votes, average: 3.67 out of 5)
Loading ... Loading ...

Voir aussi

Et pourquoi pas

Laisser un commentaire

© 2009 Panoramisk | Creative Commons License wordpress logo