Fonctions de mappage d’expressions SuccessFactors pour le provisionnement d’ID Microsoft Entra

Cet article fournit un guide complet pour les fonctions de mappage d’expressions couramment utilisées lors de la configuration de SuccessFactors sur le provisionnement d’utilisateurs Microsoft Entra ID. Ces fonctions permettent de transformer et de mapper des données de SuccessFactors pour créer des attributs utilisateur appropriés dans l’ID Microsoft Entra.

Table des matières

Fonctions de manipulation de chaînes

Opérations de chaîne de base

Scénario 1 : Vous souhaitez remplir un ID de personne avec des zéros de début pour créer une chaîne de 8 caractères.

Attribut cible : employeeId

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

Exemple:

  • Valeurs d’entrée : [personIdExternal] = « 12345 »
  • Sortie de l’expression : 00012345

Scénario 2 : Vous devez remplir le centre de coûts avec des zéros de début pour le rendre à 10 caractères.

Attribut cible : extensionAttribute1

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

Exemple:

  • Valeurs d’entrée : [costCenterId] = « 567 »
  • Sortie de l’expression : 0000000567

Scénario 3 : Vous souhaitez créer un ID d’employé en ajoutant un préfixe à un numéro d’employé rembourré.

Attribut cible : employeeId

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

Exemple:

  • Valeurs d’entrée : [employeeId] = « 789 »
  • Sortie de l’expression : 05000789

Conversion de cas de texte

Scénario 1 : Vous devez convertir des noms de tous les majuscules en casse appropriée (case de titre).

Attribut cible : sn

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

Exemple:

  • Valeurs d’entrée : [lastName] = « JOHNSON »
  • Sortie de l’expression : Johnson

Scénario 2 : Vous souhaitez créer un nom complet avec une mise en forme appropriée de la casse.

Attribut cible : displayName

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

Exemple:

  • Valeurs d’entrée : [lastName] = « SMITH », [firstName] = « JOHN »
  • Sortie de l’expression : Smith, John

Scénario 3 : Vous devez gérer les noms par des espaces en remplaçant les espaces par des points.

Attribut cible : givenName

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

Exemple:

  • Valeurs d’entrée : [firstName] = « Mary Ann »
  • Sortie de l’expression : Mary.Ann

Génération d’adresses e-mail

Génération de messagerie de base

Scénario 1 : Vous souhaitez générer des adresses e-mail à l’aide du prénom et du nom avec des domaines spécifiques à l’entreprise.

Attribut cible : courrier électronique

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")
    )
)

Exemple:

  • Valeurs d’entrée : [company] = « Contoso », [firstName] = « John », [lastName] = « Smith », [middleName] = « Michael »
  • Sortie de l’expression : john.smith@contoso.com (ou john.m.smith@contoso.com si la première option est prise)

Génération d’e-mail basée sur un groupe d’employés

Scénario 1 : Vous souhaitez générer différents formats de courrier en fonction de la classification des employés (permanente ou temporaire).

Attribut cible : 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")
)))

Exemple:

  • Valeurs d’entrée : [custom06] = « Temporary », [firstName] = « Sarah », [lastName] = « Wilson »
  • Sortie de l’expression : sarah.wilson_ext@ltts.com

Validation du domaine d’entreprise

Scénario 1 : Vous souhaitez uniquement transmettre des adresses e-mail appartenant à un domaine d’entreprise spécifique.

Attribut cible : courrier électronique

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

Exemple:

  • Valeurs d’entrée : [emailAddress] = « john.doe@contoso.com »
  • Sortie de l’expression : john.doe@contoso.com
  • Autre entrée : [emailAddress] = « john.doe@external.com »
  • Autre sortie : (vide - ignoré)

Conservation des e-mails existante

Scénario 1 : Vous souhaitez utiliser l’e-mail existant de SuccessFactors pour certaines divisions, mais en générer de nouveaux pour d’autres.

Attribut cible : 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")
)

Exemple:

  • Valeurs d’entrée : [divisionId] = « 8900 », [email] = « existing.user@company.com », [firstName] = « Mike », [lastName] = « Brown »
  • Sortie de l’expression : existing.user@company.com
  • Entrée alternative : [divisionId] = « 1200 », [firstName] = « Mike », [lastName] = « Brown »
  • Autre sortie : mike.brown@contoso.com

Logique de gestion des comptes

État du compte de base

Scénario 1 : Vous souhaitez déterminer si un compte doit être désactivé en fonction de l’état de l’emploi.

Attribut cible : accountDisabled

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

Exemple:

  • Valeurs d’entrée : [emplStatus] = « 741 »
  • Sortie de l’expression : False (compte activé)
  • Entrée alternative : [emplStatus] = « 746 »
  • Autre sortie : True (compte désactivé)

Masquer dans la logique des listes d’adresses

Scénario 1 : Vous devez définir l’attribut msExchHideFromAddressLists en fonction des dates de début et de fin.

Attribut cible : 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")

Exemple:

  • Valeurs d’entrée : [startDate] = « 2025-01-15 », [endDate] = « 2025-12-31 » (date actuelle : 2025-07-30)
  • Sortie de l’expression : FALSE (non masquée dans les listes d’adresses)
  • Entrée alternative : [startDate] = « 2025-01-15 », [endDate] = « 2025-06-30 »
  • Autre sortie : TRUE (masquée dans les listes d’adresses)

Logique d’état d’employé complexe

Scénario 1 : Vous avez une exigence complexe pour désactiver les comptes en fonction des champs personnalisés et des dates d’embauche.

Attribut cible : 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"
))

Exemple:

  • Valeurs d’entrée : [empNavCustomString3] = « 62220 », [cust_hiredate] = « 2025-07-27 », [cust_customDate67] = « 2025-07-30 » (date actuelle : 2025-07-30)
  • Sortie de l’expression : False (compte activé)
  • Autre entrée : [empNavCustomString3] = « 62220 », [cust_hiredate] = « 2025-07-27 », [cust_customDate67] = « 2025-07-29 »
  • Autre sortie : True (compte désactivé)

Fonctions de date et expiration du compte

Expiration du compte de base

Scénario 1 : Vous souhaitez définir l’expiration du compte en fonction de la date de fin de SuccessFactors.

Attribut cible : accountExpires

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

Exemple:

  • Valeurs d’entrée : [endDate] = « 12/31/2025 12:00:00 AM »
  • Sortie de l’expression : 133835135990000000 (représentation numérique de 2025-12-31 23:59:59-05:00)
  • Autre entrée : [endDate] = «  » (vide)
  • Autre sortie : 9223372036854775807 (jamais expire)

Expiration basée sur le type d’emploi

Scénario 1 : Vous devez définir différentes règles d’expiration de compte en fonction du type d’emploi (permanent ou entrepreneur).

Attribut cible : 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"))
)

Exemple:

  • Valeurs d’entrée : [employmentType] = « PM », [DOB] = « 1/15/1990 12:00:00 AM »
  • Sortie de l’expression : 158488415990000000 (représentation numérique de 2050-01-15 23:59:59-05:00, 60 ans après la naissance)
  • Entrée alternative : [employmentType] = « CON », [endDate] = « 12/31/2025 12:00:00 AM »
  • Autre sortie : 133835135990000000 (représentation numérique de 2025-12-31 23:59:59-05:00)

Expiration du compte basé sur la raison de l’événement

Scénario 1 : Vous souhaitez définir l’expiration du compte en fonction des événements d’arrêt spécifiques et des dates de départ.

Attribut cible : 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"))
)

Exemple:

  • Valeurs d’entrée : [event] = « SEVUNSATP », [severanceStartDate] = « 8/15/2025 12:00:00 AM »
  • Sortie de l’expression : 133877247990000000 (représentation numérique de 2025-08-15 23:59:59-08:00)
  • Autre entrée : [event] = « REGULAR », [latestTerminationDate] = « 9/30/2025 12:00:00 AM »
  • Autre sortie : 133886207990000000 (représentation numérique de 2025-09-30 23:59:59-08:00)

Gestion des formats de date

Scénario 1 : Vous devez gérer des dates non valides telles que « 12/31/9999 » qui provoquent des erreurs dans NumFromDate.

Attribut cible : 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")
)

Exemple:

  • Valeurs d’entrée : [endDate] = « 12/31/9999 12:00:00 AM »
  • Sortie de l’expression : 441481535990000000 (représentation numérique de 2099-12-31T23:59:59-04:00)
  • Autre entrée : [endDate] = « 8/15/2025 12:00:00 AM »
  • Autre sortie : 133877283990000000 (représentation numérique de 2025-08-15T23:59:59-04:00)

Affectation d’unité d’organisation (UO)

Affectation d’unité d’organisation basée sur le service

Scénario 1 : Vous souhaitez placer des utilisateurs dans différentes unités d’organisation en fonction de leur service.

Attribut cible : 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"
)

Exemple:

  • Valeurs d’entrée : [department] = « Engineering SG »
  • Sortie de l’expression : OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com
  • Autre entrée : [department] = « Marketing »
  • Autre sortie : OU=SuccessFactors,DC=contoso,DC=com (par défaut)

Affectation d’unité d’organisation basée sur l’état de l’emploi

Scénario 1 : Vous devez affecter des utilisateurs à différentes unités d’organisation en fonction de leur statut d’emploi et de leur emplacement.

Attribut cible : 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")

Exemple:

  • Valeurs d’entrée : [emplStatus] = « 741 », [empJobNavCustomString13] = « LOC1015 », [departmentId] = « DU1026 »
  • Sortie de l’expression : OU=IT,OU=Bangalore,DC=contoso,DC=com
  • Autre entrée : [emplStatus] = « 749 », [empJobNavCustomString13] = « LOC1016 »
  • Autre sortie : OU=O365-NoSYNC,OU=Mysore,DC=contoso,DC=com
  • Autre entrée : [emplStatus] = « 741 », [empJobNavCustomString13] = « LOC9999 » (non défini)
  • Autre sortie : OU=SFProvisoinngUsers,DC=contoso,DC=com (par défaut)

Affectation d’unité d’organisation basée sur le pays

Scénario 1 : Vous souhaitez placer des utilisateurs dans différents unités d’organisation en fonction de leur pays avec une unité d’organisation désactivée pour les utilisateurs inactifs.

Attribut cible : 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"
)

Exemple:

  • Valeurs d’entrée : [activeEmploymentsCount] = « 1 », [country] = « Mexico »
  • Sortie de l’expression : OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com
  • Autre entrée : [activeEmploymentsCount] = « 0 », [country] = « Suède »
  • Autre sortie : OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com (les utilisateurs désactivés accèdent à une unité d’organisation spéciale, quel que soit le pays)
  • Autre entrée : [activeEmploymentsCount] = « 1 », [country] = « Allemagne »
  • Autre sortie : OU=Accounts,DC=corp,DC=contoso,DC=com (unité d’organisation par défaut pour les pays non spécifiquement définis)

Traitement des noms et noms d’affichage

Génération de nom commun (CN)

Scénario 1 : Vous souhaitez générer un nom commun unique avec des options de secours pour les doublons.

Attribut cible : cn

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

Exemple:

  • Valeurs d’entrée : [firstName] = « José », [lastName] = « García », [middleName] = « Antonio »
  • Sortie de l’expression : Jose Garcia (ou Jose A Garcia si la première option est prise, ou Jose Antonio Garcia si les deux premières sont prises)

Nom complet avec noms préférés

Scénario 1 : Vous devez créer un nom complet qui utilise le nom préféré lorsqu’il est disponible, sinon revient au prénom.

Attribut cible : 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), )))

Exemple:

  • Valeurs d’entrée : [lastName] = « JOHNSON », [preferredName] = « Mike », [firstName] = « Michael »
  • Sortie de l’expression : Johnson, Mike
  • Entrée alternative : [lastName] = « SMITH », [preferredName] = «  », [firstName] = « Robert »
  • Autre sortie : Smith, Robert

Nom complet avec suffixes numériques

Scénario 1 : Vous souhaitez générer des noms d’affichage uniques avec des suffixes numériques pour les doublons.

Attribut cible : 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])))
)

Exemple:

  • Valeurs d’entrée : [lastName] = « García », [preferredName] = « Mike », [firstName] = « Michael »
  • Sortie de l’expression : Garcia, Mike (ou Garcia2, Mike si la première option est prise, etc.)
  • Autre entrée : [lastName] = « Smith », [preferredName] = «  », [firstName] = « John »
  • Autre sortie : Smith, John (ou Smith2, John si la première option est prise, etc.)

Génération SamAccountName

Génération samAccountName de base

Scénario 1 : Vous souhaitez créer un samAccountName à l’aide du prénom initial et du nom avec une réinitialisation appropriée des caractères.

Attribut cible : 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")
)

Exemple:

  • Valeurs d’entrée : [firstName] = « José », [lastName] = « García-López »
  • Sortie de l’expression : jgarcialopez (ou jgarcialopez1 si la première option est prise, ou jgarcialopez2 si les deux premières sont prises)

SamAccountName avec longueur de prénom variable

Scénario 1 : Vous souhaitez gérer les doublons en augmentant le nombre de caractères du prénom.

Attribut cible : 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), , "(\\.)*$", , "", , )
)

Exemple:

  • Valeurs d’entrée : [firstName] = « Christopher », [lastName] = « Anderson »
  • Sortie de l’expression : canderson (ou chanderson si la première option est prise, ou chranderson si les deux premières sont prises)
  • Alternative Input : [firstName] = « María », [lastName] = « Rodríguez-Santos »
  • Autre sortie : mrodriguezsantos (ou marodriguezsantos si la première option est prise, ou marrodriguezsantos si les deux premières sont prises)

SamAccountName à partir d’un nom d’utilisateur externe

Scénario 1 : Vous souhaitez extraire la partie nom d’utilisateur d’un nom d’utilisateur externe de style e-mail.

Attribut cible : sAMAccountName

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

Exemple:

  • Valeurs d’entrée : [username] = « john.smith@external.com »
  • Sortie de l’expression : johnsmith

Configuration de ProxyAddresses

Configuration de proxyAddresses de base

Scénario 1 : Vous souhaitez définir plusieurs adresses proxy, notamment les adresses SMTP primaires et secondaires.

Attribut cible : 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"))
    ), 
    ","
)

Exemple:

  • Valeurs d’entrée : [personIdExternal] = « 12345 », [firstName] = « John », [lastName] = « Smith »
  • Sortie de l’expression : ["smtp:A12345@contoso.mail.onmicrosoft.com", "smtp:A12345@contoso.com", "SMTP:John.Smith@contoso.com"]

ProxyAddresses basé sur la division

Scénario 1 : Vous avez besoin de différentes configurations d’adresses proxy en fonction de la division des employés.

Attribut cible : 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])
        )
    ),
    ","	
)

Exemple:

  • Valeurs d’entrée : [divisionId] = « STANDARD », [personIdExternal] = « 67890 », [firstName] = « Sarah », [lastName] = « Johnson »
  • Sortie de l’expression : ["smtp:A67890@woodgrove.mail.onmicrosoft.com", "smtp:A67890@woodgrove.com", "SMTP:Sarah.Johnson@woodgrove.com"]
  • Entrée alternative : [divisionId] = « EXEC », [firstName] = « Michael », [lastName] = « Brown », [email] = « mbrown@fabrikam.com »
  • Autre sortie : ["smtp:Michael.Brown@contoso.com", "SMTP:mbrown@fabrikam.com"]

ProxyAddresses spécifiques à l’entreprise

Scénario 1 : Vous souhaitez générer des adresses proxy en fonction de l’affiliation de l’entreprise.

Attribut cible : 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"))
    )
)

Exemple:

  • Valeurs d’entrée : [company] = « NGC », [firstName] = « Trinidad », [lastName] = « Williams », [middleName] = « James »
  • Sortie de l’expression : SMTP:trinidad.williams@contoso.com (ou SMTP:trinidad.j.williams@contoso.com si la première option est prise)
  • Alternative Input : [company] = « National Energy », [firstName] = « Rebecca », [lastName] = « Thompson », [middleName] = « Marie »
  • Autre sortie : SMTP:r.thompson@fabrikam.com (ou SMTP:r.m.thompson@fabrikam.com si la première option est prise)
  • Alternative Input : [company] = « Other Company », [firstName] = « David », [lastName] = « Jones », [middleName] = « Paul »
  • Autre sortie : SMTP:david.jones@contoso.com (domaine par défaut ou SMTP:david.p.jones@contoso.com si la première option est prise)

Traitement des numéros de téléphone

Extraction de numéros de téléphone de base

Scénario 1 : Vous souhaitez extraire la partie numéro de téléphone sans code de pays.

Attribut cible : telephoneNumber

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

Exemple:

  • Valeurs d’entrée : [mobile] = « +1 (555) 123-4567 »
  • Sortie de l’expression : 5551234567

Scénario 2 : Vous devez extraire uniquement le code du pays à partir d’un numéro de téléphone.

Attribut cible : c

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

Exemple:

  • Valeurs d’entrée : [mobile] = « +44 20 7946 0958 »
  • Sortie de l’expression : 44

Numéros de téléphone par défaut

Scénario 1 : Vous souhaitez fournir des numéros de téléphone par défaut lorsque le champ est vide.

Attribut cible : telephoneNumber

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

Exemple:

  • Valeurs d’entrée : [telephoneNumber] = «  »
  • Sortie de l’expression : 000-000-0000
  • Entrée alternative : [mobile] = « 555-123-4567 »
  • Autre sortie : 555-123-4567

Logique du téléphone principal

Scénario 1 : Vous devez déterminer quel numéro de téléphone doit être marqué comme principal.

Attribut cible : 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")

Exemple:

  • Valeurs d’entrée : [businessPhoneIsPrimary] = « true », [cellPhoneIsPrimary] = « false »
  • Sortie de l’expression : business phone is primary
  • Autre entrée : [businessPhoneIsPrimary] = « false », [cellPhoneIsPrimary] = « true »
  • Autre sortie : cell phone is primary
  • Autre entrée : [businessPhoneIsPrimary] = «  », [cellPhoneIsPrimary] = « true »
  • Autre sortie : cell phone is primary

Logique basée sur le pays et l’emplacement

Mappage de code de pays

Scénario 1 : Vous souhaitez mapper les noms de pays aux codes de pays ISO.

Attribut cible : c

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

Exemple:

  • Valeurs d’entrée : [pays] = « Trinité-et-Tobago »
  • Sortie de l’expression : TT

Scénario 2 : Vous devez mapper des pays à des codes de pays numériques.

Attribut cible : countryCode

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

Exemple:

  • Valeurs d’entrée : [pays] = « Barbade »
  • Sortie de l’expression : 52

Domaines de messagerie basés sur l’emplacement

Scénario 1 : Vous souhaitez affecter différents domaines de messagerie en fonction de l’emplacement géographique.

Attribut cible : courrier électronique

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")
    )
)

Exemple:

  • Valeurs d’entrée : [country] = « India », [firstName] = « Raj », [lastName] = « Patel »
  • Sortie de l’expression : raj.patel@fabrikam.com (ou 1raj.patel@fabrikam.com si la première option est prise)
  • Autre entrée : [country] = « Pays-Bas », [firstName] = « Jan », [lastName] = « van der Berg »
  • Autre sortie : jan.vanderberg@contoso.com (ou 1jan.vanderberg@contoso.com si la première option est prise)
  • Alternative Input : [country] = « Germany », [firstName] = « Klaus », [lastName] = « Müller »
  • Autre sortie : klaus.muller@fabrikam.com (domaine par défaut ou 1klaus.muller@fabrikam.com si la première option est prise)

Classification des employés et travailleurs contingents

Classification des types d’emploi

Scénario 1 : Vous souhaitez mapper des codes de type d’employé à des descriptions lisibles.

Attribut cible : extensionAttribute3

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

Exemple:

  • Valeurs d’entrée : [employeeType] = « 31202 »
  • Sortie de l’expression : Employee
  • Autre entrée : [employeeType] = « 99999 »
  • Autre sortie : Default-value

Identification des travailleurs contingents

Scénario 1 : Vous devez identifier et gérer les travailleurs contingents différemment.

Attribut cible : extensionAttribute4

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

Exemple:

  • Valeurs d’entrée : [isContingentWorker] = « True »
  • Sortie de l’expression : Contractor

Mappage de titre personnel

Scénario 1 : Vous souhaitez mapper les codes de titre personnels aux titres appropriés.

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

Exemple:

  • Valeurs d’entrée : [personalTitle] = « 4443 »
  • Sortie de l’expression : Dr.
  • Entrée alternative : [personalTitle] = «  »
  • Autre sortie : (vide - ignoré)

Scénarios avancés

Gestion des services conditionnels

Scénario 1 : Vous souhaitez utiliser le service d’affectation globale lorsqu’il est disponible ; sinon, revenez au service normal.

Attribut cible : service

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

Exemple:

  • Valeurs d’entrée : [globalAssignmentDepartment] = « Global IT », [department] = « Local IT »
  • Sortie de l’expression : Global IT
  • Autre entrée : [globalAssignmentDepartment] = «  », [department] = « Sales »
  • Autre sortie : Sales

Gestion réversible des e-mails de suppression réversible

Scénario 1 : Vous devez modifier les adresses e-mail lorsque les utilisateurs sont supprimés de manière réversible pour les scénarios d’écriture différée.

Attribut cible : courrier électronique

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

Exemple:

  • Valeurs d’entrée : [IsSoftDeleted] = « True », [mail] = « john.smith@company.com » (date actuelle : 2025-07-30)
  • Sortie de l’expression : 2025-07-30_john.smith@company.com
  • Entrée alternative : [IsSoftDeleted] = « False », [mail] = « jane.doe@company.com »
  • Autre sortie : jane.doe@company.com

Affectation d’unité d’organisation complexe avec une logique d’arrêt

Scénario 1 : Vous souhaitez déplacer des utilisateurs arrêtés vers une unité d’organisation spéciale après un nombre spécifique de jours.

Attribut cible : 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"
    )
)

Exemple:

  • Valeurs d’entrée : [latestTerminationDate] = « 2025-07-10 », [department] = « Engineering » (date actuelle : 2025-07-30)
  • Sortie de l’expression : OU=DELETED,DC=company,DC=com (terminé il y a plus de 14 jours)
  • Entrée alternative : [latestTerminationDate] = « 2025-07-25 », [department] = « Finance »
  • Autre sortie : OU=Finance,DC=company,DC=com (terminée il y a moins de 14 jours)

Génération UPN multi-entreprise avec classe d’employés

Scénario 1 : Vous devez générer des UPN en fonction des informations de classe d’entreprise et d’employé.

Attribut cible : 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")
    )
)

Exemple:

  • Valeurs d’entrée : [employeeClass] = « 1915 », [firstName] = « Anna », [lastName] = « Johnson »
  • Sortie de l’expression : anna.johnson@fabrikam.com (ou 01anna.johnson@fabrikam.com si la première option est prise)

Apostrophe et gestion spéciale des caractères

Scénario 1 : Vous devez supprimer les apostrophes et les tirets des adresses e-mail pour la compatibilité d’Azure AD Connect.

Attribut cible : courrier électronique

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"), , "['-]+", , "", , )
)

Exemple:

  • Valeurs d’entrée : [divisionId] = « 1200 », [preferredName] = « Mary-Ann », [firstName] = « Mary », [lastName] = « O’Connor »
  • Sortie de l’expression : maryann.oconnor@contoso.com (apostrophes et tirets supprimés)
  • Entrée alternative : [divisionId] = « 8900 », [email] = « existing.user@company.com »
  • Autre sortie : existing.user@company.com

Génération d’adresses SIP

Scénario 1 : Vous souhaitez générer des adresses SIP pour l’intégration de Skype Entreprise/Teams.

Attribut cible : 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"))
)

Exemple:

  • Valeurs d’entrée : [firstName] = « David », [lastName] = « Wilson »
  • Sortie de l’expression : sip:david.wilson@contoso.com (ou sip:01david.wilson@contoso.com si la première option est prise)
  • Alternative Input : [firstName] = « María José », [lastName] = « González-Pérez »
  • Autre sortie : sip:mariajose.gonzalezperez@contoso.com (ou sip:01mariajose.gonzalezperez@contoso.com si la première option est prise, ou sip:02mariajose.gonzalezperez@contoso.com si les deux premières sont prises)

Logique conditionnelle d’écriture différée

Scénario 1 : Vous souhaitez réécrire conditionnellement des adresses e-mail en fonction de critères de date spécifiques.

Attribut cible : mailNickname

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

Exemple:

  • Valeurs d’entrée : [extensionAttribute9] = « 2025-07-31 », [mail] = « user@company.com » (date actuelle : 2025-07-30)
  • Sortie de l’expression : (vide - ignoré, car la différence de date est de 1 jour)
  • Autre entrée : [extensionAttribute9] = « 2025-08-01 », [mail] = « user@company.com »
  • Autre sortie : user@company.com

Scénario 2 : Vous devez gérer les attributs manquants dans les scénarios d’écriture différée.

Attribut cible : mailNickname

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

Exemple:

  • Valeurs d’entrée : [extensionAttribute9] = «  » (vide), [mail] = « user@company.com »
  • Sortie de l’expression : noemail@contoso.com
  • Autre entrée : [extensionAttribute9] = « 2025-08-01 », [mail] = « user@company.com » (date actuelle : 2025-07-30)
  • Autre sortie : user@company.com

Meilleures pratiques

  • Utilisez SelectUniqueValue pour tous les attributs qui nécessitent unicité (UPN, samAccountName, email).

  • Gérez les valeurs null et vides à l’aide de fonctions telles que IsNullOrEmpty, , IsPresentSwitchou Coalesce.

  • Utilisez NormalizeDiacritics et StripSpaces lors du traitement des noms pour garantir la compatibilité entre les systèmes.

  • Validez les expressions JSONPath dans un testeur JSONPath avant d’implémenter en production.

  • Utilisez une mise en forme de date appropriée lors de l’utilisation des champs de date SuccessFactors pour éviter les erreurs de conversion.

  • Tenez compte des fuseaux horaires lors de l’utilisation des comparaisons de dates et de la logique d’expiration du compte.

  • Utilisez IgnoreFlowIfNullOrEmpty pour les flux d’attributs conditionnels et les scénarios d’écriture différée.

  • Testez soigneusement les instructions Switch complexes , car elles peuvent devenir difficiles à déboguer.

  • Documentez clairement la logique métier , en particulier pour les règles complexes d’état d’emploi et de gestion des comptes.

  • Utilisez soigneusement des modèles regex et validez-les dans des testeurs regex en ligne avant l’implémentation.

Autres ressources