2010년 01월 06일
슈퍼다운
# by | 2010/01/06 20:20 | Other | 트랙백 | 덧글(0)
# by | 2009/12/18 15:26 | 트랙백 | 덧글(0)
# by | 2009/12/16 11:33 | Interface | 트랙백 | 덧글(0)
# by | 2009/12/16 09:50 | Interface | 트랙백 | 덧글(0)
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 | 2009/12/14 16:41 | HR module | 트랙백 | 덧글(0)
◀ 이전 페이지 다음 페이지 ▶