首页 > 其他分享 >个人代码分享-工薪收入计算

个人代码分享-工薪收入计算

时间:2023-04-21 17:44:07浏览次数:31  
标签:None 工薪 int 代码 FundItem base5 分享 self def

python3小工具,计算工资年收入。
注意默认是5险1金拉满,个税月起征点是5000元
输入参数中的地区年平均收入可以在网上查,比如查“社保基数”,一般里面会提年平均收入
用法:安装python3并配好环境变量,在cmd中定位到脚本所在目录,执行:
python after_tax_income.py 月薪 月数 当地年平均收入

import sys
import tkinter as tk

class TaxLevel:
    def __init__(self, min:int, max:int, rate:float, fastNum:int) -> None:
        self.min = min
        self.max = max
        self.rate = rate
        self.fastNum = fastNum

TaxTable=[
    TaxLevel(-sys.maxsize, 0, 0, 0),
    TaxLevel(0, 36000, 0.03, 0),
    TaxLevel(36000, 144000, 0.1, 2520),
    TaxLevel(144000, 300000, 0.2, 16920),
    TaxLevel(300000, 420000, 0.25, 31920),
    TaxLevel(420000, 660000, 0.3, 52920),
    TaxLevel(660000, 960000, 0.35, 85920),
    TaxLevel(960000, sys.maxsize, 0.45, 181920),
]

def FindTaxLevel(table:list[TaxLevel], ratal:int)->TaxLevel:
    for lv in table:
        if ratal > lv.min and ratal <= lv.max:
            return lv
    
    raise LookupError(f"找不到纳税额->{ratal}<-对应的税率区间")

def CalcTax(table:list[TaxLevel], income:int, deduct:int)->int:
    ratal = income - deduct
    taxLv = FindTaxLevel(table, ratal)
    tax = ratal * taxLv.rate - taxLv.fastNum
    return tax

class FundItem:
    def __init__(self, companyRate:float=0, companyAdd:int=0, selfRate:float=0, selfAdd:int=0) -> None:
        self.companyRate = companyRate
        self.companyAdd = companyAdd
        self.selfRate = selfRate
        self.selfAdd = selfAdd

    def GetCompanySum(self, companyBase:int)->float:
        return self.companyRate * companyBase + self.companyAdd
    
    def GetSelfSum(self, selfBase:int)->float:
        return self.selfRate * selfBase + self.selfAdd

class Fund51:
    def __init__(self, base5:int=0, base1:int=0, old:FundItem=None, medical:FundItem=None, job:FundItem=None, hurt:FundItem=None, birth:FundItem=None, house:FundItem=None) -> None:
        self.base5 = base5
        self.base1 = base1
        self.old = old or FundItem()
        self.medical = medical or FundItem()
        self.job = job or FundItem()
        self.hurt = hurt or FundItem()
        self.birth = birth or FundItem()
        self.house = house or FundItem()
    
    def GetCompanySum(self)->float:
        return self.old.GetCompanySum(self.base5) + self.medical.GetCompanySum(self.base5) + self.job.GetCompanySum(self.base5) + self.hurt.GetCompanySum(self.base5) + self.birth.GetCompanySum(self.base5) + self.house.GetCompanySum(self.base1)

    def GetSelfSum(self)->float:
        return self.old.GetSelfSum(self.base5) + self.medical.GetSelfSum(self.base5) + self.job.GetSelfSum(self.base5) + self.hurt.GetSelfSum(self.base5) + self.birth.GetSelfSum(self.base5) + self.house.GetSelfSum(self.base1)

class TaxDeduct:
    def __init__(self, children:int, edu:int, illness:int, house:int, rent:int, old:int, baby:int) -> None:
        self.children = children
        self.edu = edu
        self.illness = illness
        self.house = house
        self.rent = rent
        self.old = old
        self.baby = baby
    
    def GetSum(self)->int:
        return self.children + self.edu + self.illness + self.house + self.rent + self.old + self.baby

class Income:
    def __init__(self, monthIncome:int, monthCount:int, extraAdd:int, monthThreshold:int, deduct:TaxDeduct, fund:Fund51) -> None:
        self.monthIncome = monthIncome
        self.monthCount = monthCount
        self.extraAdd = extraAdd
        self.monthThreshold = monthThreshold
        self.deduct = deduct
        self.fund = fund
    
    def Calc(self)->None:
        calcMonthCount = min(self.monthCount, 12)
        self.BeforeTaxIncome = self.monthIncome * self.monthCount + self.extraAdd
        self.CompanyFundSum = self.fund.GetCompanySum() * calcMonthCount
        self.FundSum = self.fund.GetSelfSum() * calcMonthCount
        self.ThresholdSum = self.monthThreshold * calcMonthCount
        self.DeductSum = self.deduct.GetSum() * calcMonthCount

        self.TaxDeduct = self.ThresholdSum + self.DeductSum + self.FundSum
        self.Tax = CalcTax(TaxTable, self.BeforeTaxIncome, self.TaxDeduct)
        self.AfterTaxIncome = self.BeforeTaxIncome - self.Tax
        self.AfterTaxFundIncome = self.AfterTaxIncome - self.FundSum

    def Print(self)->None:
        print(f"月薪:{self.monthIncome},月数:{self.monthCount},社保基数:{self.fund.base5:.2f},公积金基数:{self.fund.base1:.2f}, 年度总和:税前:{self.BeforeTaxIncome},五险一金个人:{self.FundSum:.2f},五险一金公司:{self.CompanyFundSum:.2f},免征税:{self.ThresholdSum},专项扣除:{self.DeductSum},个税:{self.Tax:.2f},税后:{self.AfterTaxIncome:.2f},税后不含五险一金:{self.AfterTaxFundIncome:.2f}")

class DataHelper:
    def CreateDefaultFund51()->Fund51:
        old = FundItem(companyRate=0.2, companyAdd=0, selfRate=0.08, selfAdd=0)
        medical = FundItem(companyRate=0.1, companyAdd=0, selfRate=0.02, selfAdd=3)
        job = FundItem(companyRate=0.01, companyAdd=0, selfRate=0.002, selfAdd=0)
        hurt = FundItem(companyRate=0.02, companyAdd=0, selfRate=0, selfAdd=0)
        birth = FundItem(companyRate=0.008, companyAdd=0, selfRate=0, selfAdd=0)
        house = FundItem(companyRate=0.12, companyAdd=0, selfRate=0.12, selfAdd=0)

        inst = Fund51(old=old, medical=medical, job=job, hurt=hurt, birth=birth, house=house)
        return inst

# test
len = len(sys.argv)
if len<4:
    print("输入月薪、月数、地区年平均收入")
else:
    monthIncome = int(sys.argv[1])
    monthCount = int(sys.argv[2])

    general = int(sys.argv[3])
    base5 = max(general*0.6/12, monthIncome)
    base5 = min(base5, general*3/12)
    base1 = monthIncome

    fund51 = DataHelper.CreateDefaultFund51()
    fund51.base1 = base1
    fund51.base5 = base5
    testIncome = Income(monthIncome,monthCount,0,5000,TaxDeduct(0,0,0,0,0,0,0),fund51)
    testIncome.Calc()
    testIncome.Print()

标签:None,工薪,int,代码,FundItem,base5,分享,self,def
From: https://www.cnblogs.com/axun1992/p/17341244.html

相关文章

  • 类的memory以及抽象类继承学习(含测试代码)
    #include<iostream>#include<cstdio>#include<queue>#include<vector>#definelllonglongusingnamespacestd;/*注意:输出不同可能对齐参数或者编译器不同有关。*///模板类输出方法template<classT>intsize(Tlim){returnsizeof(lim);}/*......
  • “露天煤矿现场调研和交流案例分享”在CSDN发表,两次审核未通过,判定:全篇涉及广告
       我在博客园发布了:露天煤矿现场调研和交流案例分享。后台分享到了CSDN,结果判定为:全篇涉及广告。我要是真能写出来全篇涉及广告的文章,也算我能力比较强,就算是让ChatGPT可能也写不出来吧。   这种坐在办公室的小白人员来审核,简直也是无语了。   也不知道是不......
  • 分享自己接私活常用的开源系统
    目前使用的是JNPF框架。技术栈上使用的SpringBoot、SpringCloud、SpringWeb、MyBatis、Swagger、Vue、Element。这些都是比较主流的技术,无论是技术层面的先进性还是学习难度都是比较低的,目前网络上有大量可供参考学习的资料。并且它支持前后端分离和微服务的版本,算是比较完善......
  • WCF教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介Windows通讯开发平台(WindowsCommunicationFoundation,简称WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows通讯开发平台。整合了原有的windows通讯的.netRemoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布......
  • Vue3 代码块高亮显示并可使用富文本编辑器编辑(highlight.js + wangEditor)
    在Vue项目中实现以下功能:  功能1.在页面中显示代码,并将其中的关键字高亮显示。  功能2.允许对代码块进行编辑,编辑时代码关键字也高亮显示。  功能3.可在编辑器中添加多个代码块,动态渲染代码关键字高亮。 Step1:安装所需插件(本文使用npm安装,若需使用其他方式请查......
  • phpStorm自定义快捷键,输出代码块,模板
    在开发过程中经常需要打印数据调试,var_dump()或print_r都没办法直观的查看数据,我一般用如下代码打印数据,但是每次手动输入又麻烦,所以设置一个快捷键就能输出一下代码,岂不是一劳永逸:1.进入设置对话框:File->Setting2.接下自定义快捷键:按一下步骤操作完,点击"ok"键![在这......
  • 无代码调整聚类热图分支顺序
    聚类热图根据不同的聚类算法和距离计算方式,获得的热图分支结构会有一些不同。有时,我们也希望能在不改变分支结构的基础上,对热图分支的顺序进行一些调整,这就是推文聚类热图怎么按自己的意愿调整分支的顺序?的出发点。现在这个功能也搬到了BIC平台,具体怎么做呢?采用之前的绘图数据采用......
  • 无代码绘制基因表达箱线图
    给定一个基因表达矩阵和样本分组信息,如何绘制样品整体表达箱线图、单个或多个基因表达箱线图。获取示例数据我们从中截取前面4行作为演示例子。利用工具WidetoLong把表达矩阵转换为长表格把数据表粘贴到http://www.ehbio.com/Cloud_Platform/front/#/analysis?page=b%27OA%3D%3D%......
  • 我是不会运行你的代码吗?不,我是不会导入自己的数据!
    常常遇到有人问起看到分享的教程导入数据的方式是data(dune)等直接调用系统的数据,而自己怎么读入自己的数据呢?对于初学者来讲,这确实是个问题。如何准备数据、拿到正确格式的数据并导入后续的代码进行分析,是学习和应用过程中的第一个拦路虎。为什么教程会习惯使用内置数据?简单省事、......
  • 7-8 估值一亿的AI核心代码
    题目描述:以上图片来自新浪微博。本题要求你实现一个稍微更值钱一点的AI英文问答程序,规则是:无论用户说什么,首先把对方说的话在一行中原样打印出来;消除原文中多余空格:把相邻单词间的多个空格换成1个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;把原文中所有大......