より現実的なダイヤルプランの実装

外線発信   これまでは、Asteriskをインストールした後にちょっとテストするのに使う程度の設定を
紹介してきましたが、ここでもう少し現実に近い感じの設定例を示しておきます。

[general]
static=yes
writeprotect=no
clearglobalvars=no

[globals]
EXTTRUNK1=Zap/g1 ←内線トランクグループ1
EXTTRUNK2=Zap/g2 ←内線トランクグループ2
OUTTRUNK1=Zap/g3 ←外線トランクグループ1
OUTTRUNK2=Zap/g4 ←外線トランクグループ2
SIPTRUNK=SIP ←SIPトランク

[macro-ROUTE-OUTDIAL] ←外線発信用マクロ
; ARG1 = TRUNK TYPE
←パラメータ1=トランク種別
exten => s,1,NoOp("route OUTDIAL")
exten => s,n,SetMusicOnHold(native) ←保留音再生方法選択
exten => s,n,Dial(${ARG1}/${MACRO_EXTEN:1},,tT) ←(※1)ダイヤル
exten => s,n,Playtones(busy) ←ビジー音再生
exten => s,n,Wait(2) ←待ち2秒
exten => s,n,StopPlaytones() ←ビジー音停止
exten => s,n,Hangup ←切断

[macro-ROUTE-INVALID] ←無効番号用マクロ
exten => s,1,NoOp("route INVALID")
exten => s,n,Answer()
exten => s,n,Playtones(busy)
exten => s,n,Wait(2)
exten => s,n,StopPlaytones()
exten => s,n,Hangup

[office-A] ←(※2
exten => _0.,1,Macro(ROUTE-OUTDIAL,${OUTTRUNK1}) ←外線発信(0+電話番号)
exten => _1!,1,Macro(ROUTE-INVALID) ←無効番号
exten => _2!,1,Macro(ROUTE-INVALID) ←無効番号
exten => _3!,1,Macro(ROUTE-INVALID) ←無効番号
exten => _4!,1,Macro(ROUTE-INVALID) ←無効番号
exten => _5.,1,Macro(ROUTE-OUTDIAL,${EXTTRUNK1}) ←内線発信(5+内線番号)
exten => _6!,1,Macro(ROUTE-INVALID) ←無効番号
exten => _7!,1,Macro(ROUTE-INVALID) ←無効番号
exten => _8!,1,Macro(ROUTE-INVALID) ←無効番号
exten => _9!,1,Macro(ROUTE-INVALID) ←無効番号
※1${MACRO_EXTEN:1}は電話番号の左1文字を削除
※2このセクションで0発信から9発信までの動作を定義する

受電の考慮   今度は、外線からの着信を考慮します。
まだまだ複雑なことはできませんが、
動作イメージとしては、着信したらメッセージを再生して、その後、番号のダイヤル待ちになって
ダイヤルされた番号によって処理を分けるという感じでしょうか。
よく言う「IVR(自動音声応答)」の機能です。

[general]
static=yes
writeprotect=no
clearglobalvars=no

[globals]
EXTTRUNK1=Zap/g1
EXTTRUNK2=Zap/g2
OUTTRUNK1=Zap/g3
OUTTRUNK2=Zap/g4
SIPTRUNK=SIP

[macro-ROUTE-OUTDIAL]
; ARG1 = TRUNK TYPE
exten => s,1,NoOp("route OUTDIAL")
exten => s,n,SetMusicOnHold(native)
exten => s,n,Dial(${ARG1}/${MACRO_EXTEN:1},,tT)
exten => s,n,Playtones(busy)
exten => s,n,Wait(2)
exten => s,n,StopPlaytones()
exten => s,n,Hangup

[macro-ROUTE-INVALID]
exten => s,1,NoOp("route INVALID")
exten => s,n,Answer()
exten => s,n,Playtones(busy)
exten => s,n,Wait(2)
exten => s,n,StopPlaytones()
exten => s,n,Hangup

[IVR-MAIN]
exten => s,1,NoOp("route INBOUND")
exten => s,n,Background("番号をダイヤルしてください") ←音声を用意してください
exten => s,n,WaitExten(20)
exten => s,n,Hangup
exten => 1,1,NoOp("1 dialed:play message") ←1がダイヤルされたときの動作
exten => 1,n,BackGround(demo-congrats) ←メッセージ再生
exten => 1,n,Hangup
exten => 2,1,NoOp("2 dialed:all call") ←2がダイヤルされたときの動作
exten => 2,n,Dial(${EXTTRUNK1}&${EXTTRUNK2},,tT) ←番号を&でつなぐことで一斉コール
exten => 2,n,Hangup

[office-A]
exten => s,1,NoOp("Inbound Call") ←着信時、ここから実行される
exten => s,n,goto,IVR-MAIN|s|1 ←別のコンテキストへジャンプ
exten => s,n,Hangup
exten => _0.,1,Macro(ROUTE-OUTDIAL,${OUTTRUNK1})
exten => _1!,1,Macro(ROUTE-INVALID)
exten => _2!,1,Macro(ROUTE-INVALID)
exten => _3!,1,Macro(ROUTE-INVALID)
exten => _4!,1,Macro(ROUTE-INVALID)
exten => _5.,1,Macro(ROUTE-OUTDIAL,${EXTTRUNK1})
exten => _6!,1,Macro(ROUTE-INVALID)
exten => _7!,1,Macro(ROUTE-INVALID)
exten => _8!,1,Macro(ROUTE-INVALID)
exten => _9!,1,Macro(ROUTE-INVALID)

営業時間   日付や時間によって動作を変えたいときのサンプルです。
営業時間外は受け付けたくないようなときに便利です。

exten => s-TCONOK,1,NoOp("Time Control")
exten => s-TCONOK,n,GotoIfTime(9:00-18:00|mon-fri|*|*?s-OPENOK,1) ←ここで時間チェック
exten => s-TCONOK,n,BackGround(月曜から金曜日の午前9時から午後5時の間におかけ直しください)
exten => s-TCONOK,n,HangUp
;
exten => s-OPENOK,1,NoOp("LABEL-OPENOK")
exten => s-OPENOK,n,BackGround(XXXにお電話ありがとうございます)