We are delighted to share our new EIC Delivery Methodology for efficiently managing Saviynt Implementations and delivering quick time to value. CLICK HERE.

Import Coupa Roles/Entitlements

LeeEG
New Contributor II
New Contributor II

Hello, my team and I are trying to pull in roles from our client's Coupa environment to add as entitlements in Saviynt. Because Coupa has no roles endpoint, we are using a single user as the container for all the roles to be imported and mapped. However, we are having issues in getting Saviynt to run through the embedded list of roles properly (See JSON and Response from GET call below). Any ideas or help would be greatly appreciated. The bolded items under call response are the items we want to import as roles for both the user account to associate it to and the overall list of roles for the app when we iterate through all the users.

v23.12

JSON:

{
"accountParams": {
"connection": "acctAuth",
"processingType": "SequentialAndIterative",
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"url": "https://domain-test.coupahost.com/api/users?offset=50",
"httpContentType": "application/json",
"httpMethod": "GET",
"httpHeaders": {
"Authorization": "${access_token}",
"Accept": "application/json"
}
},
"listField": "",
"keyField": "accountID",
"colsToPropsMap": {
"accountID": "id~#~char",
"customproperty1": "email~#~char",
"name": "login~#~char",
"customproperty2": "firstname~#~char",
"customproperty3": "lastname~#~char",
"customproperty4": "fullname~#~char",
"customproperty6": "company~#~char",
"customproperty8": "purchasing-user~#~char",
"customproperty9": "expense-user~#~char",
"customproperty10": "sourcing-user~#~char",
"customproperty11": "inventory-user~#~char",
"customproperty12": "contracts-user~#~char",
"customproperty13": "analytics-user~#~char",
"customproperty14": "created-by.id~#~char",
"customproperty15": "sso-identifier~#~char",
"customproperty16": "employee-number~#~char",
"customproperty17": "active~#~char"
},
"pagination": {
"offset": {
"offsetParam": "offset",
"batchParam": "limit",
"batchSize": 50,
"totalCountPath": 85000
}
}
}
},
"acctEntMappings": {
"Roles": {
"listPath": "",
"idPath": "roles",
"keyField": "entitlementID",
"importAsEntitlement": true,
"colsToPropsMap": {
"entitlement_value": "name~#~char",
"entitlementID": "id~#~char",
"displayname": "name~#~char"
}
}
}
},
"entitlementParams": {
"connection": "acctAuth",
"processingType": "SequentialAndIterative",
"entTypes": {
"Roles": {
"entTypeOrder": 0,
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}",
"Accept": "application/json"
},
"url": "https://domain-test.coupahost.com/api/users?id=329 ",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "roles",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char",
"description": "description~#~char"
}
}
}
}
}
},
"acctEntParams": {
"processingType": "acctToEntMapping"
}
}

Call Response:

[
{
"id": 329,
"created-at": "2024-01-09T09:48:37-05:00",
"updated-at": "2024-01-09T09:50:01-05:00",
"login": "entitlementTest@test.com",
"email": "entitlementTest@test.com",
"risk-assess-user": false,
"employee-number": "1234565589",
"firstname": "entitlement",
"lastname": "test",
"fullname": "entitlement test",
"account-security-type": 0,
"authentication-method": "saml",
"sso-identifier": "entitlementTest@coupa.com",
"default-locale": null,
"business-group-security-type": 1,
"mention-name": "entitlementTest.raah.ca",
"seniority-level": null,
"business-function": null,
"employee-payment-channel": "ERP",
"allow-employee-payment-account-creation": false,
"middlename": null,
"active": true,
"api-user": false,
"aic-user": false,
"purchasing-user": true,
"expense-user": false,
"sourcing-user": false,
"inventory-user": false,
"contracts-user": false,
"analytics-user": false,
"spend-guard-user": false,
"ccw-user": false,
"clm-advanced-user": false,
"supply-chain-user": false,
"travel-user": false,
"treasury-user": false,
"invoicing-user": false,
"phone-work": {
"country-code": "1",
"area-code": "650",
"number": "5856306",
"extension": null
},
"phone-mobile": null,
"country-of-residence": null,
"roles": [
{
"id": 7,
"name": "Accounting Supervisor",
"description": "Adds ability to manage suppliers, financial setup, budgets and approve on-hold invoices",
"omnipotent": false,
"system-role": true
}
],
"manager": null,
"default-address": null,
"default-account": null,
"default-account-type": null,
"default-currency": {
"id": 1,
"code": "USD",
"decimals": 2
},
"department": null,
"requisition-approval-limit": {
"id": 12,
"name": "10,000.00 USD",
"amount": "10000.00",
"subject": "requisition_header"
},
"invoice-approval-limit": {
"id": 77,
"name": "15,000.00 USD",
"amount": "15000.00",
"subject": "invoice_header"
},
"requisition-self-approval-limit": {
"id": 41,
"name": "500.00 USD",
"amount": "500.00",
"subject": "requisition_header"
},
"invoice-self-approval-limit": null,
"content-groups": [],
"account-groups": [],
"user-groups": [],
"created-by": {
"id": 217,
"login": "Saviynt_Sandbox",
"employee-number": null
},
"updated-by": {
"id": 217,
"login": "Saviynt_Sandbox",
"employee-number": null
}
}
]

[This message has been edited by moderator to disable url hyperlink]

5 REPLIES 5

rushikeshvartak
All-Star
All-Star

Refer https://docs.saviyntcloud.com/bundle/Coupa-v2022x/page/Content/Understanding-the-Integration-between...


Regards,
Rushikesh Vartak
If you find the response useful, kindly consider selecting Accept As Solution and clicking on the kudos button.

Hi Rushikesh,

That was our first attempt but we cannot use entitlementParams. We have no access to entitlements via an endpoint. We are trying to do it via acctToEntMapping to map and create them as we go directly from the accountParams section. Is there a way we can achieve that ?

My colleague copied the version that we are currently attempting to test and customproperty31 gets filled with the correct information and it looks like this: 

"{"Roles":{"entIds":["2","3","10003"],"keyField":"entitlementID"}}"

So we know we are reading the correct stuff in here but we cannot manage to create those 3 roles and map them to the account correctly. I will paste just the mappings part of the ent in accountParams with updated information but we are still getting nothing:

{
"acctEntMappings": {
"Roles": {
"listPath": "roles",
"idPath": "roles",
"keyField": "entitlementID",
"importAsEntitlement": true,
"colsToPropsMap": {
"entitlement_value": "name~#~char",
"entitlementID": "id~#~char",
"displayname": "name~#~char"
}
}
}
}

{
"accountParams": {
"connection": "acctAuth",
"processingType": "SequentialAndIterative",
"statusAndThresholdConfig": {
"statusColumn": "customproperty21",
"activeStatus": [
"1",
"true"
],
"deleteLinks": false,
"accountThresholdValue": 85000,
"correlateInactiveAccounts": true,
"inactivateAccountsNotInFile": true,
},
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 1,
"http": {
"url": "https://${connection.hosturl}/api/users?status=active&offset=23523",
"httpContentType": "application/json",
"httpMethod": "GET",
"httpHeaders": {
"accessToken": "${access_token}",
"Accept": "application/json"
}
},
"listField": "",
"keyField": "accountID",
"statusConfig": {
"active": "true",
"inactive": "false"
},
"colsToPropsMap": {
"accountID": "id~#~char",
"customproperty1": "email~#~char",
"name": "login~#~char",
"status": "active~#~char",
"displayname": "fullname~#~char",

"customproperty2": "firstname~#~char",
"customproperty3": "lastname~#~char",
"customproperty4": "fullname~#~char",
"customproperty5": "call1.message.mention-name~#~char",
"customproperty6": "company~#~char",
"customproperty8": "purchasing-user~#~char",
"customproperty9": "expense-user~#~char",
"customproperty10": "sourcing-user~#~char",
"customproperty11": "inventory-user~#~char",
"customproperty12": "contracts-user~#~char",
"customproperty13": "analytics-user~#~char",
"customproperty14": "created-by.id~#~char",
"customproperty15": "sso-identifier~#~char",
"customproperty16": "employee-number~#~char",
"customproperty20": "manager.login~#~char",
"customproperty21": "active~#~char",
"creator": "created-by.login~#~char",
"customproperty22": "login~#~char",
"customproperty31": "STORE#ACC#ENT#MAPPINGINFO~#~char"
},
"pagination": {
"offset": {
"offsetParam": "offset",
"batchParam": "limit",
"batchSize": 50,
"totalCountPath": 85000
}
}
}
},
"acctEntMappings": {
"User Group": {
"importAsEntitlement": false,
"listPath": "user-groups",
"idPath": "id",
"keyField": "entitlementID"
}
}
},
"entitlementParams": {
"processingType": "SequentialAndIterative",
"entTypes": {
"User Group": {
"entTypeOrder": 0,
"entTypeLabels": {
"customproperty1": "Meta Created"
},
"call": {
"call1": {
"connection": "acctAuth",
"callOrder": 0,
"stageNumber": 1,
"http": {
"httpHeaders": {
"accessToken": "${access_token}",
"Accept": "application/json"
},
"url": "https://${connection.hosturl}/api/user_groups",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char",
"description": "description~#~char"
},
"pagination": {
"offset": {
"offsetParam": "offset",
"batchParam": "limit",
"batchSize": 50,
"totalCountPath": 85000
}
}
}
}
}
}
},
"acctEntParams": {
"processingType": "acctToEntMapping" }
}


Regards,
Rushikesh Vartak
If you find the response useful, kindly consider selecting Accept As Solution and clicking on the kudos button.

markmora
New Contributor III
New Contributor III

I have solved the issue. This Json is working for Importing accounts and entitlements:

{
"accountParams": {
"connection": "acctAuth",
"processingType": "SequentialAndIterative",
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"url": "https://xxxx.coupahost.com/api/users?fields=%5B%22id%22%2C%22email%22%2C%22login%22%2C%22active%22%2...",
"httpContentType": "application/json",
"httpMethod": "GET",
"httpHeaders": {
"Authorization": "${access_token}",
"Accept": "application/json"
}
},
"listField": "",
"keyField": "accountID",
"colsToPropsMap": {
"accountID": "id~#~char",
"name": "login~#~char",
"status": "active~#~char",
"customproperty5": "active~#~char",
"customproperty1": "email~#~char",
"customproperty2": "firstname~#~char",
"customproperty3": "lastname~#~char",
"customproperty4": "mention-name~#~char",
"customproperty7": "active~#~char",
"customproperty14": "created-at~#~char",
"customproperty15": "sso-identifier~#~char",
"customproperty16": "employee-number~#~char",
"customproperty31": "STORE#ACC#ENT#MAPPINGINFO~#~char"
},
"pagination": {
"offset": {
"offsetParam": "offset",
"batchParam": "limit",
"batchSize": 50,
"totalCountPath": 85000
}
}
}
},
"acctEntMappings": {
"Roles": {
"importAsEntitlement": true,
"listPath": "roles",
"idPath": "id",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char",
"customproperty1": "description~#~char"
}
}
}
},
"entitlementParams": {
"connection": "acctAuth",
"processingType": "SequentialAndIterative",
"entTypes": {
"Roles": {}
}
},
"acctEntParams": {
"processingType": "acctToEntMapping"
}
}

great accept solution and close the thread


Regards,
Rushikesh Vartak
If you find the response useful, kindly consider selecting Accept As Solution and clicking on the kudos button.