This function module retrieves the workflow level (pending approvals) for a leave request in SAP. It checks the employee's org unit, job level, and leave dates to determine the appropriate approvers at different levels (unit, sub-group, multi-level), and reads the workflow container to get the current approval step. The module was updated in June 2009 to fix a bug related to leave workflow levels.
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
100%(1)100% found this document useful (1 vote)
346 views20 pages
Sap WORKFLOW
This function module retrieves the workflow level (pending approvals) for a leave request in SAP. It checks the employee's org unit, job level, and leave dates to determine the appropriate approvers at different levels (unit, sub-group, multi-level), and reads the workflow container to get the current approval step. The module was updated in June 2009 to fix a bug related to leave workflow levels.
*& Object Name : FS-HCM-REP-030 &* *& Program Name : YH_WORKFLOW_LEVEL &* *& Transaction Code: N/A &* *& Author : Kedar Prasad &* *& Module Name : HR &* *& Sub-Module : HCM &* *& Program Type : Function Module Create Date : 16.06.2009 &* *& SAP Release : 5.0 Transport No : RD1K929338 &* *& Description : This function module is being called in YHRADMIN &* *& report to give workflow pending level &* *&********************************************************************&* *& &* *& H I S T O R Y O F R E V I S I O N S &* *&____________________________________________________________________&* *& Date Programmer Request Description &* *& 06/08/2009 Kedar Prasad RD1K930162 Bug fixing for leave &* *& (KP01) ECC HR-HO#159 workflow level &* *& &* *&********************************************************************&*
FUNCTION yh_workflow_level. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" REFERENCE(WI_ID) TYPE SWW_WIID *" REFERENCE(PERNR) TYPE PERSNO *" REFERENCE(AGENT) TYPE SYUNAME *" EXPORTING *" REFERENCE(WF_LEVEL) TYPE CHAR20 *"---------------------------------------------------------------------- INCLUDE <cntn01>.
TYPES: BEGIN OF ty_details, wi_id TYPE sww_wiid, wi_cd TYPE sww_cd, wi_aagent TYPE sww_aagent, wi_forw_by TYPE sww_forwby, END OF ty_details,
BEGIN OF ts_swwwhead, wi_id TYPE sww_wiid, END OF ts_swwwhead,
BEGIN OF ts_approver, approver TYPE hrp1001-sobid, email TYPE adr6-smtp_addr, END OF ts_approver.
**INTERNAL TABLES******************** DATA:it_details TYPE TABLE OF ty_details.
**WORK AREAS*************************
DATA: is_details TYPE ty_details.
** VARIABLES*************************
DATA: v_werks TYPE pa0001-werks, v_yyjlevel TYPE pa0001-yyjlevel, is_shead TYPE ts_swwwhead, frstapp_usrid TYPE pa0001-pernr, scndapp_usrid TYPE pa0001-pernr, unithd_usrid TYPE pa0001-pernr, hohradmn_usrid TYPE pa0001-pernr, v_sglvl, w_endda TYPE p9050-endda, w_sobid TYPE hrp1001-sobid, v_mltlvl, v_persg TYPE pa0001-persg, w_approver TYPE hrp1001-sobid, wa_yyemps TYPE pa9050-yyemps, v_ansvh TYPE pa0001-ansvh, w_unithead_p TYPE pa0001-pernr, w_unithead_u TYPE pa0001-pernr, w_fapp_p TYPE pa0001-pernr, w_fapp_u TYPE pa0001-pernr, w_sapp_p TYPE pa0001-pernr, w_sapp_u TYPE pa0001-pernr, w_return TYPE sy-subrc, it_work TYPE swrtwiid, w_tlevel TYPE numc1, w_clevel TYPE numc1, w_fa TYPE p0105-usrid, w_sa TYPE p0105-usrid, w_ta TYPE p0105-usrid, w_fourtha TYPE p0105-usrid, wi_agent1 TYPE swrtwiagent, wi_user TYPE swr_wiagent, wi_agent TYPE pa0001-pernr, w_forwarded TYPE sy-uname, w_userid_fa TYPE pa0001-pernr, w_userid_sa TYPE pa0001-pernr, w_userid_ta TYPE pa0001-pernr, w_userid_fourtha TYPE pa0001-pernr, w_flag_1 TYPE char1, w_wihead TYPE sww_wiid, w_wf_id TYPE swfrdguid, w_wfno TYPE char10, w_usrid TYPE p0105-usrid, w_date TYPE sy-datum, w_lines TYPE i.
DATA: is_loan TYPE char255, w_object_key TYPE swr_struct-object_key, w_loan TYPE swc_object.
DATA: w_hr_admin TYPE wfsyst-initiator, w_unit_head TYPE wfsyst-initiator, w_unit_hr TYPE wfsyst-initiator, w_level TYPE char1.
SELECT SINGLE top_wi_id def_guid INTO (w_wihead, w_wf_id) FROM swwwihead WHERE wi_id = wi_id.
IF sy-subrc = 0.
w_wfno = w_wf_id+0(10).
SELECT wi_id wi_cd wi_aagent wi_forw_by INTO TABLE it_details FROM swwwihead WHERE top_wi_id = w_wihead AND wi_type = 'W'.
IF sy-subrc = 0.
SORT it_details BY wi_id.
READ TABLE it_details INTO is_details INDEX 1.
IF sy-subrc = 0. w_date = is_details-wi_cd. ENDIF.
SORT it_details BY wi_id DESCENDING.
READ TABLE it_details INTO is_details INDEX 1.
IF sy-subrc = 0. w_forwarded = is_details-wi_forw_by. ENDIF.
CASE:w_wfno.
WHEN 'WS90100026'.
* **************Get all the approver of the leave as on the date leave has been applied********************
SELECT SINGLE werks yyjlevel persg ansvh FROM pa0001 INTO (v_werk s, v_yyjlevel, v_persg, v_ansvh) WHERE pernr EQ pernr AND begda LE w_date AND endda GE w_date AND bukrs EQ 'ITD'.
IF sy-subrc EQ 0.
SELECT SINGLE yyemps INTO wa_yyemps FROM pa9050 WHERE pernr EQ pernr AND begda LE w_date AND endda GE w_date.
IF sy-subrc = 0.
IF ( v_werks = 'HOTD' OR v_werks = 'CPOG' OR v_werks = 'NBD C' OR v_werks = 'NDIS' OR v_werks = 'SDIS' OR v_werks = 'EDIS' OR v_werks = 'WDIS' ) AND ( v_yyjlevel = '60000001' OR v_yyjlevel = '60000002' O R v_yyjlevel = '60000003' OR v_yyjlevel = '60000004' OR v_yyjlevel = '60000005' OR v_yyjlevel = '60000006' ). v_sglvl = 'X'. " 1 n 2
ELSEIF ( v_werks = 'MBLR' OR v_werks = 'IRDC' OR v_werks = 'M KDP' OR v_werks = 'MMGR' OR v_werks = 'MPUN' OR v_werks = 'MSRE' OR v_werks = 'OATC' OR v_werks = 'PCUT' ) AND ( v_yyjlevel EQ '60000003' ). v_sglvl = 'X'. " 3
ELSEIF ( v_werks = 'MBLR' OR v_werks = 'IRDC' OR v_werks = 'M KDP' OR v_werks = 'MMGR' OR v_werks = 'MPUN' OR v_werks = 'MSRE' OR v_werks = 'OATC' OR v_werks = 'PCUT' ) AND ( v_yyjlevel = '60000004' OR v_yyjlevel = '60000005' O R v_yyjlevel = '60000006' ). v_mltlvl = 'X'. " 5
ELSEIF ( v_werks = 'AECU' OR v_werks = 'AEGA' OR v_werks = 'A EPA' OR v_werks = 'AEVI' OR v_werks = 'AWAH' OR v_werks = 'AWBH' OR v_werks = 'AWMU' OR v_werks = 'AWNA' OR v _werks = 'AWPU' OR v_werks = 'ASBL' OR v_werks = 'ASCH' OR v_werks = 'ASCO' OR v_werks = 'ASER' OR v_werks = 'ASHY' OR v _werks = 'ANCH' OR v_werks = 'ANDE' OR v_werks = 'ANJA' OR v_werks = 'ANJP' OR v_werks = 'ANLU' OR v_werks = 'ANSA') AND ( v_yyjlevel EQ '60000004' ). " 4 v_sglvl = 'X'. ELSEIF ( v_werks = 'AECU' OR v_werks = 'AEGA' OR v_werks = 'A EPA' OR v_werks = 'AEVI' OR v_werks = 'AWAH' OR v_werks = 'AWBH' OR v_werks = 'AWMU' OR v_werks = 'AWNA' OR v _werks = 'AWPU' OR v_werks = 'ASBL' OR v_werks = 'ASCH' OR v_werks = 'ASCO' OR v_werks = 'ASER' OR v_werks = 'ASHY' OR v _werks = 'ANCH' OR v_werks = 'ANDE' OR v_werks = 'ANJA' OR v_werks = 'ANJP' OR v_werks = 'ANLU' OR v_werks = 'ANSA') AND ( v_yyjlevel = '60000005' OR v_yyjlevel = '600000 06' ). " 5 v_mltlvl = 'X'. ENDIF. ENDIF.
IF v_sglvl EQ 'X'.
* Start of change by KP01 on 06.08.2009 CALL FUNCTION 'SWW_WI_CONTAINER_READ' EXPORTING wi_id = w_wihead TABLES wi_container = it_event_container EXCEPTIONS container_does_not_exist = 1 read_failed = 2 OTHERS = 3.
IF sy-subrc = 0.
CLEAR: w_tlevel,w_clevel.
LOOP AT it_event_container.
CASE: it_event_container-element.
WHEN 'VARIABLE'. w_tlevel = it_event_container-value.
WHEN 'VARIABLE1'.
w_clevel = it_event_container-value.
WHEN 'OTHERS'. * No action
ENDCASE.
ENDLOOP.
ENDIF.
IF w_tlevel = 1 .
wf_level = 'FIRST APPRAISER'.
ELSEIF w_tlevel = 2 .
IF w_clevel = 1 .
wf_level = 'FIRST APPRAISER'.
ELSEIF w_clevel = 2.
wf_level = 'HO HR ADMIN'.
ENDIF.
ENDIF. * wf_level = 'FIRST APPRAISER'. * End of change by KP01 on 06.08.2009
ELSEIF v_mltlvl EQ 'X'.
CASE wa_yyemps.
WHEN '1'. SELECT SINGLE yylfapp yylsapp yyluhead endda FROM pa9050 INTO (frstapp_usrid , scndapp_ usrid ,unithd_usrid , w_endda) WHERE pernr EQ pernr AND begd a LE w_date AND endd a GE w_date.
SELECT SINGLE yydevp yyprown yyauhead endda FROM pa9050 INTO (frstapp_usrid , scndapp_ usrid ,unithd_usrid , w_endda) WHERE pernr EQ pernr AND begd a LE w_date AND endd a GE w_date.
SELECT SINGLE yyrfapyp yyrsapp yyruhead endda FROM pa9050 INTO (frstapp_usrid , scndapp_u srid ,unithd_usrid , w_endda) WHERE pernr E Q pernr AND begda LE w_date AND endda GE w_date. IF sy-subrc = 0.
IF frstapp_usrid IS NOT INITIAL. SELECT SINGLE sobid FROM hrp1001 INTO w_approver WHERE otype = 'S' AND objid = frstapp_usrid AND plvar = '01' AND rsign = 'A' AND relat = '008' AND istat = '1' AND endda >= w_endda AND sclas = 'P'.
IF sy-subrc = 0. frstapp_usrid = w_approver. w_fapp_u = w_approver.
ELSE. CLEAR frstapp_usrid. ENDIF. ENDIF.
SELECT SINGLE sobid FROM hrp1001 INTO w_approver WHERE otype = 'S' AND objid = scndapp_usrid AND plvar = '01' AND rsign = 'A' AND relat = '008' AND istat = '1' AND endda >= w_endda AND sclas = 'P'.
IF sy-subrc = 0. scndapp_usrid = w_approver. w_sapp_u = w_approver.
ELSE. CLEAR scndapp_usrid. ENDIF.
CLEAR w_approver.
SELECT SINGLE sobid FROM hrp1001 INTO w_approver WHERE otype = 'S' AND objid = unithd_usrid AND plvar = '01' AND rsign = 'A' AND relat = '008' AND istat = '1' AND endda >= w_endda AND sclas = 'P'.
SELECT SINGLE sobid FROM hrp1001 INTO w_approver WHERE otype = 'ZH' AND begda LE w_date AND endda GE w_date.
IF sy-subrc = 0.
SELECT SINGLE sobid FROM hrp1001 INTO w_sobid WHERE otype = 'S' AND objid = w_approver AND plvar = '01' AND rsign = 'A' AND relat = '008' AND istat = '1' AND endda >= w_endda AND sclas = 'P'.
READ TABLE wi_agent1 INTO wi_user INDEX 1. IF sy-subrc = 0. w_usrid = wi_user-user. ENDIF.
IF w_usrid IS NOT INITIAL. CALL FUNCTION 'RP_GET_PERNR_FROM_USERID' EXPORTING begda = w_date endda = w_date usrid = w_usrid usrty = '010' IMPORTING usr_pernr = wi_agent EXCEPTIONS retcd = 1 OTHERS = 2. IF sy-subrc <> 0. " NO action ENDIF. ENDIF. **If workflow is pending with some agent then compare that agent with all t he possible agents ** To know in which level workflow is pending
LOOP AT it_event_container WHERE element = 'YLOAN'.
is_loan = it_event_container-value. SHIFT is_loan LEFT DELETING LEADING space . SHIFT is_loan LEFT DELETING LEADING 'YHRLOAN' . SHIFT is_loan LEFT DELETING LEADING space . w_object_key = is_loan. swc_create_object w_loan 'YHRLOAN' w_object_key. w_hr_admin = w_object_key+33(12) . swc_get_property w_loan 'W_UNIT_HEAD' w_unit_head."#EC * swc_get_property w_loan 'W_UNIT_HR' w_unit_hr."#EC *
EXIT. ENDLOOP. ENDIF. * Checking for workflow level IF w_forwarded IS INITIAL. " If workitem has not been forwarded b ut gone to the agent by WF IF agent IS NOT INITIAL.
IF agent = w_hr_admin.
wf_level = 'HR ADMIN'.
ELSEIF agent = w_unit_head+2(12).
wf_level = 'UNIT HEAD'.
ELSEIF agent = w_unit_hr+2(12).
wf_level = 'UNIT HR'. ENDIF. ELSE. " Only in this case workflow will be pending with no agen t wf_level = 'UNIT HR'. ENDIF.
ELSE. " If workitem has been forwarded manually
wf_level = w_forwarded. " The person who has forwarded the WI