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

How to change default reconciliation filed from userimport job

sampath18
Regular Contributor II
Regular Contributor II

Hi All,

We are developing solution to import users from Ultipro HR system using OOB SOAP connector. 

But, here we were asked to generate the username for users. Hence the attribute is not mapped with the list of attributes from feed. then we are using generate system username option and assign the same value to username filed. 

However, this is not working as expected, if there is no mapping for username filed in the connection and it is skipping all records saying missing key filed.

Also, In the user import job i have kept reconciliation filed to Employee Id which we are going to get from Ultipro. But in the logs reconciliation filed was still showing as username. How do we change this configuration.

Logs::

KEY FIELD VALUE IS NULL OR EMPTY. SKIPPING RECORD.\n","stream":"stdout","time":"2023-03-20T15:18:59.101583738Z"}"

RECONCILIATIONFIELD= USERNAME\n","stream":"stdout","time":"2023-03-20T15:18:59.278294044Z"}"

 

Thanks
Sampath

12 REPLIES 12

sudeshjaiswal
Saviynt Employee
Saviynt Employee

Hello @sampath18 

In the Global Configuration settings, I suggest you explore the option of utilizing the "Add Register User Rule" feature located under the Identity LifeCycle section.
If possible, could you please try this?
For your reference:
https://docs.saviyntcloud.com/bundle/EIC-Admin-v23x/page/Content/Chapter06-EIC-Configurations/Config...

Thanks

If you find the above response useful, Kindly Mark it as "Accept As Solution".

sampath18
Regular Contributor II
Regular Contributor II

Hi @sudeshjaiswal 

Thanks for the response. I hope that issue i am trying to explain is bit different.

The feed we are getting is not sending username, So i used option to generate system username under user import job, and that calls my system username generation logic present under global configuration and same value is assigned to username. However, the feed is skipping the incoming records as it did not find the username mapping from the HR feed attributes. As per the logs it is looking for the username as key filed which we are not going to get. So how do I overcome this. As I already mentioned, I have kept reconciliation field value to EmployeeID in the job level. But still it did not work.

Thanks
Sampath

sudeshjaiswal
Saviynt Employee
Saviynt Employee

Hello @sampath18 

Can you please share what is the Job Trigger Configuration? How are you setting the reconcilation field, and share the design of generating the system username? If possible can you also share the config file for the import account?

Thank you

If you find the above response useful, Kindly Mark it as "Accept As Solution".

sampath18
Regular Contributor II
Regular Contributor II

Hi Sudesh,

I am using ultipro Soap connector to integrate one of Our HR system for users. from the feed username would not be sent. So i have written following json as per the avilable attributes.

I have used the following job type : User Import via a Connection (UserImportJob)

In the job config i have set generate system username = yes and reconciliation filed = EmployeeID

Please note generate system username has been set in global configuration with Advacne config. It looks like below 

CASE when users.location ='110' THEN Concat("B01",upper(substring(users.firstname,1,1)),upper(substring(users.lastname,1,2))) END###

Above logic is working fine when username filed is mapped with employee Id attribute from the feed. but this is not we wanted to happen here. instead we want make systemusername = username. This would be used further to provision access on endpoints.

All we wanted to achive here is make employee id attribute to be considered as reconciliation field for the feed instead of username attribute. 

Below is json for importing users.

{
"CONNECTION1": "Logon",
"REQUESTXML1": "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ns=\"http://www.ultipro.com/dataservices/bidata/2\"> <soap:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\"><wsa:Action>http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn</wsa:Action></soap:Header> <soap:Body> <ns:LogOn> <ns:logOnRequest> <ns:UserName>\${USERNAME}</ns:UserName> <ns:Password>\${PASSWORD}</ns:Password> <ns:ClientAccessKey>****</ns:ClientAccessKey> <ns:UserAccessKey>*****</ns:UserAccessKey> </ns:logOnRequest> </ns:LogOn> </soap:Body> </soap:Envelope>",
"REQUESTPARAMS1": {
"Content-Type": "application/soap+xml;charset=utf-8"
},
"RESPONSEDATAPATH1": "Body.LogOnResponse.LogOnResult",
"RESPONSEMAPPING1": {
"SERVICEID": "ServiceId",
"CLIENTACCESSKEY": "ClientAccessKey",
"TOKEN": "Token",
"INSTANCEKEY": "InstanceKey"
},
"CONNECTION2": "Logon",
"REQUESTXML2": "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ns=\"http://www.ultipro.com/dataservices/bidata/2\"> <soap:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\"><wsa:Action>http://www.ultipro.com/dataservices/bidata/2/IBIDataService/ExecuteReport</wsa:Action></soap:Header> <soap:Body> <ns:ExecuteReport> <ns:request> <ns:ReportPath>/content/folder[@name='zzzCompany Folders']/folder[@name='The Bridgespan Group, Inc.']/folder[@name='UltiPro']/folder[@name='Restricted Reports for Bain']/report[@name='Active and on Leave Employees_Link via Bain_Saviynt Service Acct']</ns:ReportPath> <ns:ReportParameters> <ns:ReportParameter> <ns:Name>Active and on Leave Employees_Link via Bain_Saviynt Service Acct</ns:Name> </ns:ReportParameter> </ns:ReportParameters> </ns:request> <ns:context> <ns:ServiceId>\${SERVICEID}</ns:ServiceId> <ns:ClientAccessKey>\${CLIENTACCESSKEY}</ns:ClientAccessKey> <ns:Token>\${TOKEN}</ns:Token> <ns:InstanceKey>\${INSTANCEKEY}</ns:InstanceKey> </ns:context> </ns:ExecuteReport> </soap:Body> </soap:Envelope>",
"REQUESTPARAMS2": {
"Content-Type": "application/soap+xml;charset=utf-8"
},
"RESPONSEDATAPATH2": "Body.ExecuteReportResponse.ExecuteReportResult",
"RESPONSEMAPPING2": {
"REPORTKEY": "ReportKey"
},
"CONNECTION3": "Report",
"REQUESTXML3": "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ns=\"http://www.ultipro.com/dataservices/bistream/2\"> <soap:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\"> <ns:ReportKey>\${REPORTKEY}</ns:ReportKey> <wsa:Action>http://www.ultipro.com/dataservices/bistream/2/IBIStreamService/RetrieveReport</wsa:Action></soap:Header> <soap:Body> <ns:RetrieveReportRequest\></ns:RetrieveReportRequest> </soap:Body> </soap:Envelope>",
"REQUESTPARAMS3": {
"Content-Type": "application/soap+xml;charset=utf-8"
},
"RESPONSEDATAPATH3": "Body.StreamReportResponse.ReportStream.DECODEBASE64.data.row",
"USERMAPPING3":
"EMPLOYEEID:value(0),FIRSTNAME:value(1),PREFEREDFIRSTNAME:value(2),LASTNAME:value(3),customproperty12:value(4),EMPLOYEETYPE:value(5),COSTCENTER:value(6),LOCATIONDESC:value(7),JOBCODE:value(8),TITLE:value(9),JOBCODEDESC:value(10),JOB_FUNCTION:value(12),EMAIL:value(13),STARTDATE:value(14)",
"TEMPMAPPING3" : [
"STATUSKEY='1' Where customproperty12 in ('Active', 'Leave of Absence')",
"STATUSKEY='0' Where customproperty12 in ('Terminated') "
],
"CONNECTION4": "Logon",
"REQUESTXML4": "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ns=\"http://www.ultipro.com/dataservices/bidata/2\"> <soap:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\"><wsa:Action>http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOff</wsa:Action></soap:Header> <soap:Body> <ns:LogOff> <ns:context> <ns:ServiceId>${SERVICEID}</ns:ServiceId> <ns:ClientAccessKey>${CLIENTACCESSKEY}</ns:ClientAccessKey> <ns:InstanceKey>${INSTANCEKEY}</ns:InstanceKey> </ns:context> </ns:LogOff> </soap:Body> </soap:Envelope>",
"REQUESTPARAMS4": {
"Content-Type": "application/soap+xml;charset=utf-8"
},
"RESPONSEDATAPATH4": "Body.LogOffResponse.LogOffResult",
"RESPONSEMAPPING4": {
"STATUS": "Status"
}
}

 

 

 

sudeshjaiswal
Saviynt Employee
Saviynt Employee

Hello @sampath18 ,

In tackling this issue, a potential solution is the utilization of the Inline Processor Query.

To learn more about this approach and how it can be implemented, refer to the following resource:
https://docs.saviyntcloud.com/bundle/EIC-Admin-v2022x/page/Content/Chapter03-User-Management/User-Im...

Please let us know if it helps.

Thanks

If you find the above response useful, Kindly Mark it as "Accept As Solution".

sampath18
Regular Contributor II
Regular Contributor II

Hi Sudesh,

I have used inline process query. But are you suggesting here to use in line process query to have generate system username and username logic from "PREPROCESSQUERIES" instead of using generate system username from global config. i currently have below one according my needs but this does not for setting username as systemusername generated can not be set to username attribute as this data not present in newuserdata table.

{
"ADDITIONALTABLES": {
"USERS": "SELECT USERKEY,USERNAME,location,EMPLOYEEID,SYSTEMUSERNAME,customer FROM USERS",
"TATTR": "SELECT attribute1,attribute2,datasetname,attribute3 FROM DATASET_VALUES",
"CUSTOMER": "SELECT customerkey,customername FROM CUSTOMER"
},
"COMPUTEDCOLUMNS": [
"customer",
"username",
"location"
],
"TABLEINDEXES": {
"currentusers":["username","location","EMPLOYEEID"]
},
"PREPROCESSQUERIES": [
"DELETE from NEWUSERDATA where NEWUSERDATA.EMPLOYEEID NOT IN ('200651','200555')",
"UPDATE NEWUSERDATA SET USERNAME = NEWUSERDATA.systemusername",
"UPDATE NEWUSERDATA SET location = (select attribute1 from CURRENTTATTR where datasetname = 'Active_Directory_OUs' and attribute2 = NEWUSERDATA.LOCATIONDESC)",
"UPDATE NEWUSERDATA SET customer = (select currentcustomer.customername from currentcustomer where currentcustomer.customername = '****')"
]
}

sudeshjaiswal
Saviynt Employee
Saviynt Employee

Hello @sampath18 ,

As I Understand you have added the rule under “system username generation”.

 “Add Register Rule” is the first rule which will be triggered when user creations happen. So we suggest you keep the system generation rule in “Add Register Rule” as you want systemusername and username to be the same.

sudeshjaiswal_0-1680077375154.png

 

sudeshjaiswal_1-1680077375159.png

 

And add the mapping of username to systemusername generation rule under this config.
PFA Screenshot below

 

sudeshjaiswal_2-1680077375160.png

 

sudeshjaiswal_3-1680077375163.png

Please let us know if it helps.

Thanks

If you find the above response useful, Kindly Mark it as "Accept As Solution".

sampath18
Regular Contributor II
Regular Contributor II

Hi @sudeshjaiswal 

While importing users into saviynt we have option as set yes or no to generate system username of our choice but not for the username attribute. However, i have tried the way you have mentioned. it still did not work. It was unable to generate username as per logic in the username rule config.

Thanks
Sampath

sampath18
Regular Contributor II
Regular Contributor II

Hi @sudeshjaiswal 

Please find the attached logs which error related to recon filed as username

Thanks
Sampath

sudeshjaiswal
Saviynt Employee
Saviynt Employee

Hello @sampath18 ,

It appears that there may be an issue with the SOAP Connector. Could you please raise a Freshdesk support ticket, similar to the one you raised in the past at "https://saviynt.freshdesk.com/a/tickets/1611807", so that our engineering team can investigate and resolve the issue?

Thanks,

If you find the above response useful, Kindly Mark it as "Accept As Solution".

sampath18
Regular Contributor II
Regular Contributor II

Hi @sudeshjaiswal 

As suggested i have created FD ticket.

https://saviynt.freshdesk.com/support/tickets/1616042

I request you to take look at this ticket to provide quick solution as you were working on this.

Thanks
Sampath

sudeshjaiswal
Saviynt Employee
Saviynt Employee

Hi @sampath18 

Thank you for creating the FD ticket. Our team will work on resolving the issue and will keep you updated on the progress through the FD ticket.

Thanks,

If you find the above response useful, Kindly Mark it as "Accept As Solution".