Hi Laurent,
Thank you very much for your reply.
I have modified the code. I am not fetching approvers from custom Z class. I am fetching these details in Area_guid. Is it mandatory to fetch the approvers from a Z class ? Because even after changing ITEM_MAP method I could see appprovers are getting clubbed.
Please find below code of Item map and Area Guid. My understanding was we do not require to implement Get_responsible_Approver method from /SAPSRM/CL_WF_AREA_MANAGER.
Kindly confirm my understanding and also check my modified code. I would appreciate if you could review.
Item_Map
METHOD /SAPSRM/IF_EX_WF_RESP_RESOLVER~GET_AREA_TO_ITEM_MAP.
*----------------------------------------------------------------------*
* This implementation returns the manager of the document owners
*----------------------------------------------------------------------*
TYPES: BEGIN OF TY_LS_ITEM_PGRP_MAP,
PURCH_GRP_ID TYPE HROBJID,
ITEM_GUID TYPE BBP_GUID,
END OF TY_LS_ITEM_PGRP_MAP.
DATA LO_WF_PDO_SC TYPE REF TO /SAPSRM/IF_WF_PDO_SC.
DATA LO_PDO_SC TYPE REF TO /SAPSRM/IF_PDO_BO_SC.
DATA LS_HEADER TYPE BBP_PDS_SC_HEADER_D.
DATA LT_HEADER_GUID TYPE BBPT_GUID.
DATA LS_HEADER_GUID TYPE BBP_GUID_TAB.
DATA LT_ITEM_GUID TYPE /SAPSRM/T_PDO_HIER_GUID_LIST.
DATA LR_ITEM_GUID TYPE REF TO /SAPSRM/S_PDO_HIER_GUID_LIST.
DATA LT_ORGDATA TYPE BBPT_PDS_ORG.
DATA LR_ORGDATA TYPE REF TO BBP_PDS_ORG.
DATA LT_ITEM_TO_PGRP_MAP TYPE STANDARD TABLE OF TY_LS_ITEM_PGRP_MAP.
DATA LS_ITEM_TO_PGRP_MAP TYPE TY_LS_ITEM_PGRP_MAP.
DATA LR_ITEM_TO_PGRP_MAP TYPE REF TO TY_LS_ITEM_PGRP_MAP.
DATA LO_AREA TYPE REF TO /SAPSRM/IF_WF_AREA.
DATA LS_AREA_TO_ITEM_MAP TYPE /SAPSRM/S_WF_ITEM_TO_AREA.
DATA LX_PDO_EX TYPE REF TO CX_STATIC_CHECK.
DATA LT_ITEM TYPE BBPT_PD_SC_ITEM_D.
DATA LS_ITEM TYPE BBP_PDS_SC_ITEM_D.
DATA LT_DOCUMENT_RESPONSIBLE TYPE /SAPSRM/T_WF_APPROVER.
* DATA LO_AREA TYPE REF TO /SAPSRM/IF_WF_AREA.
* DATA LS_AREA_TO_ITEM_MAP TYPE /SAPSRM/S_WF_ITEM_TO_AREA.
DATA : LI_ITEM TYPE STANDARD TABLE OF BBP_PDS_SC_ITEM_D,
LWA_ITEM TYPE BBP_PDS_SC_ITEM_D.
ASSERT ID /SAPSRM/WF_CFG CONDITION ( NOT IS_DOCUMENT IS INITIAL ).
ASSERT ID /SAPSRM/WF_CFG CONDITION ( IS_DOCUMENT-DOCUMENT_TYPE EQ /SAPSRM/IF_PDO_OBJ_TYPES_C=>GC_PDO_SHOP ).
IF IS_DOCUMENT IS INITIAL OR
IS_DOCUMENT-DOCUMENT_TYPE NE /SAPSRM/IF_PDO_OBJ_TYPES_C=>GC_PDO_SHOP.
RAISE EXCEPTION TYPE /SAPSRM/CX_WF_ABORT.
ENDIF.
*----------------------------------------------------------------------*
* (1) Get the Shopping Cart's item list ...
*----------------------------------------------------------------------*
* Get shopping cart instance
LO_WF_PDO_SC ?= /SAPSRM/CL_WF_PDO_IMPL_FACTORY=>GET_INSTANCE(
IV_DOCUMENT_GUID = IS_DOCUMENT-DOCUMENT_GUID
IV_DOCUMENT_TYPE = IS_DOCUMENT-DOCUMENT_TYPE
IV_PDO_EVENT_HANDLING = ABAP_FALSE
).
TRY.
LO_PDO_SC ?= LO_WF_PDO_SC->/SAPSRM/IF_WF_PDO~GET_PDO( ).
* get leaf items
LT_ITEM_GUID = LO_WF_PDO_SC->/SAPSRM/IF_WF_PDO~GET_ITEM_LIST( ).
CATCH /SAPSRM/CX_PDO_WRONG_BUS_TYPE
/SAPSRM/CX_PDO_PD_READ_ERROR
/SAPSRM/CX_PDO_LOCK_FAILED
/SAPSRM/CX_PDO_NO_AUTHORIZATIO
/SAPSRM/CX_PDO_PARAMETER_ERROR
/SAPSRM/CX_PDO_STATUS_ERROR
/SAPSRM/CX_PDO_INCONS_USER
/SAPSRM/CX_PDO_ERROR
INTO LX_PDO_EX.
RAISE EXCEPTION TYPE /SAPSRM/CX_WF_ERROR
EXPORTING
PREVIOUS = LX_PDO_EX.
CATCH /SAPSRM/CX_PDO_ABORT INTO LX_PDO_EX.
RAISE EXCEPTION TYPE /SAPSRM/CX_WF_ABORT
EXPORTING
PREVIOUS = LX_PDO_EX.
ENDTRY.
*----------------------------------------------------------------------------*
* (2) Get purchasing group of each item
* - (only item leafs included) -
*----------------------------------------------------------------------*
LOOP AT LT_ITEM_GUID REFERENCE INTO LR_ITEM_GUID WHERE LEAF = ABAP_TRUE.
LS_ITEM_TO_PGRP_MAP-ITEM_GUID = LR_ITEM_GUID->GUID.
TRY.
CALL METHOD LO_PDO_SC->GET_ITEM_DETAIL
EXPORTING
IV_ITEM_GUID = LS_ITEM_TO_PGRP_MAP-ITEM_GUID
IMPORTING
ET_ITEM = LT_ITEM
ET_ORGDATA = LT_ORGDATA.
READ TABLE LT_ITEM INDEX 1 INTO LS_ITEM.
IF LS_ITEM-DEL_IND EQ ABAP_TRUE.
CONTINUE.
ENDIF.
LOOP AT LT_ORGDATA REFERENCE INTO LR_ORGDATA.
LS_ITEM_TO_PGRP_MAP-PURCH_GRP_ID = LR_ORGDATA->PROC_GROUP_ID.
EXIT. "each item has exactly one p.-org/group pair
ENDLOOP.
APPEND LS_ITEM_TO_PGRP_MAP TO LT_ITEM_TO_PGRP_MAP.
CATCH /SAPSRM/CX_PDO_NO_AUTHORIZATIO INTO LX_PDO_EX.
RAISE EXCEPTION TYPE /SAPSRM/CX_WF_ERROR
EXPORTING
PREVIOUS = LX_PDO_EX.
CATCH /SAPSRM/CX_PDO_ABORT INTO LX_PDO_EX.
RAISE EXCEPTION TYPE /SAPSRM/CX_WF_ABORT
EXPORTING
PREVIOUS = LX_PDO_EX.
ENDTRY.
ENDLOOP.
*----------------------------------------------------------------------*
* (3) Return document item - responsibility area assignment
*----------------------------------------------------------------------*
* The item list is sorted according to the characteristics of an
* responsibility area (i.e. according to the purch. group ID here)
SORT LT_ITEM_TO_PGRP_MAP.
LOOP AT LT_ITEM_TO_PGRP_MAP REFERENCE INTO LR_ITEM_TO_PGRP_MAP.
AT NEW ITEM_GUID. "PURCH_GRP_ID.
* For each purchasing group a new responsibility area is created, which is
* an instance of class /SAPSRM/CL_WF_AREA_PURCH_GRP; this instance can
* later be retrieved by the org.-unit ID ("leading object ID") in
* method GET_APPROVERS_BY_AREA_GUID to return the list of responsible
* agents of this purchasing group
LO_AREA = /SAPSRM/CL_WF_AREA=>/SAPSRM/IF_WF_AREA~CREATE_INSTANCE(
IV_AREA_TYPE = /SAPSRM/IF_WF_PROCESS_C=>GC_AREA_TYPE_PURCH_GRP "/SAPSRM/IF_WF_PROCESS_C=>GC_AREA_TYPE_MANAGER "/SAPSRM/IF_WF_PROCESS_C=>GC_AREA_TYPE_PURCH_GRP
IV_LEADING_OBJECT_ID = LR_ITEM_TO_PGRP_MAP->ITEM_GUID
).
LS_AREA_TO_ITEM_MAP-AREA_GUID = LO_AREA->GET_GUID( ).
ENDAT.
LS_AREA_TO_ITEM_MAP-ITEM_GUID = LR_ITEM_TO_PGRP_MAP->ITEM_GUID.
APPEND LS_AREA_TO_ITEM_MAP TO RT_ITEM_TO_AREA_MAP.
ENDLOOP.
* e.g. during document creation before adding of any items
IF SY-SUBRC NE 0.
* Create responsibility area
LO_AREA = /SAPSRM/CL_WF_AREA=>/SAPSRM/IF_WF_AREA~CREATE_INSTANCE(
IV_AREA_TYPE = /SAPSRM/IF_WF_PROCESS_C=>GC_AREA_TYPE_MANAGER
IV_LEADING_OBJECT_ID = SPACE
).
LS_AREA_TO_ITEM_MAP-AREA_GUID = LO_AREA->GET_GUID( ).
* Return responsibility area GUID ... w/o item assignment (nil GUID)
LS_AREA_TO_ITEM_MAP-ITEM_GUID = /SAPSRM/IF_WF_PROCESS_C=>GC_NIL_GUID.
APPEND LS_AREA_TO_ITEM_MAP TO RT_ITEM_TO_AREA_MAP.
ENDIF.
ENDMETHOD.
Area_Guid
METHOD /SAPSRM/IF_EX_WF_RESP_RESOLVER~GET_APPROVERS_BY_AREA_GUID.
TYPES : BEGIN OF LT_JEST,
OBJNR TYPE CRM_JEST-OBJNR,
STAT TYPE CRM_JEST-STAT,
INACT TYPE CRM_JEST-INACT,
END OF LT_JEST.
DATA : LI_JEST TYPE STANDARD TABLE OF LT_JEST ##NEEDED,
LWA_JEST TYPE LT_JEST ##NEEDED,
LV_STAT TYPE CRM_JEST-STAT ##NEEDED.
DATA: INFO TYPE RFCSI ##NEEDED,
MSG(80) VALUE SPACE ##NEEDED.
TYPES: BEGIN OF LT_FINAL,
* LV_CATID TYPE COMT_CATEGORY_ID,
LV_QUANT TYPE BBP_MNG,
LV_PRICE TYPE BBP_PRICE,
LV_CURR TYPE WAERS,
LV_ACCCAT TYPE BBP_ACC_CAT,
LV_COSTCTR TYPE KOSTL,
LV_ASSETNO TYPE ANLN1,
LV_ORDERNO TYPE AUFNR,
LV_COAREA TYPE KOKRS,
LV_PROFITCTR TYPE PRCTR,
LV_WBSELEM TYPE BBP_WBS_ELEM,
LV_NETWORK TYPE NPLNR,
LV_ACTIVITY TYPE VORNR,
LV_VALUE TYPE BBP_VALUE,
LV_PURCHGRP TYPE EKGRP,
LV_PURCHORG TYPE EKORG,
LV_COCODE TYPE BUKRS,
LV_CREATEDBY TYPE ERNAM,
LV_PLANT TYPE BE_EWERK,
LV_DOCTYPE TYPE BBSRT,
MEINS TYPE BBP_MNG,
WAERS TYPE WAERS,
END OF LT_FINAL.
DATA: LO_AREA TYPE REF TO /SAPSRM/IF_WF_AREA,
LS_APPROVER TYPE /SAPSRM/S_WF_APPROVER,
LI_ITEM TYPE STANDARD TABLE OF BBP_PDS_SC_ITEM_D,
LWA_ITEM TYPE BBP_PDS_SC_ITEM_D,
LWA_HEADER TYPE BBP_PDS_SC_HEADER_D,
LI_ACCOUNT TYPE STANDARD TABLE OF BBP_PDS_ACC,
LI_STATUS TYPE STANDARD TABLE OF BBP_PDS_STATUS,
LWA_STATUS TYPE BBP_PDS_STATUS ##NEEDED,
LWA_ACCOUNT TYPE BBP_PDS_ACC,
LI_FINAL TYPE STANDARD TABLE OF LT_FINAL,
LI_APPROVERS TYPE STANDARD TABLE OF SWHACTOR,
LWA_APPROVERS TYPE SWHACTOR,
LWA_FINAL TYPE LT_FINAL,
LV_RFCDEST TYPE STRING.
CONSTANTS : LC_RESPONSIBLECLASS TYPE SWF_CLSNAM VALUE 'ZCL_IM_WF_AREA_APPROVER' ##NEEDED.
ASSERT ID /SAPSRM/WF_CFG CONDITION ( NOT IS_AREA IS INITIAL ).
IF IS_AREA IS INITIAL.
RETURN.
ENDIF.
* Activate fallback agents
IF IS_AREA-AREA_GUID = /SAPSRM/IF_WF_PROCESS_C=>GC_NIL_GUID.
RETURN.
ENDIF.
* Get responsibility area reference for given area GUID
LO_AREA = /SAPSRM/CL_WF_AREA=>/SAPSRM/IF_WF_AREA~GET_INSTANCE_BY_GUID(
IV_AREA_TYPE = /SAPSRM/IF_WF_PROCESS_C=>GC_AREA_TYPE_PURCH_GRP "/SAPSRM/IF_WF_PROCESS_C=>GC_AREA_TYPE_MANAGER "LC_RESPONSIBLECLASS "
IV_AREA_GUID = IS_AREA-AREA_GUID
).
CALL FUNCTION 'BBP_PD_SC_GETDETAIL'
EXPORTING
I_GUID = IS_DOCUMENT-DOCUMENT_GUID
I_WITH_ITEMDATA = 'X'
IMPORTING
E_HEADER = LWA_HEADER
TABLES
E_ITEM = LI_ITEM
E_ACCOUNT = LI_ACCOUNT
E_STATUS = LI_STATUS.
CLEAR LWA_ITEM.
DELETE LI_ACCOUNT WHERE DEL_IND = 'X'.
SORT LI_ACCOUNT BY DISTR_PERC DESCENDING DIST_QUAN DESCENDING DIST_VALUE DESCENDING.
LOOP AT LI_ITEM INTO LWA_ITEM.
CLEAR LWA_ACCOUNT.
READ TABLE LI_ACCOUNT INTO LWA_ACCOUNT WITH KEY P_GUID = LWA_ITEM-GUID BINARY SEARCH. "Commented on 18.02.2016 4kama8417
IF SY-SUBRC = 0.
CLEAR LWA_FINAL.
LWA_FINAL-LV_QUANT = LWA_ITEM-QUANTITY.
LWA_FINAL-LV_PRICE = LWA_ITEM-PRICE.
LWA_FINAL-LV_CURR = LWA_ITEM-CURRENCY.
CASE LWA_ACCOUNT-ACC_CAT.
WHEN 'CC'.
CLEAR LWA_FINAL-LV_ACCCAT.
LWA_FINAL-LV_ACCCAT = 'K'.
WHEN 'AS'.
CLEAR LWA_FINAL-LV_ACCCAT.
LWA_FINAL-LV_ACCCAT = 'A'.
WHEN 'NET'.
CLEAR LWA_FINAL-LV_ACCCAT.
LWA_FINAL-LV_ACCCAT = 'N'.
WHEN 'OR'.
CLEAR LWA_FINAL-LV_ACCCAT.
LWA_FINAL-LV_ACCCAT = 'F'.
WHEN 'WBS'.
CLEAR LWA_FINAL-LV_ACCCAT.
LWA_FINAL-LV_ACCCAT = 'P'.
ENDCASE.
LWA_FINAL-LV_COSTCTR = LWA_ACCOUNT-COST_CTR.
LWA_FINAL-LV_ASSETNO = LWA_ACCOUNT-ASSET_NO.
LWA_FINAL-LV_ORDERNO = LWA_ACCOUNT-ORDER_NO.
LWA_FINAL-LV_COAREA = LWA_ACCOUNT-CO_AREA.
LWA_FINAL-LV_PROFITCTR = LWA_ACCOUNT-PROFIT_CTR.
LWA_FINAL-LV_WBSELEM = LWA_ACCOUNT-WBS_ELEM_E.
LWA_FINAL-LV_NETWORK = LWA_ACCOUNT-NETWORK.
LWA_FINAL-LV_ACTIVITY = LWA_ACCOUNT-ACTIVITY.
IF LWA_ACCOUNT-DIST_VALUE IS NOT INITIAL OR LWA_ACCOUNT-DIST_VALUE <> 0.
LWA_FINAL-LV_VALUE = LWA_ACCOUNT-DIST_VALUE. "LWA_ITEM-VALUE. Change on 19.02.2016 - 4kama8417
ELSEIF LWA_ACCOUNT-DIST_QUAN IS NOT INITIAL OR LWA_ACCOUNT-DIST_QUAN <> 0.
LWA_FINAL-LV_VALUE = LWA_ACCOUNT-DIST_QUAN * LWA_ITEM-PRICE.
ELSE.
LWA_FINAL-LV_VALUE = ( LWA_ITEM-VALUE * LWA_ACCOUNT-DISTR_PERC ) / 100 .
ENDIF.
LWA_FINAL-LV_COCODE = LWA_ITEM-BE_CO_CODE.
LWA_FINAL-LV_CREATEDBY = LWA_HEADER-CREATED_BY.
LWA_FINAL-LV_PLANT = LWA_ITEM-BE_PLANT.
LWA_FINAL-LV_DOCTYPE = LWA_ITEM-BE_DOC_TYPE.
IF LWA_ACCOUNT-COST_CTR NE ' ' OR LWA_ACCOUNT-ASSET_NO NE ' '
OR LWA_ACCOUNT-ORDER_NO NE ' ' OR LWA_ACCOUNT-PROFIT_CTR NE ' '
OR LWA_ACCOUNT-WBS_ELEM_E NE ' ' OR LWA_ACCOUNT-NETWORK NE ' '
OR LWA_ACCOUNT-ACTIVITY NE ' '.
APPEND LWA_FINAL TO LI_FINAL.
ENDIF.
ENDIF. " ADDITIONAL CODE 03.12.2015
CLEAR : LWA_FINAL, LWA_ITEM.
ENDLOOP.
* Return all responsible users assigned to that area
RT_APPROVER = LO_AREA->GET_RESPONSIBLE_APPROVERS( ).
REFRESH RT_APPROVER[].
IF RT_APPROVER[] IS INITIAL.
IF LI_FINAL IS NOT INITIAL. "ADDITIONAL CODE 03.12.2015
CALL FUNCTION 'ZPSC_FM_RFC_GETSCAPPROVER'
DESTINATION LV_RFCDEST
EXPORTING
IM_FINAL = LI_FINAL
IMPORTING
T_APPROVERS = LI_APPROVERS
EXCEPTIONS
COMMUNICATION_FAILURE = 1 MESSAGE MSG
SYSTEM_FAILURE = 2 MESSAGE MSG.
IF SY-SUBRC = 0.
LOOP AT LI_APPROVERS INTO LWA_APPROVERS.
LS_APPROVER-APPROVER_OT = LWA_APPROVERS-OTYPE.
LS_APPROVER-APPROVER_ID = LWA_APPROVERS-OBJID.
APPEND LS_APPROVER TO RT_APPROVER.
CLEAR LS_APPROVER.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.