METHOD if_ex_bbp_wfl_approv_badi~get_remaing_approvers. INCLUDE . DATA: ls_header TYPE bbp_pds_sc_header_d, ls_con_hd TYPE bbp_pds_ctr_header_d, * approval object related structures ls_approver TYPE bbp_wfl_approval_table_badi, ls_approver_a TYPE bbp_wfl_approval_table_badi, ls_approver_b TYPE bbp_wfl_approval_table_badi, lt_approver TYPE TABLE OF bbp_wfl_approval_table_badi, ls_item_app_obj TYPE bbps_wfl_item_approval_obj, lt_item_app_obj TYPE TABLE OF bbps_wfl_item_approval_obj, ls_approval_def TYPE bbpt_wfl_lia_def, * tables for different approval criteria lt_appr_def TYPE TABLE OF bbpt_wfl_lia_def, lv_call_crit1 TYPE bbp_wfl_app_criterion, lv_call_value1 TYPE bbp_wfl_app_property, * approval item fields and structures ls_approval_item TYPE bbps_wfl_item_approval, lt_approval_items TYPE TABLE OF bbps_wfl_item_approval, lv_approval_index TYPE bbp_wfl_approval_table_badi-approval_index, lv_guid TYPE crmt_object_guid, ev_app_obj_guid TYPE bbp_guid_32, lv_object_value TYPE bbp_wfl_lia_value, lv_def_value TYPE bbp_wfl_lia_value, lv_object_found LIKE syst-subrc, lv_ob_tbx LIKE syst-tabix, * item fields and structures ls_item TYPE bbp_pds_sc_item_d, lt_item TYPE STANDARD TABLE OF bbp_pds_sc_item_d, ls_account TYPE bbp_pds_acc, lt_account TYPE TABLE OF bbp_pds_acc, ls_con_item TYPE bbp_pds_ctr_item_d, lt_con_item TYPE STANDARD TABLE OF bbp_pds_ctr_item_d. ** Approval Criteria and properties used (local) * CONSTANTS: * c_3_step_limit TYPE i VALUE 510000000, * c_no_approval TYPE i VALUE 501000000, * c_item_value TYPE bbp_wfl_app_criterion VALUE 'ITEM_VALUE', * c_item_value_desc TYPE bbp_step_description * VALUE 'Item Vaue Approval', * c_cost_centre TYPE bbp_wfl_app_criterion VALUE 'COST_CTR', * c_cost_centre_desc TYPE bbp_step_description * VALUE 'Cost Centre Approval', * c_prod_categ TYPE bbp_wfl_app_criterion VALUE 'PROD_CAT', * c_prod_categ_desc TYPE bbp_step_description * VALUE 'Product Category'. * CONSTANTS: * c_agent_is_user TYPE otype VALUE 'US'. *** workflow approval states CONSTANTS: c_wf_approved TYPE bbp_wfl_approvalstate VALUE '0', c_wf_rejected TYPE bbp_wfl_approvalstate VALUE '1', c_wf_not_instanced TYPE bbp_wfl_approvalstate VALUE '2', c_wf_changed TYPE bbp_wfl_approvalstate VALUE '3', c_wf_partialapproved TYPE bbp_wfl_approvalstate VALUE '4', c_wf_step_in_process TYPE bbp_wfl_approvalstate VALUE '5'. CONSTANTS: c_cctype TYPE zobjtyp VALUE 'K', c_shop TYPE crmt_subobject_category_db VALUE 'BUS2121', c_contract TYPE crmt_subobject_category_db VALUE 'BUS2000113', c_item_value_desc TYPE bbp_step_description VALUE 'Item Value Approval', c_crit_cocd TYPE bbp_wfl_app_criterion VALUE 'Company', c_crit_cat TYPE bbp_wfl_app_criterion VALUE 'Category', c_crit_cstc TYPE bbp_wfl_app_criterion VALUE 'CostCentre', c_item_value TYPE bbp_wfl_app_criterion VALUE 'ITEM_VALUE', c_hide_items_flag(1) TYPE c VALUE 'X'. TYPES: BEGIN OF x_pos, guid TYPE crmt_object_guid, objid TYPE hrp1001-objid, END OF x_pos. TYPES: BEGIN OF x_objid, otype TYPE otype, objid TYPE hrobjid, sclas TYPE sclas, sobid TYPE sobid, END OF x_objid. TYPES: BEGIN OF x_objid1, otype TYPE otype, objid TYPE hrobjid, sclas TYPE sclas, sobid TYPE but000-partner, END OF x_objid1. TYPES: BEGIN OF x_pernr, partner TYPE bu_partner, persnumber TYPE but000-persnumber, END OF x_pernr. TYPES: BEGIN OF x_user, persnumber TYPE usr21-persnumber, bname TYPE sy-uname, END OF x_user. DATA: lo_new_instance TYPE swf_bor_object, lo_user TYPE swf_bor_object. DATA: l_index TYPE sy-index, l_itm_val TYPE BBP_WFL_APP_PROPERTY, l_cnt TYPE i, l_cnt1 TYPE i, l_cnt2 TYPE i, l_ccode TYPE bukrs, l_ccentre TYPE kostl, l_prodcat TYPE bbp_category_id, l_partner TYPE hrobjid, l_flag(1), l_value1 type BBP_WFL_APP_PROPERTY, l_value2 type BBP_WFL_APP_PROPERTY, l_value3 type BBP_WFL_APP_PROPERTY, l_total TYPE zvlow, l_guid TYPE crmt_object_guid, lv_app_guid TYPE bbp_guid_32, lf_new_guid TYPE boolean, l_branch_ind TYPE swh_numc10, l_fin_index TYPE swh_numc10, l_func_index TYPE swh_numc10, l_oper_index TYPE swh_numc10. DATA: lt_pos TYPE TABLE OF x_pos, ls_pos TYPE x_pos. DATA: lt_pos1 TYPE TABLE OF x_pos. DATA: lt_objid TYPE TABLE OF x_objid, ls_objid TYPE x_objid. DATA: lt_objid1 TYPE TABLE OF x_objid1, ls_objid1 TYPE x_objid1. DATA: lt_pernr TYPE TABLE OF x_pernr, ls_pernr TYPE x_pernr, lt_user TYPE TABLE OF x_user, ls_user TYPE x_user. DATA: lt_fd TYPE TABLE OF zsrm_mt_fd, ls_fd TYPE zsrm_mt_fd. DATA: lt_od TYPE TABLE OF zsrm_mt_od, ls_od TYPE zsrm_mt_od. DATA: lt_cont TYPE TABLE OF zsrm_mt_cont_od, ls_cont TYPE zsrm_mt_cont_od, ls_fun TYPE zsrm_mt_function. DATA: lt_1001 TYPE TABLE OF p1001, ls_1001 TYPE p1001. DATA: lt_1001t TYPE TABLE OF p1001, ls_1001t TYPE p1001. * map char32 to raw16 MOVE guid TO lv_guid. IF object_type = c_shop. CALL FUNCTION 'BBP_PD_SC_GETDETAIL' EXPORTING i_guid = lv_guid i_object_id = object_id IMPORTING e_header = ls_header TABLES e_item = lt_item e_account = lt_account. LOOP AT lt_item INTO ls_item WHERE del_ind IS INITIAL. REFRESH: lt_fd, lt_od. l_index = l_index + 1. IF ls_item-value GE 1000. MOVE ls_item-be_co_code TO l_ccode. MOVE ls_item-category_id TO l_prodcat. READ TABLE lt_account INTO ls_account WITH KEY p_guid = ls_item-guid. IF sy-subrc = 0. MOVE ls_account-cost_ctr TO l_ccentre. ENDIF. SELECT * FROM zsrm_mt_fd INTO TABLE lt_fd WHERE ccode = l_ccode AND objtyp = c_cctype AND objid = l_ccentre. SELECT SINGLE * FROM zsrm_mt_function INTO ls_fun WHERE ccode = l_ccode AND prodcat = l_prodcat. SELECT * FROM zsrm_mt_od INTO TABLE lt_od WHERE prodcat = l_prodcat. SORT lt_fd BY ccode objtyp objid vlow vhigh. DELETE lt_fd WHERE vlow > ls_item-value. DESCRIBE TABLE lt_fd LINES l_cnt. IF l_cnt > 3. DELETE lt_fd FROM 4. l_cnt = 3. ENDIF. SORT lt_od BY prodcat vlow vhigh. DELETE lt_od WHERE vlow > ls_item-value. DESCRIBE TABLE lt_od LINES l_cnt2. IF l_cnt2 > 4. DELETE lt_od FROM 5. l_cnt2 = 4. ENDIF. IF NOT ls_fun IS INITIAL. l_cnt1 = 1. ENDIF. *** the item guid is set to all 'approval item' entries - this table *** provides a link between the approval object (defined by its GUID) *** and the line item in the shopping cart ls_approval_item-approval_item_guid = ls_item-guid. LOOP AT lt_fd INTO ls_fd. ls_pos-objid = ls_fd-posnumb. move l_ccode to l_value1. move l_ccentre to l_value2. CASE sy-tabix. WHEN '0000000001'. l_itm_val = 'LOW'. WHEN '0000000002'. l_itm_val = 'MEDIUM'. WHEN '0000000003'. l_itm_val = 'HIGH'. ENDCASE. CALL FUNCTION 'BBP_WFL_DIN_APP_OBJ_GET' EXPORTING sc_guid = ls_header-guid criterion1 = c_crit_cocd criterion2 = c_crit_cstc criterion3 = c_item_value value1 = l_value1 value2 = l_value2 value3 = l_itm_val * IV_ITEM_VALUE = 0 * IV_ADD_VALUE = IMPORTING approval_obj_guid = ls_approval_item-approval_object_guid * IS_NEW_APPROVAL_OBJECT = TABLES item_app_obj = lt_item_app_obj . APPEND ls_approval_item TO lt_approval_items. ls_pos-guid = ls_approval_item-approval_object_guid. APPEND ls_pos TO lt_pos. CLEAR: ls_pos, ls_fd. ENDLOOP. IF NOT ls_fun IS INITIAL. ls_pos-objid = ls_fun-posnumb1. l_itm_val = ls_item-value. move l_ccode to l_value1. move l_prodcat to l_value2. CALL FUNCTION 'BBP_WFL_DIN_APP_OBJ_GET' EXPORTING sc_guid = ls_header-guid criterion1 = c_crit_cocd criterion2 = c_crit_cat criterion3 = c_item_value value1 = l_value1 value2 = l_value2 value3 = l_itm_val * IV_ITEM_VALUE = 0 * IV_ADD_VALUE = IMPORTING approval_obj_guid = ls_approval_item-approval_object_guid * IS_NEW_APPROVAL_OBJECT = TABLES item_app_obj = lt_item_app_obj . APPEND ls_approval_item TO lt_approval_items. ls_pos-guid = ls_approval_item-approval_object_guid. APPEND ls_pos TO lt_pos. CLEAR ls_pos. ENDIF. LOOP AT lt_od INTO ls_od. IF NOT ls_od-posnumb01 IS INITIAL. ls_pos-objid = ls_od-posnumb01. ELSEIF NOT ls_od-posnumb02 IS INITIAL. ls_pos-objid = ls_od-posnumb02. ELSEIF NOT ls_od-posnumb03 IS INITIAL. ls_pos-objid = ls_od-posnumb03. ELSEIF NOT ls_od-posnumb04 IS INITIAL. ls_pos-objid = ls_od-posnumb04. ENDIF. CASE sy-tabix. WHEN '0000000001'. l_itm_val = 'LOW'. WHEN '0000000002'. l_itm_val = 'MEDIUM'. WHEN '0000000003'. l_itm_val = 'HIGH'. ENDCASE. move l_prodcat to l_value1. CALL FUNCTION 'BBP_WFL_DIN_APP_OBJ_GET' EXPORTING sc_guid = ls_header-guid criterion1 = c_crit_cat criterion2 = c_item_value value1 = l_value1 value2 = l_itm_val * IV_ITEM_VALUE = 0 * IV_ADD_VALUE = IMPORTING approval_obj_guid = ls_approval_item-approval_object_guid * IS_NEW_APPROVAL_OBJECT = TABLES item_app_obj = lt_item_app_obj . APPEND ls_approval_item TO lt_approval_items. ls_pos-guid = ls_approval_item-approval_object_guid. APPEND ls_pos TO lt_pos. CLEAR: ls_pos, ls_od. ENDLOOP. APPEND LINES OF lt_pos TO lt_pos1. ENDIF. CLEAR: ls_approval_item, ls_item, l_ccode, l_ccentre, ls_account, l_cnt, l_cnt1, l_cnt2. REFRESH: lt_pos. ENDLOOP. *passing all the position id in one table so that it will be able to fetch *user id for those position CLEAR: l_index, l_branch_ind. l_flag = 'X'. lt_pos[] = lt_pos1[]. LOOP AT lt_approval_items INTO ls_approval_item. REFRESH: lt_1001, lt_1001t. IF l_flag = 'X'. l_flag = ''. l_guid = ls_approval_item-approval_item_guid. l_branch_ind = l_branch_ind + 1. ENDIF. IF l_guid <> ls_approval_item-approval_item_guid. CLEAR l_index. l_flag = 'X'. ENDIF. ls_approver-approval_description = c_item_value_desc. ls_approver-hide_items_not_responsible = c_hide_items_flag. ls_approver-approval_object_guid = ls_approval_item-approval_object_guid. LOOP AT lt_pos INTO ls_pos WHERE guid = ls_approval_item-approval_object_guid. REFRESH: lt_1001. CALL FUNCTION 'RH_READ_INFTY' EXPORTING plvar = '01' otype = 'S' objid = ls_pos-objid infty = '1001' istat = '1' begda = sy-datum endda = sy-datum TABLES innnn = lt_1001 EXCEPTIONS all_infty_with_subty = 1 nothing_found = 2 no_objects = 3 wrong_condition = 4 wrong_parameters = 5 OTHERS = 6. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. SORT lt_1001 BY begda. DELETE lt_1001 WHERE sclas <> 'CP' AND relat <> '008'. LOOP AT lt_1001 INTO ls_1001. l_partner = ls_1001-sobid+0(8). CALL FUNCTION 'RH_READ_INFTY' EXPORTING plvar = '01' otype = 'CP' objid = l_partner infty = '1001' istat = '1' begda = sy-datum endda = sy-datum TABLES innnn = lt_1001t EXCEPTIONS all_infty_with_subty = 1 nothing_found = 2 no_objects = 3 wrong_condition = 4 wrong_parameters = 5 OTHERS = 6. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. SORT lt_1001t BY begda. DELETE lt_1001t WHERE sclas <> 'US'. LOOP AT lt_1001t INTO ls_1001t. l_index = l_index + 1. ls_approver-approval_index = l_index. ls_approver-approval_branch = l_branch_ind. swf_create_object lo_user 'USR01' ls_1001t-sobid. swf_get_property lo_user 'Name' ls_approver-name. CONCATENATE 'US' ls_1001t-sobid INTO ls_approver-approval_agent. APPEND ls_approver TO lt_approver. CLEAR ls_1001t. ENDLOOP. CLEAR: ls_1001. ENDLOOP. CLEAR: ls_pos. ENDLOOP. CLEAR: ls_approver. ENDLOOP. ELSE. no_further_approval_needed = 'X'. ENDIF. approval_table[] = lt_approver[]. item_approval_table[] = lt_approval_items[]. item_approval_obj[] = lt_item_app_obj[]. ENDMETHOD.