지금 지원 담당자와 채팅
지원 담당자와 채팅

Starling Connect Hosted - One Identity Manager Administration Guide

About this guide One Identity Starling Connect overview One Identity Starling Supported cloud applications Working with connectors Connector versions Salesforce Facebook Workplace SAP Cloud Platform JIRA Server RSA Archer SuccessFactors Amazon S3 AWS ServiceNow Dropbox Crowd Atlassian JIRA Confluence Trello Box Pipedrive SuccessFactors HR NutShell Insightly Egnyte SugarCRM Oracle IDCS Statuspage Zendesk Sell Workbooks DocuSign Citrix ShareFile Zendesk Azure AD Google Workspace Concur Tableau GoToMeeting Coupa AWS Cognito Okta DataDog Hideez Opsgenie Informatica Cloud Services AppDynamics Marketo Workday HR OneLogin PingOne Aha! SAP Litmos HackerRank Slack ActiveCampaign Webex Apigee Databricks Hive PagerDuty Dayforce Smartsheet Pingboard SAP Cloud for Customer Azure Infrastructure Oracle Fusion Cloud Majesco LuccaHR OpenText Appendix: Creating a service account in Google Workspace Appendix: Setting a trial account on Salesforce Registering the application, providing necessary permissions, retrieving Client Id and Client Secret from the Azure AD tenant Generating a private key for service account in GoToMeeting Configuring Amazon S3 AWS connector to support entitlements for User and Group Configuring Box connector to support additional email IDs for users One Identity Manager E2E integration needs for Hideez connector Configuring custom attributes for ServiceNow v.1.0 Configuring custom attributes for Coupa v.1.0 Configuring custom attributes in connectors Disabling attributes Configuring a connector that uses the consent feature Synchronization and integration of Roles object type with One Identity Manager Synchronization and integration of Workspaces object type with One Identity Manager Synchronization and integration of Products object type with One Identity Manager User centric membership Creating multi-valued custom fields in One Identity Manager Synchronization and assignment of PermissionSets to Users with One Identity Manager Connectors that support password attribute in User object Connectors that do not support special characters in the object ID Creating an app for using SCIM on Slack Enterprise Grid Organization Creating a Webex integration application, providing necessary scopes, retrieving Client Id and Client Secret Retrieving the API key from Facebook Workplace Outbound IP addresses Values for customer-specific configuration parameters in Workday HR connector Initiate an OAuth connection to SuccessFactors Creating custom editable/upsertable attributes in Successfactors employee central Custom Foundation Objects in Successfactors HR connector Configuring additional datetime offset in connectors How to Create custom attribute for Users in SuccessFactors portal SAP Cloud for Customer - Steps to add custom fields at One Identity Manager attributes Creating Service Principal to authenticate the Azure resource management REST APIs for Azure Infrastructure connector

Mappings

Dayforce is an HCM software platform that helps in data unification across each phase of employee lifecycle enabling better reasoning and decision-making. It offers a vantage point view and control from a single platform covering benefits, HR, payroll, workforce and talent management.

Supervisor configuration parameters

To configure the connector, following parameters are required:

  • Connector name
  • Username for the cloud account

  • Password for the cloud account
  • Target URL (Format:- https://{instance_name}.dayforcehcm.com/Api/{clientNamespace}/V1)

  • Request Delay (in ms)

  • Instance DateTime Offset (refer Configuring additional datetime offset in connectors for more details)

 

NOTE:

  • To handle the Dayforce rate limit issue, the Dayforce connector has been enabled with user configurable delay in milliseconds so that the each request to the target API would wait for the specific amount of time to help the connector to prevent the throttling of the Dayforce APIs. The default value for the configuration is 500 (milliseconds) and it would be advisable to keep the value below 2000 (milliseconds).

  • The connector has been tested against Service Versions 59 and 60 of the Dayforce instance.

Supported objects and operations

Employees

Table 321: Supported operations for Employees

Operation

VERB

Get Employee Details GET

Get all employees

GET

Update employee

PUT

Departments

Table 322: Supported operations for Departments

Operation

VERB

Get departments

GET

Get department by id

GET

Locations

Table 323: Supported operations for Locations

Operation

VERB

Get all locations

GET

Get location by id

GET

Organizations

Table 324: Supported operations for Organizations
Get all organizations GET

Ger Organization Details

GET

The mappings are listed in the tables below.

Table 325: Dayforce Employee to SCIM Employee mapping
Dayforce properties SCIM properties
XRefCode id
LoginId userName
FederatedId federatedId
Gender gender
BirthDate birthDate
EmployeeNumber employeeNumber
CommonName commonName
DisplayName displayName
LastName name.familyName
FirstName name.givenName

MiddleName

name.middleName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.longName

Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "BusinessEmail") emails.businessEmail
Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "PersonalEmail") emails.personalEmail
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "BusinessPhone") phoneNumbers.businessPhone
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "Mobile") phoneNumbers.cellPhone
Addresses.Items[].Address1 address.streetAddress
Addresses.Items[].City address.locality
Addresses.Items[].State.Name address.region
Addresses.Items[].PostalCode address.postalCode
Addresses.Items[].Country.Name address.country
LoginId loginId
HireDate hireDate
NewHireApprovalDate newHireApprovalDate
NewHireApproved newHireApproved
NewHireApprovedBy newHireApprovedBy
OriginalHireDate originalHireDate
SeniorityDate seniorityDate
StartDate startDate
PhotoExempt photoExempt

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.longName

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.value

RegisteredDisabled registeredDisabled
RequiresExitInterview requiresExitInterview
SocialSecurityNumber socialSecurityNumber
TaxExempt taxExempt
EmployeeBadge.BadgeNumber employeeBadge.badgeNumber
EmployeeBadge.EffectiveStart employeeBadge.effectiveStart
EmployeeBadge.EffectiveEnd employeeBadge.effectiveEnd
EmployeeManagers.Items[].ManagerXRefCode employeeManager.value
EmployeeManagers.Items[].ManagerFirstName EmployeeManagers.Items[].ManagerLastName employeeManager.displayName
Locations.Items[].Location.XRefCode location.value
Locations.Items[].Location.LongName location.displayName
OrgUnitInfos.Items[].Department.XRefCode department.value
OrgUnitInfos.Items[].Department.LongName department.displayName
HomeOrganization.XRefCode homeOrganization.value
HomeOrganization.LongName homeOrganization.displayName
Table 326: Dayforce Department to SCIM Department mapping
Dayforce properties SCIM properties
XRefCode id
ShortName shortName
LongName longName
LastModifiedTimestamp meta.lastModified
Table 327: Dayforce Location to SCIM Locations mapping
Dayforce properties SCIM properties
Address address
AddressLineTwo addressLineTwo
City city
CountryCode countryCode
CountryName countryName
County county
Description description
IsTaxation isTaxation
ShortName shortName
StateProvince stateProvince
StateProvinceCode stateProvinceCode
XRefCode id
ZipPostalCode zipPostalCode
Table 328: Dayforce OrgUnits to SCIM Organizations mapping
Dayforce properties SCIM properties
XRefCode id
PhysicalLocation physicalLocation
OpeningDate openingDate
IsMobileOrg isMobileOrg
ShortName shortName
LongName longName

Filter Resource

Dayforce target APIs supports filtering on employees and hence the Starling Connector for Dayforce has the filter feature implemented in employees endpoint. Below are the details on the supported attributes and operations on filter functionality on the Employee resource on the SCIM connector.

Supported attributes for Dayforce

Table 329: Supported attributes for Dayforce
Attribute Supported Operations
meta.lastModified

gt (greater than)

ge (greater than or equal to)

lt (less than)

le (less than or equal to)

eq (equal to)

hireDate

gt

ge

lt

le

eq

originalHireDate

gt

ge

lt

le

eq

seniorityDate

gt

ge

lt

le

eq

employeeNumber

co (contains)

displayName co
socialSecurityNumber co
homeOrganization.value eq

department.value

eq

More information about Filtering Resource

  • As the Dayforce API support only AND conditions in the request filter criteria, the connector has implemented to support only AND in SCIM filter condition.

  • In the connector filter functionality any invalid or non-supported filter criteria will be ignored in the filter. If no valid criteria found then normal LIST employees will be carried out.

  • When 'meta.lastModified' is used with 'lt' | 'le' as the filter criteria then the target APIs demands filter condition on 'meta.lastModified' with 'gt' | 'ge' | 'eq' since a date range is expected by the target APIs. When 'meta.lastModified' is applied with 'gt' | 'ge' | 'eq' but no 'meta.lastModified' with 'lt' | 'le' criteria is provided, then the current date time will be used within the connector logic to acomplish the date range requirement.

  • The filter functionality looks generously for the filter condition and values instead of performing a greedy and strict match. For example: the 'meta.lastModified' with below are some of the valid formats:

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx

    filter=meta.lastModified gt xxxx-xx-xx xx:xx:xx

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx.xxx

    filter=meta.lastModified gt "xxxx-xx-xxTxx:xx:xx"

    filter=meta.lastModified gt xxxx-xx-xx xx:xx:xxZ

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx.xxxZ

    filter=meta.lastModified gt 'xxxx-xx-xxTxx:xx:xx'

For more information about Filter Resource, see Documentation of filtering on Dayforce endpoints.

Connector SCIM Configuration

The Dayforce connector supports configuring custom attributes for Employee object type. Supported data types are integer, decimal, string, datetime, boolean and binary.

NOTE:

  • The custom attributes are available under the "EmployeeProperties" attribute in Dayforce Employee schema. If the necessary permissions are not provided on the Dayforce instance to let "EmployeeProperties" attribute be retrivable along with the GET Employee details request, then the connector makes an extra request to retrieve the "EmployeeProperties" alone which would introduce additional delay in completing the Identity Manager synchronization.
  • The complex type of EmployeeProperties would not be processed in the Dayforce Connect.
  • The "OptionValue" EmployeeProperties would be considered as string and if multiple occurrences of such values are there then the individual values would be combined using a delimiter "$$". For example: "Option Value 1$$ Option Value 2".

  • While configuring custom attribute in Starling Connect Portal the attribute name to be used would be like "EmployeePropertyXrefCodeXXX" which would be available under the "EmployeeProperty". Refer the sample date for "EmployeeProperties" (custom attributes) below:

Request: GET {instance_base_url}/Employees/{employee_XRefCode}/EmployeeProperties

{

"Data":

[

{

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode1",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"StringValue": "String_Value"

}

]

}

Request: GET {instance_base_url}/Employees/{employee_XRefCode}?expand=Addresses,Contacts,EmployeeManagers,Locations,OrgUnitInfos,EmployeeProperties,EmploymentStatuses,WorkAssignments

{

"Data":

{

.....,

.....,

"EmployeeProperties":

{

"Items":

[

{

"EffectiveStart": "2000-01-01T00:00:00",

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode1",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"NumberValue": 11

},

{

"EffectiveStart": "2000-01-01T00:00:00",

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode2",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"StringValue": "String_Value"

}

]

},

.....,

.....

}

}

One IM Configuration for Delta Synchronization

Modifying the FullProjection process

  1. In Designer, locate the 'DPR_DPRProjectionStartInfo_Run_Synchronization' process click to edit it. Under 'Pre-script for generating' add the script as mentioned below:

    'Starling Delta Sync Handling (search sync project variables with their names staring with dprRevisionDate and put the corresponding revision data value in)

    Dim f = session.SqlFormatter

    Dim nameSchema as String

    Dim nameVariable as String

    Dim variableValue as String

    values("OverrideVariables") = ""

     

    'search project variables dprRevisionDate*

    Dim qVariables = Query _

    .From("DPRSystemVariable") _

    .Orderby("UID_DPRSystemVariable") _

    .Where( f.AndRelation( _

    f.Comparison("Name", "dprRevisionDate%", ValType.String, CompareOperator.Like, FormatterOptions.IgnoreCase), _

    f.UidComparison("UID_DPRSystemVariableSet", $UID_DPRSystemVariableSet$, CompareOperator.Equal))) _

    .Select("Name")

    Dim colVariables = Session.Source.GetCollection(qVariables)

     

    If colVariables.Count > 0 then

    'fetching revision data from last synchronization of that sync project configuration

    Dim qRevStore = Query _

    .From("DPRRevisionStore") _

    .Where( f.AndRelation( _

    f.UidComparison("UID_DPRProjectionConfig", $UID_DPRProjectionConfig$, CompareOperator.Equal), _

    f.UidComparison("UID_DPRSystemVariableSet", $UID_DPRSystemVariableSet$, CompareOperator.Equal))) _

    .Select("Value", "SchemaTypeKey")

     

    Dim colRevStore = Session.Source.GetCollection(qRevStore)

    Dim dictRevStore = new System.Collections.Generic.Dictionary(of String, String)()

     

    For Each elemRevStore As IEntity In colRevStore

    nameSchema = elemRevStore.GetValue("SchemaTypeKey").String 'Schema[FTP#C04A6567-9EAE-4121-973E-AF1EE514D728].Type[Employees]

    If string.IsNullOrEmpty(nameSchema) OrElse not nameSchema.Contains(".") then

    Continue For

    End If

    nameSchema = nameSchema.Split("."c)(1)

     

    dictRevStore.Add(nameSchema, elemRevStore.GetValue("Value").String)

    Next

     

    'put the revision date into the variables if available, else provide the revision data as 1900-01-01

    Dim lstVariables = new System.Collections.Generic.List(of String)()

    For Each elemVariable As IEntity In colVariables

    nameVariable = elemVariable.GetValue("Name").String 'e.g. dprRevisionDateEmployees

    nameSchema = string.Format("Type[{0}]", nameVariable.Trim().Substring(15)) 'e.g. Type[Employees]

     

    If dictRevStore.TryGetValue(nameSchema, variableValue) then

    values(nameVariable) = variableValue.Replace(" ", "T")

    Else

    values(nameVariable) = "1900-01-01"

    End If

    lstVariables.Add(nameVariable)

    Next

    values("OverrideVariables") = string.Join(";", lstVariables.ToArray())

    End If

  2. Under 'Run Synchronization' select 'Parameters' tab and provide the below script under 'OverrideVariables'.

    If not String.IsNullOrEmpty(values("OverrideVariables").ToString()) then

    Imports System.Data.Common

    Dim sb as DbConnectionStringBuilder = new DbConnectionStringBuilder(false)

    For each varName as String in values("OverrideVariables").ToString().Split(";"c)

    sb.Add(varName, values(varName).ToString())

    Next

    Value = sb.ConnectionString

    End if

  3. 'Commit to database' and then 'Compile database'.

Modifying the synchronization project

  1. Make sure that the local cache is turned off for the Synchronization project.

  2. Select the SCIM synchronization project and select 'Variables' to add a new variable 'dprRevisionDateEmployees' (the variable name should be dprRevisionDate<schema name>).

  3. Create a new 'Schema Class' from Employee in the 'Target system'. For example: "Employees for Delta Sync".

  4. On the Schema Class set the System Filter: meta.LastModified gt $dprRevisionDateEmployees$. Under 'Select Objects' tab, use 'meta_lastModified' as the attribute, '>' as the operator and $dprRevisionDateEmployees$ as the text field value.

  5. As required, other supported attributes also can be added under filters.

  6. Create a new Mapping using the new Schema Class dialog box.

  7. Create a new Workflow using the new mapping. This workflow updates the existing records based on the revision filter.

  8. To improve the syncs performance, remove the update steps from the existing default Initial sync Work Flow.

  9. Create a new Startup Config using the new workflow. Select 'One Identity Manager' for the 'Synchronization in direction'. Use 'default variable set' for the 'Variable Set'.

  10. Use hotfix #33601 for One Identity Manager version 8.1.2 and 8.1.4.

Connector limitations

  • Pagination is not supported for Employees, Departments, LocationAddresses and OrgUnits resources.
  • List response for Employees, Departments and OrgUnits return only xRefCode (ID).

  • Meta attributes are not retrieved for Employees, Departments, LocationAddresses and OrgUnits resources.

  • In absence of necessary access rights for the employee attributes EmployeeProperties and OrgUnitInfos at the Dayforce target instance, the Dayforce connector would need to make additional requests to retrieve these attributes which impact the Identity Manager synchronization performance.

  • Dayforce generally applies rate limiting to the API requests. If a request exceeds the defined rate limit, the request is rejected with the HTTP status 429 - Quota exceeded for number of requests response.

Filter Resource

Dayforce is an HCM software platform that helps in data unification across each phase of employee lifecycle enabling better reasoning and decision-making. It offers a vantage point view and control from a single platform covering benefits, HR, payroll, workforce and talent management.

Supervisor configuration parameters

To configure the connector, following parameters are required:

  • Connector name
  • Username for the cloud account

  • Password for the cloud account
  • Target URL (Format:- https://{instance_name}.dayforcehcm.com/Api/{clientNamespace}/V1)

  • Request Delay (in ms)

  • Instance DateTime Offset (refer Configuring additional datetime offset in connectors for more details)

 

NOTE:

  • To handle the Dayforce rate limit issue, the Dayforce connector has been enabled with user configurable delay in milliseconds so that the each request to the target API would wait for the specific amount of time to help the connector to prevent the throttling of the Dayforce APIs. The default value for the configuration is 500 (milliseconds) and it would be advisable to keep the value below 2000 (milliseconds).

  • The connector has been tested against Service Versions 59 and 60 of the Dayforce instance.

Supported objects and operations

Employees

Table 321: Supported operations for Employees

Operation

VERB

Get Employee Details GET

Get all employees

GET

Update employee

PUT

Departments

Table 322: Supported operations for Departments

Operation

VERB

Get departments

GET

Get department by id

GET

Locations

Table 323: Supported operations for Locations

Operation

VERB

Get all locations

GET

Get location by id

GET

Organizations

Table 324: Supported operations for Organizations
Get all organizations GET

Ger Organization Details

GET

Mappings

The mappings are listed in the tables below.

Table 325: Dayforce Employee to SCIM Employee mapping
Dayforce properties SCIM properties
XRefCode id
LoginId userName
FederatedId federatedId
Gender gender
BirthDate birthDate
EmployeeNumber employeeNumber
CommonName commonName
DisplayName displayName
LastName name.familyName
FirstName name.givenName

MiddleName

name.middleName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.longName

Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "BusinessEmail") emails.businessEmail
Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "PersonalEmail") emails.personalEmail
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "BusinessPhone") phoneNumbers.businessPhone
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "Mobile") phoneNumbers.cellPhone
Addresses.Items[].Address1 address.streetAddress
Addresses.Items[].City address.locality
Addresses.Items[].State.Name address.region
Addresses.Items[].PostalCode address.postalCode
Addresses.Items[].Country.Name address.country
LoginId loginId
HireDate hireDate
NewHireApprovalDate newHireApprovalDate
NewHireApproved newHireApproved
NewHireApprovedBy newHireApprovedBy
OriginalHireDate originalHireDate
SeniorityDate seniorityDate
StartDate startDate
PhotoExempt photoExempt

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.longName

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.value

RegisteredDisabled registeredDisabled
RequiresExitInterview requiresExitInterview
SocialSecurityNumber socialSecurityNumber
TaxExempt taxExempt
EmployeeBadge.BadgeNumber employeeBadge.badgeNumber
EmployeeBadge.EffectiveStart employeeBadge.effectiveStart
EmployeeBadge.EffectiveEnd employeeBadge.effectiveEnd
EmployeeManagers.Items[].ManagerXRefCode employeeManager.value
EmployeeManagers.Items[].ManagerFirstName EmployeeManagers.Items[].ManagerLastName employeeManager.displayName
Locations.Items[].Location.XRefCode location.value
Locations.Items[].Location.LongName location.displayName
OrgUnitInfos.Items[].Department.XRefCode department.value
OrgUnitInfos.Items[].Department.LongName department.displayName
HomeOrganization.XRefCode homeOrganization.value
HomeOrganization.LongName homeOrganization.displayName
Table 326: Dayforce Department to SCIM Department mapping
Dayforce properties SCIM properties
XRefCode id
ShortName shortName
LongName longName
LastModifiedTimestamp meta.lastModified
Table 327: Dayforce Location to SCIM Locations mapping
Dayforce properties SCIM properties
Address address
AddressLineTwo addressLineTwo
City city
CountryCode countryCode
CountryName countryName
County county
Description description
IsTaxation isTaxation
ShortName shortName
StateProvince stateProvince
StateProvinceCode stateProvinceCode
XRefCode id
ZipPostalCode zipPostalCode
Table 328: Dayforce OrgUnits to SCIM Organizations mapping
Dayforce properties SCIM properties
XRefCode id
PhysicalLocation physicalLocation
OpeningDate openingDate
IsMobileOrg isMobileOrg
ShortName shortName
LongName longName

Dayforce target APIs supports filtering on employees and hence the Starling Connector for Dayforce has the filter feature implemented in employees endpoint. Below are the details on the supported attributes and operations on filter functionality on the Employee resource on the SCIM connector.

Supported attributes for Dayforce

Table 329: Supported attributes for Dayforce
Attribute Supported Operations
meta.lastModified

gt (greater than)

ge (greater than or equal to)

lt (less than)

le (less than or equal to)

eq (equal to)

hireDate

gt

ge

lt

le

eq

originalHireDate

gt

ge

lt

le

eq

seniorityDate

gt

ge

lt

le

eq

employeeNumber

co (contains)

displayName co
socialSecurityNumber co
homeOrganization.value eq

department.value

eq

More information about Filtering Resource

  • As the Dayforce API support only AND conditions in the request filter criteria, the connector has implemented to support only AND in SCIM filter condition.

  • In the connector filter functionality any invalid or non-supported filter criteria will be ignored in the filter. If no valid criteria found then normal LIST employees will be carried out.

  • When 'meta.lastModified' is used with 'lt' | 'le' as the filter criteria then the target APIs demands filter condition on 'meta.lastModified' with 'gt' | 'ge' | 'eq' since a date range is expected by the target APIs. When 'meta.lastModified' is applied with 'gt' | 'ge' | 'eq' but no 'meta.lastModified' with 'lt' | 'le' criteria is provided, then the current date time will be used within the connector logic to acomplish the date range requirement.

  • The filter functionality looks generously for the filter condition and values instead of performing a greedy and strict match. For example: the 'meta.lastModified' with below are some of the valid formats:

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx

    filter=meta.lastModified gt xxxx-xx-xx xx:xx:xx

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx.xxx

    filter=meta.lastModified gt "xxxx-xx-xxTxx:xx:xx"

    filter=meta.lastModified gt xxxx-xx-xx xx:xx:xxZ

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx.xxxZ

    filter=meta.lastModified gt 'xxxx-xx-xxTxx:xx:xx'

For more information about Filter Resource, see Documentation of filtering on Dayforce endpoints.

Connector SCIM Configuration

The Dayforce connector supports configuring custom attributes for Employee object type. Supported data types are integer, decimal, string, datetime, boolean and binary.

NOTE:

  • The custom attributes are available under the "EmployeeProperties" attribute in Dayforce Employee schema. If the necessary permissions are not provided on the Dayforce instance to let "EmployeeProperties" attribute be retrivable along with the GET Employee details request, then the connector makes an extra request to retrieve the "EmployeeProperties" alone which would introduce additional delay in completing the Identity Manager synchronization.
  • The complex type of EmployeeProperties would not be processed in the Dayforce Connect.
  • The "OptionValue" EmployeeProperties would be considered as string and if multiple occurrences of such values are there then the individual values would be combined using a delimiter "$$". For example: "Option Value 1$$ Option Value 2".

  • While configuring custom attribute in Starling Connect Portal the attribute name to be used would be like "EmployeePropertyXrefCodeXXX" which would be available under the "EmployeeProperty". Refer the sample date for "EmployeeProperties" (custom attributes) below:

Request: GET {instance_base_url}/Employees/{employee_XRefCode}/EmployeeProperties

{

"Data":

[

{

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode1",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"StringValue": "String_Value"

}

]

}

Request: GET {instance_base_url}/Employees/{employee_XRefCode}?expand=Addresses,Contacts,EmployeeManagers,Locations,OrgUnitInfos,EmployeeProperties,EmploymentStatuses,WorkAssignments

{

"Data":

{

.....,

.....,

"EmployeeProperties":

{

"Items":

[

{

"EffectiveStart": "2000-01-01T00:00:00",

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode1",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"NumberValue": 11

},

{

"EffectiveStart": "2000-01-01T00:00:00",

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode2",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"StringValue": "String_Value"

}

]

},

.....,

.....

}

}

One IM Configuration for Delta Synchronization

Modifying the FullProjection process

  1. In Designer, locate the 'DPR_DPRProjectionStartInfo_Run_Synchronization' process click to edit it. Under 'Pre-script for generating' add the script as mentioned below:

    'Starling Delta Sync Handling (search sync project variables with their names staring with dprRevisionDate and put the corresponding revision data value in)

    Dim f = session.SqlFormatter

    Dim nameSchema as String

    Dim nameVariable as String

    Dim variableValue as String

    values("OverrideVariables") = ""

     

    'search project variables dprRevisionDate*

    Dim qVariables = Query _

    .From("DPRSystemVariable") _

    .Orderby("UID_DPRSystemVariable") _

    .Where( f.AndRelation( _

    f.Comparison("Name", "dprRevisionDate%", ValType.String, CompareOperator.Like, FormatterOptions.IgnoreCase), _

    f.UidComparison("UID_DPRSystemVariableSet", $UID_DPRSystemVariableSet$, CompareOperator.Equal))) _

    .Select("Name")

    Dim colVariables = Session.Source.GetCollection(qVariables)

     

    If colVariables.Count > 0 then

    'fetching revision data from last synchronization of that sync project configuration

    Dim qRevStore = Query _

    .From("DPRRevisionStore") _

    .Where( f.AndRelation( _

    f.UidComparison("UID_DPRProjectionConfig", $UID_DPRProjectionConfig$, CompareOperator.Equal), _

    f.UidComparison("UID_DPRSystemVariableSet", $UID_DPRSystemVariableSet$, CompareOperator.Equal))) _

    .Select("Value", "SchemaTypeKey")

     

    Dim colRevStore = Session.Source.GetCollection(qRevStore)

    Dim dictRevStore = new System.Collections.Generic.Dictionary(of String, String)()

     

    For Each elemRevStore As IEntity In colRevStore

    nameSchema = elemRevStore.GetValue("SchemaTypeKey").String 'Schema[FTP#C04A6567-9EAE-4121-973E-AF1EE514D728].Type[Employees]

    If string.IsNullOrEmpty(nameSchema) OrElse not nameSchema.Contains(".") then

    Continue For

    End If

    nameSchema = nameSchema.Split("."c)(1)

     

    dictRevStore.Add(nameSchema, elemRevStore.GetValue("Value").String)

    Next

     

    'put the revision date into the variables if available, else provide the revision data as 1900-01-01

    Dim lstVariables = new System.Collections.Generic.List(of String)()

    For Each elemVariable As IEntity In colVariables

    nameVariable = elemVariable.GetValue("Name").String 'e.g. dprRevisionDateEmployees

    nameSchema = string.Format("Type[{0}]", nameVariable.Trim().Substring(15)) 'e.g. Type[Employees]

     

    If dictRevStore.TryGetValue(nameSchema, variableValue) then

    values(nameVariable) = variableValue.Replace(" ", "T")

    Else

    values(nameVariable) = "1900-01-01"

    End If

    lstVariables.Add(nameVariable)

    Next

    values("OverrideVariables") = string.Join(";", lstVariables.ToArray())

    End If

  2. Under 'Run Synchronization' select 'Parameters' tab and provide the below script under 'OverrideVariables'.

    If not String.IsNullOrEmpty(values("OverrideVariables").ToString()) then

    Imports System.Data.Common

    Dim sb as DbConnectionStringBuilder = new DbConnectionStringBuilder(false)

    For each varName as String in values("OverrideVariables").ToString().Split(";"c)

    sb.Add(varName, values(varName).ToString())

    Next

    Value = sb.ConnectionString

    End if

  3. 'Commit to database' and then 'Compile database'.

Modifying the synchronization project

  1. Make sure that the local cache is turned off for the Synchronization project.

  2. Select the SCIM synchronization project and select 'Variables' to add a new variable 'dprRevisionDateEmployees' (the variable name should be dprRevisionDate<schema name>).

  3. Create a new 'Schema Class' from Employee in the 'Target system'. For example: "Employees for Delta Sync".

  4. On the Schema Class set the System Filter: meta.LastModified gt $dprRevisionDateEmployees$. Under 'Select Objects' tab, use 'meta_lastModified' as the attribute, '>' as the operator and $dprRevisionDateEmployees$ as the text field value.

  5. As required, other supported attributes also can be added under filters.

  6. Create a new Mapping using the new Schema Class dialog box.

  7. Create a new Workflow using the new mapping. This workflow updates the existing records based on the revision filter.

  8. To improve the syncs performance, remove the update steps from the existing default Initial sync Work Flow.

  9. Create a new Startup Config using the new workflow. Select 'One Identity Manager' for the 'Synchronization in direction'. Use 'default variable set' for the 'Variable Set'.

  10. Use hotfix #33601 for One Identity Manager version 8.1.2 and 8.1.4.

Connector limitations

  • Pagination is not supported for Employees, Departments, LocationAddresses and OrgUnits resources.
  • List response for Employees, Departments and OrgUnits return only xRefCode (ID).

  • Meta attributes are not retrieved for Employees, Departments, LocationAddresses and OrgUnits resources.

  • In absence of necessary access rights for the employee attributes EmployeeProperties and OrgUnitInfos at the Dayforce target instance, the Dayforce connector would need to make additional requests to retrieve these attributes which impact the Identity Manager synchronization performance.

  • Dayforce generally applies rate limiting to the API requests. If a request exceeds the defined rate limit, the request is rejected with the HTTP status 429 - Quota exceeded for number of requests response.

Connector SCIM Configuration

Dayforce is an HCM software platform that helps in data unification across each phase of employee lifecycle enabling better reasoning and decision-making. It offers a vantage point view and control from a single platform covering benefits, HR, payroll, workforce and talent management.

Supervisor configuration parameters

To configure the connector, following parameters are required:

  • Connector name
  • Username for the cloud account

  • Password for the cloud account
  • Target URL (Format:- https://{instance_name}.dayforcehcm.com/Api/{clientNamespace}/V1)

  • Request Delay (in ms)

  • Instance DateTime Offset (refer Configuring additional datetime offset in connectors for more details)

 

NOTE:

  • To handle the Dayforce rate limit issue, the Dayforce connector has been enabled with user configurable delay in milliseconds so that the each request to the target API would wait for the specific amount of time to help the connector to prevent the throttling of the Dayforce APIs. The default value for the configuration is 500 (milliseconds) and it would be advisable to keep the value below 2000 (milliseconds).

  • The connector has been tested against Service Versions 59 and 60 of the Dayforce instance.

Supported objects and operations

Employees

Table 321: Supported operations for Employees

Operation

VERB

Get Employee Details GET

Get all employees

GET

Update employee

PUT

Departments

Table 322: Supported operations for Departments

Operation

VERB

Get departments

GET

Get department by id

GET

Locations

Table 323: Supported operations for Locations

Operation

VERB

Get all locations

GET

Get location by id

GET

Organizations

Table 324: Supported operations for Organizations
Get all organizations GET

Ger Organization Details

GET

Mappings

The mappings are listed in the tables below.

Table 325: Dayforce Employee to SCIM Employee mapping
Dayforce properties SCIM properties
XRefCode id
LoginId userName
FederatedId federatedId
Gender gender
BirthDate birthDate
EmployeeNumber employeeNumber
CommonName commonName
DisplayName displayName
LastName name.familyName
FirstName name.givenName

MiddleName

name.middleName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.longName

Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "BusinessEmail") emails.businessEmail
Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "PersonalEmail") emails.personalEmail
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "BusinessPhone") phoneNumbers.businessPhone
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "Mobile") phoneNumbers.cellPhone
Addresses.Items[].Address1 address.streetAddress
Addresses.Items[].City address.locality
Addresses.Items[].State.Name address.region
Addresses.Items[].PostalCode address.postalCode
Addresses.Items[].Country.Name address.country
LoginId loginId
HireDate hireDate
NewHireApprovalDate newHireApprovalDate
NewHireApproved newHireApproved
NewHireApprovedBy newHireApprovedBy
OriginalHireDate originalHireDate
SeniorityDate seniorityDate
StartDate startDate
PhotoExempt photoExempt

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.longName

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.value

RegisteredDisabled registeredDisabled
RequiresExitInterview requiresExitInterview
SocialSecurityNumber socialSecurityNumber
TaxExempt taxExempt
EmployeeBadge.BadgeNumber employeeBadge.badgeNumber
EmployeeBadge.EffectiveStart employeeBadge.effectiveStart
EmployeeBadge.EffectiveEnd employeeBadge.effectiveEnd
EmployeeManagers.Items[].ManagerXRefCode employeeManager.value
EmployeeManagers.Items[].ManagerFirstName EmployeeManagers.Items[].ManagerLastName employeeManager.displayName
Locations.Items[].Location.XRefCode location.value
Locations.Items[].Location.LongName location.displayName
OrgUnitInfos.Items[].Department.XRefCode department.value
OrgUnitInfos.Items[].Department.LongName department.displayName
HomeOrganization.XRefCode homeOrganization.value
HomeOrganization.LongName homeOrganization.displayName
Table 326: Dayforce Department to SCIM Department mapping
Dayforce properties SCIM properties
XRefCode id
ShortName shortName
LongName longName
LastModifiedTimestamp meta.lastModified
Table 327: Dayforce Location to SCIM Locations mapping
Dayforce properties SCIM properties
Address address
AddressLineTwo addressLineTwo
City city
CountryCode countryCode
CountryName countryName
County county
Description description
IsTaxation isTaxation
ShortName shortName
StateProvince stateProvince
StateProvinceCode stateProvinceCode
XRefCode id
ZipPostalCode zipPostalCode
Table 328: Dayforce OrgUnits to SCIM Organizations mapping
Dayforce properties SCIM properties
XRefCode id
PhysicalLocation physicalLocation
OpeningDate openingDate
IsMobileOrg isMobileOrg
ShortName shortName
LongName longName

Filter Resource

Dayforce target APIs supports filtering on employees and hence the Starling Connector for Dayforce has the filter feature implemented in employees endpoint. Below are the details on the supported attributes and operations on filter functionality on the Employee resource on the SCIM connector.

Supported attributes for Dayforce

Table 329: Supported attributes for Dayforce
Attribute Supported Operations
meta.lastModified

gt (greater than)

ge (greater than or equal to)

lt (less than)

le (less than or equal to)

eq (equal to)

hireDate

gt

ge

lt

le

eq

originalHireDate

gt

ge

lt

le

eq

seniorityDate

gt

ge

lt

le

eq

employeeNumber

co (contains)

displayName co
socialSecurityNumber co
homeOrganization.value eq

department.value

eq

More information about Filtering Resource

  • As the Dayforce API support only AND conditions in the request filter criteria, the connector has implemented to support only AND in SCIM filter condition.

  • In the connector filter functionality any invalid or non-supported filter criteria will be ignored in the filter. If no valid criteria found then normal LIST employees will be carried out.

  • When 'meta.lastModified' is used with 'lt' | 'le' as the filter criteria then the target APIs demands filter condition on 'meta.lastModified' with 'gt' | 'ge' | 'eq' since a date range is expected by the target APIs. When 'meta.lastModified' is applied with 'gt' | 'ge' | 'eq' but no 'meta.lastModified' with 'lt' | 'le' criteria is provided, then the current date time will be used within the connector logic to acomplish the date range requirement.

  • The filter functionality looks generously for the filter condition and values instead of performing a greedy and strict match. For example: the 'meta.lastModified' with below are some of the valid formats:

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx

    filter=meta.lastModified gt xxxx-xx-xx xx:xx:xx

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx.xxx

    filter=meta.lastModified gt "xxxx-xx-xxTxx:xx:xx"

    filter=meta.lastModified gt xxxx-xx-xx xx:xx:xxZ

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx.xxxZ

    filter=meta.lastModified gt 'xxxx-xx-xxTxx:xx:xx'

For more information about Filter Resource, see Documentation of filtering on Dayforce endpoints.

Connector SCIM Configuration

The Dayforce connector supports configuring custom attributes for Employee object type. Supported data types are integer, decimal, string, datetime, boolean and binary.

NOTE:

  • The custom attributes are available under the "EmployeeProperties" attribute in Dayforce Employee schema. If the necessary permissions are not provided on the Dayforce instance to let "EmployeeProperties" attribute be retrivable along with the GET Employee details request, then the connector makes an extra request to retrieve the "EmployeeProperties" alone which would introduce additional delay in completing the Identity Manager synchronization.
  • The complex type of EmployeeProperties would not be processed in the Dayforce Connect.
  • The "OptionValue" EmployeeProperties would be considered as string and if multiple occurrences of such values are there then the individual values would be combined using a delimiter "$$". For example: "Option Value 1$$ Option Value 2".

  • While configuring custom attribute in Starling Connect Portal the attribute name to be used would be like "EmployeePropertyXrefCodeXXX" which would be available under the "EmployeeProperty". Refer the sample date for "EmployeeProperties" (custom attributes) below:

Request: GET {instance_base_url}/Employees/{employee_XRefCode}/EmployeeProperties

{

"Data":

[

{

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode1",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"StringValue": "String_Value"

}

]

}

Request: GET {instance_base_url}/Employees/{employee_XRefCode}?expand=Addresses,Contacts,EmployeeManagers,Locations,OrgUnitInfos,EmployeeProperties,EmploymentStatuses,WorkAssignments

{

"Data":

{

.....,

.....,

"EmployeeProperties":

{

"Items":

[

{

"EffectiveStart": "2000-01-01T00:00:00",

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode1",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"NumberValue": 11

},

{

"EffectiveStart": "2000-01-01T00:00:00",

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode2",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"StringValue": "String_Value"

}

]

},

.....,

.....

}

}

One IM Configuration for Delta Synchronization

Modifying the FullProjection process

  1. In Designer, locate the 'DPR_DPRProjectionStartInfo_Run_Synchronization' process click to edit it. Under 'Pre-script for generating' add the script as mentioned below:

    'Starling Delta Sync Handling (search sync project variables with their names staring with dprRevisionDate and put the corresponding revision data value in)

    Dim f = session.SqlFormatter

    Dim nameSchema as String

    Dim nameVariable as String

    Dim variableValue as String

    values("OverrideVariables") = ""

     

    'search project variables dprRevisionDate*

    Dim qVariables = Query _

    .From("DPRSystemVariable") _

    .Orderby("UID_DPRSystemVariable") _

    .Where( f.AndRelation( _

    f.Comparison("Name", "dprRevisionDate%", ValType.String, CompareOperator.Like, FormatterOptions.IgnoreCase), _

    f.UidComparison("UID_DPRSystemVariableSet", $UID_DPRSystemVariableSet$, CompareOperator.Equal))) _

    .Select("Name")

    Dim colVariables = Session.Source.GetCollection(qVariables)

     

    If colVariables.Count > 0 then

    'fetching revision data from last synchronization of that sync project configuration

    Dim qRevStore = Query _

    .From("DPRRevisionStore") _

    .Where( f.AndRelation( _

    f.UidComparison("UID_DPRProjectionConfig", $UID_DPRProjectionConfig$, CompareOperator.Equal), _

    f.UidComparison("UID_DPRSystemVariableSet", $UID_DPRSystemVariableSet$, CompareOperator.Equal))) _

    .Select("Value", "SchemaTypeKey")

     

    Dim colRevStore = Session.Source.GetCollection(qRevStore)

    Dim dictRevStore = new System.Collections.Generic.Dictionary(of String, String)()

     

    For Each elemRevStore As IEntity In colRevStore

    nameSchema = elemRevStore.GetValue("SchemaTypeKey").String 'Schema[FTP#C04A6567-9EAE-4121-973E-AF1EE514D728].Type[Employees]

    If string.IsNullOrEmpty(nameSchema) OrElse not nameSchema.Contains(".") then

    Continue For

    End If

    nameSchema = nameSchema.Split("."c)(1)

     

    dictRevStore.Add(nameSchema, elemRevStore.GetValue("Value").String)

    Next

     

    'put the revision date into the variables if available, else provide the revision data as 1900-01-01

    Dim lstVariables = new System.Collections.Generic.List(of String)()

    For Each elemVariable As IEntity In colVariables

    nameVariable = elemVariable.GetValue("Name").String 'e.g. dprRevisionDateEmployees

    nameSchema = string.Format("Type[{0}]", nameVariable.Trim().Substring(15)) 'e.g. Type[Employees]

     

    If dictRevStore.TryGetValue(nameSchema, variableValue) then

    values(nameVariable) = variableValue.Replace(" ", "T")

    Else

    values(nameVariable) = "1900-01-01"

    End If

    lstVariables.Add(nameVariable)

    Next

    values("OverrideVariables") = string.Join(";", lstVariables.ToArray())

    End If

  2. Under 'Run Synchronization' select 'Parameters' tab and provide the below script under 'OverrideVariables'.

    If not String.IsNullOrEmpty(values("OverrideVariables").ToString()) then

    Imports System.Data.Common

    Dim sb as DbConnectionStringBuilder = new DbConnectionStringBuilder(false)

    For each varName as String in values("OverrideVariables").ToString().Split(";"c)

    sb.Add(varName, values(varName).ToString())

    Next

    Value = sb.ConnectionString

    End if

  3. 'Commit to database' and then 'Compile database'.

Modifying the synchronization project

  1. Make sure that the local cache is turned off for the Synchronization project.

  2. Select the SCIM synchronization project and select 'Variables' to add a new variable 'dprRevisionDateEmployees' (the variable name should be dprRevisionDate<schema name>).

  3. Create a new 'Schema Class' from Employee in the 'Target system'. For example: "Employees for Delta Sync".

  4. On the Schema Class set the System Filter: meta.LastModified gt $dprRevisionDateEmployees$. Under 'Select Objects' tab, use 'meta_lastModified' as the attribute, '>' as the operator and $dprRevisionDateEmployees$ as the text field value.

  5. As required, other supported attributes also can be added under filters.

  6. Create a new Mapping using the new Schema Class dialog box.

  7. Create a new Workflow using the new mapping. This workflow updates the existing records based on the revision filter.

  8. To improve the syncs performance, remove the update steps from the existing default Initial sync Work Flow.

  9. Create a new Startup Config using the new workflow. Select 'One Identity Manager' for the 'Synchronization in direction'. Use 'default variable set' for the 'Variable Set'.

  10. Use hotfix #33601 for One Identity Manager version 8.1.2 and 8.1.4.

Connector limitations

  • Pagination is not supported for Employees, Departments, LocationAddresses and OrgUnits resources.
  • List response for Employees, Departments and OrgUnits return only xRefCode (ID).

  • Meta attributes are not retrieved for Employees, Departments, LocationAddresses and OrgUnits resources.

  • In absence of necessary access rights for the employee attributes EmployeeProperties and OrgUnitInfos at the Dayforce target instance, the Dayforce connector would need to make additional requests to retrieve these attributes which impact the Identity Manager synchronization performance.

  • Dayforce generally applies rate limiting to the API requests. If a request exceeds the defined rate limit, the request is rejected with the HTTP status 429 - Quota exceeded for number of requests response.

One IM Configuration for Delta Synchronization

Dayforce is an HCM software platform that helps in data unification across each phase of employee lifecycle enabling better reasoning and decision-making. It offers a vantage point view and control from a single platform covering benefits, HR, payroll, workforce and talent management.

Supervisor configuration parameters

To configure the connector, following parameters are required:

  • Connector name
  • Username for the cloud account

  • Password for the cloud account
  • Target URL (Format:- https://{instance_name}.dayforcehcm.com/Api/{clientNamespace}/V1)

  • Request Delay (in ms)

  • Instance DateTime Offset (refer Configuring additional datetime offset in connectors for more details)

 

NOTE:

  • To handle the Dayforce rate limit issue, the Dayforce connector has been enabled with user configurable delay in milliseconds so that the each request to the target API would wait for the specific amount of time to help the connector to prevent the throttling of the Dayforce APIs. The default value for the configuration is 500 (milliseconds) and it would be advisable to keep the value below 2000 (milliseconds).

  • The connector has been tested against Service Versions 59 and 60 of the Dayforce instance.

Supported objects and operations

Employees

Table 321: Supported operations for Employees

Operation

VERB

Get Employee Details GET

Get all employees

GET

Update employee

PUT

Departments

Table 322: Supported operations for Departments

Operation

VERB

Get departments

GET

Get department by id

GET

Locations

Table 323: Supported operations for Locations

Operation

VERB

Get all locations

GET

Get location by id

GET

Organizations

Table 324: Supported operations for Organizations
Get all organizations GET

Ger Organization Details

GET

Mappings

The mappings are listed in the tables below.

Table 325: Dayforce Employee to SCIM Employee mapping
Dayforce properties SCIM properties
XRefCode id
LoginId userName
FederatedId federatedId
Gender gender
BirthDate birthDate
EmployeeNumber employeeNumber
CommonName commonName
DisplayName displayName
LastName name.familyName
FirstName name.givenName

MiddleName

name.middleName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Corp")

corporate.longName

Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "BusinessEmail") emails.businessEmail
Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "PersonalEmail") emails.personalEmail
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "BusinessPhone") phoneNumbers.businessPhone
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "Mobile") phoneNumbers.cellPhone
Addresses.Items[].Address1 address.streetAddress
Addresses.Items[].City address.locality
Addresses.Items[].State.Name address.region
Addresses.Items[].PostalCode address.postalCode
Addresses.Items[].Country.Name address.country
LoginId loginId
HireDate hireDate
NewHireApprovalDate newHireApprovalDate
NewHireApproved newHireApproved
NewHireApprovedBy newHireApprovedBy
OriginalHireDate originalHireDate
SeniorityDate seniorityDate
StartDate startDate
PhotoExempt photoExempt

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Region")

region.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "District")

district.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.value

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "Site")

site.longName

OrgUnitInfos.Items[].OrgUnitDetail.ShortName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.shortName

OrgUnitInfos.Items[].OrgUnitDetail.LongName (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.longName

OrgUnitInfos.Items[].OrgUnitDetail.XRefCode (OrgUnitInfos.Items[].OrgUnitDetail.OrgLevel.XRefCode = "OnSiteDepartment")

onSiteDepartment.value

RegisteredDisabled registeredDisabled
RequiresExitInterview requiresExitInterview
SocialSecurityNumber socialSecurityNumber
TaxExempt taxExempt
EmployeeBadge.BadgeNumber employeeBadge.badgeNumber
EmployeeBadge.EffectiveStart employeeBadge.effectiveStart
EmployeeBadge.EffectiveEnd employeeBadge.effectiveEnd
EmployeeManagers.Items[].ManagerXRefCode employeeManager.value
EmployeeManagers.Items[].ManagerFirstName EmployeeManagers.Items[].ManagerLastName employeeManager.displayName
Locations.Items[].Location.XRefCode location.value
Locations.Items[].Location.LongName location.displayName
OrgUnitInfos.Items[].Department.XRefCode department.value
OrgUnitInfos.Items[].Department.LongName department.displayName
HomeOrganization.XRefCode homeOrganization.value
HomeOrganization.LongName homeOrganization.displayName
Table 326: Dayforce Department to SCIM Department mapping
Dayforce properties SCIM properties
XRefCode id
ShortName shortName
LongName longName
LastModifiedTimestamp meta.lastModified
Table 327: Dayforce Location to SCIM Locations mapping
Dayforce properties SCIM properties
Address address
AddressLineTwo addressLineTwo
City city
CountryCode countryCode
CountryName countryName
County county
Description description
IsTaxation isTaxation
ShortName shortName
StateProvince stateProvince
StateProvinceCode stateProvinceCode
XRefCode id
ZipPostalCode zipPostalCode
Table 328: Dayforce OrgUnits to SCIM Organizations mapping
Dayforce properties SCIM properties
XRefCode id
PhysicalLocation physicalLocation
OpeningDate openingDate
IsMobileOrg isMobileOrg
ShortName shortName
LongName longName

Filter Resource

Dayforce target APIs supports filtering on employees and hence the Starling Connector for Dayforce has the filter feature implemented in employees endpoint. Below are the details on the supported attributes and operations on filter functionality on the Employee resource on the SCIM connector.

Supported attributes for Dayforce

Table 329: Supported attributes for Dayforce
Attribute Supported Operations
meta.lastModified

gt (greater than)

ge (greater than or equal to)

lt (less than)

le (less than or equal to)

eq (equal to)

hireDate

gt

ge

lt

le

eq

originalHireDate

gt

ge

lt

le

eq

seniorityDate

gt

ge

lt

le

eq

employeeNumber

co (contains)

displayName co
socialSecurityNumber co
homeOrganization.value eq

department.value

eq

More information about Filtering Resource

  • As the Dayforce API support only AND conditions in the request filter criteria, the connector has implemented to support only AND in SCIM filter condition.

  • In the connector filter functionality any invalid or non-supported filter criteria will be ignored in the filter. If no valid criteria found then normal LIST employees will be carried out.

  • When 'meta.lastModified' is used with 'lt' | 'le' as the filter criteria then the target APIs demands filter condition on 'meta.lastModified' with 'gt' | 'ge' | 'eq' since a date range is expected by the target APIs. When 'meta.lastModified' is applied with 'gt' | 'ge' | 'eq' but no 'meta.lastModified' with 'lt' | 'le' criteria is provided, then the current date time will be used within the connector logic to acomplish the date range requirement.

  • The filter functionality looks generously for the filter condition and values instead of performing a greedy and strict match. For example: the 'meta.lastModified' with below are some of the valid formats:

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx

    filter=meta.lastModified gt xxxx-xx-xx xx:xx:xx

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx.xxx

    filter=meta.lastModified gt "xxxx-xx-xxTxx:xx:xx"

    filter=meta.lastModified gt xxxx-xx-xx xx:xx:xxZ

    filter=meta.lastModified gt xxxx-xx-xxTxx:xx:xx.xxxZ

    filter=meta.lastModified gt 'xxxx-xx-xxTxx:xx:xx'

For more information about Filter Resource, see Documentation of filtering on Dayforce endpoints.

Connector SCIM Configuration

The Dayforce connector supports configuring custom attributes for Employee object type. Supported data types are integer, decimal, string, datetime, boolean and binary.

NOTE:

  • The custom attributes are available under the "EmployeeProperties" attribute in Dayforce Employee schema. If the necessary permissions are not provided on the Dayforce instance to let "EmployeeProperties" attribute be retrivable along with the GET Employee details request, then the connector makes an extra request to retrieve the "EmployeeProperties" alone which would introduce additional delay in completing the Identity Manager synchronization.
  • The complex type of EmployeeProperties would not be processed in the Dayforce Connect.
  • The "OptionValue" EmployeeProperties would be considered as string and if multiple occurrences of such values are there then the individual values would be combined using a delimiter "$$". For example: "Option Value 1$$ Option Value 2".

  • While configuring custom attribute in Starling Connect Portal the attribute name to be used would be like "EmployeePropertyXrefCodeXXX" which would be available under the "EmployeeProperty". Refer the sample date for "EmployeeProperties" (custom attributes) below:

Request: GET {instance_base_url}/Employees/{employee_XRefCode}/EmployeeProperties

{

"Data":

[

{

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode1",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"StringValue": "String_Value"

}

]

}

Request: GET {instance_base_url}/Employees/{employee_XRefCode}?expand=Addresses,Contacts,EmployeeManagers,Locations,OrgUnitInfos,EmployeeProperties,EmploymentStatuses,WorkAssignments

{

"Data":

{

.....,

.....,

"EmployeeProperties":

{

"Items":

[

{

"EffectiveStart": "2000-01-01T00:00:00",

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode1",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"NumberValue": 11

},

{

"EffectiveStart": "2000-01-01T00:00:00",

"EmployeeProperty":

{

"XRefCode": "EmployeePropertyXrefCode2",

"ShortName": "Short_Name",

"LongName": "Long_Name"

},

"StringValue": "String_Value"

}

]

},

.....,

.....

}

}

One IM Configuration for Delta Synchronization

Modifying the FullProjection process

  1. In Designer, locate the 'DPR_DPRProjectionStartInfo_Run_Synchronization' process click to edit it. Under 'Pre-script for generating' add the script as mentioned below:

    'Starling Delta Sync Handling (search sync project variables with their names staring with dprRevisionDate and put the corresponding revision data value in)

    Dim f = session.SqlFormatter

    Dim nameSchema as String

    Dim nameVariable as String

    Dim variableValue as String

    values("OverrideVariables") = ""

     

    'search project variables dprRevisionDate*

    Dim qVariables = Query _

    .From("DPRSystemVariable") _

    .Orderby("UID_DPRSystemVariable") _

    .Where( f.AndRelation( _

    f.Comparison("Name", "dprRevisionDate%", ValType.String, CompareOperator.Like, FormatterOptions.IgnoreCase), _

    f.UidComparison("UID_DPRSystemVariableSet", $UID_DPRSystemVariableSet$, CompareOperator.Equal))) _

    .Select("Name")

    Dim colVariables = Session.Source.GetCollection(qVariables)

     

    If colVariables.Count > 0 then

    'fetching revision data from last synchronization of that sync project configuration

    Dim qRevStore = Query _

    .From("DPRRevisionStore") _

    .Where( f.AndRelation( _

    f.UidComparison("UID_DPRProjectionConfig", $UID_DPRProjectionConfig$, CompareOperator.Equal), _

    f.UidComparison("UID_DPRSystemVariableSet", $UID_DPRSystemVariableSet$, CompareOperator.Equal))) _

    .Select("Value", "SchemaTypeKey")

     

    Dim colRevStore = Session.Source.GetCollection(qRevStore)

    Dim dictRevStore = new System.Collections.Generic.Dictionary(of String, String)()

     

    For Each elemRevStore As IEntity In colRevStore

    nameSchema = elemRevStore.GetValue("SchemaTypeKey").String 'Schema[FTP#C04A6567-9EAE-4121-973E-AF1EE514D728].Type[Employees]

    If string.IsNullOrEmpty(nameSchema) OrElse not nameSchema.Contains(".") then

    Continue For

    End If

    nameSchema = nameSchema.Split("."c)(1)

     

    dictRevStore.Add(nameSchema, elemRevStore.GetValue("Value").String)

    Next

     

    'put the revision date into the variables if available, else provide the revision data as 1900-01-01

    Dim lstVariables = new System.Collections.Generic.List(of String)()

    For Each elemVariable As IEntity In colVariables

    nameVariable = elemVariable.GetValue("Name").String 'e.g. dprRevisionDateEmployees

    nameSchema = string.Format("Type[{0}]", nameVariable.Trim().Substring(15)) 'e.g. Type[Employees]

     

    If dictRevStore.TryGetValue(nameSchema, variableValue) then

    values(nameVariable) = variableValue.Replace(" ", "T")

    Else

    values(nameVariable) = "1900-01-01"

    End If

    lstVariables.Add(nameVariable)

    Next

    values("OverrideVariables") = string.Join(";", lstVariables.ToArray())

    End If

  2. Under 'Run Synchronization' select 'Parameters' tab and provide the below script under 'OverrideVariables'.

    If not String.IsNullOrEmpty(values("OverrideVariables").ToString()) then

    Imports System.Data.Common

    Dim sb as DbConnectionStringBuilder = new DbConnectionStringBuilder(false)

    For each varName as String in values("OverrideVariables").ToString().Split(";"c)

    sb.Add(varName, values(varName).ToString())

    Next

    Value = sb.ConnectionString

    End if

  3. 'Commit to database' and then 'Compile database'.

Modifying the synchronization project

  1. Make sure that the local cache is turned off for the Synchronization project.

  2. Select the SCIM synchronization project and select 'Variables' to add a new variable 'dprRevisionDateEmployees' (the variable name should be dprRevisionDate<schema name>).

  3. Create a new 'Schema Class' from Employee in the 'Target system'. For example: "Employees for Delta Sync".

  4. On the Schema Class set the System Filter: meta.LastModified gt $dprRevisionDateEmployees$. Under 'Select Objects' tab, use 'meta_lastModified' as the attribute, '>' as the operator and $dprRevisionDateEmployees$ as the text field value.

  5. As required, other supported attributes also can be added under filters.

  6. Create a new Mapping using the new Schema Class dialog box.

  7. Create a new Workflow using the new mapping. This workflow updates the existing records based on the revision filter.

  8. To improve the syncs performance, remove the update steps from the existing default Initial sync Work Flow.

  9. Create a new Startup Config using the new workflow. Select 'One Identity Manager' for the 'Synchronization in direction'. Use 'default variable set' for the 'Variable Set'.

  10. Use hotfix #33601 for One Identity Manager version 8.1.2 and 8.1.4.

Connector limitations

  • Pagination is not supported for Employees, Departments, LocationAddresses and OrgUnits resources.
  • List response for Employees, Departments and OrgUnits return only xRefCode (ID).

  • Meta attributes are not retrieved for Employees, Departments, LocationAddresses and OrgUnits resources.

  • In absence of necessary access rights for the employee attributes EmployeeProperties and OrgUnitInfos at the Dayforce target instance, the Dayforce connector would need to make additional requests to retrieve these attributes which impact the Identity Manager synchronization performance.

  • Dayforce generally applies rate limiting to the API requests. If a request exceeds the defined rate limit, the request is rejected with the HTTP status 429 - Quota exceeded for number of requests response.

관련 문서

The document was helpful.

평가 결과 선택

I easily found the information I needed.

평가 결과 선택