== 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: * extensions.conf (contiene le funzioni per mettere le chiamate nella coda e anche per aggiungere e togliere operatori alla coda) * queues.conf (contiene le definizioni delle code) * queuerules.conf (contiene altre definizioni delle regole da applicare alle chiamate presenti in coda) * agents.conf (contiene le configurazioni degli agenti e dei gruppi di agenti) 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. * La prima parte riguarda le funzioni tramite le quali gli agenti (gli operatori che rispondono al telefono) si registrano come operatori della coda. In pratica questo sistema consente a un operatore (insomma, a un telefono interno) di entrare a fare parte di una coda (e quindi ricevere le chiamate di quella coda) oppure di uscirne (e quindi non ricevere piu` le chiamate di quella coda). Volendo un operatore puo` entrare a far parte di piu` di una coda contemporaneamente, e ricevere quindi chiamate da piu` code. In questo caso e` opportuno organizzarsi per fare in modo che l'operatore sappia a quale coda sta rispondendo quando il suo telefono suona. Per farlo, useremo il display dell CLI (caller-id). Inoltre, se usiamo un telefono che ha dei tasti BLF programmabili, come un Grandstream, per esempio, potremo programmare un tasto BLF che quando viene premuto cambia stato di registrazione dell'operatore su una coda, e con il LED indica se l'operatore e` registrato alla coda o meno. {{{ ;;; 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() }}} * La seconda parte riguarda l'inserimento delle chiamate entranti nella coda. Questa parte e` semplice: per inserire le chiamate in coda e` sufficiente questo pezzetto. Si noti che modifico il caller-id in modo che contenga un nome della coda (nell'esempio, e` "NOMECODA") che viene mostrato sul telefono dell'operatore. Questo pezzo e` incompleto, in quanto occorre senza dubbio inserire un annuncio da far sentire al chiamante prima di metterlo in coda, e poi anche dare alla coda un timeout in modo che se il chiamante resta in coda per troppo tempo senza risposta possa uscirne ed essere ad esempio diretto a una casella vocale. (si veda l'help del comando "queue" per i dettagli sui timeout). {{{ [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) }}}