Feature Request? - Queue/IVR Control

My company (a service provider) runs a call centre where we control queues manually in terms of whether they will accept call or not, also staff are able to set what we call “impact” messages on a per queue basis.

These are used such:

  • “Impact” messages - If we have a major outage such that the number of calls to our call centre suddenly blows out, then we currently will record a message along the lines of “We currently have a problem with blah, expected restoration is blah, please hold if you would like to speak to an operator”, or “We’re currently experiencing high call volumes please be patient” or similar. These messages can be enabled and disabled on a per queue basis.

  • Open/Close queues - Used to close the call centre (ie not accept any further calls and divert to other queues/vm) whilst allowing agents to complete their current calls. Each queue can be opened/closed on a individual basis.

My question is has anyone done anything similar with FreePBX or could this be considered for development as a feature request. If it were to be considered as a feature request, I would be inclined to move the impact message back to the IVR level.

I’ve implemented something which does this with FreePBX now, however I’m interested in others thoughts.

My implementation (very beta at this point) currently makes use of the AST DB and adds a “queue header” to the output of the queue config, such:


From extensions_custom.conf

[macro-queue-header]
; ARG1 - Queue Name
; ARG2 - Where to go if closed.
exten => s,1,Set(QSTATE=${DB(Queue/${ARG1}/state)})
exten => s,2,GotoIf($["${QSTATE}"="closed"]?8)
exten => s,3,Set(IMPACTMSG=${DB(Queue/${ARG1}/impactmgr})
exten => s,4,GotoIf($["${IMPACTMSG}"="0"]?7)
exten => s,5,GotoIf($["${IMPACTMSG}"=""]?7)
exten => s,6,BackGround(${IMPACTMSG})
exten => s,7,Goto(${ARG1}@ext-queues,4)
exten => s,8,Dial(Local/999${ARG1}@from-internal)
exten => s,9 Hangup

* Step 8 falls through to a predifined voicemail box per queue if needed.
Then in extensions_additional.conf:
[code] exten => 10,1,Noop(Queue: reception) exten => 10,n,Macro(user-callerid,) exten => 10,n,Answer exten => 10,n,Noop(Queue Header) exten => 10,n,Macro(queue-header,10) exten => 10,n,Set(__BLKVM_OVERRIDE=BLKVM/${EXTEN}/${CHANNEL}) exten => 10,n,Set(__BLKVM_BASE=${EXTEN}) exten => 10,n,Set(DB(${BLKVM_OVERRIDE})=TRUE) exten => 10,n,Set(_DIAL_OPTIONS=${DIAL_OPTIONS}M(auto-blkvm)) exten => 10,n,Set(__NODEST=${EXTEN}) exten => 10,n,GotoIf($["foo${RGPREFIX}" = "foo"]?REPCID) exten => 10,n,GotoIf($["${RGPREFIX}" != "${CALLERID(name):0:${LEN(${RGPREFIX})}}"]?REPCID) exten => 10,n,Noop(Current RGPREFIX is ${RGPREFIX}....stripping from Caller ID) exten => 10,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}}) exten => 10,n,Set(_RGPREFIX=) exten => 10,n(REPCID),Noop(CALLERID(name) is ${CALLERID(name)}) exten => 10,n,Set(_RGPREFIX=Reception - ) exten => 10,n,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)}) exten => 10,n,Set(MONITOR_FILENAME=/var/spool/asterisk/monitor/q${EXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID}) exten => 10,n,Queue(10,tr,,,60) exten => 10,n,dbDel(${BLKVM_OVERRIDE}) exten => 10,n,Set(__NODEST=) exten => 10,n,Goto(ivr-18,s,1) exten => 10*,1,Macro(agent-add,10,) exten => 10**,1,Macro(agent-del,10,10) [/code]

using 2.5 you can make a feature code to easily change a recording on the fly. You can use daynight mode to manually divert calls between a queue and somewhere else. That is what comes to mind, the first being a 2.5 feature the latter available today.