本文会出版在我2020年下半年的新书《Python法律应用实务》(暂用名)中。本文主要提供思路,完整代码会在新书中呈现。
劳动人事法律领域,属于规则条款很明晰,但是实际处理起来又有许多复杂重复的工作。许多公司甚至需要安排专门的人事和法务来处理,如果法务被人事工作纠缠太久,往往会影响到整体的工作,对公司来说是得不偿失的。
这里,笔者就将常见的劳动领域的纠纷和事务工作,通过程序化的思维,来实现部分的自动化处理。
病假工资费用计算
病假工资是比较重要的一个人力管理事项,一般来说普遍的原则是病假工资不得低于当地最低工资标准的80%。至于计算方法,各地有各地的细则,也可能没有相应的地方性规定。由于笔者在上海执业,且上海地区2004年出了一个《上海市劳动和社会保障局关于病假工资计算的公告》,这里就以该文件为设计样本,来设计上海市地区病假工资计算方法,其他地区的,可以参照类推设计。
需要注意的是,在具体程序编写的过程当中,笔者发现该规定的表述并不是很严谨,尤其是在涉及一些计算的边际的时候,没有作出规范的表述。比如:工龄是算到病假开始日还是结束日。
因此,依据该规范的,从实务的角度上,以参考为主,如果直接使用其中的数据,在法律上应该也不会有太大问题,读者可以自行调整参数或者代码。
上海市劳动和社会保障局关于病假工资计算的公告
一、病假待遇
疾病休假工资标准:
职工疾病或非因工负伤连续休假在6个月以内的,企业应按下列标准支付疾病休假工资:
1、连续工龄不满2年的,按本人工资的60%计发;
2、连续工龄满2年不满4年的,按本人工资70%计发;
3、连续工龄满4年不满6年的,按本人工资的80%计发;
4、连续工龄满6年不满8年的,按本人工资的90%计发;
5、连续工龄满8年及以上的,按本人工资的100%计发。
疾病救济费标准:
职工疾病或非因工负伤连续休假超过6个月的,由企业支付疾病救济费:
1、连续工龄不满1年的,按本人工资的40%计发;
2、连续工龄满1年不满3年的,按本人工资的50%计发;
3、连续工龄满3年及以上的,按本人工资的60%计发。
注:
职工疾病或非因工负伤休假日数应按实际休假日数计算,连续休假期内含有休息日、节假日的应予剔除。
职工疾病或非因工负伤待遇高于本市上年度月平均工资的,可按本市上年度月平均工资计发。
职工疾病或非因工负伤休假待遇低于本企业月平均工资40%的,应补足到本企业月平均工资的40%,但不得高于本人原工资水平、不得高于本市上年度职工月平均工资。
企业月平均工资的40%低于当年本市企业职工最低工资标准的80%,应补足到当年本市企业职工最低工资标准的80%。
企业职工疾病休假工资或疾病救济费最低标准不包括应由职工缴交的养老、医疗、失业保险费和住房公积金。
二、病假工资基数的确定
在制度工作日内请病假的日工资计算:按以下原则确定的计算基数除以发生当月的计薪日。
1、劳动合同有约定的,按不低于劳动合同约定的劳动者本人所在岗位(职位)相对应的工资标准确定。集体合同(工资集体协议)确定的标准高于劳动合同约定标准的,按集体合同(工资集体协议)标准确定。
2、劳动合同、集体合同均未约定的,可由用人单位与职工代表通过工资集体协商确定,协商结果应签订工资集体协议。
3、用人单位与劳动者无任何约定的,假期工资的计算基数统一按劳动者本人所在岗位(职位)正常出勤的月工资的70%确定。
按以上原则计算的假期工资基数均不得低于本市规定的最低工资标准。法律、法规另有规定的,从其规定。
上海市劳动和社会保障局
二00四年十一月一日
程序整体不复杂,关键是将法规含义进行一个转换。下面直接呈上部分代码,如果有错误地方,欢迎与笔者联系。
def sick_wage(_wage,startDay,endDay,days, corp_ava_wage=0,ava_wage=7216.51,lowest_wage=2480): #_wage劳动者工资 startDay 开始工作的日子即工龄开始的日期,days病假的天数,endDay病假的截止日
wage=_wage*0.7 #用人单位与劳动者无任何约定的,假期工资的计算基数统一按劳动者本人所在岗位(职位)正常出勤的月工资的70%确定。
# ava_wage=7216.51 #上一年度月平均工资
# lowest_wage=2480 #当地最低工资,这里以上海2020年最低工资2480为例子
if wage
wage=lowest_wage
timeArray = time.strptime(startDay, "%Y-%m-%d")
print(timeArray.tm_year) # 2019
startDay_timeStamp = int(time.mktime(timeArray))
timeArray = time.strptime(endDay, "%Y-%m-%d")
print(timeArray.tm_year) # 2019
endDay_timeStamp = int(time.mktime(timeArray))
days_gap=(endDay_timeStamp-startDay_timeStamp)/(24*3600) #截至到病假最后一天工龄的天数
if days_gap < 365 * 2:
ratio1 = 0.6
elif days_gap >= 365 * 2 and days_gap < 365 * 4:
ratio1 = 0.7
elif days_gap >= 365 * 4 and days_gap < 365 * 6:
ratio1 = 0.8
elif days_gap >= 365 * 6 and days_gap < 365 * 8:
ratio1 = 0.9
elif days_gap >= 365 * 8:
ratio1 = 1
此处隐藏中间业务代码,得到最后计算的数据amount后,利用Decimal进行十进制处理,保留两位小数精度。
amount=Decimal(amount).quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
result={"开始工作的日期":startDay,"病假结束日期": endDay,'病假的天数':days,"病假工资累计":float(amount)}
return result
运行测试:
data=sick_wage(7800,'2017-04-01', '2018-03-15' ,100,corp_ava_wage=5000,ava_wage=7220)
print('data:',data)
-------------------------------
data: {'开始工作的日期': '2017-04-01', '病假结束日期': '2018-03-15', '病假的天数': 100, '病假工资累计': 15062.07}
sick_wage()参数解释:
- _wage: 必须,员工正常月工资
- startDay:必须,员工入职日期
- endDay:必须。病假结束日期
- days:病假天数
- corp_ava_wage:企业平均工资,非必须,默认值为0
- ava_wage:上年度本低平均工资,非必须,默认值为7216.51
- lowest_wage:当地最低工资标准,非必须,默认值为2480
- _pre1,_pre2是六个月以内和六个月以上,工资乘以系数后,与最低和最高标准比较后取的值
1、通过病假结束日期和员工入职日期,计算工龄days_gap(随意取的变量名字,表示入职到病假结束的天数)。
2、通过文件指引,病假算法需区分六个月以内和六个月以上,六个月以内企业支付的是病假工资,病休假在六个月以上的部分,称之为救济费,计算的系数是不同的。
3、startDay和endDay分别比代表入职日期和病假结束日期,日期格式要求是year-month-date,中间以“-”分割,否则会报错。
4、无论是_pre1,还是_pre2,根据文件的内容,如果低于企业平均工资的四折,以四折计,如果企业平均工资的四折高于其本来工资,就取其本来工资:
if _pre2 < corp_ava_wage * 0.4: # 职工疾病或非因工负伤休假待遇低于本企业月平均工资40%的,应补足到本企业月平均工资的40%,但不得高于本人原工资水平、不得高于本市上年度职工月平均工资。
_pre2 = corp_ava_wage * 0.4
if _pre2 > wage:
_pre2 = wage
如果_pre1或者_pre2,低于当地最低工资的八折,就取当地最低工资八折:
if _pre2 < lowest_wage * 0.8:
_pre2 = lowest_wage * 0.8
如果_pre1或者_pre高于本市上年度月平均工资的,可按本市上年度月平均工资计发:
if _pre2>ava_wage:
_pre2=ava_wage
作者原创,非经授权拒绝转载,违者必究。
作者:虞元坚 上海正策律师事务所 律师 全栈网络工程师/法律大数据应用领域专家。擅长领域:争议解决与诉讼、与软件开发和互联网相关的知识产权、不正当竞争、经济犯罪、科技产业投融资等。欢迎关注法律大数据公众号,和律师朋友们都在使用的随身工具——律师云助理。