HR薪酬权限控制

需求描述:人员“张三”的人事调动如表所示:
在这里插入图片描述

人事范围为A的负责人查看张三的薪资信息时,只能看到张三2010年和2012年的相关记录,不能查看2011年的薪资信息。

PA20、PA30权限控制
首先查看基本工资表PA0008,人员号80000054有3条数据;
在这里插入图片描述
执行PA20,查看基本工资
在这里插入图片描述
在这里插入图片描述
只能显示一条相关数据,有两条数据被过滤掉。

解决方法:

1)启用BADI HRPAD00AUTH_CHECK,并将里面涉及到的所有方法及类的声明等根据标准类CL_HRPAD00AUTH_CHECK_STD(通过SE80查看)重新复写。
在这里插入图片描述
找到方法CHECK_AUTHORIZATION,在复制完源代码基础上,添加代码

export zpernr from pernr to MEMORY id 'zpernr'.

2)找到方法CONSIDER_SY_DATUM,在代码的59行会调用方法consider_sy_datum_exit,重写此方法的代码。


METHOD if_ex_hrpad00auth_time~consider_sy_datum_exit.

DATA: BEGIN OF lw_date,
        begda TYPE pa0001-begda,
        endda TYPE pa0001-endda,
      END OF lw_date,
      BEGIN OF lw_werks,
        pernr TYPE pa0001-pernr,
        werks TYPE pa0001-werks,
        begda TYPE pa0001-begda,
        endda TYPE pa0001-endda,
      END OF lw_werks.
DATA: l_pernr TYPE rp50g-pernr,
      l_per   TYPE rp50g-pernr,
      l_infty TYPE t582a-infty.
DATA: lt_werks LIKE TABLE OF lw_werks,
      lt_pernr LIKE TABLE OF lw_werks,
      lw_pernr LIKE lw_werks,
      lw_period TYPE hrperiods.

  IF sy-tcode(1) = 'Z'.   "客制化报表不执行此逻辑
    EXIT.
  ENDIF.
*-----------------取得需要控制日期的信息类型----------------------*
  IF infty = '0008' OR infty = '0014' OR infty = '0015'
  OR infty = '0267' OR infty = '2010'.
    IMPORT zpernr TO l_pernr FROM MEMORY ID 'zpernr'.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.

    exit_flag = 'X'.

    "取得当前用户的人员编号
    SELECT SINGLE pernr
      FROM pa0105
      INTO l_per
     WHERE usrid = sy-uname.

    "根据人员编号取得其对应的人事范围
    SELECT pernr
           werks
           begda
           endda
      FROM pa0001
      INTO TABLE lt_werks
     WHERE pernr = l_per
       AND begda <= sy-datum
       AND endda >= sy-datum.
    IF sy-subrc = 0.
      DELETE authorization_periods_tab WHERE begda IS NOT INITIAL.
    ENDIF.

    SELECT pernr
           werks
      FROM pa0001
      INTO CORRESPONDING FIELDS OF TABLE lt_pernr
     WHERE pernr = l_pernr.

    "检查人员号的人事范围
    LOOP AT lt_pernr INTO lw_pernr.
      READ TABLE lt_werks INTO lw_werks WITH KEY werks = lw_pernr-werks.
      IF sy-subrc = 0.
        lw_period-begda = lw_werks-begda.
        lw_period-endda = lw_werks-endda.
        APPEND lw_period TO authorization_periods_tab.
      ENDIF.
    ENDLOOP.
  ELSE.
    exit_flag =  ' '.
  ENDIF.
ENDMETHOD.

3)逻辑:

T-CODE以Z开头的会话不执行此段程序;

信息类型为8、14、15、267、2010时执行此段程序;

取得当前用户对应的人事范围及期间(PA0015、PA0001);

取得被查询人的所有人事范围及期间;

逐条检查,当被查询人的人事范围与当前用户的人事范围不同时,此条信息剔除;当被查询人的人事范围与当前用户的人事范围相同但是日期期间没有交集时,此条信息剔除。

PC_PAYRESULT及自开发报表权限控制
1)PC_PAYRESULT的显示效果:
在这里插入图片描述
当执行PC_PAYRESULT时,可以看到人员的所有条目,当双击某一条条目查看明细信息时,进行权限校验,逻辑同PA20。
2) 自开发报表zhrnr_002的显示效果
在这里插入图片描述
80000054实际有3条数据,通过控制后只显示1条数据。
解决方法:
找到函数PYXX_READ_PAYROLL_RESULT,在函数的最后创建增强点。

ENHANCEMENT 1  ZPA001.    "active version
  data: BEGIN OF lw_werks,
        pernr TYPE pa0001-pernr,
        werks TYPE pa0001-werks,
        begda TYPE pa0001-begda,
        endda TYPE pa0001-endda,
      END OF lw_werks.
  data: l_per   TYPE rp50g-pernr.
  data: lt_werks LIKE TABLE OF lw_werks,
        lt_pernr LIKE TABLE OF lw_werks,
        lw_pernr LIKE lw_werks.

  FIELD-SYMBOLS: <versc> TYPE pc202.

  IF sy-tcode <> 'PC_PAYRESULT' AND sy-tcode(1) <> 'Z'.
    EXIT.
  ENDIF.

    "取得当前用户的人员编号
  SELECT SINGLE pernr
    FROM pa0105
    INTO l_per
   WHERE usrid = sy-uname.

    "根据人员编号取得其对应的人事范围
  SELECT pernr
         werks
         begda
         endda
    FROM pa0001
    INTO TABLE lt_werks
   WHERE pernr = l_per
     AND begda <= sy-datum
     AND endda >= sy-datum.

    "当前人员对应的人事范围及期间
  SELECT pernr
         werks
         begda
         endda
    FROM pa0001
    INTO TABLE lt_pernr
   WHERE pernr = employeenumber.

  ASSIGN COMPONENT 'INTER-VERSC'
    OF STRUCTURE payroll_result TO <versc>.

    "检查人员号的人事范围
  LOOP AT lt_pernr INTO lw_pernr where begda <= <versc>-FPBEG
                                   and endda >= <versc>-FPEND.
    "当前条目所属的人事范围
    READ TABLE lt_werks INTO lw_werks WITH KEY werks = lw_pernr-werks.
    IF sy-subrc <> 0.
      IF sy-tcode(1) = 'Z'.
        MESSAGE '不同的人事范围,没有查看权限' TYPE 'I' RAISING no_record_found.
      else.
        MESSAGE '不同的人事范围,没有查看权限' TYPE 'E'.
      ENDIF.
    ENDIF.
    "校验当前查看条目是否在允许的人事范围期间内
    IF <versc>-FPEND < lw_werks-begda or <versc>-FPBEG > lw_werks-endda.
      IF sy-tcode(1) = 'Z'.
        MESSAGE '不在可查询的人事范围期间内' TYPE 'I' RAISING no_record_found.
      ELSE.
        MESSAGE '不在可查询的人事范围期间内' TYPE 'E'.
      ENDIF.

    ENDIF.
  ENDLOOP.

ENDENHANCEMENT.
*$*$-End:   (1)---------------------------------------------------------------------------------$*$*
ENDFUNCTION.

PS:喜欢的同学可以关注微信公众号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值