S/4HANA Cloud(S4HC) provides the new Flexible Workflow, that you can manage using “Manage Workflow App”. In this blog I am covering how to implement Custom Pre-conditions in S4HC   Workflow. Please check the below link to understand the standard Pre-conditions in S4HC Workflow for Purchase Order as example:  S/4HANA Cloud - Flexible Workflow for Purchase Order Approval

In environment of S4HC, it provides a new functionality where you can add new pre-conditions in Purchase requisition using Manage workflow app. In S4HC latest release, you will find 3 apps for Manage Workflow for Purchase Requisition, in that you need to select the NEW version of APP highlighted in below screen short.

There are basically two types of release for Purchase Requisition Workflow.

  1. Overall release of Purchase Requisition.
  2. Release of Purchase Requisition Item

 Based upon release type we have some standard pre condition defines. Preconditions are used to trigger the workflow if the conditions met during creation of purchase requisition.

  1.Overall release of Purchase requisition.   

  Click on Add to create a new Workflow. To check the standard Pre condition click on Start Condition Tab and in dropdown list check the available Pre-Condition. 

2.    2. Release of Purchase Requisition Item

Here you can see there are 2 custom pre condition that are visible after implementation of BADI

Scenario:

In this requirement we need to add the custom pre-condition for purchase requisition at Item level, so once you create purchase requisition and click on save, workflow will get trigger send for approval at item level. We need to trigger the workflow based upon value of standard field, if the value of standard field is “PRV” then custom workflow for PRV need to trigger and if value of standard field is PRS then workflow for PRS need to get trigger.There can be any standard and custom field(created for same business context).                                                                      Here in this scenario we are using standard field “Service material number” to enter the value as PRV or PRS(as example), so if we create PR with Service Material Number entered value as PRV then Workflow for PRV need to get trigger and if we entered value as PRS the workflow for PRS get triggered.

First, we need to create 2 custom workflow having custom condition step as PRV or PRS. For adding custom pre-condition, we are implementing BADI. You can use the “Custom Fields and Logic” app to create a BAdI implementation and publish the custom logic.

Below are 2 custom pre condition that we are adding.

  1.    Procurement for PRV
  2.    Procurement for PRS   

These new custom conditions can be defined using BADI SWF_WORKFLOW_CONDITION_DEF. 

Once this BADI is implemented, then those pre-condition / step condition will be visible in the Manage Workflows app for the respective filter criteria.

 

Filter Conditions would be the scenario ID. The following are some of the scenario ID’s that can be used:

 

WS00800157 - Release of Purchase Requisition Header Level

WS00800173 - Release of Purchase Requisition Item Level

WS02000434 - Release of Central PR Header Level

WS02000438 - Release of Central PR Item Level

WS02000458 - Release of Purchase Requisition for header level using the APP Manage Workflow for Purchase Requisitions – New

WS02000471 - Release of Purchase Requisition for item level using the APP Manage Workflow for Purchase Requisitions – New

WS00800251 - Workflow for blocked invoices

WS00800303 - Workflow for parked invoices as complete

WS00800238 - Workflow for Purchase Orders

 

For BADI implementation go to App “Custom Field and logic”.

 

Go to tab Custom Logic.

Click on “+” button top right corner of the system

It will ask for New implementation details

Select the business context as start and pre-condition in flexible workflow.

Select BADI description as Proving additional condition for scenario.

Click on create and your BADI implementation is created.

Note: Always Check the following technical documentation and sample code for the BADIs before start implementation.

BAdI - SWF_WORKFLOW_CONDITION_DEF, Method: GET_CONDITIONS

Use:   to define additional conditions for scenarios

Parameters:

CT_CONDITION

Fields: -

ID: Unique ID of the additional condition

subject: Name of the additional condition

type: Condition to be added at step level(type = if_swf_flex_ifs_condition_def=>cs_condtype-step) or at both of step level and workflow level(type = if_swf_flex_ifs_condition_def=>cs_condtype-start_step)

CT_PARAMETER

Fields: -

ID: Unique ID of the additional condition

Name: Name of the additional condition

xsd_type: Data type of the additional condition (supported data types are Boolean, date, string, integer and time)

mandatory: To indicate the additional condition is mandatory

We need to define the filter condition based upon scenario id, so the precondition will only visible to that scenario.

Go to filter tab and give scenario id as mentioned in list above

Scenario WS02000471 is used for Release of Purchase Requisition for item level using the APP Manage Workflow for Purchase Requisitions – New.

Save and Publish the logic.

Open the APP Manage Workflow for Purchase Requisition-New, create a new workflow and check the custom pre conditions under “Start Condition”.

Custom Precondition for PRV and PRS has been implemented using BADI, now we need to write the code to evaluate these custom pre condition.

 

The defined pre-condition / step condition needs to be evaluated against the newly created BO. That will be done using the custom BADI SWF_WORKFLOW_CONDITION_EVAL.

 

Both BADI’s needs to be implemented in order to define and evaluate new custom pre-condition / step condition.

 

Repeat the same steps as above to create the BADI implementation, but this time in BADI description select “Value evaluation of addition conditions for scenarios”.

BADI - SWF_WORKFLOW_CONDITION_EVAL, Method: EVALUATE_CONDITION Use: to evaluate the additional conditions defined

Parameters: IS_SAP_OBJECT_NODE_TYPE 

Fields: -

SONT_KEY_PART_1-> Purchase requisition number

SONT_KEY_PART_2 -> Purchase requisition item number

 

IS_CONDITION

Fields: - 

condition_id -> Unique ID of the additional condition

 

IT_PARAMETER_VALUE 

Fields: -

Name -> Name of parameter in workflow in Manage workflow app

Value -> Value of parameter mentioned in workflow in Manage workflow app

 

CV_IS_TRUE 

Should be set as true if the additional condition evaluation is successful

 

Check the sample code that can be used.

1.     CV_IS_TRUE is parameter to activate the workflow,

cv_is_true = abap_false.

 

2.     Reading parameter table with condition PRV AND PRS.

            READ TABLE it_parameter_value INTO DATA(ls_param_value)

            WITH KEY name = 'PRV'.

READ TABLE it_parameter_value INTO ls_param_value

            WITH KEY name = 'PRS'.

 

3.     This workflow for PRV and PRS is designed for Item Level release of Workflow

First, we need to fetch the data for PR using API based upon PR number and item, here is_sap_object_node_type-sont_key_part_1 contains the PR number and is_sap_object_node_type-sont_key_part_2 contains the item number.

 

              SELECT * INTO TABLE @lt_purchaserequisition

              FROM i_purchaserequisition_api01

             WHERE purchaserequisition = @is_sap_object_node_type-sont_key_part_1

                         AND purchaserequisitionitem = @is_sap_object_node_type-sont_key_part_2.

 

4.     Checking the condition step and maintained value for PRV and PRS in supplier material number", if condition is PRV and supplier material is PRV then workflow is active for PRV, if condition is PRS and supplier material number is PRS then workflow is active for PRS.

             

             CASE ls_param_value-value.

             WHEN 'PRV'.

             READ TABLE lt_purchaserequisition INTO DATA(ls_purreq)

                  WITH KEY SupplierMaterialNumber = ls_param_value-value.

            IF sy-subrc = 0.

             cv_is_true = abap_true.

             ELSE.

             cv_is_true = abap_false.

             ENDIF.

                  Checking the condition step and maintained value for PRV and PRS in suppiler material number"

             WHEN 'PRS'.

              READ TABLE lt_purchaserequisition into ls_purreq

                   WITH KEY SupplierMaterialNumber = ls_param_value-value.

             IF sy-subrc = 0.

             "If Maintained Value is PRS then WF for PRS will get trigger else check the next condition"

             cv_is_true = abap_true.

             ELSE.

             cv_is_true = abap_false.

             ENDIF.

             WHEN OTHERS.

             cv_is_true = abap_false.

             ENDCASE.

             ENDIF.

            ENDIF.

Finally, we need to create 2 workflows having custom pre conditions.

 

1.     Workflow with pre condition PRV.

  Go to “Manage Workflow App”

Click on Add button

Select the condition: BAdI: procurement for PRV and give value as PRV.

In the Step Sequence select the recipient to send the workflow for approval. Enter the user for approval.

Click on save and activate the Workflow.


1.       Workflow with pre condition PRS

Same step needs to repeat for Pre-Condition PRS.

Conclusion

 

Now create PR and check your workflow triggers.

Create the PR from “Purchase Requisition APP” and give the supplier number “PRV” or “PRS” based upon which workflow you need to trigger.

Click on Save and workflow will get trigger.

Check your inbox, go to workflow and check the status

Workflow for Pre-Condition of PRV is triggered. If the service material field has value PRS is maintained, then workflow for Pre-Condition PRS will triggered.

You can find the details for BADI in below mentioned note.

Note: 2767845 ( https://launchpad.support.sap.com/#/notes/2767845 )