SAP ABAP - Custom Agent Determination Supplier Invoice Flexible Workflow Approval
Approval Supplier Invoice document (MIR7) using flexible workflow with custom agent determination.
Using custom agent determination for supplier invoice approval with flexible workflow in SAP involves several steps. Below is a step-by-step guide to help you set this up:
Step 1: Understand the Requirement
In my case, custom agent determination need to maintain with custom table. Below the custom table needs:
After create both of tables, need to create custom CDS view which will be used in custom logic apps code
- First CDS View ZInvoiceWf@AbapCatalog.sqlViewName: 'ZIWFINVOICE'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@ClientHandling.algorithm: #SESSION_VARIABLE@EndUserText.label: 'Supplier Invoice Workflow'@VDM.viewType: #COMPOSITE@VDM.lifecycle.contract.type: #SAP_INTERNAL_API@ObjectModel.usageType.sizeCategory: #M@ObjectModel.usageType.serviceQuality: #A@ObjectModel.usageType.dataClass: #MASTER@ObjectModel.supportedCapabilities:[ #CDS_MODELING_DATA_SOURCE,#CDS_MODELING_ASSOCIATION_TARGET,#SQL_DATA_SOURCE ]define view ZI_SUPP_INV_WFas select from zmmt007 as ZInvoiceWf{key ZInvoiceWf.function as Function,key ZInvoiceWf.fundesc as FuncDesc,key ZInvoiceWf.app_lvl as AppLvl,ZInvoiceWf.bus_usr as BusUser}Second CDS View ZI_SUPP_INV_REL_MAP@AbapCatalog.sqlViewName: 'ZIWFINVOICEREL'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #NOT_REQUIRED@EndUserText.label: 'Release Invoice Mapping'@VDM.viewType: #COMPOSITE@VDM.lifecycle.contract.type: #SAP_INTERNAL_API@ObjectModel.usageType.sizeCategory: #M@ObjectModel.usageType.serviceQuality: #A@ObjectModel.usageType.dataClass: #MASTER@ObjectModel.supportedCapabilities:[ #CDS_MODELING_DATA_SOURCE,#CDS_MODELING_ASSOCIATION_TARGET,#SQL_DATA_SOURCE ]define view ZI_SUPP_INV_REL_MAP as select from zmmt008 as ZInvoiceRel{key ZInvoiceRel.zrel_group,key ZInvoiceRel.zrel_strat,key ZInvoiceRel.zfunction,key ZInvoiceRel.zsign,key ZInvoiceRel.zcurr,zamount}@AbapCatalog.sqlViewName: 'ZVRBCO'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #NOT_REQUIRED@EndUserText.label: 'Invoice Account Assignment'define view ZI_INV_RBCO as select from rbco {key belnr,key gjahr,key buzei,key cobl_nr,wrbtr,sgtxt,txjcd,kostl}
Step 2: Create a Custom BADI Implementation
Create BADI implementation from sap fiori Custom Logic Apps:
After create, will show the custom logic page, in custom logic page go to Filter tab and add new filter workflowscenario = WS00800303
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.
Comments
Post a Comment