Funções de mapeamento de expressão SuccessFactors para provisionamento de ID do Microsoft Entra

Este artigo fornece um guia abrangente para funções de mapeamento de expressão comumente usadas ao configurar SuccessFactors para provisionamento de usuário do Microsoft Entra ID. Essas funções ajudam a transformar e mapear dados de SuccessFactors para criar atributos de usuário apropriados no Microsoft Entra ID.

Índice

Funções de manipulação de cadeia de caracteres

Operações básicas de cadeia de caracteres

Cenário 1: Você deseja preencher um ID de pessoa com zeros à esquerda para criar uma cadeia de caracteres de 8 caracteres.

Atributo de destino: employeeId

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

Exemplo:

  • Valores de entrada: [personIdExternal] = "12345"
  • Saída de expressão: 00012345

Cenário 2: Você precisa preencher o centro de custo com zeros à esquerda para torná-lo 10 caracteres.

Atributo de destino: extensionAttribute1

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

Exemplo:

  • Valores de entrada: [costCenterId] = "567"
  • Saída de expressão: 0000000567

Cenário 3: Você deseja criar uma ID de funcionário anexando um prefixo a um número de funcionário acolchoado.

Atributo de destino: employeeId

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

Exemplo:

  • Valores de entrada: [employeeId] = "789"
  • Saída de expressão: 05000789

Conversão de maiúsculas e minú

Cenário 1: Você precisa converter nomes de todas as letras maiúsculas para maiúsculas (Title Case).

Atributo de destino: sn

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

Exemplo:

  • Valores de entrada: [lastName] = "JOHNSON"
  • Saída de expressão: Johnson

Cenário 2: Você deseja criar um nome de exibição com formatação de maiúsculas e minúsculas adequada.

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

Exemplo:

  • Valores de entrada: [lastName] = "SMITH", [firstName] = "JOHN"
  • Saída de expressão: Smith, John

Cenário 3: Você precisa lidar com nomes com espaços substituindo espaços por pontos.

Atributo de destino: givenName

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

Exemplo:

  • Valores de entrada: [firstName] = "Mary Ann"
  • Saída de expressão: Mary.Ann

Geração de endereços de e-mail

Geração básica de e-mails

Cenário 1: Você deseja gerar endereços de e-mail usando nome e sobrenome com domínios específicos da empresa.

Atributo de destino: mail

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

Exemplo:

  • Valores de entrada: [empresa] = "Contoso", [firstName] = "John", [lastName] = "Smith", [middleName] = "Michael"
  • Saída de expressão: john.smith@contoso.com (ou john.m.smith@contoso.com se a primeira opção for tomada)

Geração de e-mail baseada em grupo de funcionários

Cenário 1: Você deseja gerar diferentes formatos de e-mail com base na classificação dos funcionários (permanente versus temporário).

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

Exemplo:

  • Valores de entrada: [custom06] = "Temporário", [firstName] = "Sarah", [lastName] = "Wilson"
  • Saída de expressão: sarah.wilson_ext@ltts.com

Validação de domínio corporativo

Cenário 1: Você deseja fluir apenas endereços de e-mail que pertencem a um domínio corporativo específico.

Atributo de destino: mail

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

Exemplo:

  • Valores de entrada: [emailAddress] = "john.doe@contoso.com"
  • Saída de expressão: john.doe@contoso.com
  • Entrada alternativa: [emailAddress] = "john.doe@external.com"
  • Saída alternativa: (vazio - ignorado)

Preservação de e-mail existente

Cenário 1: Você deseja usar o e-mail existente do SuccessFactors para determinadas divisões, mas gerar novas para outras.

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

Exemplo:

  • Valores de entrada: [divisionId] = "8900", [email] = "existing.user@company.com", [firstName] = "Mike", [lastName] = "Brown"
  • Saída de expressão: existing.user@company.com
  • Entrada alternativa: [divisionId] = "1200", [firstName] = "Mike", [lastName] = "Brown"
  • Saída alternativa: mike.brown@contoso.com

Lógica de gerenciamento de contas

Estado da conta básica

Cenário 1: Você deseja determinar se uma conta deve ser desativada com base no status de emprego.

Atributo de destino: accountDisabled

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

Exemplo:

  • Valores de entrada: [emplStatus] = "741"
  • Saída de expressão: False (conta habilitada)
  • Entrada alternativa: [emplStatus] = "746"
  • Saída alternativa: True (conta desativada)

Ocultar da lógica das listas de endereços

Cenário 1: Você precisa definir o atributo msExchHideFromAddressLists com base nas datas de início e fim.

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

Exemplo:

  • Valores de entrada: [startDate] = "2025-01-15", [endDate] = "2025-12-31" (data atual: 2025-07-30)
  • Saída de expressão: FALSE (não oculto das listas de endereços)
  • Entrada alternativa: [startDate] = "2025-01-15", [endDate] = "2025-06-30"
  • Saída alternativa: TRUE (oculta das listas de endereços)

Lógica complexa de status do funcionário

Cenário 1: Você tem um requisito complexo para desabilitar contas com base em campos personalizados e datas de contratação.

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

Exemplo:

  • Valores de entrada: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-30" (data atual: 2025-07-30)
  • Saída de expressão: False (conta habilitada)
  • Entrada alternativa: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-29"
  • Saída alternativa: True (conta desativada)

Funções de data e expiração da conta

Expiração básica da conta

Cenário 1: Você deseja definir a expiração da conta com base na data final 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"
)

Exemplo:

  • Valores de entrada: [endDate] = "31/12/2025 12:00:00 AM"
  • Saída de expressão: 133835135990000000 (representação numérica de 2025-12-31 23:59:59-05:00)
  • Entrada alternativa: [endDate] = "" (vazio)
  • Saída alternativa: 9223372036854775807 (nunca expira)

Expiração baseada no tipo de emprego

Cenário 1: Você precisa definir regras de expiração de conta diferentes com base no tipo de emprego (permanente versus contratante).

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

Exemplo:

  • Valores de entrada: [employmentType] = "PM", [DOB] = "15/01/1990 12:00:00 AM"
  • Saída de Expressão: 158488415990000000 (representação numérica de 2050-01-15 23:59:59-05:00, 60 anos após o nascimento)
  • Entrada alternativa: [employmentType] = "CON", [endDate] = "31/12/2025 12:00:00 AM"
  • Saída alternativa: 133835135990000000 (representação numérica de 2025-12-31 23:59:59-05:00)

Expiração da conta baseada no motivo do evento

Cenário 1: Você deseja definir a expiração da conta com base em eventos de encerramento específicos e datas de desligamento.

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

Exemplo:

  • Valores de entrada: [event] = "SEVUNSATP", [severanceStartDate] = "8/15/2025 12:00:00 AM"
  • Saída de expressão: 133877247990000000 (representação numérica de 2025-08-15 23:59:59-08:00)
  • Entrada alternativa: [event] = "REGULAR", [latestTerminationDate] = "9/30/2025 12:00:00 AM"
  • Saída alternativa: 133886207990000000 (representação numérica de 2025-09-30 23:59:59-08:00)

Tratamento de formato de data

Cenário 1: Você precisa lidar com datas inválidas como "31/12/9999" que causam erros em 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")
)

Exemplo:

  • Valores de entrada: [endDate] = "31/12/9999 12:00:00 AM"
  • Saída de expressão: 441481535990000000 (representação numérica de 2099-12-31T23:59:59-04:00)
  • Entrada alternativa: [endDate] = "15/08/2025 12:00:00 AM"
  • Saída alternativa: 133877283990000000 (representação numérica de 2025-08-15T23:59:59-04:00)

Atribuição de unidade organizacional (UO)

Atribuição de UO baseada em departamento

Cenário 1: Você deseja colocar os usuários em UOs diferentes com base em seu 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"
)

Exemplo:

  • Valores de entrada: [departamento] = "Engenharia SG"
  • Saída de expressão: OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com
  • Entrada alternativa: [departamento] = "Marketing"
  • Saída alternativa: OU=SuccessFactors,DC=contoso,DC=com (padrão)

Atribuição de UO baseada no status de emprego

Cenário 1: Você precisa atribuir usuários a UOs diferentes com base em seu status de emprego e localização.

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

Exemplo:

  • Valores de entrada: [emplStatus] = "741", [empJobNavCustomString13] = "LOC1015", [departmentId] = "DU1026"
  • Saída de expressão: OU=IT,OU=Bangalore,DC=contoso,DC=com
  • Entrada alternativa: [emplStatus] = "749", [empJobNavCustomString13] = "LOC1016"
  • Saída alternativa: OU=O365-NoSYNC,OU=Mysore,DC=contoso,DC=com
  • Entrada alternativa: [emplStatus] = "741", [empJobNavCustomString13] = "LOC9999" (não definido)
  • Saída alternativa: OU=SFProvisoinngUsers,DC=contoso,DC=com (padrão)

Atribuição de UO baseada no país

Cenário 1: Você deseja colocar usuários em UOs diferentes com base em seu país com uma UO desabilitada para usuários inativos.

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

Exemplo:

  • Valores de entrada: [activeEmploymentsCount] = "1", [country] = "México"
  • Saída de expressão: OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com
  • Entrada alternativa: [activeEmploymentsCount] = "0", [país] = "Suécia"
  • Saída alternativa: (usuários com deficiência vão para UO especial, OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com independentemente do país)
  • Entrada alternativa: [activeEmploymentsCount] = "1", [país] = "Alemanha"
  • Saída alternativa: OU=Accounts,DC=corp,DC=contoso,DC=com (UO padrão para países não definidos especificamente)

Processamento de nomes e nomes de exibição

Geração de denominação comum (NC)

Cenário 1: Você deseja gerar um nome comum exclusivo com opções de fallback para duplicatas.

Atributo de destino: cn

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

Exemplo:

  • Valores de entrada: [firstName] = "José", [lastName] = "García", [middleName] = "Antonio"
  • Saída de expressão: Jose Garcia (ou Jose A Garcia se a primeira opção for tomada, ou Jose Antonio Garcia se as duas primeiras forem tomadas)

Nome para exibição com nomes preferidos

Cenário 1: Você precisa criar um nome de exibição que use o nome preferencial quando disponível, caso contrário, recorre ao primeiro nome.

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

Exemplo:

  • Valores de entrada: [lastName] = "JOHNSON", [preferredName] = "Mike", [firstName] = "Michael"
  • Saída de expressão: Johnson, Mike
  • Entrada alternativa: [lastName] = "SMITH", [preferredName] = "", [firstName] = "Robert"
  • Saída alternativa: Smith, Robert

Nome para exibição com sufixos numéricos

Cenário 1: Você deseja gerar nomes de exibição exclusivos com sufixos numéricos para duplicatas.

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

Exemplo:

  • Valores de entrada: [lastName] = "García", [preferredName] = "Mike", [firstName] = "Michael"
  • Saída de expressão: Garcia, Mike (ou Garcia2, Mike se a primeira opção for tomada, etc.)
  • Entrada alternativa: [lastName] = "Smith", [preferredName] = "", [firstName] = "John"
  • Saída alternativa: Smith, John (ou Smith2, John se a primeira opção for tomada, etc.)

Geração de SamAccountName

Geração básica de samAccountName

Cenário 1: Você deseja criar um samAccountName usando o primeiro nome e o sobrenome com a limpeza de caracteres adequada.

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

Exemplo:

  • Valores de entrada: [firstName] = "José", [lastName] = "García-López"
  • Saída de expressão: jgarcialopez (ou jgarcialopez1 se a primeira opção for tomada, ou jgarcialopez2 se as duas primeiras forem tomadas)

SamAccountName com comprimento variável do nome próprio

Cenário 1: Você deseja lidar com duplicatas aumentando o número de caracteres do primeiro nome.

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

Exemplo:

  • Valores de entrada: [firstName] = "Christopher", [lastName] = "Anderson"
  • Saída de expressão: canderson (ou chanderson se a primeira opção for tomada, ou chranderson se as duas primeiras forem tomadas)
  • Entrada alternativa: [firstName] = "María", [lastName] = "Rodríguez-Santos"
  • Saída alternativa: mrodriguezsantos (ou marodriguezsantos se a primeira opção for tomada, ou marrodriguezsantos se as duas primeiras forem tomadas)

SamAccountName do nome de usuário externo

Cenário 1: Você deseja extrair a parte do nome de usuário de um nome de usuário externo no estilo de email.

Atributo de destino: sAMAccountName

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

Exemplo:

  • Valores de entrada: [username] = "john.smith@external.com"
  • Saída de expressão: johnsmith

Configuração de ProxyAddresses

Configuração básica de proxyAddresses

Cenário 1: Você deseja definir vários endereços proxy, incluindo endereços SMTP primários e secundários.

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

Exemplo:

  • Valores de entrada: [personIdExternal] = "12345", [firstName] = "John", [lastName] = "Smith"
  • Saída de expressão: ["smtp:A12345@contoso.mail.onmicrosoft.com", "smtp:A12345@contoso.com", "SMTP:John.Smith@contoso.com"]

ProxyAddresses baseados em divisão

Cenário 1: Você precisa de diferentes configurações de endereço proxy com base na divisão de funcionários.

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

Exemplo:

  • Valores de entrada: [divisionId] = "STANDARD", [personIdExternal] = "67890", [firstName] = "Sarah", [lastName] = "Johnson"
  • Saída de expressão: ["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"
  • Saída alternativa: ["smtp:Michael.Brown@contoso.com", "SMTP:mbrown@fabrikam.com"]

Endereços proxy específicos da empresa

Cenário 1: Você deseja gerar endereços proxy com base na afiliação da 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"))
    )
)

Exemplo:

  • Valores de entrada: [empresa] = "NGC", [firstName] = "Trinidad", [lastName] = "Williams", [middleName] = "James"
  • Saída de expressão: SMTP:trinidad.williams@contoso.com (ou SMTP:trinidad.j.williams@contoso.com se a primeira opção for tomada)
  • Entrada alternativa: [empresa] = "Energia Nacional", [firstName] = "Rebecca", [lastName] = "Thompson", [middleName] = "Marie"
  • Saída alternativa: SMTP:r.thompson@fabrikam.com (ou SMTP:r.m.thompson@fabrikam.com se a primeira opção for tomada)
  • Entrada alternativa: [empresa] = "Outra Empresa", [firstName] = "David", [lastName] = "Jones", [middleName] = "Paul"
  • Saída alternativa: SMTP:david.jones@contoso.com (domínio padrão, ou SMTP:david.p.jones@contoso.com se a primeira opção for tomada)

Processamento do número de telefone

Extração básica de número de telefone

Cenário 1: Você deseja extrair a parte do número de telefone sem o código do país.

Atributo de destino: phoneNumber

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

Exemplo:

  • Valores de entrada: [mobile] = "+1 (555) 123-4567"
  • Saída de expressão: 5551234567

Cenário 2: Você precisa extrair apenas o código do país de um número de telefone.

Atributo de destino: c

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

Exemplo:

  • Valores de entrada: [mobile] = "+44 20 7946 0958"
  • Saída de expressão: 44

Padrões de número de telefone

Cenário 1: Você deseja fornecer números de telefone padrão quando o campo estiver vazio.

Atributo de destino: phoneNumber

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

Exemplo:

  • Valores de entrada: [phoneNumber] = ""
  • Saída de expressão: 000-000-0000
  • Entrada alternativa: [mobile] = "555-123-4567"
  • Saída alternativa: 555-123-4567

Lógica do telefone principal

Cenário 1: Você precisa determinar qual número de telefone deve ser marcado 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")

Exemplo:

  • Valores de entrada: [businessPhoneIsPrimary] = "true", [cellPhoneIsPrimary] = "false"
  • Saída de expressão: business phone is primary
  • Entrada alternativa: [businessPhoneIsPrimary] = "false", [cellPhoneIsPrimary] = "true"
  • Saída alternativa: cell phone is primary
  • Entrada alternativa: [businessPhoneIsPrimary] = "", [cellPhoneIsPrimary] = "true"
  • Saída alternativa: cell phone is primary

Lógica baseada no país e na localização

Mapeamento de código de país

Cenário 1: Você deseja mapear nomes de países para códigos de país ISO.

Atributo de destino: c

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

Exemplo:

  • Valores de entrada: [país] = "Trinidad e Tobago"
  • Saída de expressão: TT

Cenário 2: Você precisa mapear países para códigos numéricos de país.

Atributo de destino: countryCode

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

Exemplo:

  • Valores de entrada: [país] = "Barbados"
  • Saída de expressão: 52

Domínios de e-mail baseados em localização

Cenário 1: Você deseja atribuir diferentes domínios de e-mail com base na localização geográfica.

Atributo de destino: mail

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

Exemplo:

  • Valores de entrada: [country] = "India", [firstName] = "Raj", [lastName] = "Patel"
  • Saída de expressão: raj.patel@fabrikam.com (ou 1raj.patel@fabrikam.com se a primeira opção for tomada)
  • Entrada alternativa: [país] = "Países Baixos", [firstName] = "jan", [lastName] = "van der Berg"
  • Saída alternativa: jan.vanderberg@contoso.com (ou 1jan.vanderberg@contoso.com se a primeira opção for tomada)
  • Entrada alternativa: [país] = "Alemanha", [nome] = "Klaus", [sobrenome] = "Müller"
  • Saída alternativa: klaus.muller@fabrikam.com (domínio padrão, ou 1klaus.muller@fabrikam.com se a primeira opção for tomada)

Classificação de empregados e trabalhadores contingentes

Classificação do tipo de emprego

Cenário 1: Você deseja mapear códigos de tipo de funcionário para descrições legíveis.

Atributo de destino: extensionAttribute3

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

Exemplo:

  • Valores de entrada: [employeeType] = "31202"
  • Saída de expressão: Employee
  • Entrada alternativa: [employeeType] = "99999"
  • Saída alternativa: Default-value

Identificação de trabalhadores contingentes

Cenário 1: Você precisa identificar e lidar com trabalhadores contingentes de forma diferente.

Atributo de destino: extensionAttribute4

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

Exemplo:

  • Valores de entrada: [isContingentWorker] = "True"
  • Saída de expressão: Contractor

Mapeamento de título pessoal

Cenário 1: Você deseja mapear códigos de título pessoais para títulos adequados.

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

Exemplo:

  • Valores de entrada: [personalTitle] = "4443"
  • Saída de expressão: Dr.
  • Entrada alternativa: [personalTitle] = ""
  • Saída alternativa: (vazio - ignorado)

Cenários avançados

Tratamento condicional do departamento

Cenário 1: Você deseja usar o departamento de atribuição global quando disponível, caso contrário, volte para o departamento regular.

Atributo de destino: departamento

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

Exemplo:

  • Valores de entrada: [globalAssignmentDepartment] = "Global IT", [department] = "Local IT"
  • Saída de expressão: Global IT
  • Entrada alternativa: [globalAssignmentDepartment] = "", [department] = "Sales"
  • Saída alternativa: Sales

Tratamento de e-mail de exclusão suave

Cenário 1: Você precisa modificar endereços de e-mail quando os usuários são excluídos suavemente para cenários de write-back.

Atributo de destino: mail

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

Exemplo:

  • Valores de entrada: [IsSoftDeleted] = "True", [mail] = "john.smith@company.com" (data atual: 2025-07-30)
  • Saída de expressão: 2025-07-30_john.smith@company.com
  • Entrada alternativa: [IsSoftDeleted] = "False", [mail] = "jane.doe@company.com"
  • Saída alternativa: jane.doe@company.com

Atribuição de UO complexa com lógica de terminação

Cenário 1: Você deseja mover usuários encerrados para uma UO especial após um número específico de dias.

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

Exemplo:

  • Valores de entrada: [latestTerminationDate] = "2025-07-10", [department] = "Engineering" (data atual: 2025-07-30)
  • Saída de expressão: OU=DELETED,DC=company,DC=com (encerrado há mais de 14 dias)
  • Entrada alternativa: [latestTerminationDate] = "2025-07-25", [department] = "Finance"
  • Saída alternativa: OU=Finance,DC=company,DC=com (terminada há menos de 14 dias)

Geração de UPN multi-empresa com classe de funcionários

Cenário 1: Você precisa gerar UPNs com base nas informações da empresa e da classe dos funcionários.

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

Exemplo:

  • Valores de entrada: [employeeClass] = "1915", [firstName] = "Anna", [lastName] = "Johnson"
  • Saída de expressão: anna.johnson@fabrikam.com (ou 01anna.johnson@fabrikam.com se a primeira opção for tomada)

Apóstrofo e manuseamento de caracteres especiais

Cenário 1: Você precisa remover apóstrofos e traços de endereços de email para compatibilidade do Azure AD Connect.

Atributo de destino: mail

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

Exemplo:

  • Valores de entrada: [divisionId] = "1200", [preferredName] = "Mary-Ann", [firstName] = "Mary", [lastName] = "O'Connor"
  • Saída de expressão: maryann.oconnor@contoso.com (apóstrofos e traços removidos)
  • Entrada alternativa: [divisionId] = "8900", [email] = "existing.user@company.com"
  • Saída alternativa: existing.user@company.com

Geração de endereços SIP

Cenário 1: Você deseja gerar endereços SIP para integração do Skype for Business/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"))
)

Exemplo:

  • Valores de entrada: [firstName] = "David", [lastName] = "Wilson"
  • Saída de expressão: sip:david.wilson@contoso.com (ou sip:01david.wilson@contoso.com se a primeira opção for tomada)
  • Entrada alternativa: [firstName] = "María José", [lastName] = "González-Pérez"
  • Saída alternativa: sip:mariajose.gonzalezperez@contoso.com (ou sip:01mariajose.gonzalezperez@contoso.com se a primeira opção for tomada, ou sip:02mariajose.gonzalezperez@contoso.com se as duas primeiras forem tomadas)

Lógica condicional de write-back

Cenário 1: Você deseja escrever condicionalmente endereços de e-mail com base em critérios de data específicos.

Atributo de destino: mailNickname

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

Exemplo:

  • Valores de entrada: [extensionAttribute9] = "2025-07-31", [mail] = "user@company.com" (data atual: 2025-07-30)
  • Saída da expressão: (vazio - ignorado, pois a diferença de data é de 1 dia)
  • Entrada alternativa: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com"
  • Saída alternativa: user@company.com

Cenário 2: Você precisa lidar com atributos ausentes em cenários de write-back.

Atributo de destino: mailNickname

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

Exemplo:

  • Valores de entrada: [extensionAttribute9] = "" (vazio), [mail] = "user@company.com"
  • Saída de expressão: noemail@contoso.com
  • Entrada alternativa: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com" (data atual: 2025-07-30)
  • Saída alternativa: user@company.com

Melhores práticas

  • Use SelectUniqueValue para todos os atributos que exigem exclusividade (UPN, samAccountName, email).

  • Manipule valores nulos e vazios usando funções como IsNullOrEmpty, IsPresent, Switchou Coalesce.

  • Use NormalizeDiacritics e StripSpaces ao processar nomes para garantir a compatibilidade entre sistemas.

  • Valide expressões JSONPath em um testador JSONPath antes de implementar na produção.

  • Use a formatação de data adequada ao trabalhar com campos de data SuccessFactors para evitar erros de conversão.

  • Considere os fusos horários ao trabalhar com comparações de data e lógica de expiração de conta.

  • Use IgnoreFlowIfNullOrEmpty para fluxos de atributos condicionais e cenários de write-back.

  • Teste instruções complexas do Switch completamente, pois elas podem se tornar difíceis de depurar.

  • Documente a lógica de negócios com clareza, especialmente para status de emprego complexo e regras de gerenciamento de contas.

  • Use padrões de regex cuidadosamente e valide-os em testadores de regex on-line antes da implementação.

Mais recursos