Click HERE to see how Saviynt Intelligence is transforming the industry. |
01/12/2024 11:52 AM - last edited on 01/31/2024 11:31 PM by Sunil
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]
Solved! Go to Solution.
01/12/2024 01:36 PM
01/16/2024 11:44 AM - edited 01/16/2024 11:45 AM
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"
}
}
}
}
01/16/2024 02:59 PM
{
"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" }
}
01/31/2024 10:36 PM
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"
}
}
02/01/2024 09:51 PM
great accept solution and close the thread