1、 中国移动“营改增” 报账平台改造 公共服务包设计说明书 中国移动通信有限公司 2013年7月 V0.1 目录 1 概述 1 1.1 本文档适用范围 1 1.2 参考文件 1 1.3 术语与定义 1 1.3.1 符号与缩略语 1 1.3.2 表单图例 2 1.4 背景情况 2 1.4.1 报账平台建设历程及现状 2 1.4.2 营改增业务要求及影响 3 1.5 总体说明 3 1.5.1 系统改造目标 3 1.5.2 系统改造范围 3 1.5.3 系统改造要求 4 2 功能改造 5 2.1
2、 提交报账单验证 5 2.2 数据库脚本 6 2.3 相关表类及hbm文件更新 6 2.4 进项抵扣凭证Tab页实现 8 2.5 税率字段页面展示 9 2.6 初核会计环节增加‘提交税务会计认证’ 13 2.7 导入类接口增加返回消息日志记录 17 2.8 增加测试用webservice项目 19 2.9 增加营改增系统开关 24 2.10 视同销售导入应付和总账 26 1 概述 1.1 本文档适用范围 为规范营业税改征增值税(简称“营改增”)所需系统改造,按照省公司层面“营改增”现有基础代码,特制定本说明书。 1.2 参考文件 1.3 术语与定义 名
3、词 解释 报账平台 各公司所属市/县公司和公司本部进行财务报销、报账的系统平台。该系统平台提供了报账信息采集、审批、传递和财务审核功能;通过预定义报账信息与财务信息间关系自动生成会计凭证信息,为ERP系统的核算处理和凭证归档提供支持;并能提高财务集中核算和结算的准确性和效率 ERP接口平台 实现财务集中管理相关应用以及其它ERP扩展应用与ERP核心系统之间的流程耦合和数据交互的系统平台 进项抵扣凭证 增值税进项抵扣凭证包括增值税专用发票、货物运输业增值税专用发票、进口海关增值税专用缴款书、税收通用缴款书、购买免税农产品的普通发票、公路内河货物运输业统一发票、机动车销售统一发票、铁
4、路货票等。 进项税额转出 企业购进的货物发生非常损失(非经营性损失),以及将购进货物改变用途(如用于非应税项目、集体福利或个人消费等),其抵扣的进项税额应通过“应交税费——应交增值税(进项税额转出)”科目转入有关科目,不予以抵扣。 1.3.1 符号与缩略语 缩写 英文描述 中文描述 ERP Enterprise resource planning 特指中国移动ORACLE ERP系统 BOSS Business&Operation Support System 特指中国移动业务运营支撑系统 OA Office Automation 特指中国移动统一信息平台系统
5、COA Chart of Account 特指中国移动会计科目 1.3.2 表单图例 表单图例 说明 表示必填项,无此标识的为非必填项 表示条形码 表示默认值或由系统自动生成 表示复选框 表示值列表 表示动作按钮 表示滚动条 1.4 背景情况 1.4.1 报账平台建设历程及现状 中国移动于2007年启动报账平台试点省份建设,并于2008年进行了全国推广,2009年启动集团总部、管理学院、研究院的报账平台建设。后续,各省结合集团报账规范以及本省报账业务对报账平台进行多轮扩展建设。 2011年,为配合”全面预算系统”建设,全国各省及集
6、团总部报账平台进行了相关改造,实现了与全面预算系统的对接。 2011年,报账业务扩展到”薪酬管理”领域,全国各省及集团总部报账平台与薪酬管理系统进行对接。 2012年,报账平台进行了”渠道酬金”相关报账的建设改造及与BOSS侧CRM系统的对接,实现了对渠道酬金报账业务的支撑。 本次为适应“营改增”政策,将对报账平台进行新一轮改造建设,以满足“营改增”业务需求,计划全国各省按集团要求,在2013年9月、10月分批完成改造并上线。 1.4.2 营改增业务要求及影响 2012年9月北京、江苏等8省市分批试点营改增业务,预计2013年邮电通信行业也将纳入试点,到2016年国家税务总局提出十二
7、五时期要进行全面实施改革,完整运行增值税链条机制。 增值税链条机制要求价税分离,商品价格与税金分离,收入、成本费用、资本开支、利润都将受到影响。 基于上述情况,报账平台需要进行相应改造以满足营改增业务需求。 1.5 总体说明 1.5.1 系统改造目标 报账平台“营改增”改造,其目标是满足“营改增”报账业务需求,具体建设目标如下: ● 实现报账价税分离 实现报账单据的价税分离,使其能够记录进项抵扣凭证信息、价税分离数据,并根据价税分离信息进行相关控制和自动入账。 ● 实现“发票信息”录入和“发票认证结果”查看 在报账单中录入记录发票信息,实现对发票信息和报账信息的一体化管理,报
8、账系统从集团统一建设的发票管理模块同步发票认证状态,进行查看。 1.5.2 系统改造范围 ● 支出类报账单 所有涉及一般纳税人供应商付款业务的报账单均需要“营改增”改造,需要对报账单模板、校验逻辑进行调整。 ● 收入类报账单 对于需要开具增值税销项发票的收款业务,其报账单均需要进行“营改增”改造,需要对报账单模板、校验逻辑进行调整。 ● 支出类报账流程 对于上述涉及“营改增”改造的支出类报账单,其报账流程需要进行相应改造。 ● 相关系统接口 为满足“营改增”业务,ERP、发票、预算、合同、采购、SOA接口平台等相关系统均需要进行改造,并由集团统一新建发票管理模块,报账平台与上
9、述相关系统的接口也需要进行新增或调整,增加价税分离数据项、发票信息传递和相关控制逻辑。 1.5.3 系统改造要求 ● 统一规范 各省公司按照集团统一的“营改增”业务规范和系统改造方案,对报账平台进行改造建设。 ● 时间进度要求 为满足“营改增”实施时间要求,各省公司需要在7月底以前完成报账平台的开发,按统一时间安排并完成与相关系统的调整对接及上线。 ● 业务兼容性 要求各省报账平台可以同时满足增值税业务和非增值税业务的功能要求。 2 功能改造 2.1 提交报账单验证 整体思路:定义统一验证接口,将验证按功能实现为一个单独的验证器类。由于各省情况不一,此次只将营改增部分抽出实
10、现。建议各省在以后将原有验证方法按功能都实现为一个个单独验证器类。
统一验证接口及营改增部分的验证器:
描述
文件
com.ibm.org.reimbursement.service.validator:验证器类
src/spring-claim-validator.xml
1. 在SubmitClaimService.java注入validatorSet并增加validateForVAT方法
//验证列表
protected LinkedHashSet
11、lidatorSet(LinkedHashSet
12、ile(validatorIt.hasNext()){ IValidator validator=validatorIt.next(); if(validator.validate(mo, errors)==false){ return errors.isNoError(); } } return errors.isNoError(); } 2. 修改需要进行营改增报账单的提交类,在提交类中的validate方法中调用validateForVAT方法。 3. public boolean validate(IMessageObjectmo
13、 ValidateErrors errors) {
…此处省略原有验证代码
validateForVAT(mo, errors);
return errors.isNoError();
}
4. 修改spring配置文件
l 在AppBeanContext.xml最后增加
14、om/ibm/org/reimbursement/pojo/hbm/TVatInvoiceauth.hbm.xml
l 在需要进行营改增的报账单提交类配置中增加:
16、AmountValidator验证器:实现合同价款、税款、累计价款、累计税款、报账金额之间关系验证。 businessActivityValidator验证器:实现根据业务小类控制是否必填必须填写进项抵扣凭证。 2.2 数据库脚本 V0.8有变更 2.3 相关表类及hbm文件更新 l BaseTRmbsClaim.java //营改增增加字段 /** 是否含进项抵扣凭证 **/ private java.lang.StringisHasVoucher; /** 合同价款 **/ private java.math.BigDecimalcontractPric
17、eAmount; /** 合同税款 **/ private java.math.BigDecimalcontractTaxAmount; /** 合同累计价款 **/ private java.math.BigDecimalcontractAccumPriceAmount; /** 合同累计税款 **/ private java.math.BigDecimalcontractAccumTaxAmount; /** 供应商税务资质 **/ private java.lang.StringvendorTaxQuality; /** 价款 **/ privat
18、e java.math.BigDecimalpriceAmount;
/** 进项税款 **/
private java.math.BigDecimalinputTaxAmount;
/** 销项税额 **/
private java.math.BigDecimaloutputTaxAmount;
/** 认证状态,0-未认证,1-认证成功,2-认证不成功(含部分成功) **/
private java.lang.StringinvoiceAuthState;
l TRmbsClaim.hbm.xml
19、 type="java.lang.String">
20、
23、
24、mment>销项税额
25、va.lang.StringvoucherCategory; /** 进项税率 **/ private java.math.BigDecimalinputTaxRate; /** 进项税款 **/ private java.math.BigDecimalinputTaxAmount; /** 价款 **/ private java.math.BigDecimalpriceAmount; /** 是否视同销售,1-视同销售 **/ private java.lang.StringisEquateSale; /** 销项税率 **/ private jav
26、a.math.BigDecimaloutputTaxRate;
/** 销项税额 **/
private java.math.BigDecimaloutputTaxAmount;
l TRmbsClaimLine.hbm.xml
28、>
29、comment>
30、ecision="20" scale="4">
31、th.hbm.xml:抵扣发票联hbm src/com/ibm/org/reimbursement/pojo/TVatInvoiceauth.java:抵扣发票联pojo 2.5 税率字段页面展示 为了实现税率字段页面以百分数显示(),数据库使用小数保存。需要按照步骤操作: 1. 在src/com/ibm/org/reimbursement/util/下新增加一个类。 2. 修改类src/com/ibm/org/reimbursement/util/ActionXMLTransformer.java的fldType2ForegroundVarType方法,增加蓝色部分代码如下
32、 /** * 将字段类型转换为前台XML的类型。 * @param fldType * @return */ private String fldType2ForegroundVarType(String fldType) { TypeConversion tc = new TypeConversion(); if( fldType.equals(ItemFldTransformer.FLD_TYPE_INTEGER)) //整型 { return "int"; }else if(fldType.equals(ItemFldT
33、ransformer.FLD_TYPE_PERCENT)){ //百分型 return "com.ibm.org.reimbursement.util.Percent"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DECIMAL)){ //浮点型 return "java.math.BigDecimal"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DATE)){ //日期类型 return "java.util.Date"; }
34、else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DATETIME)){ //时间类型 return "java.util.Date"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_LONG)){ return "java.lang.Long"; }else{ //字符串类型 return "java.lang.String"; } } 3. 修改类src/com/ibm/org/reimbursement/util/ClaimRec
35、ordPrivilege.java的fldType2ForegroundVarType方法,增加蓝色部分代码如下: private String fldType2ForegroundVarType(String fldType) { if( fldType.equals(ItemFldTransformer.FLD_TYPE_INTEGER)) //整型 { return "int"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_PERCENT)){ //百分型 return "com.ibm
36、org.reimbursement.util.Percent"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DECIMAL)){ //浮点型 return "java.math.BigDecimal"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DATE)){ //日期类型 return "java.util.Date"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DATET
37、IME)){ //时间类型 return "java.util.Date"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_LONG)){ return "java.lang.Long"; }else{ //字符串类型 return "java.lang.String"; } } 4. 修改类src/com/ibm/org/reimbursement/util/ItemFldTransformer.java 增加变量: public static String FLD_TYPE_PE
38、RCENT = "7"; 在方法中增加蓝色代码如下: /** * 将一个字符串类型的值,按照字段类型转换成对应的类型。 * @param strValue * @param fldType * @return */ public static Object convertString2Object(String strValue,String fldType) { TypeConversion tc = new TypeConversion(); if( fldType.equals(FLD_TYPE_INTEGER)) //整型 {
39、 return tc.string2Integer(strValue); }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_PERCENT)){ //百分型 return tc.string2Percent(strValue); }else if(fldType.equals(FLD_TYPE_DECIMAL)){ //浮点型 return tc.string2Bigdecimal(strValue); }else if(fldType.equals(FLD_TYPE_DATE)){ //日期类型
40、 return tc.string2Date(strValue); }else if(fldType.equals(FLD_TYPE_DATETIME)){ //时间类型 return tc.string2Date(strValue); }else if(fldType.equals(FLD_TYPE_LONG)){ //长整型 return tc.string2Long(strValue); }else{ //字符串类型 return strValue; } } 5. 修改类src/com/ibm/org/reimburs
41、ement/util/RecordPrivilege.java的fldType2ForegroundVarType方法,增加蓝色部分代码如下: private String fldType2ForegroundVarType(String fldType) { TypeConversion tc = new TypeConversion(); if( fldType.equals(ItemFldTransformer.FLD_TYPE_INTEGER)) //整型 { return "int"; }else if(fldType.equals(ItemFl
42、dTransformer.FLD_TYPE_PERCENT)){ //百分型 return "com.ibm.org.reimbursement.util.Percent"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DECIMAL)){ //浮点型 return "java.math.BigDecimal"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DATE)){ //日期类型 return "java.util.Date";
43、 }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DATETIME)){ //时间类型 return "java.util.Date"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_LONG)){ return "java.lang.Long"; }else{ //字符串类型 return "java.lang.String"; } } 6. 修改类src/com/ibm/org/reimbursement/util/Type
44、Conversion.java的object2String和string2Object方法,并增加新方法string2Percent,如下蓝色部分代码: /** * 将对象转换为字符串 * @param obj * @return */ public String object2String(Object obj,String fldType) { if( obj == null ) return ""; if( obj instanceof String) return obj.toString(); else if( ob
45、j instanceof java.lang.Integer ) return obj.toString(); else if( obj instanceof java.math.BigInteger ) return obj.toString(); else if( obj instanceof java.lang.Long ) return obj.toString(); else if(obj instanceof java.math.BigDecimal&& fldType!=null && fldType.equals("com.ibm.or
46、g.reimbursement.util.Percent")) return (new com.ibm.org.reimbursement.util.Percent((java.math.BigDecimal)obj)).toPercentString(); else if(obj instanceof java.math.BigDecimal&& fldType!=null && fldType.equals("##.####")) return (new java.text.DecimalFormat("0.0000").format(obj)).toStrin
47、g(); else if(obj instanceof java.math.BigDecimal) return (new java.text.DecimalFormat("0.00").format(obj)).toString(); else if(obj instanceof java.lang.Double) return (new java.text.DecimalFormat("0.00").format(obj)).toString(); else if( obj instanceof java.util.Date && fldType!
48、null && fldType.equals("5")) return DateUtil.dateFormat(obj,"yyyy-MM-dd HH:mm:ss"); else if( obj instanceof java.util.Date) return DateUtil.dateFormat(obj, "yyyy-MM-dd"); else return obj.toString(); } /** * 将字符串类型按照类型转换为对应的Object * @param strValue * @param classTyp
49、e * @return */ public Object string2Object(String strValue,String classType) { if( classType == null ) return strValue; if( (strValue == null) ||( strValue.equals("") && (!classType.toLowerCase().equals("java.lang.string")))) return null; if( classType.toLowerCase().equals("java.lang.integer") || classType.toLowerCase().equals("int")) return new java.lang.Integer(strValue); else if(classType.toLowerCase().equals("com.ibm.org.reimbursement.util.percent")) return new com.ibm.org.reimbursement.util.Percent(s






