All pastes #717267 Raw Edit

Something

public text v1 · immutable
#717267 ·published 2007-09-27 14:41 UTC
rendered paste body
; 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()