; Copyright 2006. Core Telecom Innovations ; This file may be modified by the customer for whom it was ; prepared, or their agents. ; All other rights reserved [general] [globals] ;************************** ;**** GLOBAL VARIABLES **** ;************************** ; PEERS AND TRUNKS ; POTS = ZAP/G1 ; This is the PSTN group ; changed from starting with highest available channel (G) to starting with lowest (g) due to noise problem on ZAP/21 with outgoing calls SAN0 = ZAP/g0 ; from-zaptel SAN1 = ZAP/g1 ; from-internal SAN2 = ZAP/g2 ; SIP TRUNKS from-zaptel POTS = ZAP/g1 ; This is the PSTN group STRS = ZAP/g5 ; This is the new SIP Trunk group TOLL = ${POTS} ; or perhaps IAX2/user:password@carrier INTL = ${TOLL} ; or some other IAX2/user:password@carrier ; CORP = IAX2/user:password@headoffice ; VOIP = IAX2/NXXNXXXXXX:pass@iax01.unlimitel.ca MAINMENUDELAY=1 PLANTMAX=3 varCustom_Prompts_Dir = /opt/prompts/ ; SRV2 = IAX2/agility:agility@192.168.7.3 ; MISSISSAUGA_EXT= 1905403 ; CANADA_JUMP = IAX2/agility_jump:agility@10.10.10.35 ; ATLANTA_EXT = ${POTS}/1404564 ; ATLANTA_EXT = 1404564 ; NPANXX = 704927 MAIN_CALLER_ID = 9056241888 MAIN_CALLER_NM = RAD International Ltd. ; LOCALNPAN = 704:980 #include /etc/asterisk/extensions_users.conf #include /etc/asterisk/extensions_services.conf #include /etc/asterisk/extensions_analogue.conf #include /etc/asterisk/extensions_business_hours.conf #include /etc/asterisk/extensions_NPAs.conf #include /etc/asterisk/extensions_locateme.conf #include /etc/asterisk/voicemail_notification.conf ;************************** ;**** ROUTING CONTEXTS **** ;************************** [trunks_local] exten => _8NXXNXXXXXX,1,Set(CALLERID(name)=${MAIN_CALLER_NM}) exten => _8NXXNXXXXXX,n,Set(CALLERID(num)=${MAIN_CALLER_ID}) exten => _8NXXNXXXXXX,n,Dial(${SAN2}/${EXTEN:1}|${forward_bit}) exten => _8NXXNXXXXXX,n,Dial(${SAN0}/${EXTEN:1}|${forward_bit}) exten => _8NXXNXXXXXX,n,Hangup() exten => _NXXNXXXXXX,1,Set(CALLERID(name)=${MAIN_CALLER_NM}) exten => _NXXNXXXXXX,n,Set(CALLERID(num)=${MAIN_CALLER_ID}) exten => _NXXNXXXXXX,n,Dial(${SAN2}/${EXTEN}|${forward_bit}) exten => _NXXNXXXXXX,n,Dial(${SAN0}/${EXTEN}|${forward_bit}) exten => _NXXNXXXXXX,n,Hangup() ; exten => _9411,1,Authenticate(114) exten => _8411,1,Dial(${SAN0}/411) exten => _8411,n,Hangup() exten => _8310XXXX,1,Dial(${SAN0}/${EXTEN:1}) exten => _8310XXXX,2,Hangup() [trunks_longdist] exten => _81NXXNXXXXXX,1,NoOp(${EXTEN}) exten => _81NXXNXXXXXX,n,Set(CALLERID(name)=${MAIN_CALLER_NM}) exten => _81NXXNXXXXXX,n,Set(CALLERID(num)=${MAIN_CALLER_ID}) exten => _81NXXNXXXXXX,n,Noop(--=--> ${EXTEN:2:3}) ; exten => _91NXXNXXXXXX,n, ; exten => _81NXXNXXXXXX,n,GotoIf($[${EXTEN:2:3} = 416]?:normal_longd) ; exten => _81NXXNXXXXXX,n,Goto(trunks_local,${EXTEN:2:10},1) exten => _81NXXNXXXXXX,n(normal_longd),Dial(${SAN0}/${EXTEN:1}|${forward_bit}) exten => _81NXXNXXXXXX,n,Hangup() exten => _1NXXNXXXXXX,1,NoOp(${EXTEN}) exten => _1NXXNXXXXXX,n,Set(CALLERID(name)=${MAIN_CALLER_NM}) exten => _1NXXNXXXXXX,n,Set(CALLERID(num)=${MAIN_CALLER_ID}) exten => _1NXXNXXXXXX,n,Noop(--=--> ${EXTEN:2:3}) ; exten => _91NXXNXXXXXX,n, ; exten => _1NXXNXXXXXX,n,GotoIf($[${EXTEN:1:3} = 416]?:normal_longd) ; exten => _1NXXNXXXXXX,n,Goto(trunks_local,${EXTEN:1:10},1) exten => _1NXXNXXXXXX,n(normal_longd),Dial(${SAN0}/${EXTEN}|${forward_bit}) exten => _1NXXNXXXXXX,n,Hangup() include => trunks_local [trunks_intl] exten => _8011.,1,Set(CALLERID(num)=${MAIN_CALLER_ID}) exten => _8011.,n,Set(CALLERID(name)=${MAIN_CALLER_NM}) exten => _8011.,n,Dial(${SAN0}/${EXTEN:1},120) exten => _8011.,n,Playback(please-try-again-later) ;expensive route warning exten => _8011.,n,Congestion() exten => _8011.,n,Wait(2) exten => _8011.,n,Hangup() include => trunks_longdist [trunks_plant] exten => _8NXXNXXXXXX,1,Set(GROUP()=plant_phones) exten => _8NXXNXXXXXX,n,Gotoif($[${GROUP_COUNT()} > ${PLANTMAX}]?maxlinesinuse:linesavail) exten => _8NXXNXXXXXX,n(linesavail),Dial(${SAN0}/${EXTEN:1}) exten => _8NXXNXXXXXX,n(maxlinesinuse),Playback(all-circuits-busy-now) exten => _8NXXNXXXXXX,n,Congestion() exten => _8NXXNXXXXXX,n,Hangup() [emergency] ; This context MUST be included in any contexts that contain on-site sets exten => 911,1,MixMonitor(call_to_911_${TIMESTAMP}) exten => 911,n,Dial(${SAN0}/911) exten => 911,n,Congestion() exten => 911,n,Hangup() ;************************** ;**** DEVICE & CHANNEL *** ;**** CONTEXTS *** ;************************** [analogue_incoming] exten => s,1,Set(ZAPCALL=YES) exten => s,n,Goto(incoming,s,1) exten => s,n,Hangup() [voip_incoming] exten => s,1,Goto(incoming,s,1) exten => s,n,Hangup() include => incoming [default] exten => s,1,Goto(incoming,s,1) include => main_menu [executive_sets] include => emergency include => trunks_intl include => user_services include => internal include => parkedcalls ; include => hints exten => i,1,Wait(1) exten => i,n,Playback(invalid) exten => i,n,Hangup() [normal_sets] include => emergency include => trunks_longdist include => user_services include => internal include => parkedcalls [plant_phones] include => emergency include => trunks_plant include => user_services include => internal include => parkedcalls [analog_trunk] ; Analog trunks will arrive in this context. ; We'll just drop them into incoming for now. ; Later, we may need to give them special treatment. exten => s,1,Goto(incoming,s,1) [user_terminals] ; all sets should enter the dialplan here include => emergency include => internal include => trunks_local include => user_services include => hints ; Reception ringer ; exten => 554,1,Dial(SIP/554) ; exten => 554,n,Verbose(3,row 117: ${CHANNEL} :: ${EXTEN}) ; exten => 554,n,Voicemail(u${receptionDN}) ; exten => 554,n,Hangup() exten => _X.,1,Noop(-----> ${CHANNEL} <----> ${CUT(CHANNEL,-,1)}) exten => _X.,n,Set(Chan=${CUT(CHANNEL,-,1)}) exten => _X.,n,Set(ChanType=${CUT(Chan,/,1)}) exten => _X.,n,Set(ChanName=${CUT(Chan,/,2)}) exten => _X.,n,Set(Number=${CUT(ChanName,@,1)}); exten => _X.,n,Set(dialed_ext=${EXTEN}) exten => _X.,n,Noop(Chan=${CUT(CHANNEL,-,1)} | ChanType=${CUT(Chan,/,1)} | ChanName=${CUT(Chan,/,2)} | Number=${CUT(ChanName,@,1)} | dialed_ext=${EXTEN}) exten => _X.,n,Gotoif($["${ChanType}"="Zap"]?blind_transfer,1) exten => _X.,n,Gotoif($[${dialed_ext}=0]?main_menu,0,1) exten => _X.,n,Gotoif($[ ${ISNULL(${ChanType})} = 0 ]?:nofwd) exten => _X.,n,Gotoif($["${ChanType}" = "Local"]?:nofwd) exten => _X.,n,Noop(-----> The channel is Local and it is going to be forwarded <---|) exten => _X.,n,Set(CALLERID(name)=${MAIN_CALLER_NM}) exten => _X.,n,Set(CALLERID(num)=${MAIN_CALLER_ID}) exten => _X.,n,GotoIf($[${LEN(${Number})}<=9]?fwdin) exten => _X.,n,GotoIf($[${LEN(${Number})}>12]?fwderr) exten => _X.,n,Noop(-----> the call is forwarded out: 10 <= length <= 12 --==|) exten => _X.,n,Set(forward_bit=120) exten => _X.,n,GotoIf($[$[${LEN(${Number})}=12]&$[${Number:0:2}=81]]?trunks_longdist,${Number:1},1) exten => _X.,n,GotoIf($[$[${LEN(${number})}=11]&$[${number:0:1}=8]]?trunks_local,${Number:1},1) exten => _X.,n,GotoIf($[$[${LEN(${Number})}=11]&$[${Number:0:1}=1]]?trunks_longdist,${Number},1) exten => _X.,n,GotoIf($[$[${LEN(${number})}=10]&$[${REGEX("[2-9]",${number:0:1})}]]?trunks_local,${Number},1) exten => _X.,n(fwderr),Hangup() exten => _X.,n(nofwd),Noop(-----> it is not a fwd) exten => _X.,n,Noop(-----> chanvar: ${chanvar${CUT(${CUT(CHANNEL,-,1)},/,1)}${CUT(${CUT(CHANNEL,-,1)},/,2)}}) exten => _X.,n,GotoIf($[ ${EXISTS(${chanvar${ChanType}${Number}})} = 1]?:invalid) exten => _X.,n(fwdin),Noop(-----> Internal FWD - EXTEN is: ${EXTEN:0:1} (${EXTEN})) exten => _X.,n,Set(CALLERID(num)=${CUT(chanvar${ChanType}${Number},:,1)}) exten => _X.,n,Set(CALLERID(name)=${CUT(chanvar${ChanType}${Number},:,2)}) exten => _X.,n,GotoIf($[$[${REGEX("[46]",${EXTEN:0:1})}]&$[${LEN(${EXTEN})}<9]]?internal,${EXTEN},1) exten => _X.,n,Noop(The DNextn variable contains ${DN${EXTEN}} or does it exist?: ${EXISTS(${DN${EXTEN}})}) exten => _X.,n,GotoIf($[${EXISTS(${DN${EXTEN}})} = 1 ]?valid_internal:non_internal) exten => _X.,n(valid_internal),Noop(-------> valid_internal <-------) exten => _X.,n,Goto(internal,${EXTEN},1) exten => _X.,n,Hangup() exten => _X.,n(non_internal),Noop(-------> non_internal <-------) exten => _X.,n,Gotoif($[${ISNULL(${CUT(chanvar${ChanType}${Number},:,3)})}=1]?i,1) exten => _X.,n,Goto(${CUT(chanvar${ChanType}${Number},:,3)},${EXTEN},1) exten => _X.,n,Hangup() exten => _X.,n(invalid),Noop(-------> no valid chanVAR <-------) exten => _X.,n,Hangup() exten => h,1,Hangup() exten => i,1,Congestion() exten => i,n,Wait(3) exten => i,n,Hangup() exten => blind_transfer,1,Noop(-----> about to blind transfer) exten => blind_transfer,n,Goto(internal,${dialed_ext},1) ;************************** ;**** MAIN DIALPLAN **** ;************************** [zap_incoming] exten => s,1,Set(ZAPCALL=YES) exten => s,n,Goto(incoming,s,1) exten => s,n,Hangup() include => incoming [pri_incoming] include => incoming [incoming] #include /etc/asterisk/extensions_holidays.conf include => main_menu #include /etc/asterisk/extensions_dnis.conf [holiday] exten => s,1,NoOp(------> Incoming Call from ${CALLERID(name)} <${CALLERID(num)}> --- holiday) exten => s,n,Answer() exten => s,n,Background(${varCustom_Prompts_Dir}holiday) exten => s,n,Goto(main_menu,s,answered) ; exten => s,n,Goto(main_menu,s,closedmenu) [fax] ; exten => s,1,Wait(1); # incoming fax calls go to Zap/3 ; exten => s,n,Answer exten => s,1,Dial(Zap/3,300) exten => s,n,Hangup() exten => fax,1,Goto(s,1) [security] exten => s,1,Wait(300) exten => s,n,hangup() [main_menu] exten => s,1,NoOp(--==[ Incoming Call from ${CALLERID(name)} | ${CALLERID(num)} ]==--) exten => s,n,Answer() exten => s,n,Wait(${MAINMENUDELAY}) exten => s,n,Background(${varCustom_Prompts_Dir}msg_greeting) exten => s,n(answered),Background(${varCustom_Prompts_Dir}msg_ifyouknow) exten => s,n,Background(${varCustom_Prompts_Dir}msg_opt_1) exten => s,n,Background(${varCustom_Prompts_Dir}msg_opt_2) exten => s,n,Background(${varCustom_Prompts_Dir}msg_opt_3) exten => s,n,Background(${varCustom_Prompts_Dir}msg_fordir) exten => s,n,WaitExten(6) ; exten => s,n,gotoif($[$[${ISNULL(${CALLERID(name)})}=1]&$[${ISNULL(${CALLERID(num)})}=1]]?reception_BUSY,1) exten => s,n,Goto(0,1) exten => s,n,Hangup() exten => 9,1,Directory(default,main_menu,f) exten => 9,n,goto(s,answered) ; include => parkedcalls include => internal include => user_services ;exten => t,1,Goto(user_services,0,1) ; Auto Attendant section 8:45-18:15|mon-fri|*|* exten => 1,1,Noop(-----> AAT service calls) exten => 1,n,Wait(1) exten => 1,n,dial(${DN260}) exten => 1,n,Hangup() exten => 2,1,Noop(-----> AAT Operations calls) exten => 2,n,Wait(1) exten => 2,n,dial(${DN261}) exten => 2,n,Hangup() exten => 3,1,Noop(-----> AAT ISM calls) exten => 3,n,Wait(1) exten => 3,n,dial(${DN265}) exten => 3,n,Hangup() ; exten => 7,1,Noop(--== [ AAT Receptions ] ==--) ; exten => 7,n,dial(${test1},15) ; exten => 7,n,dial(${test2},15) ; exten => 7,n,Goto(reception_${DIALSTATUS},1) ; exten => 7,n,Hangup() ; exten => test_NOANSWER,1,playback(${varCustom_Prompts_Dir}msg_main_vmbox) ; exten => test_NOANSWER,n,Voicemail(277) ; exten => test_NOANSWER,n,Hangup() exten => 0,1,Noop(--== [ AAT Receptions ] ==--) exten => 0,n,gotoif($[${ISNULL(${CALLERID(num)})}=1]?no_test) exten => 0,n,gotoif($[${CALLERID(num)}=17770000007]?s,answered) exten => 0,n(no_test),dial(${RECPTN},15) ; RECPTN = SIP/2226 exten => 0,n,dial(${RECPTNALT1},15) ; RECPTNALT1 = SIP/2202&SIP/2208 exten => 0,n,Goto(reception_${DIALSTATUS},1) exten => 0,n,Hangup() ;original flow >> ; exten => reception_NOANSWER,1,playback(${varCustom_Prompts_Dir}msg_main_vmbox) ; exten => reception_NOANSWER,n,Voicemail(${MAINVMB}) ; exten => reception_NOANSWER,n,Hangup() ; << ; new flow to goto after hours >> exten => reception_NOANSWER,1,GotoIfTime(8:45-18:15|mon-fri|*|*?open_timeout,s,1) exten => reception_NOANSWER,n,Goto(after_hours,s,1) exten => reception_NOANSWER,n,Hangup() ; << exten => reception_CONGESTION,1,Playback(all-circuits-busy-now) exten => reception_CONGESTION,n,Playback(hangup-try-again) exten => reception_CONGESTION,n,Hangup() exten => reception_BUSY,1,playback(${varCustom_Prompts_Dir}msg_main_vmbox) exten => reception_BUSY,n,Voicemail(${MAINVMB}) exten => reception_BUSY,n,Hangup() exten => _reception_.,1,noop(--==[ something else ]==--) exten => _reception_.,n,goto(reception_NOANSWER,1) exten => reception_CHANUNAVAIL,1,goto(reception_NOANSWER,1) exten => a,1,Goto(s,answered) exten => o,1,Goto(0,1) ; exten => i,1,Wait(1) ; exten => i,n,Background(pbx-invalid) ; exten => i,n,goto(s,answered) exten => i,1,Playback(pbx-invalid) exten => i,n,gotoif($[${ISNULL(${CALLERID(num)})}=1]?no_test) exten => i,n,gotoif($[${CALLERID(num)}=17770000007]?s,answered) exten => i,n(no_test),Dial(${RECPTN},15) exten => i,n,Dial(${RECPTNALT2},15) exten => i,n,Voicemail(${MAINVMB}) exten => i,n,Hangup() ; exten => t,1,Goto(main_menu,0,1) exten => t,1,Playback(one-moment-please) exten => t,n,Dial(${RECPTN},15) exten => t,n,GotoIfTime(8:45-18:15|mon-fri|*|*?open_timeout,s,1) exten => t,n,Goto(after_hours,s,1) exten => t,n,Hangup() [open_timeout] exten => s,1,playback(${varCustom_Prompts_Dir}msg_main_vmbox) exten => s,n,Voicemail(${MAINVMB}) exten => s,n,Hangup() exten => t,1,Hangup() [after_hours] exten => s,1,Dial(${ALLPHONE},15) exten => s,n,Playback(sorry2) exten => s,n,Playback(please-try-again-later) exten => s,n,Playback(otherwise) exten => s,n,Playback(press-1) exten => s,n,Playback(to-leave-message-for) exten => s,n,Set(TIMEOUT(response)=2) exten => s,n,Background(reception) exten => s,n,waitexten(5) exten => s,n,goto(t,1) exten => 1,1,Voicemail(${MAINVMB}) exten => 1,n,Hangup() exten => t,1,Playback(thanks-for-calling-today) exten => t,n,Playback(goodbye) exten => t,n,Hangup() [internal] exten => _2XX,1,Noop(---=== [ ${CALLERID(name)} | ${CALLERID(num)} ] ===---) exten => _2XX,n,Set(dialed_ext=${EXTEN}) exten => _2XX,n,GotoIf($[ ${EXISTS(${DB(remotefwd/${dialed_ext})})} = 1 ]?:normalrouting) ; exten in remote fwd database? exten => _2XX,n,GotoIf($["${DB(remotefwd/${dialed_ext})}" = "off" ]?normalrouting) ; is the set forwarded? exten => _2XX,n,GoToIf($[ ${EXISTS(${ZAPCALL})} = 1 ]?:nonflashfwd) exten => _2XX,n,Noop(-------> ZAPCALL is: ${ZAPCALL}) exten => _2XX,n,GotoIf($[ "${ZAPCALL}" != "YES" ]?nonflashfwd:flashfwd); is the incoming a zap? exten => _2XX,n,Goto(normalrouting) ; should not get here but still exten => _2XX,n(flashfwd),Playback(transfer) ; exten => _2XX,n,Set(CALLERID(name)=${MAIN_CALLER_NM}) ; exten => _2XX,n,Set(CALLERID(num)=${MAIN_CALLER_ID}) exten => _2XX,n,Flash() ; transfer out from the same circuit exten => _2XX,n,Wait(1) exten => _2XX,n,SendDTMF(${DB(remotefwd/${dialed_ext})}) exten => _2XX,n,Wait(1) exten => _2XX,n,Hangup() exten => _2XX,n(nonflashfwd),Goto(trunks_longdist,9${DB(remotefwd/${dialed_ext})},1) exten => _2XX,n(normalrouting),GotoIf($[ ${EXISTS(${DN${dialed_ext}})} = 1 ]?:main_menu,i,1) ; exten => _2XX,n,Set(CALLERID(name)=${IF($[${ISNULL(${CALLERID(name)})}=1]?${MAIN_CALLER_NM}:${CALLERID(name)})}) ; exten => _2XX,n,Set(CALLERID(num)=${IF($[${REGEX("([0-9]+){10}",${DN${dialed_ext}})}]?${MAIN_CALLER_ID}:${CALLERID(num)})}) exten => _2XX,n,Gotoif($[ ${ISNULL(${ChanType})} = 0 ]?:origvmbox) exten => _2XX,n,Gotoif($[ "${ChanType}" = "Local" ]?:origvmbox) exten => _2XX,n,Noop(--------> keep the the vm box of the orig. caller: Voicemailbox=${Voicemailbox}) exten => _2XX,n,Dial(${DN${dialed_ext}},20,r) exten => _2XX,n,Hangup() exten => _2XX,n(origvmbox),Noop(-----> initializing the original voice-mail-box <-----) exten => _2XX,n,Set(Voicemailbox=${IF($[${ISNULL(${RefVM${dialed_ext}})}=1]?${dialed_ext}:${RefVM${dialed_ext}})}) exten => _2XX,n,Gotoif($["${DN${EXTEN}:0:3}"="SIP"]?:safe_dial) exten => _2XX,n,Gotoif($[${ISNULL(${SIPPEER(${dialed_ext})})}=1]?s-NOANSWER,1) exten => _2XX,n,Noop(---> Main Dialplan --- about to dial <---) exten => _2XX,n(safe_dial),Dial(${DN${dialed_ext}},20) exten => _2XX,n,Noop(---> Main Dialplan --- about to do a goto internal_noanswer <---) exten => _2XX,n,Goto(s-${DIALSTATUS},1) exten => _30[01],1,noop(--==[ sales extensions ]==--) exten => _30[01],n,GotoIf($[${EXISTS(${DN${EXTEN}})}=1]?:main_menu,i,1) exten => _30[01],n,goto(${DN${EXTEN}},1) exten => _[45]00,1,noop(--==[ ISM extensions ]==--) exten => _[45]00,n,GotoIf($[${EXISTS(${DN${EXTEN}})}=1]?:main_menu,i,1) exten => _[45]00,n,goto(${DN${EXTEN}},1) exten => locate_me,1,Noop(-----> locate-me extension reached <------) exten => locate_me,n,Read(usr_sel,${varCustom_Prompts_Dir}lme_transfer,1,,,4) exten => locate_me,n,GotoIf($[${ISNULL(${usr_sel})}=1]?s-NOANSWER,vm_route) exten => locate_me,n,GotoIf($[${usr_sel} = 2]?s-NOANSWER,vm_route) exten => locate_me,n,GotoIf($[${usr_sel} > 2]?locate_me,1) exten => locate_me,n,Set(lme_num_cnt=${CUT(DB(locateme/${dialed_ext}),:,2))}) exten => locate_me,n,Set(lme_num=${IF($[${DB_EXISTS(locateme/${dialed_ext}/N1)}=1]?${DB(locateme/${dialed_ext}/N1)}:${DB(locateme/${dialed_ext}/N2)})}) exten => locate_me,n,Dial(${SAN0}/${lme_num},20) exten => locate_me,n,Goto($[${lme_num_cnt}>1]?:lme_failed) exten => locate_me,n,Set(lme_num=${DB(locateme/${dialed_ext}/N2)}) exten => locate_me,n,Dial(${SAN0}/${lme_num},20) exten => locate_me,n(lme_failed),Set(Voicemailbox=${dialed_ext}) exten => locate_me,n,Goto(s-NOANSWER,vm_route);(s-${DIALSTATUS},1) exten => s-NOANSWER,1,NoOp(Voicemailbox=${Voicemailbox}) ; exten => s-NOANSWER,n,GotoIf($[${EXISTS(${DB(locateme/${dialed_ext})})} = 1 ]?:vm_route) ; exten => s-NOANSWER,n,GotoIf($["${CUT(DB(locateme/${dialed_ext}),:,1))}"="ON"]?locate_me,1) exten => s-NOANSWER,n(vm_route),Gotoif($[${ISNULL(${RefVM${dialed_ext}})}=1]?:user_services,getmailrem${RefVM${dialed_ext}},1) exten => s-NOANSWER,n,Voicemail(${Voicemailbox},u) exten => s-NOANSWER,n,Hangup() ;Goto(incoming,s,1) ; If they press #, return to start ${RefIAXVM${dialed_ext}} exten => s-BUSY,1,Goto(s-NOANSWER,vm_route) exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer exten => a,1,VoicemailMain(${Voicemailbox}) ; If they press *, send the user into VoicemailMain include => user_services exten => i,1,Wait(1) exten => i,n,Hangup() [virtual_users] exten => _X.,1,Voicemail(${EXTEN}@default,s) exten => _X.,n,Goto(incoming,s,1) exten => _X.,n,Hangup() [hints] ; exten => 298,hint,SIP/298 exten => 202,hint,SIP/202 ; exten => 203,hint,SIP/203 ; exten => 204,hint,SIP/204 ; exten => 205,hint,SIP/205 ; exten => 206,hint,SIP/206 exten => 208,hint,SIP/208 ; exten => 210,hint,SIP/210 exten => 211,hint,SIP/211 ; exten => 212,hint,SIP/212 ; exten => 214,hint,SIP/214 ; exten => 215,hint,SIP/215 exten => 216,hint,SIP/216 ; exten => 217,hint,SIP/217 ; exten => 218,hint,SIP/218 ; exten => 219,hint,SIP/219 ; exten => 220,hint,SIP/220 ; exten => 221,hint,SIP/221 ; exten => 222,hint,SIP/222 ; exten => 223,hint,SIP/223 ; exten => 224,hint,SIP/224 ; exten => 225,hint,SIP/225 exten => 226,hint,SIP/226 exten => 227,hint,SIP/227 ; exten => 228,hint,SIP/228 ; exten => 229,hint,SIP/229 ; exten => 231,hint,SIP/231 ; exten => 232,hint,SIP/232 ; exten => 233,hint,SIP/233 ; exten => 234,hint,SIP/234 ; exten => 235,hint,SIP/235 exten => 236,hint,SIP/236 ; exten => 237,hint,SIP/237 ; exten => 238,hint,SIP/238 ; exten => 248,hint,SIP/248 ; exten => 249,hint,SIP/249 ;************************** ;*** Macros *** ;************************** [speeddialentry] ; Not a literal macro because we want to have a menu ; Context for setting speed dials in ASTDB exten => s,1,Noop(Speed Dial Editing) exten => s,n,Answer() exten => s,n(changesdnum),Read(varSDnum,${varCustom_Prompts_Dir}changesdprompt1,4) ; put prompt wav in middle arg exten => s,n,Set(varASTDBkey=SpeedDial/${userDN}/${varSDnum}) exten => s,n,GotoIf($["${varSDnum}"="6000"]?invalid:) exten => s,n,GotoIf($["${varSDnum}"="6100"]?invalid:) exten => s,n,GotoIf($[${REGEX("6[01][0-9][0-9]",${varSDnum})}]?:invalid) exten => s,n,GotoIf($["${DB(${varASTDBkey})}"=""]?entersd:checksd) exten => s,n,Hangup() exten => s,n(entersd),Noop(Enter Speed Dial) exten => s,n,Read(varSDDialStr,${varCustom_Prompts_Dir}changesdprompt2) exten => s,n,Set(DB(${varASTDBkey})=${varSDDialStr}) exten => s,n,Goto(checksd) exten => s,n(invalid),Playback(invalid) exten => s,n,Goto(s,changesdnum) exten => s,n(checksd),Noop(Check Speed Dial) exten => s,n,Playback(${varCustom_Prompts_Dir}changesdprompt3) exten => s,n,SayDigits(${DB(${varASTDBkey})}) exten => s,n,Background(${varCustom_Prompts_Dir}changesdprompt4) exten => s,n,WaitExten(15) exten => s,n,Hangup() exten => 1,1,Goto(s,entersd) exten => 2,1,Goto(s,changesdnum) exten => i,1,Playback(invalid) exten => i,n,Goto(s,checksd) [remote_forwarding] ; Not a literal macro because we want to deal with extens exten => s,1,Set(EXTENSIONTOFORWARD=${ExtFwd});${EXTEN}) exten => s,n,GotoIf($[ ${DB_EXISTS(remotefwd/${ExtFwd})} = 1 ]?existingfwd:newfwd) exten => s,n,Hangup() exten => s,n(newfwd),Noop(went to newfwd) exten => s,n,Read(REMOTEDESTINATION,${varCustom_Prompts_Dir}EnterRemoteDestination,,,2,2) exten => s,n,Set(DB(remotefwd/${EXTENSIONTOFORWARD})=${REMOTEDESTINATION}) exten => s,n,GotoIf($[ ${DB(remotefwd/${EXTENSIONTOFORWARD})} = 0 ]?turnfwdoff:fwdon) exten => s,n,Hangup() exten => s,n(existingfwd),Noop(went to existingfwd) exten => s,n,GotoIf($[ ${DB(remotefwd/${EXTENSIONTOFORWARD})} = off]?fwdoff:fwdon) ;Hangup()_XXXX exten => s,n(fwdon),Noop(ON - fwd is set to ${DB(remotefwd/${EXTENSIONTOFORWARD})}) exten => s,n,Playback(${varCustom_Prompts_Dir}RemoteForwardIsSetTo) exten => s,n,SayDigits(${DB(remotefwd/${EXTENSIONTOFORWARD})}) exten => s,n,Wait(2) exten => s,n,Goto(newfwd) exten => s,n,Hangup() exten => s,n(fwdoff),Noop(-----> OFF - fwd is set to ${DB(remotefwd/${EXTENSIONTOFORWARD})}) ; external fwd is off exten => s,n,Background(${varCustom_Prompts_Dir}RemoteForwardIsOff) exten => s,n,Goto(newfwd) exten => s,n,Hangup() exten => s,n(turnfwdoff),Set(DB(remotefwd/${EXTENSIONTOFORWARD})=off) exten => s,n,Goto(fwdoff) exten => s,n,Hangup() exten => i,1,Goto(s,1) [macro-executive_set] ; ARG1 - dialed extension ; ARG2 - channel to dial ; ARG3 - alternative voicemailbox to use if exist exten => s,1,Noop(${CALLERID}) exten => s,n,Set(Voicemailbox=${IF($[ ${EXISTS(${ARG3})} = 1 ]?${ARG3}:${ARG1})}) exten => s,n,Dial(${ARG2},20) exten => s,n,Goto(s-${DIALSTATUS},1) exten => s-NOANSWER,1,Voicemail(${Voicemailbox},u) exten => s-NOANSWER,n,Hangup() exten => s-BUSY,1,Voicemail(${Voicemailbox},b) exten => s-BUSY,n,Hangup() exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer exten => a,1,VoicemailMain(${Voicemailbox}) ; If they press *, send the user into VoicemailMain [macro-reception] exten => s,1,Dial(${ARG2},20) ; Ring the interface, 20 seconds maximum exten => s,n,Set(Voicemailbox=${ARG1}) exten => s,n,Goto(s-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) exten => s-NOANSWER,1,Voicemail(u${ARG1}) ; If unavailable, send to voicemail w/ unavail announce exten => s-NOANSWER,2,Goto(incoming,s,1) ; If they press #, return to start exten => s-BUSY,1,Voicemail(b${ARG1}) ; If busy, send to voicemail w/ busy announce exten => s-BUSY,2,Goto(incoming,s,1) ; If they press #, return to start exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer exten => a,1,VoicemailMain(${ARG1}) ; If they press *, send the user into VoicemailMain [macro-invalid] exten => s,1,Playback(invalid) exten => s,2,Congestion() exten => s,3,Wait(3) exten => s,4,Hangup() [macro-queue_vm] exten => s,1,Voicemail(${ARG1}) exten => s,n,Hangup() [macro-alt_number_add] ; ARG1 - cnt_lmn - the number of stored numbers exten => s,1,Playback(enter-phone-number10) exten => s,n,Read(alt_num,and-prs-pound-whn-finished,10,,,4) exten => s,n,GotoIf($[ ${ISNULL(${alt_num})} = 1 ]?s,1) exten => s,n,Playback(the-num-i-have-is) exten => s,n,SayDigits(${alt_num}) exten => s,n,Background(to-enter-a-diff-number) exten => s,n,Background(press-any-key) exten => s,n,Background(if-correct) exten => s,n,Background(please-stay-on-the-line) exten => s,n,Read(try_again,,1,,,2) exten => s,n,Set(try_again=${IF($[ ${ISNULL(${try_again})} = 1 ]?2:1)}) ; if the choice is null Temp will be 2 exten => s,n,GotoIf($[ ${try_again} = 1 ]?s,1) exten => s,n,Set(DB(altnumber/${ARG1})=&${SAN0}/${alt_num}) [macro-modify_clid] [macro-mixmonitor] [macro-assist_and_mix] [macro-call_set] [macro-long_dist_check] ; ${ARG1} - the area phone code exten => s,1,Noop(---> area code: ${ARG1}) exten => s,n,Set(i_loop=1) exten => s,n,Set(long_dist_prefix=1) exten => s,n,While($[ ${ISNULL(${CUT(LOCALNPAN|:|${i_loop})})} = 0 ]) ;loop if it's not null exten => s,n,Gotoif($[${CUT(LOCALNPAN|:|${i_loop})}=${ARG1}]?:next_in_line) exten => s,n,Goto(end_of_macro) exten => s,n(next_in_line),set(i_loop=$[${i_loop}+1]) exten => s,n,EndWhile() exten => s,n(end_of_macro),Noop(end of macro) [hangup_end] exten => h,1,Hangup()