Funciones de asignación de expresiones successFactors para el aprovisionamiento de identificadores de Microsoft Entra

En este artículo se proporciona una guía completa para las funciones de asignación de expresiones que se usan habitualmente al configurar SuccessFactors en el aprovisionamiento de usuarios de Microsoft Entra ID. Estas funciones ayudan a transformar y asignar datos de SuccessFactors para crear atributos de usuario adecuados en microsoft Entra ID.

Tabla de contenido

Funciones de manipulación de cadenas

Operaciones básicas de cadena

Escenario 1: desea rellenar un identificador de persona con ceros iniciales para crear una cadena de 8 caracteres.

Atributo de destino: employeeId

Replace(Join("","00000000",[personIdExternal]), ,"(.*?)(?<id>.{0,8})$", ,"${id}", ,)

Ejemplo:

  • Valores de entrada: [personIdExternal] = "12345"
  • Salida de expresión: 00012345

Escenario 2: debe rellenar el centro de costos con ceros iniciales para convertirlo en 10 caracteres.

Atributo de destino: extensionAttribute1

Replace(Join("","0000000000",[costCenterId]), ,"(.*?)(?<id>.{0,10})$", ,"${id}", ,)

Ejemplo:

  • Valores de entrada: [costCenterId] = "567"
  • Salida de expresión: 0000000567

Escenario 3: quiere crear un identificador de empleado anexando un prefijo a un número de empleado rellenado.

Atributo de destino: employeeId

Append("05",Replace(Join("","000000",[employeeId]), ,"(.*?)(?<id>.{0,6})$", ,"${id}", ,))

Ejemplo:

  • Valores de entrada: [employeeId] = "789"
  • Salida de expresión: 05000789

Conversión de mayúsculas y minúsculas de texto

Escenario 1: Debe convertir nombres de todas las mayúsculas a mayúsculas (Caso de título).

Atributo de destino: sn

Join("",Mid([lastName],1,1),ToLower(Mid([lastName],2,64)))

Ejemplo:

  • Valores de entrada: [lastName] = "JOHNSON"
  • Salida de expresión: Johnson

Escenario 2: quiere crear un nombre para mostrar con el formato de mayúsculas y minúsculas adecuado.

Atributo de destino: displayName

Join(", ", Join("",Mid([lastName],1,1),ToLower(Mid([lastName],2,64))), Join("",Mid([firstName],1,1),ToLower(Mid([firstName],2,64))))

Ejemplo:

  • Valores de entrada: [lastName] = "SMITH", [firstName] = "JOHN"
  • Salida de expresión: Smith, John

Escenario 3: Debe controlar los nombres con espacios reemplazando los espacios por puntos.

Atributo de destino: givenName

Replace([firstName]," ", , ,".", , )

Ejemplo:

  • Valores de entrada: [firstName] = "Mary Ann"
  • Salida de expresión: Mary.Ann

Generación de direcciones de correo electrónico

Generación básica de correo electrónico

Escenario 1: quiere generar direcciones de correo electrónico con el nombre y apellidos con dominios específicos de la empresa.

Atributo de destino: correo

SelectUniqueValue(
    Switch([company], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "Contoso", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "Fabrikam", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "Woodgrove", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    ),
    Switch([company], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com"), 
        "Contoso", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com"), 
        "Fabrikam", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "fabrikam.com"), 
        "Woodgrove", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), Mid([middleName],1,1), [lastName]))), "woodgrove.com")
    )
)

Ejemplo:

  • Valores de entrada: [company] = "Contoso", [firstName] = "John", [lastName] = "Smith", [middleName] = "Michael"
  • Salida de expresión: john.smith@contoso.com (o john.m.smith@contoso.com si se toma la primera opción)

Generación de correo electrónico basada en grupos de empleados

Escenario 1: quiere generar diferentes formatos de correo electrónico en función de la clasificación de empleados (permanente frente a temporal).

Atributo de destino: userPrincipalName

StripSpaces(NormalizeDiacritics(Switch([custom06], 
    Join("", [firstName], ".", [lastName], "@ltts.com"), 
    "Temporary", Join("", [firstName], ".", [lastName], "_ext@ltts.com"), 
    "External", Join("", [firstName], ".", [lastName], "_ext@ltts.com"), 
    "Permanent", Join("", [firstName], ".", [lastName], "@ltts.com")
)))

Ejemplo:

  • Valores de entrada: [custom06] = "Temporary", [firstName] = "Sarah", [lastName] = "Wilson"
  • Salida de expresión: sarah.wilson_ext@ltts.com

Validación de dominios corporativos

Escenario 1: solo desea fluir direcciones de correo electrónico que pertenecen a un dominio corporativo específico.

Atributo de destino: correo

IgnoreFlowIfNullOrEmpty(IIF(InStr([emailAddress],"@contoso.com")=0,"",[emailAddress]))

Ejemplo:

  • Valores de entrada: [emailAddress] = "john.doe@contoso.com"
  • Salida de expresión: john.doe@contoso.com
  • Entrada alternativa: [emailAddress] = "john.doe@external.com"
  • Salida alternativa: (vacía- omitida)

Conservación de correo electrónico existente

Escenario 1: quiere usar el correo electrónico existente de SuccessFactors para determinadas divisiones, pero generar otros nuevos.

Atributo de destino: userPrincipalName

SelectUniqueValue(
    Switch([divisionId], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"), 
        "8900", [email]
    ), 
    Join("1@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"), 
    Join("2@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")
)

Ejemplo:

  • Valores de entrada: [divisionId] = "8900", [email] = "existing.user@company.com", [firstName] = "Mike", [lastName] = "Brown"
  • Salida de expresión: existing.user@company.com
  • Entrada alternativa: [divisionId] = "1200", [firstName] = "Mike", [lastName] = "Brown"
  • Salida alternativa: mike.brown@contoso.com

Lógica de administración de cuentas

Estado de la cuenta básica

Escenario 1: quiere determinar si una cuenta debe deshabilitarse en función del estado de empleo.

Atributo de destino: accountDisabled

Switch([emplStatus], "False", "741", "False", "749", "True", "746", "True")

Ejemplo:

  • Valores de entrada: [emplStatus] = "741"
  • Salida de expresión: False (cuenta habilitada)
  • Entrada alternativa: [emplStatus] = "746"
  • Salida alternativa: True (cuenta deshabilitada)

Ocultar de la lógica de listas de direcciones

Escenario 1: debe establecer el atributo msExchHideFromAddressLists en función de las fechas de inicio y finalización.

Atributo de destino: msExchHideFromAddressLists

IIF(DateDiff("d", CDate(IIF(IsPresent([startDate]), [startDate], DateAdd("d", "10", Now()))), Now()) >= -1, IIF(DateDiff("d", Now(), CDate(IIF(IsPresent([endDate]), [endDate], DateAdd("d", "1", Now())))) >= 0, "FALSE", "TRUE"), "TRUE")

Ejemplo:

  • Valores de entrada: [startDate] = "2025-01-15", [endDate] = "2025-12-31" (fecha actual: 2025-07-30)
  • Salida de expresión: FALSE (no oculta de las listas de direcciones)
  • Entrada alternativa: [startDate] = "2025-01-15", [endDate] = "2025-06-30"
  • Salida alternativa: TRUE (oculta de las listas de direcciones)

Lógica de estado de empleado compleja

Escenario 1: Tiene un requisito complejo para deshabilitar cuentas basadas en campos personalizados y fechas de contratación.

Atributo de destino: accountEnabled

Switch([empNavCustomString3], "True",
"62220", Switch([cust_hiredate], 
    IIF(DateDiff("d", CDate([cust_hiredate]), Now()) = 3, 
        Switch([cust_customDate67], 
            IIF(DateDiff("d", CDate([cust_customDate67]), Now())=0, "False", "True"),
            "", "False" 
        ), "True"
    ),
    "", "True"
))

Ejemplo:

  • Valores de entrada: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-30" (fecha actual: 2025-07-30)
  • Salida de expresión: False (cuenta habilitada)
  • Entrada alternativa: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-29"
  • Salida alternativa: True (cuenta deshabilitada)

Funciones de fecha y expiración de la cuenta

Expiración básica de la cuenta

Escenario 1: quiere establecer la expiración de la cuenta en función de la fecha de finalización de SuccessFactors.

Atributo de destino: accountExpires

Switch([endDate], 
    NumFromDate(Join("", FormatDateTime([endDate], "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-05:00")), 
    "", "9223372036854775807"
)

Ejemplo:

  • Valores de entrada: [endDate] = "12/31/2025 12:00:00 AM"
  • Salida de expresión: 133835135990000000 (representación numérica de 2025-12-31 23:59:59-05:00)
  • Entrada alternativa: [endDate] = "" (vacío)
  • Salida alternativa: 9223372036854775807 (nunca expira)

Expiración basada en tipos de empleo

Escenario 1: Debe establecer diferentes reglas de expiración de cuenta en función del tipo de empleo (permanente frente a contratista).

Atributo de destino: accountExpires

Switch([employmentType], 
    NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00")),
    "PM", NumFromDate(Join("",FormatDateTime(DateAdd("yyyy", 60, CDate([DOB])), ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00")),
    "CON", NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00"))
)

Ejemplo:

  • Valores de entrada: [employmentType] = "PM", [DOB] = "1/15/1990 12:00:00 AM"
  • Salida de expresión: 158488415990000000 (representación numérica de 2050-01-15 23:59:59-05:00, 60 años después del nacimiento)
  • Entrada alternativa: [employmentType] = "CON", [endDate] = "12/31/2025 12:00:00 AM"
  • Salida alternativa: 133835135990000000 (representación numérica de 2025-12-31 23:59:59-05:00)

Expiración de la cuenta basada en el motivo del evento

Escenario 1: quiere establecer la expiración de la cuenta en función de eventos de terminación específicos y fechas de interrupción.

Atributo de destino: accountExpires

Switch([event], 
    IIF(IsPresent([latestTerminationDate]), NumFromDate(Join("", FormatDateTime([latestTerminationDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), "9223372036854775807"), 
    "SEVUNSATP", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), 
    "SEVPOSELIM", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), 
    "POSELIM", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00"))
)

Ejemplo:

  • Valores de entrada: [event] = "SEVUNSATP", [severanceStartDate] = "8/15/2025 12:00:00 AM"
  • Salida de expresión: 133877247990000000 (representación numérica de 2025-08-15 23:59:59-08:00)
  • Entrada alternativa: [event] = "REGULAR", [latestTerminationDate] = "9/30/2025 12:00:00 AM"
  • Salida alternativa: 133886207990000000 (representación numérica de 2025-09-30 23:59:59-08:00)

Control de formato de fecha

Escenario 1: Debe controlar fechas no válidas como "12/31/9999" que provocan errores en NumFromDate.

Atributo de destino: accountExpires

Switch([endDate],
    NumFromDate(Join("", FormatDateTime([endDate], "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), "T23:59:59-04:00")),
    "12/31/9999 12:00:00 AM", NumFromDate("2099-12-31T23:59:59-04:00")
)

Ejemplo:

  • Valores de entrada: [endDate] = "12/31/9999 12:00:00 AM"
  • Salida de expresión: 441481535990000000 (representación numérica de 2099-12-31T23:59:59-04:00)
  • Entrada alternativa: [endDate] = "15/8/2025 12:00:00 AM"
  • Salida alternativa: 133877283990000000 (representación numérica de 2025-08-15T23:59:59-04:00)

Asignación de unidad organizativa (OU)

Asignación de unidades organizativas basadas en departamento

Escenario 1: quiere colocar usuarios en distintas UNIDADES organizativas en función de su departamento.

Atributo de destino: parentDistinguishedName

Switch([department], "OU=SuccessFactors,DC=contoso,DC=com", 
    "Engineering SG", "OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com", 
    "Shared Services", "OU=Shared Services,OU=SuccessFactors,DC=contoso,DC=com", 
    "Retail - Finance", "OU=Retail Finance,OU=SuccessFactors,DC=contoso,DC=com", 
    "Information Technology BR", "OU=Information Technology,OU=SuccessFactors,DC=contoso,DC=com", 
    "Development", "OU=Development,OU=SuccessFactors,DC=contoso,DC=com"
)

Ejemplo:

  • Valores de entrada: [department] = "Engineering SG"
  • Salida de expresión: OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com
  • Entrada alternativa: [department] = "Marketing"
  • Salida alternativa: OU=SuccessFactors,DC=contoso,DC=com (valor predeterminado)

Asignación de unidades organizativas basadas en el estado de empleo

Escenario 1: debe asignar usuarios a diferentes UNIDADES organizativas en función de su estado de empleo y ubicación.

Atributo de destino: parentDistinguishedName

Join("",
Switch([emplStatus], "OU=SFProvisoinngUsers", 
"741", Switch([empJobNavCustomString13],
    "OU=SFProvisoinngUsers",
    "LOC1016", "OU=Mysore",
    "LOC1019", "OU=Baroda",
    "LOC1015", Switch([departmentId],
        "OU=Bangalore",
        "DU1026","OU=IT,OU=Bangalore",
        "DU1025","OU=IT,OU=Bangalore"
        )
    ), 
"749", Switch([empJobNavCustomString13],
    "OU=O365-NoSYNC,OU=SFProvisoinngUsers",
    "LOC1016", "OU=O365-NoSYNC,OU=Mysore",
    "LOC1019", "OU=O365-NoSYNC,OU=Baroda",
    "LOC1015", "OU=O365-NoSYNC,OU=Bangalore"
    )
),
",DC=contoso,DC=com")

Ejemplo:

  • Valores de entrada: [emplStatus] = "741", [empJobNavCustomString13] = "LOC1015", [departmentId] = "DU1026"
  • Salida de expresión: OU=IT,OU=Bangalore,DC=contoso,DC=com
  • Entrada alternativa: [emplStatus] = "749", [empJobNavCustomString13] = "LOC1016"
  • Salida alternativa: OU=O365-NoSYNC,OU=Mysore,DC=contoso,DC=com
  • Entrada alternativa: [emplStatus] = "741", [empJobNavCustomString13] = "LOC9999" (no definido)
  • Salida alternativa: OU=SFProvisoinngUsers,DC=contoso,DC=com (valor predeterminado)

Asignación de unidades organizativas basadas en país

Escenario 1: quiere colocar usuarios en distintas unidades organizativas en función de su país con una unidad organizativa deshabilitada para usuarios inactivos.

Atributo de destino: parentDistinguishedName

Switch([activeEmploymentsCount],
    Switch([country], "OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Mexico", "OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Sweden", "OU=Sweden,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Colombia", "OU=Internal Accounts,OU=Colombia,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Brazil", "OU=Internal Accounts,OU=Brazil,OU=Accounts,DC=corp,DC=contoso,DC=com"
    ),
    "0", "OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com"
)

Ejemplo:

  • Valores de entrada: [activeEmploymentsCount] = "1", [country] = "México"
  • Salida de expresión: OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com
  • Entrada alternativa: [activeEmploymentsCount] = "0", [country] = "Suecia"
  • Salida alternativa: OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com (los usuarios deshabilitados van a una unidad organizativa especial, independientemente del país)
  • Entrada alternativa: [activeEmploymentsCount] = "1", [country] = "Alemania"
  • Salida alternativa: OU=Accounts,DC=corp,DC=contoso,DC=com (unidad organizativa predeterminada para países no definidos específicamente)

Procesamiento de nombres y nombres para mostrar

Generación de nombres comunes (CN)

Escenario 1: quiere generar un nombre común único con opciones de reserva para duplicados.

Atributo de destino: cn

SelectUniqueValue(
    NormalizeDiacritics(Join(" ", [firstName], [lastName])),
    NormalizeDiacritics(Join(" ", [firstName], Mid([middleName],1,1), [lastName])),
    NormalizeDiacritics(Join(" ", [firstName], [middleName], [lastName]))
)

Ejemplo:

  • Valores de entrada: [firstName] = "José", [lastName] = "García", [middleName] = "Antonio"
  • Salida de expresión: Jose Garcia (o Jose A Garcia si se toma la primera opción o Jose Antonio Garcia si se toman las dos primeras)

Nombre para mostrar con nombres preferidos

Escenario 1: debe crear un nombre para mostrar que use el nombre preferido cuando esté disponible; de lo contrario, vuelva al nombre.

Atributo de destino: displayName

Join(", ", Join("", Mid([lastName], 1, 1), ToLower(Mid([lastName], 2, 64), )), Join("", Mid(Coalesce([preferredName], [firstName]), 1, 1), ToLower(Mid(Coalesce([preferredName], [firstName]), 2, 64), )))

Ejemplo:

  • Valores de entrada: [lastName] = "JOHNSON", [preferredName] = "Mike", [firstName] = "Michael"
  • Salida de expresión: Johnson, Mike
  • Entrada alternativa: [lastName] = "SMITH", [preferredName] = "", [firstName] = "Robert"
  • Salida alternativa: Smith, Robert

Nombre para mostrar con sufijos numéricos

Escenario 1: quiere generar nombres para mostrar únicos con sufijos numéricos para duplicados.

Atributo de destino: displayName

SelectUniqueValue(
    Join("", NormalizeDiacritics(Join("", [lastName], ", ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "2, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "3, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "4, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName])))
)

Ejemplo:

  • Valores de entrada: [lastName] = "García", [preferredName] = "Mike", [firstName] = "Michael"
  • Salida de expresión: Garcia, Mike (o Garcia2, Mike si se toma la primera opción, etc.)
  • Entrada alternativa: [lastName] = "Smith", [preferredName] = "", [firstName] = "John"
  • Salida alternativa: Smith, John (o Smith2, John si se toma la primera opción, etc.)

Generación samAccountName

Generación básica de samAccountName

Escenario 1: quiere crear un samAccountName con el primer nombre inicial y el apellido con la saneación de caracteres adecuada.

Atributo de destino: sAMAccountName

SelectUniqueValue(
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Join("",Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 19), , "(\\.)*$", , "", , ),"1"),
    Join("",Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 19), , "(\\.)*$", , "", , ),"2")
)

Ejemplo:

  • Valores de entrada: [firstName] = "José", [lastName] = "García-López"
  • Salida de expresión: jgarcialopez (o jgarcialopez1 si se toma la primera opción o jgarcialopez2 si se toman las dos primeras)

SamAccountName con longitud de nombre de variable

Escenario 1: quiere controlar duplicados aumentando el número de caracteres del nombre.

Atributo de destino: sAMAccountName

SelectUniqueValue(
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,2), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,3), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , )
)

Ejemplo:

  • Valores de entrada: [firstName] = "Christopher", [lastName] = "Anderson"
  • Salida de expresión: canderson (o chanderson si se toma la primera opción o chranderson si se toman las dos primeras)
  • Entrada alternativa: [firstName] = "María", [lastName] = "Rodríguez-Santos"
  • Salida alternativa: mrodriguezsantos (o marodriguezsantos si se toma la primera opción o marrodriguezsantos si se toman las dos primeras)

SamAccountName del nombre de usuario externo

Escenario 1: desea extraer la parte de nombre de usuario de un nombre de usuario externo de estilo de correo electrónico.

Atributo de destino: sAMAccountName

Replace(Mid(Replace(Replace([username],,"(?<id>.*)@(?<domain>.*)",,"${id}",,), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , )

Ejemplo:

  • Valores de entrada: [username] = "john.smith@external.com"
  • Salida de expresión: johnsmith

Configuración de ProxyAddresses

Configuración básica de proxyAddresses

Escenario 1: quiere establecer varias direcciones de proxy, incluidas las direcciones SMTP principales y secundarias.

Atributo de destino: proxyAddresses

Split(
    Join(",", 
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "contoso.mail.onmicrosoft.com")), 
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "contoso.com")), 
        Append("SMTP:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "contoso.com"))
    ), 
    ","
)

Ejemplo:

  • Valores de entrada: [personIdExternal] = "12345", [firstName] = "John", [lastName] = "Smith"
  • Salida de expresión: ["smtp:A12345@contoso.mail.onmicrosoft.com", "smtp:A12345@contoso.com", "SMTP:John.Smith@contoso.com"]

Proxy basado en divisionesAddresses

Escenario 1: Necesita configuraciones de direcciones proxy diferentes en función de la división de empleados.

Atributo de destino: proxyAddresses

Split(
    Switch([divisionId], 
        Join(",", 
            Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "woodgrove.mail.onmicrosoft.com")), 
            Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "woodgrove.com")), 
            Append("SMTP:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "woodgrove.com"))
        ),			
        "EXEC", Join(",", 
            Append("smtp:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "contoso.com")), 
            Append("SMTP:", [email])
        )
    ),
    ","	
)

Ejemplo:

  • Valores de entrada: [divisionId] = "STANDARD", [personIdExternal] = "67890", [firstName] = "Sarah", [lastName] = "Johnson"
  • Salida de expresión: ["smtp:A67890@woodgrove.mail.onmicrosoft.com", "smtp:A67890@woodgrove.com", "SMTP:Sarah.Johnson@woodgrove.com"]
  • Entrada alternativa: [divisionId] = "EXEC", [firstName] = "Michael", [lastName] = "Brown", [email] = "mbrown@fabrikam.com"
  • Salida alternativa: ["smtp:Michael.Brown@contoso.com", "SMTP:mbrown@fabrikam.com"]

Proxy específico de la empresaAddresses

Escenario 1: quiere generar direcciones de proxy basadas en la afiliación de la empresa.

Atributo de destino: proxyAddresses

SelectUniqueValue (
    Switch([company], 
        Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "NGC", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "CNG", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "National Energy", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "fabrikam.com"))
    ),
    Switch([company], 
        Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "NGC", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "CNG", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "National Energy", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), Mid([middleName],1,1), [lastName]))), "fabrikam.com"))
    )
)

Ejemplo:

  • Valores de entrada: [company] = "NGC", [firstName] = "Trinidad", [lastName] = "Williams", [middleName] = "James"
  • Salida de expresión: SMTP:trinidad.williams@contoso.com (o SMTP:trinidad.j.williams@contoso.com si se toma la primera opción)
  • Entrada alternativa: [company] = "National Energy", [firstName] = "Rebecca", [lastName] = "Thompson", [middleName] = "Marie"
  • Salida alternativa: SMTP:r.thompson@fabrikam.com (o SMTP:r.m.thompson@fabrikam.com si se toma la primera opción)
  • Entrada alternativa: [company] = "Other Company", [firstName] = "David", [lastName] = "Jones", [middleName] = "Paul"
  • Salida alternativa: SMTP:david.jones@contoso.com (dominio predeterminado o SMTP:david.p.jones@contoso.com si se toma la primera opción)

Procesamiento de números de teléfono

Extracción básica de números de teléfono

Escenario 1: desea extraer la parte del número de teléfono sin el código de país.

Atributo de destino: telephoneNumber

Replace(Replace([mobile], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${phoneNumber}", , ), ,"[()\\s-]+", ,"", , )

Ejemplo:

  • Valores de entrada: [móvil] = "+1 (555) 123-4567"
  • Salida de expresión: 5551234567

Escenario 2: Debe extraer solo el código de país de un número de teléfono.

Atributo de destino: c

Replace(Replace([mobile], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${isdCode}", , ), ,"[()\\s-]+", ,"", , )

Ejemplo:

  • Valores de entrada: [mobile] = "+44 20 7946 0958"
  • Salida de expresión: 44

Valores predeterminados del número de teléfono

Escenario 1: quiere proporcionar números de teléfono predeterminados cuando el campo está vacío.

Atributo de destino: telephoneNumber

IIF(IsNullOrEmpty([telephoneNumber]),"000-000-0000",[telephoneNumber])
Switch([mobile],[mobile],"","000-000-0000")

Ejemplo:

  • Valores de entrada: [telephoneNumber] = ""
  • Salida de expresión: 000-000-0000
  • Entrada alternativa: [móvil] = "555-123-4567"
  • Salida alternativa: 555-123-4567

Lógica de teléfono principal

Escenario 1: debe determinar qué número de teléfono debe marcarse como principal.

Atributo de destino: extensionAttribute2

Switch(Join("+",Switch([businessPhoneIsPrimary],[businessPhoneIsPrimary],"","other"),Switch([cellPhoneIsPrimary],[cellPhoneIsPrimary],"","other")), "no primary phone", 
"false+false", "no primary phone",
"true+false", "business phone is primary",
"false+true", "cell phone is primary",
"true+true", "business phone is primary, cell phone is primary",
"other+true", "cell phone is primary",
"other+false", "no primary phone",
"true+other", "business phone is primary",
"false+other", "no primary phone")

Ejemplo:

  • Valores de entrada: [businessPhoneIsPrimary] = "true", [cellPhoneIsPrimary] = "false"
  • Salida de expresión: business phone is primary
  • Entrada alternativa: [businessPhoneIsPrimary] = "false", [cellPhoneIsPrimary] = "true"
  • Salida alternativa: cell phone is primary
  • Entrada alternativa: [businessPhoneIsPrimary] = "", [cellPhoneIsPrimary] = "true"
  • Salida alternativa: cell phone is primary

Lógica basada en país y ubicación

Asignación de código de país

Escenario 1: quiere asignar nombres de país a códigos de país ISO.

Atributo de destino: c

Switch([country], ,
  "Trinidad and Tobago", "TT",
  "Barbados", "BB"
)

Ejemplo:

  • Valores de entrada: [país] = "Trinidad y Tobago"
  • Salida de expresión: TT

Escenario 2: Debe asignar países a códigos numéricos de país.

Atributo de destino: countryCode

Switch([country], ,
  "Trinidad and Tobago", "780",
  "Barbados", "52"
)

Ejemplo:

  • Valores de entrada: [país] = "Barbados"
  • Salida de expresión: 52

Dominios de correo electrónico basados en ubicación

Escenario 1: quiere asignar dominios de correo electrónico diferentes en función de la ubicación geográfica.

Atributo de destino: correo

SelectUniqueValue (
    Switch([country], 
        Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "India", Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "Netherlands", Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "contoso.com")
    ),
    Switch([country], 
        Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "India", Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "Netherlands", Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "contoso.com")
    )
)

Ejemplo:

  • Valores de entrada: [country] = "India", [firstName] = "Raj", [lastName] = "Patel"
  • Salida de expresión: raj.patel@fabrikam.com (o 1raj.patel@fabrikam.com si se toma la primera opción)
  • Entrada alternativa: [country] = "Países Bajos", [firstName] = "Jan", [lastName] = "van der Berg"
  • Salida alternativa: jan.vanderberg@contoso.com (o 1jan.vanderberg@contoso.com si se toma la primera opción)
  • Entrada alternativa: [country] = "Alemania", [firstName] = "Klaus", [lastName] = "Müller"
  • Salida alternativa: klaus.muller@fabrikam.com (dominio predeterminado o 1klaus.muller@fabrikam.com si se toma la primera opción)

Clasificación de empleados y trabajadores contingentes

Clasificación de tipos de empleo

Escenario 1: quiere asignar códigos de tipo de empleado a descripciones legibles.

Atributo de destino: extensionAttribute3

Switch([employeeType],"Default-value",
    "31202","Employee",
    "31230","Contractor"
)

Ejemplo:

  • Valores de entrada: [employeeType] = "31202"
  • Salida de expresión: Employee
  • Entrada alternativa: [employeeType] = "99999"
  • Salida alternativa: Default-value

Identificación del trabajador contingente

Escenario 1: Debe identificar y controlar los trabajadores contingentes de forma diferente.

Atributo de destino: extensionAttribute4

Switch([isContingentWorker], "N/A", "True", "Contractor", "False", "Employee")

Ejemplo:

  • Valores de entrada: [isContingentWorker] = "True"
  • Salida de expresión: Contractor

Asignación de título personal

Escenario 1: quiere asignar códigos de título personales a los títulos adecuados.

IgnoreFlowIfNullOrEmpty(Switch([personalTitle], "", "4443", "Dr.", "4444", "Prof.", "4445", "Prof. Dr."))

Ejemplo:

  • Valores de entrada: [personalTitle] = "4443"
  • Salida de expresión: Dr.
  • Entrada alternativa: [personalTitle] = ""
  • Salida alternativa: (vacía- omitida)

Escenarios avanzados

Control de departamentos condicionales

Escenario 1: quiere usar el departamento de asignación global cuando esté disponible; de lo contrario, recurra al departamento normal.

Atributo de destino: departamento

Switch([globalAssignmentDepartment],[globalAssignmentDepartment],
"",[department])

Ejemplo:

  • Valores de entrada: [globalAssignmentDepartment] = "GLOBAL IT", [department] = "LOCAL IT"
  • Salida de expresión: Global IT
  • Entrada alternativa: [globalAssignmentDepartment] = "", [department] = "Sales"
  • Salida alternativa: Sales

Control de correo electrónico de eliminación temporal

Escenario 1: debe modificar las direcciones de correo electrónico cuando los usuarios se eliminan temporalmente para escenarios de escritura diferida.

Atributo de destino: correo

IIF([IsSoftDeleted]="True", Join("_",FormatDateTime(Now(), , "M/d/yyyy h:mm:ss tt", "yyyy-MM-dd"),[mail]), [mail])

Ejemplo:

  • Valores de entrada: [IsSoftDeleted] = "True", [mail] = "john.smith@company.com" (fecha actual: 2025-07-30)
  • Salida de expresión: 2025-07-30_john.smith@company.com
  • Entrada alternativa: [IsSoftDeleted] = "False", [mail] = "jane.doe@company.com"
  • Salida alternativa: jane.doe@company.com

Asignación de unidad organizativa compleja con lógica de terminación

Escenario 1: quiere mover usuarios terminados a una unidad organizativa especial después de un número específico de días.

Atributo de destino: parentDistinguishedName

IIF(DateDiff("d", Now(), CDate(Switch([latestTerminationDate], [latestTerminationDate], "", "9999-01-01"))) <= -14,
    "OU=DELETED,DC=company,DC=com",
    Switch([department], "OU=Default,DC=company,DC=com", 
        "Engineering", "OU=Engineering,DC=company,DC=com", 
        "Finance", "OU=Finance,DC=company,DC=com"
    )
)

Ejemplo:

  • Valores de entrada: [latestTerminationDate] = "2025-07-10", [department] = "Engineering" (fecha actual: 2025-07-30)
  • Salida de expresión: OU=DELETED,DC=company,DC=com (finalizado hace más de 14 días)
  • Entrada alternativa: [latestTerminationDate] = "2025-07-25", [department] = "Finance"
  • Salida alternativa: OU=Finance,DC=company,DC=com (finalizado hace menos de 14 días)

Generación de UPN de varias empresas con clase employee

Escenario 1: Debe generar UPN en función de la información de clase de empresa y empleado.

Atributo de destino: userPrincipalName

SelectUniqueValue (
    Switch([employeeClass], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1916", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1915", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "1917", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    ),
    Switch([employeeClass], 
        Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1916", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1915", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "1917", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    )
)

Ejemplo:

  • Valores de entrada: [employeeClass] = "1915", [firstName] = "Anna", [lastName] = "Johnson"
  • Salida de expresión: anna.johnson@fabrikam.com (o 01anna.johnson@fabrikam.com si se toma la primera opción)

Apóstrofo y control de caracteres especiales

Escenario 1: debe quitar apóstrofos y guiones de direcciones de correo electrónico para la compatibilidad de Azure AD Connect.

Atributo de destino: correo

SelectUniqueValue(
  Switch ([divisionId], 
    Replace(Join("@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , ), 
    "8900", [email]
  ), 
  Replace(Join("1@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , ), 
  Replace(Join("2@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , )
)

Ejemplo:

  • Valores de entrada: [divisionId] = "1200", [preferredName] = "Mary-Ann", [firstName] = "Mary", [lastName] = "O'Connor"
  • Salida de expresión: maryann.oconnor@contoso.com (apóstrofos y guiones eliminados)
  • Entrada alternativa: [divisionId] = "8900", [email] = "existing.user@company.com"
  • Salida alternativa: existing.user@company.com

Generación de direcciones SIP

Escenario 1: quiere generar direcciones SIP para la integración de Skype Empresarial/Teams.

Atributo de destino: proxyAddresses

SelectUniqueValue( 
    Append("sip:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
    Append("sip:", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
    Append("sip:", Join("02@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"))
)

Ejemplo:

  • Valores de entrada: [firstName] = "David", [lastName] = "Wilson"
  • Salida de expresión: sip:david.wilson@contoso.com (o sip:01david.wilson@contoso.com si se toma la primera opción)
  • Entrada alternativa: [firstName] = "María José", [lastName] = "González-Pérez"
  • Salida alternativa: sip:mariajose.gonzalezperez@contoso.com (o sip:01mariajose.gonzalezperez@contoso.com si se toma la primera opción o sip:02mariajose.gonzalezperez@contoso.com si se toman las dos primeras)

Lógica condicional de reescritura

Escenario 1: quiere escribir condicionalmente direcciones de correo electrónico basadas en criterios de fecha específicos.

Atributo de destino: mailNickname

IgnoreFlowIfNullOrEmpty(IIF(DateDiff("d", Now(), CDate([extensionAttribute9])) <> 1, "", [mail]))

Ejemplo:

  • Valores de entrada: [extensionAttribute9] = "2025-07-31", [mail] = "user@company.com" (fecha actual: 2025-07-30)
  • Salida de expresión: (vacía: omitida, ya que la diferencia de fecha es de 1 día)
  • Entrada alternativa: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com"
  • Salida alternativa: user@company.com

Escenario 2: debe controlar los atributos que faltan en escenarios de reescritura.

Atributo de destino: mailNickname

IgnoreFlowIfNullOrEmpty(IIF(IsPresent([extensionAttribute9]),IIF(DateDiff("d", Now(), CDate([extensionAttribute9])) <> 1, "", [mail]),"noemail@contoso.com"))

Ejemplo:

  • Valores de entrada: [extensionAttribute9] = "" (vacío), [mail] = "user@company.com"
  • Salida de expresión: noemail@contoso.com
  • Entrada alternativa: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com" (fecha actual: 2025-07-30)
  • Salida alternativa: user@company.com

procedimientos recomendados

  • Use SelectUniqueValue para todos los atributos que requieren unicidad (UPN, samAccountName, email).

  • Controle valores NULL y vacíos mediante funciones como IsNullOrEmpty, IsPresent, Switcho Coalesce.

  • Use NormalizeDiacritics y StripSpaces al procesar nombres para garantizar la compatibilidad entre sistemas.

  • Valide las expresiones JSONPath en un evaluador de JSONPath antes de implementar en producción.

  • Use el formato de fecha adecuado al trabajar con campos de fecha de SuccessFactors para evitar errores de conversión.

  • Considere las zonas horarias al trabajar con comparaciones de fechas y lógica de expiración de cuentas.

  • Use IgnoreFlowIfNullOrEmpty para flujos de atributos condicionales y escenarios de escritura diferida.

  • Pruebe exhaustivamente las instrucciones Switch complejas, ya que pueden resultar difíciles de depurar.

  • Documente claramente la lógica de negocios , especialmente para las reglas complejas de estado de empleo y administración de cuentas.

  • Use los patrones regex cuidadosamente y validelos en evaluadores de regex en línea antes de la implementación.

Más recursos