[globals] ; General internal dialing options used in context Dial-Users. ; Only the timeout is defined here. See the Dial app documentation for ; additional options. INTERNAL_DIAL_OPT=,30 [Hints] ; Allow dynamic hint creation for every extension. exten = _11XX,hint,PJSIP/${EXTEN} [Features] ; Extension to check user voicemail. We don't require the user to enter ; their pincode. exten = 8000,1,Verbose(1, "User ${CALLERID(num)} dialed the voicemail feature.") same = n,VoiceMailMain(${CALLERID(num)}@example,s) same = n,Hangup() ; Exten to dial the main IVR internally. exten = 1100,1,Verbose(1, "User ${CALLERID(num)} dialed the IVR.") same = n,Goto(Main-IVR,2565551100,1) ;Extension to enter a conference intended only for employees exten = 6000,1,Verbose(1, "User ${CALLERID(num)} dialed the employee conference.") same = n,Confbridge(employees) same = n,Hangup() ;Extension to enter a conference intended for employees and customers exten = 6500,1,Verbose(1, "User ${CALLERID(num)} dialed the employee/customer mixed conference.") same = n,Confbridge(mixed) same = n,Hangup() [External-Features] ; Extension for users to remotely check voicemail. Here we require the caller to ; enter their mailbox and pincode. exten = 2565551234,1,Verbose(1, "User ${CALLERID(num)} dialed into remote voicemail.") same = n,VoiceMailMain(example) same = n,Hangup() ; Extension to queue for sales. ; The queue has a 300 second timeout. exten = 2565551200,1,Verbose(1, "User ${CALLERID(num)} dialed the sales queue.") same = n,Answer() same = n,Queue(sales,,,,300) same = n,Goto(operator,1) ; Extension to queue for a customer advocate. ; The queue has a 1200 second timeout. exten = 2565551250,1,Verbose(1, "User ${CALLERID(num)} dialed the customer advocate queue.") same = n,Answer() same = n,Queue(customer_advocate,,,,1200) same = n,Goto(operator,1) [Dialing-Errors] ; Handle any extensions dialed internally that don't otherwise exist. ; Comment out or remove this extension if you would rather have the calls ; ignored. exten = _X.,1,Verbose(1, "User ${CALLERID(num)} dialed an invalid number.") same = n,Playback(pbx-invalid) same = n,Hangup() [Internal-Setup] ; Here we capture internal calls to do anything we need to do before sending ; them onto all the possible internal locations. Such as disabling CDR on ; internal to internal calls. exten = _X.,1,NoOp() same = n,Set(CDR_PROP(disable)=1) same = n,Goto(Internal-Main,${EXTEN},1) ; The Internal-Main context provides a way for internal callers to get access to most ; features and functions configured for them. External callers may be sent ; directly to some of the contexts you see included here, so the included ; contexts are not necessarily internal only. [Internal-Main] ; The order of includes here is important for matching the right extensions. include = Hints include = Features include = Dial-Users include = Dialing-Errors ; Dial-Users handles calls to internal extensions. ; Calls coming into this context may be *external* or *internal* in origin. [Dial-Users] exten = _11XX,1,Verbose(1, "User ${CALLERID(num)} dialed ${EXTEN}.") same = n,Set(SAC_DIALED_EXTEN=${EXTEN}) same = n,Gotoif($[${DEVICE_STATE(PJSIP/${EXTEN})} = BUSY]?dialed-BUSY,1:) same = n,Dial(PJSIP/${EXTEN}${INTERNAL_DIAL_OPT}) same = n,Goto(dialed-${DIALSTATUS},1) exten = dialed-NOANSWER,1,NoOp() same = n,Voicemail(${SAC_DIALED_EXTEN}@example,u) same = n,Hangup() exten = dialed-BUSY,1,NoOp() same = n,Voicemail(${SAC_DIALED_EXTEN}@example,b) same = n,Hangup() exten = dialed-CHANUNAVAIL,1,NoOp() same = n,Playback(pbx-invalid) same = n,Hangup() exten = _dialed-.,1,Goto(dialed-NOANSWER,1) exten = h,1,Hangup() ; Callers in the directory may dial 0 which will jump to the ; 'o' extension. exten = o,1,Goto(1111) ; Outbound-Dial ; ; Before we dial, see if the extension matches our restricted number patterns. ; Note that this is a basic set of numbers which could incur a fee if dialed. ; The NANP includes many other numbers that you may want to block. If you feel ; it is necessary to block further number patterns you'll have to add them below ; or you may consider implementing a blacklist via methods beyond the scope of ; this example. [Outbound-Dial] exten = _011.,1,Hangup() exten = _900NXXXXXX,1,Hangup() exten = _1900NXXXXXX,1,Hangup() exten = _976XXXX,1,Hangup() exten = _NXX976XXXX,1,Hangup() exten = _1NXX976XXXX,1,Hangup() ; Dial outbound through our SIP ITSP. exten = _X.,1,Verbose(1, "Didn't match any restricted numbers, proceeding with outbound dial.") same = n,Set(CALLERID(num)=256555${CALLERID(num)}) same = n,Dial(PJSIP/${EXTEN}@dcs-endpoint) same = n,Hangup() ; Calls from internal endpoints will enter into one of the two following ; contexts based on their dialing privilege. [Local] include = Internal-Setup exten = _NXXXXXX,1,Goto(Outbound-Dial,1256${EXTEN},1) exten = _256NXXXXXX,1,Goto(Outbound-Dial,1${EXTEN},1) exten = _1256NXXXXXX,1,Goto(Outbound-Dial,${EXTEN},1) [Long-Distance] include = Local exten = _NXXNXXXXXX,1,Goto(Outbound-Dial,1${EXTEN},1) exten = _1NXXNXXXXXX,1,Goto(Outbound-Dial,${EXTEN},1) ; The DID-Extensions context captures inbound calls from our ITSP that have a ; DID number where the last four digits matches an internal extension. [DID-Extensions] exten = _25655511XX,1,Verbose(1, "External caller dialed inbound to DID ${EXTEN})") same = n,Goto(Dial-Users,${EXTEN:6},1) ; Our main IVR program for receiving inbound callers. ; The IVR script reads “Thank you for calling Super Awesome Company, Waldo’s ; premier provider of perfect products. If you know your party’s extension, ; you may dial it at any time. To establish a sales partnership, press one. To ; speak with a customer advocate, press two. For accounting and other ; receivables, press three. For a company directory, press four. For an ; operator, press zero.” ; demo-congrats is currently used as a placeholder. [Main-IVR] exten = 2565551100,1,Verbose(1, "New caller, ${CALLERID(num)} dialed into the IVR.") same = n,Answer() same = n(start),Background(basic-pbx-ivr-main) same = n,WaitExten(10) same = n,Background(basic-pbx-ivr-main) same = n,Hangup() exten = 0,1,Verbose(1, "Caller ${CALLERID(num)} dialed the operator.") same = n,Goto(Dial-Users,1111,1) exten = 1,1,Verbose(1, "Caller ${CALLERID(num)} dialed the Sales queue.") same = n,Goto(External-Features,2565551200,1) exten = 2,1,Verbose(1, "Caller ${CALLERID(num)} dialed the Customer Experience queue.") same = n,Goto(External-Features,2565551250,1) exten = 3,1,Verbose(1, "Caller ${CALLERID(num)} dialed Accounting and Receivables.") same = n,Goto(Dial-Users,1106,1) exten = 4,1,Verbose(1, "Caller ${CALLERID(num)} dialed the directory.") same = n,Directory(example,Dial-Users) exten = i,1,Playback(option-is-invalid) same = n,Goto(2565551100,start) exten = t,1,Playback(are-you-still-there) same = n,Goto(2565551100,start) ; Calls from our ITSP SIP account arrive in DCS-Incoming. We should be careful ; to route calls very explicitly so as to avoid any security issues, such as ; accidentally giving outbound dial access to inbound callers. ; ; Each context includes extension pattern matching to match the inbound DID ; dialed appropriately. [DCS-Incoming] include = Main-IVR include = DID-Extensions include = External-Features