美文网首页
个税计算器

个税计算器

作者: 卷毛爱胖丁 | 来源:发表于2019-12-28 11:21 被阅读0次
# coding=utf-8
import sys
import argparse


class YiLiao(object):
    Max = 27786
    Min = 5557
    CompanyPercent = 0.10
    PersonalPercent = 0.02
    PersonalExtra = 3


class ShengYu(object):
    Max = 27786
    Min = 5557
    CompanyPercent = 0.008
    PersonalPercent = 0
    PersonalExtra = 0


class GongJiJin(object):
    Max = 27786
    Min = 5557
    CompanyPercent = 0.12
    PersonalPercent = 0.12
    PersonalExtra = 0


class YangLao(object):
    Max = 23565
    Min = 3613
    CompanyPercent = 0.16
    PersonalPercent = 0.08
    PersonalExtra = 0


class ShiYe(object):
    Max = 23565
    Min = 3613
    CompanyPercent = 0.008
    PersonalPercent = 0.002
    PersonalExtra = 0


class GongShang(object):
    Max = 23565
    Min = 4713
    CompanyPercent = 0.02
    PersonalPercent = 0
    PersonalExtra = 0


def nianZhongGeShui(money):
    levels = [
        {
            "min": 0,
            "max": 3000,
            "pc": 0.03,
            "kc": 0,
        }, {
            "min": 3000,
            "max": 12000,
            "pc": 0.1,
            "kc": 210,
        }, {
            "min": 12000,
            "max": 25000,
            "pc": 0.2,
            "kc": 1410,
        }, {
            "min": 25000,
            "max": 35000,
            "pc": 0.25,
            "kc": 2660,
        }, {
            "min": 35000,
            "max": 55000,
            "pc": 0.3,
            "lc": 4410,
        }, {
            "min": 55000,
            "max": 80000,
            "pc": 0.35,
            "kc": 7160,
        }, {
            "min": 80000,
            "max": 100000000000,
            "pc": 0.45,
            "kc": 15160,
        }
    ]
    m = money / 12
    pc = 0
    kouchu = 0
    for l in levels:
        if m > l["min"] and m <= l["max"]:
            pc = l["pc"]
            kouchu = l["kc"]
    shui = money * pc - kouchu
    return shui


def geShui(money):
    levels = [
        {
            "min": 0,
            "max": 36000,
            "pc": 0.03,
        }, {
            "min": 36000,
            "max": 144000,
            "pc": 0.1,
        }, {
            "min": 144000,
            "max": 300000,
            "pc": 0.2,
        }, {
            "min": 300000,
            "max": 420000,
            "pc": 0.25,
        }, {
            "min": 420000,
            "max": 660000,
            "pc": 0.3
        }, {
            "min": 660000,
            "max": 960000,
            "pc": 0.35
        }, {
            "min": 960000,
            "max": 100000000000,
            "pc": 0.45
        }
    ]
    shui = 0
    for l in levels:
        if money <= l["min"]:
            break
        if money > l["min"] and money <= l["max"]:
            shui += (money - l["min"]) * l["pc"]
        if money > l["max"]:
            shui += (l["max"] - l["min"]) * l["pc"]
    return shui


def monthly(monthlyIncome, begin, extra, sheBaoBase, gongJiJinBase):
    print "*" * 50 + " 每月详情 " + "*" * 50
    # 养老保险
    yangLaoBase = max(min(YangLao.Max, monthlyIncome), YangLao.Min) if sheBaoBase == 0 else sheBaoBase
    personalYangLao = yangLaoBase * YangLao.PersonalPercent + YangLao.PersonalExtra
    companyYangLao = yangLaoBase * YangLao.CompanyPercent

    # 工伤保险
    gongShangBase = max(min(GongShang.Max, monthlyIncome), GongShang.Min) if sheBaoBase == 0 else sheBaoBase
    personalGongShang = gongShangBase * GongShang.PersonalPercent + GongShang.PersonalExtra
    companyGongShang = gongShangBase * GongShang.CompanyPercent

    # 生育保险
    shengYuBase = max(min(ShengYu.Max, monthlyIncome), ShengYu.Min) if sheBaoBase == 0 else sheBaoBase
    personalShengYu = shengYuBase * ShengYu.PersonalPercent + ShengYu.PersonalExtra
    companyShengYu = shengYuBase * ShengYu.CompanyPercent

    # 失业保险
    shiYeBase = max(min(ShiYe.Max, monthlyIncome), ShiYe.Min) if sheBaoBase == 0 else sheBaoBase
    personalShiYe = shiYeBase * ShiYe.PersonalPercent + ShiYe.PersonalExtra
    companyShiYe = shiYeBase * ShiYe.CompanyPercent

    # 医疗保险
    yiLiaoBase = max(min(YiLiao.Max, monthlyIncome), YiLiao.Min) if sheBaoBase == 0 else sheBaoBase
    personalYiLiao = yiLiaoBase * YiLiao.PersonalPercent + YiLiao.PersonalExtra
    companyYiLiao = yiLiaoBase * YiLiao.CompanyPercent

    # 住房公积金
    gongJiJinBase = max(min(GongJiJin.Max, monthlyIncome), GongJiJin.Min) if gongJiJinBase == 0 else gongJiJinBase
    personalGongJiJin = gongJiJinBase * GongJiJin.PersonalPercent + GongJiJin.PersonalExtra
    companyGongJiJin = gongJiJinBase * GongJiJin.CompanyPercent

    totalShuiIncome = 0
    totalShui = 0
    shuiqian = monthlyIncome
    shuiIncome = max(0, (
            monthlyIncome - personalYangLao - personalGongShang - personalShengYu - personalShiYe - personalYiLiao - personalGongJiJin - extra - begin))
    print "每月,养老(%.2lf + %.2lf)元, 医疗(%.2lf + %.2lf)元, 失业(%.2lf + %.2lf)元, 公积金(%.2lf + %.2lf) 元, 工伤(%.2lf + %.2lf)元, 生育(%.2lf + %.2lf)元\n应交税部分 %.2lf 元." % (
        personalYangLao, companyYangLao, personalYiLiao, companyYiLiao, personalShiYe, companyShiYe, personalGongJiJin,
        companyGongJiJin, personalGongShang, companyGongShang,
        personalShengYu, companyShengYu,
        shuiIncome)

    yearIncome = 0
    for m in range(1, 13):
        totalShuiIncome += shuiIncome
        geshui = geShui(totalShuiIncome) - totalShui
        totalShui += geshui
        realIncom = shuiqian - personalYangLao - personalGongShang - personalShengYu - personalShiYe - personalYiLiao - personalGongJiJin - geshui
        print "%02d月, 个税 %7.2lf 元, 税后 %.2lf 元" % (m, geshui, realIncom)
        yearIncome += realIncom
    print "全年累计税后收入 %.2lf 元, 公积金 %.2lf 元" % (yearIncome, (personalGongJiJin + companyGongJiJin) * 12)
    print "=" * 110 + "\n"
    return yearIncome, (personalGongJiJin + companyGongJiJin) * 12, totalShui


def nz(monthlyFee, th):
    print "*" * 50 + "  年终奖  " + "*" * 50
    nianzhong = th * monthlyFee
    nianZhongShui = nianZhongGeShui(nianzhong)
    realNianzhong = nianzhong - nianZhongShui
    print "%d 个月年终奖 %.2lf 元,个税 %.2lf 元,税后所得 %.2lf 元" % (th, nianzhong, nianZhongShui, realNianzhong)
    print "=" * 110 + "\n"
    return realNianzhong, nianZhongShui


if __name__ == '__main__':
    begin = 5000  # 个税起征点

    arg_parser = argparse.ArgumentParser()
    arg_parser.add_argument('-m', '--monthlyIncome', default=10000, type=float, help="月薪")
    arg_parser.add_argument('-c', '--cnt', default=3, help='年终奖/月薪', type=float)
    arg_parser.add_argument('-e', '--extra', default=0, help='个税附加扣除', type=float)
    arg_parser.add_argument('-s', '--sheBaoBase', default=0, help='社保基数', type=float)
    arg_parser.add_argument('-g', '--gongJiJinBase', default=0, help='公积金基数', type=float)
    args = arg_parser.parse_args(sys.argv[1:])

    afterShuiIncome, gongjijin, totalShui = monthly(args.monthlyIncome, begin, args.extra, args.sheBaoBase,
                                                    args.gongJiJinBase)
    realNianZhong, nianzhongShui = nz(args.monthlyIncome, args.cnt)
    print "*" * 50 + "   汇总   " + "*" * 50
    print "月薪 %.2lf 元, %d 薪\n" \
          "税前年收入 %.2lf 元\n" \
          "年度总个税 %.2lf 元\n" \
          "年税后收入 %.2lf 元, 年终奖 %.2lf 元, 公积金可提取 %.2lf 元, 合计 %.2lf 元" % (
              args.monthlyIncome,
              (12 + args.cnt),
              args.monthlyIncome * (12 + args.cnt),
              totalShui + nianzhongShui,
              afterShuiIncome,
              realNianZhong,
              gongjijin,
              afterShuiIncome + realNianZhong + gongjijin
          )
    print "=" * 110 + "\n"

相关文章

网友评论

      本文标题:个税计算器

      本文链接:https://www.haomeiwen.com/subject/dhqsoctx.html