슈퍼다운

by saper | 2010/01/06 20:20 | Other | 트랙백 | 덧글(0)

ALE EDI IDOC

ALE EDI IDOC 에 대해 매우 잘 설명해놓은 전자 도서 ALE_EDI_IDOC_TECHNOLOGY_FOR_SAP_2_EDITION.zip

by saper | 2009/12/16 11:33 | Interface | 트랙백 | 덧글(0)

idoc 관련 자료

매우 쉽게 잘 설명해놓았음 IDocBook.pdf

by saper | 2009/12/16 09:50 | Interface | 트랙백 | 덧글(0)

급여스키마 (KRT0) (1)

COM                         General processing of time data
COM                         ****************************************
BLOCK BEG                   Processing of time data
MOD   KRM0 GEN              Determine Korea specific modifiers
MOD   XMOD GEN              Determine payroll modifiers
GENPS                       Generate personal work schedule PWS
PARTT                       Partial period parameter
IF    X064                  Perform shift change compensation
PITAB D    DPS               Initialize table DPS
P2003      S**  DPS          Insert shift substitution in PWS
ELSE                        Do not perform shift change compens.
P2003      S**               Import shift substitutions into PWS
ENDIF                       End shift change compensation
PARTT      PSP            * Partial month param.with substs in DIVI
Z_SUP                       진료지원수당 산출 (시급에 포함)

1.  MOD KRM0 GEN.
한국전용의 급여변형 수정자 값들을 셋팅하는 부분 (건드릴 필요 없음)

2. MOD XMOD GEN.
전세계 공용의 급여변형 수정자 값들을 셋팅하는 부분 (건드릴 필요 없음)

3. GENPS
현재 계산하려고 하는 급여계산 기간의 WORK SCHEDULE을 불러오는 펑션

4. PARTT
대체근무 스케쥴로부터 급여계산 부분 팩토링에 필요한 값들을 계산하여 WPBP 테이블에 저장

5. IF X064
PITAB D DPS
P2003 S** DPS
ELSE
P2003 S**
ENDIF

급여계산 규칙 X064의 값이 TRUE 일 경우 DPS 인터널테이블 내역을 모두 삭제하고 P2003의 모든 대체근무유형들을 DPS 테이블에저장시키며 X064의 값이 FALSE일 경우에는 P2003의 모든 대체근무유형들을 PSP 테이블에 저장시킨다. 여기서 X064 PCR 값은 T로 돼 있기때문에 윗부분 로직을 타게 된다. 

6. Z_SUP
 시급에 포함될 진료지원수당 산출을 위한 CBO 급여 펑션

FORM fuz_SUP.

* 진료지원 수당은 전월분을 지급한다.
     PERFORM       generate_medical_support.

* 퇴직 정산일 경우는 당월분을 산출하여 지급한다.
     IF       APER-OCRSN   =      '0007'
        OR    APER-OCRSN   =      '0008'.
              PERFORM       generate_medical_support_TEJIK.
     ENDIF.

ENDFORM.                    "FUZ_SUP

FORM generate_medical_support .

  DATA   :  BEGIN   OF   it_begda  OCCURS   0,
                    betrg      LIKE         it-betrg.
                    INCLUDE STRUCTURE       p0001.
*                    begda      TYPE         sy-datum,
*                    ENDDA      TYPE         sy-datum,
  DATA   :   END     OF   it_begda.

  DATA   :  wa_it   LIKE       LINE   OF    it.

* 현재 급여완료일자의 한달 전일.
  DATA  :   lw_begda            LIKE    sy-datum,
            lw_endda            LIKE    sy-datum.

  DATA   :  l_check.
* 급여기간 산정
  DATA   :  wk_permo(02).
  DATA   :  cal_begda          TYPE    d,
            cal_endda          TYPE    d.

*  아래 순환문에서 단위 기간의 앞날짜
  DATA   :  tmp_betrg        LIKE    it-betrg.

  DATA   :  pn_per           LIKE    pc261-fpper.   "급여관리 대상기간(년월)


** 전월 급여기간  산출
  IF        pernr-abkrs      =      'C1'.
            wk_permo         =      '95'.
  ELSEIF    pernr-abkrs      =      'C3'.
            wk_permo         =      '97'.
  ELSE.
            wk_permo         =      '96'.
  ENDIF.

* 현재 급여완료일자의 한달 전일 구하기
  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
    EXPORTING
      date      = aper-endda
      days      = '00'
      months    = '01'
      signum    = '-'
      years     = '00'
    IMPORTING
      calc_date = lw_endda.

  SELECT    SINGLE     *     FROM   t549q
   WHERE    permo      =     wk_permo
     AND    begda     <=     lw_endda
     AND    endda     =>     lw_endda.

* 레지던트,인턴은 당월기준 그외는 전월기준으로 지급한다.
  IF      p0001-persk       =    '28'       "레지던트
     OR   p0001-persk       =    '29'.      "인턴
          cal_begda         =     aper-begda.
          cal_endda         =     aper-endda.
  ELSE.
          cal_begda         =     t549q-begda.
          cal_endda         =     t549q-endda.
  ENDIF.

  CLEAR  :     it_begda,
               it_begda[],
               tmp_betrg.

  SORT   p0001    BY   begda.

* 일할 계산을 위한 레코드 시작일자를 산출.
  LOOP   AT    p0001
         WHERE         begda     <=      cal_endda
               AND     endda     >=      cal_begda.

    IF       p0001-begda      <        cal_begda
       AND   P0001-ENDDA     >=        CAL_BEGDA.
             MOVE-CORRESPONDING        P0001   TO    IT_BEGDA.
             it_begda-begda   =        cal_begda.
             PERFORM          medical_support_allowance
                              USING    it_begda-betrg  cal_begda.
             APPEND           it_begda.
    ENDIF.

    IF       p0001-begda     >=        cal_begda
       AND   p0001-begda     <=        cal_endda.
             MOVE-CORRESPONDING        P0001   TO    IT_BEGDA.
             it_begda-begda   =        p0001-begda.
             PERFORM          medical_support_allowance
                              USING    it_begda-betrg  cal_begda.
             APPEND           it_begda.
    ENDIF.

  ENDLOOP.

  SORT         it_begda     BY       begda.

* 혹시 중복적인 정보는 삭제
  DELETE       ADJACENT     DUPLICATES    FROM     it_begda.

  DATA  :  it_line          TYPE     i    VALUE    1.
  DATA  :  wbegda           LIKE     it_begda.
  DATA  :  cpbegda          LIKE     it_begda
                            OCCURS   0    WITH   HEADER   LINE.

  CLEAR :     cpbegda[].
  cpbegda[] = it_begda[].

* 시작일자만 산출한 레코드에 종료일자 산출
  LOOP     AT     cpbegda.

        CLEAR  :  wbegda.

        it_line   =      it_line   +      1.

        READ    TABLE    it_begda  INTO   wbegda   INDEX   it_line.

        IF      sy-subrc           <>     0.
                cpbegda-endda      =      cal_endda.
        ELSE.
                cpbegda-endda      =      wbegda-begda   -   1.
        ENDIF.

        MODIFY  cpbegda.

  ENDLOOP.

  CLEAR  :    it_begda ,
              it_begda[].

  SORT   cpbegda    BY     begda.

  it_begda[] = cpbegda[].

  MOVE-CORRESPONDING        it       TO       wa_it.

* 기간별로 해당금액을 가져와서 cal_beg ~ cal_end 기준으로 일할계산
  LOOP     AT     it_begda.
* 기간내의 진료지원수당을 산출한다. 일할계산한다.
    tmp_betrg   =        tmp_betrg
                +      ( it_begda-betrg
                *      ( it_begda-ENDDA -  it_begda-BEGDA + 1 )
                /      ( cal_endda      -  cal_begda      + 1 ) ).
  ENDLOOP.

  IF     tmp_betrg     <>     0.

         MOVE-CORRESPONDING      wpbp      TO     it.

         IF   WPBP-PERSG    =     '2'.          " 의사직
              it-lgart      =     '1520'.
         ELSE.
              it-lgart      =     '1500'.
         ENDIF.

         it-betrg    =      tmp_betrg.
         COLLECT     it.

  ENDIF.

* 진료지원 수당 가산금 산정 (정규직 직원에 한해서 지급)

  CHECK      WPBP-PERSG   =    '3'          "일반직
     OR      WPBP-PERSG   =    '4'          "원무직
     OR      WPBP-PERSK   =    '28'         "레지던트
     OR      WPBP-PERSK   =    '29'.        "인턴

  DATA : pay_BET01          LIKE     zhrpyt009-BET01.

  CLEAR  :     tmp_betrg.

  LOOP     AT     it_begda.

        SELECT  SINGLE  BET01  FROM  zhrpyt009
                               INTO  pay_BET01
                     WHERE   persk  =  IT_BEGDA-persk
                       AND   ORGEH  =  IT_BEGDA-ORGEH
                       AND   begda <=  IT_BEGDA-begda
                       AND   endda >=  IT_BEGDA-begda.

        IF   sy-subrc    =        0.
             tmp_betrg   =        tmp_betrg
                         +      ( pay_BET01
                         *      ( it_begda-ENDDA -  it_begda-BEGDA + 1 )
                         /      ( cal_endda      -  cal_begda      + 1 ) ).
        ELSE.
             SELECT  SINGLE  BET01  FROM  zhrpyt009
                               INTO  pay_BET01
                     WHERE   persk  =  ' '
                       AND   ORGEH  =  IT_BEGDA-ORGEH
                       AND   begda <=  IT_BEGDA-begda
                       AND   endda >=  IT_BEGDA-begda.
             IF   sy-subrc    =        0.
                  tmp_betrg   =        tmp_betrg
                              +      ( pay_BET01
                              *      ( it_begda-ENDDA -  it_begda-BEGDA + 1 )
                              /      ( cal_endda      -  cal_begda      + 1 ) ).
             ENDIF.
        ENDIF.

  ENDLOOP.

  IF     tmp_betrg     <>     0.
         MOVE-CORRESPONDING      wpbp      TO     it.
         it-lgart    =     '1510'.            "진료지원수당 가산금
         it-betrg    =      tmp_betrg.
         COLLECT     it.
  ENDIF.


ENDFORM.                    " GENERATE_MEDICAL_SUPPORT

----------------------------------------------------------------------------------------

FORM generate_medical_support_tejik .

  DATA   :  BEGIN   OF   it_begda  OCCURS   0,
              betrg      LIKE         it-betrg.
             INCLUDE STRUCTURE       p0001.
*                    begda      TYPE         sy-datum,
*                    ENDDA      TYPE         sy-datum,
  DATA   :   END     OF   it_begda.

  DATA   :  wa_it   LIKE       LINE   OF    it.

* 급여기간 산정
  DATA   :  wk_permo(02).
  DATA   :  cal_begda          TYPE    d,
            cal_endda          TYPE    d.

*  아래 순환문에서 단위 기간의 앞날짜
  DATA   :  tmp_begda        LIKE    sy-datum.
  DATA   :  tmp_betrg        LIKE    it-betrg.

* 레지던,인턴은 당월기준으로 지급하므로 제외
  CHECK     p0001-persk      <>   '28'
     AND    p0001-persk      <>   '29'.

  cal_begda         =     aper-begda.
  cal_endda         =     aper-endda.

  CLEAR  :     it_begda,
               it_begda[],
               tmp_betrg.

  SORT   p0001    BY   begda.

* 일할 계산을 위한 레코드 시작일자를 산출.
  LOOP   AT    p0001
         WHERE         begda     <=      cal_endda
               AND     endda     >=      cal_begda.

    IF       p0001-begda      <        cal_begda
       AND   P0001-ENDDA     >=        CAL_BEGDA.
             MOVE-CORRESPONDING        P0001   TO    IT_BEGDA.
             it_begda-begda   =        cal_begda.
             PERFORM          medical_support_allowance
                              USING    it_begda-betrg  cal_begda.
             APPEND           it_begda.
    ENDIF.

    IF       p0001-begda     >=        cal_begda
       AND   p0001-begda     <=        cal_endda.
             MOVE-CORRESPONDING        P0001   TO    IT_BEGDA.
             it_begda-begda   =        p0001-begda.
             PERFORM          medical_support_allowance
                              USING    it_begda-betrg  cal_begda.
             APPEND           it_begda.
    ENDIF.

  ENDLOOP.

  SORT         it_begda     BY       begda.
* 혹시 중복적인 정보는 삭제
  DELETE       ADJACENT     DUPLICATES    FROM     it_begda.

  DATA  :  it_line          TYPE     i    VALUE    1.
  DATA  :  wbegda           LIKE     it_begda.
  DATA  :  cpbegda          LIKE     it_begda
                            OCCURS   0    WITH   HEADER   LINE.

  CLEAR :     cpbegda[].
  cpbegda[] = it_begda[].

* 시작일자만 산출한 레코드에 종료일자 산출
  LOOP     AT     cpbegda.

        CLEAR  :  wbegda.

        it_line   =      it_line   +      1.

        READ    TABLE    it_begda  INTO   wbegda   INDEX   it_line.

        IF      sy-subrc           <>     0.
                cpbegda-endda      =      cal_endda.
        ELSE.
                cpbegda-endda      =      wbegda-begda   -   1.
        ENDIF.

        MODIFY  cpbegda.

  ENDLOOP.

  CLEAR  :    it_begda ,
              it_begda[].

  SORT   cpbegda    BY     begda.

  it_begda[] = cpbegda[].

  tmp_begda    =            cal_begda.

  MOVE-CORRESPONDING        it       TO       wa_it.

* 기간별로 해당금액을 가져와서 cal_beg ~ cal_end 기준으로 일할계산
  LOOP     AT     it_begda.
* 기간내의 진료지원수당을 산출한다. 일할계산한다.
    tmp_betrg   =        tmp_betrg
                +      ( it_begda-betrg
                *      ( it_begda-ENDDA -  it_begda-BEGDA + 1 )
                /      ( cal_endda      -  cal_begda      + 1 ) ).
  ENDLOOP.

  IF          tmp_betrg     <>     0.
      LOOP    AT    wpbp.
              MOVE-CORRESPONDING      wpbp      TO     it.

              IF   WPBP-PERSG    =     '2'.          " 의사직
                   it-lgart      =     '1521'.
              ELSE.
                   it-lgart      =     '1501'.
              ENDIF.

              it-betrg    =      tmp_betrg.
              COLLECT     it.
      ENDLOOP.
  ENDIF.

* 진료지원 수당 가산금 산정(정규직 직원에 한해서 지급)

  CHECK      WPBP-PERSG   =    '3'
     OR      WPBP-PERSG   =    '4'.

  DATA : pay_BET01          LIKE     zhrpyt009-BET01.

  CLEAR  :     tmp_betrg.

  LOOP     AT     it_begda.

        SELECT  SINGLE  BET01  FROM  zhrpyt009
                               INTO  pay_BET01
                     WHERE   persk  =  IT_BEGDA-persk
                       AND   ORGEH  =  IT_BEGDA-ORGEH
                       AND   begda <=  IT_BEGDA-begda
                       AND   endda >=  IT_BEGDA-begda.

        IF   sy-subrc    =        0.
             tmp_betrg   =        tmp_betrg
                         +      ( pay_BET01
                         *      ( it_begda-ENDDA -  it_begda-BEGDA + 1 )
                         /      ( cal_endda      -  cal_begda      + 1 ) ).
        ELSE.
             SELECT  SINGLE  BET01  FROM  zhrpyt009
                               INTO  pay_BET01
                     WHERE   persk  =  ' '
                       AND   ORGEH  =  IT_BEGDA-ORGEH
                       AND   begda <=  IT_BEGDA-begda
                       AND   endda >=  IT_BEGDA-begda.
             IF   sy-subrc    =        0.
                  tmp_betrg   =        tmp_betrg
                              +      ( pay_BET01
                              *      ( it_begda-ENDDA -  it_begda-BEGDA + 1 )
                              /      ( cal_endda      -  cal_begda      + 1 ) ).
             ENDIF.
        ENDIF.

  ENDLOOP.

  IF          tmp_betrg     <>     0.
      LOOP    AT    wpbp.
              MOVE-CORRESPONDING      wpbp      TO     it.
              it-lgart    =     '1511'.       "진료지원수당 가산금
              it-betrg    =      tmp_betrg.
              COLLECT     it.
      ENDLOOP.
  ENDIF.

ENDFORM.                    " GENERATE_MEDICAL_SUPPORT_TEJIK



by saper | 2009/12/14 16:41 | HR module | 트랙백 | 덧글(0)

◀ 이전 페이지 다음 페이지 ▶