用Pyhon做个税筹划

           这是给公司做的个税筹划代码,原来是在excel上写的vba,现在写成Python感觉更清晰了,基本原理是确定一个年薪,然后找到总体税赋最低的月薪和年终奖之间的分配组合。笔者利用该套程序为单位节约个人所得税越780万(同比去年),够屌丝们去三亚爆炒12个黑木耳了。


(由于每个地区个税政策不太一样,以下代码仅供参考,出了问题概不负责)


# -*- coding: utf-8 -*-
"""
Created on Fri Apr 05 10:16:29 2013

@author: zzcwing
"""
from __future__ import division
import types
class income_tex:
    texrid={}
    qzd=0
    jd=0
    def __init__(self):
        #初始化纳税层级
        self.texrid={0:[0,0,0],1500:[0.03,0,1],4500:[0.1,105,2],9000:[0.2,555,3],35000:[0.25,1005,4]\
                ,55000:[0.30,2755,5],80000:[0.35,5505,6],80001:[0.45,13505,7]}
        #个税起征点
        self.qzd=3500
        #税收筹划的精度(迭代步长)
        self.jd=100
    def numbercheck(self,data): #判断是否数字类型
        try:        
            #self.data=data
#            print self.data
            if type(data) is types.IntType:
                return data
            elif type(data) is types.LongType:
                return data
            elif type(data) is types.FloatType:
                return data
            elif type(data) is types.LongType:
                return data
            elif type(data) is types.ComplexType:
                return data
            else:
                print 'wrong type in float number---in position def numbercheck'
                quit()
        except:
            print 'wrong type contains----in position def numbercheck'
            quit()
    def at(self,tqzd): #根据应纳税所得额,确定使用哪一档税率
        res=[]
        if tqzd<=0:
            res=self.texrid[0]
        elif tqzd>0 and tqzd<=1500:
            res=self.texrid[1500]
        elif tqzd>1500 and tqzd<=4500:
            res=self.texrid[4500]
        elif tqzd>4500 and tqzd<=9000:
            res=self.texrid[9000]
        elif tqzd>9000 and tqzd<=35000:
            res=self.texrid[35000]
        elif tqzd>35000 and tqzd<=55000:
            res=self.texrid[55000]
        elif tqzd>55000 and tqzd<=80000:
            res=self.texrid[80000]
        elif tqzd>80000:
            res=self.texrid[80001]
        return res
        
    def mpt(self,mbit):
        atp=[]
        tex_mpt=0
        chbit=self.numbercheck(mbit)
        tqzd=chbit-self.qzd #应纳税所得额=应纳税收入-起征点(应纳税收入=总税前收入-可税前扣除项目(三险一金))
        atp=self.at(tqzd)
        tex_mpt=round(tqzd*atp[0]-atp[1],2)
        return tex_mpt
        
    def ypt(self,ybit,mbit):
        chybit=self.numbercheck(ybit)
        chmbit=self.numbercheck(mbit)
        if chmbit=12 or cyf1>=tic or cyf2>=tic or cyk>cyf1 or cyk>cyf2:
            print "variable is not correct!---in position def bptr"
            return 0;
        wctic=ctic-cys*cyf1 #全年合计收入减去剩余部分
        redict={} #税收合计作为Key,相应的月薪、年终奖、可支配收入作为value
        lr=[]
#        mt=[] #存储所有税前月收入
#        yt=[] #存储所有税前年终奖
#        tt=[] #存储所有合计缴税
        gp=0 #存储所有可支配收入
        ts=0 #存数全年税收
        while True:
            if mic>=wctic:
                break
            else:
                yic=round(wctic-mic*(12-cys),2)
                tmic=mic-cyk
                ts=self.mpt(tmic)*(12-cys)+self.ypt(yic,cyf2)+self.mpt(cyf1-cyk)*cys
                #gp=tmic*(12-cys)+yic+(cyf1-cyk)*cys-ts
                gp=ctic-12*cyk-ts
                lr.append(ts)
                redict[ts]=[mic,yic,ts,gp]
                
                mic+=self.jd
        return redict[min(lr)]
        
if __name__=="__main__":
    it=income_tex()
    dig={}
    
    print u'扣除三险一金后月薪40500,应缴纳个税: ',it.mpt(40500)
    print u'年终奖40500,发放当月月薪30000,应缴纳年终奖个税',it.ypt(405000,30000)
    print '-------------------------------------------------------'
    print u'年薪450000,已发20000月薪,已发月数1个月,每月预计应扣三险一金3650,本年年终奖在次年发放月的月薪为20000'
    print u'以上情况下,本年最佳税收筹划组合'
    
    dtg=it.bptr(450000,20000,1,3650,20000)
    print u"税赋最低的月薪",dtg[0]
    print u"税赋最低的年终奖",dtg[1]
    print u"总体最低税赋为",dtg[2]
    print '-------------------------------------------------------'

运行结果如下:





你可能感兴趣的:(Python)