Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
- Generación de direcciones de correo electrónico
- Lógica de administración de cuentas
- Funciones de fecha y expiración de la cuenta
- Asignación de unidad organizativa (OU)
- Procesamiento de nombres y nombres para mostrar
- Generación samAccountName
- Configuración de ProxyAddresses
- Procesamiento de números de teléfono
- Lógica basada en país y ubicación
- Clasificación de empleados y trabajadores contingentes
- Escenarios avanzados
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(ojohn.m.smith@contoso.comsi 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(oJose A Garciasi se toma la primera opción oJose Antonio Garciasi 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(oGarcia2, Mikesi se toma la primera opción, etc.) - Entrada alternativa: [lastName] = "Smith", [preferredName] = "", [firstName] = "John"
-
Salida alternativa:
Smith, John(oSmith2, Johnsi 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(ojgarcialopez1si se toma la primera opción ojgarcialopez2si 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(ochandersonsi se toma la primera opción ochrandersonsi se toman las dos primeras) - Entrada alternativa: [firstName] = "María", [lastName] = "Rodríguez-Santos"
-
Salida alternativa:
mrodriguezsantos(omarodriguezsantossi se toma la primera opción omarrodriguezsantossi 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(oSMTP:trinidad.j.williams@contoso.comsi se toma la primera opción) - Entrada alternativa: [company] = "National Energy", [firstName] = "Rebecca", [lastName] = "Thompson", [middleName] = "Marie"
-
Salida alternativa:
SMTP:r.thompson@fabrikam.com(oSMTP:r.m.thompson@fabrikam.comsi 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 oSMTP:david.p.jones@contoso.comsi 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(o1raj.patel@fabrikam.comsi se toma la primera opción) - Entrada alternativa: [country] = "Países Bajos", [firstName] = "Jan", [lastName] = "van der Berg"
-
Salida alternativa:
jan.vanderberg@contoso.com(o1jan.vanderberg@contoso.comsi se toma la primera opción) - Entrada alternativa: [country] = "Alemania", [firstName] = "Klaus", [lastName] = "Müller"
-
Salida alternativa:
klaus.muller@fabrikam.com(dominio predeterminado o1klaus.muller@fabrikam.comsi 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(o01anna.johnson@fabrikam.comsi 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(osip:01david.wilson@contoso.comsi se toma la primera opción) - Entrada alternativa: [firstName] = "María José", [lastName] = "González-Pérez"
-
Salida alternativa:
sip:mariajose.gonzalezperez@contoso.com(osip:01mariajose.gonzalezperez@contoso.comsi se toma la primera opción osip:02mariajose.gonzalezperez@contoso.comsi 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,SwitchoCoalesce.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.