Python劳动人事领域处理病假工资——以上海标准为例

举报
虞元坚律师 发表于 2021/01/27 09:49:43 2021/01/27
【摘要】 劳动人事法律领域,属于规则条款很明晰,但是实际处理起来又有许多复杂重复的工作。许多公司甚至需要安排专门的人事和法务来处理,如果法务被人事工作纠缠太久,往往会影响到整体的工作,对公司来说是得不偿失的。这里,笔者就将常见的劳动领域的纠纷和事务工作,通过程序化的思维,来实现部分的自动化处理。病假工资费用计算病假工资是比较重要的一个人力管理事项,一般来说普遍的原则是病假工资不得低于当地最低工资标准的...

劳动人事法律领域,属于规则条款很明晰,但是实际处理起来又有许多复杂重复的工作。许多公司甚至需要安排专门的人事和法务来处理,如果法务被人事工作纠缠太久,往往会影响到整体的工作,对公司来说是得不偿失的。

这里,笔者就将常见的劳动领域的纠纷和事务工作,通过程序化的思维,来实现部分的自动化处理。

病假工资费用计算
病假工资是比较重要的一个人力管理事项,一般来说普遍的原则是病假工资不得低于当地最低工资标准的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<lowest_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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。