Quantcast
Channel: SCN: Message List
Viewing all articles
Browse latest Browse all 2695

Re: SRM Shopping Cart Multiple Line Items - Approvers get clubbed

$
0
0

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.


Viewing all articles
Browse latest Browse all 2695

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>