1、 中国移动“营改增” 报账平台改造 公共服务包设计说明书 中国移动通信 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 特指中国移动统一信息平台系统 COA Chart of Acco
5、unt 特指中国移动会计科目 1.3.2 表单图例 表单图例 说明 表示必填项,无此标识为非必填项 表示条形码 表示默认值或由系统自动生成 表示复选框 表示值列表 表示动作按钮 表示滚动条 1.4 背景情况 1.4.1 报账平台建设历程及现实状况 中国移动于开启报账平台试点省份建设,并于进行了全国推广,开启集团总部、管理学院、研究院报账平台建设。后续,各省结合集团报账规范和本省报账业务对报账平台进行多轮扩展建设。 ,为配合”全方面预算系统”建设,全国各省及集团总部报账平台进行了相关改造,实现了和全方面预算系统对接。 ,报账业务扩展
6、到”薪酬管理”领域,全国各省及集团总部报账平台和薪酬管理系统进行对接。 ,报账平台进行了”渠道酬金”相关报账建设改造及和BOSS侧CRM系统对接,实现了对渠道酬金报账业务支撑。 此次为适应“营改增”政策,将对报账平台进行新一轮改造建设,以满足“营改增”业务需求,计划全国各省按集团要求,在9月、10月分批完成改造并上线。 1.4.2 营改增业务要求及影响 9月北京、江苏等8省市分批试点营改增业务,估计邮电通信行业也将纳入试点,到国家税务总局提出十二五时期要进行全方面实施改革,完整运行增值税链条机制。 增值税链条机制要求价税分离,商品价格和税金分离,收入、成本费用、资本开支、利润全部将受
7、到影响。 基于上述情况,报账平台需要进行对应改造以满足营改增业务需求。 1.5 总体说明 1.5.1 系统改造目标 报账平台“营改增”改造,其目标是满足“营改增”报账业务需求,具体建设目标以下: ● 实现报账价税分离 实现报账单据价税分离,使其能够统计进项抵扣凭证信息、价税分离数据,并依据价税分离信息进行相关控制和自动入账。 ● 实现“发票信息”录入和“发票认证结果”查看 在报账单中录入统计发票信息,实现对发票信息和报账信息一体化管理,报账系统从集团统一建设发票管理模块同时发票认证状态,进行查看。 1.5.2 系统改造范围 ● 支出类报账单 全部包含通常纳税人供给商付款业
8、务报账单均需要“营改增”改造,需要对报账单模板、校验逻辑进行调整。 ● 收入类报账单 对于需要开具增值税销项发票收款业务,其报账单均需要进行“营改增”改造,需要对报账单模板、校验逻辑进行调整。 ● 支出类报账步骤 对于上述包含“营改增”改造支出类报账单,其报账步骤需要进行对应改造。 ● 相关系统接口 为满足“营改增”业务,ERP、发票、预算、协议、采购、SOA接口平台等相关系统均需要进行改造,并由集团统一新建发票管理模块,报账平台和上述相关系统接口也需要进行新增或调整,增加价税分离数据项、发票信息传输和相关控制逻辑。 1.5.3 系统改造要求 ● 统一规范 各省企业根据集团统
9、一“营改增”业务规范和系统改造方案,对报账平台进行改造建设。 ● 时间进度要求 为满足“营改增”实施时间要求,各省企业需要在7月底以前完成报账平台开发,按统一时间安排并完成和相关系统调整对接及上线。 ● 业务兼容性 要求各省报账平台能够同时满足增值税业务和非增值税业务功效要求。 2 功效改造 2.1 提交报账单验证 整体思绪:定义统一验证接口,将验证按功效实现为一个单独验证器类。因为各省情况不一,此次只将营改增部分抽出实现。提议各省在以后将原有验证方法按功效全部实现为一个个单独验证器类。 统一验证接口及营改增部分验证器: 描述 文件 com.ibm.org.reimbur
10、sement.service.validator:验证器类
src/spring-claim-validator.xml
1. 在SubmitClaimService.java注入validatorSet并增加validateForVAT方法
//验证列表
protected LinkedHashSet
11、torSet;
}
/**
* 营改增通用提交步骤验证
* @return true or false
*/
protected booleanvalidateForVAT(IMessageObjectmo, ValidateErrors errors)
{
//验证
Iterator
12、alidator.validate(mo, errors)==false){ return errors.isNoError(); } } return errors.isNoError(); } 2. 修改需要进行营改增报账单提交类,在提交类中validate方法中调用validateForVAT方法。 3. public boolean validate(IMessageObjectmo, ValidateErrors errors) { …此处省略原有验证代码 validateForVAT(mo, errors); return
13、errors.isNoError();
}
4. 修改spring配置文件
l 在AppBeanContext.xml最终增加
14、中增加:
16、控制是否必填必需填写进项抵扣凭证。 2.2 数据库脚本 V0.8有变更 2.3 相关表类及hbm文件更新 l BaseTRmbsClaim.java //营改增增加字段 /** 是否含进项抵扣凭证 **/ private java.lang.StringisHasVoucher; /** 协议价款 **/ private java.math.BigDecimalcontractPriceAmount; /** 协议税款 **/ private java.math.BigDecimalcontractTaxAmount; /** 协议累计价款 **/
17、 private java.math.BigDecimalcontractAccumPriceAmount; /** 协议累计税款 **/ private java.math.BigDecimalcontractAccumTaxAmount; /** 供给商税务资质 **/ private java.lang.StringvendorTaxQuality; /** 价款 **/ private java.math.BigDecimalpriceAmount; /** 进项税款 **/ private java.math.BigDecimalinputTaxA
18、mount;
/** 销项税额 **/
private java.math.BigDecimaloutputTaxAmount;
/** 认证状态,0-未认证,1-认证成功,2-认证不成功(含部分成功) **/
private java.lang.StringinvoiceAuthState;
l TRmbsClaim.hbm.xml
19、0-没有,1-有
20、 name="CONTRACT_TAX_AMOUNT" precision="20" scale="4">
21、
22、
25、 /** 进项税款 **/ private java.math.BigDecimalinputTaxAmount; /** 价款 **/ private java.math.BigDecimalpriceAmount; /** 是否视同销售,1-视同销售 **/ private java.lang.StringisEquateSale; /** 销项税率 **/ private java.math.BigDecimaloutputTaxRate; /** 销项税额 **/ private java.math.BigDecimaloutputTaxAmo
26、unt;
l TRmbsClaimLine.hbm.xml
27、e="4">
30、现 描述 文件 com.ibm.org.reimbursement.service.tvatinvoice:抵扣联凭证service WebRoot/templates/tvatinvoice:抵扣联凭证页面 WebRoot/rmbs/claimprint/paste.jsp:抵扣联附件 src/com/ibm/org/reimbursement/pojo/hbm/TVatInvoiceauth.hbm.xml:抵扣发票联hbm src/com/ibm/org/reimbursement/pojo/TVatInvoiceauth.java:抵扣发票联pojo
31、 2.5 税率字段页面展示 为了实现税率字段页面以百分数显示(),数据库使用小数保留。需要根据步骤操作: 1. 在src/com/ibm/org/reimbursement/util/下新增加一个类。 2. 修改类src/com/ibm/org/reimbursement/util/ActionXMLTransformer.javafldType2ForegroundVarType方法,增加蓝色部分代码以下: /** * 将字段类型转换为前台XML类型。 * @param fldType * @return */ private String fldTy
32、pe2ForegroundVarType(String fldType) { TypeConversion tc = new TypeConversion(); if( fldType.equals(ItemFldTransformer.FLD_TYPE_INTEGER)) //整型 { return "int"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_PERCENT)){ //百分型 return "com.ibm.org.reimbursement.util.Percent";
33、 }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_DATETIME)){ //时间类型 return "java.util
34、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/ClaimRecordPrivilege.javafldType2ForegroundVarType方法,增加蓝色部分代码以下: private String fldType2Foreground
35、VarType(String fldType) { if( fldType.equals(ItemFldTransformer.FLD_TYPE_INTEGER)) //整型 { return "int"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_PERCENT)){ //百分型 return "com.ibm.org.reimbursement.util.Percent"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DEC
36、IMAL)){ //浮点型 return "java.math.BigDecimal"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DATE)){ //日期类型 return "java.util.Date"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_DATETIME)){ //时间类型 return "java.util.Date"; }else if(fldType.equals(ItemFldTransformer.FLD
37、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_PERCENT = "7"; 在方法中增加蓝色代码以下: /** * 将一个字符串类型值,根据字段类型转换成对应类型。 * @param strValue * @pa
38、ram fldType * @return */ public static Object convertString2Object(String strValue,String fldType) { TypeConversion tc = new TypeConversion(); if( fldType.equals(FLD_TYPE_INTEGER)) //整型 { return tc.string2Integer(strValue); }else if(fldType.equals(ItemFldTransformer.FLD_TYP
39、E_PERCENT)){ //百分型 return tc.string2Percent(strValue); }else if(fldType.equals(FLD_TYPE_DECIMAL)){ //浮点型 return tc.string2Bigdecimal(strValue); }else if(fldType.equals(FLD_TYPE_DATE)){ //日期类型 return tc.string2Date(strValue); }else if(fldType.equals(FLD_TYPE_DATETIME)){ //时间类型
40、 return tc.string2Date(strValue); }else if(fldType.equals(FLD_TYPE_LONG)){ //长整型 return tc.string2Long(strValue); }else{ //字符串类型 return strValue; } } 5. 修改类src/com/ibm/org/reimbursement/util/RecordPrivilege.javafldType2ForegroundVarType方法,增加蓝色部分代码以下: private String fldType
41、2ForegroundVarType(String fldType) { TypeConversion tc = new TypeConversion(); if( fldType.equals(ItemFldTransformer.FLD_TYPE_INTEGER)) //整型 { return "int"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_PERCENT)){ //百分型 return "com.ibm.org.reimbursement.util.Percent";
42、}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_DATETIME)){ //时间类型 return "java.util.D
43、ate"; }else if(fldType.equals(ItemFldTransformer.FLD_TYPE_LONG)){ return "java.lang.Long"; }else{ //字符串类型 return "java.lang.String"; } } 6. 修改类src/com/ibm/org/reimbursement/util/TypeConversion.javaobject2String和string2Object方法,并增加新方法string2Percent,以下蓝色部分代码: /** * 将对象转换为字符串
44、 * @param obj * @return */ public String object2String(Object obj,String fldType) { if( obj == null ) return ""; if( obj instanceof String) return obj.toString(); else if( obj instanceof java.lang.Integer ) return obj.toString(); else if( obj instanceof java.math
45、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.org.reimbursement.util.Percent")) return (new com.ibm.org.reimbursement.util.Percent((java.mat
46、h.BigDecimal)obj)).toPercentString(); else if(obj instanceof java.math.BigDecimal&& fldType!=null && fldType.equals("##.####")) return (new java.text.DecimalFormat("0.0000").format(obj)).toString(); else if(obj instanceof java.math.BigDecimal) return (new java.text.DecimalFormat("0.
47、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!=null && fldType.equals("5")) return DateUtil.dateFormat(obj,"yyyy-MM-dd HH:mm:ss"); else
48、 if( obj instanceof java.util.Date) return DateUtil.dateFormat(obj, "yyyy-MM-dd"); else return obj.toString(); } /** * 将字符串类型根据类型转换为对应Object * @param strValue * @param classType * @return */ public Object string2Object(String strValue,String classType) { if( c
49、lassType == 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(strValue).toBigDecimal(); else if(classType.toLowerCase().equals("java.math.bigdecimal")) r






