Usar o PowerShell para conectar o Shifts ao Gerenciamento de Força de Trabalho do Blue Yonder

Visão geral

Use o conector Microsoft Teams Shifts para Blue Yonder para integrar o aplicativo Shifts no Microsoft Teams ao Gerenciamento de Força de Trabalho do Blue Yonder (WFM do Blue Yonder). Os trabalhadores da linha de frente podem exibir e gerenciar perfeitamente seus agendamentos no Blue Yonder WFM de dentro do Shifts.

Neste artigo, vamos orientá-lo sobre como usar o PowerShell para configurar e configurar o conector para integrar o Shifts ao WFM do Blue Yonder.

Para configurar a conexão, execute um script do PowerShell. O script configura o conector, aplica configurações de sincronização, cria a conexão e mapeia instâncias WFM do Blue Yonder para equipes. As configurações de sincronização determinam os recursos habilitados no Shifts e as informações de agendamento sincronizadas entre o WFM do Blue Yonder e o Shifts. Os mapeamentos definem a relação de sincronização entre suas instâncias do WFM do Blue Yonder e as equipes no Teams. Você pode mapear para equipes existentes e novas equipes.

Fornecemos dois scripts. Você pode usar um script, dependendo se deseja mapear para equipes existentes ou criar novas equipes para as quais mapear.

Você pode configurar várias conexões, cada uma com configurações de sincronização diferentes. Por exemplo, se sua organização tiver vários locais com requisitos de agendamento diferentes, crie uma conexão com configurações de sincronização exclusivas para cada local. Tenha em mente que uma instância WFM do Blue Yonder só pode ser mapeada para uma equipe em um determinado momento. Se uma instância já estiver mapeada para uma equipe, ela não poderá ser mapeada para outra equipe.

Com o Blue Yonder WFM como o sistema de registro, os trabalhadores da linha de frente podem gerenciar com eficiência seus agendamentos e disponibilidade em Turnos em seus dispositivos. Os gerentes de linha de frente podem continuar a usar o WFM do Blue Yonder para configurar agendas.

Observação

Você também pode usar o assistente de conector do Shifts no centro de administração do Microsoft 365 para conectar o Shifts ao WFM do Blue Yonder.

Antes de começar

Pré-requisitos

Antes de começar, certifique-se de atender a todos os seguintes pré-requisitos:

  • Você tem o Blue Yonder WFM versão 2020.3, 2021.1 ou 2021.2.

    Observação

    Se você tiver o Workforce Management da Blue Yonder 2020.3 ou 2021.1, aplique o patch 2020.3.0.4 ou 2021.1.0.3. Esse patch corrige um problema em que os usuários recebem uma mensagem de erro persistente no Turnos. Ele também corrige um problema que impede que os usuários atualizem sua disponibilidade no Turnos.

  • Você sabe que o Blue Yonder WFM nome da conta de serviço, senha e URLs de serviço:

    • URL de autenticação federada
    • URL de autenticação de cookies
    • URL de autoatendimento para funcionários
    • URL da API Web de varejo
    • URL da API do gerenciador de sites
    • URL da API de administração

    Se você não tiver todas essas informações, entre em contato com o suporte do Blue Yonder. Uma conta do Blue Yonder é criada no nível da empresa raiz por um administrador da empresa Blue Yonder. Ele deve ter acesso à API, Administração do cliente, Gerenciador de Lojas e Acesso ao Trabalho. A conta e a senha são necessárias para criar uma conexão.

  • A autenticação SSO federada está habilitada no seu ambiente Workforce Management da Blue Yonder. Entre em contato com o suporte da Blue Yonder para garantir que a SSO federado esteja habilitado. Eles precisarão das seguintes informações:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize onde {tenantId} está seu tenantId
    • proxyHeader: X-MS-AuthToken
  • Você tem pelo menos uma equipe configurada no Teams.

  • Você adicionou uma conta geral, o que chamamos de conta do sistema microsoft 365, como proprietário da equipe para todas as equipes que você deseja mapear.

    Crie essa conta no Centro de administração do Microsoft 365 e atribua uma licença do Microsoft 365. Em seguida, adicione a conta como um proprietário de equipe a todas as equipes que você deseja mapear. O conector do Turnos usa essa conta ao sincronizar as alterações do Turnos do Workforce Management do Blue Yonder. Recomendamos que você crie uma conta especificamente para essa finalidade e não use sua conta de usuário pessoal.

Função de administrador para gerenciar o conector usando o PowerShell

Você deve ser um administrador global do Microsoft 365 ou um administrador conector do Shifts para concluir as etapas deste artigo.

A função de administrador do conector Shifts é uma função personalizada que você cria em Microsoft Entra ID e atribui a um usuário. O nome da função deve ser "Administrador do conector de turnos". A função não precisa ter permissões específicas, embora pelo menos uma permissão deva ser definida ao criá-la. O serviço depende da presença da função no usuário e não de suas permissões.

Para saber mais, confira Criar e atribuir uma função personalizada em Microsoft Entra ID e atribuir funções Microsoft Entra aos usuários. Lembre-se de que pode levar até 24 horas para que a função seja criada e aplicada a um usuário.

Configurar seu ambiente

  1. Instale o PowerShell versão 7 ou posterior. Para obter orientações passo a passo, consulte Instalando o PowerShell no Windows.

  2. Execute o PowerShell no modo administrador.

  3. Instalar o módulo PowerShell do Microsoft Graph.

    Install-Module Microsoft.Graph
    Import-Module Microsoft.Graph
    

    Verifique se é a versão 1.6.1 ou posterior.

    Get-InstalledModule Microsoft.Graph 
    
  4. Instalar o módulo PowerShell de Visualização do Teams.

    Install-Module -Name MicrosoftTeams -AllowPrerelease -Force
    Import-Module MicrosoftTeams 
    

    Verifique se é pelo menos a versão 4.7.0 e contém os cmdlets do conector Shifts.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Defina o PowerShell para sair se ocorrer um erro ao executar o script.

    $ErrorActionPreference = "Stop" 
    
  6. Habilitar os scripts a serem executados no Windows.

    Set-ExecutionPolicy bypass 
    

Conectar-se ao Teams

Execute o seguinte para se conectar ao Teams.

Connect-MicrosoftTeams

Quando for solicitado, entre usando suas credenciais de administrador. Agora você está configurado para executar os scripts neste artigo e nos cmdlets do conector do Shifts.

Identificar as equipes que você deseja mapear

Observação

Conclua esta etapa se você estiver mapeando instâncias WFM do Blue Yonder para equipes existentes. Se você estiver criando novas equipes para as quais mapear, poderá ignorar esta etapa.

No portal do Azure, vá para a página Todos os grupos para obter uma lista das TeamIds das equipes em sua organização.

Anote as TeamIds das equipes que você deseja mapear. O script solicitará que você insira essas informações.

Observação

Se uma ou mais equipes tiverem um agendamento existente, o script removerá as agendas dessas equipes. Caso contrário, você verá turnos duplicados.

Executar o script

Execute um dos seguintes scripts, dependendo se você está criando uma nova equipe ou mapeando para uma equipe existente:

  • Para configurar uma conexão, crie uma nova equipe no Teams e mapeie uma instância do Blue Yonder WFM para a nova equipe, execute o novo script do teams.
  • Para configurar uma conexão e mapear instâncias do Blue Yonder WFM para equipes existentes no Teams, execute o script de equipes existente.

Siga as instruções na tela ao executar o script. O script conclui as seguintes ações:

  1. Teste e verifique a conexão com o Blue Yonder WFM usando as credenciais da conta de serviço do Blue Yonder WFM e as URLs de serviço inseridas.

  2. Aplicar configurações de sincronização. Essas configurações incluem a frequência de sincronização (em minutos) e os dados de agenda sincronizados entre o Blue Yonder WFM e Shifts. Você pode habilitar dados de agendamento definidos por esses cenários: Shift, SwapRequest, , UserShiftPreferences, OpenShift, OpenShiftRequest, TimeOff. TimeOffRequest

    Para saber mais, consulte New-CsTeamsShiftsConnectionInstance. Para ver a lista de opções de sincronização com suporte para cada parâmetro, execute Get-CsTeamsShiftsConnectionConnector.

    Observação

    O script habilita a sincronização para cada opção de sincronização com suporte. Se você quiser alterar as configurações de sincronização, poderá fazer isso depois que a conexão for configurada. Para saber mais, consulte Usar o PowerShell para gerenciar sua conexão do Shifts com o Gerenciamento de Força de Trabalho do Blue Yonder.

  3. Mapeie instâncias do Blue Yonder WFM para suas equipes no Teams.

    • Se você optar por executar o novo script de equipes para criar novas equipes, os mapeamentos serão baseados nas novas equipes que você cria.
    • Se você optar por executar o script de equipes existente para mapear equipes existentes, os mapeamentos serão baseados em IDs de instância do Blue Yonder e TeamIds inseridas. Se uma equipe tiver uma agenda existente, o script removerá todos os dados de agendamento.

Depois de executar o script, uma mensagem de Sucesso confirma se sua conexão foi configurada com êxito.

Gerenciar sua conexão

Depois que uma conexão é configurada, você pode gerenciar e fazer alterações nela no Centro de administração do Microsoft 365 ou usando o PowerShell.

Use o Centro de administração do Microsoft 365

A página Gerenciamento do Conector lista cada conexão que você configurou, juntamente com informações como status de integridade e detalhes do intervalo de sincronização. Você também pode acessar o assistente para fazer alterações em qualquer uma de suas conexões. Por exemplo, você pode atualizar configurações de sincronização e mapeamentos de equipe.

Para saber mais, confira Usar o Centro de administração do Microsoft 365 para gerenciar sua conexão shifts com o Blue Yonder Workforce Management.

Usar o Windows PowerShell!

Você pode usar o PowerShell para exibir um relatório de erro, alterar as configurações de conexão, desabilitar a sincronização e muito mais. Para obter diretrizes passo a passo, confira Usar o PowerShell para gerenciar sua conexão do Turnos com o Workforce Management da Blue Yonder.

Scripts

Configurar uma conexão e criar uma nova equipe

#Map WFM sites to teams script
Write-Output "Map WFM sites to teams"
Start-Sleep 1

#Ensure Teams module is at least version x
Write-Output "Checking Teams module version"
try {
	Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 5.2.0
} catch {
	throw
}

#Connect to MS Graph
Connect-MgGraph -Scopes "User.Read.All","Group.ReadWrite.All"

#List connector types available (comment out if not implemented for preview)
Write-Output "Listing connector types available"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your Blue Yonder account username'
$WfmPwd = Read-Host -Prompt 'Input your Blue Yonder account password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))

#Test connection settings
Write-Output "Testing connection settings"
$ConnectionName = Read-Host -Prompt 'Input connection name'
$adminApiUrl = Read-Host -Prompt 'Input admin api url'
$cookieAuthUrl = Read-Host -Prompt 'Input cookie authorization url'
$essApiUrl = Read-Host -Prompt 'Input ess api url'
$federatedAuthUrl = Read-Host -Prompt 'Input federated authorization url'
$retailWebApiUrl = Read-Host -Prompt 'Input retail web api url'
$siteManagerUrl = Read-Host -Prompt 'Input site manager url'

$testResult = Test-CsTeamsShiftsConnectionValidate `
	-Name $ConnectionName `
	-ConnectorId $BlueYonderId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
        -Property @{
            AdminApiUrl = $adminApiUrl
            SiteManagerUrl = $siteManagerUrl
            EssApiUrl = $essApiUrl
            RetailWebApiUrl = $retailWebApiUrl
            CookieAuthUrl = $cookieAuthUrl
            FederatedAuthUrl = $federatedAuthUrl
            LoginUserName = $WfmUserName
            LoginPwd = $plainPwd
        })
if ($NULL -ne $testResult.Code) {
	Write-Output $testResult
	throw "Validation failed, conflict found"
}
Write-Output "Test complete, no conflicts found"

#Create a connection
Write-Output "Creating a connection"
$ConnectionResponse = New-CsTeamsShiftsConnection `
    -Name $ConnectionName `
    -ConnectorId $BlueYonderId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
		-Property @{
			AdminApiUrl = $adminApiUrl
			SiteManagerUrl = $siteManagerUrl
			EssApiUrl = $essApiUrl
			RetailWebApiUrl = $retailWebApiUrl
			CookieAuthUrl = $cookieAuthUrl
			FederatedAuthUrl = $federatedAuthUrl
			LoginUserName = $WfmUserName
			LoginPwd = $plainPwd
		})

$ConnectionId = $ConnectionResponse.Id
if ($null -ne $ConnectionId){
	Write-Output "Successfully created connection"
} else {
	throw "Connection creation failed"
}

#Create a connection instance
Write-Output "Creating a connection instance"
$designatedActorName = Read-Host -Prompt "Input Microsoft 365 System Account (person@contoso.com)"
$designator = Get-MgUser -UserId $designatedActorName
$teamsUserId = $designator.Id
$syncFreq = Read-Host -Prompt "Input sync frequency in minutes"
$InstanceName = Read-Host -Prompt "Input connection instance name"

#Read sync scenarios for connection instance
function GetSyncScenarioSetting {
	param (
		$SettingName
	)
	$TwoWay = New-Object System.Management.Automation.Host.ChoiceDescription '&TwoWay', 'TwoWay'
	$Disabled = New-Object System.Management.Automation.Host.ChoiceDescription '&Disabled', 'Disabled'
	$FromWfmToShifts = New-Object System.Management.Automation.Host.ChoiceDescription '&FromWfmToShifts', 'FromWfmToShifts'
	$options = [System.Management.Automation.Host.ChoiceDescription[]]($TwoWay, $Disabled, $FromWfmToShifts)
	$result = $host.ui.PromptForChoice("Set sync scenario for $SettingName", "", $options, 0)

	switch ($result)
	{
		0 { return "TwoWay" }
		1 { return "Disabled" }
		2 { return "FromWfmToShifts" }
	}
}
$SyncScenarioOpenShift = GetSyncScenarioSetting "Open Shift"
$SyncScenarioOpenShiftRequest = GetSyncScenarioSetting "Open Shift Request"
$SyncScenarioShift = GetSyncScenarioSetting "Shift"
$SyncScenarioSwapRequest = GetSyncScenarioSetting "Swap Request"
$SyncScenarioTimeCard = GetSyncScenarioSetting "Time Card"
$SyncScenarioTimeOff = GetSyncScenarioSetting "Time Off"
$SyncScenarioTimeOffRequest = GetSyncScenarioSetting "Time Off Request"
$SyncScenarioUserShiftPreference = GetSyncScenarioSetting "User Shift Preferences"

#Read admin email list
[psobject[]]$AdminEmailList = @()
while ($true){
	$AdminEmail = Read-Host -Prompt "Enter admin's email to receive error report"
	$AdminEmailList += $AdminEmail
	$title    = 'Adding another email'
	$question = 'Would you like to add another admin email?'
	$choices  = '&Yes', '&No'
	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$InstanceResponse = New-CsTeamsShiftsConnectionInstance `
	-ConnectionId $ConnectionId `
    -ConnectorAdminEmail $AdminEmailList `
    -DesignatedActorId $teamsUserId `
    -Name $InstanceName `
    -SyncFrequencyInMin $syncFreq `
	-SyncScenarioOpenShift $SyncScenarioOpenShift `
	-SyncScenarioOpenShiftRequest $SyncScenarioOpenShiftRequest `
	-SyncScenarioShift $SyncScenarioShift `
	-SyncScenarioSwapRequest $SyncScenarioSwapRequest `
	-SyncScenarioTimeCard $SyncScenarioTimeCard `
	-SyncScenarioTimeOff $SyncScenarioTimeOff `
	-SyncScenarioTimeOffRequest $SyncScenarioTimeOffRequest `
	-SyncScenarioUserShiftPreference $SyncScenarioUserShiftPreference

$InstanceId = $InstanceResponse.id
if ($null -ne $InstanceId){
    Write-Output "Success"
} else {
    throw "Connector instance creation failed"
}

#Keep mapping teams until user stops it
$mappings=@()
while ($true)
{
	#Create a new Teams team with owner set to system account and name set to the site name
	Write-Output "Creating a Teams team"
	$teamsTeamName = Read-Host -Prompt "Input the Teams team name"
	$Team = New-Team -DisplayName $teamsTeamName -Visibility "Public" -Owner $teamsUserId
	Write-Output "Successfully created a team"
	$TeamsTeamId=$Team.GroupId

	#Retrieve the list of wfm locations
	Write-Output "Listing the WFM team sites"
	$WfmTeamIds = Get-CsTeamsShiftsConnectionWfmTeam -ConnectorInstanceId $InstanceId
	Write-Output $WfmTeamIds
	if (($NULL -ne $WfmTeamIds) -and ($WfmTeamIds.Count -gt 0)){
		[System.String]$WfmTeamId = Read-Host -Prompt "Input the ID of WFM team you want to map"
	}
	else {
		throw "The WfmTeamId list is null or empty"
	}

	#Retrieve the list of WFM users and their roles
	Write-Output "Listing WFM users and roles"
	$WFMUsers = Get-CsTeamsShiftsConnectionWfmUser -ConnectorInstanceId $InstanceId -WfmTeamId $WfmTeamId
	Write-Output $WFMUsers

	#Add users to the Team for Shifts
	Write-Output "Adding users to Teams team"
	$currentUser = Read-Host -Prompt "Input the current user's user name or AAD ID"
	Add-TeamUser -GroupId $TeamsTeamId -User $currentUser -Role Owner
	$failedWfmUsers=@()
	foreach ($user in $WFMUsers) {
		try {
		$userEmail = $user.Name + "@" +$domain
		Add-TeamUser -GroupId $TeamsTeamId -User $userEmail
		} catch {
			$failedWfmUsers+=$user
		}
	}
	if($failedWfmUsers.Count -gt 0){
		Write-Output "There are WFM users not existed in Teams tenant:"
		Write-Output $failedWfmUsers
	}

	#Enable scheduling in the group
	$RequestBody = @{
		Enabled = $true
		TimeZone = "America/Los_Angeles"
	}
	$teamUpdateUrl="https://graph.microsoft.com/v1.0/teams/"+$TeamsTeamId+"/schedule"
	Invoke-MgGraphRequest -Uri $teamUpdateUrl -Method PUT -Body $RequestBody

	#Create a mapping of the new team to the instance
	Write-Output "Create a mapping of the new team to the site"
	$TimeZone = Read-Host -Prompt "Input the time zone of team mapping"
	$mapping = @{
		teamId = $TeamsTeamId
		wfmTeamId = $WfmTeamId
		timeZone = $TimeZone
		}
	$mappings += , $mapping

	$title    = 'Connecting another team'
	$question = 'Would you like to connect another team?'
	$choices  = '&Yes', '&No'

	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$batchMappingResponse = New-CsTeamsShiftsConnectionBatchTeamMap -ConnectorInstanceId $InstanceId -TeamMapping @($mappings)
if ($null -ne $batchMappingResponse.OperationId){
	"The mapping has begun asynchronously. To query mapping results run Get-CsTeamsShiftsConnectionOperation with the operation Id."
}
else {
	throw "The mapping has failed due to validation errors."
}
Write-Output $batchMappingResponse

Remove-TeamUser -GroupId $TeamsTeamId -User $currentUser -Role Owner
Disconnect-MgGraph

Configurar uma conexão e mapear uma equipe existente

#Map WFM sites to existing teams script
Write-Output "Map WFM sites to existing teams"
Start-Sleep 1

#Ensure Teams module is at least version x
Write-Output "Checking Teams module version"
try {
	Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 5.2.0
} catch {
	throw
}

#Connect to MS Graph
Connect-MgGraph -Scopes "User.Read.All","Group.ReadWrite.All"

#List connector types available (comment out if not implemented for preview)
Write-Output "Listing connector types available"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your Blue Yonder account username'
$WfmPwd = Read-Host -Prompt 'Input your Blue Yonder account password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))

#Test connection settings
Write-Output "Testing connection settings"
$ConnectionName = Read-Host -Prompt 'Input connection name'
$adminApiUrl = Read-Host -Prompt 'Input admin api url'
$cookieAuthUrl = Read-Host -Prompt 'Input cookie authorization url'
$essApiUrl = Read-Host -Prompt 'Input ess api url'
$federatedAuthUrl = Read-Host -Prompt 'Input federated authorization url'
$retailWebApiUrl = Read-Host -Prompt 'Input retail web api url'
$siteManagerUrl = Read-Host -Prompt 'Input site manager url'

$testResult = Test-CsTeamsShiftsConnectionValidate `
	-Name $ConnectionName `
	-ConnectorId $BlueYonderId `
	-ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
		-Property @{
			AdminApiUrl = $adminApiUrl
			SiteManagerUrl = $siteManagerUrl
			EssApiUrl = $essApiUrl
			RetailWebApiUrl = $retailWebApiUrl
			CookieAuthUrl = $cookieAuthUrl
			FederatedAuthUrl = $federatedAuthUrl
			LoginUserName = $WfmUserName
			LoginPwd = $plainPwd
		})
		
if ($NULL -ne $testResult.Code) {
	Write-Output $testResult
	throw "Validation failed, conflict found"
}
Write-Host "Test complete, no conflicts found"

#Create a connection
Write-Output "Creating a connection"
$ConnectionResponse = New-CsTeamsShiftsConnection `
    -Name $ConnectionName `
    -ConnectorId $BlueYonderId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
		-Property @{
			AdminApiUrl = $adminApiUrl
			SiteManagerUrl = $siteManagerUrl
			EssApiUrl = $essApiUrl
			RetailWebApiUrl = $retailWebApiUrl
			CookieAuthUrl = $cookieAuthUrl
			FederatedAuthUrl = $federatedAuthUrl
			LoginUserName = $WfmUserName
			LoginPwd = $plainPwd
		})

$ConnectionId = $ConnectionResponse.Id
if ($null -ne $ConnectionId){
	Write-Output "Successfully created connection"
} else {
	throw "Connection creation failed"
}

#Create a connection instance
Write-Output "Creating a connection instance"
$designatedActorName = Read-Host -Prompt "Input Microsoft 365 System Account (person@contoso.com)"
$designator = Get-MgUser -UserId $designatedActorName
$teamsUserId = $designator.Id
$syncFreq = Read-Host -Prompt "Input sync frequency in minutes"
$InstanceName = Read-Host -Prompt "Input connection instance name"

#Read sync scenarios for connection instance
function GetSyncScenarioSetting {
	param (
		$SettingName
	)
	$TwoWay = New-Object System.Management.Automation.Host.ChoiceDescription '&TwoWay', 'TwoWay'
	$Disabled = New-Object System.Management.Automation.Host.ChoiceDescription '&Disabled', 'Disabled'
	$FromWfmToShifts = New-Object System.Management.Automation.Host.ChoiceDescription '&FromWfmToShifts', 'FromWfmToShifts'
	$options = [System.Management.Automation.Host.ChoiceDescription[]]($TwoWay, $Disabled, $FromWfmToShifts)
	$result = $host.ui.PromptForChoice("Set sync scenario for $SettingName", "", $options, 0)

	switch ($result)
	{
		0 { return "TwoWay" }
		1 { return "Disabled" }
		2 { return "FromWfmToShifts" }
	}
}
$SyncScenarioOpenShift = GetSyncScenarioSetting "Open Shift"
$SyncScenarioOpenShiftRequest = GetSyncScenarioSetting "Open Shift Request"
$SyncScenarioShift = GetSyncScenarioSetting "Shift"
$SyncScenarioSwapRequest = GetSyncScenarioSetting "Swap Request"
$SyncScenarioTimeCard = GetSyncScenarioSetting "Time Card"
$SyncScenarioTimeOff = GetSyncScenarioSetting "Time Off"
$SyncScenarioTimeOffRequest = GetSyncScenarioSetting "Time Off Request"
$SyncScenarioUserShiftPreference = GetSyncScenarioSetting "User Shift Preferences"

#Read admin email list
[psobject[]]$AdminEmailList = @()
while ($true){
	$AdminEmail = Read-Host -Prompt "Enter admin's email to receive error report"
	$AdminEmailList += $AdminEmail
	$title    = 'Adding another email'
	$question = 'Would you like to add another admin email?'
	$choices  = '&Yes', '&No'
	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$InstanceResponse = New-CsTeamsShiftsConnectionInstance `
	-ConnectionId $ConnectionId `
    -ConnectorAdminEmail $AdminEmailList `
    -DesignatedActorId $teamsUserId `
    -Name $InstanceName `
    -SyncFrequencyInMin $syncFreq `
	-SyncScenarioOpenShift $SyncScenarioOpenShift `
	-SyncScenarioOpenShiftRequest $SyncScenarioOpenShiftRequest `
	-SyncScenarioShift $SyncScenarioShift `
	-SyncScenarioSwapRequest $SyncScenarioSwapRequest `
	-SyncScenarioTimeCard $SyncScenarioTimeCard `
	-SyncScenarioTimeOff $SyncScenarioTimeOff `
	-SyncScenarioTimeOffRequest $SyncScenarioTimeOffRequest `
	-SyncScenarioUserShiftPreference $SyncScenarioUserShiftPreference

$InstanceId = $InstanceResponse.id
if ($null -ne $InstanceId){
    Write-Output "Success"
} else {
    throw "Connector instance creation failed"
}

#Keep mapping teams until user stops it
$mappings=@()
while ($true)
{
	$TeamsTeamId = Read-Host -Prompt "Input the ID of the Teams team to be mapped"
	#Clear schedule of the Teams team
	Write-Host "Clear schedule of the existing team"

	$entityTypeString = Read-Host -Prompt 'Input the entity types of clear schedule'
	$Delimiters = ",", ".", ":", ";", " ", "`t"
	$entityType = $entityTypeString -Split {$Delimiters -contains $_}
	$entityType = $entityType.Trim()
	$entityType = $entityType.Split('',[System.StringSplitOptions]::RemoveEmptyEntries)
	Remove-CsTeamsShiftsScheduleRecord -TeamId $TeamsTeamId -ClearSchedulingGroup:$True -EntityType $entityType

	#Retrieve the list of wfm locations
	Write-Output "Listing the WFM team sites"
	$WfmTeamIds = Get-CsTeamsShiftsConnectionWfmTeam -ConnectorInstanceId $InstanceId
	Write-Output $WfmTeamIds
	if (($NULL -ne $WfmTeamIds) -and ($WfmTeamIds.Count -gt 0)){
		[System.String]$WfmTeamId = Read-Host -Prompt "Input the ID of WFM team you want to map"
	}
	else {
		throw "The WfmTeamId list is null or empty"
	}

	#Retrieve the list of WFM users and their roles
	Write-Output "Listing WFM users and roles"
	$WFMUsers = Get-CsTeamsShiftsConnectionWfmUser -ConnectorInstanceId $InstanceId -WfmTeamId $WfmTeamId
	Write-Output $WFMUsers

	#Create a mapping of the existing team to the instance
	Write-Host "Create a mapping of the existing team to the site"
	$TimeZone = Read-Host -Prompt "Input the time zone of team mapping"
	$mapping = @{
		teamId = $TeamsTeamId
		wfmTeamId = $WfmTeamId
		timeZone = $TimeZone
		}
	$mappings += , $mapping

	$title    = 'Connecting another team'
	$question = 'Would you like to connect another team?'
	$choices  = '&Yes', '&No'

	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$batchMappingResponse = New-CsTeamsShiftsConnectionBatchTeamMap -ConnectorInstanceId $InstanceId -TeamMapping @($mappings)
if ($null -ne $batchMappingResponse.OperationId){
	"The mapping has begun asynchronously. To query mapping results run Get-CsTeamsShiftsConnectionOperation with the operation Id."
}
else {
	throw "The mapping has failed due to validation errors."
}
Write-Output $batchMappingResponse

Disconnect-MgGraph

Cmdlets do conector Shifts

Para obter ajuda com cmdlets do conector Shifts, incluindo os cmdlets usados nos scripts, pesquise CsTeamsShiftsConnection na referência de cmdlet do PowerShell do Teams. Aqui estão links para alguns cmdlets comumente usados, agrupados por categoria:

Conexões

WFM credenciais de sistemas

Opções de sincronização para cenários com suporte

Remover dados de agendamento

Instâncias de conexão

Mapeamento do usuário e sincronização bem-sucedida

Mapeamento de equipe

ID da operação

Relatórios de erro