A relation between the worker and the system user records (System administration > Common > Users > User relations) is necessary to approve BOMs, enter timesheets or expense reports in Dynamics AX. The user records can be easily imported from the Active Directory, the Employee records can be migrated from a legacy ERP or a 3rd party system through the DIXF interface.
The DIXF in Dynamics AX CU9/CU10 can also fill the missing link between the two, but a simple idempotent X++ job can also be a viable solution to mass create missing DirPersonUser relations. The below script tries to match the users by the e-mail address, then by the First-Last name, then by the Last-First name etc.
The DIXF in Dynamics AX CU9/CU10 can also fill the missing link between the two, but a simple idempotent X++ job can also be a viable solution to mass create missing DirPersonUser relations. The below script tries to match the users by the e-mail address, then by the First-Last name, then by the Last-First name etc.
// Align the users and the workers by the e-mail address first, and the name second
public static void generateDirPersonUser()
{
DirPersonUser dirPersonUser, dirPersonUser2;
UserInfo userInfo;
SysUserInfo sysUserInfo;
HcmWorker hcmWorker;
LogisticsElectronicAddress electronicAddress;
DirPerson dirPerson;
Name rearrangedName;
DirNameSequence dirNameSequence;
DirPersonName dirPersonName;
while select userInfo
join sysUserInfo
where sysUserInfo.Id == userInfo.id
notexists join dirPersonUser2
where dirPersonUser2.User == userInfo.id
{
dirPerson.clear();
if (sysUserInfo.Email) // 1st attempt
{
select firstonly hcmWorker
join dirPerson
where dirPerson.RecId == hcmWorker.Person
join electronicAddress
where electronicAddress.Locator == sysUserInfo.Email
&& electronicAddress.RecId == dirPerson.(DirPartyTable::electronicAddressType2primaryFieldId(LogisticsElectronicAddressMethodType::Email);
}
if (! dirPerson && strAlpha(userInfo.name))
{
dirPersonName.clear();
[dirPersonName.FirstName,
dirPersonName.MiddleName,
dirPersonName.LastName] = str2con(strReplace(userInfo.name, '.,', ' '), ' ');
while select dirNameSequence // 2nd, 3rd etc. attempt
{
rearrangedName = dirPerson.name(dirPersonName, DirNameSequence.DisplayAs);
select firstonly hcmWorker
join dirPerson
where dirPerson.RecId == hcmWorker.Person
&& dirPerson.Name == rearrangedName;
if (dirPerson)
break;
}
}
if (dirPerson && hcmWorker::getMaxEmploymentEndDate(hcmWorker.RecId) > DateTimeUtil::utcNow())
{
dirPersonUser.clear();
dirPersonUser.initValue();
dirPersonUser.PersonParty = dirPerson.RecId;
dirPersonUser.User = userInfo.id;
dirPersonUser.ValidFrom = hcmWorker::getMinEmploymentStartDate(hcmWorker.RecId);
dirPersonUser.ValidTo = hcmWorker::getMaxEmploymentEndDate(hcmWorker.RecId);
if (dirPersonUser.validateWrite())
{
dirPersonUser.insert();
}
}
}
}
Happy DAXing...