HCM 考勤PT60 RPTMOZ00

*{   INSERT         DEVK947686                                        1
FORM FU_Z001 .
*获取需卡次数
*BREAK-POINT .
  DATA : lt_psp like TABLE OF PC2BA WITH HEADER LINE ,
         ls_psp TYPE PC2BA ,
         lt_tip LIKE TABLE OF tip WITH HEADER LINE ,
         ls_tip LIKE tip ,
         LT_TEVEN LIKE TABLE OF TEVEN WITH HEADER LINE ,
         lv_TEVENLInes1 TYPE int2 ,
         lv_TEVENLInes2 TYPE int2 ,
         t_datum TYPE sy-datum ,
         v_qj TYPE int1 .     "是否有勤假记录

DATA: LT_TES LIKE TES[] ,
      LS_TES LIKE LINE OF LT_TES ,
      modcnt type i.


    ls_psp = psp .
*  IF LS_PSP-DATUM = '20180330' .
*    BREAK-POINT .
*  ENDIF.

  v_qj = 0 .
  LOOP AT tip INTO ls_tip WHERE  ORIGS = 'A' or ORIGS = 'P' .
*  LOOP AT tip INTO ls_tip WHERE  ZTART = '0120' or ZTART = '0130' .
    v_qj = 1 .
  ENDLOOP.

   IF v_qj = 0 .

       t_datum = LS_PSP-DATUM + 1 .

      if p0007-zterf = '1'.
          SELECT COUNT(*) INTO lv_TEVENLInes1 FROM TEVEN WHERE ( ( LDATE = LS_PSP-DATUM  AND ( DALLF = '+' or DALLF = '=' or DALLF = '' ) AND PERNR = PERNR-pernr )
            or ( LDATE = t_datum  AND ( DALLF = '-' or DALLF = '<' ) ) AND PERNR = PERNR-pernr )  AND STOKZ = ''  .     "判断4笔卡
              modcnt = lv_TEVENLInes1 mod 2.
              IF lv_TEVENLInes1 < 4 or modcnt = 1.
                LS_TES-ZTART = '9902' .
                     LS_TES-ANZHL = 1 .
              ENDIF.
              APPEND ls_TES to TES .
      ENDIF.

   ENDIF.


  ENDFORM .

FORM FU_Z002 .
*判定公休
   DATA : LT_P2001 TYPE STANDARD TABLE OF p2001  ,
          LS_P2001 TYPE P2001 .
   DATA : LT_TES LIKE TES[] ,
          LS_TES LIKE LINE OF LT_TES .

          LT_P2001[] = p2001[] .
          LS_TES-ANZHL = 0 .
          LOOP AT  lt_P2001 INTO ls_P2001 WHERE ALLDF = 'X' AND KALTG >= 7 AND begda <= PSP-datum and endda >= PSP-datum .
*           BREAK-POINT .
            CASE ls_P2001-subty .
              WHEN '1001' .    "事假无薪
                LS_TES-ANZHL = 1 .
              WHEN '1016' .     "病假无薪
                LS_TES-ANZHL = 2 .
              WHEN '1013' .     "病假80%薪
                LS_TES-ANZHL = 3 .
              WHEN '1002'  .   "病假(全薪)
                LS_TES-ANZHL = 4 .
              WHEN '1003'  .   "产假80%薪
                LS_TES-ANZHL = 5 .
              WHEN OTHERS.
            ENDCASE.
            EXIT .
          ENDLOOP.
          LS_TES-ZTART = '9903' .
          APPEND ls_TES to TES .

ENDFORM .




FORM FU_Z005 .



data : wa9025 like line of tes,
       wa9026 like line of tes,
       hours type PTM_QUONUM ,
       it_TPROG like STANDARD TABLE OF Zhr_TPROG WITH HEADER LINE.

data:  lt_tip LIKE TABLE OF tip WITH HEADER LINE ,
       ls_tip LIKE tip ,
       lt_tzp LIKE TABLE OF tzp WITH HEADER LINE .
constants: lv_time type uzeit value '240000' .

READ TABLE TES with key ZTART = '9025'.  "2007申请加班时数
if sy-subrc = 0.
  wa9025-anzhl = TES-anzhl.
ENDIF.

hours = 25 / 100 .

if wa9025-anzhl is INITIAL or wa9025-anzhl < hours .
  exit.
endif.

READ TABLE TES with key ZTART = '9026'. "读取的实际加班时数
if sy-subrc = 0.
  wa9026-anzhl = TES-anzhl.
ENDIF.

if wa9026-anzhl is INITIAL.
  wa9026-anzhl = 0.
ENDIF.

if  wa9025-anzhl =  wa9026-anzhl.
  exit.
ENDIF.

CLEAR: it_TPROG,it_TPROG[].
*select SINGLE * into CORRESPONDING FIELDS OF it_T550A from T550A WHERE MOTPR = '28' and TPROG = PSP-TPROG AND BEGDA LE PSP-DATUM AND ENDDA GE PSP-DATUM.
select SINGLE * into CORRESPONDING FIELDS OF it_TPROG from Zhr_TPROG WHERE TPROG = PSP-TPROG.
if it_TPROG is INITIAL.
  exit.
ENDIF.

CHECK tzp[] is NOT INITIAL.
lt_tzp[] = tzp[].
sort lt_tzp by ZEIT DESCENDING.
delete ADJACENT DUPLICATES FROM lt_tzp.
READ TABLE lt_tzp INDEX 1.


"解决正班延后1/N 小时下班算加班的情况
if it_TPROG-endtm1 is NOT INITIAL.
    lt_tip[] = tip[].
    delete lt_tip where ztart ne '0310' OR VTYPE = 'M'.

    data: tmptx type string ,
          ss type P decimals 4  ,
          hrs_beg type i,
          hrs_end type i.

    delete lt_tip WHERE BEGTM LT lt_tzp-zeit.
    sort lt_tip[] by begtm.

    read TABLE lt_tip into ls_tip with key BEGTM = lt_tzp-zeit.
    if sy-subrc = 0.
      if ls_tip-anzhl GE hours.
        if ls_tip-anzhl > it_TPROG-SOLLZ1.
          tmptx = it_TPROG-endtm1.
          clear hrs_end.
          hrs_end = tmptx+0(2).
          ss =  tmptx+2(2).
          ss = ss / 60.
          hrs_end = hrs_end * 10000  + ss * 10000.
          if it_TPROG-endtm1 < '100000'.          "如果下班时间小于 10:00,视为加班至第二天下班
              hrs_end = hrs_end + lv_time.
          endif.

          ls_tip-endtm = hrs_end.
          ls_tip-anzhl = it_TPROG-SOLLZ1.
          ls_tip-VTYPE = 'M'.
*          modify tip from ls_tip ."where BEGTM = hrs_beg  .
          delete tip where BEGTM = hrs_beg  .
        else.
          ls_tip-VTYPE = 'M'.
          delete tip where BEGTM = hrs_beg  .
*          modify tip from ls_tip .
        endif.

        if wa9026-anzhl + ls_tip-anzhl > wa9025-anzhl.     "计算出来的加班总数不能超过申请加班的时数
          ls_tip-anzhl =  wa9025-anzhl -  wa9026-anzhl.
          ls_tip-endtm = ls_tip-begtm + ls_tip-anzhl * 10000.
          wa9026-anzhl =  wa9025-anzhl.
          APPEND ls_tip to tip .
        else.
          wa9026-anzhl = wa9026-anzhl + ls_tip-anzhl.
          APPEND ls_tip to tip .
        endif.

        delete  TES where ZTART = '9026'.
        tes-ztart = '9026'.
        tes-ANZHL =  wa9026-anzhl.
        append tes.
      ENDIF.
    endif.
ENDIF.


"开始解决连班的情况
if  wa9025-anzhl =  wa9026-anzhl.
  exit.
ENDIF.


data: it_lianban LIKE TABLE OF zhr_lianban WITH HEADER LINE,
      nextday type datum.

nextday = psp-datum + 1.

select * INTO CORRESPONDING FIELDS OF TABLE it_lianban from zhr_lianban where pernr = pernr-pernr and ( kqdate = psp-datum or  kqdate = nextday ) .
check sy-subrc = 0.

loop at it_lianban.
  if it_lianban-kqdate = psp-datum and it_lianban-fst < '030000' and it_lianban-scd < '30000' .   "小于当天3点的,视为前一天的连班需删除
    delete it_lianban.
  ENDIF.
  if it_lianban-kqdate = nextday and ( it_lianban-fst  > '030000' or it_lianban-scd > '030000' ).   "大于第二天3点的,视为后一天的连班卡需删除
    delete it_lianban.
  ENDIF.
ENDLOOP.

check it_lianban[] is NOT INITIAL.

READ TABLE it_lianban INDEX 1.
check sy-subrc = 0.

data: lt_pt like TABLE OF pt with HEADER LINE,
      tb_pt like TABLE OF pt with HEADER LINE.

data: lt_breaks type standard table of pwsdayint WITH HEADER LINE,
      ls_breaks type pwsdayint.

lt_pt[] = pt[].
delete lt_pt where ldate ne psp-datum.
check lt_pt[] is NOT INITIAL.



if ( it_lianban-fst is INITIAL and it_lianban-scd is INITIAL ) or it_lianban-fst is not INITIAL.    "都为初始值时可以看作是 班段1后连班,时间为 00:00:00
    REFRESH lt_TZP[].
    lt_TZP[] = TZP[].
    delete lt_TZP where code ne '05'.
    CHECK lt_TZP[] is NOT INITIAL.
    sort lt_TZP by pdunb.

    READ TABLE lt_TZP index 1 .
    ls_breaks-BEGUZ = lt_TZP-zeit.                          "取休息开始时间

    loop at TZP where zeit > lt_TZP-zeit.
      ls_breaks-ENDUZ = TZP-zeit.                           "取休息结束时间
      EXIT.
    ENDLOOP.

    ls_breaks-BEGUZ = ls_breaks-BEGUZ - 3600.   "下班休息时间前推 1 小时
    ls_breaks-ENDUZ = ls_breaks-ENDUZ + 3600.   "上班开始时间后推 1 小时

    data: hou type ptm_quonum,
          breaks type p DECIMALS 2  .
    breaks = 75 / 100 .

    READ TABLE tes with key ZTART = '9100'.  "排除连班允许的时间范围内的迟到早退时数
    if sy-subrc = 0.
        loop at tip where ztype = '02' and VTYPE = 'K'.
          if tip-begtm BETWEEN ls_breaks-BEGUZ and ls_breaks-ENDUZ  .
              tes-anzhl = tes-anzhl - tip-anzhl.
          endif.
        endloop.
    endif.

    loop at lt_pt where begtm ge ls_breaks-BEGUZ and begtm lT ls_breaks-ENDUZ and endtm ge lt_TZP-zeit.
      tb_pt[] = lt_pt[].
      delete tb_pt where begtm ge lt_pt-begtm.
      sort tb_pt by begtm descending.
      delete ADJACENT DUPLICATES FROM tb_pt comparing ldate.
      READ TABLE tb_pt INDEX 1.
      if tb_pt-endtm lt ls_breaks-BEGUZ.
        exit.
      endif.

      HOU = ( lt_pt-begtm - tb_pt-endtm )  / 3600 .    "取连班中途休息时间
      if hou > it_TPROG-MD_SISU.            "连班休息时间超出规定时限, 则计迟到
        tes-ZTART = '9100'.
         tes-anzhl = tes-anzhl + hou - it_TPROG-MD_SISU.
      ENDIF.


      exit.
    endloop.

    if tes-ZTART = '9100'.                        "变更迟到早退
      delete tes where ZTART = '9100'.
      append tes.
    endif.
ENDIF.

endform.


"区分迟到早退类型
FORM FU_Z003.

  DATA: LT_LIANBAN LIKE STANDARD TABLE OF ZHR_LIANBAN WITH HEADER LINE.
  DATA: TABIX1 TYPE I,
        TABIX2 TYPE I,
        lv_num type i.
  DATA HTIP1 LIKE TIP.

  CLEAR: TABIX1,TABIX2,lv_num.

  IF PSP-TPROG+0(1) = 'X' .
      CLEAR:  LT_LIANBAN,LT_LIANBAN[].
      SELECT SINGLE * INTO CORRESPONDING FIELDS OF LT_LIANBAN FROM ZHR_LIANBAN
                WHERE PERNR = PERNR-PERNR  AND KQDATE = PSP-DATUM .
        IF LT_LIANBAN IS NOT INITIAL AND LT_LIANBAN-FST IS NOT INITIAL.
          CLEAR TES.
          TES-ZTART = 'ZLB1'.
          TES-ANZHL = 1.
          APPEND TES.
        ENDIF.
  ENDIF.

 IF PSP-DATUM BETWEEN '20250125' and '20250205' AND ( ( SY-DATUM = '20250207' and sy-uzeit > '105000' ) or SY-DATUM between '20250208' and '20250210') .
    DATA: IT_ZTIP LIKE TABLE OF ZTIP WITH HEADER LINE.
    DATA: IT_ZTIP2 LIKE TABLE OF ZTIP WITH HEADER LINE.
    CLEAR:IT_ZTIP[],IT_ZTIP2[].
    LOOP AT TIP WHERE ZTART = 'Z004' OR ZTART = 'Z005'.
      CLEAR:IT_ZTIP,IT_ZTIP2.
      MOVE-CORRESPONDING TIP TO IT_ZTIP.
*      IT_ZTIP-BEGTM+2(2) = TIP-BEGTM+2(2) / 100 * 60.
*      IT_ZTIP-ENDTM+2(2) = TIP-ENDTM+2(2) / 100 * 60.
      IT_ZTIP-PERNR = PERNR-PERNR.
      IT_ZTIP-DATUM = PSP-DATUM.
      APPEND IT_ZTIP.

*      IT_ZTIP2-ZTART = TIP-ztart.
      IT_ZTIP2-anzhl = TIP-anzhl.
      collect it_ztip2.
    ENDLOOP.

    LOOP AT IT_ZTIP2 WHERE ANZHL GE 8.
      DELETE IT_ZTIP WHERE ZTART = 'Z004' OR ZTART = 'Z005'.
      COMMIT WORK.
    ENDLOOP.

    CLEAR IT_ZTIP2[].

    SELECT * INTO TABLE IT_ZTIP2 FROM ZTIP WHERE PERNR = PERNR-PERNR AND DATUM = PSP-DATUM.
    IF IT_ZTIP2[] IS NOT INITIAL.
      LOOP AT IT_ZTIP2 .
        READ TABLE IT_ZTIP WITH KEY PERNR = IT_ZTIP2-PERNR  DATUM = PSP-DATUM BEGTM = IT_ZTIP2-BEGTM ENDTM = IT_ZTIP2-ENDTM.
        IF SY-SUBRC NE 0.
          DELETE FROM ZTIP WHERE PERNR = IT_ZTIP2-PERNR AND DATUM = PSP-DATUM AND BEGTM = IT_ZTIP2-BEGTM AND ENDTM = IT_ZTIP2-ENDTM.
          COMMIT WORK.
        ENDIF.
      ENDLOOP.
    ENDIF.



    IF IT_ZTIP[] IS NOT INITIAL.
      MODIFY ZTIP FROM TABLE IT_ZTIP[].
    ENDIF.

  ENDIF.

  "早退处理
  LOOP AT TIP WHERE VTYPE = 'E'.
    TABIX2 = SY-TABIX.
    EXIT.
  ENDLOOP.

  DESCRIBE TABLE TIP[] LINES lv_num.

  CHECK TABIX2 <> '0'.
  TABIX1 = TABIX2.
  TABIX1 = TABIX1 + 1.

*  DO 16 TIMES.
   IF TABIX1 <= lv_num.
     CLEAR htip1.
    READ TABLE TIP INDEX TABIX1 INTO HTIP1.
    IF HTIP1-ZTYPE = '05'.
      TABIX1 = TABIX1 + 1.
    ELSEIF HTIP1-ZTART = 'Z004' AND HTIP1-VTYPE = 'L'.
      HTIP1-VTYPE = 'E'.
      HTIP1-ZTART = 'Z005'.
      MODIFY  TIP  FROM  HTIP1 INDEX TABIX1.
    ELSEIF HTIP1-ZTYPE = '02' AND HTIP1-VTYPE = 'S' AND TIP-ZTART = 'Z005' AND PSP-TPROG+0(1) NE 'X' .
      CLEAR LT_LIANBAN.
      SELECT SINGLE * INTO CORRESPONDING FIELDS OF LT_LIANBAN FROM ZHR_LIANBAN
          WHERE PERNR = PERNR-PERNR  AND KQDATE = PSP-DATUM .
      IF ( LT_LIANBAN-FST IS NOT INITIAL AND TIP-ENDTM < '125000' ) OR ( LT_LIANBAN-SCD IS NOT INITIAL AND TIP-ENDTM < '185000' ).
        TIP-VTYPE = 'E'.
        TIP-ZTART = 'Z004'.
        MODIFY  TIP INDEX TABIX2.
      ENDIF.

    ENDIF.
   ENDIF.
*  ENDDO.

ENDFORM.                    "FU_Z003

"特殊加班处理:连班处理
FORM FU_Z004.
  DATA: LT_LIANBAN LIKE STANDARD TABLE OF ZHR_LIANBAN WITH HEADER LINE,
        LT_TPROG LIKE STANDARD TABLE OF ZHR_TPROG WITH HEADER LINE,
        WA_TPROG LIKE LINE OF LT_TPROG,
        LS_LIANBAN TYPE ZHR_LIANBAN,
        ZTPROG TYPE TPROG,
*        LS_TPROG TYPE ZHR_TPROG,
        LS_TZP LIKE TZP.
  DATA: LS_FLAG(1) TYPE C.  "判断连班期间段是否有请假记录

  DATA: LS_ZEIT TYPE TIMPT,
        LS_TABIX  TYPE SY-TABIX.

  DATA: LS_NDAY TYPE DATUM.
  DATA: LS_ZSOT TYPE PTM_QUODED.

  DATA: LS_PDNUM(6) TYPE C.
  DATA: LS_BEGTM(6) TYPE C.

  LS_NDAY = PSP-DATUM + 1.

 REFRESH: LT_TPROG.
 CLEAR ZTPROG.
 if PSP-TPROG ne 'OFF'.
    ZTPROG = PSP-TPROG.
    IF ZTPROG+0(1) = 'X' OR ZTPROG+0(1) = 'Y'.   "半天对调班次
      IF ZTPROG+1(1) > '9'. "大竹班次,班次名称第个字符为字母
        ZTPROG = 'D' && ZTPROG+1(3).
      ELSE.
        ZTPROG = 'H' && ZTPROG+1(3).
      ENDIF.
    ENDIF.

    SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_TPROG
      FROM ZHR_TPROG
      WHERE TPROG = ZTPROG
        AND BEGDA <= PSP-DATUM
        AND ENDDA >= PSP-DATUM.

    CHECK LT_TPROG[] is NOT INITIAL.    "add by yangyueqian
    READ TABLE LT_TPROG INDEX 1.
    MOVE-CORRESPONDING LT_TPROG to WA_TPROG.
  endif.



IF AS-PARM2 EQ 'ZLB1' AND PSP-TPROG+0(1) NE 'X'.    "连班处理
  REFRESH: LT_LIANBAN,LT_TPROG.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_LIANBAN FROM ZHR_LIANBAN
    WHERE PERNR = PERNR-PERNR
      AND KQDATE = PSP-DATUM .

  CLEAR LS_LIANBAN.
  loop at p0001 where pernr = PERNR-PERNR and begda le PSP-DATUM and endda ge PSP-DATUM.
    exit.
  ENDLOOP.

  READ TABLE LT_LIANBAN INTO LS_LIANBAN INDEX 1.
  IF SY-SUBRC = 0 OR ( p0001-ABKRS EQ 'Y2' and ( PSP-ZMODN = 'DCPY' or PSP-ZMODN = 'DSMY' or PSP-ZMODN = 'DZPY' ) ).
    CLEAR: LS_TABIX,LS_TZP.
    DATA: z_begtm type TIMPT,
          z_endtm type TIMPT.
    DATA: z_begtm2 type TIMPT,
          z_endtm2 type TIMPT.

    DATA HOURS TYPE P DECIMALS 4.  "实际上班打卡的班段数目
    HOURS = 1 / 6 .  "10 分钟

    IF p0001-ABKRS EQ 'Y2' and ( PSP-ZMODN = 'DCPY' or PSP-ZMODN = 'DSMY' or PSP-ZMODN = 'DZPY' ).
      IF LT_TPROG-MD_SISU > HOURS.
        LOOP AT TZP WHERE CODE = '05' and pdunb > HOURS.
          LS_LIANBAN-FST = TZP-ZEIT.
          EXIT.
        ENDLOOP.
      ENDIF.

      IF LT_TPROG-PM_SIHU > HOURS.
        LOOP AT TZP WHERE CODE = '01' and ZEIT > '000001'.
          LS_LIANBAN-SCD = TZP-ZEIT.
          EXIT.
        ENDLOOP.
      ENDIF.
    ENDIF.

    IF LS_LIANBAN-FST IS NOT INITIAL and LT_TPROG-MD_SISU > HOURS.
     " 判断连班申请时间无请假记录,否则不做连班替换。---BEGIN
      CLEAR: LS_FLAG.
      LOOP AT AB WHERE BEGDA <= PSP-DATUM
                   AND ENDDA >= PSP-DATUM.
        IF AB-BEGUZ IS INITIAL OR AB-ENDUZ is INITIAL.
          LS_FLAG = 'X'.
        ELSE.
          IF AB-ENDUZ < AB-BEGUZ.
             ADD 24 TO AB-ENDUZ+0(2).
          ENDIF.
          IF AB-BEGUZ <= LS_LIANBAN-FST and AB-ENDUZ >= LS_LIANBAN-FST.
            LS_FLAG = 'X'.
          ENDIF.
        ENDIF.
      ENDLOOP.

      IF LS_FLAG <> 'X' AND LT_TPROG-MD_SISU IS NOT INITIAL  .
     " 判断连班申请时间无请假记录,否则不做连班替换。---END

      IF LS_LIANBAN-FST = '000100'.
        LS_LIANBAN-FST = '240000'.
      ENDIF.

      IF LS_LIANBAN-FST < '030000'.
        ADD 24 TO LS_LIANBAN-FST+0(2).
      ENDIF.
      PERFORM DEZIMAL USING LS_LIANBAN-FST.

" 变更连班时间匹配TZP中休息开始时间的逻辑  --20190813
    data esc_flg(1).  "判断是否与请假时间有重叠,则不考虑连班
    data: mi type i ,"分钟数"
          mi_c(2).

     LOOP AT TZP WHERE CODE = '05' and pdunb > HOURS.
        LS_TABIX = SY-TABIX.
        CLEAR: z_begtm,z_endtm,LS_TZP.
        z_begtm = TZP-ZEIT - '010000'.

        LS_TABIX = LS_TABIX + 1.
        READ TABLE TZP INDEX LS_TABIX INTO LS_TZP.
        if LS_TZP is not INITIAL.
          z_endtm = LS_TZP-ZEIT + '010000'.
        ENDIF.

*---------------判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换---BEGIN----*
        IF ls_flag IS INITIAL.
          mi = z_begtm+2(2).
          mi_c = mi / 100 * 60 .
          if STRLEN( mi_c ) = 1.
            CONCATENATE '0' mi_c INTO mi_c.
          endif.
          z_begtm2 = z_begtm.
          z_begtm2+2(2) = mi_c.

          mi = z_endtm+2(2).
          mi_c = mi / 100 * 60 .
          if STRLEN( mi_c ) = 1.
            CONCATENATE '0' mi_c INTO mi_c.
          endif.
          z_endtm2 = z_endtm.
          z_endtm2+2(2) = mi_c.

          LOOP AT pt WHERE ldate = psp-datum
                       AND begtm >= z_begtm2 and begtm < z_endtm2.
          ENDLOOP.
          IF sy-subrc <> 0.
            ls_flag = 'X'.
            EXIT.
          ENDIF.
        ENDIF.
*---------------判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换--

        CLEAR esc_flg.

        "连班中班休息时长
        if LS_LIANBAN-FST BETWEEN z_begtm and z_endtm.

          CLEAR TES.
          TES-ZTART = 'Z101'.
          TES-ANZHL = TZP-PDUNB.
          APPEND TES.
          CLEAR TES.
          TES-ZTART = 'Z102'.
          TES-ANZHL = LT_TPROG-MD_SISU.
          APPEND TES.

          TZP-ZEIT = TZP-ZEIT - '010000'.
          TZP-CODE = '10'.
          TZP-PDUNB = TZP-PDUNB + 2.
          MODIFY TZP.

          IF Z_ENDTM IS NOT INITIAL.
            LS_TZP-ZEIT = LS_TZP-ZEIT + '010000'.
            MODIFY TZP FROM LS_TZP INDEX LS_TABIX.
          ENDIF.
          EXIT.
        ENDIF.
      ENDLOOP.
      ENDIF.  "---
    ENDIF.

    IF LS_LIANBAN-FST IS NOT INITIAL AND ( LS_LIANBAN-SCD IS INITIAL OR LS_LIANBAN-SCD = '' ) AND LT_TPROG-PM_SIHU > HOURS AND PSP-TPKLA = '2'.
      LS_LIANBAN-SCD = LS_LIANBAN-FST.
    ENDIF.

    IF LS_LIANBAN-SCD IS NOT INITIAL AND LT_TPROG-SOLLZ3 IS NOT INITIAL AND LT_TPROG-PM_SIHU > HOURS.

     " 判断连班申请时间无请假记录,否则不做连班替换。---BEGIN
      CLEAR: LS_FLAG.
      LOOP AT AB WHERE BEGDA <= PSP-DATUM
                   AND ENDDA >= PSP-DATUM.
        IF AB-BEGUZ IS INITIAL OR AB-ENDUZ IS INITIAL.
          LS_FLAG = 'X'.
        ELSE.
          IF AB-ENDUZ < AB-BEGUZ.
             ADD 24 TO AB-ENDUZ+0(2).
          ENDIF.
          IF AB-BEGUZ <= LS_LIANBAN-SCD AND AB-ENDUZ >= LS_LIANBAN-SCD.
            LS_FLAG = 'X'.
          ENDIF.
        ENDIF.
      ENDLOOP.

      CLEAR:LS_TZP,LS_PDNUM,Z_BEGTM,Z_ENDTM.
      PERFORM DEZIMAL USING LS_LIANBAN-SCD.
      PERFORM DEZIMAL USING LT_TPROG-BEGTM3.

      DATA: CNT TYPE I.
      CNT = LINES( TZP[] ).
      CHECK CNT GT LS_TABIX.

      READ TABLE TZP INTO LS_TZP INDEX CNT.

      "判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换

      IF LS_FLAG <> 'X' AND LT_TPROG-PM_SIHU IS NOT INITIAL.
     " 判断连班申请时间无请假记录,否则不做连班替换。---END

      Z_BEGTM = LS_TZP-ZEIT - '010000'.
*      Z_ENDTM = LT_TPROG-BEGTM3 + '010000'.
      WA_TPROG-ENDTM3 = WA_TPROG-BEGTM3 + 3600.
      PERFORM DEZIMAL USING WA_TPROG-ENDTM3.
      Z_ENDTM = WA_TPROG-ENDTM3.

      IF Z_BEGTM > Z_ENDTM.
        ADD 24 TO Z_ENDTM+0(2).
      ENDIF.

*---------------判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换 ---BEGIN----*
      IF LS_FLAG IS INITIAL.
          mi = z_begtm+2(2).
          mi_c = mi / 100 * 60 .
          if STRLEN( mi_c ) = 1.
            CONCATENATE '0' mi_c INTO mi_c.
          endif.
          z_begtm2 = z_begtm.
          z_begtm2+2(2) = mi_c.

          mi = z_endtm+2(2).
          mi_c = mi / 100 * 60 .
          if STRLEN( mi_c ) = 1.
            CONCATENATE '0' mi_c INTO mi_c.
          endif.
          z_endtm2 = z_endtm.
          z_endtm2+2(2) = mi_c.


        LOOP AT PT WHERE LDATE = PSP-DATUM
                     AND BEGTM >= z_begtm2 and BEGTM < z_endtm2.
        ENDLOOP.
        IF SY-SUBRC <> 0.
          LS_FLAG = 'X'.
          EXIT.
        ENDIF.
      ENDIF.
*---------------判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换 ---END------*


      CLEAR esc_flg.
      loop at ab where begda le psp-datum and endda ge psp-datum.
         if ( ab-beguz > z_begtm and ab-beguz < z_endtm ) or ( ab-enduz > z_begtm and ab-enduz < z_endtm ) or  ( ab-beguz  le z_begtm and ab-enduz ge z_endtm ).
           esc_flg = 'X'.
           exit.
         endif.
       ENDLOOP.

       IF ESC_FLG = 'X'. "与请假时间有重叠,则不考虑连班
         exit.
       ENDIF.

*      READ TABLE TZP INTO LS_TZP WITH KEY ZEIT = LS_LIANBAN-SCD.
      IF LS_LIANBAN-SCD BETWEEN z_begtm and z_endtm.
        LS_TABIX = SY-TABIX.
        READ TABLE LT_TPROG INDEX 1.

        IF LT_TPROG-BEGTM3+0(2) < '03'.
          ADD 24 TO LT_TPROG-BEGTM3+0(2).
        ENDIF.

        IF LT_TPROG-BEGTM3 > LS_TZP-ZEIT."----
          CLEAR TZP.
          TZP-ZEIT = LT_TPROG-BEGTM3.
          TZP-CODE = '01'.
          "----BEGIN
*          LS_PDNUM = LT_TPROG-BEGTM3 - LS_LIANBAN-SCD.----mark*
*          LS_PDNUM = LS_PDNUM / 3600.----mark*
          DATA: ls_time(6) type c.
          ls_time = LT_TPROG-BEGTM3.
          LS_PDNUM = ( ls_time - LS_TZP-ZEIT ) / 10000." ----add
          "----END
          TZP-PDUNB = LS_PDNUM.
          APPEND TZP.

          "连班晚班休息时长
          CLEAR TES.
          TES-ZTART = 'Z201'.
          TES-ANZHL = LS_PDNUM." + 1. 
          APPEND TES.
          CLEAR TES.
          TES-ZTART = 'Z202'.
          TES-ANZHL = LT_TPROG-PM_SIHU.
          APPEND TES.

          LS_TZP-ZEIT = LS_TZP-ZEIT - '010000'.
          LS_TZP-CODE = '07'.
*          LS_TZP-PDUNB = LS_TZP-PDUNB + 2.
          LS_TZP-PDUNB = LS_PDNUM + 2.
          MODIFY TZP FROM LS_TZP INDEX LS_TABIX.

          LS_TABIX = LS_TABIX + 1.
          CLEAR:LS_TZP.
          READ TABLE TZP INDEX LS_TABIX INTO LS_TZP.
          IF LS_TZP IS NOT INITIAL.
            LS_TZP-ZEIT = LS_TZP-ZEIT + '010000'.
*            LS_TZP-CODE = '07'.
            MODIFY TZP FROM LS_TZP INDEX LS_TABIX.
          ENDIF.
        ENDIF."
      ENDIF.
      ENDIF."
    ENDIF.
 ENDIF.

ENDIF.

  CLEAR LS_ZSOT.
  LOOP AT ANWKONTI WHERE  KTART = '01'
                     AND  BEGDA <= PSP-DATUM
                     AND  ENDDA >= PSP-DATUM.
    LS_ZSOT = LS_ZSOT + ANWKONTI-ANZHL.
  ENDLOOP.
  if SY-SUBRC <> 0 and p0001-abkrs = 'Y2' and p0001-persk = 'A6'.
    ANWKONTI-INFTY = '2007'.
      ANWKONTI-SUBTY = '01'.
      ANWKONTI-KTART = '01'.
      ANWKONTI-VERSL = '1'.
      ANWKONTI-ZEINH = '001'.
      ANWKONTI-REWRI = '1'.
      ANWKONTI-DESTA = PSP-DATUM.
      ANWKONTI-DEEND = PSP-DATUM.
      APPEND ANWKONTI.
  else.
    CHECK SY-SUBRC = 0.
  ENDIF.

IF as-parm2 EQ 'ZOT1'.  "特殊加班处理:固定延时加班,加班有效时间段,总加班时长控制
  CLEAR TES.
  TES-ZTART = 'Z100'.   "当天加班有效时长
  TES-ANZHL = LS_ZSOT.
  APPEND TES.

  IF LT_TPROG-BEGTM3 EQ ''.
    LT_TPROG-BEGTM3 = '000000'.
  ENDIF.
  IF LT_TPROG-ENDTM3 EQ ''.
    LT_TPROG-ENDTM3 = '000000'.
  ENDIF.
  IF LT_TPROG-ENDTM1 EQ ''.
    LT_TPROG-ENDTM1 = '000000'.
  ENDIF.


""加班有效时间段替换
  LOOP AT ANWKONTI WHERE KTART = '01'  AND  BEGDA <= PSP-DATUM AND  ENDDA >= PSP-DATUM.

    IF PSP-TPROG+0(1) = 'X'. " OR ZTPROG+0(1) = 'Y'.   "半天对调班次
      DATA:GT_T550P LIKE TABLE OF T550P WITH HEADER LINE,
            ZPDUNB TYPE PDUNB,
            ZPAMOD TYPE PAMOD.
      CLEAR:ZPAMOD.
      SELECT SINGLE PAMOD INTO ZPAMOD FROM T550A WHERE MOTPR = '28' AND TPROG = ZTPROG.
      IF NOT ZPAMOD IS INITIAL.
            ZPDUNB = 17.
            ZPDUNB = ZPDUNB / 100 .
            SELECT single * INTO CORRESPONDING FIELDS OF GT_T550P FROM T550P WHERE MOTPR = '28' AND PAMOD = ZPAMOD AND PDUNB > ZPDUNB  .
            IF SY-SUBRC = 0.
              PERFORM DEZIMAL USING GT_T550P-PABEG.
              PERFORM DEZIMAL USING GT_T550P-PAEND.

              READ TABLE TES WITH KEY ZTART = 'ZLB1'.
              IF SY-SUBRC = 0 .   "如果有申请连班
                  ANWKONTI-BEGUZ = GT_T550P-PABEG.
              ELSE.
                  IF LT_TPROG-GDJBB1 IS NOT INITIAL.
                    PERFORM DEZIMAL USING LT_TPROG-GDJBB1.
                    ANWKONTI-BEGUZ = LT_TPROG-GDJBB1.
                  ELSE.
                      ANWKONTI-BEGUZ = GT_T550P-PAEND.
                  ENDIF.
              ENDIF.

              IF LT_TPROG-ENDTM1 IS NOT INITIAL AND LT_TPROG-BEGTM3 IS INITIAL.
                 ANWKONTI-ENDUZ = LT_TPROG-ENDTM1.
              ELSE.
                ANWKONTI-ENDUZ = '240000'.
              ENDIF.

              MODIFY ANWKONTI.

*              "针对班段3 再做处理    20230914 注释掉
*              IF LT_TPROG-BEGTM3 IS NOT INITIAL AND  LT_TPROG-BEGTM3 > LT_TPROG-ENDTM1.
*                ANWKONTI-BEGUZ = LT_TPROG-BEGTM3.
*                ANWKONTI-ENDUZ = '240000'.
*              ENDIF.
            ENDIF.
      ENDIF.

      IF  ANWKONTI-ENDUZ IS INITIAL.
          ANWKONTI-BEGUZ = TZP-ZEIT.
          ANWKONTI-ENDUZ = '240000'.
          MODIFY ANWKONTI.
      ENDIF.

      EXIT.
    ELSEIF LT_TPROG-BEGTM3 IS NOT INITIAL AND LT_TPROG-ENDTM3 IS NOT INITIAL .    " 1 . 有班段三的情况
        PERFORM DEZIMAL USING LT_TPROG-BEGTM3.
        PERFORM DEZIMAL USING LT_TPROG-ENDTM3.
*        PERFORM DEZIMAL USING LT_TPROG-ENDTM1.    "

        READ TABLE TZP WITH KEY CODE = '02'.    "取班次开始时间
        IF SY-SUBRC = 0.
          IF LT_TPROG-BEGTM3 < TZP-ZEIT.
            ADD 24 TO LT_TPROG-BEGTM3+0(2).
            ADD 24 TO LT_TPROG-ENDTM3+0(2).
          ENDIF.
        ENDIF.

        IF LT_TPROG-ENDTM3 < LT_TPROG-BEGTM3.
          ADD 24 TO LT_TPROG-ENDTM3+0(2).
        ENDIF.

        IF PSP-FTKLA = '1' OR PSP-TPROG = 'OFF'. "法定假日加班,从班次开始时间算起
          ANWKONTI-BEGUZ = TZP-ZEIT.
          DATA:ZENDTM(6) TYPE C,
                ZHRS TYPE I.

          ZENDTM = ANWKONTI-BEGUZ.
          ZHRS = ANWKONTI-ANZHL * 10000.
          ADD ZHRS TO ZENDTM.
          IF ANWKONTI-ENDUZ IS NOT INITIAL AND ANWKONTI-ENDUZ < ZENDTM.
            ANWKONTI-ENDUZ = ZENDTM.
          ENDIF.

        ELSEIF ANWKONTI-BEGUZ IS INITIAL OR ANWKONTI-BEGUZ <= LT_TPROG-BEGTM3.
          ANWKONTI-BEGUZ = LT_TPROG-BEGTM3.
        ENDIF.
        IF ANWKONTI-ENDUZ IS INITIAL OR ANWKONTI-ENDUZ >= LT_TPROG-ENDTM3 OR ANWKONTI-ENDUZ < ANWKONTI-BEGUZ.
           ANWKONTI-ENDUZ = LT_TPROG-ENDTM3.
        ENDIF.
       MODIFY ANWKONTI.

*    ELSEIF LT_TPROG-ENDTM1 is not INITIAL or LT_TPROG-SOLLZ1 is NOT INITIAL.    " 2. 没有班段3 但有延时下班的情况
*      "这种情况是不存在连班的
*      PERFORM DEZIMAL USING LT_TPROG-ENDTM1.
*      READ TABLE TZP WITH KEY CODE = '02'.    "取班次开始时间
*      IF SY-SUBRC = 0.
*        IF LT_TPROG-ENDTM1 < TZP-ZEIT.
*          ADD 24 TO LT_TPROG-ENDTM1+0(2).
*        ENDIF.
*      ENDIF.
*
*      ANWKONTI-ENDUZ = LT_TPROG-ENDTM1.
*
*      IF PSP-FTKLA = '1' OR PSP-TPROG = 'OFF'. "法定假日加班,从班次开始时间算起
*          ANWKONTI-BEGUZ = TZP-ZEIT.
*      ELSE.
*        LOOP AT TZP WHERE CODE = '01'.   "取班次结束时间(最后一条)
*        ENDLOOP.
*        ANWKONTI-BEGUZ =  TZP-ZEIT.
*      ENDIF.
*      MODIFY ANWKONTI.

    ELSEIF PSP-FTKLA = '1' OR PSP-TPROG = 'OFF' or p2003-VTART = '03'.      " 3. 没有班段3、 没有延时下班, 且为法定假或周末的情况
      READ TABLE TZP WITH KEY CODE = '02'.    "取班次开始时间
      IF SY-SUBRC = 0.
        ANWKONTI-BEGUZ = TZP-ZEIT.
      ENDIF.

      LOOP AT TZP WHERE CODE = '01'.   "取班次结束时间(最后一条)
      ENDLOOP.
      ANWKONTI-ENDUZ =  TZP-ZEIT.
      MODIFY ANWKONTI.
    ENDIF.
  ENDLOOP.


"关于固定延时加班
  IF LT_TPROG-ENDTM1 IS NOT INITIAL AND LT_TPROG-ENDTM1 NE '' AND TIP[] IS NOT INITIAL .  "固定延时加班
    SORT TZP BY ZEIT.
    DATA IDX TYPE I.

    READ TABLE TES WITH KEY ZTART = 'Z201'.
    CHECK SY-SUBRC NE 0.            "上了下午连班的,则不能有固定延时加班

    SORT TIP BY BEGTM DESCENDING.   "取班次结束时间
    READ TABLE TIP WITH KEY PTYPE = '1' ZTYPE = '02' VTYPE = 'S'.

    DATA: ZVERSL TYPE VRSCH.
    ZVERSL = ANWKONTI-VERSL.
    CLEAR ANWKONTI.

    ANWKONTI-INFTY = '2007'.  
    ANWKONTI-SUBTY = '02'.    
    ANWKONTI-KTART = '02'.    "固定延时加班
    ANWKONTI-BEGDA = PSP-DATUM.
    ANWKONTI-ENDDA = PSP-DATUM.
    ANWKONTI-VERSL = ZVERSL.

    IDX = LINES( TZP ).
    READ TABLE TZP INDEX IDX.
    ANWKONTI-BEGUZ = TZP-ZEIT.

    PERFORM DEZIMAL USING LT_TPROG-ENDTM1.
    READ TABLE TZP WITH KEY CODE = '02'.
    IF SY-SUBRC = 0.
      IF LT_TPROG-ENDTM1 < TZP-ZEIT.
        ADD 24 TO LT_TPROG-ENDTM1+0(2).
      ENDIF.
    ENDIF.

"固定延时加班的逻辑全部改为: 配置表中最大允许的加班时数 (20190801改)
*    DATA HOURS TYPE P DECIMALS 4.  "实际上班打卡的班段数目
    HOURS = 1 / 6 .  "10 分钟
    READ TABLE TZP INDEX IDX.
    READ TABLE TIP WITH KEY BEGTM = TZP-ZEIT  BSART = 'P10' ORIGS = 'E'.
   IF SY-SUBRC = 0 AND TIP-ANZHL >= hours .
      if TIP-ANZHL < LT_TPROG-SOLLZ1.     "1. 按实际打卡来计算加班时间期间
        HOURS = HOURS + 1.
        if TIP-ANZHL >= HOURS .
          ANWKONTI-ENDUZ = TIP-ENDTM .
          ANWKONTI-ANZHL = TIP-ANZHL.
        else.                             "2. 只限定 1 小时的加班时间期间
          ANWKONTI-ENDUZ = TIP-BEGTM .
          ADD 1 TO ANWKONTI-ENDUZ+0(2) .
          ANWKONTI-ANZHL = 1.
        endif.
      else.                              "3. 按班次配置表中的配置设定加班时间期间
        ANWKONTI-ENDUZ = LT_TPROG-ENDTM1 .
        ANWKONTI-ANZHL = LT_TPROG-SOLLZ1.
        HOURS = 100.
      endif.

      ANWKONTI-ZEINH = '001'.
      ANWKONTI-REWRI = '1'.
      ANWKONTI-DESTA = PSP-DATUM.
      ANWKONTI-DEEND = PSP-DATUM.
      APPEND ANWKONTI.

      DATA : ZBEGTM2(6),ZENDTM2(6).
      ZBEGTM2 = ANWKONTI-BEGUZ .
      ZENDTM2 = ANWKONTI-ENDUZ .

      "ADD BY YANGYQ 解决班次配置表中只填了固定延时下班时间,未填班段3的开始和结束时间时考勤核算加班时数不正确的问题  (把延时下班的开始时间、结束时间更新到 01类型的加班申请中去)
      IF LT_TPROG-BEGTM3 IS INITIAL AND LT_TPROG-ENDTM3 IS INITIAL.
        LOOP AT ANWKONTI WHERE KTART = '01'  AND  BEGDA <= PSP-DATUM AND  ENDDA >= PSP-DATUM.
          IF ZBEGTM2 IS INITIAL AND ZENDTM2 IS INITIAL.
            SELECT SINGLE SOBEG INTO ( ZBEGTM2 ) FROM T550A WHERE MOTPR = '28' AND TPROG = PSP-ZMODN AND BEGDA LE PSP-DATUM AND ENDDA GE PSP-DATUM.
            SELECT SINGLE * INTO CORRESPONDING FIELDS OF LT_TPROG FROM ZHR_TPROG WHERE TPROG = ZTPROG AND BEGDA <= PSP-DATUM AND ENDDA >= PSP-DATUM.
            IF SY-SUBRC = 0.
              ZENDTM2 = LT_TPROG-ENDTM3.

              IF LT_TPROG-ENDTM3 < LT_TPROG-BEGTM3.
                ADD 24 TO ZENDTM2+0(2).
              ENDIF.
            ENDIF.
            PERFORM DEZIMAL USING ZBEGTM2.
            PERFORM DEZIMAL USING ZENDTM2.
          ENDIF.

          ANWKONTI-ENDUZ = ZENDTM2 .
          ANWKONTI-BEGUZ = ZBEGTM2.
          MODIFY ANWKONTI.
        ENDLOOP.
      ENDIF.

      "ADD BY YANGYQ on 20200402 “上班段3没有上班的情况下,直落班次时加班时数不超过设置的上限 (LT_TPROG-SOLLZ1),取消班段3的加班区间
       READ TABLE TIP index 1.
       IF HOURS = 100 AND TIP-BEGTM LE TZP-ZEIT AND ( LT_TPROG-BEGTM3 IS NOT INITIAL OR LT_TPROG-ENDTM3 IS NOT INITIAL ).
         LOOP AT ANWKONTI WHERE KTART = '01'  AND  BEGDA <= PSP-DATUM AND ENDDA >= PSP-DATUM.
           IF ANWKONTI-BEGUZ > ZBEGTM2.
             ANWKONTI-BEGUZ = ZBEGTM2.
           ENDIF.
           IF ANWKONTI-ENDUZ > ZENDTM2.
             ANWKONTI-ENDUZ  = ZENDTM2.
           ENDIF.
           IF ANWKONTI-BEGUZ > ANWKONTI-ENDUZ.
             ANWKONTI-BEGUZ = ANWKONTI-ENDUZ.
           ENDIF.
           MODIFY ANWKONTI.
         ENDLOOP.
       ENDIF.

   ENDIF.
  ENDIF.

"补充中午时段的固定延时加班--begin
  IF LT_TPROG-GDJBB1 IS NOT INITIAL AND LT_TPROG-GDJBE1 IS NOT INITIAL .  "补充固定延时加班不为空
   IF LT_TPROG-GDJBB1 <> LT_TPROG-GDJBE1.

   PERFORM DEZIMAL USING LT_TPROG-GDJBB1.
   PERFORM DEZIMAL USING LT_TPROG-GDJBE1.

   READ TABLE TZP WITH KEY CODE = '02'.
   IF SY-SUBRC = 0.
    IF LT_TPROG-GDJBB1 < TZP-ZEIT.
      ADD 24 TO LT_TPROG-GDJBB1+0(2).
      ADD 24 TO LT_TPROG-GDJBE1+0(2).
    ENDIF.
   ENDIF.

   IF LT_TPROG-GDJBE1 < LT_TPROG-GDJBB1.
     ADD 24 TO LT_TPROG-GDJBE1+0(2).
   ENDIF.

    READ TABLE TZP WITH KEY ZEIT = LT_TPROG-GDJBB1
                            CODE = '05'.
    IF SY-SUBRC = 0.
      ANWKONTI-INFTY = '2007'.
      ANWKONTI-SUBTY = '02'.
      ANWKONTI-KTART = '02'.
      ANWKONTI-BEGDA = PSP-DATUM.
      ANWKONTI-ENDDA = PSP-DATUM.
      ANWKONTI-VERSL = ZVERSL.
      ANWKONTI-BEGUZ = LT_TPROG-GDJBB1.
      ANWKONTI-ENDUZ = LT_TPROG-GDJBE1.

      ANWKONTI-ZEINH = '001'.
      ANWKONTI-REWRI = '1'.
      ANWKONTI-DESTA = PSP-DATUM.
      ANWKONTI-DEEND = PSP-DATUM.
      APPEND ANWKONTI.
    ENDIF.
   ENDIF.
  ENDIF.
"补充中午时段的固定延时加班--end

ENDIF.
ENDFORM.



"特殊加班处理:连班处理2
FORM FU_Z006.

  DATA:LS_TIP LIKE TIP.

      LOOP AT TIP INTO LS_TIP WHERE ZTYPE = '10' OR ZTYPE = '07'.
       IF  LS_TIP-ZTYPE = '10'.
        LS_TIP-ZTYPE = '05'.
       ELSEIF LS_TIP-ZTYPE = '07'.
         LS_TIP-ZTYPE = '09'.
       ENDIF.
        MODIFY TIP FROM LS_TIP.
        CLEAR LS_TIP.
      ENDLOOP.

ENDFORM.

"未刷卡动态排班处理
FORM FU_Z007.
  DATA:LS_TIP LIKE TIP.

IF as-parm2 EQ 'ZDY1'.    "动态排班处理
  CLEAR LS_TIP.
  LOOP AT TIP INTO LS_TIP WHERE PTYPE = '2' OR PTYPE = '3' .
    LS_TIP-PTYPE = '1'.
    MODIFY TIP FROM LS_TIP.
    CLEAR LS_TIP.
  ENDLOOP.
ELSEIF as-parm2 EQ 'ZDY2'.    "动态排班处理还原
  CLEAR LS_TIP.
  LOOP AT TIP INTO LS_TIP WHERE PTYPE = '1' AND ORIGS <> 'E' .
    IF LS_TIP-ORIGS = 'A'.
      LS_TIP-PTYPE = '2'.
    ELSEIF LS_TIP-ORIGS = 'P'.
      LS_TIP-PTYPE = '3'.
    ENDIF.
    MODIFY TIP FROM LS_TIP.
    CLEAR LS_TIP.
  ENDLOOP.
ENDIF.

ENDFORM.


FORM FU_Z008. "周末加班申请,需按排班时间段

  IF as-parm2 EQ 'OFF1'.  "周末加班判断
    LOOP AT ANWKONTI WHERE KTART = '01'
                       AND BEGDA <= PSP-DATUM
                       AND ENDDA >= PSP-DATUM.
    ENDLOOP.
    IF SY-SUBRC = 0 AND ( PSP-TPKLA = '0' or PSP-FTKLA = '1' ).   "周末或者法定节假日
      CLEAR TES.
      TES-ZTART = 'Z016'.   "休息日加班
      TES-ANZHL = '1'.
      APPEND TES.
    ENDIF.

  ELSEIF as-parm2 EQ 'OFF2'. "周末加班标识替换
    LOOP AT ANWKONTI WHERE KTART = '01'
                       AND BEGDA <= PSP-DATUM
                       AND ENDDA >= PSP-DATUM.
    ENDLOOP.
   LOOP AT TIP WHERE ( PTYPE = '1' OR PTYPE = '3' )
                 AND ( ZTYPE = '02' OR ZTYPE = '06' OR ZTYPE = '05') .

    IF TIP-ZTYPE = '05'.
      READ TABLE TZP WITH KEY ZEIT = TIP-BEGTM
                              CODE = '05'.
      IF SY-SUBRC = 0 AND TZP-PDBEZ IS NOT INITIAL.
        TIP-INTKY = TIP-VTYPE.
        TIP-VTYPE = 'M'.
        TIP-VERSL = ANWKONTI-VERSL.
        MODIFY TIP.
      ENDIF.
    ELSE.
      TIP-INTKY = TIP-VTYPE.
      TIP-VTYPE = 'M'.
      TIP-VERSL = ANWKONTI-VERSL.
      MODIFY TIP.
    ENDIF.
   ENDLOOP.

  ELSEIF as-parm2 EQ 'OFF3'. "周末加班标识还原
    LOOP AT TIP WHERE INTKY IS NOT INITIAL .
       TIP-VTYPE = TIP-INTKY .
       CLEAR TIP-INTKY.
       MODIFY TIP.
     ENDLOOP.
  ENDIF.

ENDFORM.


FORM FU_Z009.

  Delete ANWKONTI where KTART = '02' and begda = psp-datum.   "删除添加的02缺勤类型。
  DELETE ZKO WHERE SUBTY = '02' AND BEGDA = psp-datum.   "删除添加的02缺勤类型。

  CHECK TIP[] IS NOT INITIAL.

  READ TABLE ANWKONTI WITH KEY BEGDA = PSP-DATUM ."如果当日有加班申请
  IF SY-SUBRC = 0 AND ANWKONTI-BEGUZ > '000001'.
    DATA:ZHRS TYPE ANZ34,
         Z013 TYPE ANZ34,
         Z018 TYPE ANZ34,
         tipanzhl type anz34,
         idx type i.
    CLEAR:ZHRS,Z013,Z018.
    READ TABLE TES WITH KEY ZTART = 'Z013'.
    IF SY-SUBRC = 0.
      Z013 = TES-ANZHL.
    ENDIF.
    READ TABLE TES WITH KEY ZTART = 'Z018'.
    IF SY-SUBRC = 0.
      Z018 = TES-ANZHL.
    ENDIF.

    ZHRS = 1 / 6 .  "10分钟
    DATA: TMP_JIABAN_BEG(6).
    READ TABLE TES WITH KEY ZTART = 'Z203'.
    IF SY-SUBRC = 0.
        TMP_JIABAN_BEG = ANWKONTI-BEGUZ.
        ADD 1 TO TMP_JIABAN_BEG+0(2).
    ELSE .
      data: LT_TPROG like TABLE OF ZHR_TPROG WITH HEADER LINE.
      CLEAR:LT_TPROG[],LT_TPROG.
      SELECT SINGLE * INTO CORRESPONDING FIELDS OF LT_TPROG FROM ZHR_TPROG WHERE TPROG = psp-tprog AND BEGDA <= PSP-DATUM AND ENDDA >= PSP-DATUM.
       if LT_TPROG-SOLLZ1 > ZHRS.
         TMP_JIABAN_BEG = tzp-ZEIT.
       else.
         TMP_JIABAN_BEG = ANWKONTI-BEGUZ.
       endif.
    ENDIF.

    IF Z013 > 0 AND Z013 = Z018 .
      LOOP AT TIP WHERE BEGTM >= TMP_JIABAN_BEG AND ORIGS = 'E' AND ANZHL > ZHRS .
        tipanzhl = tipanzhl + TIP-ANZHL.
      ENDLOOP.
      IF  tipanzhl > 0 .
        loop at TES Where ZTART = 'Z018'.
            idx = sy-tabix.
        endloop.
        TES-ANZHL = tipanzhl .
        MODIFY TES INDEX idx.
      ENDIF.
    ENDIF.

  ELSE.  "如果没有加班申请
    DATA: WA_TPROG LIKE ZHR_TPROG.
    IF PSP-TPROG NE 'OFF'.
      SELECT SINGLE * INTO CORRESPONDING FIELDS OF WA_TPROG FROM ZHR_TPROG WHERE TPROG = PSP-TPROG.
        IF SY-SUBRC = 0 AND WA_TPROG-BEGTM3 > '000001'.
          if WA_TPROG-ENDTM3 < WA_TPROG-BEGTM3.
            add 24 to WA_TPROG-ENDTM3+0(2).
          endif.
          PERFORM DEZIMAL USING WA_TPROG-BEGTM3.
          PERFORM DEZIMAL USING WA_TPROG-ENDTM3.

          LOOP AT TIP WHERE ENDTM > WA_TPROG-BEGTM3 AND ORIGS = 'E'.
            IF TIP-BEGTM < WA_TPROG-BEGTM3.
              TIP-BEGTM = WA_TPROG-BEGTM3.
            ENDIF.
            IF TIP-ENDTM > WA_TPROG-ENDTM3.
              TIP-ENDTM = WA_TPROG-ENDTM3.
            ENDIF.

            TES-ZTART = 'Z018'.
            TES-ANZHL = ( TIP-ENDTM  - TIP-BEGTM ) / 10000 .
            APPEND TES.
          ENDLOOP.
        ENDIF.
    ELSE.
      READ TABLE TES with key ZTART = 'Z018'.
      IF SY-SUBRC <> 0.
        TES-ZTART = 'Z018'.
        CLEAR TES-ANZHL.
        LOOP AT TIP WHERE ORIGS = 'E'.
           TES-ANZHL = TES-ANZHL + TIP-ANZHL.
        ENDLOOP.
        APPEND TES.
      ENDIF.
    ENDIF.

  ENDIF.

ENDFORM.


FORM FU_Z010.
  DATA: INDX TYPE I,
        INDX2 TYPE I,
        INDX3 TYPE I,
        HOURS TYPE PTM_QUONUM,
       ZLIANBAN(1),
       ZLGART TYPE LGART.
  CLEAR:INDX,INDX2,INDX3,HOURS,ZLIANBAN,ZLGART.

  LOOP AT ANWKONTI WHERE KTART = '01' AND BEGDA = PSP-DATUM AND VERSL = '3' .   "如果加班类型为调休。
    INDX = SY-TABIX.
  ENDLOOP.

*  READ TABLE ANWKONTI WITH KEY KTART = '01' BEGDA = PSP-DATUM VERSL = '3' .   "如果加班类型为调休。
  IF INDX IS NOT INITIAL AND INDX > 0.
    LOOP AT TES WHERE ZTART = 'Z101' OR ZTART = 'Z201' OR ZTART = 'Z009' OR ZTART = 'Z010' OR ZTART = 'Z011'.
      CASE TES-ZTART.
        WHEN 'Z101'.
          ZLIANBAN = 'X'.
        WHEN 'Z201'.
          ZLIANBAN = 'X'.
        WHEN 'Z009'.
          HOURS = TES-ANZHL.
          INDX3 = SY-TABIX.
          ZLGART = '5000'.
        WHEN 'Z010'.
          HOURS = TES-ANZHL.
          INDX3 = SY-TABIX.
          ZLGART = '5001'.
        WHEN 'Z011'.
          HOURS = TES-ANZHL.
          INDX3 = SY-TABIX.
          ZLGART = '5003'.
        WHEN OTHERS.
      ENDCASE.
    ENDLOOP.

    IF  ZLIANBAN = 'X' AND HOURS > 0.
      ANWKONTI-KVERB = ANWKONTI-KVERB + HOURS.
      MODIFY ANWKONTI INDEX INDX.

      "增加 ZKO 中的加班时数
      LOOP AT ZKO WHERE REDAY = PSP-DATUM+6(2) AND SUBTY = '01' AND BEGDA = PSP-DATUM.
        INDX2 = SY-TABIX.
      ENDLOOP.
      IF NOT INDX2 IS INITIAL AND INDX2 > 0.
        ZKO-ANZHL = ZKO-ANZHL + HOURS.
        MODIFY ZKO INDEX INDX2.
      ENDIF.

      "删除TES 中的加班时数
      DELETE TES INDEX INDX3.
      DELETE TES WHERE ZTART = 'Z013'.

      "增加 ZML 中的加班时数
*      CLEAR INDX2.
*      LOOP AT ZML WHERE VERSL = '3'.
*        INDX2 = SY-TABIX.
*      ENDLOOP.
*      IF NOT INDX2 IS INITIAL AND INDX2 > 0.
*        ZML-ANZHL = ZML-ANZHL + HOURS.
*        MODIFY ZML INDEX INDX2.
*      ELSE.
         CLEAR ZML.
         ZML-LGART = ZLGART.
         ZML-VERSL = '3'.
         ZML-ANZHL = HOURS.
         ZML-IFTYP = 'M'.
         APPEND ZML.
*      ENDIF.

    ENDIF.
  ENDIF.

*  DELETE ZKO WHERE SUBTY = '02' AND BEGDA = psp-datum.   "删除添加的02缺勤类型。

ENDFORM.

FORM FU_Z011.
  DATA: INDX TYPE I.
  LOOP AT TIP WHERE VTYPE = 'M' AND ANZHL < 0  .
    INDX = SY-TABIX.
    DELETE TIP INDEX INDX.
  ENDLOOP.

ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Murphy2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值