| Status | |
|---|---|
| Owner | |
| Stakeholders | The business stakeholders involved in making, reviewing, and endorsing this decision. Type @ to mention people by name |
| Jira Request ID | |
| Jira Development ID |
| Parameter | Value |
|---|---|
| Application System (Source) | Ariba Guided Sourcing |
| Application System ( Target) | Keelvar |
| Business Process Reference | 03.03.03.01. Manage Sourcing Projects |
Ariba Guided Sourcing is interfaced with SAP ECC system (PRS) to sync Supplier Master Data. Bidders and Supplier Contacts Master Data is maintained in Ariba Guided Sourcing directly. The Supplier Master Data (including Bidders) along with Supplier Contact information is interfaced with Keelvar as well to allow the Sourcing Specialists the flexibility to invite participants to Keelvar Event. Ariba Supplier ID (System ID) is maintained as External ID in Keelvar ensuring the sync between the two systems. Whenever a supplier or Bidder is deactivated in Ariba Guided Sourcing, the supplier is also archived in Keelvar.
The scope of this Functional Specification is to describe the interface between Ariba and Keelvar for synchronizing Supplier Master Data. Whenever a supplier/bidder is created in Ariba Guided Sourcing, the supplier will be pushed to Keelvar using Keelvar Supplier Management API. Similarly, whenever, a supplier/bidder is deactivated in Ariba, the Keelvar supplier record will be archived. Ariba Master Data API for Sourcing will be used to extract the data from Ariba Guided Sourcing. The supplier contact information is also push from Ariba Guided Sourcing to Keelvar.

Step | Description | Comment |
|---|---|---|
1 | Supplier is created or deactivated in Ariba Guided Sourcing based on SAP ECC details using an Integration Event. Alternatively, a Bidder is created/deactivated in Ariba Guided Sourcing by Sourcing Specialist. Supplier Contact can also be updated in Ariba Guided Sourcing. All of these constitute a change in Supplier/Bidder data in Ariba Guided Sourcing. | |
2 | A Scheduled Task picks up the list of all Suppliers or Contacts modified since the last run. Subsequent action depends on the type of change. | |
3 | If the vendor active flag is false i.e the supplier has been deactivated, SPCPI send a request to Keelvar to archive the supplier records. | |
4 | If the vendor active flag is true i.e the supplier has been created or updated, SCPI extracts the supplier details and creates a payload for Keelvar Supplier Management API and pushes it to Keelvar. | |
5 | If the Supplier Contacts which have been modified since the last run, SCPI extracts the corresponding supplier details and pushes the supplier contact details along with the contact ID to Keelvar. | |
6 | If the Supplier Contacts which have been deactivated since the last run, SCPI checks Ariba for other active contacts for the said supplier. If no contacts are found, a notification is triggered and the supplier record is archived. Otherwise, the supplier details along with the new contact ID is pushed to Keelvar. | |
7 | Based on the request from SCPI through Keelvar Supplier Management API, Keelvar updates the vendor record. |
| Field Name | Field Type | Required |
|---|---|---|
| Contact Name | Text | Yes |
| Contact Email | Text | Yes |
| Contact ID | Text | Yes |
The following are the Security and Authorization considerations for this interface:
In order to activate the Master Data API for Sourcing, following steps need to be completed:
In order to activate Keelvar API, following steps need to be completed:
Ariba Guided Sourcing configuration details are described as under:
Supplementary | Test | Production | |
Ariba Technical User | R_BTP_ARB_ADMIN | ||
Ariba Realm ID | 745255310-SS-T | 745255310-T | 745255310 |
OAuth URL | |||
Request URL | https://eu.openapi.ariba.com/api/sourcing-mds-search/v1/prod | https://eu.openapi.ariba.com/api/sourcing-mds-search/v1/prod | https://eu.openapi.ariba.com/api/sourcing-mds-search/v1/prod |
Keelvar configuration is described below:
Request URL |
Not Applicable
The Supplier Master Data along with Contact details must be in sync between Ariba Guided Sourcing and Keelvar
| Field | Description |
|---|---|
| organization - Name_en | The name of the Supplier Organization |
| organization - SystemID | The ERP vendor ID of the supplier or the Ariba System ID of the Bidder |
| organization - Active | The flag on organization indicating if the Supplier is active or not |
users - Name_en | The name of the Supplier Contact |
users - EmailAddress | The email address of the Supplier Contact |
users - UniqueName | The User ID of the Contact User |
users - Active | The flag on user (contact) indicating if the Supplier is active or not |
The following fields will be used to provide the required information for this interface:
| Field | Description |
|---|---|
| name | The name of the Supplier Organization |
| external_id | The ERP vendor ID of the supplier or the Ariba System ID of the Bidder |
| fields/Contact Name | The name of the Supplier Contact |
| fields/Contact Email | The email address of the Supplier Contact |
| fields/Contact ID | The User ID of the Contact User |
| archived | The flas on Keelvar Supplier record indicating if the supplier is archived or not. |
Populate the table below to list the target / source data field mapping between the Source system and Target system
| API or Portlet Name | Source Field | Required (Y/N) | Description | API or Portlet Name | Target Field | Required (Y/N) | Description | Rule Type | Rule Instruction |
|---|---|---|---|---|---|---|---|---|---|
| Entity Type - organizations | Name_en | Y | The name of the Supplier Organization | /manage/supplier_changes | name | Y | The name of the Supplier Organization | ||
| Entity Type - organizations | SystemID | Y | The ERP vendor ID of the supplier or the Ariba System ID of the Bidder | /manage/supplier_changes | external_id | Y | The ERP vendor ID of the supplier or the Ariba System ID of the Bidder | ||
| Entity Type - organizations | Name_en | Y | The name of the Supplier Contact | /manage/supplier_changes | fields/Contact Name | Y | The name of the Supplier Contact | ||
| Entity Type - users | EmailAddress | Y | The email address of the Supplier Contact | /manage/supplier_changes | fields/Contact Email | Y | The email address of the Supplier Contact | ||
| Entity Type - users | UniqueName | Y | The User ID of the Contact User | /manage/supplier_changes | fields/Contact ID | Y | The User ID of the Contact User | ||
| Entity Type - organizations | Active | Y | The flag on organization indicating if the Supplier is active or not | /manage/supplier_changes | archived | Y | The flag on organization indicating if the Supplier is active or not |
Not Applicable
A Scheduled Task in SCPI should run and extract all supplier updated in Ariba since the last run as under:
curl --location 'https://eu.openapi.ariba.com/api/sourcing-mds-search/v1/prod/entities/organizations?%24filter=((TimeUpdated%20gt%20dateTime))&%24includeInactive=true' \
--header 'Accept-Language: en' \
--header 'X-Realm: ARIBA_REALM_ID' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ARIBA_TOKEN' \
--header 'apiKey: ARIBA_API_KEY'
For the each supplier record retrieved, the logic is as under:
Create a request payload to Keelvar as under:
Sample JSON for the payload is available here -
Then, a request to Manage Supplier Change request should be made as under:
curl --location 'https://test.keelvar.dev/api/manage/supplier_changes' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw 'PAYLOAD_CREATED_AS_ABOVE_JSON';
Sample JSON for the payload is available here -
Then, a request to Manage Supplier Change request should be made as under to archive the Keelvar Supplier record:
curl --location 'https://test.keelvar.dev/api/manage/supplier_changes' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw 'PAYLOAD_CREATED_AS_ABOVE_JSON';
SCPI should extract all supplier users updated in Ariba since the last run as under:
curl --location 'https://eu.openapi.ariba.com/api/sourcing-mds-search/v1/prod/entities/users?%24filter=(PasswordAdapter%20eq%20%27SourcingSupplierUser%27%20and%2TimeUpdated%20gt%20dateTime) \
--header 'Accept-Language: en' \
--header 'X-Realm: ARIBA_REALM_ID' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer 2ARIBA_TOKEN' \
--header 'apiKey: ARIBA_API_KEY'
Create a request payload to Keelvar as under:
The supplier contact should be add to the payload only if there are no active contact.
Sample JSON for the payload (without contact) is available here -
Sample JSON for the payload (with contact) is available here -
Then, a request to Manage Supplier Change request should be made as under:
curl --location 'https://test.keelvar.dev/api/manage/supplier_changes' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw 'PAYLOAD_CREATED_AS_ABOVE_JSON';
A Scheduled Task in SCPI should run and extract all contacts which have been deactivated in Ariba since the last run as under:
curl --location 'https://eu.openapi.ariba.com/api/sourcing-mds-search/v1/prod/entities/users?%24filter=((PasswordAdapter%20eq%20%27SourcingSupplierUser%27%20andTimeUpdated%20gt%20dateTime))&%24includeInactive=true' \
--header 'Accept-Language: en' \
--header 'X-Realm: ARIBA_REALM_ID' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ARIBA_TOKEN' \
--header 'apiKey: ARIBA_API_KEY'
For each of the supplier user records retrieved, the logic is as under:
curl --location 'https://eu.openapi.ariba.com/api/sourcing-mds-search/v1/prod/entities/users?%24filter=((PasswordAdapter%20eq%20%27SourcingSupplierUser%27%20andOrganization.SystemID%20eq%20%27<SystemID>%27))' \
--header 'Accept-Language: en' \
--header 'X-Realm: ARIBA_REALM_ID' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ARIBA_TOKEN' \
--header 'apiKey: ARIBA_API_KEY'
The Active Flag on the user object can be used to ensure the user is active
If there is an existing active user, the first user object available in the response payload along with the System ID should be used to create a request payload to Keelvar as under:
Sample JSON for the payload is available here -
Then, a request to Manage Supplier Change request should be made as under:
curl --location 'https://test.keelvar.dev/api/manage/supplier_changes' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw 'PAYLOAD_CREATED_AS_ABOVE_JSON';
Sample JSON for the payload is available here -
Then, a request to Manage Supplier Change request should be made as under:
curl --location 'https://test.keelvar.dev/api/manage/supplier_changes' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw 'PAYLOAD_CREATED_AS_ABOVE_JSON';
Not Applicable
Rate Limit for Ariba Event Management API - (Requests): 5/second, 80/minute, 3500/hour
Rate Limit for Keelvar create/update Event API - Burst (120/hour), sustained (500/day)
Rate Limit for Keelvar Job API - Burst (30/min), sustained (600/hour)
Following scheduled tasks should be configured to run every 10 minutes:
All requests for creation and update of sourcing events are done via delta load since last run.
The following should be monitored:
Not Applicable
Not Applicable
Not Applicable
Initial Load will have large data volume. Expected load for subsequent loads - 25 updates per day
Not Applicable
Error Messages Returned by the Event Management API
| ID | Condition | Expected Results |
|---|---|---|
| 1 | Create a new Bidder in Ariba | A Supplier record should be created in Keelvar |
| 2 | Update the Bidder name, Contact Name or Email Address | The Supplier record should be updated in Keelvar |
| 3 | Deactivate a Bidder in Ariba | The Supplier record should be archived in Keelvar |
| 4 | Choose a supplier/bidder in Ariba with two contacts. Deactivate a contact for which the contact ID is not maintained in Keelvar | The Supplier record should be updated with the Contact ID of the second contact |
| 5 | Deactivate all contacts for a supplier/bidder | The supplier record should be archived and the contact ID should be prefixed with the word Inactive |
Not Applicable
| Package Name | Parent Package |
|---|---|
Other Development Objects
| Object Type | Object Name | Purpose/High Level Logic | Design Rationale Reference |
|---|---|---|---|
Insert links and references to other documents which are relevant when trying to understand this decision and its implications. Other decisions are often impacted, so it's good to list them here with links. Attachments are also possible but dangerous as they are static documents and not updated by their authors.
