Creazione di un IVR (Response Group) a più livelli in Lync Server 2010/2013 e Skype for Business 2015

In Lync Server 2010/2013 e SFB 2015, è possibile creare un IVR (Interactive Voice Response) tramite strumenti grafici oppure tramite comandi di powershell.

Il limite imposto dall’uso degli strumenti grafici è quello di poter creare solo 2 domande con un massimo di 4 risposte possibili per ogni domanda.

Se si volesse aumentare il numero delle domande e/o il numero delle risposte, non sarebbe più possibile utilizzare gli strumenti grafici, ma diventerebbe obbligatorio ricorrere ai comandi powershell.

Un IVR creato con comandi powershell, non è più editabile con gli strumenti grafici.

In questo articolo illustrerò come creare un intero IVR con una sola domanda, ma 6 risposte possibili, utilizzando comandi powershell.

La creazione di questo IVR potrà essere presa come esempio per creare IVR contenenti qualunque numero di domande e/o qualunque numero di risposte per ogni domanda.

L’architettura generale del mio IVR di esempio sarà la seguente :

  • Arriva una chiamata ad un numero aziendale associato al IVR
  • Il sistema verifica il giorno e l’orario di ricezione della chiamata, effettuando le seguenti scelte :
    • se la chiamata giunge in un giorno festivo, viene riprodotto un messaggio ”Call Center chiuso per festività”, e la chiamata è terminata
    • se la chiamata giunge in giorni feriali, ma al di fuori degli orari di lavoro, viene riprodotto un messaggio “Call Center chiuso, si prega di richiamare in orari di lavoro”, e la chiamata è terminata
    • se la chiamata giunge in giorni feriali e in orari di lavoro, viene riprodotto un messaggio di benvenuto, e il chiamante è invitato a scegliere una delle seguenti opzioni :
      • digitare 1 per parlare col reparto Vendite
      • digitare 2 per parlare col reparto Amministrazione
      • digitare 3 per parlare col reparto Assistenza Tecnica
      • digitare 4 per parlare col reparto Produzione
      • digitare 5 per parlare col reparto IT
      • digitare 6 per parlare col Centralino (Operatore)
  • In base alle scelte del chiamante, la chiamata è rediretta ad una delle code ”Vendite”, “Amministrazione”, “Assistenza”, “Produzione”, “IT”, “Operatore”, dove risponderanno gli operatori associati a quella determinata coda

I comandi utili alla creazione del IVR sono i seguenti :

New-CsRgsAgentGroup

New-CsRgsAnswer

New-CsRgsCallAction

New-CsRgsHoliday

New-CsRgsHolidaySet

New-CsRgsHoursOfBusiness

New-CsRgsTimeRange

New-CsRgsPrompt

New-CsRgsQuestion

New-CsRgsQueue / Get-CsRgsQueue / Set-CsRgsQueue

New-CsRgsWorkflow / Set-CsRgsWorkflow

Set-CsRgsConfiguration

Import-CsRgsAudioFile

Le operazioni da eseguire sono le seguenti, nel preciso ordine indicato :

  1. Creazione dei Gruppi di Agenti (i vari operatori interni che risponderanno alle chiamate)
  2. Creazione delle Code (mantengono in coda i chiamanti, finchè un agente non risponderà)
  3. Creazione delle Business Hours (ore di lavoro in cui gli agenti sono disponibili)
  4. Creazione degli Holidays (giornate in cui gli agenti non sono disponibili)
  5. Creazione degli Holiday Set (raggruppano gli Holidays, in modo da poterli associare più comodamente al IVR)
  6. Creazione dei Prompt (messaggi vari da riprodurre ai chiamanti)
  7. Creazione delle Azioni (operazioni da eseguire in base alle scelte/comportamenti dei chiamanti)
  8. Configurazione delle Azioni di Timeout e Overflow nelle Code
  9. Creazione delle Risposte (per comprendere le scelte dei chiamanti, e lanciare le Azioni corrispondenti)
  10. Creazione delle Domande (domande poste dal IVR ai chiamanti, per permettere loro di esercitare una scelta)
  11. Creazione della Default Action del Workflow (azione da eseguire se la chiamata al IVR giunge in orari di lavoro)
  12. Creazione del Workflow (il flusso di lavoro finale, completo di domande, risposte, azioni e interconnessioni tra di loro)

Nei seguenti comandi esemplificativi, si suppone che il server Lync di Front-End con il servizio RGS si chiami FE.contoso.com

N.B. : la maggioranza dei comandi seguenti memorizza i risultati in diverse variabili.  Le variabili sono create per poter essere poi utilizzate in comandi successivi.  Le variabili risiedono sempre in RAM, e verrebbero cancellate nel caso si chiudesse la sessione di Lync Powershell ove si stanno digitando i comandi.  Tenere quindi sempre aperta la powershell, altrimenti si perde l’intero lavoro eseguito fino a quel momento.

N.B. : legenda dei comandi :

in grassetto sono indicati i Cmdlet e i parametri, in corsivetto sono indicati i valori da inserire, che possono variare a scelta degli amministratori.  Con la dicitura “(oppure…. ” sono indicate variazioni possibili dei valori dei parametri

Creazione dei Gruppi di Agenti

Ogni gruppo conterrà le utenze abilitate a rispondere per conto di un certo reparto scelto dai chiamanti (Vendite, Produzione, ecc..).

I gruppi di agenti possono anche essere creati nella console di Gestione grafica di Lync.  Il comando powershell per la creazione dei gruppi è “New-CsRgsAgentGroup”, dotato di diversi parametri.

Con il parametro ”-RoutingMethod” si indica la modalità di instradamento delle chiamate alla coda : nel mio esempio ho scelto il valore “Parallel”, che instrada le chiamate contemporaneamente a tutti gli agenti di un certo gruppo (che siano disponibili e non già occupati o fuori linea).

Un parametro non usato nei miei esempi sottostanti, cioè il parametro “-AgentAlertTime”, permette di decidere quanto deve squillare il telefono degli operatori, prima di passare all’eventuale operatore successivo.  Il suo valore di default è 20 secondi.

Ecco i comandi per creare i 6 gruppi necessari al mio IVR esemplificativo :

$GruppoVendite=New-CsRgsAgentGroup -Parent “Service:ApplicationServer:FE.contoso.com-Name GruppoVendite  ParticipationPolicy Informal (oppure Formal) -RoutingMethod Parallel (oppure LongestIdle, RoundRobin, Serial, Attendant) -AgentsByUri (”sip:UserVendite1@contoso.com”,”sip:UserVendite2@contoso.com“)

$GruppoAmministrazione=New-CsRgsAgentGroup -Parent “Service:ApplicationServer:FE.contoso.com-Name GruppoAmministrazione  ParticipationPolicy Informal (oppure Formal) -RoutingMethod Parallel (oppure LongestIdle, RoundRobin, Serial, Attendant) -AgentsByUri (”sip:UserAmm1@contoso.com”,”sip:UserAmm2@contoso.com“)

$GruppoAssistenza=New-CsRgsAgentGroup -Parent “Service:ApplicationServer:FE.contoso.com-Name GruppoAssistenza  ParticipationPolicy Informal (oppure Formal) -RoutingMethod Parallel (oppure LongestIdle, RoundRobin, Serial, Attendant) -AgentsByUri (”sip:UserAss1@contoso.com”,”sip:UserAss2@contoso.com“)

$GruppoIT=New-CsRgsAgentGroup -Parent “Service:ApplicationServer:FE.contoso.com-Name GruppoIT  ParticipationPolicy Informal (oppure Formal) -RoutingMethod Parallel (oppure LongestIdle, RoundRobin, Serial, Attendant) -AgentsByUri (”sip:UserIT1@contoso.com”,”sip:UserIT2@contoso.com“)

$GruppoProduzione=New-CsRgsAgentGroup -Parent “Service:ApplicationServer:FE.contoso.com-Name GruppoProduzione  ParticipationPolicy Informal (oppure Formal) -RoutingMethod Parallel (oppure LongestIdle, RoundRobin, Serial, Attendant) -AgentsByUri (”sip:UserProd1@contoso.com”,”sip:UserProd2@contoso.com“)

$GruppoOperatore=New-CsRgsAgentGroup -Parent “Service:ApplicationServer:FE.contoso.com-Name GruppoOperatore  ParticipationPolicy Informal (oppure Formal) -RoutingMethod Parallel (oppure LongestIdle, RoundRobin, Serial, Attendant) -AgentsByUri (”sip:UserOperatore1@contoso.com”,”sip:UserOperatore2@contoso.com“)

Creazione delle Code

Per ogni gruppo di operatori, deve esistere una coda di attesa, nella quale vengono inseriti i chiamanti in attesa della risposta da parte di qualche operatore.

Anche le code possono essere create nella console grafica di Lync.  Per chi preferisse utilizzare powershell, il comando per la creazione è “New-CsRgsQueue”, dotato di diversi parametri.

Nei miei esempi sottostanti, ho utilizzato solo i parametri strettamente indispensabili (”-Name” e “-AgentGroupIDList”), ma ne esistono altri :

  • -TimeoutThreshold : quantità di tempo (in secondi) che una chiamata può rimanere in coda senza risposta, prima che si verifichi il Timeout.  A quel punto, l’IVR eseguirà l’azione stabilita dal parametro -TimeoutAction. Per default, non ci sono timeout relativi alle chiamate
  • -TimeoutAction : azione da eseguire se venisse raggiunta la soglia di timeout.  L’azione deve essere creata con il cmdlet “New-CsRgsCallAction” (vedi sezioni successive), e il default prevede l’azione “Terminate”
  • -OverflowThreshold : numero massimo di chiamate inseribili in una coda.  Se venisse raggiunto questo numero, sarebbe eseguita l’azione specificata dal parametro -OverflowAction.  Per default, non ci sono limiti.
  • -OverflowAction : azione da eseguire se venisse raggiunta la soglia di overflow. L’azione deve essere creata con il cmdlet “New-CsRgsCallAction” (vedi sezioni successive), e il default prevede l’azione “Terminate”
  • -OverflowCandidate : indica su quale chiamata agire se si raggiunge l’overflow di coda.  Le opzioni possibili sono “NewestCall” e “OldestCall”.  Per default, l’impostazione è “NewestCall”

Ecco i comandi per creare le 6 code necessarie al mio IVR esemplificativo :

$CodaVendite=New-CsRgsQueue -Parent “Service:ApplicationServer:FE.contoso.com-Name “CodaVendite” -AgentGroupIDList ($GruppoVendite.Identity)

$CodaAmministrazione=New-CsRgsQueue -Parent “Service:ApplicationServer:FE.contoso.com-Name “CodaAmministrazione” -AgentGroupIDList ($GruppoAmministrazione.Identity)

$CodaAssistenza=New-CsRgsQueue -Parent “Service:ApplicationServer:FE.contoso.com-Name “CodaAssistenza” -AgentGroupIDList ($GruppoAssistenza.Identity)

$CodaIT=New-CsRgsQueue -Parent “Service:ApplicationService:FE.contoso.com-Name “CodaIT” -AgentGroupIDList ($GruppoIT.Identity)

$CodaProduzione=New-CsRgsQueue -Parent “Service:ApplicationServer:FE.contoso.com-Name “CodaProduzione” -AgentGroupIDList ($GruppoProduzione.Identity)

$CodaOperatore=New-CsRgsQueue -Parent “Service:ApplicationServer:FE.contoso.com-Name “CodaOperatore” -AgentGroupIDList ($GruppoOperatore.Identity)

Creazione delle Business Hours

Servono a definire le ore di lavoro in cui il Contact Center è attivo (e quindi gli agenti sono disponibili).

Prima di creare le Business Hours, è necessario specificare i precisi intervalli di tempo nei quali l’IVR è effettivamente attivo (per esempio, dalle 09.00 alle 13.00 e dalle 14.00 alle 18.00).  Questa operazione si esegue utilizzando il cmdlet “New-CsRgsTimeRange” :

$AperturaMattina=New-CsRgsTimeRange -Name OrarioMattina -OpenTime “09:00″ -CloseTime “13:00″

$AperturaPomeriggio=New-CsRgsTimeRange -Name OrarioPomeriggio -OpenTime “14:00″ -CloseTime “18:00″

Se l’orario di apertura fosse continuo (es. dalle 08:00 alle 22:00), sarebbe sufficiente uno solo dei comandi precedenti.

Poi si crea l’effettivo oggetto “Business Hours”, nel quale si indicano anche le giornate precise di apertura, utilizzando il comando “New-CsRgsHoursOfBusiness”.

Questo comando ha un doppio parametro per ogni giorno della settimana : per esempio, MondayHours1 e MondayHours2 per il lunedì, TuesdayHours1 e TuesdayHours2 per il martedì, e via dicendo fino alla domenica.

E’ necessario utilizzare entrambi i parametri di ogni giornata se il turno di apertura è spezzato, mentre è sufficiente utilizzare solo il primo dei parametri di giornata (MondayHours1, TuesdayHours1, WednesdayHours1….) se il turno di apertura è continuo.

Se in alcune giornate il Call Center è totalmente chiuso, non indicare i parametri per quelle giornate.

Ecco il comando per creare gli orari di apertura spezzati, da lunedì a venerdì, per il mio IVR esemplificativo :

$AperturaIVR=New-CsRgsHoursOfBusiness -Parent “Service:ApplicationServer:FE.Contoso.com-Name IVRBusinessHours -MondayHours1 $AperturaMattina -MondayHours2 $AperuraPomeriggio -TuesdayHours1 $AperturaMattina -TuesdayHours2 $AperuraPomeriggio -WednesdayHours1 $AperturaMattina -WednesdayHours2 $AperuraPomeriggio -ThursdayHours1 $AperturaMattina -ThursdayHours2 $AperuraPomeriggio -FridayHours1 $AperturaMattina -FridayHours2 $AperuraPomeriggio

Creazione degli Holidays e degli Holiday Set

Al Response Group è necessario indicare tutte le giornate di festività nazionali.  Alle chiamate che perverranno in queste giornate, verrà riprodotto un messaggio del tipo “Call Center chiuso per festività”.   Ogni giornata festiva deve essere dichiarata con il comando “New-CsRgsHoliday”.  In questo esempio, ecco la dichiarazione di tutte le giornate festive italiane relative all’anno 2014 :

N.B. : il formato della data nei comandi seguenti dipende dalle impostazioni internazionali e dalla lingua del vostro server.  Se tutto è impostato sulle preferenze italiane, allora il formato data è esattamente quello riportato.  Se avete un server in inglese con le opzioni regionali impostate sul modello statunitense, giorno e mese devono essere invertiti.

$capodanno = New-CsRgsHoliday -Name “capodanno” -StartDate “01/01/2014″ -EndDate “02/01/2014″
$25aprile = New-CsRgsHoliday -Name “25aprile” -StartDate “25/04/2014″ -EndDate “26/04/2014″
$1maggio = New-CsRgsHoliday -Name “1maggio” -StartDate “01/05/2014″ -EndDate “02/05/2014″
$2giugno = New-CsRgsHoliday -Name “2giugno” -StartDate “02/06/2014″ -EndDate “03/06/2014″
$15agosto = New-CsRgsHoliday -Name “ferragosto” -StartDate “15/08/2014″ -EndDate “16/08/2014″
$1nov = New-CsRgsHoliday -Name “1novembre” -StartDate “01/11/2014″ -EndDate “02/11/2014″
$8dic = New-CsRgsHoliday -Name “8dicembre” -StartDate “08/12/2014″ -EndDate “09/12/2014″
$natale = New-CsRgsHoliday -Name “natale” -StartDate “25/12/2014″ -EndDate “27/12/2014″
$pasqua = New-CsRgsHoliday -Name “pasqua” -StartDate “20/04/2014″ -EndDate “22/04/2014″

Le giornate festive devono poi essere raccolte in un “set” di festività, che più avanti verrà agganciato al workflow finale.  La creazione del set di festività si esegue con il comando “New-CsRgsHolidaySet” :

$FestiviIVR=New-CsRgsHolidaySet -Parent “Service:ApplicationServer:FE.contoso.com-Name Feste2014 -HolidayList ($capodanno,$25aprile,$1maggio,$2giugno,$15agosto,$1nov,$8dic,$natale,$pasqua)

In ogni anno seguente, l’elenco delle festività dovrà essere aggiornato, inserendo quelle nuove ed agganciandole al workflow.

Creazione dei Prompt

Si tratta di file audio da riprodurre (oppure stringhe di testo letti da una voce robotica), utili allo scopo di fornire informazioni aggiuntive ai chiamanti (per es. “Benvenuti al Call Center di Contoso” oppure “Attendere in linea mentre la mettiamo in contatto con il reparto vendite”, oppure “Gli uffici sono chiusi. La preghiamo di richiamare tra le 08.00 e le 18.00″ …).

La procedura di creazione varia a seconda che si utilizzino files audio preregistrati, oppure stringhe di testo che la voce automatica dovrà leggere.

Nel mio IVR esemplificativo, suppongo di voler utilizzare i seguenti Prompt :

  • Prompt di benvenuto al Call Center (da riprodurre negli orari di apertura del Call Center; contiene la domanda principale del IVR)
  • Prompt di Call Center chiuso per festività (da riprodurre nei festivi)
  • Prompt di Call Center fuori orario di lavoro (da riprodurre negli orari di chiusura del Call Center)
  • Prompt di attesa (da riprodurre quando i chiamanti vengono messi in attesa in coda di risposta)
  • Prompt di risposta sbagliata (da riprodurre quando i chiamanti digitano una risposta sbagliata, cioè non compresa tra 1 e 6)
  • Prompt di risposta assente (da riprodurre quando i chiamanti non indicano risposte alla domanda del IVR)
  • Prompt di coda in overflow o tempo di attesa troppo lungo (da riprodurre se la coda a cui è rediretto un chiamante è già satura, oppure gli operatori non rispondono al chiamante entro una certa tempistica)

Ho deciso di pre-registrare nei files .WAV i primi quattro prompt, e di utilizzare un Text-to-Speech per gli ultimi tre prompt.  Questa scelta ha unicamente lo scopo di farvi vedere la creazione di entrambi i tipi di Prompt : voi potreste optare per l’utilizzo unico di files audio, per esempio.

N.B. : per evitare un errore del IVR con codice evento 31117 e una descrizione simile a questa :

(System.ArgumentNullException: Value cannot be null. Parameter name: alternateText at Microsoft.Speech.Synthesis.PromptBuilder.AppendAudio(Uri audioFile, String alternateText)

… è necessario inserire un Text-to-Speech anche nei prompt nei quali intendete utilizzare una registrazione audio.  Il Text-to-Speech verrà utilizzato solo se il file audio dovesse risultare corrotto e non riproducibile.

Cominciamo a creare i quattro prompt basati su voci preregistrate.  I files WAV devono essere posizionati in una cartella del Front-End (es. “C:\AudioFiles”). Si utilizzano poi i comandi “Import-CsRgsAudioFile” e “New-CsRgsPrompt” per la creazione dei prompt :

$AudioBenvenuto=Import-CsRgsAudioFile -Identity Service:ApplicationServer:FE.Contoso.com -Filename PromptBenvenuto.wav -Content (Get-Content C:\Audiofiles\PromptBenvenuto.wav” -Encoding Byte -ReadCount 0)

$PromptBenvenuto=New-CsRgsPrompt -AudioFilePrompt $AudioBenvenuto -TextToSpeechPrompt “messaggio di benvenuto e proposizione della prima domanda di scelta”

$AudioFesta=Import-CsRgsAudioFile -Identity Service:ApplicationServer:FE.Contoso.com -Filename PromptFesta.wav -Content (Get-Content C:\Audiofiles\PromptFesta.wav” -Encoding Byte -ReadCount 0)

$PromptFesta=New-CsRgsPrompt -AudioFilePrompt $AudioFesta -TextToSpeechPrompt “Siamo chiusi per festività. Si prega di richiamare in giornate feriali”

$AudioChiusura=Import-CsRgsAudioFile -Identity Service:ApplicationServer:FE.Contoso.com -Filename PromptChiusura.wav -Content (Get-Content C:\Audiofiles\PromptChiusura.wav” -Encoding Byte -ReadCount 0)

$PromptChiusura=New-CsRgsPrompt -AudioFilePrompt $AudioChiusura -TextToSpeechPrompt “In questo momento siamo chiusi. Si prega di richiamare in orari di lavoro”

$AudioAttesa=Import-CsRgsAudioFile -Identity Service:ApplicationServer:FE.Contoso.com -Filename PromptAttesa.wav -Content (Get-Content C:\Audiofiles\PromptAttesa.wav” -Encoding Byte -ReadCount 0)

$PromptAttesa=New-CsRgsPrompt -AudioFilePrompt $AudioAttesa -TextToSpeechPrompt “Siete pregati di rimanere in attesa della risposta degli operatori”

Ora creiamo i Prompt basati su stringhe di testo (Text-to-Speech : ci penserà la voce robotica di Lync a leggere la stringa ai chiamanti) :

$PromptErroreScelta=New-CsRgsPrompt -TextToSpeechPrompt “La risposta non è tra quelle consentite. Si prega di correggere la selezione”

$PromptNessunaScelta=New-CsRgsPrompt -TextToSpeechPrompt “Non è stata digitata alcuna scelta. Si prega di riprovare”

$PromptOverflow=New-CsRgsPrompt -TextToSpeechPrompt “In questo momento il Call Center è sovraccarico. Si prega di riprovare più tardi”

Creazione delle Azioni

Le Azioni rappresentano le operazioni che l’IVR deve eseguire all’accadimento di un certo evento. Esempi possono essere :

  • azione da eseguire se giunge al IVR una chiamata in giorni festivi
  • azione da eseguire se giunge al IVR una chiamata fuori orari di lavoro
  • azione da eseguire se giunge al IVR una chiamata in orario di lavoro
  • azione da eseguire se il chiamante esercita una certa scelta in risposta ad una domanda del IVR
  • azione da eseguire se un chiamante viene inserito in una coda che risulta già piena (overflow di coda)
  • azione da eseguire se un operatore non risponde ad un chiamante entro una certa tempistica (time-out di coda)

Le azioni si creano con il cmdlet New-CsRgsCallAction.  Il suo parametro più importante è “-Action“, che può avere i seguenti valori :

  • Terminate : termina direttamente la chiamata
  • TransferToQueue : trasferisce una chiamata alla coda specificata
  • TransferToQuestion : trasferisce una chiamata ad una domanda successiva posta dal IVR
  • TransferToURI : trasferisce una chiamata ad uno specifico SIP URI
  • TransferToVoiceMailURI : trasferisce una chiamata ad una segreteria telefonica (es. Exchange Unified Messaging)
  • TransferToPSTN : trasferisce una chiamata ad un numero telefonico PSTN (rete pubblica)

Si crea l’azione da eseguire se giunge una chiamata in giornate festive :

$AzioneFesta=New-CsRgsCallAction -Prompt $PromptFesta -Action Terminate

Si crea l’azione da eseguire se giunge una chiamata in orari di chiusura del Call Center :

$AzioneChiusura=New-CsRgsCallAction -Prompt $PromptChiusura -Action Terminate

Si crea l’azione da eseguire se la coda a cui è rediretto il chiamante è piena, oppure se gli operatori non rispondono al chiamante entro una certa tempistica (parametri impostabili nelle proprietà delle code) :

$AzioneOverflow=New-CsRgsCallAction -Prompt $PromptOverflow -Action Terminate

Si crea l’azione da eseguire se giunge una chiamata in orario di apertura del Call Center, e il chiamante sceglie l’opzione 1 :

$Azione1=New-CsRgsCallAction -Prompt $PromptAttesa -Action TransferToQueue (oppure TransferToQuestion, Terminate, TransferToUri, TransferToVoiceMailUri, TransferToPstn) -QueueID $CodaVendite.Identity    (questo parametro è obbligatorio se Action è impostato su “TransferToQueue”)

Si crea l’azione da eseguire se giunge una chiamata in orario di apertura del Call Center, e il chiamante sceglie l’opzione 2 :

$Azione2=New-CsRgsCallAction -Prompt $PromptAttesa -Action TransferToQueue (oppure TransferToQuestion, Terminate, TransferToUri, TransferToVoiceMailUri, TransferToPstn) -QueueID $CodaAmministrazione.Identity    (questo parametro è obbligatorio se Action è impostato su “TransferToQueue”)

Si crea l’azione da eseguire se giunge una chiamata in orario di apertura del Call Center, e il chiamante sceglie l’opzione 3 :

$Azione3=New-CsRgsCallAction -Prompt $PromptAttesa -Action TransferToQueue (oppure TransferToQuestion, Terminate TransferToUri, TransferToVoiceMailUri, TransferToPstn) -QueueID $CodaAssistenza.Identity    (questo parametro è obbligatorio se Action è impostato su “TransferToQueue”)

Si crea l’azione da eseguire se giunge una chiamata in orario di apertura del Call Center, e il chiamante sceglie l’opzione 4 :

$Azione4=New-CsRgsCallAction -Prompt $PromptAttesa -Action TransferToQueue (oppure TransferToQuestion, Terminate, TransferToUri, TransferToVoiceMailUri, TransferToPstn) -QueueID $CodaProduzione.Identity    (questo parametro è obbligatorio se Action è impostato su “TransferToQueue”)

Si crea l’azione da eseguire se giunge una chiamata in orario di apertura del Call Center, e il chiamante sceglie l’opzione 5 :

$Azione5=New-CsRgsCallAction -Prompt $PromptAttesa -Action TransferToQueue (oppure TransferToQuestion, Terminate, TransferToUri, TransferToVoiceMailUri, TransferToPstn) -QueueID $CodaIT.Identity    (questo parametro è obbligatorio se Action è impostato su “TransferToQueue”)

Si crea l’azione da eseguire se giunge una chiamata in orario di apertura del Call Center, e il chiamante sceglie l’opzione 6 :

$Azione6=New-CsRgsCallAction -Prompt $PromptAttesa -Action TransferToQueue (oppure TransferToQuestion, Terminate, TransferToUri, TransferToVoiceMailUri, TransferToPstn) -QueueID $CodaOperatore.Identity    (questo parametro è obbligatorio se Action è impostato su “TransferToQueue”)

Configurazione delle Azioni di Timeout e Overflow nelle Code

Ora che abbiamo creato tutte le azioni possibili, è possibile tornare sulle Code (già create precedentemente) per agganciare loro l’azione di Overflow/Timeout (cioè l’azione da eseguire se le code dovessero già essere piene e/o se gli operatori non rispondono entro il tempo di timeout impostato nelle code stesse).

Ecco i comandi per impostare l’azione di Overflow/Timeout sulle code (queste sono ancora memorizzate nelle variabili utilizzate nella sezione di creazione delle code) :

N.B. : il comando Set-CsRgsQueue serve a fissare definitivamente nel Front-End di Lync le modifiche sulle code.  Fino a quel momento, le modifiche risiedono esclusivamente in memoria (nelle variabili).

$CodaVendite.OverflowAction=$AzioneOverflow

Set-CsRgsQueue -Instance $CodaVendite

$CodaAmministrazione.OverflowAction=$AzioneOverflow

Set-CsRgsQueue -Instance $CodaAmministrazione

$CodaAssistenza.OverflowAction=$AzioneOverflow

Set-CsRgsQueue -Instance $CodaAssistenza

$CodaIT.OverflowAction=$AzioneOverflow

Set-CsRgsQueue -Instance $CodaIT

$CodaProduzione.OverflowAction=$AzioneOverflow

Set-CsRgsQueue -Instance $CodaProduzione

$CodaOperatore.OverflowAction=$AzioneOverflow

Set-CsRgsQueue -Instance $CodaOperatore

Creazione delle Risposte

Le Risposte devono essere create per permettere al IVR di comprendere la risposta digitata o pronunciata da un chiamante, ed eseguire le opportune azioni.  Per esempio, l’IVR deve capire se l’utente ha composto il numero 1 per scegliere la prima opzione (oppure se ha enunciato la parola “uno”), e in quel caso eseguire l’azione prevista per questa opzione.

Le Risposte si creano con il comando “New-CsRgsAnswer”.  I suoi parametri più importanti sono :

  • -DTMFResponse : indica il tasto da premere sul tastierino da parte del chiamante, per esercitare una scelta
  • -VoiceResponseList : indica la parola da enunciare da parte del chiamante, per esercitare una scelta
  • -Action : indica l’azione da eseguire.  Questa deve essere già stata creata con il comando New-CsRgsCallAction (vedi sezione precedente)

N.B. : non è obbligatorio inserire entrambi i parametri “-DTMFResponse” e “-VoiceResponseList” : è sufficiente almeno uno dei due.

Creiamo ora tutte le Risposte necessarie ad intercettare le varie opzioni di scelta (da 1 a 6) del mio IVR esemplificativo :

$Risposta1=New-CsRgsAnswer -DTMFResponse 1 -VoiceResponseList “uno” -Action $Azione1

$Risposta2=New-CsRgsAnswer -DTMFResponse 2 -VoiceResponseList “due” -Action $Azione2

$Risposta3=New-CsRgsAnswer -DTMFResponse 3 -VoiceResponseList “tre” -Action $Azione3

$Risposta4=New-CsRgsAnswer -DTMFResponse 4 -VoiceResponseList “quattro” -Action $Azione4

$Risposta5=New-CsRgsAnswer -DTMFResponse 5 -VoiceResponseList “cinque” -Action $Azione5

$Risposta6=New-CsRgsAnswer -DTMFResponse 6 -VoiceResponseList “sei” -Action $Azione6

Creazione delle Domande (nel mio esempio, una sola domanda)

La domanda da creare sarà quella (posta dal IVR) in cui viene chiesto ai chiamanti di scegliere le opzioni da 1 a 6.  Dopo la domanda, il sistema dovrà aspettare la risposta del chiamante, e poi eseguire l’azione appropriata.  La domanda si crea con il comando “New-CsRgsQuestion”.  A questo comando è necessario fornire almeno un Prompt (già creati precedentemente, che rappresentano la registrazione audio della domanda o il Text-to-Speech della stessa), e un gruppo di risposte supportate (già create precedentemente, che intercettano le risposte del chiamante ed eseguono le azioni previste in base alla scelta effettuata).  E’ possibile anche indicare un Prompt da utilizzare nel caso di risposte errate da parte del chiamante (per esempio se dovesse digitare 7, valore non compreso tra quelli possibili), e un Prompt da utilizzare nel caso di mancata risposta da parte del chiamante.

$Domanda1=New-CsRgsQuestion -Prompt $PromptBenvenuto -AnswerList $Risposta1,$Risposta2,$Risposta3,$Risposta4,$Risposta5,$Risposta6  -InvalidAnswerPrompt $PromptErroreScelta -NoAnswerPrompt $PromptNessunaScelta

Creazione della Default Action del Workflow

La “Default Action” del IVR è l’azione che deve essere eseguita quando giunge una chiamata negli orari di apertura del Call Center.  La Default Action deve semplicemente indicare al IVR di porre al chiamante la prima domanda contenente il primo livello di scelte (nel mio esempio, questa sarà anche l’unica domanda del IVR) :

$AzioneDefault=New-CsRgsCallAction -Action TransferToQuestion -Question $Domanda1

Creazione del Workflow finale

Ora siamo pronti ad inserire tutti gli oggetti creati nel Workflow finale, che darà vita al IVR vero e proprio.

Il Workflow si crea con il comando “New-CsRgsWorkflow”.  Eventuali successive interrogazioni/modifiche del workflow possono essere eseguite con l’utilizzo congiunto dei comandi “Get-CsRgsWorkflow” e “Set-CsRgsWorkflow”.

I parametri più importanti del comando “New-CsRgsWorkflow” sono i seguenti :

  • -LineURI : indica il numero di telefono a cui è raggiungibile il Call Center dall’esterno
  • -Active : indica se il Call Center deve essere subito attivo ($True) oppure no ($False)
  • -Anonymous : rende anonimi gli operatori che rispondono ($True) oppure visibili ($False)
  • -BusinessHoursID : indica gli orari di apertura del IVR (in questa caso verrà riprodotta la “Default Action”)
  • -DefaultAction : azione da eseguire in orari di apertura.  L’azione deve essere stata precedentemente creata con un comando New-CsRgsCallAction (vedi sezione precedente), e deve contenere un’azione di trasferimento (TransferToQuestion) alla prima domanda del IVR ($Domanda1 nel mio esempio)
  • -NonBusinessHoursAction : azione da eseguire in orari di chiusura.  L’azione deve essere stata precedentemente creata con un comando New-CsRgsCallAction
  • -HolidayAction : azione da eseguire in giornate festive. L’azione deve essere stata precedentemente creata con un comando New-CsRgsCallAction

$Workflow=New-CsRgsWorkflow -Parent “Service:ApplicationServer:FE.contoso.com” -Name “IVR aziendale” -Description “Il Call Center dell’azienda XXX” -PrimaryURI “sip:IVR@contoso.com” -LineURI “tel:+3902123456″ -DisplayNumber “0039 02 123456″ -Active $True -Anonymous $True -BusinessHoursID $AperturaIVR.identity -HolidaySetIDList $FestiviIVR.identity -HolidayAction $AzioneFesta -NonBusinessHoursAction $AzioneChiusura -DefaultAction $AzioneDefault -CustomMusicOnHoldFile $AudioAttesa

Set-CsRgsWorkflow -Instance $Workflow

L’ultimo comando mette in effettiva “produzione” l’intero workflow : supponendo il corretto inserimento del numero di telefono per raggiungere l’IVR (parametro -LineUri del workflow) e la corretta configurazione dei componenti Enterprise Voice di Lync Server (Dial Plans, Voice Policy, Routes, Trunk, integrazione con un Gateway IP), l’IVR è già da ora pronto all’uso.

Buon Call Center!!! :-)

Share / Save :

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.