Files
2021-01-12 22:04:24 +08:00

316 lines
13 KiB
XML

<?xml version='1.0' encoding='UTF-8'?>
<Package>
<!-- 计算商户手续费及商户结算 -->
<Function name="MERC_STL_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|</Output>
<DynSentence name="QRY_URMTMFEE"> <!-- 查询商户服务费费率表 -->
<Sentence>
SELECT MERC_FEE_MOD FROM URMTMFEE
WHERE MERC_ID = ? AND CAP_TYP = '1' AND FEE_TYP = '01' AND ( EFF_DT &lt;= ? AND EXP_DT &gt; ? )
</Sentence>
<Fields>MERC_ID|STL_DT|STL_DT|</Fields>
</DynSentence>
<DynSentence name="QryTxnJnl">
<Sentence>
SELECT JRN_NO,TXN_AMT
FROM CAPSTLDTL
WHERE TXN_TYP='N' AND PAY_TYP=? AND ORD_TYP=?
AND BUS_TYP='CAP01' AND (TXN_CD='204010' OR TXN_CD='204015' OR TXN_CD='204020') AND TXN_STS='S' AND MERC_CLR_FLG='0'
AND MERC_ID = ? AND AC_DT &lt;= ?
</Sentence>
<Fields>PAY_TYP|ORD_TYP|MERC_ID|TXN_DT|</Fields>
</DynSentence>
<DynSentence name="UpdTxnJnl">
<Sentence>
UPDATE CAPSTLDTL
SET MERC_CLR_FLG='1',MERC_CLR_DT=?,
MERC_FEE_MOD=?, MERC_FEE_CAL_MTH=?,
MERC_FEE_AMT=?, MERC_STL_AMT=?
WHERE JRN_NO=?
</Sentence>
<Fields>MERC_CLR_DT|MERC_FEE_MOD|MERC_FEE_CAL_MTH|MERC_FEE_AMT|MERC_STL_AMT|JRN_NO|</Fields>
</DynSentence>
<DynSentence name="QrySUMSTL">
<Sentence>
SELECT COUNT(*) TO_MERC_SUCC_CNT,NVL(SUM(TXN_AMT),0) TO_TXN_AMT,
NVL(SUM(MERC_FEE_AMT),0) TO_MERC_FEE_AMT, NVL(SUM(MERC_STL_AMT),0) TO_MERC_STL_AMT
FROM CAPSTLDTL
WHERE PAY_TYP=? AND ORD_TYP=? AND BUS_TYP='CAP01' AND (TXN_CD='204010' OR TXN_CD='204015' OR TXN_CD='204020')
AND TXN_STS='S' AND MERC_CLR_FLG='1' AND MERC_ID = ? AND AC_DT &lt;= ?
</Sentence>
<Fields>PAY_TYP|ORD_TYP|MERC_ID|TXN_DT|</Fields>
</DynSentence>
<DynSentence name="QrySUMJnl">
<Sentence>
SELECT COUNT(*) TO_MERC_SUCC_CNT,NVL(SUM(TXN_AMT),0) TO_TXN_AMT
FROM CAPSTLDTL
WHERE TXN_TYP='N' AND PAY_TYP=? AND ORD_TYP=?
AND BUS_TYP='CAP01' AND (TXN_CD='204010' OR TXN_CD='204015' OR TXN_CD='204020') AND TXN_STS='S' AND MERC_CLR_FLG='0'
AND MERC_ID = ? AND AC_DT &lt;= ?
</Sentence>
<Fields>PAY_TYP|ORD_TYP|MERC_ID|TXN_DT|</Fields>
</DynSentence>
<DynSentence name="UpdSUMJnl">
<Sentence>
UPDATE CAPSTLDTL
SET MERC_CLR_FLG='1',MERC_CLR_DT=?,
MERC_FEE_MOD=?, MERC_FEE_CAL_MTH=?
WHERE TXN_TYP='N' AND PAY_TYP=? AND ORD_TYP=?
AND BUS_TYP='CAP01' AND (TXN_CD='204010' OR TXN_CD='204015' OR TXN_CD='204020') AND TXN_STS='S' AND MERC_CLR_FLG='0'
AND MERC_ID = ? AND AC_DT &lt;= ?
</Sentence>
<Fields>MERC_CLR_DT|MERC_FEE_MOD|MERC_FEE_CAL_MTH|PAY_TYP|ORD_TYP|MERC_ID|TXN_DT|</Fields>
</DynSentence>
<Process>
<Set>TXN_DT=$NEXT_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="OR(INTCMP($MERC_FEE_MOD,3,0),INTCMP($MERC_FEE_MOD,3,1))">
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QrySUMSTL"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="交易失败"/>
</Exec>
<Return/>
</If>
<If condition="INTCMP($TO_MERC_SUCC_CNT,4,0)">
<Exec func="PUB:InsertRecord" error="IGNORE">
<Arg name="TblNam" value="CAPSTLREG"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="交易失败"/>
</Exec>
<Return/>
</If>
</If>
</If>
<If condition="INTCMP($MERC_FEE_MOD,3,2)">
<Exec func="PUB:OpenCursor">
<Arg name="SqlCmd" value="QryTxnJnl"/>
<Arg name="CursorName" value="QryTxnJnl"/>
</Exec>
<While>
<Exec func="PUB:FetchCursor" error="IGNORE">
<Arg name="CursorName" value="QryTxnJnl"/>
</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="交易失败"/>
</Exec>
<Exec func="PUB:CloseCursor">
<Arg name="CursorName" value="QryTxnJnl"/>
</Exec>
<Return/>
</ElseIf>
<!--计算商户手续费-->
<Set>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=01</Set>
<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>
<!--计算手续费-->
<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="交易失败"/>
</Exec>
<Exec func="PUB:CloseCursor">
<Arg name="CursorName" value="QryTxnJnl"/>
</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> <!-- 费用计算依据 -->
<Set>MERC_STL_AMT=FSUB($TXN_AMT,$MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
<!--商户清分标志更改-->
<Set>MERC_CLR_FLG=1</Set>
<Set>MERC_CLR_DT=$GWA.AC_DT</Set>
<!-- 更新清算明细表 -->
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UpdTxnJnl"/>
</Exec>
<Delete>INP_DAT</Delete>
<Delete>OUT_DAT</Delete>
<Delete>TXN_AMT</Delete>
<Delete>LOG_NO</Delete>
</While>
<!--查询商户代收汇总信息-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QrySUMSTL"/>
</Exec>
<If condition="INTCMP($TO_MERC_SUCC_CNT,4,0)">
<Exec func="PUB:InsertRecord" error="IGNORE">
<Arg name="TblNam" value="CAPSTLREG"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="交易失败"/>
</Exec>
<Return/>
</If>
</If>
</If>
<!--- 按周期汇总,计算手续费 -->
<If condition="INTCMP($MERC_FEE_MOD,3,3)">
<!--查询商户代收汇总信息-->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QrySUMJnl"/>
</Exec>
<!--计算商户手续费-->
<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=01</Set>
<Set>INP_DAT.TOT_ORD_AMT=$TO_TXN_AMT</Set>
<Set>INP_DAT.TOT_ORD_CNT=$TO_MERC_SUCC_CNT</Set>
<Set>INP_DAT.TOT_CALL_FLG=2</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="交易失败"/>
</Exec>
<Exec func="PUB:CloseCursor">
<Arg name="CursorName" value="QryTxnJnl"/>
</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> <!-- 费用计算依据 -->
<Set>TO_MERC_STL_AMT=FSUB($TO_TXN_AMT,$TO_MERC_FEE_AMT,2)</Set> <!-- 实际清算到商户账金额 -->
<!--商户清分标志更改-->
<Set>MERC_CLR_FLG=1</Set>
<Set>MERC_CLR_DT=$GWA.AC_DT</Set>
<!-- 更新清算明细表 -->
<Exec func="PUB:ExecSql">
<Arg name="SqlCmd" value="UpdSUMJnl"/>
</Exec>
<If condition="INTCMP($TO_MERC_SUCC_CNT,4,0)">
<Exec func="PUB:InsertRecord" error="IGNORE">
<Arg name="TblNam" value="CAPSTLREG"/>
</Exec>
<If condition="~RetCod!=0">
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL99999"/>
<Arg name="MsgDat" value="交易失败"/>
</Exec>
<Return/>
</If>
</If>
</If>
<!-- @msg 正常结束 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="STL00000"/>
<Arg name="MsgDat" value="交易成功"/>
</Exec>
</Process>
</Function>
<!-- 交易路由选择 本代本走银行,本代他走银行-->
<Function name="MERC_TXN_ROUT">
<Input>GWA|CRD_NO|</Input>
<Output>MSG_CD|</Output>
<DynSentence name="QRY_CORG_NO"> <!-- 根据银行类型转换为合作机构编码 -->
<Sentence>
SELECT CORG_NO FROM CMMTINORG
WHERE BNK_TYP=? AND BNK_STS='1'
</Sentence>
<Fields>BNK_TYP|</Fields>
</DynSentence>
<Process>
<!--获取银行卡类型及判断卡种 00:借记卡 01:贷记卡 02:准贷记卡-->
<!--Exec func="ATMPTC:GetCrdFlg">
<Arg name="Table" value="CMMTUFIT"/>
<Arg name="Trk2" value=" "/>
<Arg name="Trk3" value=" "/>
<Arg name="CrdNo" value="$CRD_NO"/>
<Arg name="cacheFlg" value="N"/><参数cacheFlg若为N,则直接读卡表,不读取缓存>
</Exec-->
<!--如果是信用卡,判断CVV2和信用卡有效期是否为空-->
<If condition="IS_EQUAL_STRING($CRD_FLG,01)">
<If condition="OR(ISNULL($CVV2),ISNULL(CRD_EXP_DT))">
<!-- 数据格式错误 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="TXN99999"/>
<Arg name="MsgDat" value="数据格式错误"/>
</Exec>
</If>
</If>
<!-- 根据银行类型转换为合作机构编码 -->
<Exec func="PUB:ReadRecord" error="IGNORE">
<Arg name="SqlCmd" value="QRY_CORG_NO"/>
</Exec>
<If condition="~RetCod!=0">
<!--根据银行类型查询不到合作机构,取默认值-->
<Set>CORG_NO=$DEFAULT_ROUT</Set>
</If>
<Else>
<Set>CORG_NO=$CORG_NO</Set>
</Else>
<!-- @msg 正常结束 -->
<Exec func="PUB:CmpSetMsg">
<Arg name="MsgCd" value="TXN00000"/>
<Arg name="MsgDat" value="交易成功"/>
</Exec>
</Process>
</Function>
</Package>