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.
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
Operation |
VERB |
---|---|
Get Employee Details | GET |
Get all employees |
GET |
Update employee |
PUT |
Departments
Operation |
VERB |
---|---|
Get departments |
GET |
Get department by id |
GET |
Locations
Operation |
VERB |
---|---|
Get all locations |
GET |
Get location by id |
GET |
Organizations
Get all organizations | GET |
Ger Organization Details |
GET |
Mappings
The mappings are listed in the tables below.
Dayforce properties | SCIM properties |
---|---|
Addresses.Items[].Address1 | address.streetAddress |
Addresses.Items[].City | address.locality |
Addresses.Items[].Country.Name | address.country |
Addresses.Items[].PostalCode | address.postalCode |
Addresses.Items[].State.Name | address.region |
BirthDate | birthDate |
CommonName | commonName |
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "BusinessPhone") | phoneNumbers.businessPhone |
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "Mobile") | phoneNumbers.cellPhone |
Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "BusinessEmail") | emails.businessEmail |
Contacts.Items[].ElectronicAddress (Contacts.Items[].ContactInformationType.XRefCode = "PersonalEmail") | emails.personalEmail |
DisplayName | displayName |
EmployeeBadge.BadgeNumber | employeeBadge.badgeNumber |
EmployeeBadge.EffectiveEnd | employeeBadge.effectiveEnd |
EmployeeBadge.EffectiveStart | employeeBadge.effectiveStart |
EmployeeManagers.Items[].ManagerFirstName EmployeeManagers.Items[].ManagerLastName | employeeManager.displayName |
EmployeeManagers.Items[].ManagerXRefCode | employeeManager.value |
EmployeeNumber | employeeNumber |
EmploymentStatuses.Items[].EmploymentStatus.EffectiveEnd | employmentStatus.effectiveEnd |
EmploymentStatuses.Items[].EmploymentStatus.EffectiveStart | employmentStatus.effectiveStart |
EmploymentStatuses.Items[].EmploymentStatus.LongName | employmentStatus.longName |
EmploymentStatuses.Items[].EmploymentStatus.ShortName | employmentStatus.shortName |
EmploymentStatuses.Items[].EmploymentStatus.XRefCode | employmentStatus.value |
EmploymentStatuses.Items[].EmploymentStatusGroup.XRefCode |
employmentStatusGroup.value |
EmploymentStatuses.Items[].EmploymentStatusGroup.ShortName |
employmentStatusGroup.shortName |
EmploymentStatuses.Items[].EmploymentStatusGroup.LongName |
employmentStatusGroup.longName |
EmploymentStatuses.Items[].PayGroup.LongName | payGroup.longName |
EmploymentStatuses.Items[].PayGroup.ShortName | payGroup.shortName |
EmploymentStatuses.Items[].PayGroup.XRefCode | payGroup.value |
FederatedId | federatedId |
FirstName | name.givenName |
Gender | gender |
HireDate | hireDate |
HomeOrganization.LongName | homeOrganization.displayName |
HomeOrganization.XRefCode | homeOrganization.value |
LastName | name.familyName |
Locations.Items[].Location.LongName | location.displayName |
Locations.Items[].Location.XRefCode | location.value |
LoginId | userName |
LoginId | loginId |
NewHireApprovalDate | newHireApprovalDate |
NewHireApproved | newHireApproved |
NewHireApprovedBy | newHireApprovedBy |
OrgUnitInfos.Items[].Department.LongName | department.longName |
OrgUnitInfos.Items[].Department.ShortName | department.shortName |
OrgUnitInfos.Items[].Department.XRefCode | department.value |
OriginalHireDate | originalHireDate |
PhotoExempt | photoExempt |
RegisteredDisabled | registeredDisabled |
RequiresExitInterview | requiresExitInterview |
SeniorityDate | seniorityDate |
SocialSecurityNumber | socialSecurityNumber |
StartDate | startDate |
TaxExempt | taxExempt |
TerminationDate | terminationDate |
Title | title |
WorkAssignments.Items[].Position.Job.LongName | jobs[].longName |
WorkAssignments.Items[].Position.Job.ShortName | jobs[].shortName |
WorkAssignments.Items[].Position.Job.XRefCode | jobs[].value |
XRefCode | id |
GenderIdentity.XRefCode |
genderIdentity.value |
GenderIdentity.ShortName |
genderIdentity.shortName |
GenderIdentity.LongName |
genderIdentity.longName |
Contacts.Items[].ContactNumber (Contacts.Items[].ContactInformationType.XRefCode = "HomePhone") |
phoneNumbers.homePhone |
SSOAccounts.Items[].LoginName |
loginNames[].loginName |
WorkAssignments.Items[].Location.XRefCode |
locations[].value |
WorkAssignments.Items[].Location.LongName |
locations[].longName |
WorkAssignments.Items[].Location.ShortName |
locations[].shortName |
EmploymentStatuses.Items[].PayClass.XRefCode |
payClass.value |
EmploymentStatuses.Items[].PayClass.ShortName |
payClass.shortName |
EmploymentStatuses.Items[].PayClass.LongName |
payClass.longName |
EmploymentStatuses.Items[].EmploymentStatusReason.LongName |
employmentStatusReason.longName |
EmploymentStatuses.Items[].EmploymentStatusReason.ShortName |
employmentStatusReason.shortName |
EmploymentStatuses.Items[].EmploymentStatusReason.XRefCode |
employmentStatusReason.value |
Contacts.Items[].ContactNumber(Contact- s.Items[].ContactInformationType.XRefCode = "BusinessMobile") |
phoneNumbers.businessMobile |
Contacts.Items[].ContactNumber(Contact- s.Items[].ContactInformationType.XRefCode = "BusinessFax") |
phoneNumbers.businessFax |
Contacts.Items[].ContactNumber(Contact- s.Items[].ContactInformationType.XRefCode = "Pager") |
phoneNumbers.pager |
Culture.XRefCode |
culture.value |
Culture.ShortName |
culture.displayName |
PreferredLastName |
preferredLastName |
Addresses.Items[].State.ShortName (Addresse- s.Items[].ContactInformationType.XRefCode = "PrimaryResidence") |
address.shortName |
Addresses.Items[].State.XRefCode (Addresse- s.Items[].ContactInformationType.XRefCode = "PrimaryResidence") |
address.valueState |
Addresses.Items[].Country.XRefCode (Addresse- s.Items[].ContactInformationType.XRefCode = "PrimaryResidence") |
address.valueCountry |
WorkAssignments.Items[].Position.Job.JobUDFString2 |
jobs[].jobUDFString2 |
WorkAssignments.Items[].Position.XRefCode |
position.value |
WorkAssignments.Items[].Position.ShortName |
position.shortName |
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 |
Dayforce properties | SCIM properties |
---|---|
XRefCode | id |
ShortName | shortName |
LongName | longName |
LastModifiedTimestamp | meta.lastModified |
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 |
Dayforce properties | SCIM properties |
---|---|
XRefCode | id |
PhysicalLocation | physicalLocation |
OpeningDate | openingDate |
IsMobileOrg | isMobileOrg |
ShortName | shortName |
LongName | longName |
OrgLevel.XRefCode |
orgLevel.value |
OrgLevel.ShortName |
orgLevel.shortName |
OrgLevel.LongName |
orgLevel.longName |
OrgUnitParents.Items[].ParentOrgUnit.XRefCode |
orgUnitParents.value |
OrgUnitParents.Items[].ParentOrgUnit.ShortName |
orgUnitParents.shortName |
OrgUnitParents.Items[].ParentOrgUnit.LongName |
orgUnitParents.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
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
-
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
-
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
-
'Commit to database' and then 'Compile database'.
Modifying the synchronization project
-
Make sure that the local cache is turned off for the Synchronization project.
-
Select the SCIM synchronization project and select 'Variables' to add a new variable 'dprRevisionDateEmployees' (the variable name should be dprRevisionDate<schema name>).
-
Create a new 'Schema Class' from Employee in the 'Target system'. For example: "Employees for Delta Sync".
-
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.
-
As required, other supported attributes also can be added under filters.
-
Create a new Mapping using the new Schema Class dialog box.
-
Create a new Workflow using the new mapping. This workflow updates the existing records based on the revision filter.
-
To improve the syncs performance, remove the update steps from the existing default Initial sync Work Flow.
-
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'.
-
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.