Compartilhar via


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 o provisionamento de usuário da ID do Microsoft Entra. Essas funções ajudam a transformar e mapear dados do SuccessFactors para criar atributos de usuário apropriados na ID do Microsoft Entra.

Sumário

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

Operações básicas de cadeia de caracteres

Cenário 1: você deseja adicionar uma 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 da expressão: 00012345

Cenário 2: você precisa adicionar 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 da expressão: 0000000567

Cenário 3: você deseja criar uma ID de funcionário acrescentando 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 da expressão: 05000789

Conversão de maiúsculas e minúsculas

Cenário 1: você precisa converter nomes de todas as letras maiúsculas em maiúsculas em maiúsculas e minúsculas apropriadas (Caso de Título).

Atributo de destino: sn

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

Exemplo:

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

Cenário 2: você deseja criar um nome de exibição com a 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 da expressão: Smith, John

Cenário 3: você precisa lidar com nomes com espaços substituindo espaços por períodos.

Atributo de destino: givenName

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

Exemplo:

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

Geração de endereços de email

Geração básica de email

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

Atributo de destino: email

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 da expressão: john.smith@contoso.com (ou john.m.smith@contoso.com se a primeira opção for tomada)

Geração de email baseada em grupo de funcionários

Cenário 1: você deseja gerar formatos de email diferentes com base na classificação de funcionários (permanente versus temporária).

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 da expressão: sarah.wilson_ext@ltts.com

Validação de domínio corporativo

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

Atributo de destino: email

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

Exemplo:

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

Preservação de email existente

Cenário 1: você deseja usar emails existentes do SuccessFactors para determinadas divisões, mas gerar novos 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 da 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 conta

Status básico da conta

Cenário 1: você deseja determinar se uma conta deve ser desabilitada 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 da expressão: False (conta habilitada)
  • Entrada alternativa: [emplStatus] = "746"
  • Saída alternativa: True (conta desabilitada)

Ocultar da lógica de listas de endereços

Cenário 1: você precisa definir o atributo msExchHideFromAddressLists com base nas datas de início e término.

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 da expressão: FALSE (não oculta de listas de endereços)
  • Entrada alternativa: [startDate] = "2025-01-15", [endDate] = "2025-06-30"
  • Saída alternativa: TRUE (oculto de 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 da expressão: False (conta habilitada)
  • Entrada alternativa: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-29"
  • Saída alternativa: True (conta desabilitada)

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 de término do 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 da 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 em 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/1/1990 12:00:00 AM"
  • Saída da 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 em motivo do evento

Cenário 1: você deseja definir a expiração da conta com base em eventos de término específicos e datas de indenização.

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: [evento] = "SEVUNSATP", [severanceStartDate] = "15/8/2025 12:00:00 AM"
  • Saída da expressão: 133877247990000000 (representação numérica de 2025-08-15 23:59:59-08:00)
  • Entrada alternativa: [evento] = "REGULAR", [latestTerminationDate] = "30/9/2025 12:00:00 AM"
  • Saída alternativa: 133886207990000000 (representação numérica de 2025-09-30 23:59:59-08:00)

Manipulação de formato de data

Cenário 1: você precisa lidar com datas inválidas, como "31/12/9999" que causam erros no 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 da expressão: 441481535990000000 (representação numérica de 2099-12-31T23:59:59-04:00)
  • Entrada alternativa: [endDate] = "15/8/2025 12:00:00 AM"
  • Saída alternativa: 133877283990000000 (representação numérica de 2025-08-15T23:59:59-04:00)

Atribuição de UO (unidade organizacional)

Atribuição de UO baseada em departamento

Cenário 1: você deseja colocar usuários em diferentes UOs 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] = "SG de engenharia"
  • Saída da 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 em status de emprego

Cenário 1: você precisa atribuir usuários a diferentes UOs 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 da 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 diferentes UOs 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", [país] = "México"
  • Saída da expressão: OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com
  • Entrada alternativa: [activeEmploymentsCount] = "0", [país] = "Suécia"
  • Saída alternativa: OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com (os usuários desabilitados vão para a UO especial 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)

Nomes de processamento e exibição de nomes

Geração de nome comum (CN)

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 da 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 de exibição com nomes preferenciais

Cenário 1: Você precisa criar um nome de exibição que use o nome preferencial quando disponível, caso contrário, retornará ao 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 da expressão: Johnson, Mike
  • Entrada alternativa: [lastName] = "SMITH", [preferredName] = "", [firstName] = "Robert"
  • Saída alternativa: Smith, Robert

Nome de 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 da 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 nome inicial e o sobrenome com a sanitização de caractere 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 da expressão: jgarcialopez (ou jgarcialopez1 se a primeira opção for tomada ou jgarcialopez2 se as duas primeiras forem tomadas)

SamAccountName com comprimento de nome variável

Cenário 1: você deseja manipular duplicatas aumentando o número de caracteres do 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 da 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 email.

Atributo de destino: sAMAccountName

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

Exemplo:

  • Valores de entrada: [nome de usuário] = "john.smith@external.com"
  • Saída da 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 da expressão: ["smtp:A12345@contoso.mail.onmicrosoft.com", "smtp:A12345@contoso.com", "SMTP:John.Smith@contoso.com"]

ProxyAddresses baseado em divisão

Cenário 1: você precisa de configurações de endereço proxy diferentes 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 da 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"]

ProxyAddresses 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 da expressão: SMTP:trinidad.williams@contoso.com (ou SMTP:trinidad.j.williams@contoso.com se a primeira opção for tomada)
  • Entrada alternativa: [empresa] = "National Energy", [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] = "Other Company", [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 de número de telefone

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

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

Atributo de destino: telephoneNumber

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

Exemplo:

  • Valores de entrada: [móvel] = "+1 (555) 123-4567"
  • Saída da 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: [móvel] = "+44 20 7946 0958"
  • Saída da 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: telephoneNumber

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

Exemplo:

  • Valores de entrada: [telephoneNumber] = ""
  • Saída da expressão: 000-000-0000
  • Entrada alternativa: [móvel] = "555-123-4567"
  • Saída alternativa: 555-123-4567

Lógica do telefone primário

Cenário 1: você precisa determinar qual número de telefone deve ser marcado como primário.

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 da 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 em país e local

Mapeamento de código do país

Cenário 1: você deseja mapear nomes de país 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 da expressão: TT

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

Atributo de destino: countryCode

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

Exemplo:

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

Domínios de email baseados em localização

Cenário 1: você deseja atribuir domínios de email diferentes com base na localização geográfica.

Atributo de destino: email

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: [país] = "Índia", [firstName] = "Raj", [lastName] = "Patel"
  • Saída da 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", [firstName] = "Klaus", [lastName] = "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 funcionários e funcionários contingentes

Classificação de 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 da expressão: Employee
  • Entrada alternativa: [employeeType] = "99999"
  • Saída alternativa: Default-value

Identificação de trabalhador contingente

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 da 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 da expressão: Dr.
  • Entrada alternativa: [personalTitle] = ""
  • Saída alternativa: (vazia - ignorada)

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] = "TI Global", [departamento] = "TI local"
  • Saída da expressão: Global IT
  • Entrada alternativa: [globalAssignmentDepartment] = "", [departamento] = "Vendas"
  • Saída alternativa: Sales

Tratamento de email de exclusão reversível

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

Atributo de destino: email

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 da 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", [departamento] = "Engenharia" (data atual: 2025-07-30)
  • Saída da expressão: OU=DELETED,DC=company,DC=com (encerrada há mais de 14 dias)
  • Entrada alternativa: [latestTerminationDate] = "2025-07-25", [departamento] = "Finance"
  • Saída alternativa: OU=Finance,DC=company,DC=com (encerrada há menos de 14 dias)

Geração UPN de várias empresas com classe de funcionário

Cenário 1: você precisa gerar UPNs com base nas informações de classe da empresa e 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 da expressão: anna.johnson@fabrikam.com (ou 01anna.johnson@fabrikam.com se a primeira opção for tomada)

Apostrophe e tratamento 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: email

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 da 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ço 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 da 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-Perez"
  • 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 email 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", [email] = "user@company.com" (data atual: 2025-07-30)
  • Saída da expressão: (vazia – ignorada, pois a diferença de data é de 1 dia)
  • Entrada alternativa: [extensionAttribute9] = "2025-08-01", [email] = "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), [email] = "user@company.com"
  • Saída da expressão: noemail@contoso.com
  • Entrada alternativa: [extensionAttribute9] = "2025-08-01", [email] = "user@company.com" (data atual: 2025-07-30)
  • Saída alternativa: user@company.com

Práticas recomendadas

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

  • Manipular 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 em produção.

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

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

  • Use IgnoreFlowIfNullOrEmpty para fluxos de atributo condicional e cenários de write-back.

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

  • Documente claramente a lógica de negócios, especialmente para regras complexas de gerenciamento de contas e status de emprego.

  • Use padrões regex com cuidado e valide-os em testadores regex online antes da implementação.

Mais recursos