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é 1.4, agent, asterisk, centre dappel, extensions.conf, file et queues.conf |
|






(3 votes, average: 3.67 out of 5)
