二、“本次应缴金额”自动运算公式
收缴系统的[收入收缴管理]-[监管收费]-[应缴信息录入]中“本次应缴金额”的自动计算公式需改为:
(一)每年第1期“本次应缴金额”
机构监管费=(上年末实收资本×机构监管费率×风险调整系数)÷2
业务监管费=[(上年末资产总额-实收资本)×业务监管费率×风险调整系数-境外分支机构在所在国家缴纳的监管费]÷2
(二)每年第2期“本次应缴金额”
机构监管费=全年应缴机构监管费-第1次应缴机构监管费=上年末实收资本×机构监管费率×风险调整系数-第1次应缴机构监管费
业务监管费=全年应缴业务监管费-第1次应缴业务监管费=[(上年末资产总额-实收资本)×业务监管费率×风险调整系数-境外分支机构在所在国家缴纳的监管费]-第1次应缴业务监管费
请你公司协助完成收缴系统的修改和调试工作。
|
public
interface
ICountStrategy {
/**
*
计算机构监管费
*/
public
UFDouble countCorpfee();
/**
*
计算业务监管费
*/
public
UFDouble countBusifee();
}
|
public
class
CalStrategyObject {
private
UFDouble
receivedfund
=
null
;
//
上年末实收资本
private
UFDouble
totalfund
=
null
;
//
上年末总资产
private
UFDouble
riskvalue
=
null
;
//
风险调整系数
private
UFDouble
corprate
=
null
;
//
机构监管费率
private
UFDouble
busirate
=
null
;
//
业务监管费率
private
UFDouble
outerfund
=
null
;
//
境外分支机构在所在国家缴纳的监管费
private
UFDouble
corpfund1
=
null
;
//
第
1
次应缴机构监管费
private
UFDouble
busifund1
=
null
;
//
第一次应缴业务监管费
//setter getter
方法
}
|
public
abstract
class
AbstractCountStrategy
implements
ICountStrategy {
private
boolean
isRefresh
=
false
;
protected
CalStrategyObject
calobj
=
null
;
/**
*
@param
calobj
用于计算的数据
vo
*/
public
AbstractCountStrategy(CalStrategyObject calobj) {
this
.
calobj
= calobj;
}
public
void
setCalStrategyObj(CalStrategyObject calobj) {
this
.
calobj
= calobj;
}
}
|
/**
*
第一期的计算公式
*
*
@author
wuz
*
*/
public
class
FirstTermCalculator
extends
AbstractCountStrategy {
public
FirstTermCalculator(CalStrategyObject calobj) {
super
(calobj);
}
/*
*
业务监管费
=[(
上年末资产总额
-
实收资本
)¡Á
业务监管费率
¡Á
风险调整系数
-
境外分支机构在所在国家缴纳的监管费
]¡Â2;
*/
public
UFDouble countBusifee() {
UFDouble totalBusifee = CalculatorUtil.countTotalBusiFee(
calobj
);
return
totalBusifee.div(2);
}
/*
*
每年第
1
期
“
本次应缴金额
”
机构监管费
=(
上年末实收资本
¡Á
机构监管费率
¡Á
风险调整系数
)¡Â2
*/
public
UFDouble countCorpfee() {
UFDouble totalFee = CalculatorUtil.countTotalCorpFee(
calobj
);
return
totalFee.div(2);
}
}
|
public
class
SecondTermCalculator
extends
AbstractCountStrategy {
public
SecondTermCalculator(CalStrategyObject calobj) {
super
(calobj);
}
/*
*
业务监管费
=
全年应缴业务监管费
-
第
1
次应缴业务监管费
=[(
上年末资产总额
-
实收资本
)¡Á
业务监管费率
¡Á
风险调整系数
-
境外分支机构在所在国家缴纳的监管费
]-
第
1
次应缴业务监管费
*/
public
UFDouble countBusifee() {
UFDouble busifee1 =
calobj
.getBusifund1();
//
第
1
次应缴业务监管费
UFDouble totalfee = CalculatorUtil.countTotalBusiFee(
calobj
);
//
全年应缴业务监管费
return
totalfee.sub(busifee1);
}
/*
*
机构监管费
=
全年应缴机构监管费
-
第
1
次应缴机构监管费
=
上年末实收资本
¡Á
机构监管费率
¡Á
风险调整系数
-
第
1
次应缴机构监管费
*/
public
UFDouble countCorpfee() {
UFDouble corpfee = CalculatorUtil.countTotalCorpFee(
calobj
);
UFDouble orgfee1 =
calobj
.getCorpfund1();
//
第
1
次应缴机构监管费
return
corpfee.sub(orgfee1);
}
}
|
public
class
CalculatorUtil {
/**
*
计算总的机构监管费
上年末实收资本
¡Á
机构监管费率
¡Á
风险调整系数
*
*
@param
calobj
*
@return
*/
public
static
UFDouble countTotalCorpFee(CalStrategyObject calobj) {
UFDouble receivedFund = calobj.getReceivedfund();
UFDouble riskvalue = calobj.getRiskvalue();
UFDouble rate = calobj.getCorprate();
return
receivedFund.multiply(rate).multiply(riskvalue);
}
/**
*
业务监管费总额
(
上年末资产总额
-
实收资本
)¡Á
业务监管费率
¡Á
风险调整系数
-
境外分支机构在所在国家缴纳的监管费
*
业务监管费率是一个范围值,不同范围取值不一样
*
*
*
@param
calobj
*
@return
*
@throws
Exception
*/
public
static
UFDouble countTotalBusiFee(CalStrategyObject calobj){
UFDouble total = calobj.getTotalfund();
//
上年末资产总额
UFDouble receivedFund = calobj.getReceivedfund();
//
实收资本
UFDouble sub = total.sub(receivedFund);
//
按照
(
上年末资产总额
-
实收资本
)
计算业务监管费
UFDouble business = BusiRateUtil.getInstance().getBusiFee(sub);
UFDouble riskrate = calobj.getRiskvalue();
//
风险调整系数
UFDouble outfee = calobj.getOuterfund();
//
境外分支机构在所在国家缴纳的监管费
return
business.multiply(riskrate).sub(outfee);
}
}
|
public
class
CalculatorFactory {
/**
*
@param
type
期次
*
@return
*/
public
ICountStrategy createCalculator(
int
type){
if
(type ==1 ){
return
new
FirstTermCalculator();
}
else
{
return
new
SecondTermCalculator();
}
return
null
;
}
}
|
public
class
PayableCalculator {
...
private
void
onCount1()
throws
Exception {
CalStrategyObject obj = getCalobj();
ICountStrategy counter =
new
FirstTermCalculator(obj);
UFDouble orgFee = counter.countCorpfee();
data
.setOrgfee(orgFee);
UFDouble busifee = counter.countBusifee();
data
.setBusifee(busifee);
}
...
private
void
onCount2()
|