Share via


Utilizar o PowerShell para ligar Shifts ao Blue Yonder Workforce Management

Descrição geral

Utilize o conector Microsoft Teams Shifts para Blue Yonder para integrar a aplicação Shifts no Microsoft Teams com o Blue Yonder Workforce Management (Blue Yonder WFM). Os seus trabalhadores de primeira linha podem ver e gerir facilmente os seus horários no Blue Yonder WFM a partir dos Turnos.

Neste artigo, vamos guiá-lo ao longo de como utilizar o PowerShell para configurar e configurar o conector para integrar Os Turnos com o Blue Yonder WFM.

Para configurar a ligação, execute um script do PowerShell. O script configura o conector, aplica as definições de sincronização, cria a ligação e mapeia o Blue Yonder WFM instâncias às equipas. As definições de sincronização determinam as funcionalidades ativadas nos Turnos e as informações de agendamento sincronizadas entre o Blue Yonder WFM e os Turnos. Os mapeamentos definem a relação de sincronização entre as suas instâncias do Blue Yonder WFM e as equipas no Teams. Pode mapear para equipas existentes e novas equipas.

Fornecemos dois scripts. Pode utilizar qualquer um dos scripts, consoante pretenda mapear para equipas existentes ou criar novas equipas para as quais mapear.

Pode configurar várias ligações, cada uma com definições de sincronização diferentes. Por exemplo, se a sua organização tiver várias localizações com requisitos de agendamento diferentes, crie uma ligação com definições de sincronização exclusivas para cada localização. Tenha em atenção que uma instância do Blue Yonder WFM só pode ser mapeada para uma equipa a qualquer momento. Se uma instância já estiver mapeada para uma equipa, não pode ser mapeada para outra equipa.

Com o Blue Yonder WFM como o sistema de registo, os seus trabalhadores de primeira linha podem gerir eficientemente os seus horários e disponibilidade em Turnos nos respetivos dispositivos. Os gestores de primeira linha podem continuar a utilizar o Blue Yonder WFM para configurar agendamentos.

Nota

Também pode utilizar o assistente do conector Shifts no centro de administração do Microsoft 365 para ligar os Turnos ao Blue Yonder WFM.

Before you begin

Pré-requisitos

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

  • Tem o Blue Yonder WFM versão 2020.3, 2021.1 ou 2021.2.

    Nota

    Se tiver o Blue Yonder WFM 2020.3 ou 2021.1, aplique o patch 2020.3.0.4 ou 2021.1.0.3. Este patch corrige um problema em que os utilizadores recebem uma mensagem de erro persistente em Turnos. Também corrige um problema que impede os utilizadores de atualizarem a sua disponibilidade em Turnos.

  • Sabe qual é o nome da conta de serviço do Blue Yonder WFM, a palavra-passe e os URLs de serviço:

    • URL de autenticação federada
    • URL de autenticação de cookies
    • URL self-service dos colaboradores
    • URL da API Web de revenda
    • URL da API do gestor de sites
    • URL da API de Administração

    Se não tiver todas estas informações, contacte o suporte do Blue Yonder. Uma conta Blue Yonder é criada ao nível da empresa de raiz por um administrador do Blue Yonder Enterprise. Tem de ter Acesso à API, Administração de Cliente, Gestor de Lojas e acesso de Trabalho. A conta e a palavra-passe são necessárias para criar uma ligação.

  • A autenticação SSO federada está ativada no ambiente de WFM Blue Yonder. Contacte o suporte do Blue Yonder para se certificar de que o SSO federado está ativado. 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á o tenantId
    • proxyHeader: X-MS-AuthToken
  • Tem, pelo menos, uma equipa configurada no Teams.

  • Adicionou uma conta geral, a que chamamos conta de sistema do Microsoft 365, como proprietário da equipa a todas as equipas que pretende mapear.

    Crie esta conta no centro de administração do Microsoft 365 e atribua-lhe uma licença do Microsoft 365. Em seguida, adicione a conta como proprietário da equipa a todas as equipas que pretende mapear. O conector Shifts utiliza esta conta ao sincronizar alterações de Turnos do Blue Yonder WFM. Recomendamos que crie uma conta especificamente para esta finalidade e não utilize a sua conta de utilizador pessoal.

Administração função para gerir o conector com o PowerShell

Tem de ser um administrador global do Microsoft 365 ou um administrador do conector do Shifts para concluir os passos neste artigo.

A função de administrador do conector Shifts é uma função personalizada que cria no Microsoft Entra ID e atribui a um utilizador. O nome da função tem de ser "Shifts connector admin". A função não precisa de ter permissões específicas. No entanto, pelo menos uma permissão tem de ser definida quando a criar. O serviço depende da presença da função no utilizador e não das respetivas permissões.

Para saber mais, veja Criar e atribuir uma função personalizada no Microsoft Entra ID e Atribuir funções de Microsoft Entra aos utilizadores. Tenha em atenção que pode demorar até 24 horas para que a função seja criada e aplicada a um utilizador.

Configurar o seu ambiente

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

  2. Execute o PowerShell no modo de administrador.

  3. Instale o módulo do 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. Instale o módulo do PowerShell de Pré-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. Ative a execução de scripts no Windows.

    Set-ExecutionPolicy bypass 
    

Ligar ao Teams

Execute o seguinte para ligar ao Teams.

Connect-MicrosoftTeams

Quando lhe for pedido, inicie sessão com as suas credenciais de administrador. Está agora configurado para executar os scripts neste artigo e os cmdlets do conector Shifts.

Identificar as equipas que pretende mapear

Nota

Conclua este passo se estiver a mapear instâncias do Blue Yonder WFM para as equipas existentes. Se estiver a criar novas equipas para mapear, pode ignorar este passo.

Na portal do Azure, aceda à página Todos os grupos para obter uma lista dos TeamIds das equipas na sua organização.

Tome nota dos TeamIds das equipas que pretende mapear. O script irá pedir-lhe para introduzir estas informações.

Nota

Se uma ou mais equipas tiverem uma agenda existente, o script removerá as agendas dessas equipas. Caso contrário, verá turnos duplicados.

Executar o script

Execute um dos seguintes scripts, consoante esteja a criar uma nova equipa ou a mapear para uma equipa existente:

  • Para configurar uma ligação, crie uma nova equipa no Teams e mapeie uma instância do Blue Yonder WFM à nova equipa, execute o novo script de equipas.
  • Para configurar uma ligação e mapear instâncias do Blue Yonder WFM às equipas existentes no Teams, execute o script de equipas existente.

Siga as instruções apresentadas no ecrã quando executar o script. O script conclui as seguintes ações:

  1. Teste e verifique a ligação ao Blue Yonder WFM com as credenciais da conta de serviço blue yonder WFM e os URLs de serviço introduzidos.

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

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

    Nota

    O script ativa a sincronização para cada opção de sincronização suportada. Se quiser alterar as definições de sincronização, pode fazê-lo após a configuração da ligação. Para saber mais, veja Utilizar o PowerShell para gerir a sua ligação shifts ao Blue Yonder Workforce Management.

  3. Mapeie o Blue Yonder WFM instâncias às suas equipas no Teams.

    • Se optar por executar o novo script de equipas para criar novas equipas, os mapeamentos baseiam-se nas novas equipas que criar.
    • Se optar por executar o script de equipas existente para mapear as equipas existentes, os mapeamentos baseiam-se nos IDs de instância do Blue Yonder e nos TeamIds introduzidos. Se uma equipa tiver uma agenda existente, o script remove todos os dados de agendamento.

Depois de executar o script, uma mensagem de Êxito confirma se a ligação foi configurada com êxito.

Gerir a ligação

Depois de configurar uma ligação, pode gerir e efetuar alterações à mesma no centro de administração do Microsoft 365 ou através do PowerShell.

Utilizar o centro de administração do Microsoft 365

A página Gestão de Conectores lista cada ligação que configurou, juntamente com informações como o estado de funcionamento e os detalhes do intervalo de sincronização. Também pode aceder ao assistente para efetuar alterações a qualquer uma das suas ligações. Por exemplo, pode atualizar as definições de sincronização e os mapeamentos de equipa.

Para saber mais, consulte Utilizar o centro de administração do Microsoft 365 para gerir a sua ligação shifts ao Blue Yonder Workforce Management.

Utilizar o PowerShell

Pode utilizar o PowerShell para ver um relatório de erros, alterar as definições de ligação, desativar a sincronização e muito mais. Para obter orientações passo a passo, veja Utilizar o PowerShell para gerir a ligação shifts ao Blue Yonder Workforce Management.

Scripts

Configurar uma ligação e criar uma nova equipa

#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 ligação e mapear uma equipa 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 os cmdlets do conector Shifts, incluindo os cmdlets utilizados nos scripts, procure CsTeamsShiftsConnection na referência do cmdlet do Teams PowerShell. Seguem-se ligações para alguns cmdlets utilizados frequentemente, agrupados por categoria:

Ligações

credenciais de sistemas de WFM

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

Remover dados de agendamento

Instâncias de ligação

Mapeamento de utilizadores e sincronização com êxito

Mapeamento de equipa

ID da Operação

Relatórios de erros