Here you have a sample coding if the implementation has to support multiple steps with BADI as agent determination rule and each step has pre-conditions. DATA: ls_badi_approver TYPE if_mmpur_workflow_agents_v2=>bd_mmpur_s_badi_approver, lt_badi_approver TYPE if_mmpur_workflow_agents_v2=>bd_mmpur_t_badi_approver, ls_previous_approver TYPE if_mmpur_workflow_agents_v2=>bd_mmpur_s_previous_approver, ls_new_approver TYPE if_mmpur_workflow_agents_v2=>bd_mmpur_s_badi_approver. DATA: lv_costcentre TYPE string. ** define the list of BADI approvers ** ----- Approval Level 1 -------** * Level 1 is based on net price. if previousapproverlist is initial. SELECT SINGLE PurchaseRequisitionPrice, PurReqnItemCurrency FROM I_PurchaseRequisition_Api01 INTO @data(ls_item) WHERE purchaserequisition = @purchasingdocument and PurchaseRequisitionItem = @purchasingdocumentitem. if ls_item-PurchaseRequisitionPrice > 500 and ls_item-PurReqnItemCurrency EQ 'EUR'. ls_badi_approver-businessuser = 'CB9980000658'. " WF_MGR2 is the first level approver. ls_badi_approver-approvallevel = 1. APPEND ls_badi_approver TO lt_badi_approver. ls_badi_approver-businessuser = 'CB9980000009'. " Administrator is another approver at same level. ls_badi_approver-approvallevel = 1. APPEND ls_badi_approver TO lt_badi_approver. Endif. endif. * Level 2 is based on account assignment category. if lt_badi_approver is initial. SELECT SINGLE AccountAssignmentCategory FROM I_PurchaseRequisition_Api01 INTO @data(lv_acccat) WHERE purchaserequisition = @purchasingdocument. If lv_acccat EQ 'K' AND NOT ( line_exists( previousapproverlist[ businessuser = 'CB9980000659' ] ) ). ls_badi_approver-businessuser = 'CB9980000659'. "WF_VP1 is second level approver. if ( line_exists( previousapproverlist[ businessuser = 'CB9980000658' ] ) ). ls_badi_approver-approvallevel = 2. else. ls_badi_approver-approvallevel = 1. endif. APPEND ls_badi_approver TO lt_badi_approver. Endif. Endif. * Level 3 is based on Material Group. if lt_badi_approver is initial. SELECT SINGLE MaterialGroup FROM I_PurchaseRequisition_Api01 INTO @data(lv_matcat) WHERE purchaserequisition = @purchasingdocument. If lv_matcat EQ 'A002' AND NOT ( line_exists( previousapproverlist[ businessuser = 'CB9980000656' ] ) ). ls_badi_approver-businessuser ='CB9980000656'. "i044736 is third level approver. If ( line_exists( previousapproverlist[ businessuser = 'CB9980000659' ] ) ). ls_badi_approver-approvallevel = 3. elseif ( line_exists( previousapproverlist[ businessuser = 'CB9980000658' ] ) ). ls_badi_approver-approvallevel = 2. elseif previousapproverlist is initial. ls_badi_approver-approvallevel = 1. endif. APPEND ls_badi_approver TO lt_badi_approver. Endif. endif. * Level 4 is based on Creation Indicator. if lt_badi_approver is initial. SELECT SINGLE PurReqnOrigin FROM I_PurchaseRequisition_Api01 INTO @data(lv_prorigin) WHERE purchaserequisition = @purchasingdocument. If lv_prorigin EQ 'S' AND NOT ( line_exists( previousapproverlist[ businessuser = 'CB9980000656' ] ) ). ls_badi_approver-businessuser = 'CB9980000657'. "WF_EMP1 is fourth level approver. if ( line_exists( previousapproverlist[ businessuser = 'CB9980000656' ] ) ). ls_badi_approver-approvallevel = 4. elseif ( line_exists( previousapproverlist[ businessuser = 'CB9980000659' ] ) ). ls_badi_approver-approvallevel = 3. elseif ( line_exists( previousapproverlist[ businessuser = 'CB9980000658' ] ) ). ls_badi_approver-approvallevel = 2. elseif previousapproverlist is initial. ls_badi_approver-approvallevel = 1. endif. APPEND ls_badi_approver TO lt_badi_approver. Endif. Endif. ** remove the previous approvers from the list of BAdI approvers. LOOP AT previousapproverlist INTO ls_previous_approver. READ TABLE lt_badi_approver INTO ls_badi_approver WITH KEY businessuser = ls_previous_approver-businessuser. CHECK sy-subrc = 0. DELETE lt_badi_approver WHERE approvallevel = ls_badi_approver-approvallevel. ENDLOOP. ** determine the next approval level and appropriate approvers READ TABLE lt_badi_approver INTO ls_badi_approver INDEX 1. LOOP AT lt_badi_approver INTO ls_new_approver WHERE approvallevel = ls_badi_approver-approvallevel. APPEND ls_new_approver-businessuser TO approverlist. ENDLOOP.