*----This is the service calculation report for the employees,
* here the employees will get the benifit days depending on the service in the organization
* here we are updating the service calculation amount automatilcally to the infotype 15
* to replicate the amount in the Payroll
REPORT zhr_service_calculation MESSAGE-ID zmsg.
TYPE-POOLS: slis .
TABLES: pa0000,
pa0001,
sscrfields.
TYPES: BEGIN OF ty_pa0000,
pernr TYPE pa0000-pernr,
begda TYPE pa0000-begda,
endda TYPE pa0000-endda,
massn TYPE pa0000-massn,
stat2 TYPE p0000-stat2,
END OF ty_pa0000.
TYPES: BEGIN OF ty_pa0001,
pernr LIKE pa0001-pernr,
begda LIKE pa0001-begda,
endda LIKE pa0001-endda,
werks LIKE pa0001-werks,
persg LIKE pa0001-persg,
persk LIKE pa0001-persk,
btrtl LIKE pa0001-btrtl,
END OF ty_pa0001.
TYPES: BEGIN OF ty_pa0002,
pernr TYPE pa0002-pernr,
begda TYPE pa0002-begda,
endda TYPE pa0002-endda,
vorna TYPE pa0002-vorna,
nachn TYPE pa0002-nachn,
END OF ty_pa0002.
TYPES: BEGIN OF ty_pa0041.
INCLUDE STRUCTURE p0041.
TYPES: END OF ty_pa0041.
TYPES: BEGIN OF ty_pa2001.
INCLUDE STRUCTURE p2001.
TYPES: END OF ty_pa2001.
TYPES: BEGIN OF ty_pa0008.
INCLUDE STRUCTURE p0008.
TYPES: END OF ty_pa0008.
DATA: BEGIN OF wagetypes,
lga LIKE p0008-lga01,
bet LIKE p0008-bet01,
END OF wagetypes.
DATA: BEGIN OF dates,
dar LIKE p0041-dar01,
dat LIKE p0041-dat01,
END OF dates.
DATA: return LIKE bapireturn1.
TYPES: BEGIN OF ty_final,
pernr TYPE pa0000-pernr,
begda TYPE pa0000-begda,
endda TYPE pa0000-endda,
vorna TYPE pa0002-vorna,
nachn TYPE pa0002-nachn,
* werks LIKE pa0001-werks,
* persg LIKE pa0001-persg,
* persk LIKE pa0001-persk,
* btrtl LIKE pa0001-btrtl,
ltype TYPE char50,
bsal TYPE pa0008-bet01,
stat TYPE char20,
syears TYPE i,
smonths TYPE i,
sdays TYPE i,
bendays TYPE p DECIMALS 2,
amount TYPE pa0008-bet01,
amount1 TYPE pa0008-bet01,
END OF ty_final.
TYPES: BEGIN OF ty_prop_values.
INCLUDE STRUCTURE pprop.
TYPES: END OF ty_prop_values.
TYPES: BEGIN OF ty_mod_values.
INCLUDE STRUCTURE pskey.
TYPES: END OF ty_mod_values.
DATA: it_prop_values TYPE TABLE OF ty_prop_values WITH HEADER LINE,
it_mod_values TYPE TABLE OF ty_mod_values WITH HEADER LINE,
it_return TYPE bapireturn .
DATA: lfs_0008 LIKE p0008,
v_bet01 LIKE p0008-bet01,
v_bet02 LIKE p0008-bet01,
v_bet03 LIKE p0008-bet01.
DATA: it_pa0000 TYPE STANDARD TABLE OF ty_pa0000 WITH HEADER LINE,
it_pa0001 TYPE STANDARD TABLE OF ty_pa0001 WITH HEADER LINE,
it_pa0002 TYPE STANDARD TABLE OF ty_pa0002 WITH HEADER LINE,
it_pa0008 TYPE STANDARD TABLE OF ty_pa0008 WITH HEADER LINE,
it_pa0041 TYPE STANDARD TABLE OF ty_pa0041 WITH HEADER LINE,
it_pa2001 TYPE STANDARD TABLE OF ty_pa2001 WITH HEADER LINE,
it_final TYPE STANDARD TABLE OF ty_final WITH HEADER LINE,
it_fieldcat TYPE slis_t_fieldcat_alv,
wa_fieldcat TYPE slis_fieldcat_alv,
it_top_of_page TYPE slis_t_listheader,
it_layout TYPE slis_layout_alv,
it_events TYPE slis_t_event,
wa_events TYPE slis_alv_event,
it_list TYPE slis_t_listheader WITH HEADER LINE,
wa_pa0015 TYPE p0015.
DATA: v_years TYPE i,
v_months TYPE i,
v_days TYPE i,
v_date TYPE sy-datum,
v_addi_bdays TYPE i,
v_addi_bdays1 TYPE i,
v_addi_bdays2 TYPE i,
v_count TYPE i.
CONSTANTS: v_bdays TYPE i VALUE '15'.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECTION-SCREEN END OF BLOCK b1 .
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-002.
SELECT-OPTIONS: s_pernr FOR pa0000-pernr,
s_werks FOR pa0001-werks,
s_btrtl FOR pa0001-btrtl,
s_persg FOR pa0001-persg,
s_persk FOR pa0001-persk.
PARAMETERS: p_date LIKE pa0000-begda DEFAULT sy-datum.
SELECTION-SCREEN END OF BLOCK b3 .
SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-004.
PARAMETERS: r4 RADIOBUTTON GROUP r2 DEFAULT 'X' USER-COMMAND uc1. " Leaving
PARAMETERS: r3 RADIOBUTTON GROUP r2. " Termination
SELECTION-SCREEN BEGIN OF BLOCK b5 WITH FRAME TITLE text-004.
PARAMETERS: r5 RADIOBUTTON GROUP r3 MODIF ID aaa, "with notice period
r6 RADIOBUTTON GROUP r3 MODIF ID aaa. "without notice period
SELECTION-SCREEN END OF BLOCK b5.
SELECTION-SCREEN END OF BLOCK b4 .
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-003.
PARAMETERS: r1 RADIOBUTTON GROUP r1, " Test Run
r2 RADIOBUTTON GROUP r1. " Actual Run
SELECTION-SCREEN END OF BLOCK b2 .
AT SELECTION-SCREEN .
IF sscrfields = 'ONLI'.
IF p_date IS INITIAL.
MESSAGE e043 WITH 'Enter A Valid Date'.
ENDIF.
ENDIF.
AT SELECTION-SCREEN OUTPUT .
IF r4 = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'AAA'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
START-OF-SELECTION.
PERFORM get_data.
END-OF-SELECTION.
PERFORM process_data.
PERFORM build_fieldcat.
PERFORM display_alv.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*----------------------------------------------------------------------*
FORM get_data .
IF p_date IS INITIAL.
p_date = sy-datum.
ENDIF.
IF r3 = 'X'.
SELECT pernr
begda
endda
massn
stat2
FROM pa0000
INTO TABLE it_pa0000
WHERE pernr IN s_pernr
AND begda LE p_date
AND endda GE p_date.
* AND massn EQ '20'. " termination
ELSE.
SELECT pernr
begda
endda
massn
stat2
FROM pa0000
INTO TABLE it_pa0000
WHERE pernr IN s_pernr
AND begda LE p_date
AND endda GE p_date
AND massn EQ '10'. "Leaving
ENDIF.
IF NOT it_pa0000[] IS INITIAL.
SORT it_pa0000 BY pernr begda.
DELETE ADJACENT DUPLICATES FROM it_pa0000 COMPARING pernr.
SELECT *
FROM pa0041
INTO CORRESPONDING FIELDS OF TABLE it_pa0041
FOR ALL ENTRIES IN it_pa0000
WHERE pernr = it_pa0000-pernr.
IF sy-subrc = 0.
SELECT pernr
begda
endda
werks
persg
persk
btrtl
FROM pa0001
INTO TABLE it_pa0001
FOR ALL ENTRIES IN it_pa0000
WHERE pernr = it_pa0000-pernr
AND werks IN s_werks
AND btrtl IN s_btrtl
AND persg IN s_persg
AND persk IN s_persk.
DELETE ADJACENT DUPLICATES FROM it_pa0001 COMPARING pernr.
SELECT pernr
begda
endda
vorna
nachn
FROM pa0002
INTO TABLE it_pa0002
FOR ALL ENTRIES IN it_pa0000
WHERE pernr = it_pa0000-pernr.
IF NOT it_pa0002[] IS INITIAL.
SORT it_pa0002 BY pernr.
ENDIF.
SELECT * FROM pa0008
INTO CORRESPONDING FIELDS OF TABLE it_pa0008
FOR ALL ENTRIES IN it_pa0000
WHERE pernr = it_pa0000-pernr
AND begda LE p_date
AND endda GE p_date.
IF sy-subrc = 0.
SORT it_pa0008 BY pernr ASCENDING begda DESCENDING.
ENDIF.
ENDIF.
SELECT * FROM pa2001
INTO CORRESPONDING FIELDS OF TABLE it_pa2001
FOR ALL ENTRIES IN it_pa0000
WHERE pernr = it_pa0000-pernr
AND subty = '5100'
OR subty = '5110'.
IF sy-subrc = 0.
SORT it_pa2001 BY pernr.
ENDIF.
ENDIF.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form PROCESS_DATA
*----------------------------------------------------------------------*
FORM process_data .
LOOP AT it_pa0001.
READ TABLE it_pa0000 WITH KEY pernr = it_pa0001-pernr.
IF sy-subrc = 0.
it_final-pernr = it_pa0000-pernr.
CASE: it_pa0000-stat2.
WHEN '0'.
it_final-stat = 'Withdrawn'.
WHEN '1'.
it_final-stat = 'Inactive'.
WHEN '2'.
it_final-stat = 'Retiree'.
WHEN '3'.
it_final-stat = 'Active'.
ENDCASE.
ENDIF.
READ TABLE it_pa0002 WITH KEY pernr = it_pa0001-pernr.
IF sy-subrc = 0.
it_final-vorna = it_pa0002-vorna.
it_final-nachn = it_pa0002-nachn.
ENDIF.
* it_final-werks = it_pa0001-werks.
* it_final-persg = it_pa0001-persg.
* it_final-persk = it_pa0001-persk.
* it_final-btrtl = it_pa0001-btrtl.
READ TABLE it_pa0041 WITH KEY pernr = it_pa0000-pernr.
IF sy-subrc = 0.
DO 12 TIMES VARYING dates-dar FROM it_pa0041-dar01 NEXT it_pa0041-dar02
VARYING dates-dat FROM it_pa0041-dat01 NEXT it_pa0041-dat02.
CHECK dates-dar IS NOT INITIAL.
IF dates-dar = '01'.
it_final-begda = dates-dat.
ENDIF.
ENDDO.
ENDIF.
IF it_final-begda IS INITIAL.
it_final-begda = it_pa0001-begda.
ENDIF.
CALL FUNCTION 'HR_SGPBS_YRS_MTHS_DAYS'
EXPORTING
beg_da = it_final-begda
end_da = p_date
IMPORTING
no_day = v_days
no_month = v_months
no_year = v_years
EXCEPTIONS
dateint_error = 1
OTHERS = 2.
it_final-syears = v_years.
it_final-smonths = v_months.
it_final-sdays = v_days.
CHECK v_years GE 2.
READ TABLE it_pa0008 WITH KEY pernr = it_pa0001-pernr.
IF sy-subrc = 0.
CLEAR : lfs_0008.
MOVE-CORRESPONDING it_pa0008 TO lfs_0008.
DO 40 TIMES VARYING wagetypes-lga FROM lfs_0008-lga01 NEXT lfs_0008-lga02
VARYING wagetypes-bet FROM lfs_0008-bet01 NEXT lfs_0008-bet02.
CHECK wagetypes-lga IS NOT INITIAL.
CASE wagetypes-lga.
WHEN '1000'. " Basic pay
v_bet01 = wagetypes-bet.
it_final-bsal = wagetypes-bet.
* WHEN '1010'.
* v_bet01 = v_bet01 + wagetypes-bet.
*
* WHEN '1020'.
* v_bet01 = v_bet01 + wagetypes-bet.
ENDCASE.
ENDDO.
ENDIF.
IF r4 = 'X'. "Resignation process
DATA: no_of_days TYPE i,
v_updays TYPE i,
v_kaltg TYPE pa2001-kaltg.
CALL FUNCTION 'HR_99S_INTERVAL_BETWEEN_DATES'
EXPORTING
begda = it_final-begda
endda = p_date
IMPORTING
days = no_of_days.
LOOP AT it_pa2001 WHERE pernr = it_final-pernr.
v_kaltg = it_pa2001-kaltg.
ENDLOOP.
v_updays = v_kaltg.
IF v_years GE 2 AND v_years LT 5.
it_final-amount = ( 1 / 3 ) * v_bet01 * ( ( no_of_days - v_updays ) / 365 ) .
ELSEIF v_years GE 5 AND v_years LT 10.
it_final-amount = ( 2 / 3 ) * v_bet01 * ( ( no_of_days - v_updays ) / 365 ) .
ELSE.
it_final-amount = v_bet01 * ( ( no_of_days - v_updays ) / 365 ) .
ENDIF.
ELSE. " Termination Process
IF v_years LT 2.
it_final-amount = v_bet01 / 12 / v_years.
ELSE.
ENDIF.
ENDIF.
IF r4 = 'X'.
it_final-ltype = 'Leaving'.
ELSEIF r3 = 'X'.
IF r5 = 'X'.
it_final-ltype = 'Terminated with Notice Period '.
ELSEIF r6 = 'X'.
it_final-ltype = 'Terminated without Notice Period'.
ENDIF.
ENDIF.
APPEND it_final.
CLEAR it_final.
CLEAR: v_years, v_addi_bdays, v_months, v_days, v_count.
ENDLOOP.
IF r2 = 'X'.
DATA: l_answer TYPE c.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Update info type 0015(Additional Payments)'
text_question = 'Do you want to update the data to infotype 0015 (Additional Payments)'
text_button_1 = 'Yes'
icon_button_1 = 'ICON_OKEY'
text_button_2 = 'No'
icon_button_2 = 'ICON_CANCEL'
default_button = '1'
display_cancel_button = 'X'
IMPORTING
answer = l_answer.
IF l_answer = '1'.
LOOP AT it_final.
PERFORM update_pa0015.
ENDLOOP.
ELSE.
MESSAGE s000 WITH 'Update was Failed'.
ENDIF.
ENDIF.
ENDFORM. " PROCESS_DATA
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*----------------------------------------------------------------------*
FORM build_fieldcat .
it_layout-colwidth_optimize = 'X'.
wa_fieldcat-fieldname = 'PERNR'.
wa_fieldcat-seltext_m = 'Personnel Number'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
wa_fieldcat-fieldname = 'BEGDA'.
wa_fieldcat-seltext_m = 'Start Date'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
* wa_fieldcat-fieldname = 'ENDDA'.
* wa_fieldcat-seltext_m = 'End Date'.
* wa_fieldcat-just = 'C'.
* APPEND wa_fieldcat TO it_fieldcat.
* CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'VORNA'.
wa_fieldcat-seltext_m = 'First Name'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'NACHN'.
wa_fieldcat-seltext_m = 'Last Name'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
* wa_fieldcat-fieldname = 'WERKS'.
* wa_fieldcat-seltext_l = 'Personnel Area'.
* wa_fieldcat-just = 'C'.
* APPEND wa_fieldcat TO it_fieldcat.
* CLEAR wa_fieldcat.
*
* wa_fieldcat-fieldname = 'BTRTL'.
* wa_fieldcat-seltext_l = 'Pers...nnel Subarea'.
* wa_fieldcat-just = 'C'.
* APPEND wa_fieldcat TO it_fieldcat.
* CLEAR wa_fieldcat.
*
* wa_fieldcat-fieldname = 'PERSG'.
* wa_fieldcat-seltext_l = 'Employee Group'.
* wa_fieldcat-just = 'C'.
* APPEND wa_fieldcat TO it_fieldcat.
* CLEAR wa_fieldcat.
*
* wa_fieldcat-fieldname = 'PERSK'.
* wa_fieldcat-seltext_l = 'Employee Subgroup'.
* wa_fieldcat-just = 'C'.
* APPEND wa_fieldcat TO it_fieldcat.
* CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'STAT'.
wa_fieldcat-seltext_l = 'Employment Status'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'SYEARS'.
wa_fieldcat-seltext_m = 'No of Service Years'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'SMONTHS'.
wa_fieldcat-seltext_m = 'No of Service Months'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'SDAYS'.
wa_fieldcat-seltext_m = 'No of Service Days'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'LTYPE'.
wa_fieldcat-seltext_m = 'Type of Leaving'.
wa_fieldcat-just = 'L'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'BSAL'.
wa_fieldcat-seltext_m = 'Basic Pay'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'AMOUNT'.
wa_fieldcat-seltext_m = 'Final Benifit Amount'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = 'AMOUNT1'.
wa_fieldcat-seltext_m = 'Notice Period Amount'.
wa_fieldcat-just = 'C'.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
ENDFORM. " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV
*----------------------------------------------------------------------*
FORM display_alv .
it_layout-zebra = 'X'.
it_layout-colwidth_optimize = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_top_of_page = 'TOP_OF_PAGE'
is_layout = it_layout
it_fieldcat = it_fieldcat
it_events = it_events
TABLES
t_outtab = it_final.
ENDFORM. " DISPLAY_ALV
*&---------------------------------------------------------------------*
*& Form top_of_page
*----------------------------------------------------------------------*
FORM top_of_page .
PERFORM write_header.
*--- Get the comments on the top of page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = it_list[].
ENDFORM. " top_of_page
*&---------------------------------------------------------------------*
*& Form write_header
*----------------------------------------------------------------------*
FORM write_header .
REFRESH it_list.
CLEAR it_list.
CLEAR it_list.
it_list-typ = 'H'.
it_list-key = space.
it_list-info = 'Jubail O & M Company Limited'.
APPEND it_list TO it_list.
CLEAR it_list.
it_list-typ = 'H'.
it_list-key = space.
it_list-info = 'End of Service Benifit Report'.
APPEND it_list TO it_list.
***** REPORT PROGRAM NAME AND CLIENT ***************
it_list-typ = 'S'.
it_list-key = space.
CONCATENATE 'Report...:' sy-repid INTO it_list-info SEPARATED BY space.
APPEND it_list TO it_list.
***** USER NAME ************************************
CLEAR it_list.
it_list-typ = 'S'.
it_list-key = space.
CONCATENATE 'User.....:' sy-uname INTO it_list-info SEPARATED BY space.
APPEND it_list TO it_list.
**...* DATE / TIME STAMP *****************************
CLEAR it_list.
it_list-typ = 'S'.
it_list-key = space.
CONCATENATE 'Date/Time:' ' ' sy-datum+6(2) '/' sy-datum+4(2) '/' sy-datum+0(4)
' ' '/' ' ' sy-uzeit+0(2) ':' sy-uzeit+2(2) ':' sy-uzeit+4(2)
INTO it_list-info.
APPEND it_list TO it_list.
ENDFORM. " write_header
*&---------------------------------------------------------------------*
*& Form UPDATE_PA0015
*----------------------------------------------------------------------*
FORM update_pa0015 .
it_prop_values-infty = '0015'.
it_prop_values-fname = 'P0015-INFTY'.
it_prop_values-fval = '0015'.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-SUBTY'.
it_prop_values-fval = '3030'.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-BEGDA'.
it_prop_values-fval = sy-datum.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-ENDDA'.
it_prop_values-fval = sy-datum.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-AEDTM'.
it_prop_values-fval = sy-datum.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-UNAME'.
it_prop_values-fval = sy-uname.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-LGART'.
it_prop_values-fval = '3030'.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-BETRG'.
it_prop_values-fval = it_final-amount.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-WAERS'.
it_prop_values-fval = 'SAR'.
APPEND it_prop_values.
it_prop_values-fname = 'P0015-ESTDT'.
it_prop_values-fval = sy-datum.
APPEND it_prop_values.
CALL FUNCTION 'HR_MAINTAIN_MASTERDATA'
EXPORTING
pernr = it_pa0000-pernr
actio = 'INS'
tclas = 'A'
begda = sy-datum
endda = '99991231'
subty = '3030'
dialog_mode = '0'
luw_mode = '1'
no_existence_check = 'X'
no_enqueue = ' '
IMPORTING
return = it_return
TABLES
proposed_values = it_prop_values
modified_keys = it_mod_values.
ENDFORM. " UPDATE_PA0015