DATA:
ls_badi_approver TYPE if_mrm_workflow_agents=>bd_mmpur_s_badi_approver,
lt_badi_approver TYPE if_mrm_workflow_agents=>bd_mmpur_t_badi_approver,
ls_previous_approver TYPE if_mrm_workflow_agents=>bd_mmpur_s_previous_approver,
ls_new_approver TYPE if_mrm_workflow_agents=>bd_mmpur_s_badi_approver,
lv_count TYPE i.
DATA:
lt_wf type table of ZI_SUPP_INV_WF,
lt_wf_rel TYPE TABLE OF zi_supp_inv_rel_map,
lt_wf_rel2 TYPE TABLE OF zi_supp_inv_rel_map,
ls_wf_relx TYPE zi_supp_inv_rel_map,
ls_wf_rel2 TYPE zi_supp_inv_rel_map,
lv_app_level TYPE I.
lv_app_level = stepinfo-current_step.
SELECT *
from I_SupplierInvoiceAPI01 WITH PRIVILEGED ACCESS
where SupplierInvoice = @supplierinvoice and
FiscalYear = @FiscalYear
INTO TABLE @DATA(lt_SupplierInv).
SELECT *
from ZI_INV_RBCO WITH PRIVILEGED ACCESS
where belnr = @supplierinvoice and
gjahr = @FiscalYear
INTO TABLE @DATA(lt_supplier_inv_assignment).
READ TABLE lt_SupplierInv INTO DATA(ls_invoice) INDEX 1.
READ TABLE lt_supplier_inv_assignment INTO DATA(ls_assignement) INDEX 1.
IF ls_invoice-companycode = '0001' AND
ls_invoice-ACCOUNTINGDOCUMENTTYPE = 'RE' AND
ls_invoice-INVOICEGROSSAMOUNT >= 1.
SELECT * FROM zi_supp_inv_rel_map WITH PRIVILEGED ACCESS
WHERE zrel_group = 'WPO-GEN-WF' AND
zrel_strat = 'ALL'
INTO TABLE @lt_wf_rel.
ELSEIF ls_invoice-companycode = '0001' AND
ls_invoice-ACCOUNTINGDOCUMENTTYPE <> 'RE'.
* AND
* ls_invoice-INVOICEGROSSAMOUNT <= 100000.
SELECT * FROM zi_supp_inv_rel_map WITH PRIVILEGED ACCESS
WHERE zcurr = @ls_invoice-documentcurrency AND
zrel_strat = @ls_assignement-kostl
INTO TABLE @lt_wf_rel2.
LOOP AT lt_wf_rel2 ASSIGNING FIELD-SYMBOL(<fs_wf_rel>).
IF ls_invoice-INVOICEGROSSAMOUNT > <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'GT'.
ls_wf_relx = <fs_wf_rel>.
EXIT.
ELSEIF ls_invoice-INVOICEGROSSAMOUNT >= <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'GE'.
ls_wf_relx = <fs_wf_rel>.
EXIT.
ELSEIF ls_invoice-INVOICEGROSSAMOUNT < <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'LT'.
ls_wf_relx = <fs_wf_rel>.
EXIT.
ELSEIF ls_invoice-INVOICEGROSSAMOUNT <= <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'LE'.
ls_wf_relx = <fs_wf_rel>.
EXIT.
ELSEIF ls_invoice-INVOICEGROSSAMOUNT = <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'EQ'.
ls_wf_relx = <fs_wf_rel>.
EXIT.
ENDIF.
ENDLOOP.
SELECT * FROM zi_supp_inv_rel_map WITH PRIVILEGED ACCESS
WHERE zrel_group = @ls_wf_relx-zrel_group AND
zrel_strat = @ls_assignement-kostl
INTO TABLE @lt_wf_rel.
ENDIF.
IF lt_wf_rel is not initial.
select * FROM ZI_SUPP_INV_WF WITH PRIVILEGED ACCESS
FOR ALL ENTRIES IN @lt_wf_rel
WHERE function = @lt_wf_rel-zfunction
AND APPLVL = @lv_app_level
into TABLE @lt_wf.
sort lt_wf by AppLvl.
ENDIF.
clear lv_count.
loop at lt_wf into data(ls_wf).
clear ls_badi_approver.
ls_badi_approver-businessuser = ls_wf-BusUser.
ls_badi_approver-approvallevel = ls_wf-AppLvl.
APPEND ls_badi_approver TO lt_badi_approver.
clear ls_wf.
lv_count = lv_count + 1.
endloop.
*stepinfo-total_steps = lv_count.
** 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.
** 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.