Usare PowerShell per connettere Turni a Blue Yonder Workforce Management

Panoramica

Usare il connettore Turni di Microsoft Teams per Blue Yonder per integrare l'app Turni in Microsoft Teams con Blue Yonder Workforce Management (Blue Yonder WFM). I dipendenti in prima linea possono visualizzare e gestire facilmente le pianificazioni in Blue Yonder WFM dall'interno di Turni.

In questo articolo viene illustrato come usare PowerShell per impostare e configurare il connettore per integrare Turni con Blue Yonder WFM.

Per configurare la connessione, eseguire uno script di PowerShell. Lo script configura il connettore, applica le impostazioni di sincronizzazione, crea la connessione e esegue il mapping delle istanze di Blue Yonder WFM ai team. Le impostazioni di sincronizzazione determinano le funzionalità abilitate in Turni e le informazioni pianificare sincronizzate tra blue yonder WFM e turni. I mapping definiscono la relazione di sincronizzazione tra le istanze di Blue Yonder WFM e i team in Teams. È possibile eseguire il mapping a team esistenti e nuovi team.

Vengono forniti due script. È possibile usare uno script, a seconda che si voglia eseguire il mapping ai team esistenti o creare nuovi team di cui eseguire il mapping.

È possibile configurare più connessioni, ognuna con impostazioni di sincronizzazione diverse. Ad esempio, se l'organizzazione ha più posizioni con requisiti di pianificazione diversi, creare una connessione con impostazioni di sincronizzazione univoche per ogni posizione. Tenere presente che un'istanza di WFM Blue Yonder può essere mappata solo a un team in un determinato momento. Se un'istanza è già mappata a un team, non può essere mappata a un altro team.

Con Blue Yonder WFM come sistema di registrazione, i dipendenti in prima linea possono gestire in modo efficiente le pianificazioni e la disponibilità in Turni nei propri dispositivi. I manager in prima linea possono continuare a usare Blue Yonder WFM per configurare le pianificazioni.

Nota

È anche possibile usare la procedura guidata del connettore Turni nell’interfaccia di amministrazione di Microsoft 365 per connettere Turni a Blue Yonder WFM.

Prima di iniziare

Prerequisiti

Prima di iniziare, assicurarsi di soddisfare tutti i prerequisiti seguenti:

  • È disponibile Blue Yonder WFM versione 2020.3, 2021.1 o 2021.2.

    Nota

    Se si dispone di Blue Yonder WFM 2020.3 o 2021.1, applicare la patch 2020.3.0.4 o 2021.1.0.3. Questa patch risolve un problema a causa del quale gli utenti ricevono un messaggio di errore permanente in Turni. Risolve anche un problema che impedisce agli utenti di aggiornare la loro disponibilità in Turni.

  • Si conoscono il nome dell'account del servizio WFM Blue Yonder, la password e gli URL del servizio:

    • URL autenticazione federata
    • URL di autenticazione cookie
    • URL Employee Self-Service
    • URL API Web Retail
    • URL API Gestione siti
    • URL API di amministrazione

    Se non si dispone di tutte queste informazioni, contattare il supporto di Blue Yonder. Un account Blue Yonder viene creato a livello aziendale radice da un amministratore dell'organizzazione Blue Yonder. Deve disporre dell'accesso API, dell'amministratore client, del gestore dello Store e del ruolo di lavoro. L'account e la password sono necessari per creare una connessione.

  • L'autenticazione SSO federata è abilitata nell'ambiente Blue Yonder WFM. Contattare il supporto di Blue Yonder per assicurarsi che l'accesso SSO federato sia abilitato. Necessitano delle seguenti informazioni:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize dove {tenantId} è il tenantId
    • proxyHeader: X-MS-AuthToken
  • È stato configurato almeno un team in Teams.

  • È stato aggiunto un account generale, denominato account di sistema microsoft 365, come proprietario del team a tutti i team di cui si vuole eseguire il mapping.

    Creare questo account nell'interfaccia di amministrazione di Microsoft 365 e assegnargli una licenza di Microsoft 365. Aggiungere quindi l'account come proprietario del team a tutti i team di cui si vuole eseguire il mapping. Il connettore Turni usa questo account durante la sincronizzazione delle modifiche dei turni da Blue Yonder WFM. È consigliabile creare un account specifico per questo scopo e non usare l'account utente personale.

Ruolo di amministratore per gestire il connettore tramite PowerShell

Per completare la procedura descritta in questo articolo, è necessario essere un amministratore globale di Microsoft 365 o un amministratore del connettore Turni.

Il ruolo di amministratore del connettore Turni è un ruolo personalizzato creato in Microsoft Entra ID e assegnato a un utente. Il nome del ruolo deve essere "Amministratore connettore turni". Il ruolo non deve avere autorizzazioni specifiche, anche se è necessario impostare almeno un'autorizzazione al momento della creazione. Il servizio si basa sulla presenza del ruolo sull'utente e non sulle relative autorizzazioni.

Per altre informazioni, vedere Creare e assegnare un ruolo personalizzato in Microsoft Entra ID e Assegnare ruoli di Microsoft Entra agli utenti. Tenere presente che la creazione e l'applicazione del ruolo a un utente possono richiedere fino a 24 ore.

Importante

Microsoft consiglia di usare i ruoli con il minor numero di autorizzazioni. Ciò consente di migliorare la sicurezza per l'organizzazione. Amministratore globale è un ruolo con privilegi elevati che deve essere limitato agli scenari di emergenza quando non è possibile usare un ruolo con privilegi inferiori.

Configurare l'ambiente

  1. Installare PowerShell versione 7 o successiva. Per istruzioni dettagliate, vedere Installazione di PowerShell in Windows.

  2. Esegui Powershell in modalità Amministratore.

  3. Installare il modulo Microsoft Graph PowerShell.

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

    Verificare che sia la versione 1.6.1 o successiva.

    Get-InstalledModule Microsoft.Graph 
    
  4. Installare il modulo PowerShell di anteprima di Teams.

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

    Verificare che sia almeno la versione 4.7.0 e che contenga i cmdlet del connettore Turni.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Impostare PowerShell in modo che venga chiuso se si verifica un errore durante l'esecuzione dello script.

    $ErrorActionPreference = "Stop" 
    
  6. Abilitare l'esecuzione degli script in Windows.

    Set-ExecutionPolicy bypass 
    

Connettiti a Teams

Eseguire quanto segue per connettersi a Teams.

Connect-MicrosoftTeams

Quando viene richiesto, accedere usando le credenziali di amministratore. È ora possibile configurare l'esecuzione degli script in questo articolo e nei cmdlet del connettore Turni.

Identificare i team di cui si vuole eseguire il mapping

Nota

Completare questo passaggio se si esegue il mapping delle istanze di Blue Yonder WFM ai team esistenti. Se si creano nuovi team a cui eseguire il mapping, è possibile ignorare questo passaggio.

Nel portale di Azure passare alla pagina Tutti i gruppi per ottenere un elenco dei TeamId dei team nell'organizzazione.

Prendere nota dei TeamId dei team di cui si vuole eseguire il mapping. Lo script richiederà di immettere queste informazioni.

Nota

Se uno o più team hanno una pianificazione esistente, lo script rimuoverà le pianificazioni da tali team. In caso contrario, verranno visualizzati turni duplicati.

Eseguire lo script

Eseguire uno degli script seguenti, a seconda che si stia creando un nuovo team o eseguendo il mapping a un team esistente:

  • Per configurare una connessione, creare un nuovo team in Teams ed eseguire il mapping di un'istanza WFM blue yonder al nuovo team, eseguire il nuovo script di teams.
  • Per configurare una connessione e eseguire il mapping delle istanze WFM di Blue Yonder ai team esistenti in Teams, eseguire lo script di teams esistente.

Seguire le istruzioni visualizzate quando si esegue lo script. Lo script completa le azioni seguenti:

  1. Testare e verificare la connessione a Blue Yonder WFM usando le credenziali dell'account del servizio Blue Yonder WFM e gli URL del servizio immessi.

  2. Applicare le impostazioni di sincronizzazione. Queste impostazioni includono la frequenza di sincronizzazione (in minuti) e i dati di pianificazione sincronizzati tra Blue Yonder WFM e Turni. È possibile abilitare i dati di pianificazione definiti da questi scenari: Shift, SwapRequest, UserShiftPreferences, OpenShift, OpenShiftRequest, TimeOff, TimeOffRequest.

    Per altre informazioni, vedere New-CsTeamsShiftsConnectionInstance. Per visualizzare l'elenco delle opzioni di sincronizzazione supportate per ogni parametro, eseguire Get-CsTeamsShiftsConnectionConnector.

    Nota

    Lo script abilita la sincronizzazione per ogni opzione di sincronizzazione supportata. Se si desidera modificare le impostazioni di sincronizzazione, è possibile farlo dopo la configurazione della connessione. Per altre informazioni, vedere Usare PowerShell per gestire la connessione turni a Blue Yonder Workforce Management.

  3. Eseguire il mapping delle istanze WFM di Blue Yonder ai team in Teams.

    • Se si sceglie di eseguire il nuovo script di teams per creare nuovi team, i mapping si basano sui nuovi team creati.
    • Se si è scelto di eseguire lo script di teams esistente per eseguire il mapping dei team esistenti, i mapping sono basati sugli ID dell'istanza di Blue Yonder e sui TeamId immessi. Se un team ha una pianificazione esistente, lo script rimuove tutti i dati di pianificazione.

Dopo aver eseguito lo script, un messaggio Di successo conferma se la connessione è stata configurata correttamente.

Gestire la connessione

Dopo aver configurato una connessione, è possibile gestirla e apportarvi modifiche nell'interfaccia di amministrazione di Microsoft 365 o usando PowerShell.

Usare l'interfaccia di amministrazione di Microsoft 365

La pagina Gestione connettori elenca ogni connessione configurata, insieme a informazioni quali lo stato di integrità e i dettagli dell'intervallo di sincronizzazione. È anche possibile accedere alla procedura guidata per apportare modifiche a qualsiasi connessione. Ad esempio, è possibile aggiornare le impostazioni di sincronizzazione e i mapping del team.

Per altre informazioni, vedere Usare l'interfaccia di amministrazione di Microsoft 365 per gestire la connessione turni a Blue Yonder Workforce Management.

Usare PowerShell.

È possibile usare PowerShell per visualizzare un report degli errori, modificare le impostazioni di connessione, disabilitare la sincronizzazione e altro ancora. Per istruzioni dettagliate, vedere Usare PowerShell per gestire la connessione di Turni a Workforce Management di Blue Yonder.

Script

Configurare una connessione e creare un nuovo team

#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

Configurare una connessione e eseguire il mapping di un team esistente

#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

Cmdlet del connettore Turni

Per informazioni sui cmdlet del connettore Turni, inclusi i cmdlet usati negli script, cercare CsTeamsShiftsConnection nelle informazioni di riferimento sui cmdlet di Teams PowerShell. Ecco i collegamenti ad alcuni cmdlet di uso comune, raggruppati per categoria:

Connections

Credenziali dei sistemi WFM

Opzioni di sincronizzazione per gli scenari supportati

Rimuovere i dati di pianificazione

Istanze di connessione

Mapping utente e sincronizzazione riuscita

Mapping del team

ID operazione

Segnalazioni di errori