Pages

Banner 468 x 60px

 

Sunday, January 26, 2014

AX2012 Import HCMWorker or Employee from CSV

0 comments

AX2012 Import HCMWorker or Employee from CSV

This is the sample code for creating the Employee and if employee exists then updating the employee.
First build the class to read from CSV file and call this methods for creating/updateing the worker.
Please change the container column number values from your csv positions.

we can use HCMWorkerImportService for create, but this service did'nt provide the update functionality.
I will update the the next post using service to create/update the employee.

private void run()
{

 if (!HcmWorker::findByPersonnelNumber(conPeek(_c, #EmployeeNumber)).RecId)
        {//Update employee
            this.employeeCreate(_c);
        }
        else
        {//Insert employee
            this.employeeUpdate(_c);
        }

}


static public Description createDescription(DirPersonName _dirPersonName)
{
    #Define.Space(" ")
    return _dirPersonName.FirstName
        + (_dirPersonName.MiddleName ? #Space + _dirPersonName.MiddleName : "")
        + (_dirPersonName.LastName   ? #Space + _dirPersonName.LastName   : "");
}


public Static HcmPersonGender convGender(str _gender)
{
    HcmPersonGender ret;
    #Define.Female("Kvinde")
    #Define.Male("Mand")
    ;
    switch (_gender)
    {
        case #Female:
            ret = HcmPersonGender::Female;
            break;

        case #Male:
            ret = HcmPersonGender::Male;
            break;

        default:
            ret = HcmPersonGender::None;
    }

    return ret;
}


public Static str defaultCountryRegionId()
{
    str ret;
    LogisticsPostalAddress  logisticsPostalAddress_Default;
    ;

    logisticsPostalAddress_Default.initValue();

    ret = logisticsPostalAddress_Default.CountryRegionId;

    return ret;
}





public static date convDate(str _date)
{
    Date ret;
    ;

    ret = str2Date(_date, 123);

    return ret;
}


This method is used to create the employee.
Create
private void employeeCreate(container _c)
{
    boolean                                 ret = true;
    CompanyInfo                             companyInfo;
    HcmEmploymentRecId                      newEmploymentRecId;
    ValidFromDateTime                       employmentStartDateTime;
    ValidToDateTime                         employmentEndDateTime;
    HcmWorker                               newHcmWorker;
    DirPerson                               dirPerson;
    DirPersonName                           dirPersonName;
    HcmEmploymentType                       hcmEmploymentType = HcmEmploymentType::Employee;
    NumberSeq                               numberSeqPersonnelNum;
    HcmPersonPrivateDetails                 HcmPersonPrivateDetails;
    AxLogisticsPostalAddress                axLogisticsPostalAddress = new AxLogisticsPostalAddress();
    AxLogisticsLocation                     axLogisticsLocation;
    ;

    companyInfo = companyInfo::find();

    employmentStartDateTime = datetobeginUtcDateTime(HrmImportEmployeeMasterdata::convDate(conpeek(_c, #DateOfHiring)), DateTimeUtil::getUserPreferredTimeZone());
    employmentEndDateTime   = DateTimeUtil::applyTimeZoneOffset(DateTimeUtil::maxValue(), DateTimeUtil::getUserPreferredTimeZone());

    dirPersonName.FirstName     = conpeek(_c, #FirstName);
    dirPersonName.MiddleName    = conpeek(_c, #MiddleName);
    dirPersonName.LastName      = conpeek(_c, #LastName);
    newHcmWorker = HcmWorker::find(HcmWorkerTransition::newCreateHcmWorker(dirPersonName
                                                                           , conpeek(_c, #EmployeeNumber)
                                                                           , companyInfo.RecId
                                                                           , hcmEmploymentType
                                                                           , employmentStartDateTime
                                                                           , employmentEndDateTime));

    if (newHcmWorker.RecId == 0)
    {
        ret = false;
    }

    if (newHcmWorker.RecId == 0)
    {
        // Updating an existing worker

        // If there is no active employment for the worker
        newEmploymentRecId = HcmWorkerTransition::newCreateHcmEmployment(newHcmWorker.RecId, companyInfo.RecId,
                hcmEmploymentType, employmentStartDateTime, employmentEndDateTime);


        if (newEmploymentRecId == 0)
        {
            ret = false;
        }
    }

    if (ret)
    {
        if(numberSeqPersonnelNum)
        {
            // mark number sequence based ID consumed
            numberSeqPersonnelNum.used();
        }
    }
    else
    {
        if(numberSeqPersonnelNum)
        {
            numberSeqPersonnelNum.abort();
        }

        dirPerson.clear();
        dirPersonName.Person = 0;
    }

    hcmPersonPrivateDetails.initValue();
    hcmPersonPrivateDetails.Person      = dirPersonName.Person;
    hcmPersonPrivateDetails.BirthDate   = HrmImportEmployeeMasterdata::convDate(conpeek(_c, #BirthDate));
    hcmPersonPrivateDetails.Gender      = HrmImportEmployeeMasterdata::convGender(conpeek(_c, #Gender));
    hcmPersonPrivateDetails.insert();

    dirPerson                   = dirPerson::find(dirPersonName.Person, true);
    dirPerson.Initials          = conpeek(_c, #Initials);
    dirPerson.ProfessionalTitle = conpeek(_c, #Position);
    dirPerson.update();

    //Create address
    axLogisticsLocation = new AxLogisticsLocation();
    axLogisticsLocation.validateInput(true);
    axLogisticsLocation.parmIsPostalAddress(NoYes::Yes);
    axLogisticsLocation.parmDescription(HrmImportEmployeeMasterdata::createDescription(dirPersonName));
    axLogisticsLocation.save();

    axLogisticsPostalAddress    = new AxLogisticsPostalAddress();
    axLogisticsPostalAddress.parmLocation(axLogisticsLocation.parmRecId());
    axLogisticsPostalAddress.validateInput(true);
    axLogisticsPostalAddress.parmCountryRegionId(HrmImportEmployeeMasterdata::defaultCountryRegionId());
    axLogisticsPostalAddress.parmZipCode(conpeek(_c, #PostalCode));
    axLogisticsPostalAddress.parmZipCodeRecId(LogisticsAddressZipCode::find(conpeek(_c, #PostalCode)).RecId);
    axLogisticsPostalAddress.parmStreet(conpeek(_c, #Address));
    axLogisticsPostalAddress.parmCity(LogisticsAddressZipCode::find(conpeek(_c, #PostalCode)).City);
    axLogisticsPostalAddress.parmCityRecId(LogisticsAddressZipCode::find(conpeek(_c, #PostalCode)).CityRecId);
    axLogisticsPostalAddress.save();

    DirParty::addLocation(dirPersonName.Person, axLogisticsLocation.parmRecId(), true, true, true);
}


This method is used to update the employee

Update
private void employeeUpdate(container _c)
{
    boolean                                 ret = true;
    CompanyInfo                             companyInfo;
    ValidFromDateTime                       employmentStartDateTime;
    ValidToDateTime                         employmentEndDateTime;
    HcmWorker                               hcmWorker;
    DirPerson                               dirPerson;
    DirPersonName                           dirPersonName;
    HcmEmploymentType                       hcmEmploymentType = HcmEmploymentType::Employee;
    HcmPersonPrivateDetails                 HcmPersonPrivateDetails;
    AxLogisticsPostalAddress                axLogisticsPostalAddress = new AxLogisticsPostalAddress();
    AxLogisticsLocation                     axLogisticsLocation;
    Description                             description_Old;
    HcmEmployment                           hcmEmployment;
    LogisticsLocation                       logisticsLocation;
    LogisticsPostalAddress                  logisticsPostalAddress;
    DirPartyLocation                        dirPartyLocation;
    ;

    companyInfo = companyInfo::find();
    hcmWorker   = hcmWorker::findByPersonnelNumber(conpeek(_c, #EmployeeNumber));

    //Update dirPersonName
    dirPersonName   = dirPersonName::find(hcmWorker.Person, true);
    description_Old = HrmImportEmployeeMasterdata::createDescription(dirPersonName);
    if (   dirPersonName.FirstName  != conpeek(_c, #FirstName)
        || dirPersonName.MiddleName != conpeek(_c, #MiddleName)
        || dirPersonName.LastName   != conpeek(_c, #LastName))
    {
        dirPersonName.validTimeStateUpdateMode(ValidTimeStateUpdate::Correction);
        dirPersonName.FirstName     = conpeek(_c, #FirstName);
        dirPersonName.MiddleName    = conpeek(_c, #MiddleName);
        dirPersonName.LastName      = conpeek(_c, #LastName);
        dirPersonName.update();
    }

    //Update hiring
    employmentStartDateTime = datetobeginUtcDateTime(HrmImportEmployeeMasterdata::convDate(conpeek(_c, #DateOfHiring)), DateTimeUtil::getUserPreferredTimeZone());
    employmentEndDateTime   = DateTimeUtil::applyTimeZoneOffset(DateTimeUtil::maxValue(), DateTimeUtil::getUserPreferredTimeZone());

    hcmWorker       = HcmWorker::findByPersonnelNumber(conpeek(_c, #EmployeeNumber));
    hcmEmployment   = hcmEmployment::getActiveEmploymentsByWorker(hcmWorker.RecId, employmentStartDateTime, employmentEndDateTime, true);
    if (hcmEmployment.RecId)
    {
        HcmWorkerTransition::newUpdateHcmEmployment(hcmEmployment, employmentStartDateTime, employmentEndDateTime);
    }
    else
    {
        hcmWorker = HcmWorker::find(HcmWorkerTransition::newCreateHcmWorker(dirPersonName
                                                                           , conpeek(_c, #EmployeeNumber)
                                                                           , companyInfo.RecId
                                                                           , hcmEmploymentType
                                                                           , employmentStartDateTime
                                                                           , employmentEndDateTime));
    }

    hcmPersonPrivateDetails = HcmPersonPrivateDetails::findByPerson(hcmWorker.Person, true);
    if (hcmPersonPrivateDetails)
    {
        if (   hcmPersonPrivateDetails.BirthDate    != HrmImportEmployeeMasterdata::convDate(conpeek(_c, #BirthDate))
            || hcmPersonPrivateDetails.Gender       != HrmImportEmployeeMasterdata::convGender(conpeek(_c, #Gender)))
        {
            hcmPersonPrivateDetails.BirthDate   = HrmImportEmployeeMasterdata::convDate(conpeek(_c, #BirthDate));
            hcmPersonPrivateDetails.Gender      = HrmImportEmployeeMasterdata::convGender(conpeek(_c, #Gender));
            hcmPersonPrivateDetails.update();
        }
    }
    else
    {
        hcmPersonPrivateDetails.initValue();
        hcmPersonPrivateDetails.Person      = dirPersonName.Person;
        hcmPersonPrivateDetails.BirthDate   = HrmImportEmployeeMasterdata::convDate(conpeek(_c, #BirthDate));
        hcmPersonPrivateDetails.Gender      = HrmImportEmployeeMasterdata::convGender(conpeek(_c, #Gender));
        hcmPersonPrivateDetails.insert();
    }

    dirPerson                   = dirPerson::find(dirPersonName.Person, true);
    if (   dirPerson.Initials               != conpeek(_c, #Initials)
        || dirPerson.ProfessionalTitle      != conpeek(_c, #Position))
    {
        dirPerson.Initials          = conpeek(_c, #Initials);
        dirPerson.ProfessionalTitle = conpeek(_c, #Position);
        dirPerson.update();
    }

    //Update or Create address
    select firstOnly forUpdate logisticsLocation
        where logisticsLocation.Description == description_Old
        join dirPartyLocation
            where dirPartyLocation.Location == logisticsLocation.RecId
               && dirPartyLocation.Party    == dirPerson.RecId;

    if (logisticsLocation)
    {
        axLogisticsLocation = AxInternalBase::construct(logisticsLocation);
    }
    else
    {
        axLogisticsLocation = new AxLogisticsLocation();
    }

    axLogisticsLocation.validateInput(true);
    axLogisticsLocation.parmIsPostalAddress(NoYes::Yes);
    axLogisticsLocation.parmDescription(HrmImportEmployeeMasterdata::createDescription(dirPersonName));
    axLogisticsLocation.save();


    //Update or Create postaladdress
    select firstOnly forUpdate logisticsPostalAddress
        where logisticsPostalAddress.Location == axLogisticsLocation.parmRecId();

    if (logisticsPostalAddress)
    {
        axLogisticsPostalAddress = AxInternalBase::construct(logisticsPostalAddress);
    }
    else
    {
        axLogisticsPostalAddress = new AxLogisticsPostalAddress();
    }

    axLogisticsPostalAddress.parmLocation(axLogisticsLocation.parmRecId());
    axLogisticsPostalAddress.validateInput(true);
    axLogisticsPostalAddress.parmCountryRegionId(HrmImportEmployeeMasterdata::defaultCountryRegionId());
    axLogisticsPostalAddress.parmZipCode(conpeek(_c, #PostalCode));
    axLogisticsPostalAddress.parmZipCodeRecId(LogisticsAddressZipCode::find(conpeek(_c, #PostalCode)).RecId);
    axLogisticsPostalAddress.parmStreet(conpeek(_c, #Address));
    axLogisticsPostalAddress.parmCity(LogisticsAddressZipCode::find(conpeek(_c, #PostalCode)).City);
    axLogisticsPostalAddress.parmCityRecId(LogisticsAddressZipCode::find(conpeek(_c, #PostalCode)).CityRecId);
    axLogisticsPostalAddress.save();

    DirParty::addLocation(dirPersonName.Person, axLogisticsLocation.parmRecId(), true, true, true);
}

0 comments:

A financial dimension value is based on the LAND-00013 record and has been used on a transaction. You cannot delete the LAND-00013 record AX 2012

 A financial dimension value is based on the LAND-00013 record and has been used on a  transaction. You cannot delete the LAND-00013 record ...