And I got it wrong yet again… in any case, now you have almost everything!
Here the contents of my extensions.conf settings
#include extensions_extra.conf
#include extensions_macro.conf
[default]
; no calls should normally end up here
exten => _X!,1,Answer()
exten => _X!,2,Playback(tt-monkeys)
exten => _X!,3,Hangup()
[incoming_calls]
; Handle incoming calls from SIP accounts
; Custom dialplan hook
exten => _[+0-9a-zA-Z].,1, NoOp()
; Store caller id
exten => _[+0-9a-zA-Z].,n, Set(DB(LASTCALLER/${CHANNEL(peername)})=${CALLERID(NUM)})
; Handle call - Goto(call_line,${EXTEN},1) or Macro(callhandler,${CHANNEL(peername)})
exten => _[+0-9a-zA-Z].,n, Macro(callhandler,${CHANNEL(peername)})
exten => _[+0-9a-zA-Z].,n, Hangup()
[cbbs]
; Receive calls after Callback - play something to caller
; Don't run callhandler macro, we have already done that once for this call
exten => s,1, Playback(queue-thankyou)
exten => s,n, Dial(${TAPILINE},,F(hangup,h,2))
exten => s,n, Hangup()
[hangup]
; Local lines end up here after other party hangs up.
; Play some tone to indicate that call has ended.
exten => h,1, Hangup()
exten => h,2, Playback(beep)
exten => h,3, Hangup()
[clir]
;exten => _|CLIR|.,1, Set(CALLERID(num-pres)=prohib_not_screened)
;exten => _|CLIR|.,n, Set(CALLERID(name-pres)=prohib_not_screened)
;exten => _|CLIR|.,n, Goto(${EXTEN:|CLIR_FAC_LEN|},1)
;
; Contexts for SIP Provider
;
[sip0]
; Main context, handles all normal calls for this Provider
include => clir
include => local_extensions
include => sip0-callforwarding
include => sip0-callwaiting
include => sip0-direct
include => sip0-outgoing
[sip0-transfer]
; Context used for call transfer for this Provider
include => local_extensions
include => sip0-transfer-remote
[sip0-transfer-remote]
; Context used for call transfer to remote extension for this Provider
exten => _X.,1, Transfer(SIP/${EXTEN}@sip0,,)
[sip0-outgoing]
; Context used for normal outgoing calls
exten => _[*#0-9].,1, Set(DIAL_EXTEN=${EXTEN})
exten => _[*#0-9].,n, Set(CALLERID(ANI)=W2119220021-1)
exten => _[*#0-9].,n, Set(CALLERID(number)=W2119220021-1)
exten => _[*#0-9].,n, NoOp()
exten => _[*#0-9].,n, Macro(call_filter0-outgoing)
exten => _[*#0-9].,n, Set(DB(LASTCALL/sip0)=${DIAL_EXTEN})
exten => _[*#0-9].,n, Set(CALLERID(name)=W2119220021-1)
exten => _[*#0-9].,n, Set(__TRANSFER_CONTEXT=sip0-transfer)
exten => _[*#0-9].,n, Dial(SIP/${DIAL_EXTEN}@sip0,,gT)
exten => _[*#0-9].,n, Macro(endcall,SIP,sip0,${DIAL_EXTEN},${CHANNEL(name)},,,,,congestion)
exten => _[*#0-9].,n, Goto(hangup,h,2)
exten => _[*#0-9].,n, Hangup()
[sip0-callforwarding]
exten => cfimoff,1, Macro(delete_cfim,sip0)
exten => cfbsoff,1, Macro(delete_cfbs,sip0)
exten => callreturn,1, Macro(call_return,sip0)
exten => redial,1, Macro(redial,sip0)
[sip0-callwaiting]
exten => cwoff,1, Macro(delete_cw,sip0)
exten => cwon,1, Macro(create_cw,sip0)
exten => cwstatus,1, Macro(status_cw,sip0)
[sip0-direct]
; extensions that will be dialled immediately when they are matched
; useful for fixed length number series
exten => _cfimon,1, Macro(create_cfim,sip0)
exten => _cfbson,1, Macro(create_cfbs,sip0)
exten => _[*#]XX#!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _*#XX#!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _[*#]XXX#!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _*#XXX#!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _[256]XXXXXXX!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141[256]XXXXXXX!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1470[256]XXXXXXX!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _119!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _100!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _112!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _150!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _155!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _190!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _199!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _999!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _147[14]!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _116000!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _116006!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _116111!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _116117!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _116123!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141119!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141100!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141112!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141150!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141155!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141190!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141199!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141999!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141116000!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141116006!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141116111!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141116117!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141116123!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _8[0-79]XX!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1418[0-79]XX!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _14708[0-79]XX!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _118XX!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141123!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141151!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141192!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141193!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141194!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141195!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _141118XX!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1470123!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1470151!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1470192!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1470193!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1470194!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1470195!,1,Goto(sip0-outgoing,${EXTEN},1)
exten => _1470118XX!,1,Goto(sip0-outgoing,${EXTEN},1)
;
; Contexts for SIP Provider
;
[sip1]
; Main context, handles all normal calls for this Provider
include => clir
include => local_extensions
include => sip1-callforwarding
include => sip1-callwaiting
include => sip1-direct
include => sip1-outgoing
[sip1-transfer]
; Context used for call transfer for this Provider
include => local_extensions
include => sip1-transfer-remote
[sip1-transfer-remote]
; Context used for call transfer to remote extension for this Provider
exten => _X.,1, Transfer(SIP/${EXTEN}@sip1,,)
[sip1-outgoing]
; Context used for normal outgoing calls
exten => _[*#0-9].,1, Set(DIAL_EXTEN=${EXTEN})
exten => _[*#0-9].,n, Set(CALLERID(ANI)=W2119220021-2)
exten => _[*#0-9].,n, Set(CALLERID(number)=W2119220021-2)
exten => _[*#0-9].,n, NoOp()
exten => _[*#0-9].,n, Macro(call_filter0-outgoing)
exten => _[*#0-9].,n, Set(DB(LASTCALL/sip1)=${DIAL_EXTEN})
exten => _[*#0-9].,n, Set(CALLERID(name)=W2119220021-2)
exten => _[*#0-9].,n, Set(__TRANSFER_CONTEXT=sip1-transfer)
exten => _[*#0-9].,n, Dial(SIP/${DIAL_EXTEN}@sip1,,gT)
exten => _[*#0-9].,n, Macro(endcall,SIP,sip1,${DIAL_EXTEN},${CHANNEL(name)},,,,,congestion)
exten => _[*#0-9].,n, Goto(hangup,h,2)
exten => _[*#0-9].,n, Hangup()
[sip1-callforwarding]
exten => cfimoff,1, Macro(delete_cfim,sip1)
exten => cfbsoff,1, Macro(delete_cfbs,sip1)
exten => callreturn,1, Macro(call_return,sip1)
exten => redial,1, Macro(redial,sip1)
[sip1-callwaiting]
exten => cwoff,1, Macro(delete_cw,sip1)
exten => cwon,1, Macro(create_cw,sip1)
exten => cwstatus,1, Macro(status_cw,sip1)
[sip1-direct]
; extensions that will be dialled immediately when they are matched
; useful for fixed length number series
exten => _cfimon,1, Macro(create_cfim,sip1)
exten => _cfbson,1, Macro(create_cfbs,sip1)
exten => _[*#]XX#!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _*#XX#!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _[*#]XXX#!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _*#XXX#!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _[256]XXXXXXX!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141[256]XXXXXXX!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1470[256]XXXXXXX!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _119!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _100!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _112!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _150!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _155!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _190!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _199!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _999!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _147[14]!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _116000!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _116006!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _116111!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _116117!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _116123!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141119!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141100!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141112!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141150!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141155!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141190!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141199!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141999!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141116000!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141116006!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141116111!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141116117!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141116123!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _8[0-79]XX!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1418[0-79]XX!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _14708[0-79]XX!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _118XX!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141123!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141151!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141192!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141193!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141194!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141195!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _141118XX!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1470123!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1470151!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1470192!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1470193!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1470194!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1470195!,1,Goto(sip1-outgoing,${EXTEN},1)
exten => _1470118XX!,1,Goto(sip1-outgoing,${EXTEN},1)
[macro-check-foreign]
exten => s,1,NoOp()
exten => s,n,GotoIf($["${ARG1}":"((00)[0-9]+)">0]?international:not-foreign)
exten => s,n(international),GotoIf($["${ARG1}":"((00)(44)[0-9]+)">0]?not-foreign)
exten => s,n,Set(FOREIGN=1)
exten => s,n,MacroExit()
exten => s,n(not-foreign),Set(FOREIGN=0)
[macro-check-special-rate]
exten => s,1,NoOp(0[8,9]xx+)
exten => s,n,GotoIf($["${ARG1}":"(^(0[8|9][0-9][0-9]+)$)">0]?special-rate:normal-rate)
exten => s,n(special-rate),Set(SPECRATE=1)
exten => s,n,MacroExit()
exten => s,n(normal-rate),Set(SPECRATE=0)
[macro-call_filter0-incoming]
exten => s,1,NoOp()
exten => s,n,MacroExit()
[macro-call_filter0-outgoing]
exten => s,1,NoOp()
exten => s,n,MacroExit()
[call_line]
; Incoming calls will end up in this context when a local line should be dialled
exten => W2119220021-1,1,Macro(call_filter0-incoming)
exten => W2119220021-1,n,Set(__TRANSFER_CONTEXT=${CHANNEL(peername)}-transfer)
exten => W2119220021-1,n,GotoIf($["${CALLERID(NUM):0:1}" = "+"]?rewrite:norewrite)
exten => W2119220021-1,n(rewrite),Set(CALLERID(num)="00${CALLERID(num):1}"))
exten => W2119220021-1,n(norewrite),NoOp()
exten => W2119220021-1,n,GotoIf(${DB_EXISTS(CFBS/sip0)}?cfbs)
exten => W2119220021-1,n,Dial(TAPI\/1,,tF(hangup,h,2))
exten => W2119220021-1,n,Goto(W2119220021-1,nocfbs)
exten => W2119220021-1,n(cfbs),Dial(TAPI\/1,20,tF(hangup,h,2))
exten => W2119220021-1,n(nocfbs),NoOp()
exten => W2119220021-1,n,GotoIf($["${DIALSTATUS}"="ANSWER"]?endcall)
exten => W2119220021-1,n,GotoIf($["${DIALSTATUS}"="BUSY"]?noanswer)
exten => W2119220021-1,n,GotoIf($["${DIALSTATUS}"="NOANSWER"]?noanswer:endcall)
exten => W2119220021-1,n(noanswer),Macro(callhandler-noanswer,${CHANNEL(peername)})
exten => W2119220021-1,n(endcall),Hangup()
exten => W2119220021-2,1,Macro(call_filter0-incoming)
exten => W2119220021-2,n,Set(__TRANSFER_CONTEXT=${CHANNEL(peername)}-transfer)
exten => W2119220021-2,n,GotoIf($["${CALLERID(NUM):0:1}" = "+"]?rewrite:norewrite)
exten => W2119220021-2,n(rewrite),Set(CALLERID(num)="00${CALLERID(num):1}"))
exten => W2119220021-2,n(norewrite),NoOp()
exten => W2119220021-2,n,GotoIf(${DB_EXISTS(CFBS/sip1)}?cfbs)
exten => W2119220021-2,n,Dial(TAPI\/2,,tF(hangup,h,2))
exten => W2119220021-2,n,Goto(W2119220021-2,nocfbs)
exten => W2119220021-2,n(cfbs),Dial(TAPI\/2,20,tF(hangup,h,2))
exten => W2119220021-2,n(nocfbs),NoOp()
exten => W2119220021-2,n,GotoIf($["${DIALSTATUS}"="ANSWER"]?endcall)
exten => W2119220021-2,n,GotoIf($["${DIALSTATUS}"="BUSY"]?noanswer)
exten => W2119220021-2,n,GotoIf($["${DIALSTATUS}"="NOANSWER"]?noanswer:endcall)
exten => W2119220021-2,n(noanswer),Macro(callhandler-noanswer,${CHANNEL(peername)})
exten => W2119220021-2,n(endcall),Hangup()
[tapi_dialtone]
;Hints to set dialtone according to sip reg status
exten => tapi0,hint,SIP/sip0
exten => tapi1,hint,SIP/sip1
[local_extensions]
exten => #123456,1,Dial(TAPI/1&TAPI/2&TAPI/3&TAPI/4&TAPI/5&TAPI/6,,t)
exten => #123456,n,Hangup()
exten => #123457,1,Playback(tt-monkeys)
exten => #123457,n,Hangup()
exten => #123458,1,Echo()
exten => #123458,n,Hangup()
exten => #999999,1,Playback(beep)
exten => #999999,n,Record("/usr/lib/asterisk/recordings/user-recording${STRFTIME(${EPOCH},,%C%y%m%d-%T)}.gsm")
exten => #999999,n,Playback(auth-thankyou)
exten => #999999,n,Hangup()
exten => 0000,1,Dial(TAPI/1,,gF(hangup,h,2))
exten => 0000,n,GotoIf($["${DIALSTATUS}"="ANSWER"]?endcall)
exten => 0000,n,NoOp()
exten => 0000,n(endcall),Macro(endcall,TAPI,1,0000,${CHANNEL(name)},,,,,)
exten => 0000,n,Goto(hangup,h,2)
exten => 0000,n,Hangup()
exten => 1111,1,Dial(TAPI/2,,gF(hangup,h,2))
exten => 1111,n,GotoIf($["${DIALSTATUS}"="ANSWER"]?endcall)
exten => 1111,n,NoOp()
exten => 1111,n(endcall),Macro(endcall,TAPI,2,1111,${CHANNEL(name)},,,,,)
exten => 1111,n,Goto(hangup,h,2)
exten => 1111,n,Hangup()