Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Whenever you are creating or updating an emplyomentemployment, you have to specify the following properties:

...

If a person has more than one employment, there is often a need to determinate its main employment. This is can be used in many places such as mappings. For example a Core Identity can have two emplyoments employments but you would like to provision its job title to a target system. In order to determinate the job title, the main employment is used.

...

Code Block
languagec#
return employments
    .Where(a => a.EmploymentState.Id != (uint)CoreIdentityEmploymentStates.Deleted)
    .OrderByDescending(a => a.EmploymentState.Id)
    .ThenByDescending(a => a.MainEmployment)
    .ThenByDescending(a => a.ValidFrom <= DateTime.Now && (!a.ValidTo.HasValue || a.ValidTo.Value >= DateTime.Now.Date))
    .ThenByDescending(a => a.Percentage)
    .ThenBy(a => a.ValidFrom)
    .ThenBy(a => a.ValidTo.HasValue)
    .ThenBy(a => a.ValidTo)
    .ThenBy(a => a.Id);

If this logic is needed in the new Elsa Workflow Engine a JavaScript representation would look like this:

Code Block
languagejs
function employmentSorter(a, b) {
    var boolA = a.employment_state.system_name == "Deleted";
    var boolB = b.employment_state.system_name == "Deleted";
    if (boolA && !boolB) {
        return 1;
    } else if (!boolA && boolB) {
        return -1;
    } else {
        if (a.employment_state.id > b.employment_state.id) {
            return -1;
        } else if (a.employment_state.id < b.employment_state.id) {
            return 1;
        } else {
            if (a.main_employment && !b.main_employment) {
                return -1;
            } else if (!a.main_employment && b.main_employment) {
                return 1;
            } else {
                var today = new Date(Date.now());
                boolA = new Date(a.valid_from) <= today && (!a.valid_to || new Date(a.valid_to) >= today);
                boolB = new Date(b.valid_from) <= today && (!b.valid_to || new Date(b.valid_to) >= today);
                if (boolA && !boolB) {
                    return -1;
                } else if (!boolA && boolB) {
                    return 1;
                } else {
                    if (a.percentage > b.percentage) {
                        return -1;
                    } else if (a.percentage < b.percentage) {
                        return 1;
                    } else {
                        if (a.valid_from < b.valid_from) {
                            return -1;
                        } else if (a.valid_from > b.valid_from) {
                            return 1;
                        } else {
                            if (a.valid_to && !b.valid_to) {
                                return -1;
                            } else if (!a.valid_to && b.valid_to) {
                                return 1;
                            } else {
                                if (new Date(a.valid_to) < new Date(b.valid_to)) {
                                    return -1;
                                } else if (new Date(a.valid_to) > new Date(b.valid_to)) {
                                    return 1;
                                } else {
                                    if (a.id < b.id) {
                                        return -1;
                                    } else if (a.id > b.id) {
                                        return 1;
                                    } else {
                                        return 0;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

So given an employment Array as a result of a GetAllCoreIdentityEmploymentActivity (with loaded properties valid_from, valid_to, percentage, id, main_employment; and loaded attributes employment_state.id, employment_state.system_name), it can be sorted like this:

employments.sort(employmentSorter);

...