Search code examples
muledataweavemulesoftmule4

DataWeave populate field based on self lookup in payload


I have a use case where we're looking to generate a flat-file based off HRIS data.

We retrieve one payload of employee data to include manager

The use case is to populate an isManager field if any record has that user as a manager.

I was able to retrieve an employee's manager, but walking down the tree is throwing me for a loop.

%dw 2.0
output application/json
var levelsPayload = payload[0].payload
var employeesPayload = payload[1].payload
var allManagerIds = employeesPayload.managerId
---
employeesPayload map (employee) -> {
    id: employee.id,
    endDate: employee.endDate,
    isManager: allManagerIds contains employee.id,
    manager: ((employeesPayload filter ( (value, index) -> value.id == employee.manager )) map ( (value,index) -> (value.preferredFirstName ++ ' ' ++ value.preferredLastName) )) joinBy (""),
    managerEmail: ((employeesPayload filter ( (value, index) -> value.id == employee.manager )) map ( (value,index) -> value.workEmail )) joinBy (""),
    firstName: employee.preferredFirstName default employee.firstName,
    lastName: if (employee.preferredLastName == '' or employee.preferredLastName == null) employee.lastName else employee.preferredLastName,
    userName: employee.workEmail,
    email: employee.workEmail,
    title: employee.title replace /(,)/ with " ",
    displayName: employee.preferredFirstName ++ ' ' ++ employee.preferredLastName,
    secondEmail: employee.personalEmail,
    primaryPhone: employee.phone,
    streetAddress: '',
    city: employee.address.city,
    state: employee.address.state,
    zipCode: employee.address.zip,
    countryCode: employee.address.country,
    postalAddress: employee.address.zip,
    employeeNumber: employee.employeeNumber,
    department: employee.department,
    managerId: employee.manager,
    startDate: employee.startDate,
    jobStatus: if (employee.endDate == null) "active" else "termed",
    teams: (employee.teams joinBy '') as String,
    level: ((levelsPayload as Array filter ( (value, index) -> value.id == employee.level )) map ( (value,index) -> value.name as String) ) joinBy (""),
    employmentType:  employee.employmentType,
    legalFirstName: employee.firstName,
    legalLastName: employee.lastName,
}

I'd assume I need to do a filter map, but am unsure how to return true if any element in the payload equals the manager's employee id


Solution

  • You can store all manager IDs in a var

    var allManagerIds = employeesPayload.manager
    

    Then you can use contains method to check if a the employee manager id is in this list.

    isManager: allManagerIds contains employee.manager