用友软件股份有限公司82号工程师861如何实现代付税问题来源:4006客户热线用户问题:用户今年起,个人所得税的扣税方式由代扣税改为代付税,但由于用户使用的是861版本,因此无法实现用户的要求。经过多次沟通,建议用户做升级处理,但用户不打算升级,并要求用友公司出相关的补丁进行解决。由于上述原因,最终给用户一个变通实现的方法进行解决,且用户表示满意。问题描述解决此问题的关键点1、代付税下的计税收入中,是不包含代扣的个人所得税的。也就是说,如果没有其他扣款项,则实发合计与应发合计是相等的。问题分析解决此问题的关键点2、代付税下的扣款合计中不应该包括代付税的金额。问题分析解决此问题的关键点3、代付税的计算方法与代扣税的计算方法是不一样的。代扣税的计算工式:应纳税额=应纳税所得额x税率-速算扣除数代付税的计算工式:应纳税额=(应纳税所得额-速算扣除数)x税率/(1-税率)-速算扣除数问题分析解决此问题的关键点4、代付税与代扣税税率表不一样。代扣税的税率表代付税的税率表问题分析各个击破1、针对问题一,可以通过新增工资项目及相应计算公式来解决。实发合计正常的公式为:应发合计-扣款合计;但由于在计算代付税时,计税收入本身就是不包含所得税的,所以实发合计中,应将其扣减的代扣税加回。修改后的实发合计公式为:应发合计-扣款合计+代扣税;可以解决,但是因实发合计为系统项目,每次设置工资项时,系统会将该工资项目恢复到系统默认的公式。因此,只能新增一个代付税实收合计工资项目,增减项设置为“其他”,公式设置为:实发合计+代扣税。问题解决各个击破按照要求设置的结果如图:问题解决各个击破2、针对问题二,其处理方式同实发合计的处理方式一样。新增一个“扣款总计”,公式设置为:扣款合计-代扣税。设置后,如图:问题解决各个击破3、针对问题三,解决起来有点困难。软件计算所得税的算法是按代扣税的方法计算的,且计算方法无法修改,其由程序代码控制。是不是有其他的办法呢?设:S1:应税收入(代扣税收入)S2:应税收入(代付税收入)T:为应纳个人所得税额;R1:个人所得税税率(代扣税)R2:个人所得税税率(代付税)F1:速算扣除数(代扣税)F2:速算扣除数(代付税)问题解决各个击破代扣税法下的个人所得税计算公式用上述假设的变量代入后,得到如下公式:T=S1*R1-F1其中:S1=S2+T;将其代入等式,得到如下结果:T=(S2+T)*R1-F1重新求解T,得到结果如下:T=S2*R1/(1-R1)-F1/(1-R1)令:R2=R1/(1-R1);F2=F1/(1-R1)得到新的公式:T=S2*R2-F2问题解决各个击破T=S2*R2-F2;此公式与代扣税法的计算方式相同,但税率和速算扣除数发生的变化,因此须要重新设置税率表中相应的税率和速算扣除数。设置方法:R2=R1/(1-R1);F2=F1/(1-R1)例:代扣税法下,如果R1=10%,则其对应的F1=25;修改后的值为:R2=1/(1-0.01)=11.11%;F2=25/(1-0.01)=27.78;以此类摊,重设置税率表;问题解决各个击破4、针对问题四,此问题比较好解决,直接手工按照代付税的所得额的范围进行修改个人所得税税率表即可。经过前面对税率、速算扣除数及所得额的范围的修改,得到的最终须要的税率表,如图:问题解决得到结果经过上述设置,并重新计算工资数据后,得的结果基本符合用户的要求,如图:问题解决新的问题经过上述设置,并重新计算工资数据后,虽能算出代付税金额,但结果与手工计算是有差异的,上例中的代付税金额为325.08,正确的解果应为325.00,为何会产生这种现象?问题解决最终结果数据表中相关的数据,只有小数点后两位,但查看数据表该字段并没有限制,手工在此处修改数据到小数点后四后,计算的出来的结果正确。如图:问题解决须要注意的事项考虑到让用户手工修改wa_sds_sl表,有风险,且工作量很大。特写了一个脚本,进行批量更改。脚本如下:要求执行脚本前先做数据备份问题解决--先指定须要修改的账套数据库名useufdata_XXX_XXXXdeclare@gzgradenamechar(20),@periodint,@iflagslint,@iflagsskcsint--先指定须要修改的工资类别set@gzgradename='XXX'selecttop1@period=iperiodfromgl_mendwherebflag_wa=0orderbyiperiodselecttop1@iflagsl=islfromwa_sds_slwherecgzgradenum=@gzgradenameandperiod=@periodandisl_id=2selecttop1@iflagsskcs=ysskcsfromwa_sds_slwherecgzgradenum=@gzgradenameandperiod=@periodandisl_id=2if@iflagsskcs=25beginupdatewa_sds_slsetysskcs=ysskcs*100/(100-isl)wherecgzgradenum=@gzgradenameandperiod>=@periodendif@iflagsl=10beginupdatewa_sds_slsetisl=100*isl/(100-isl)wherecgzgradenum=@gzgradenameandperiod>=@periodend