Udostępnij za pośrednictwem


Łączenie funkcji Shift z rozwiązaniem Blue Yonder Workforce Management przy użyciu programu PowerShell

Omówienie

Użyj łącznika Microsoft Teams Shifts for Blue Yonder , aby zintegrować aplikację Shifts w usłudze Microsoft Teams z rozwiązaniem Blue Yonder Workforce Management (Blue Yonder WFM). Twoi pracownicy pierwszej linii mogą bezproblemowo wyświetlać swoje harmonogramy i zarządzać nimi w programie Blue Yonder WFM z poziomu usługi Shifts.

W tym artykule opisano sposób używania programu PowerShell do konfigurowania i konfigurowania łącznika w celu integracji rozwiązania Shifts z programem Blue Yonder WFM.

Aby skonfigurować połączenie, uruchom skrypt programu PowerShell. Skrypt konfiguruje łącznik, stosuje ustawienia synchronizacji, tworzy połączenie i mapuje wystąpienia programu Blue Yonder WFM do zespołów. Ustawienia synchronizacji określają funkcje włączone w usłudze Shifts oraz informacje o harmonogramie synchronizowane między programami Blue Yonder WFM i Shifts. Mapowania definiują relację synchronizacji między wystąpieniami programu Blue Yonder WFM i zespołami w usłudze Teams. Możesz mapować istniejące zespoły i nowe zespoły.

Udostępniamy dwa skrypty. Możesz użyć dowolnego skryptu, w zależności od tego, czy chcesz mapować istniejące zespoły, czy tworzyć nowe zespoły do mapowania.

Możesz skonfigurować wiele połączeń, z których każde ma różne ustawienia synchronizacji. Jeśli na przykład organizacja ma wiele lokalizacji z różnymi wymaganiami dotyczącymi harmonogramu, utwórz połączenie z unikatowymi ustawieniami synchronizacji dla każdej lokalizacji. Należy pamiętać, że wystąpienie programu Blue Yonder WFM można zamapować tylko do jednego zespołu w danym momencie. Jeśli wystąpienie zostało już zamapowane do zespołu, nie można go zamapować na inny zespół.

Dzięki rozwiązaniu Blue Yonder WFM jako systemowi rekordów pracownicy pierwszej linii mogą efektywnie zarządzać swoimi harmonogramami i dostępnością w rozwiązaniach Shift na swoich urządzeniach. Menedżerowie linii frontu mogą nadal używać programu Blue Yonder WFM do konfigurowania harmonogramów.

Uwaga

Możesz również użyć kreatora łącznika Shifts w centrum administracyjnym platformy Microsoft 365, aby połączyć się z usługą Shifts do programu Blue Yonder WFM.

Przed rozpoczęciem

Wymagania wstępne

Przed rozpoczęciem upewnij się, że spełniasz wszystkie następujące wymagania wstępne:

  • Masz program Blue Yonder WFM w wersji 2020.3, 2021.1 lub 2021.2.

    Uwaga

    Jeśli masz program Blue Yonder WFM 2020.3 lub 2021.1, zastosuj poprawkę 2020.3.0.4 lub 2021.1.0.3. Ta poprawka rozwiązuje problem polegający na tym, że użytkownicy otrzymują trwały komunikat o błędzie w usłudze Shifts. Rozwiązano również problem uniemożliwiający użytkownikom aktualizowanie ich dostępności w usłudze Shifts.

  • Znasz nazwę konta usługi Blue Yonder WFM, hasło i adresy URL usługi:

    • Adres URL uwierzytelniania federacyjnego
    • Adres URL uwierzytelniania plików cookie
    • Adres URL samoobsługowego pracownika
    • Adres URL internetowego interfejsu API handlu detalicznego
    • Adres URL interfejsu API menedżera lokacji
    • Adres URL interfejsu API administracji

    Jeśli nie masz wszystkich tych informacji, skontaktuj się z pomocą techniczną firmy Blue Yonder. Konto Blue Yonder jest tworzone na głównym poziomie przedsiębiorstwa przez administratora przedsiębiorstwa Blue Yonder. Musi mieć dostęp do interfejsu API, administratora klienta, menedżera sklepu i procesu roboczego. Konto i hasło są wymagane do utworzenia połączenia.

  • Federacyjne uwierzytelnianie logowania jednokrotnego jest włączone w środowisku blue Yonder WFM. Skontaktuj się z pomocą techniczną aplikacji Blue Yonder, aby upewnić się, że włączono federacyjne logowanie jednokrotne. Będą oni potrzebować następujących informacji:

    • federacyjneSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize gdzie {tenantId} jest identyfikator dzierżawy
    • proxyHeader: X-MS-AuthToken
  • Masz co najmniej jeden zespół skonfigurowany w usłudze Teams.

  • Dodano konto ogólne, które nazywamy kontem systemowym platformy Microsoft 365, jako właściciela zespołu do wszystkich zespołów, które chcesz zamapować.

    Utwórz to konto w centrum administracyjnym platformy Microsoft 365 i przypisz mu licencję platformy Microsoft 365. Następnie dodaj konto jako właściciela zespołu do wszystkich zespołów, które chcesz zamapować. Łącznik Shifts używa tego konta podczas synchronizowania zmian zmian z programu Blue Yonder WFM. Zalecamy utworzenie konta specjalnie do tego celu i nie używanie osobistego konta użytkownika.

Rola administratora do zarządzania łącznikiem przy użyciu programu PowerShell

Aby wykonać kroki opisane w tym artykule, musisz być administratorem globalnym platformy Microsoft 365 lub administratorem łącznika shifts.

Rola administratora łącznika Shifts to rola niestandardowa, którą tworzysz w identyfikatorze Microsoft Entra i przypisujesz do użytkownika. Nazwa roli musi być "Shifts connector admin". Rola nie musi mieć żadnych określonych uprawnień, chociaż podczas jej tworzenia należy ustawić co najmniej jedno uprawnienie. Usługa opiera się na obecności roli na użytkowniku, a nie na jego uprawnieniach.

Aby dowiedzieć się więcej, zobacz Create and assign a custom role in Microsoft Entra ID (Tworzenie i przypisywanie roli niestandardowej w identyfikatorze Microsoft Entra ) oraz Assign Microsoft Entra roles to users (Przypisywanie ról microsoft entra do użytkowników). Pamiętaj, że utworzenie i zastosowanie roli do użytkownika może potrwać do 24 godzin.

Ważna

Firma Microsoft rekomenduje używanie ról z najmniejszą liczbą uprawnień. Pomaga to zwiększyć bezpieczeństwo organizacji. Administrator globalny to rola o wysokim poziomie uprawnień, która powinna być ograniczona do scenariuszy awaryjnych, gdy nie można użyć roli o mniej uprzywilejowanych uprawnieniach.

Konfigurowanie środowiska

  1. Zainstaluj program PowerShell w wersji 7 lub nowszej. Aby uzyskać szczegółowe wskazówki, zobacz Instalowanie programu PowerShell w systemie Windows.

  2. Uruchom program PowerShell w trybie administratora.

  3. Zainstaluj moduł Programu PowerShell programu Microsoft Graph.

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

    Sprawdź, czy jest to wersja 1.6.1 lub nowsza.

    Get-InstalledModule Microsoft.Graph 
    
  4. Zainstaluj moduł Programu PowerShell w wersji zapoznawczej aplikacji Teams.

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

    Sprawdź, czy jest to co najmniej wersja 4.7.0 i czy zawiera polecenia cmdlet łącznika Shifts.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Ustaw program PowerShell, aby zakończyć działanie, jeśli wystąpi błąd podczas uruchamiania skryptu.

    $ErrorActionPreference = "Stop" 
    
  6. Włącz uruchamianie skryptów w systemie Windows.

    Set-ExecutionPolicy bypass 
    

Łączenie z usługą Teams

Uruchom następujące polecenie, aby nawiązać połączenie z usługą Teams.

Connect-MicrosoftTeams

Po wyświetleniu monitu zaloguj się przy użyciu poświadczeń administratora. Teraz skonfigurowano uruchamianie skryptów w tym artykule i poleceń cmdlet łącznika Shifts.

Identyfikowanie zespołów, które chcesz zamapować

Uwaga

Wykonaj ten krok, jeśli mapujesz wystąpienia programu Blue Yonder WFM na istniejące zespoły. Jeśli tworzysz nowe zespoły do mapowania, możesz pominąć ten krok.

W witrynie Azure Portal przejdź do strony Wszystkie grupy , aby uzyskać listę identyfikatorów TeamId zespołów w organizacji.

Zanotuj identyfikatory teamid zespołów, które chcesz mapować. Skrypt wyświetli monit o wprowadzenie tych informacji.

Uwaga

Jeśli co najmniej jeden zespół ma istniejący harmonogram, skrypt usunie harmonogramy z tych zespołów. W przeciwnym razie zobaczysz zduplikowane zmiany.

Uruchamianie skryptu

Uruchom jeden z następujących skryptów, w zależności od tego, czy tworzysz nowy zespół, czy mapujesz go na istniejący zespół:

  • Aby skonfigurować połączenie, utwórz nowy zespół w usłudze Teams i zamapuj wystąpienie programu Blue Yonder WFM na nowy zespół, uruchom nowy skrypt teams.
  • Aby skonfigurować połączenie i zamapować wystąpienia programu Blue Yonder WFM na istniejące zespoły w usłudze Teams, uruchom istniejący skrypt zespołów.

Postępuj zgodnie z instrukcjami wyświetlanymi na ekranie podczas uruchamiania skryptu. Skrypt wykonuje następujące akcje:

  1. Przetestuj i sprawdź połączenie z programem Blue Yonder WFM przy użyciu wprowadzonych poświadczeń konta usługi Blue Yonder WFM i adresów URL usługi.

  2. Zastosuj ustawienia synchronizacji. Te ustawienia obejmują częstotliwość synchronizacji (w minutach) i dane harmonogramu synchronizowane między programami Blue Yonder WFM i Shifts. Możesz włączyć dane harmonogramu zdefiniowane przez następujące scenariusze: , , , OpenShift, , OpenShiftRequest, , . TimeOffRequestTimeOffUserShiftPreferencesSwapRequestShift

    Aby dowiedzieć się więcej, zobacz New-CsTeamsShiftsConnectionInstance. Aby wyświetlić listę obsługiwanych opcji synchronizacji dla każdego parametru, uruchom polecenie Get-CsTeamsShiftsConnectionConnector.

    Uwaga

    Skrypt umożliwia synchronizację dla każdej obsługiwanej opcji synchronizacji. Jeśli chcesz zmienić ustawienia synchronizacji, możesz to zrobić po skonfigurowaniu połączenia. Aby dowiedzieć się więcej, zobacz Używanie programu PowerShell do zarządzania połączeniem shifts z rozwiązaniem Blue Yonder Workforce Management.

  3. Mapuj wystąpienia programu Blue Yonder WFM na swoje zespoły w usłudze Teams.

    • Jeśli wybrano uruchomienie skryptu nowych zespołów w celu utworzenia nowych zespołów, mapowania są oparte na utworzonych nowych zespołach.
    • Jeśli wybrano opcję uruchomienia istniejącego skryptu zespołu w celu mapowania istniejących zespołów, mapowania są oparte na wprowadzonych identyfikatorach wystąpień blue Yonder i identyfikatorach zespołu. Jeśli zespół ma istniejący harmonogram, skrypt usuwa wszystkie dane harmonogramu.

Po uruchomieniu skryptu komunikat o powodzeniu potwierdza, czy połączenie zostało pomyślnie skonfigurowane.

Zarządzanie połączeniem

Po skonfigurowaniu połączenia możesz zarządzać nim i wprowadzać w nim zmiany w centrum administracyjnym platformy Microsoft 365 lub przy użyciu programu PowerShell.

Korzystanie z centrum administracyjnego platformy Microsoft 365

Strona Zarządzanie łącznikami zawiera listę wszystkich skonfigurowanych połączeń wraz z informacjami, takimi jak stan kondycji i szczegóły interwału synchronizacji. Możesz również uzyskać dostęp do kreatora, aby wprowadzić zmiany w dowolnym połączeniu. Można na przykład zaktualizować ustawienia synchronizacji i mapowania zespołów.

Aby dowiedzieć się więcej, zobacz Używanie centrum administracyjnego platformy Microsoft 365 do zarządzania połączeniem shifts z rozwiązaniem Blue Yonder Workforce Management.

Korzystanie z programu PowerShell

Za pomocą programu PowerShell można wyświetlić raport o błędach, zmienić ustawienia połączenia, wyłączyć synchronizację i nie tylko. Aby uzyskać szczegółowe wskazówki, zobacz Używanie programu PowerShell do zarządzania połączeniem shifts z rozwiązaniem Blue Yonder Workforce Management.

Skrypty

Konfigurowanie połączenia i tworzenie nowego zespołu

#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

Konfigurowanie połączenia i mapowanie istniejącego zespołu

#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

Przesunięcia poleceń cmdlet łącznika

Aby uzyskać pomoc dotyczącą poleceń cmdlet łącznika Shifts, w tym poleceń cmdlet używanych w skryptach, wyszukaj ciąg CsTeamsShiftsConnection w dokumentacji poleceń cmdlet programu Teams programu PowerShell. Poniżej przedstawiono linki do niektórych często używanych poleceń cmdlet pogrupowanych według kategorii:

Połączenia

Poświadczenia systemów programu WFM

Opcje synchronizacji dla obsługiwanych scenariuszy

Usuwanie danych harmonogramu

Wystąpienia połączeń

Mapowanie użytkownika i pomyślne synchronizowanie

Mapowanie zespołu

Identyfikator operacji

Raporty o błędach