Files
2021-01-12 23:30:48 +08:00

705 lines
36 KiB
XML

<?xml version='1.0' encoding='UTF-8'?>
<Package>
<!-- 计算净额商户交易金额及手续费 -->
<Function name="CAL_STLMOD_0_MERC_AMT_FEE_FUNC">
<Input>GWA|ORD_TYP|PAY_TYP|STL_DT|STL_MOD|STL_PERD|STL_DAY|STL_DAY_BIT|STL_TRF_DAYS|NEXT_STL_DT|MERC_ID|MERC_TYP|MERC_NAM|</Input>
<Output>MSG_CD|STL_STT_DT|STL_END_DT|MERC_SUCC_CNT|MERC_AMT|MERC_FEE_AMT|MERC_STL_AMT|MERC_FEE_CAL_MTH|MERC_FEE_MOD|</Output>
<!--商户SQL定义-->
<Quote name="MERC_DYN_SQLSENTENCE"/>
<Process>
<Set>TXN_DT=$STL_DT</Set>
<Set>STL_STT_DT=$STL_DT</Set>
<!-- 计算协议付款日 = 当前会计日期 + 结算划款天数 -->
<Set>STL_END_DT=CALCDATE($STL_DT,+,d,$STL_TRF_DAYS)</Set>
<!-- 查询商户服务费费率表 -->
<Exec func="PUB:ReadRecord">
<Arg name="SqlCmd" value="QRY_URMTMFEE"/>
</Exec>
<If condition="~RetCod=2">
<Set>MERC_SUCC_CNT=0</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=0</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=0</Set> <!-- 商户净额 -->
<!--Set>MERC_FEE_CAL_MTH=1</Set--> <!-- 计费方法1:按固定金额收取 2:按金额固定百分比收取 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL11111"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,在商户服务费费率表没有记录)"/>
</Exec>
<Return/>
</If>
<ElseIf condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型,$PAY_TYP,查询商户服务费费率表失败)"/>
</Exec>
<Return/>
</ElseIf>
<!--收费方式 0:不收取 1:实时单笔收取 2:单笔计算、按周期收取 3:按周期汇总计算并收取-->
<!--0:不收取-->
<!--1:实时单笔收取-->
<If condition="OR(INTCMP($MERC_FEE_MOD,3,0),INTCMP($MERC_FEE_MOD,3,1))">
<!--根据对应订单类型和商户号查询代收代付商户清算明细表(已清分)-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_MERC_SUM_CLR_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod=2">
<Set>MERC_SUCC_CNT=0</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=0</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=0</Set> <!-- 商户净额 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL22222"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,已清分的商户清算明细表无清算数据)"/>
</Exec>
<Return/>
</If>
<ElseIf condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,已清分的商户清算明细表查询失败)"/>
</Exec>
<Return/>
</ElseIf>
<Else>
<Set>MERC_SUCC_CNT=$TO_MERC_SUCC_CNT</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=$TO_MERC_AMT</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=$TO_MERC_FEE_AMT</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=$TO_MERC_STL_AMT</Set> <!-- 商户净额 -->
<!-- @msg 正常结束 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL00000"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,该商户收费方式为不收取或实时单笔收取,计算商户手续费成功)"/>
</Exec>
</Else>
</If>
<!--2:单笔计算、按周期收取-->
<If condition="INTCMP($MERC_FEE_MOD,3,2)">
<!--根据对应订单类型查询代收代付商户清算明细表(未清分)的流水号-->
<Exec func="PUB:OpenCursor">
<Arg name="SqlCmd" value="QRY_MERC_NOTCLR_JRN_CAPSTLDTL"/>
<Arg name="CursorName" value="QRY_MERC_NOTCLR_JRN_CAPSTLDTL"/>
</Exec>
<While>
<Exec func="PUB:FetchCursor" error="IGNORE">
<Arg name="CursorName" value="QRY_MERC_NOTCLR_JRN_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod=2">
<Break/>
</If>
<ElseIf condition="~RetCod&lt;0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,查询商户清算明细表未清分的流水号交易失败)"/>
</Exec>
<Exec func="PUB:CloseCursor">
<Arg name="CursorName" value="QRY_MERC_NOTCLR_JRN_CAPSTLDTL"/>
</Exec>
<Return/>
</ElseIf>
<!--计算商户手续费-->
<Set>MERC_FEE_AMT=0</Set> <!-- 手续费 -->
<Set>INP_DAT.MERC_ID=$MERC_ID</Set> <!-- 商户号-->
<Set>INP_DAT.CAP_TYP=1</Set> <!-- 资金种类 1:现金 -->
<Set>INP_DAT.TX_MOD=0</Set> <!-- 交易方式 0-远程普通 -->
<Set>INP_DAT.FEE_TYP=$ORD_TYP</Set> <!-- 费用类型 11 代收 12 代付-->
<Set>INP_DAT.ORD_AMT=$TXN_AMT</Set>
<Set>INP_DAT.TXN_AMT=$TXN_AMT</Set>
<Set>INP_DAT.TOT_CALL_FLG=1</Set>
<Set>INP_DAT.RCV_AMT1=$TXN_AMT</Set>
<Set>INP_DAT.STL_MOD=$STL_MOD</Set>
<!--计算手续费-->
<Exec func="URM:ComputeMerchFee">
<Arg name="INP_DAT" value="INP_DAT" />
<Arg name="OUT_DAT" value="OUT_DAT" />
</Exec>
<If condition="IS_SUCC(@O.MSG_CD)=0">
<Set>MSG_CD=@O.MSG_CD</Set>
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,单笔计算、按周期收取,计算手续费失败)"/>
</Exec>
<Exec func="PUB:CloseCursor">
<Arg name="CursorName" value="QRY_MERC_NOTCLR_JRN_CAPSTLDTL"/>
</Exec>
<Return/>
</If>
<!-- 手续费 -->
<Set>MERC_FEE_AMT=$OUT_DAT.ORD_FEE</Set>
<!-- 收费方式 0:不收取 1:实时单笔收取 2:单笔计算、按周期收取 3:按周期汇总计算并收取 -->
<Set>MERC_FEE_MOD=$OUT_DAT.MERC_FEE_MOD</Set>
<!-- 费用计算依据 1:按固定金额收取 2:按金额固定百分比收取 -->
<Set>MERC_FEE_CAL_MTH=$OUT_DAT.FEE_CAL_MTH</Set>
<!--根据代收代付分类计算交易净额-->
<!--代收:代商户收款,需要清算给商户的金额,交易净额=交易额-手续费-->
<!--代付:代商户付款,交易净额=交易额+手续费-->
<!-- 11 代收-->
<If condition="INTCMP($PAY_TYP,3,11)">
<Set>MERC_STL_AMT=FSUB($TXN_AMT,$MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
</If>
<!-- 12 代付-->
<Else>
<Set>MERC_STL_AMT=FADD($TXN_AMT,$MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
</Else>
<!--商户清分标志更改-->
<!-- MERC_CLR_FLG 商户清分标志 0:未清分 1:已清分-->
<Set>MERC_CLR_FLG=1</Set>
<!-- MERC_FEE_CLR_FLG 商户手续费清分标志 0:未清分 1:已清分-->
<Set>MERC_FEE_CLR_FLG=1</Set>
<Set>MERC_FEE_CLR_DT=$GWA.AC_DT</Set>
<Set>MERC_CLR_DT=$GWA.AC_DT</Set>
<Set>MERC_FEE_DT=$GWA.AC_DT</Set>
<!-- 根据流水号更新清算明细表 -->
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_MERC_CLR_JRN_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,根据流水号更新清算明细表失败)"/>
</Exec>
<Return/>
</If>
<Delete>INP_DAT</Delete>
<Delete>OUT_DAT</Delete>
<Delete>TXN_AMT</Delete>
<Delete>JRN_NO</Delete>
</While>
<Exec func="PUB:CommitWork"/>
<!--根据对应订单类型和商户号查询代收代付商户清算明细表(已清分)-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_MERC_SUM_CLR_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod=2">
<Set>MERC_SUCC_CNT=0</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=0</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=0</Set> <!-- 商户净额 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL22222"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,已清分的商户清算明细表无数据)"/>
</Exec>
<Return/>
</If>
<ElseIf condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,已清分的商户清算明细表已清分查询失败)"/>
</Exec>
<Return/>
</ElseIf>
<Else>
<Set>MERC_SUCC_CNT=$TO_MERC_SUCC_CNT</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=$TO_MERC_AMT</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=$TO_MERC_FEE_AMT</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=$TO_MERC_STL_AMT</Set> <!-- 商户净额 -->
<!-- @msg 正常结束 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL00000"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,该商户收费方式为单笔计算、按周期收取,计算商户手续费成功)"/>
</Exec>
</Else>
</If>
<!---3: 按周期汇总收取 -->
<If condition="INTCMP($MERC_FEE_MOD,3,3)">
<!--根据对应订单类型查询代收代付商户清算明细表(未清分)-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_MERC_SUM_NOTCLR_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod=2">
<Set>MERC_SUCC_CNT=0</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=0</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=0</Set> <!-- 商户净额 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL22222"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,商户清算明细表未清分无数据)"/>
</Exec>
<Return/>
</If>
<ElseIf condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,代收代付商户清算明细表未清分查询失败)"/>
</Exec>
<Return/>
</ElseIf>
<Else>
<Set>MERC_SUCC_CNT=$TO_MERC_SUCC_CNT</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=$TO_MERC_AMT</Set> <!-- 商户总金额-->
</Else>
<!--交易成功笔数大于0-->
<If condition="INTCMP($MERC_SUCC_CNT,6,0)">
<!--计算商户手续费-->
<Set>TO_MERC_FEE_AMT=0</Set> <!-- 手续费 -->
<Set>INP_DAT.MERC_ID=$MERC_ID</Set>
<Set>INP_DAT.CAP_TYP=1</Set>
<Set>INP_DAT.TX_MOD=0</Set>
<Set>INP_DAT.FEE_TYP=$ORD_TYP</Set>
<Set>INP_DAT.TOT_ORD_AMT=$MERC_AMT</Set>
<Set>INP_DAT.TOT_ORD_CNT=$MERC_SUCC_CNT</Set>
<Set>INP_DAT.TOT_RCV_AMT1=$MERC_AMT</Set>
<Set>INP_DAT.TOT_RCV_CNT1=$MERC_SUCC_CNT</Set>
<Set>INP_DAT.TOT_CALL_FLG=2</Set>
<Set>INP_DAT.STL_MOD=$STL_MOD</Set>
<!--计算手续费-->
<Exec func="URM:ComputeMerchFee">
<Arg name="INP_DAT" value="INP_DAT" />
<Arg name="OUT_DAT" value="OUT_DAT" />
</Exec>
<If condition="IS_SUCC(@O.MSG_CD)=0">
<Set>MSG_CD=@O.MSG_CD</Set>
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,按周期汇总收取,计算手续费失败)"/>
</Exec>
<Return/>
</If>
<Set>TO_MERC_FEE_AMT=$OUT_DAT.ORD_FEE</Set> <!-- 手续费 -->
<Set>MERC_FEE_MOD=$OUT_DAT.MERC_FEE_MOD</Set> <!-- 收费方式 -->
<Set>MERC_FEE_CAL_MTH=$OUT_DAT.FEE_CAL_MTH</Set> <!-- 费用计算依据 -->
<!--根据代收代付分类计算交易净额-->
<!--代收:代商户收款,需要清算给商户的金额,交易净额=交易额-手续费-->
<!--代付:代商户付款,交易净额=交易额+手续费-->
<!-- 11 代收-->
<If condition="INTCMP($PAY_TYP,3,11)">
<Set>TO_MERC_STL_AMT=FSUB($MERC_AMT,$TO_MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
</If>
<!-- 12 代付-->
<Else>
<Set>TO_MERC_STL_AMT=FADD($MERC_AMT,$TO_MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
</Else>
<Set>MERC_FEE_AMT=$TO_MERC_FEE_AMT</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=$TO_MERC_STL_AMT</Set> <!-- 商户净额 -->
<!--商户清分标志更改-->
<!-- MERC_CLR_FLG 商户清分标志 0:未清分 1:已清分-->
<Set>MERC_CLR_FLG=1</Set>
<!-- MERC_FEE_CLR_FLG 商户手续费清分标志 0:未清分 1:已清分-->
<Set>MERC_FEE_CLR_FLG=1</Set>
<Set>MERC_FEE_CLR_DT=$GWA.AC_DT</Set>
<Set>MERC_CLR_DT=$GWA.AC_DT</Set>
<Set>MERC_FEE_DT=$GWA.AC_DT</Set>
<!-- 根据对应订单类型更新清算明细表 -->
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_MERC_NOTCLR_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,根据对应订单类型更新清算明细表失败)"/>
</Exec>
<Return/>
</If>
</If>
<Else>
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=0</Set> <!-- 商户净额 -->
</Else>
<!-- @msg 正常结束 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL00000"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,计算商户手续费成功)"/>
</Exec>
</If>
</Process>
</Function>
<!-- 判断商户手续费是否到了收费日期 -->
<Function name="IS_STLMOD_1_MERC_NEXT_FEE_DATE_FUNC">
<Input>GWA|ORD_TYP|PAY_TYP|STL_DT|STL_MOD|MERC_ID|MERC_TYP|MERC_NAM|</Input>
<Output>MSG_CD|FEE_PERD_UNIT|FEE_PERD_NUM|MERC_FEE_MOD|MERC_FEE_CAL_MTH|NEXT_FEE_DT|</Output>
<!--商户SQL定义-->
<Quote name="MERC_DYN_SQLSENTENCE"/>
<Process>
<!-- 查询商户服务费费率表 -->
<Exec func="PUB:ReadRecord">
<Arg name="SqlCmd" value="QRY_URMTMFEE"/>
</Exec>
<If condition="~RetCod=2"> <!--记录不存在-->
<!--手续费收费周期单位 0: 年 1: 月 2: 日-->
<Set>FEE_PERD_UNIT=NULL</Set>
<!--手续费收费同期数量-->
<Set>FEE_PERD_NUM=NULL</Set>
<!--代收收费方式 0:不收取 1:实时单笔收取 2:单笔计算、按周期收取 3:按周期汇总计算并收取-->
<Set>MERC_FEE_MOD=NULL</Set>
<!--1:按固定金额收取 2:按金额固定百分比收取-->
<Set>MERC_FEE_CAL_MTH=NULL</Set>
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL11111"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,在商户服务费费率表没有记录)"/>
</Exec>
<Return/>
</If>
<ElseIf condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="交易失败"/>
</Exec>
<Return/>
</ElseIf>
<!--判断该费率日是否到收费日期-->
<If condition="INTCMP($STL_DT,1,$NEXT_FEE_DT)">
<!--手续费收费周期单位 0: 年 1: 月 2: 日-->
<Set>FEE_PERD_UNIT=NULL</Set>
<!--手续费收费同期数量-->
<Set>FEE_PERD_NUM=NULL</Set>
<!--代收收费方式 0:不收取 1:实时单笔收取 2:单笔计算、按周期收取 3:按周期汇总计算并收取-->
<Set>MERC_FEE_MOD=NULL</Set>
<!--1:按固定金额收取 2:按金额固定百分比收取-->
<Set>MERC_FEE_CAL_MTH=NULL</Set>
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL22222"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,收支两条线商户没有到收费日期)"/>
</Exec>
<Return/>
</If>
<!--到了该收手续费-->
<Else>
<!--手续费收费周期单位 0: 年 1: 月 2: 日-->
<Set>FEE_PERD_UNIT=$FEE_PERD_UNIT</Set>
<!--手续费收费同期数量-->
<Set>FEE_PERD_NUM=$FEE_PERD_NUM</Set>
<!--代收收费方式 0:不收取 1:实时单笔收取 2:单笔计算、按周期收取 3:按周期汇总计算并收取-->
<Set>MERC_FEE_MOD=$MERC_FEE_MOD</Set>
<!--1:按固定金额收取 2:按金额固定百分比收取-->
<Set>MERC_FEE_CAL_MTH=$MERC_FEE_CAL_MTH</Set>
<!--手续费下一个结算日-->
<Set>NEXT_FEE_DT=$NEXT_FEE_DT</Set>
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL00000"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,收支两条线商户已经到收费日期)"/>
</Exec>
</Else>
</Process>
</Function>
<!-- 计算收支两条线的商户的手续费 -->
<Function name="CAL_STLMOD_1_MERC_FEE_FUNC">
<Input>GWA|ORD_TYP|PAY_TYP|STL_DT|STL_MOD|NEXT_FEE_DT|MERC_ID|MERC_TYP|MERC_NAM|MERC_FEE_MOD</Input>
<Output>MSG_CD|MERC_SUCC_CNT|MERC_AMT|MERC_FEE_AMT|</Output>
<!--定义-->
<Quote name="MERC_DYN_SQLSENTENCE"/>
<Process>
<Set>TXN_DT=$STL_DT</Set>
<!--计算下一个手续费的结算日期-->
<Set>INP_DAT.MERC_ID=$MERC_ID</Set> <!-- 商户号-->
<Set>INP_DAT.CAP_TYP=1</Set> <!-- 资金种类 1:现金 -->
<Set>INP_DAT.TX_MOD=0</Set> <!-- 交易方式 0-远程普通 -->
<Set>INP_DAT.FEE_TYP=$ORD_TYP</Set> <!-- 费用类型 11 代收 12 代付-->
<Set>INP_DAT.ORD_AMT=0.01</Set>
<Set>INP_DAT.TXN_AMT=0.01</Set>
<Set>INP_DAT.TOT_CALL_FLG=1</Set>
<Set>INP_DAT.RCV_AMT1=0.01</Set>
<Set>INP_DAT.STL_MOD=$STL_MOD</Set>
<!--计算手续费-->
<Exec func="URM:ComputeMerchFee">
<Arg name="INP_DAT" value="INP_DAT" />
<Arg name="OUT_DAT" value="OUT_DAT" />
</Exec>
<Delete>INP_DAT</Delete>
<Delete>OUT_DAT</Delete>
<!--收费方式 0:不收取 1:实时单笔收取 2:单笔计算、按周期收取 3:按周期汇总计算并收取-->
<!--0:不收取-->
<!--1:实时单笔收取-->
<If condition="OR(INTCMP($MERC_FEE_MOD,3,0),INTCMP($MERC_FEE_MOD,3,1))">
<!--根据对应订单类型查询代收代付商户清算明细表(手续费已清分)-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_MERC_SUM_FEE_CLR_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod=2">
<Set>MERC_SUCC_CNT=0</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=0</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL22222"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,手续费已清分的商户清算明细表无清算数据)"/>
</Exec>
<Return/>
</If>
<ElseIf condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,手续费已清分的商户清算明细表查询失败)"/>
</Exec>
<Return/>
</ElseIf>
<Else>
<Set>MERC_SUCC_CNT=$TO_MERC_SUCC_CNT</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=$TO_MERC_AMT</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=$TO_MERC_FEE_AMT</Set> <!-- 商户手续费 -->
<!-- @msg 正常结束 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL00000"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,手续费已清分的商户,该商户收费方式为不收取或实时单笔收取,计算商户手续费成功)"/>
</Exec>
</Else>
</If>
<!--2:单笔计算、按周期收取-->
<If condition="INTCMP($MERC_FEE_MOD,3,2)">
<!--根据对应订单类型查询代收代付商户清算明细表(未清分)的流水号-->
<Exec func="PUB:OpenCursor">
<Arg name="SqlCmd" value="QRY_MERC_FEE_NOTCLR_JRN_CAPSTLDTL"/>
<Arg name="CursorName" value="QRY_MERC_FEE_NOTCLR_JRN_CAPSTLDTL"/>
</Exec>
<While>
<Exec func="PUB:FetchCursor" error="IGNORE">
<Arg name="CursorName" value="QRY_MERC_FEE_NOTCLR_JRN_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod=2">
<Break/>
</If>
<ElseIf condition="~RetCod&lt;0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,根据未清分的流水号查询代收代付商户清算明细表交易失败)"/>
</Exec>
<Exec func="PUB:CloseCursor">
<Arg name="CursorName" value="QRY_MERC_FEE_NOTCLR_JRN_CAPSTLDTL"/>
</Exec>
<Return/>
</ElseIf>
<!--计算商户手续费-->
<Set>MERC_FEE_AMT=0</Set> <!-- 手续费 -->
<Set>INP_DAT.MERC_ID=$MERC_ID</Set> <!-- 商户号-->
<Set>INP_DAT.CAP_TYP=1</Set> <!-- 资金种类 1:现金 -->
<Set>INP_DAT.TX_MOD=0</Set> <!-- 交易方式 0-远程普通 -->
<Set>INP_DAT.FEE_TYP=$ORD_TYP</Set> <!-- 费用类型 11 代收 12 代付-->
<Set>INP_DAT.ORD_AMT=$TXN_AMT</Set>
<Set>INP_DAT.TXN_AMT=$TXN_AMT</Set>
<Set>INP_DAT.TOT_CALL_FLG=1</Set>
<Set>INP_DAT.RCV_AMT1=$TXN_AMT</Set>
<Set>INP_DAT.STL_MOD=$STL_MOD</Set>
<!--计算手续费-->
<Exec func="URM:ComputeMerchFee">
<Arg name="INP_DAT" value="INP_DAT" />
<Arg name="OUT_DAT" value="OUT_DAT" />
</Exec>
<If condition="IS_SUCC(@O.MSG_CD)=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,单笔计算、按周期收取,计算手续费失败)"/>
</Exec>
<Exec func="PUB:CloseCursor">
<Arg name="CursorName" value="QRY_MERC_FEE_NOTCLR_JRN_CAPSTLDTL"/>
</Exec>
<Return/>
</If>
<Set>MERC_FEE_AMT=$OUT_DAT.ORD_FEE</Set> <!-- 手续费 -->
<Set>MERC_FEE_MOD=$OUT_DAT.MERC_FEE_MOD</Set> <!-- 收费方式 -->
<Set>MERC_FEE_CAL_MTH=$OUT_DAT.FEE_CAL_MTH</Set> <!-- 费用计算依据 -->
<!--根据代收代付分类计算交易净额-->
<!--代收:代商户收款,需要清算给商户的金额,交易净额=交易额-手续费-->
<!--代付:代商户付款,交易净额=交易额+手续费-->
<!-- 11 代收-->
<If condition="INTCMP($PAY_TYP,3,11)">
<Set>MERC_STL_AMT=FSUB($TXN_AMT,$MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
</If>
<!-- 12 代付-->
<Else>
<Set>MERC_STL_AMT=FADD($TXN_AMT,$MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
</Else>
<!--商户清分标志更改-->
<Set>MERC_FEE_CLR_FLG=1</Set>
<Set>MERC_FEE_CLR_DT=$GWA.AC_DT</Set>
<Set>MERC_FEE_DT=$GWA.AC_DT</Set>
<!-- 根据流水号更新清算明细表 -->
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_MERC_FEE_CLR_JRN_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,根据流水号更新清算明细表失败)"/>
</Exec>
<Return/>
</If>
<Delete>INP_DAT</Delete>
<Delete>OUT_DAT</Delete>
<Delete>TXN_AMT</Delete>
<Delete>JRN_NO</Delete>
</While>
<Exec func="PUB:CommitWork" />
<!--根据对应订单类型查询代收代付商户清算明细表(已清分)-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_MERC_SUM_FEE_CLR_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod=2">
<Set>MERC_SUCC_CNT=0</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=0</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL22222"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,代收代付商户清算明细表已清分无数据)"/>
</Exec>
<Return/>
</If>
<ElseIf condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,代收代付商户清算明细表已清分查询失败)"/>
</Exec>
<Return/>
</ElseIf>
<Else>
<Set>MERC_SUCC_CNT=$TO_MERC_SUCC_CNT</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=$TO_MERC_AMT</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=$TO_MERC_FEE_AMT</Set> <!-- 商户手续费 -->
<!-- @msg 正常结束 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL00000"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,该商户收费方式为单笔计算、按周期收取,计算商户手续费成功)"/>
</Exec>
</Else>
</If>
<!---3: 按周期汇总收取 -->
<If condition="INTCMP($MERC_FEE_MOD,3,3)">
<!--根据对应订单类型查询代收代付商户清算明细表(未清分)-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_MERC_SUM_FEE_NOTCLR_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod=2">
<Set>MERC_SUCC_CNT=0</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=0</Set> <!-- 商户总金额-->
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL22222"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,代收代付商户清算明细表未清分无数据)"/>
</Exec>
<Return/>
</If>
<ElseIf condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,代收代付商户清算明细表未清分查询失败)"/>
</Exec>
<Return/>
</ElseIf>
<Else>
<Set>MERC_SUCC_CNT=$TO_MERC_SUCC_CNT</Set> <!-- 交易成功笔数 -->
<Set>MERC_AMT=$TO_MERC_AMT</Set> <!-- 商户总金额-->
</Else>
<!--交易成功笔数大于0-->
<If condition="INTCMP($MERC_SUCC_CNT,6,0)">
<!--计算商户手续费-->
<Set>TO_MERC_FEE_AMT=0</Set> <!-- 手续费 -->
<Set>INP_DAT.MERC_ID=$MERC_ID</Set>
<Set>INP_DAT.CAP_TYP=1</Set>
<Set>INP_DAT.TX_MOD=0</Set>
<Set>INP_DAT.FEE_TYP=$PAY_TYP</Set>
<Set>INP_DAT.TOT_ORD_AMT=$MERC_AMT</Set>
<Set>INP_DAT.TOT_ORD_CNT=$MERC_SUCC_CNT</Set>
<Set>INP_DAT.TOT_RCV_AMT1=$MERC_AMT</Set>
<Set>INP_DAT.TOT_RCV_CNT1=$MERC_SUCC_CNT</Set>
<Set>INP_DAT.TOT_CALL_FLG=2</Set>
<Set>INP_DAT.STL_MOD=$STL_MOD</Set>
<!--计算手续费-->
<Exec func="URM:ComputeMerchFee">
<Arg name="INP_DAT" value="INP_DAT" />
<Arg name="OUT_DAT" value="OUT_DAT" />
</Exec>
<If condition="IS_SUCC(@O.MSG_CD)=0">
<Set>MSG=@O.MSG_CD</Set>
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,按周期汇总收取,计算手续费失败)"/>
</Exec>
<Return/>
</If>
<Set>TO_MERC_FEE_AMT=$OUT_DAT.ORD_FEE</Set> <!-- 手续费 -->
<Set>MERC_FEE_MOD=$OUT_DAT.MERC_FEE_MOD</Set> <!-- 收费方式 -->
<Set>MERC_FEE_CAL_MTH=$OUT_DAT.FEE_CAL_MTH</Set> <!-- 费用计算依据 -->
<!--根据代收代付分类计算交易净额-->
<!--代收:代商户收款,需要清算给商户的金额,交易净额=交易额-手续费-->
<!--代付:代商户付款,交易净额=交易额+手续费-->
<!-- 11 代收-->
<If condition="INTCMP($PAY_TYP,3,11)">
<Set>TO_MERC_STL_AMT=FSUB($MERC_AMT,$TO_MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
</If>
<!-- 12 代付-->
<Else>
<Set>TO_MERC_STL_AMT=FADD($MERC_AMT,$TO_MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
</Else>
<Set>MERC_FEE_AMT=$TO_MERC_FEE_AMT</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=$TO_MERC_STL_AMT</Set> <!-- 商户净额 -->
<!--商户清分标志更改-->
<Set>MERC_FEE_CLR_FLG=1</Set>
<Set>MERC_FEE_CLR_DT=$GWA.AC_DT</Set>
<Set>MERC_FEE_DT=$GWA.AC_DT</Set>
<!-- 根据对应订单类型更新清算明细表 -->
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UPD_MERC_FEE_NOTCLR_CAPSTLDTL"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,根据对应订单类型更新清算明细表失败)"/>
</Exec>
<Return/>
</If>
</If>
<Else>
<Set>MERC_FEE_AMT=0</Set> <!-- 商户手续费 -->
<Set>MERC_STL_AMT=0</Set> <!-- 商户净额 -->
</Else>
<!-- @msg 正常结束 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL00000"/>
<Arg name="MsgDat" value="STRCAT($MERC_ID,对应的收付类型, $PAY_TYP,计算商户手续费成功)"/>
</Exec>
</If>
</Process>
</Function>
</Package>