Table of Contents

Le code in Asterisk 1.8

Volendo gestire un call center inbound asterisk ci propone la soluzione di implementare una o piu` code (queues) nelle quali convogliare le chiamate in ingresso. Una volta che le chiamate sono nella coda, degli "agenti", ovvero degli operatori del call center, possono rispondere alle chiamate. Le code in Asterisk hanno moltissime funzionalita` e altrettante impostazioni configurabili. Una completa documentazione sulle code non e` lo scopo di questa pagina, e vi rimando ai files di configurazione di esempio presenti in Asterisk.

I files di configurazione coinvolti nella gestione e nella definizione delle code sono:

Vale la pena di notare che in questa configurazione useremo solo extensions.conf e queues.conf.

Configurazione delle code

Nel file queues.conf sono configurate le code. Questo e` un esempio di configurazione di una singola coda chiamata "queue777". Il nome delle code, per poter essere gestite facilmente dai telefoni, deve essere numerico. In questo esempio la coda ha un nome che e` composto di "queue" e di un numero. Il sistema da me configurato permette di gestire diverse code, purche` si chiamino tutte "queueNNN", ovvero "queue" seguito da esattamente 3 cifre. Ovviamente e` possibile cambiare questo tipo di nomenclatura, ma occorre modificare diverse cose in giro per la configurazione.

Ma vediamo il file queues.conf:

[general]
;
; Global settings for call queues
;
persistentmembers = yes
autofill = yes
monitor-type = MixMonitor
updatecdr = yes
shared_lastcall=yes


[queue777]
musicclass = default
strategy = ringall
wrapuptime=15
autofill=yes
autopause=no
setinterfacevar=yes
setqueueentryvar=yes
setqueuevar=yes
announce-frequency = 0
periodic-announce-frequency=0
relative-periodic-announce=yes
eventwhencalled = vars
eventmemberstatus = yes
ringinuse = no
memberdelay = 1
timeout=0 ; il timeout sul dial ai membri, default 15 secondi.

; un esempio di un membro statico, ovvero sempre presente nella coda.
; gli altri li faremo dinamici
member => SIP/101,1000,Centralino

Configurazione del dialplan

Nel file extensions.conf, che contiene il dialplan, ci sono diverse parti che fanno parte di questa configurazione, e vanno messe in diversi posti.

;;; Queste parti della configurazione vanno nel context dove si registrano gli interni.

; hint per indicazione stato operatore su coda. Lo useremo per accendere e spegnere un LED su un tasto BLF.
; Il tasto BLF va programmato con il numero "*92xxxyyy" dove xxx e` il numero della coda (3 cifre obbligatorie) 
; e yyy e` il numero dell'interno (3 cifre obbligatorie)
exten => _*92XXXXXX,hint,Custom:queue${EXTEN:3}



; Per inserire o togliere i telefoni degli operatori dalle code:
; Chiamando *90xxx (3 cifre) si viene rimossi dalla coda che si chiama (in queues.conf) "queuexxx"
; Chiamando *91xxx (3 cifre) si viene aggiunti alla coda che si chiama (in queues.conf) "queuexxx"
; Chiamando *92xxxyyy (6 cifre) si provvede ad aggiungere / togliere (toggle dello stato)
;  l'interno yyy (SIP) dalla coda xxx, inoltre si setta un hint con lo stesso numero a BUSY
;  se l'interno e` nella coda, o a IDLE (se l'interno non e` nella coda). In questo modo
;  e` possibile definire un tasto BLF che ogni volta che lo premi ti mette/toglie dalla coda
;  e cambia stato da verde (non in coda) a rosso (in coda).

exten => _*91XXX,1,AddQueueMember(queue${EXTEN:3})
exten => _*91XXX,n,Playback(agent-loginok)
exten => _*91XXX,n,SayDigits(${EXTEN:3})
exten => _*91XXX,n,Set(DEVICE_STATE(Custom:queue${EXTEN:3})=BUSY)

exten => _*90XXX,1,RemoveQueueMember(queue${EXTEN:3})
exten => _*90XXX,n,Playback(agent-loggedoff)
exten => _*90XXX,n,SayDigits(${EXTEN:3})
exten => _*90XXX,n,Set(DEVICE_STATE(Custom:queue${EXTEN:3})=NOT_INUSE)

exten => _*92XXXXXX,1,AddQueueMember(queue${EXTEN:3:3},SIP/${EXTEN:6})
exten => _*92XXXXXX,n,goto(${AQMSTATUS})
exten => _*92XXXXXX,n(ADDED),Playback(agent-loginok)
exten => _*92XXXXXX,n,SayDigits(${EXTEN:3:3})
exten => _*92XXXXXX,n,Set(DEVICE_STATE(Custom:queue${EXTEN:3})=BUSY)
exten => _*92XXXXXX,n,Wait(1)
exten => _*92XXXXXX,n,Hangup()
exten => _*92XXXXXX,n(MEMBERALREADY),RemoveQueueMember(queue${EXTEN:3:3},SIP/${EXTEN:6})
exten => _*92XXXXXX,n,Playback(agent-loggedoff)
exten => _*92XXXXXX,n,SayDigits(${EXTEN:3:3})in
exten => _*92XXXXXX,n,Set(DEVICE_STATE(Custom:queue${EXTEN:3})=NOT_INUSE)
exten => _*92XXXXXX,n,Wait(1)
exten => _*92XXXXXX,n,Hangup()
exten => _*92XXXXXX,n(NOSUCHQUEUE),Playback(beeperr)
exten => _*92XXXXXX,n(),Playback(invalid)
exten => _*92XXXXXX,n,Wait(1)
exten => _*92XXXXXX,n,Hangup()
[incoming]
exten => s,1,Ringing
exten => s,n,Set(CALLERID(name)=NOMECODA:${nome})
exten => s,n,Wait(4)
exten => s,n,Answer
exten => s,n,Wait(1)
exten => s,n,Playback(custom/queue777/benvenuto)
exten => s,n,Wait(1)
exten => s,n,Queue(queue777)