<?xml version="1.0" encoding="UTF-8"?>

<ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0">
  <var name="inboundID"/>
  <var name="outboundID"/>
  <var name="welcomeDlg"/>
  <var name="DestURI"/>
  <var name="CallingURI"/>
  <var name="Balance_dollars" />
  <var name="Balance_cents" />
  <var name="UserPin" />
  <var name="CallTimeout" />
  <var name="CallTimeout_Mins" />
  <var name="CallTimeout_Secs" />
  <var name="talkTime" expr="0"/>
  <var name="UnitTimeout" expr="'0'"/> 
  <var name="initState" expr="'state1'" />
  <var name="AuthenType" expr="'ANI'" />
  <var name="isAccounted" expr="0" />
  <var name="callattempts" expr="0" />
  <var name="bLegBReneg" expr="'true'" />

<eventprocessor statevariable="initState">
	
    <transition state="state1" event="connection.alerting" name="event$">
        <assign name="inboundID" expr="event$.connectionid" />
        <assign name="initState" expr="'state2'"/>
        <assign name="CallingURI" expr="event$.remote"/>
        <assign name="AccessNumber" expr="event$.local"/>
        <assign name="SIP_CallID" expr="event$.sipcallid"/>
        <accept connectionid="inboundID" keepalive="no" />
    </transition>


    <transition state="state2" event="connection.accept.failed" name="event$">
        <assign name="initState" expr="'state13'" />
        <if cond="CallingURI == ''">
            <exit/>
        <else/>
            <accountstop accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="AccessNumber" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" />
        </if>

    </transition>

    <transition state="state2" event="connection.connected" name="event$">
        <assign name="initState" expr="'state3'"/>
        <if cond="CallingURI == ''">
            <!-- start pin authentication -->
            <assign name="initState" expr="'state14'"/>
            <dialogstart src="'get_pin.mscml'" connectionid="inboundID" />
        <else/>
            <translatenum fromnumber="CallingURI" tonumber="AccessNumber" numbertobemodified="CallingURI"   modifiednumber="CallingURI" translatefor="authentication"/>

            <authenticate authtype="ANI" UserName="CallingURI" CallingStationId="CallingURI" ServiceID="Audio" AccessNumber="AccessNumber" CallID="SIP_CallID" />
        </if>
    </transition>

    <transition state="state3" event="authenticate.error" name="event$">
        <if cond="AuthenType == 'ANI'">
            <assign name="initState" expr="'state14'"/>
            <dialogstart src="'get_pin.mscml'" connectionid="inboundID" />
        <else/>
            <assign name="initState" expr="'state15'"/>
            <dialogstart src="'authentication_failed.mscml'" connectionid="inboundID" />
        </if>
    </transition>

    <transition state="state14" event="dialog.exit" name="event$">
        <assign name="initState" expr="'state3'"/>
        <assign name="AuthenType" expr="'PIN'"/>

        <assign name="UserPin" expr="event$.digitscollected"/>
        <if cond="UserPin == ''">
            <assign name="initState" expr="'state15'"/>
            <dialogstart src="'authentication_failed.mscml'" connectionid="inboundID" />
        <else/>
            <authenticate authtype="PIN" UserName="UserPin" CallingStationId="CallingURI" ServiceID="Audio" AccessNumber="AccessNumber" CallID="SIP_CallID" />
        </if>

    </transition>

    <transition state="state3" event="authenticate.timeout" name="event$">
        <assign name="initState" expr="'state16'"/> 
        <disconnect connectionid="inboundID"/>
    </transition>

    <transition state="state3" event="authenticate.success" name="event$">
        <assign name="initState" expr="'state4'"/>
        <assign name="Balance_dollars" expr="event$.creditamount_dollars" />
        <assign name="Balance_cents" expr="event$.creditamount_cents" />
        <dialogstart scenario-type="mny" scenario-subtype="dollars" connectionid="inboundID" parameters="Balance_dollars Balance_cents" audio-prepend="'you_have'" />
    </transition>

    <transition state="state4" event="dialog.exit" name="event$">
        <assign name="initState" expr="'state5'"/>
        <assign name="callattempts" expr="callattempts+1" />
        <dialogstart src="'get_dest.mscml'" connectionid="inboundID" />
    </transition>

    <transition state="state4 state5" event="error.dialog" name="event$">
        <assign name="initState" expr="'state16'"/>
        <disconnect connectionid="inboundID"/>
    </transition>

    <transition state="state5" event="dialog.exit" name="event$">
        <assign name="initState" expr="'state6'"/>
        <assign name="DestURI" expr="event$.digitscollected"/>
        <if cond="DestURI == ''">
            <if cond="callattempts == 3">
                <assign name="initState" expr="'state16'"/>
                <disconnect connectionid="inboundID"/>
            <else/>
                <assign name="initState" expr="'state5'"/>
                <assign name="callattempts" expr="callattempts+1" />
                <dialogstart src="'get_dest.mscml'" connectionid="inboundID" />
            </if>
        <else/>
            <translatenum fromnumber="CallingURI" tonumber="DestURI" numbertobemodified="DestURI" modifiednumber="DestURI" translatefor="authorization"/>

            <if cond="AuthenType == 'ANI'">
                <authorize SessionID="OutSessionID" authtype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" UnitReservation="no"/>
            <else/>
                <authorize SessionID="OutSessionID" authtype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="DestURI" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" UnitReservation="no"/>
            </if>
        </if>
    </transition>

    <transition state="state6" event="authorize.success" name="event$">	
        <assign name="initState" expr="'state7'"/>
        <assign name="CallTimeout" expr="event$.auth_totaltimeout"/>
        <assign name="UnitTimeout" expr="event$.auth_UnitTime"/>
        <assign name="CallTimeout_Mins" expr="event$.auth_timeout_minutes"/>
        <assign name="CallTimeout_Secs" expr="event$.auth_timeout_seconds"/>

        <dialogstart scenario-type="tme" connectionid="inboundID" parameters="CallTimeout_Mins CallTimeout_Secs" audio-prepend="'you_have'" />
    </transition>

    <transition state="state6" event="authorize.timeout" name="event$">
        <assign name="initState" expr="'state5'"/>
        <dialogstart src="'get_dest.mscml'" connectionid="inboundID" />
    </transition>

    <transition state="state6" event="authorize.error" name="event$">
        <assign name="initState" expr="'state5'"/>
        <dialogstart src="'get_dest.mscml'" connectionid="inboundID" />
    </transition>

    <transition state="state7" event="dialog.exit" name="event$">
        <assign name="initState" expr="'state8'"/>
        <createcall dest="DestURI" callerid="CallingURI" connectionid="outboundID" AuthSessionID="OutSessionID" callidsuffix="OutSessionID" timeout="'30s'" connectedtimelimit="CallTimeout" keepalive="no"/>

    </transition>

    <transition state="state7" event="error.dialog" name="event$">
        <disconnect connectionid="inboundID"/>
    </transition>

    <transition state="state8" event="connection.failed" name="event$">

        <if cond="isAccounted == 0">
            <assign name="isAccounted" expr="isAccounted+1" />
            <assign name="talkTime" expr="0"/>
            <if cond="AuthenType == 'ANI'">
                <accountstop SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="event$.reason"/>
            <else/>
                <accountstop SessionID="OutSessionID" accttype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" Service-ID="Audio" CallID="SIP_CallID" Reason="event$.reason"/>
            </if>
        </if>
        <dialogstart src="'outgoing_call_failure.mscml'" connectionid="inboundID" />
    </transition>

    <transition state="state8" event="dialog.exit" name="event$">
        <assign name="initState" expr="'state5'"/>
        <dialogstart src="'get_dest.mscml'" connectionid="inboundID" />
    </transition>

    <transition state="state8" event="error.dialog" name="event$">
        <assign name="initState" expr="'state16'"/>
        <disconnect connectionid="inboundID"/>
    </transition>

    <transition state="state8" event="connection.progressing" name="event$">

    </transition>

    <transition state="state8" event="connection.connected" name="event$">
        <assign name="initState" expr="'state9'"/>
        <join id1="inboundID" id2="outboundID" duplex="'full'"/>
    </transition>

    <transition state="state9" event="connection.media.renegotiate"  name="event$">
        <assign name="initState" expr="'leg1RenegotiationInitiated'"/>
        <assign name="RenegotiationID" expr="event$.connectionid" />
        <renegotiatemedia connectionid="RenegotiationID"/>
    </transition>

    <transition state="leg1RenegotiationInitiated" event="connection.renegotiate.success"  name="event$">
        <assign name="initState" expr="'state9'"/>
        <join id1="inboundID" id2="outboundID" duplex="'full'"/>
    </transition>

    <transition state="leg1RenegotiationInitiated" event="connection.renegotiate.failed"  name="event$">

        <assign name="isAccounted" expr="0" />
        <if cond="event$.connectionid == outboundID">
		<disconnect connectionid="outboundID"/>
        <else/>
		<assign name="isAccounted" expr="0" />
		<assign name="initState" expr="'state8'" />
		<disconnect connectionid="inboundID"/>

        </if>
    </transition>

    <transition state="leg1RenegotiationInitiated" event="connection.disconnected"  name="event$">
	<assign name="initState" expr="'state12'" />
	<assign name="isAccounted" expr="0" />
	<if cond="event$.connectionid == outboundID">
		<assign name="talkTime" expr="0"/>
		
		<assign name="isAccounted" expr="isAccounted+1" />
		<if cond="AuthenType == 'ANI'">
			<accountstop SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="Sucess"/>
			<else/>
			<accountstop SessionID="OutSessionID" accttype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="Sucess"/>
             </if> 
	<else/>
		
		<assign name="talkTime" expr="0" />
		<disconnect connectionid="outboundID"/>
	</if>
    </transition>
    
    <transition state="reconnecting_lega" event="connection.disconnected" name="event$">
	     <assign name="initState" expr="'state12'" />
	    <assign name="disconnectedID" expr="event$.connectionid" />
	    <assign name="talkTime" expr="0"/>
	    
	     <assign name="isAccounted" expr="isAccounted+1" />
	    <if cond="AuthenType == 'ANI'">
		    <accountstop SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="Sucess"/>
            <else/>
		    <accountstop SessionID="OutSessionID" accttype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="Sucess"/>
             </if> 
    </transition>
    
    <transition state="leg1RenegotiationInitiated" event="connection.media.renegotiate"  name="event$">
        <assign name="initState" expr="'leg2RenegotiationInitiated'"/>
        <assign name="RenegotiationID" expr="event$.connectionid" />
        <assign name="LegBRenegID" expr="event$.connectionid" />
        <assign name="bLegBReneg" expr="'true'" />
        <renegotiatemedia connectionid="RenegotiationID"/>
    </transition>

    <transition state="leg2RenegotiationInitiated" event="connection.renegotiate.success"  name="event$">

        <if cond="bLegBReneg == 'true'">
            <if cond="LegBRenegID == event$.connectionid" >
                <assign name="LegBRenegID" expr="" />
                <assign name="bLegBReneg" expr="'false'" />
                <assign name="initState" expr="'state9'"/>
                <join id1="inboundID" id2="outboundID" duplex="'full'"/>
            </if>
        </if>

    </transition>

    <transition state="leg2RenegotiationInitiated" event="connection.renegotiate.failed"  name="event$">

        <assign name="isAccounted" expr="0" />
        <assign name="initState" expr="'state8'" />
        <disconnect connectionid="inboundID"/>

    </transition>

    <transition state="state9" event="conference.joined"  name="event$">
        <assign name="initState" expr="'state10'"/>
        <assign name="isAccounted" expr="0" />
        <if cond="AuthenType == 'ANI'">
            <accountstart SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" />
        <else/>
            <accountstart SessionID="OutSessionID" accttype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="DestURI" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" />
        </if>
    </transition>

    <transition state="state10" event="account.start.error" name="event$">

    </transition>

    <transition state="state9" event="error.conference.join"  name="event$">
        <!-- This event will be received in case the MS reports an error with the join request-->
        <!-- or the join request times out (in case no mscml team add response is received from the MS)-->
        <assign name="initState" expr="'state12'" />
        <disconnect connectionid="outboundID"/>
    </transition>

    <transition state="state10" event="connection.disconnected" name="event$">
        <assign name="disconnectedID" expr="event$.connectionid" />
        <assign name="connectedTime" expr="event$.connectedtime" />
        <assign name="initState" expr="'state11'" />
    </transition>

    <transition state="state11" event="conference.unjoined" name="event$">
        <assign name="initState" expr="'state12'" />
        <assign name="talkTime" expr="event$.jointime" />
        <if cond="disconnectedID == outboundID">
            <if cond="isAccounted == 0">
                <assign name="isAccounted" expr="isAccounted+1" />
                <if cond="AuthenType == 'ANI'">
                    <accountstop SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="Sucess"/>
                <else/>
                    <accountstop SessionID="OutSessionID" accttype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="Sucess"/>
                </if>
            </if>

        <else/>
            <disconnect connectionid="outboundID"/>
        </if>

    </transition>
    
    <transition state="state8" event="connection.disconnected" name="event$">
        <assign name="initState" expr="'state12'" />
        <assign name="talkTime" expr="0" />
        <disconnect connectionid="outboundID"/>
    </transition>

    <transition state="state6 state7 state12" event="connection.disconnected" name="event$">
        <assign name="initState" expr="'state13'" />

            <if cond="isAccounted == 0">
                <assign name="isAccounted" expr="isAccounted+1" />
                <if cond="AuthenType == 'ANI'">
                    <accountstop SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="'Success'"/>
                <else/>
                    <accountstop SessionID="OutSessionID" accttype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="'Success'"/>
                </if>
            </if>
    </transition>


    <transition state="state12" event="account.stop.success" name="event$">
        <assign name="initState" expr="'state5'"/>
        <assign name="talkTime" expr="0"/>
	
        <dialogstart src="'get_dest.mscml'" connectionid="inboundID" />
    </transition>

    <transition state="state12" event="account.stop.error" name="event$">
        <assign name="initState" expr="'state5'"/>
        <assign name="talkTime" expr="0"/>
        <dialogstart src="'get_dest.mscml'" connectionid="inboundID" />
    </transition>
    <transition state="state13" event="account.stop.success" name="event$">
        <exit/>
    </transition>

    <transition state="state13" event="account.stop.error" name="event$">
        <exit/>
    </transition>


    <transition state="state15" event="dialog.exit" name="event$">

        <assign name="initState" expr="'state16'"/> 
        <disconnect connectionid="inboundID"/>
    </transition>

    <transition state="state15 state16" event="connection.disconnected" name="event$">

        <assign name="initState" expr="'state17'" /> 
        <exit/>
    </transition>

   <transition state="state17" event="ccxml.exit" name="event$">

    </transition>

    <transition state="state3 state4 state5 state14" event="connection.disconnected" name="event$">
        <assign name="initState" expr="'state13'" />
        <if cond="AuthenType == 'ANI'">
            <if cond="CallingURI == ''">
                <exit/>
            <else/>
                <if cond="isAccounted == 0">
                    <assign name="isAccounted" expr="isAccounted+1" />
                    <accountstop accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="AccessNumber" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" />
		<else/>
		   <exit/>
                </if>
            </if>
        <else/>
            <if cond="isAccounted == 0">
                <assign name="isAccounted" expr="isAccounted+1" />
                <accountstop accttype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="AccessNumber" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID"/>
	    <else/>
		<exit/>
            </if>
        </if>
    </transition>

    <transition state="state9" event="connection.disconnected" name="event$">

        <assign name="initState" expr="'state12'" />
        <assign name="talkTime" expr="0" />
        <assign name="disconnectedID" expr="event$.connectionid" />
        <if cond="disconnectedID == outboundID">
            <if cond="isAccounted == 0">
                <assign name="isAccounted" expr="isAccounted+1" />
                <if cond="AuthenType == 'ANI'">
                    <accountstop SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="'Normal callee hangup'"/>
                <else/>
                    <accountstop SessionID="OutSessionID" accttype="PIN" UserName="UserPin" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="AccessNumber" ServiceID="Audio" CallID="SIP_CallID" Reason="'Normal callee hangup'"/>
                </if>
            </if>

        <else/>
            <disconnect connectionid="outboundID"/>
        </if>
    </transition>

    <transition state="state14" event="error.dialog" name="event$">
        <assign name="initState" expr="'state12'" />
        <disconnect connectionid="inboundID"/>
    </transition>

    <transition state="state19" event="dialog.exit" name="event$">
        <assign name="initState" expr="'state17'" /> 
        <exit/>
    </transition> 

    <transition state="state19" event="error.dialog" name="event$">
        <assign name="initState" expr="'state17'" /> 
        <exit/>
    </transition> 


  </eventprocessor>
</ccxml> 

