
Process: purchase requisition sourcing in SRM.
Requirement: requester of shopping cart must be defined via customer logic. In standard SAP solution requester is always an RFC-User (acces from PI System).
Remarks:
First of all you may need to create a customer utility class for requester determination.
Class will have a public static attribute and one method.
This attribute indicates the process of shopping cart creation from purchase requisition. Before creation attribute is set ot true, at the end - to false.
Value of the attribute will be used during creation process to differentiate shopping cart creation direct in SRM and via SOA.
Method get_requester is served to get user name of requester for shopping cart. Method implements customer logic and has only one returning parameter RV_UNAME type XUBNAME.
METHOD get_requester.
rv_requestor = 'KANIKEEV'. " Here you should define your customer logic
ENDMETHOD.
For this solution you may need to enhance/modify following methods.
First you need to enhance proxy class, which is responsible for XML processing. You may find this class via SPROXY transaction for Interface PurchaseRequestERPSourcingRequest_In.
/SAPSRM/CL_PUR_REQ_ERP_SRC_REQ->/SAPSRM/II_PUR_REQ_ERP_SRC_REQ~PUR_REQ_ERPSRC_REQ
Here you need to create pre- and post-enhancements
Pre-enhancement: ZKSH_EXT_REQ_UTIL=>MV_EXT_REQ_CREATION = ABAP_TRUE.
Post-enhancement: ZKSH_EXT_REQ_UTIL=>MV_EXT_REQ_CREATION = ABAP_FALSE.
/SAPSRM/CL_PDO_BO_SC->GET_REQUESTER_OF_FIRST_ITEM
Here you need to create a post-enhancement.
IF abap_true = zksh_ext_req_utils=>mv_ext_req_creation.
rv_uname = zksh_ext_req_utils=>get_requester( ).
ENDIF.
/SAPSRM/CL_CH_SOA_DO_MAP_PARTN->CONSTRUCTOR
Here you need to create a post-enhancement.
DATA lv_requester TYPE xubname.
IF iv_create_user_context EQ abap_true.
* Instantiate user context
TRY.
lv_requester = zksh_ext_req_utils=>get_requester( ).
CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_us_context_prov
EXPORTING
iv_user = lv_requester
iv_application = iv_application
RECEIVING
ro_us_context_prov = mo_user_context.
CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_icons_user.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_icons_user ).
ENDTRY.
ENDIF.
/SAPSRM/CL_CH_SOA_DO_MAP_PLANT=>CONSTRUCTOR
Here you need to create a post-enhancement.
DATA lv_requester TYPE xubname.
TRY.
lv_requester = zksh_ext_req_utils=>get_requester( ).
CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_us_context_prov
EXPORTING
iv_user = lv_requester
iv_application = iv_application
RECEIVING
ro_us_context_prov = mo_user_context.
CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_icons_user.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_icons_user ).
ENDTRY.
/SAPSRM/CL_CH_SOA_DO_MAP_SHTOL->CONSTRUCTOR
Here you need to create a post-enhancement.
DATA lv_requester TYPE xubname.
TRY.
lv_requester = zksh_ext_req_utils=>get_requester( ).
CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_user_context
EXPORTING
iv_user = lv_requester
iv_application = iv_application
RECEIVING
ro_user_context = mo_user_context.
CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_icons_user.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_icons_user ).
ENDTRY.
/SAPSRM/CL_SOA_PUR_REQ->CREATE_PDO_SC_INSTANCE
Here you need to create a overwrite-enhancement.
METHOD iow_zksh_ei_cl_soa_pur_req~create_pdo_sc_instance.
*"------------------------------------------------------------------------*
*" Declaration of Overwrite-method, do not insert any comments here please!
*"
*"methods CREATE_PDO_SC_INSTANCE .
*"------------------------------------------------------------------------*
DATA:
lo_pdo_message_handler TYPE REF TO /sapsrm/if_pdo_msg_consumer.
* Exceptions
DATA:
lx_pdo_wf_mode_ban TYPE REF TO /sapsrm/cx_pdo_wf_mode_ban,
lx_pdo_wrong_bus_type TYPE REF TO /sapsrm/cx_pdo_wrong_bus_type,
lx_pdo_pd_read_error TYPE REF TO /sapsrm/cx_pdo_pd_read_error,
lx_pdo_lock_failed TYPE REF TO /sapsrm/cx_pdo_lock_failed,
lx_pdo_no_authorizatio TYPE REF TO /sapsrm/cx_pdo_no_authorizatio,
lx_pdo_parameter_error TYPE REF TO /sapsrm/cx_pdo_parameter_error,
lx_pdo_status_error TYPE REF TO /sapsrm/cx_pdo_status_error,
lx_pdo_incons_user TYPE REF TO /sapsrm/cx_pdo_incons_user,
lx_pdo_error TYPE REF TO /sapsrm/cx_pdo_error,
lx_pdo_abort TYPE REF TO /sapsrm/cx_pdo_abort.
DATA lv_requester TYPE xubname.
TRY.
* Create Shopping Cart instance
lv_requester = zksh_ext_req_utils=>get_requester( ).
CALL METHOD /sapsrm/cl_pdo_factory_sc_adv=>create_new_instance
EXPORTING
iv_uname = lv_requester
iv_bosubtype = 'ER'
IMPORTING
eo_message_handler = lo_pdo_message_handler
eo_sc_instance = me->core_object->mo_pdo_pr.
zsrmcln_ext_req_utils=>set_pdo( me->core_object->mo_pdo_pr ).
CATCH /sapsrm/cx_pdo_wf_mode_ban INTO lx_pdo_wf_mode_ban.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_wf_mode_ban ).
CATCH /sapsrm/cx_pdo_wrong_bus_type INTO lx_pdo_wrong_bus_type.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_wrong_bus_type ).
CATCH /sapsrm/cx_pdo_pd_read_error INTO lx_pdo_pd_read_error.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_pd_read_error ).
CATCH /sapsrm/cx_pdo_lock_failed INTO lx_pdo_lock_failed.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_lock_failed ).
CATCH /sapsrm/cx_pdo_no_authorizatio INTO lx_pdo_no_authorizatio.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_no_authorizatio ).
CATCH /sapsrm/cx_pdo_parameter_error INTO lx_pdo_parameter_error.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_parameter_error ).
CATCH /sapsrm/cx_pdo_status_error INTO lx_pdo_status_error.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_status_error ).
CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_incons_user.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_incons_user ).
CATCH /sapsrm/cx_pdo_abort INTO lx_pdo_abort.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_abort ).
CATCH /sapsrm/cx_pdo_error INTO lx_pdo_error.
me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_error ).
ENDTRY.
CALL METHOD me->core_object->mo_msg_hdlr->set_message_consumer
EXPORTING
io_message_handler = lo_pdo_message_handler.
ENDMETHOD. "IOW_ZKSH_EI_CL_SOA_PUR_REQ~CREATE_PDO_SC_INSTANCE
/SAPSRM/CL_CH_SOA_DO_PR_ITM->CONSTRUCTOR
METHOD constructor.
DATA : ls_ipt LIKE LINE OF mt_allowed_ipt,
lt_limit_ipt LIKE mt_allowed_ipt.
* Exceptions
DATA:
lx_pdo_icons_user TYPE REF TO /sapsrm/cx_pdo_incons_user.
CALL METHOD super->constructor
EXPORTING
io_base_mapper = io_base_mapper
io_msg_hdlr = io_msg_hdlr.
* Instantiate DOs
me->init_do( ).
* Set node name
me->mv_node_name = 'PR_ITEM'(001). "#EC *
* Instantiate user context
TRY.
*{ REPLACE ********** 1
*\ CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_user_context
*\ EXPORTING
*\ iv_user = sy-uname
*\ iv_application = iv_application
*\ RECEIVING
*\ ro_user_context = mo_user_context.
DATA lv_requester TYPE xubname.
IF abap_true = zksh_ext_req_utils=>mv_ext_req_creation.
lv_requester = zksh_ext_req_utils=>get_requester( ).
ELSE.
lv_requester = sy-uname.
ENDIF.
CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_user_context
EXPORTING
iv_user = lv_requester
iv_application = iv_application
RECEIVING
ro_user_context = mo_user_context.
*} REPLACE
CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_icons_user.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_icons_user ).
ENDTRY.
**** Get the Hierarchy Template and Store it
CALL METHOD /sappssrm/cl_ih_cust_prov=>get_template_from_trans_type
EXPORTING
iv_process_type = 'EXTR'
RECEIVING
rv_hierarchy_template = mv_hier_template.
**** FILL THE HIERARCHY TEMPLATE and Allowed IPT's.
CALL METHOD /sappssrm/cl_ih_cust_prov=>get_allowed_ipt_full
EXPORTING
iv_hier_templ = mv_hier_template
iv_object_type = 'BUS2121'
RECEIVING
rt_ipt = mt_allowed_ipt.
READ TABLE mt_allowed_ipt INTO ls_ipt WITH KEY ps_ctrl_key = '0001'.
CALL METHOD /sappssrm/cl_ih_cust_prov=>get_allowed_ipt_full
EXPORTING
iv_hier_templ = mv_hier_template
iv_object_type = 'BUS2121'
iv_ps_ipt = ls_ipt-ps_ipt
RECEIVING
rt_ipt = lt_limit_ipt.
APPEND LINES OF lt_limit_ipt TO mt_allowed_ipt.
SORT mt_allowed_ipt BY ps_ctrl_key.
DELETE ADJACENT DUPLICATES FROM mt_allowed_ipt COMPARING ps_ctrl_key.
ENDMETHOD.
/SAPSRM/CL_CH_SOA_DO_PR_ITM->ADD_ITEM
METHOD add_item.
* Exceptions
DATA:
lx_pdo_no_authorizatio TYPE REF TO /sapsrm/cx_pdo_no_authorizatio,
lx_pdo_abort TYPE REF TO /sapsrm/cx_pdo_abort,
lx_pdo_incons_user TYPE REF TO /sapsrm/cx_pdo_incons_user,
lx_pdo_curr_error TYPE REF TO /sapsrm/cx_pdo_curr_error,
lx_pdo_cat_not_allowed TYPE REF TO /sapsrm/cx_pdo_cat_not_allowed,
lx_pdo_prd_not_unique TYPE REF TO /sapsrm/cx_pdo_prd_not_unique,
lx_pdo_prd_not_found TYPE REF TO /sapsrm/cx_pdo_prd_not_found.
TRY.
*{ REPLACE ********** 1
*\ CALL METHOD io_pdo_sc->/sapsrm/if_pdo_bo_sc~add_item
*\ EXPORTING
*\ iv_uname = sy-uname
*\ is_item = is_bbp_item
*\ iv_account_from_pr = iv_account_from_pr
*\ IMPORTING
*\ es_return = es_return
*\ CHANGING
*\ co_message_handler = mo_pdo_consumer.
DATA lv_user TYPE xubname.
DATA lo_us_context TYPE REF TO /sapsrm/if_pdo_user_context.
lo_us_context = /sapsrm/cl_pdo_factory_user=>get_buffered_user_context( ).
IF lo_us_context IS BOUND.
lv_user = lo_us_context->/sapsrm/if_pdo_us_context_cons~get_user( ).
ELSEIF abap_true = zksh_ext_req_utils=>mv_ext_req_creation.
lv_user = zksh_ext_req_utils=>get_requester( ).
ELSE.
lv_user = sy-uname.
ENDIF.
CALL METHOD io_pdo_sc->/sapsrm/if_pdo_bo_sc~add_item
EXPORTING
iv_uname = lv_user
is_item = is_bbp_item
iv_account_from_pr = iv_account_from_pr
IMPORTING
es_return = es_return
CHANGING
co_message_handler = mo_pdo_consumer.
*} REPLACE
CATCH /sapsrm/cx_pdo_cat_not_allowed INTO lx_pdo_cat_not_allowed.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_cat_not_allowed ).
CATCH /sapsrm/cx_pdo_no_authorizatio INTO lx_pdo_no_authorizatio .
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_no_authorizatio ).
CATCH /sapsrm/cx_pdo_abort INTO lx_pdo_abort.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_abort ).
CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_incons_user .
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_incons_user ).
CATCH /sapsrm/cx_pdo_curr_error INTO lx_pdo_curr_error.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_curr_error ).
CATCH /sapsrm/cx_pdo_prd_not_unique INTO lx_pdo_prd_not_unique.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_prd_not_unique ).
CATCH /sapsrm/cx_pdo_prd_not_found INTO lx_pdo_prd_not_found.
mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_prd_not_found ).
ENDTRY.
ENDMETHOD.
As a result you should become a custom requester for shopping carts, created from backend purchase requisitions.
P.S.: English language is not my native language, and any person is not insured from mistakes and typing errors. If you have found an error in the text, please let me know.
P.P.S.: If you have some remarks or hints - please don't hesitate to leave a comment.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.