|  |  | [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 requre 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()
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | [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
 |