Skip to Content
Product Information
Author's profile photo Rebekka Sperger

Integrate SAP Cloud for Customer with SAP Cloud Platform Workflow Service using SAP Cloud Platform Integration

In this blog post, you will learn how an event from SAP Cloud for Customer could initiate an instance in your SAP Cloud Platform Workflow Service using a SAP Cloud Platform Integration as middleware.

The use case is as following:

In SAP Cloud for Customer a sales employee set a sales quote to won, this should initiate a workflow and transfer specific quote information like items (products, prices, quantity) but also header information like account and description.

So, let’s get started.

Configuration in SAP Cloud for Customer:

  1. Create an event notification in SAP Cloud for Customer:

Therefore, go to the work center Administrator à General Settings and open “Event Notification”.

  • Add a new consumer and define the endpoint of your iFlow. As soon as your iFlow is deployed you could find it in the SAP Cloud Platform Integration –> Monitor –> Manage Integration Content: Select your iFlow and on the right side you will see the endpoint.
  • Edit the event credentials and choose as authentication method “SSL Client Certificate”. A system key pair will be created and you could download the public key.
  • Add subscriptions in the table below. In the above mentioned use case a C4C event should get triggered as soon as a sales quote is set to won. Therefore, three subscriptions will be created:
Business Object Node Field Changed Field Name Field changed from Field changed to
Sales Quote Root X Progress 1 – Not Relevant 3 – Won
Sales Quote Root X Progress 2 – Pending 3 – Won
Sales Quote Root X Progress 4 – Lost 3         – Won
  • As a last step, activate your consumer. The result will look like this:

C4C%20Event%20Configuration

C4C Event Configuration

2) Set a sales quote to won, to trigger the event. As a result, you will find an entry in the event monitor (Administrator –> General Settings –> Event Notification Monitoring):

{
"event-type": "SalesQuote.Root..PendingToWon",
"event-type-version": "v1",
"event-id": "00163e69-e86e-1eda-bbef-ff6fbd5146d9",
"event-time": "2020-09-05T13:59:13Z",
"data": {
  "root-entity-id": "00163E69E86E1EEAB9D73CEA9E5C5F44",
  "entity-id": "00163E69E86E1EEAB9D73CEA9E5C5F44"
  }
}

This event provides the information which event was triggered and sends over the quote GUID.

iFlow Configuration in SAP Cloud Platform Integration:

The iFlow logic is as following: The C4C event gets send to the iFlow where it will be converted from JSON to XML. This is needed so that the quote GUID could be saved in the content modifier as a property and be used in the GET call to C4C to retrieve further quote attributes/information. This message is flowing into a message mapping where it is mapped to the workflow structure. The outcome is in XML. This must be converted to JSON. Again, a content modifier is needed to provide a content-type in the header of the message and now, it could be sent over to SAP Cloud Platform Workflow Service.

iFlow%20Overview

iFlow Overview

Let’s do it step by step:

1) Configure your inbound channel:

Use a HTTP channel and upload the downloaded public certificate from your SAP Cloud for Customer consumer. Provide an iFlow address. The SAP Cloud Platform Integration will add /http/ in between the CPI hostname and iFlow address during the deploying step, so that the iFlow endpoint will be:

https://XXXXX-iflmap.hcisbt.eu2.hana.ondemand.com/http/QuoteReplication

iFlow%20Inbound%20Channel

iFlow Inbound Channel

2) Add a XML to JSON converter and choose that a XML root element should be added.

JSON%20to%20XML%20Converter

JSON to XML Converter

After this step, the message looks like this.

<?xml version='1.0' encoding='UTF-8'?>
<root>
	<event-type>SalesQuote.Root..PendingToWon</event-type>
	<event-type-version>v1</event-type-version>
	<event-id>00163e69-e86e-1eda-bbf0-429fbec5c8bb</event-id>
	<event-time>2020-09-05T14:14:15Z</event-time>
	<data>
		<root-entity-id>00163E69E86E1EEAB9D73CEA9E5C5F44</root-entity-id>
		<entity-id>00163E69E86E1EEAB9D73CEA9E5C5F44</entity-id>
	</data>
</root>

3) Now, let’s save the quote GUID as a property. There, you could use the type XPATH and as value enter the path from the entity-id.

Save%20Quote%20GUID%20as%20Property

Save Quote GUID as Property

4) In the request-reply step, a GET call to the C4C system will be triggered:

Make sure, that you filter for your specific quote in the query options: GET%20C4C%20Quote

GET C4C Quote

&$filter=ObjectID eq '${property.Quote_GUID}'

GET%20C4C%20Quote%20Details

GET C4C Quote Details

The result message looks like this:

<SalesQuoteCollection>
	<SalesQuote>
		<SalesQuoteItem>
			<SalesQuoteItem>
				<Description>Item 1</Description>
				<QuantityMeasureUnitCode>EA</QuantityMeasureUnitCode>
				<ObjectID>00163E69E8821EEABBB7000448D74B3B</ObjectID>
				<ProductInternalID>10007261</ProductInternalID>
				<MainPrice>0E-14</MainPrice>
				<Quantity>1.00000000000000</Quantity>
				<ItemID>190</ItemID>
				<MainPriceCurrencyCode>EUR</MainPriceCurrencyCode>
			</SalesQuoteItem>
			<SalesQuoteItem>
				<Description>Item 2</Description>
				<QuantityMeasureUnitCode/>
				<ObjectID>00163E9C2FB01EDABA85FE558796C55D</ObjectID>
				<ProductInternalID/>
				<MainPrice>0E-14</MainPrice>
				<Quantity>0E-14</Quantity>
				<ItemID>10</ItemID>
				<MainPriceCurrencyCode/>
			</SalesQuoteItem>
...
		</SalesQuoteItem>
		<ObjectID>00163E69E86E1EEAB9D73CEA9E5C5F44</ObjectID>
		<BuyerID/>
		<BuyerPartyID>1010710</BuyerPartyID>
		<ID>707</ID>
		<Name>Angebotshülle V1</Name>
	</SalesQuote>
</SalesQuoteCollection>

 

5) The WSDL from the C4C message gets created automatically and you could use it in your message mapping. The C4C structure looks like this:

<SalesQuoteCollection>
	<SalesQuote>
		<SalesQuoteItem>
			<SalesQuoteItem>
				...Item Information...
			</SalesQuoteItem>
			<SalesQuoteItem>
				...ItemInformation...
			</SalesQuoteItem>
		</SalesQuoteItem>
		...header information...
	</SalesQuote>
</SalesQuoteCollection>

For the workflow, the structure must be like this:

{
  "definitionId": "string",
  "context": {}
}

You could find a detailed documentation on the provided APIs for Workflow Management here.

The definition id is the created workflow definition and the context could be design individually. For this use case the structure should be like the C4C one.

I created an XSD with the help of an online tool.

6) SAP Cloud Platform Workflow Service is expecting the message in JSON. Therefore, an XML to JSON converter is used to format the message. Make sure to suppress the JSON root element, as this is not expected from the SAP Cloud Platform Workflow Service.

XML%20to%20JSON%20Converter

XML to JSON Converter

7) Use a content modifier for defining the Content-Type as “application-json”.Content%20Modifier%20with%20Content-Type

Content Modifier with Content-Type

8) Now, the message is ready to be send over to SAP Cloud Platform Workflow Service. Use a HTTP channel and define the address like this:

<workflow_rest_url>/v1/workflow-instances

iFlow%20Outbound%20Channel

iFlow Outbound Channel

As credential use OAuth2 Client Credential. For this, create it in Monitor à Manage Security Materials. The Token Service URL could be found in the screenshot of the SAP Cloud Platform Cockpit below.

oAuth2%20Credential

oAuth2 Credential

You will find all SAP Cloud Platform Workflow Service information like service URL and token information (token URL, client ID, client secret) in the SAP Cloud Platform Cockpit:

SAP%20Cloud%20Platform%20Cockpit

SAP Cloud Platform Cockpit

View result in SAP Cloud Platform Workflow Service:

Go to Monitor Workflows –> Workflow Instances and you will find your send message.

 

Assigned Tags

      3 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo ravi subramanya
      ravi subramanya

      Hi Rebekka,

      Thanks for the information on workflow integration. It is good read. Will try this.

      Author's profile photo Frank Li
      Frank Li

      Hi Rebekka.

      Thank you for your great sharing.

      If create sample IFlow just to call SAP BTP workflow instance,and then try to call this IFlow from postman, which authorization type should choose? And For postman send type, should select Post request type, right? Thank you.

      As I follow this blog, https://blogs.sap.com/2021/04/13/cloud-integration-with-workflow-and-business-rule-in-sap-btp-cloud-foundry/

      When test from postman, failed to call IFlow. 

      Author's profile photo Frank Li
      Frank Li

      As I follow this blog, https://blogs.sap.com/2021/04/13/cloud-integration-with-workflow-and-business-rule-in-sap-btp-cloud-foundry/

      When test from postman, failed to call IFlow.