Použití PowerShellu k připojení Shifts k Blue Yonder Workforce Management

Přehled

Pomocí konektoru Microsoft Teams Shifts pro Blue Yonder můžete integrovat aplikaci Shifts v Microsoft Teams s blue yonder Workforce Management (Blue Yonder WFM). Vaši pracovníci v první linii můžou bez problémů zobrazovat a spravovat své plány v Blue Yonder WFM v rámci směn.

V tomto článku vás provedeme postupem použití PowerShellu k nastavení a konfiguraci konektoru pro integraci Shifts s Blue Yonder WFM.

Pokud chcete nastavit připojení, spusťte skript PowerShellu. Skript nakonfiguruje konektor, použije nastavení synchronizace, vytvoří připojení a mapuje instance Blue Yonder WFM na týmy. Nastavení synchronizace určuje funkce povolené ve směnách a informace o plánu, které se synchronizují mezi blue yonder WFM a Shifts. Mapování definují vztah synchronizace mezi instancemi Blue Yonder WFM a týmy v Teams. Můžete se mapovat na existující týmy a nové týmy.

Nabízíme dva skripty. Můžete použít skript v závislosti na tom, jestli chcete namapovat na existující týmy, nebo vytvořit nové týmy, na které se chcete mapovat.

Můžete nastavit více připojení, z nichž každé má jiné nastavení synchronizace. Pokud má vaše organizace například více umístění s různými požadavky na plán, vytvořte připojení s jedinečným nastavením synchronizace pro každé umístění. Mějte na paměti, že instanci WFM Blue Yonder lze v daném okamžiku namapovat pouze na jeden tým. Pokud už je instance namapovaná na tým, nelze ji namapovat na jiný tým.

Díky systému Blue Yonder WFM jako záznamu můžou vaši pracovníci v první linii efektivně spravovat své plány a dostupnost ve směnách na svých zařízeních. Správci frontové linie můžou k nastavení plánů dál používat Blue Yonder WFM.

Poznámka

Pomocí průvodce konektorem Shifts v Centrum pro správu Microsoftu 365 můžete také připojit Směny k WFM Blue Yonder.

Než začnete

Požadavky

Než začnete, ujistěte se, že splňujete všechny následující požadavky:

  • Máte Blue Yonder WFM verze 2020.3, 2021.1 nebo 2021.2.

    Poznámka

    Pokud máte Blue Yonder WFM 2020.3 nebo 2021.1, použijte opravu 2020.3.0.4 nebo 2021.1.0.3. Tato oprava opravuje problém, kdy se uživatelům ve směnách zobrazuje trvalá chybová zpráva. Opravuje také problém, který uživatelům brání v aktualizaci jejich dostupnosti ve směnách.

  • Znáte název účtu služby Blue Yonder WFM, heslo a adresy URL služby:

    • Adresa URL federovaného ověřování
    • Adresa URL ověřování souborů cookie
    • Adresa URL samoobslužné služby pro zaměstnance
    • Adresa URL webového rozhraní API pro maloobchod
    • Adresa URL rozhraní API Správce webů
    • Adresa URL rozhraní API pro správu

    Pokud nemáte všechny tyto informace, kontaktujte podporu Blue Yonder. Účet Blue Yonder je vytvořen na úrovni kořenového podniku podnikovým správcem Blue Yonder. Musí mít přístup k rozhraní API, klientský Správa, Store Manager a přístup pracovního procesu. Účet a heslo se vyžadují k vytvoření připojení.

  • Ve vašem prostředí Blue Yonder WFM je povolené federované jednotné přihlašování. Kontaktujte podporu Blue Yonder a ujistěte se, že je povolené federované jednotné přihlašování. Budou potřebovat následující informace:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize where {tenantId} is your tenantId
    • proxyHeader: X-MS-AuthToken
  • V Teams máte aspoň jeden tým.

  • Přidali jste obecný účet, kterému říkáme systémový účet Microsoft 365, jako vlastníka týmu pro všechny týmy, které chcete mapovat.

    Vytvořte tento účet v Centrum pro správu Microsoftu 365 a přiřaďte mu licenci Microsoft 365. Pak přidejte účet jako vlastníka týmu ke všem týmům, které chcete mapovat. Konektor Směny používá tento účet při synchronizaci změn Shifts z Blue Yonder WFM. Doporučujeme, abyste si vytvořili účet speciálně pro tento účel a nepoužívejte svůj osobní uživatelský účet.

Správa role pro správu konektoru pomocí PowerShellu

Abyste mohli provést kroky v tomto článku, musíte být globálním správcem Microsoftu 365 nebo správcem konektoru Shifts.

Role správce konektoru Shifts je vlastní role, kterou vytvoříte v Microsoft Entra ID a přiřadíte uživateli. Název role musí být "Správce konektoru Směny". Role nemusí mít žádná konkrétní oprávnění, i když při jejím vytváření musí být nastaveno alespoň jedno oprávnění. Služba spoléhá na přítomnost role u uživatele, nikoli na její oprávnění.

Další informace najdete v tématech Vytvoření a přiřazení vlastní role v id Microsoft Entra a Přiřazení rolí Microsoft Entra uživatelům. Mějte na paměti, že vytvoření role a použití role pro uživatele může trvat až 24 hodin.

Nastavení prostředí

  1. Nainstalujte PowerShell verze 7 nebo novější. Podrobné pokyny najdete v tématu Instalace PowerShellu ve Windows.

  2. Spusťte PowerShell v režimu správce.

  3. Nainstalujte modul Microsoft Graph PowerShellu.

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

    Ověřte, že je verze 1.6.1 nebo novější.

    Get-InstalledModule Microsoft.Graph 
    
  4. Nainstalujte modul PowerShellu pro Teams Preview.

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

    Ověřte, že je aspoň verze 4.7.0 a obsahuje rutiny konektoru Shifts.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Nastavte PowerShell tak, aby se ukončil, pokud při spuštění skriptu dojde k chybě.

    $ErrorActionPreference = "Stop" 
    
  6. Povolte spouštění skriptů ve Windows.

    Set-ExecutionPolicy bypass 
    

Připojení k Teams

Spuštěním následujícího příkazu se připojte k Teams.

Connect-MicrosoftTeams

Po zobrazení výzvy se přihlaste pomocí přihlašovacích údajů správce. Teď máte nastavené spouštění skriptů v tomto článku a rutinách konektoru Shifts.

Identifikace týmů, které chcete mapovat

Poznámka

Tento krok proveďte, pokud mapujete instance blue yonder WFM na existující týmy. Pokud vytváříte nové týmy, na které se chcete mapovat, můžete tento krok přeskočit.

V Azure Portal přejděte na stránku Všechny skupiny a získejte seznam Id týmu týmů ve vaší organizaci.

Poznamenejte si ID týmu týmů, které chcete mapovat. Skript vás vyzve k zadání těchto informací.

Poznámka

Pokud má jeden nebo více týmů existující plán, skript tyto plány z těchto týmů odebere. V opačném případě uvidíte duplicitní směny.

Spuštění skriptu

Spusťte jeden z následujících skriptů v závislosti na tom, jestli vytváříte nový tým nebo mapování na existující tým:

  • Pokud chcete nastavit připojení, vytvořte v Teams nový tým a namapujte instanci Blue Yonder WFM na nový tým, spusťte nový týmový skript.
  • Pokud chcete nastavit připojení a namapovat instance Blue Yonder WFM na existující týmy v Teams, spusťte existující týmový skript.

Při spuštění skriptu postupujte podle pokynů na obrazovce. Skript provede následující akce:

  1. Otestujte a ověřte připojení k blue yonder WFM pomocí přihlašovacích údajů účtu služby Blue Yonder WFM a adres URL služeb, které zadáte.

  2. Použijte nastavení synchronizace. Mezi tato nastavení patří frekvence synchronizace (v minutách) a data plánu synchronizovaná mezi blue yonderem WFM a směnami. Můžete povolit data plánu definovaná v těchto scénářích: Shift, SwapRequest, UserShiftPreferences, OpenShift, , OpenShiftRequest, TimeOff, . TimeOffRequest

    Další informace najdete v tématu New-CsTeamsShiftsConnectionInstance. Pokud chcete zobrazit seznam podporovaných možností synchronizace pro jednotlivé parametry, spusťte rutinu Get-CsTeamsShiftsConnectionConnector.

    Poznámka

    Skript povolí synchronizaci pro každou podporovanou možnost synchronizace. Pokud chcete změnit nastavení synchronizace, můžete to udělat po nastavení připojení. Další informace najdete v tématu Použití PowerShellu ke správě připojení Shifts k blue yonder Workforce Management.

  3. Namapujte instance Blue Yonder WFM na vaše týmy v Teams.

    • Pokud jste se rozhodli spustit nový týmový skript pro vytvoření nových týmů, mapování jsou založená na nových týmech, které vytvoříte.
    • Pokud jste se rozhodli spustit existující skript teams pro mapování existujících týmů, mapování jsou založená na ID instancí Blue Yonder a Id týmu, které zadáte. Pokud má tým existující plán, skript odebere všechna data plánu.

Po spuštění skriptu se zobrazí zpráva o úspěšném nastavení připojení.

Správa připojení

Po nastavení připojení ho můžete spravovat a měnit v Centrum pro správu Microsoftu 365 nebo pomocí PowerShellu.

Použití Centrum pro správu Microsoftu 365

Na stránce Správa konektoru se zobrazí seznam jednotlivých připojení, která jste nastavili, spolu s informacemi, jako je stav a podrobnosti o intervalu synchronizace. Můžete také získat přístup k průvodci a provádět změny v libovolném z vašich připojení. Můžete například aktualizovat nastavení synchronizace a týmová mapování.

Další informace najdete v tématu Použití Centrum pro správu Microsoftu 365 ke správě připojení Směny k blue yonder Workforce Management.

Použití PowerShellu

Pomocí PowerShellu můžete zobrazit zprávu o chybách, změnit nastavení připojení, zakázat synchronizaci atd. Podrobné pokyny najdete v tématu Použití PowerShellu ke správě připojení Směny k blue yonder Workforce Management.

Skripty

Nastavení připojení a vytvoření nového týmu

#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

Nastavení připojení a mapování existujícího týmu

#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

Rutiny konektoru Shifts

Pokud potřebujete pomoc s rutinami konektoru Shifts, včetně rutin použitých ve skriptech, vyhledejte CsTeamsShiftsConnection v referenčních informacích k rutinám PowerShellu pro Teams. Tady jsou odkazy na některé běžně používané rutiny seskupené podle kategorií:

Připojení

přihlašovací údaje WFM systémů

Možnosti synchronizace pro podporované scénáře

Odebrání dat plánu

Instance připojení

Mapování uživatelů a úspěšná synchronizace

Mapování týmu

ID operace

Zprávy o chybách