Cisco IVR APIを使用してTCLで音声IVRメニューを作成する

今日は、Ciscoルータの音声メニュー( IVR )について話します。これはTCLで記述し、Cisco 3845に接続します。



まず、基本を見てみましょう



IOS 12以降、シスコは音声メニューを操作するためにVXMLおよびTCLスクリプトの両方をサポートしています。 ただし、 VXMLとは異なり、 TCLスクリプトはCisco IVR APIとの相互運用性がはるかに高くなっています 。 ハイブリッドIVRスクリプトを、 TCLスクリプト内のVXMLコードの組み込み部分と接続することもできます。



偶然受け取ったCisco IVRに関連するすべてのドキュメントは、 ここからダウンロードできます



FSM



1つ目はFSMの移行です。

有限状態マシンは抽象的なオートマトンであり、可能な内部状態の数は有限です。

次のようになります。

set ivr_fsm(CALLCOMES,ev_setup_indication) "act_Setup same_state"
      
      





トランジションは好きなだけ作成でき、 TCLスクリプトの最後にあります。



それが何であるかを見てみましょう。

このコマンドの一般的な構文は次のとおりです。

 set array(CURRSTATE, curr_event) “act_proc NEXTSTATE”
      
      





ここで:

arrayFSMアレイの名前です。

CURRSTATEは、 curr_eventイベントが受信される現在の状態の名前です。

act_proc - curr_eventイベントを受信したときに実行する必要がある関数の名前。

NEXTSTATEは、 act_procの実行後に確立される状態の名前です。



言い換えれば、 FSMは、CiscoがAPIからcurr_eventで受信したイベントとCURRSTATEで現在のステータスを比較するマーカーであり、FSMの移行で記述されている場合、 act_procプロシージャが呼び出され、状態がNEXTSTATEに変わります。



これで最も重要なことは、現在のイベントと状態が同時に説明されるすべてのFSM変遷と比較されるということです。 つまり シスコの場合、FSMトランジションが配置される順序は重要ではなく、すべて非同期で処理されます。



機能



2番目のポイントは関数自体であり、スクリプトを初期化する前に記述する必要があります。



すべてのコマンドと状態の目的は、 ここからダウンロードできるtcl_ivr_2.0_programming_guideファイルで詳細に説明されています。スクリプトで直接使用するものについてのみ詳しく説明します。



1)スクリプトの初期化



TCL IVRスクリプトの先頭には、 initプロシージャが含まれています。私の例では、この関数は次のようになります。

 proc init { } { puts "\n proc Init start" global param }
      
      





ここでは、基本的に、画面にコマンドputs "..."とグローバル変数paramの定義が表示されます



スクリプトの初期化は、すべての関数の説明の後に行われ、 init関数の起動から始まります。 この単純なことが終わった後、すべてがもっと面白くなっています。



スクリプトの最後の実行可能行は、開始FSM遷移および開始状態を決定するための行である必要があります。 私たちの場合、それは:

 fsm define ivr_fsm CALLCOMES
      
      





これは、 FSMアレイの名前がivr_fsmに設定され、開始状態がCALLCOMESであることを意味します。 初期化を終了すると、何が起こっているかが明確になります(願っています)。



2)ご挨拶



 proc Play_Welcome { } { puts "\n\n IVR - proc Play_Welcome start \n\n" global playng_files global param global pattern global numbers global workingtime # ,     init_perCallVars #  GetDate #      ,   if {$workingtime} { set after_welcome $playng_files(takenumber) } else { set after_welcome $playng_files(noworking) } #     set param(interruptPrompt) true set param(abortKey) * set param(terminationKey) # #   leg setupack leg_incoming leg proceeding leg_incoming leg connect leg_incoming #        leg collectdigits leg_incoming param pattern #    ,    #   param(interDigitTimeout),    #  ev_collectdigits_done media play leg_incoming %s500 $playng_files(welcome) $after_welcome $playng_files(onhold) # ,      ev_named_timer timer start named_timer $numbers(waiting_time) t1 }
      
      





ここですべてを詳しく説明します。



この手順の結果は、 leg setupack、leg procedure、leg connectコマンドによる着信回線のシスコへの接続、およびメディアプレイleg_incomingコマンドによる着信回線への音楽ファイルの損失です。

押されたキー、 leg collectdigit 、およびタイマーを収集するプロセスは、 タイマー開始コマンドですぐに 開始されます。



そして、 GetDate関数を呼び出して、現在の稼働時間をチェックします。

 proc GetDate { } { global workingtime # set houris [clock format [clock seconds] -format %H] #  set dayis [clock format [clock seconds] -format %A] #   if {$houris > 17 || $houris < 8 || $dayis=="Sunday" || $dayis=="Saturday"} { set workingtime 0 } else { set workingtime 1 } }
      
      





勤務時間かどうかに応じて、発信者に再生される音楽ファイルを変更します。



この例では、 fsm define ivr_fsm CALLCOMESとして開始状態が設定されているため 、3つのFSMがすぐに開始されます。

 set ivr_fsm(CALLCOMES,ev_setup_indication) "Play_Welcome, same_state" set ivr_fsm(CALLCOMES,ev_collectdigits_done) "CheckDestanation, same_state" set ivr_fsm(CALLCOMES,ev_named_timer) "GoToReception, same_state"
      
      





ev_setup_indicationイベントは、コールが到着すると発生し、 Play_Welcomeプロシージャが起動します。これは、押された数字の収集プロセスの開始とタイマーの開始を説明します。



サブスクライバーに音楽が再生されると、リバースタイマーレポートが開始されます。これは、 param(initialDigitTimeout)パラメーター( set set param(initialDigitTimeout)15行のすぐ上に設定でき、15秒に設定できますによって設定されます。 ここでは指定されていません。その標準値は10秒です。その後、スクリプトはev_collectdigits_doneイベントを受け取り、 FSM移行で説明したように、 CheckDestanation関数が実行されます。



Play_Welcomeコマンドで開始されたタイマー:

 #  named_timer, ,    numbers(waiting_time),   t1 timer start named_timer $numbers(waiting_time) t1
      
      





完了後、 ev_named_timerイベントが生成され、次のFSM移行によって処理されます。

 set ivr_fsm(CALLCOMES,ev_named_timer) "GoToReception, same_state"
      
      





GoToReceptionプロシージャが呼び出されます。



3)入力した番号を確認します



 proc CheckDestanation { } { puts "\n\n IVR - proc CheckDestanation start \n\n" global playng_files global numbers global digit #   media stop leg_incoming #   set status [infotag get evt_status] set digit [infotag get evt_dcdigits] #     #    ,    $numbers(fast_reception), # digit      $digit   CheckCallersAndConnect, #     CALLCONNECTED, #  ,    ev_setup_done (   ) #    CallIsConnect if {$digit == $numbers(fast_reception)} { puts "\n\n IVR - proc CheckDestanation digit = $digit\nGoing to next reception \n\n" fsm setstate CALLCONNECTED set digit $numbers(reception) # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #    ,    $numbers(fast_ckp),    # CheckCallersAndConnect } elseif {$digit == $numbers(fast_ckp)} { puts "\n\n IVR - proc CheckDestanation digit = $digit\nGoing to next CKP \n\n" fsm setstate CALLCONNECTED set digit $numbers(ckp) # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #    ,    $numbers(fast_fax),    # CheckCallersAndConnect } elseif {$digit == $numbers(fast_fax)} { puts "\n\n IVR - proc CheckDestanation digit = $digit\nGoing to next fax \n\n" fsm setstate CALLCONNECTED set digit $numbers(fax) # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #  = cd_004 (   ) -     # CheckCallersAndConnect } elseif {$status == "cd_004"} { puts "\n\n IVR - proc CheckDestanation status = $status digit = $digit \n\n" fsm setstate CALLCONNECTED # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #  = cd_005 (  dial plan) -     # CheckCallersAndConnect } elseif {$status == "cd_005"} { puts "\n\n IVR - proc CheckDestanation status = $status digit = $digit \n\n" fsm setstate CALLCONNECTED # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #  = cd_006 (   ) -    $playng_files(noexist) #     TORECEPTION,       #ev_media_done (   )   Play_TakeNumber } elseif {$status == "cd_006"} { puts "\n\n IVR - proc CheckDestanation status = $status digit = $digit \n\n" fsm setstate TRYAGAIN media play leg_incoming $playng_files(noexist) #       TORECEPTION,    #   ev_media_done (   )  # GoToReception } else { # "    " fsm setstate TORECEPTION media play leg_incoming $playng_files(toreception) puts "\n\n IVR - proc CheckDestanation status = $status \n\n" } }
      
      





発信者が番号をダイヤルした後に呼び出されるCheckDestanationプロシージャでは、ダイヤル中に受信した番号を設定と比較し、 fsm setstateコマンドを使用してスクリプトを適切な状態に変換します。



関数に分類されるすべての状態は、次のFSM遷移に分類されます。

 set ivr_fsm(CALLCONNECTED,ev_setup_done) "CallIsConnect, same_state" set ivr_fsm(TORECEPTION,ev_media_done) "GoToReception, same_state" set ivr_fsm(TRYAGAIN,ev_media_done) "Play_TakeNumber, TRYING" set ivr_fsm(TRYING,ev_collectdigits_done) "CheckDestanation, same_state" set ivr_fsm(TRYING,ev_named_timer) "GoToReception, same_state"
      
      





順番に行きましょう。



1)したがって、最初に、キーストロークの収集手順の完了後にCheckDestanation関数呼び出されます。

2)押されたキーに関する情報は、set digit [infotag get evt_dcdigits]コマンドを使用して数字変数に書き込まれます

同様に、状態変数に回線状態を書き込みます

3)次に、取得した結果を指定された変数と比較し、一致する場合はスクリプトの状態を変更します。

 if {$digit == $numbers(fast_reception)} { puts "\n\n IVR - proc CheckDestanation digit = $digit\nGoing to next reception \n\n" fsm setstate CALLCONNECTED leg setup $numbers(reception) callinfo leg_incoming }
      
      







4)発信者番号の確認



 proc CheckCallersAndConnect {digit} { puts "\n\n IVR - proc CheckCallersAndConnect start \n\n" set callernumber [infotag get leg_ani] switch $callernumber { "9120000000" {set callInfo(displayInfo) "Director(mobile)"} "9130000000" {set callInfo(displayInfo) "Buhgalter(mobile)"} default {} } puts "\n\n IVR - caller is $callernumber connect with $digit\n\n" leg setup $digit callInfo leg_incoming }
      
      





この関数を使用すると、呼び出し元の名前を書き込むためのフィールドを変更できます。 審美性のためだけに、電話番号だけでなく加入者IDも書かれていると、より良いものになります。 加入者IDを変更した後、回線は目的の番号に接続されます。



5)番号を接続する



 proc CallIsConnect { } { puts "\n\n IVR - proc CallIsConnect start \n\n" global playng_files #   status set status [infotag get evt_status] #   ls_000 (    ),    CALLACTIVE if {$status == "ls_000"} { fsm setstate CALLACTIVE #   ls_002 (    ),     } elseif {$status == "ls_002"} { fsm setstate TRYAGAIN media play leg_incoming $playng_files(noanswer) #  -  ,     } elseif {$status == "ls_004" || $status == "ls_005" || $status == "ls_006"} { fsm setstate TRYAGAIN media play leg_incoming $playng_files(noexist) #   ls_007 ( ),     } elseif {$status == "ls_007"} { fsm setstate TRYAGAIN media play leg_incoming $playng_files(busy) } }
      
      





この関数は、次のFSM遷移によって呼び出されます。

 set ivr_fsm(CALLCONNECTED,ev_setup_done) "CallIsConnect, same_state"
      
      





ev_setup_doneイベントは、呼び出し元が必要な回線に接続した後に発生します。



6)再リクエスト番号



 proc Play_TakeNumber { } { puts "\n\n IVR - proc Play_TakeNumber start \n\n" global playng_files global numbers global param global pattern #       if {$numbers(cur_try) <= $numbers(max_try)} { puts "\n\n IVR - proc Play_TakeNumber current try is: $numbers(cur_try) \n\n" incr numbers(cur_try) #        leg collectdigits leg_incoming param pattern #   media play leg_incoming $playng_files(takenumber) # ,      ev_named_timer timer start named_timer $numbers(waiting_time) t1 #    $numbers(max_try) -  } else { fsm setstate CALLDISCONNECTED media play leg_incoming $playng_files(callafter) } }
      
      





この関数は、呼び出し元が間違っている回数をチェックし、値が$数値(max_try)未満の場合、番号の再入力求めます。



この関数は、次のFSMによって呼び出されます。

 set ivr_fsm(TRYAGAIN,ev_media_done) "Play_TakeNumber, TRYING" set ivr_fsm(TRYING,ev_collectdigits_done) "CheckDestanation, same_state" set ivr_fsm(TRYING,ev_named_timer) "GoToReception, same_state"
      
      







7)接続の切断



 proc AbortCall { } { puts "\n\n IVR - proc AbortCall start \n\n" call close }
      
      





次のFSMによって呼び出されます。

 set ivr_fsm(any_state,ev_disconnected) "AbortCall, same_state" set ivr_fsm(CALLACTIVE,ev_disconnected) "AbortCall, CALLDISCONNECTED" set ivr_fsm(CALLDISCONNECTED,ev_disconnected) "AbortCall, same_state" set ivr_fsm(CALLDISCONNECTED,ev_media_done) "AbortCall, same_state" set ivr_fsm(CALLDISCONNECTED,ev_disconnect_done) "AbortCall, same_state"
      
      







8)接続スクリプト



Ciscoルーターへの接続は2段階で行われます。

最初に行うことは、 アプリケーションを定義することです

 application service voicemunu flash:voicemenu.tcl param allowed_pattern 5[5-7].. param fastto_reception 1 param reception_number 5501 param fastto_ckp 2 param ckp_number 5604 param fastto_fax 3 param fax_number 5555 param waiting_time 20 param max_try 3 param file_noanswer flash:en_noanswer.au param file_after flash:en_after.au param file_noexist flash:en_noexist.au param file_busy flash:en_busy.au param file_welcome flash:en_welcome.au param file_onhold flash:music-on-hold.au param file_noworking flash:en_takenumber2.au param file_takenumber flash:en_takenumber2.au
      
      





次にサービスダイヤルピアに接続します

 dial-peer voice 200 pots description -= ISP Beeline - INcoming call to number 3300100 =- service voicemunu incoming called-number 3300100
      
      





したがって、コールが3300100に到着すると、 voicemunu音声メニューが呼び出さます。



9)スクリプトのフルバージョン



上記では、スクリプトの基本的な機能のみを検討し、次に全文を検討しました。これはほとんど最も簡単なオプションであることに留意してください。

 ####################################################### # Cisco IVR TCL script by Konovalov DA v.2 ####################################################### # #    # debug voip application script #    ( ,    ) # debug voip ivr # #       : # param allowed_pattern 5[5-7].. # param fastto_reception 1 # param reception_number 5501 # param fastto_ckp 2 # param ckp_number 5604 # param fastto_fax 3 # param fax_number 5555 # param waiting_time 20 # param max_try 3 # param file_welcome flash:en_welcome.au # param file_takenumber flash:en_takenumber.au # param file_after flash:en_after.au # param file_busy flash:en_busy.au # param file_noexist flash:en_noexist.au # param file_noanswer flash:en_noanswer.au # param file_onhold flash:music-on-hold.au # param file_noworking flash:music-on-hold.au #   proc init { } { puts "\n proc Init start" global param } #   proc init_perCallVars { } { global pattern global numbers global playng_files #####  #       ,    .... - 4   if {[infotag get cfg_avpair_exists allowed_pattern]} { set pattern(1) [string trim [infotag get cfg_avpair allowed_pattern]] puts "\n\n IVR - Allowed pattern set as: $pattern(1) \n\n" } else { set pattern(1) .... puts "\n\n IVR - Allowed pattern set as DEFAULT: $pattern(1) \n\n" } ##### #.        ,     0000 if {[infotag get cfg_avpair_exists reception_number]} { set numbers(reception) [string trim [infotag get cfg_avpair reception_number]] puts "\n\n IVR - reception number set as: $numbers(reception) \n\n" } else { set numbers(reception) 0000 puts "\n\n IVR - reception number set as DEFAULT: $numbers(reception) \n\n" } # if {[infotag get cfg_avpair_exists ckp_number]} { set numbers(ckp) [string trim [infotag get cfg_avpair ckp_number]] puts "\n\n IVR - ckp number set as: $numbers(ckp) \n\n" } else { set numbers(ckp) 0000 puts "\n\n IVR - ckp number set as DEFAULT: $numbers(ckp) \n\n" } # if {[infotag get cfg_avpair_exists fax_number]} { set numbers(fax) [string trim [infotag get cfg_avpair fax_number]] puts "\n\n IVR - fax number set as: $numbers(fax) \n\n" } else { set numbers(fax) 0000 puts "\n\n IVR - fax number set as DEFAULT: $numbers(fax) \n\n" } #    if {[infotag get cfg_avpair_exists fastto_reception]} { set numbers(fast_reception) [string trim [infotag get cfg_avpair fastto_reception]] puts "\n\n IVR - fast to reception set as: $numbers(fast_reception) \n\n" } else { set numbers(fast_reception) 1 puts "\n\n IVR - fast to reception set as DEFAULT: $numbers(fast_reception) \n\n" } #    if {[infotag get cfg_avpair_exists fastto_ckp]} { set numbers(fast_ckp) [string trim [infotag get cfg_avpair fastto_ckp]] puts "\n\n IVR - fast to ckp set as: $numbers(fast_ckp) \n\n" } else { set numbers(fast_ckp) 2 puts "\n\n IVR - fast to ckp set as DEFAULT: $numbers(fast_ckp) \n\n" } #    if {[infotag get cfg_avpair_exists fastto_fax]} { set numbers(fast_fax) [string trim [infotag get cfg_avpair fastto_fax]] puts "\n\n IVR - fast to fax set as: $numbers(fast_fax) \n\n" } else { set numbers(fast_fax) 3 puts "\n\n IVR - fast to fax set as DEFAULT: $numbers(fast_fax) \n\n" } #    (       ) if {[infotag get cfg_avpair_exists waiting_time]} { set numbers(waiting_time) [string trim [infotag get cfg_avpair waiting_time]] puts "\n\n IVR - wait number set as: $numbers(waiting_time) \n\n" } else { set numbers(waiting_time) 10 puts "\n\n IVR - wait number set as DEFAULT: $numbers(waiting_time) \n\n" } #    ,        if {[infotag get cfg_avpair_exists max_try]} { set numbers(max_try) [string trim [infotag get cfg_avpair max_try]] puts "\n\n IVR - max try set as: $numbers(max_try) \n\n" set numbers(cur_try) 0 } else { set numbers(max_try) 5 puts "\n\n IVR - max try set as DEFAULT: $numbers(max_try) \n\n" set numbers(cur_try) 0 } ##### ,    #  if {[infotag get cfg_avpair_exists file_welcome]} { set playng_files(welcome) [string trim [infotag get cfg_avpair file_welcome]] puts "\n\n IVR - file_welcome set as: $playng_files(welcome) \n\n" } else { #   ,       1 set playng_files(welcome) %s1 puts "\n\n IVR - file_welcome set as DEFAULT: $playng_files(welcome) \n\n" } #     if {[infotag get cfg_avpair_exists file_takenumber]} { set playng_files(takenumber) [string trim [infotag get cfg_avpair file_takenumber]] puts "\n\n IVR - file_takenumber set as: $playng_files(takenumber) \n\n" } else { #   ,       1 set playng_files(takenumber) %s1 puts "\n\n IVR - file_takenumber set as DEFAULT: $playng_files(takenumber) \n\n" } # "  " if {[infotag get cfg_avpair_exists file_after]} { set playng_files(callafter) [string trim [infotag get cfg_avpair file_after]] puts "\n\n IVR - file_after set as: $playng_files(callafter) \n\n" } else { #   ,       1 set playng_files(callafter) %s1 puts "\n\n IVR - file_after set as DEFAULT: $playng_files(callafter) \n\n" } # " " if {[infotag get cfg_avpair_exists file_busy]} { set playng_files(busy) [string trim [infotag get cfg_avpair file_busy]] puts "\n\n IVR - file_busy set as: $playng_files(busy) \n\n" } else { #   ,       1 set playng_files(busy) %s1 puts "\n\n IVR - file_busy set as DEFAULT: $playng_files(busy) \n\n" } # "  " if {[infotag get cfg_avpair_exists file_noexist]} { set playng_files(noexist) [string trim [infotag get cfg_avpair file_noexist]] puts "\n\n IVR - file_noexist set as: $playng_files(noexist) \n\n" } else { #   ,       1 set playng_files(noexist) %s1 puts "\n\n IVR - file_noexist set as DEFAULT: $playng_files(noexist) \n\n" } # "  /" if {[infotag get cfg_avpair_exists file_toreception]} { set playng_files(toreception) [string trim [infotag get cfg_avpair file_toreception]] puts "\n\n IVR - file_toreception set as: $playng_files(toreception) \n\n" } else { #   ,       1 set playng_files(toreception) %s1 puts "\n\n IVR - file_toreception set as DEFAULT: $playng_files(toreception) \n\n" } # "  ,  " if {[infotag get cfg_avpair_exists file_noanswer]} { set playng_files(noanswer) [string trim [infotag get cfg_avpair file_noanswer]] puts "\n\n IVR - file_noanswer set as: $playng_files(noanswer) \n\n" } else { #   ,       1 set playng_files(noanswer) %s1 puts "\n\n IVR - file_noanswer set as DEFAULT: $playng_files(noanswer) \n\n" } # ,      if {[infotag get cfg_avpair_exists file_onhold]} { set playng_files(onhold) [string trim [infotag get cfg_avpair file_onhold]] puts "\n\n IVR - file_onhold set as: $playng_files(onhold) \n\n" } else { #   ,       1 set playng_files(onhold) %s1 puts "\n\n IVR - file_onhold set as DEFAULT: $playng_files(onhold) \n\n" } # ,       if {[infotag get cfg_avpair_exists file_noworking]} { set playng_files(noworking) [string trim [infotag get cfg_avpair file_noworking]] puts "\n\n IVR - file_noworking set as: $playng_files(noworking) \n\n" } else { #   ,       1 set playng_files(noworking) %s1 puts "\n\n IVR - file_noworking set as DEFAULT: $playng_files(noworking) \n\n" } } proc GetDate { } { global workingtime # set houris [clock format [clock seconds] -format %H] #  set dayis [clock format [clock seconds] -format %A] #   if {$houris > 17 || $houris < 8 || $dayis=="Sunday" || $dayis=="Saturday"} { set workingtime 0 } else { set workingtime 1 } } #   proc Play_Welcome { } { puts "\n\n IVR - proc Play_Welcome start \n\n" global playng_files global param global pattern global numbers global workingtime # ,     init_perCallVars #  GetDate #      ,   if {$workingtime} { set after_welcome $playng_files(takenumber) } else { set after_welcome $playng_files(noworking) } #     set param(interruptPrompt) true set param(abortKey) * set param(terminationKey) # #   leg setupack leg_incoming leg proceeding leg_incoming leg connect leg_incoming #        leg collectdigits leg_incoming param pattern #    ,     #  param(interDigitTimeout),    #  ev_collectdigits_done media play leg_incoming %s500 $playng_files(welcome) $after_welcome $playng_files(onhold) # ,      ev_named_timer timer start named_timer $numbers(waiting_time) t1 } #    proc Play_TakeNumber { } { puts "\n\n IVR - proc Play_TakeNumber start \n\n" global playng_files global numbers global param global pattern #       if {$numbers(cur_try) <= $numbers(max_try)} { puts "\n\n IVR - proc Play_TakeNumber current try is: $numbers(cur_try) \n\n" incr numbers(cur_try) #        leg collectdigits leg_incoming param pattern #   media play leg_incoming $playng_files(takenumber) # ,      ev_named_timer timer start named_timer $numbers(waiting_time) t1 #    $numbers(max_try) -  } else { fsm setstate CALLDISCONNECTED media play leg_incoming $playng_files(callafter) } } #     proc GoToReception { } { puts "\n\n IVR - proc GoToReception start \n\n" global numbers #   media stop leg_incoming #  fsm setstate CALLCONNECTED set digit $numbers(reception) # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit } #        proc CheckDestanation { } { puts "\n\n IVR - proc CheckDestanation start \n\n" global playng_files global numbers global digit #   media stop leg_incoming #   set status [infotag get evt_status] set digit [infotag get evt_dcdigits] #     #    ,    $numbers(fast_reception), # digit      $digit   CheckCallersAndConnect, #     CALLCONNECTED, #  ,    ev_setup_done (   ) #    CallIsConnect if {$digit == $numbers(fast_reception)} { puts "\n\n IVR - proc CheckDestanation digit = $digit\nGoing to next reception \n\n" fsm setstate CALLCONNECTED set digit $numbers(reception) # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #    ,    $numbers(fast_ckp),    # CheckCallersAndConnect } elseif {$digit == $numbers(fast_ckp)} { puts "\n\n IVR - proc CheckDestanation digit = $digit\nGoing to next CKP \n\n" fsm setstate CALLCONNECTED set digit $numbers(ckp) # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #    ,    $numbers(fast_fax),    # CheckCallersAndConnect } elseif {$digit == $numbers(fast_fax)} { puts "\n\n IVR - proc CheckDestanation digit = $digit\nGoing to next fax \n\n" fsm setstate CALLCONNECTED set digit $numbers(fax) # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #  = cd_004 (   ) -     # CheckCallersAndConnect } elseif {$status == "cd_004"} { puts "\n\n IVR - proc CheckDestanation status = $status digit = $digit \n\n" fsm setstate CALLCONNECTED # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #  = cd_005 (  dial plan) -     # CheckCallersAndConnect } elseif {$status == "cd_005"} { puts "\n\n IVR - proc CheckDestanation status = $status digit = $digit \n\n" fsm setstate CALLCONNECTED # $digit   CheckCallersAndConnect CheckCallersAndConnect $digit #  = cd_006 (   ) -    $playng_files(noexist) #    TRYAGAIN,       ev_media_done #(   )   Play_TakeNumber } elseif {$status == "cd_006"} { puts "\n\n IVR - proc CheckDestanation status = $status digit = $digit \n\n" fsm setstate TRYAGAIN media play leg_incoming $playng_files(noexist) #       TORECEPTION,     #  ev_media_done (   )   GoToReception } else { # "    " fsm setstate TORECEPTION media play leg_incoming $playng_files(toreception) puts "\n\n IVR - proc CheckDestanation status = $status \n\n" } } # ,  ,     proc CheckCallersAndConnect {digit} { puts "\n\n IVR - proc CheckCallersAndConnect start \n\n" set callernumber [infotag get leg_ani] switch $callernumber { "9120000000" {set callInfo(displayInfo) "Director(mobile)"} "9130000000" {set callInfo(displayInfo) "Buhgalter(mobile)"} default {} } leg setup $digit callInfo leg_incoming } #          proc CallIsConnect { } { puts "\n\n IVR - proc CallIsConnect start \n\n" global playng_files #   status set status [infotag get evt_status] #   ls_000 (    ),    CALLACTIVE if {$status == "ls_000"} { fsm setstate CALLACTIVE #   ls_002 (    ),     } elseif {$status == "ls_002"} { fsm setstate TRYAGAIN media play leg_incoming $playng_files(noanswer) #  -  ,     } elseif {$status == "ls_004" || $status == "ls_005" || $status == "ls_006"} { fsm setstate TRYAGAIN media play leg_incoming $playng_files(noexist) #   ls_007 ( ),     } elseif {$status == "ls_007"} { fsm setstate TRYAGAIN media play leg_incoming $playng_files(busy) } } #   proc AbortCall { } { puts "\n\n IVR - proc AbortCall start \n\n" call close } #  init #init_perCallVars #         #        #       ev_disconnected,  AbortCall set ivr_fsm(any_state,ev_disconnected) "AbortCall, same_state" #   CALLCOMES   ev_setup_indication ( ) # Play_Welcome,     same_state (..  ) set ivr_fsm(CALLCOMES,ev_setup_indication) "Play_Welcome, same_state" #   CALLCOMES   ev_collectdigits_done (  ) # CheckDestanation,     set ivr_fsm(CALLCOMES,ev_collectdigits_done) "CheckDestanation, same_state" #   CALLCOMES   ev_named_timer (    ) # GoToReception,     set ivr_fsm(CALLCOMES,ev_named_timer) "GoToReception, same_state" #   TORECEPTION   ev_media_done (  ) # GoToReception,     set ivr_fsm(TORECEPTION,ev_media_done) "GoToReception, same_state" #         set ivr_fsm(TRYAGAIN,ev_media_done) "Play_TakeNumber, TRYING" set ivr_fsm(TRYING,ev_collectdigits_done) "CheckDestanation, same_state" set ivr_fsm(TRYING,ev_named_timer) "GoToReception, same_state" #   CALLCONNECTED   ev_setup_done #(/    )  CallIsConnect,     set ivr_fsm(CALLCONNECTED,ev_setup_done) "CallIsConnect, same_state" #     set ivr_fsm(CALLACTIVE,ev_disconnected) "AbortCall, CALLDISCONNECTED" set ivr_fsm(CALLDISCONNECTED,ev_disconnected) "AbortCall, same_state" set ivr_fsm(CALLDISCONNECTED,ev_media_done) "AbortCall, same_state" set ivr_fsm(CALLDISCONNECTED,ev_disconnect_done) "AbortCall, same_state" fsm define ivr_fsm CALLCOMES
      
      






All Articles