PowerShell を使用して Shifts を Blue Yonder Workforce Managementに接続する
概要
Blue Yonder 用の Microsoft Teams Shifts コネクタを使用して、Microsoft Teams の Shifts アプリを Blue Yonder Workforce Management (Blue Yonder WFM) と統合します。 接続が設定されると、フロントライン ワーカーは、Shifts 内から Blue Yonder WFMでスケジュールをシームレスに表示および管理できます。
この記事では、PowerShell を使用して、Shifts と Blue Yonder WFMを統合するようにコネクタを設定および構成する方法について説明します。
接続を設定するには、PowerShell スクリプトを実行します。 このスクリプトでは、コネクタを構成し、同期設定を適用し、接続を作成し、Blue Yonder WFM インスタンスをチームにマップします。 同期設定は、Shifts で有効になっている機能と、Blue Yonder WFMと Shifts の間で同期されるスケジュール情報を決定します。 マッピングは、Blue Yonder WFM インスタンスと Teams 内のチーム間の同期関係を定義します。 既存のチームと新しいチームにマップできます。
2 つのスクリプトを提供します。 既存のチームにマップするか、マップする新しいチームを作成するかに応じて、どちらのスクリプトを使用することもできます。
複数の接続を設定できます。それぞれ異なる同期設定を使用します。 たとえば、組織に異なるスケジュール要件を持つ複数の場所がある場合は、場所ごとに一意の同期設定を持つ接続を作成します。 Blue Yonder WFM インスタンスは、特定の時点で 1 つのチームにのみマップできることに注意してください。 インスタンスが既にチームにマップされている場合、別のチームにマップすることはできません。
Blue Yonder WFMをレコードのシステムとして使用すると、フロントライン ワーカーはシフトの表示と交換、可用性の管理、デバイスの Shifts での休暇の要求を行うことができます。 フロントライン マネージャーは、引き続き Blue Yonder WFMを使用してスケジュールを設定できます。
注意
Microsoft 365 管理センターの Shifts コネクタ ウィザードを使用して、Shifts を Blue Yonder WFMに接続することもできます。
はじめに
前提条件
作業を開始する前に、次の前提条件があることを確認します。
Blue Yonder WFM バージョン 2020.3、2021.1、または 2021.2。
注意
Blue Yonder WFM 2020.3 または 2021.1 がある場合は、2020.3.0.4 または 2021.1.0.3 パッチを適用します。 この修正プログラムは、ユーザーが Shifts で永続的なエラー メッセージを受け取る問題を修正します。 また、ユーザーが Shifts で可用性を更新できない問題も修正されます。
Blue Yonder WFM サービス アカウント名とパスワードとサービス URL:
- フェデレーション認証 URL
- Cookie 認証 URL
- 従業員セルフサービス URL
- Retail web API URL
- サイト マネージャー API URL
- 管理 API URL
この情報がない場合は、Blue Yonder サポートにお問い合わせください。 このアカウントは、Blue Yonder エンタープライズ管理者によってルートエンタープライズ レベルで作成されます。 API Access、クライアント管理者、および Store Manager アクセス権が必要です。 接続を作成するには、アカウントとパスワードが必要です。
フェデレーション SSO 認証は、Blue Yonder WFM 環境で有効になっています。 フェデレーション SSO が有効になっていることを確認するには、Blue Yonder サポートにお問い合わせください。 次の情報が必要になります。
- federatedSSOValidationService:
https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize{tenantId} が tenantId である場合 - proxyHeader: X-MS-AuthToken
- federatedSSOValidationService:
Teamsに少なくとも 1 つのチームが設定されています。
マップするすべてのチームに、Microsoft 365 システム アカウントをチーム所有者として追加しました。 Microsoft 365でこのアカウントを作成し、Microsoft 365 ライセンスを割り当てます。 次に、マップするすべてのチームにチーム所有者としてアカウントを追加します。 Shifts コネクタは、Blue Yonder WFM から Shifts の変更を同期するときに、このアカウントを使用します。
この目的のために特別にアカウントを作成し、ユーザー アカウントを使用しないことをお勧めします。
PowerShell を使用してコネクタを管理するロールを管理する
この記事の手順を完了するには、Microsoft 365グローバル管理者または Shifts コネクタ管理者である必要があります。
Shifts コネクタ管理者ロールは、Azure ADで作成し、ユーザーに割り当てるカスタム ロールです。 ロールの名前は、"Shifts コネクタ管理者" である必要があります。 ロールには特定のアクセス許可が必要ありませんが、作成時に少なくとも 1 つのアクセス許可を設定する必要があります。 このサービスは、アクセス許可ではなく、ユーザーに対するロールの存在に依存します。 詳細については、「Azure ADでカスタム ロールを作成して割り当てる」と「Azure AD ロールをユーザーに割り当てる」を参照してください。 ロールを作成してユーザーに適用するには、最大で 24 時間かかる場合があることに注意してください。
環境を設定する
PowerShell バージョン 7 以降をインストールします。 詳細なガイダンスについては、「Windowsへの PowerShell のインストール」を参照してください。
PowerShell を管理者モードで実行します。
Microsoft Graph PowerShell モジュールをインストールします。
Install-Module Microsoft.Graph Import-Module Microsoft.Graphバージョン 1.6.1 以降であることを確認します。
Get-InstalledModule Microsoft.GraphTeams プレビュー PowerShell モジュールをインストールします。
Install-Module -Name MicrosoftTeams -AllowPrerelease -Force Import-Module MicrosoftTeams少なくともバージョン 4.1.0 で、Shifts コネクタコマンドレットが含まれていることを確認します。
Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection*スクリプトの実行時にエラーが発生した場合は、PowerShell を終了するように設定します。
$ErrorActionPreference = "Stop"スクリプトをWindowsで実行できるようにします。
Set-ExecutionPolicy bypass
Teams に接続する
Teams に接続するには、次を実行します。
Connect-MicrosoftTeams
メッセージが表示されたら、管理者の資格情報を使用してサイン インします。 この記事のスクリプトと Shifts コネクタコマンドレットを実行するように設定しました。
マップするチームを特定する
注意
Blue Yonder WFM インスタンスを既存のチームにマッピングする場合は、この手順を完了します。 マップ先の新しいチームを作成する場合は、この手順をスキップできます。
Azure portalで、[すべてのグループ] ページに移動して、組織内のチームの TeamId の一覧を取得します。
マップするチームの TeamId をメモしておきます。 この情報の入力を求めるメッセージがスクリプトによって表示されます。
注意
1 つ以上のチームに既存のスケジュールがある場合、スクリプトはそれらのチームからスケジュールを削除します。 それ以外の場合は、重複するシフトが表示されます。
スクリプトを実行する
スクリプトを実行します。
- 接続を設定し、マップする新しいチームを作成するには、 このスクリプトを実行します。
- 接続を設定し、既存のチームにマップするには、 このスクリプトを実行します。
スクリプトは次のアクションを実行します。 セットアップと構成の詳細を入力するように求められます。
入力した Blue Yonder WFMサービス アカウントの資格情報とサービス URL を使用して、Blue Yonder WFMへの接続をテストして検証します。
Shifts コネクタを構成します。
同期設定を適用します。 これらの設定には、同期頻度 (分単位) と、Blue Yonder WFMと Shifts の間で同期されるスケジュール データが含まれます。 スケジュール データは、次のパラメーターで定義されます。
- enabledConnectorScenarios パラメーターは、Blue Yonder WFMから Shifts に同期されるデータを定義します。 オプションは
Shift、 , ,SwapRequest``UserShiftPreferences,OpenShift,TimeOff``OpenShiftRequest``TimeOffRequest, . - enabledWfiScenarios パラメーターは、Shifts から Blue Yonder WFMに同期されるデータを定義します。 オプションは
SwapRequest、 、OpenShiftRequest、TimeOffRequest.UserShiftPreferences
詳細については、「 New-CsTeamsShiftsConnectionInstance」を参照してください。 各パラメーターでサポートされている同期オプションの一覧を表示するには、 Get-CsTeamsShiftsConnectionConnectionConnector を実行します。
重要
このスクリプトを使用すると、これらのすべてのオプションの同期が有効になります。 同期設定を変更する場合は、接続の設定後に行うことができます。 詳細については、「PowerShell を使用して Blue Yonder Workforce Managementへの Shifts 接続を管理する」を参照してください。
- enabledConnectorScenarios パラメーターは、Blue Yonder WFMから Shifts に同期されるデータを定義します。 オプションは
接続を作成します。
Blue Yonder WFM インスタンスをチームにマップします。 マッピングは、実行するスクリプトに応じて、作成する Blue Yonder WFM インスタンス ID と TeamIds に基づきます。 チームに既存のスケジュールがある場合、スクリプトは指定した日付と時刻の範囲のスケジュール データを削除します。
画面の [成功] メッセージは、接続が正常に設定されたことを示します。
接続に変更を加える必要がある場合
セットアップ後に接続を変更するには、「PowerShell を使用して Blue Yonder Workforce Managementへの Shifts 接続を管理する」を参照してください。 たとえば、同期設定、チーム マッピングを更新し、接続の同期を無効にすることができます。
スクリプト
接続を設定し、マップする新しいチームを作成する
#Map WFM instances to teams script
Write-Host "Map WFM sites to teams"
Start-Sleep 1
#Ensure Teams module is at least version x
Write-Host "Checking Teams module version"
try {
Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 4.1.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-Host "Listing connector types available"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$connectors = Get-CsTeamsShiftsConnectionConnector
write $connectors
$blueYonder = $connectors | where {$_.Id -match $BlueYonderId}
$enabledConnectorScenario = $blueYonder.SupportedScenario
$wfiSupportedScenario = $blueYonder.wfiSupportedScenario
#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your WFM super user name'
$WfmPwd = Read-Host -Prompt 'Input your WFM password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))
#Test connection settings
Write-Host "Testing connection settings"
$InstanceName = Read-Host -Prompt 'Input connection instance 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 $InstanceName -ConnectorId $BlueYonderId -ConnectorSpecificSettingAdminApiUrl $adminApiUrl -ConnectorSpecificSettingCookieAuthUrl $cookieAuthUrl -ConnectorSpecificSettingEssApiUrl $essApiUrl -ConnectorSpecificSettingFederatedAuthUrl $federatedAuthUrl -ConnectorSpecificSettingRetailWebApiUrl $retailWebApiUrl -ConnectorSpecificSettingSiteManagerUrl $siteManagerUrl -ConnectorSpecificSettingLoginPwd $plainPwd -ConnectorSpecificSettingLoginUserName $WfmUserName
if ($testResult.Code -ne $NULL) {
write $testResult
throw "Validation failed, conflict found"
}
Write-Host "Test complete, no conflicts found"
#Create a connection instance (includes WFM site team ids)
Write-Host "Creating a connection instance"
$designatorName = Read-Host -Prompt "Enter your Microsoft 365's user name"
$domain = $designatorName.Split("@")[1]
$designator = Get-MgUser -UserId $designatorName
$teamsUserId = $designator.Id
$syncFreq = Read-Host -Prompt "Input sync frequency"
#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 -Name $InstanceName -ConnectorId $BlueYonderId -ConnectorSpecificSettingAdminApiUrl $adminApiUrl -ConnectorSpecificSettingCookieAuthUrl $cookieAuthUrl -ConnectorSpecificSettingEssApiUrl $essApiUrl -ConnectorSpecificSettingFederatedAuthUrl $federatedAuthUrl -ConnectorSpecificSettingRetailWebApiUrl $retailWebApiUrl -ConnectorSpecificSettingSiteManagerUrl $siteManagerUrl -ConnectorSpecificSettingLoginPwd $plainPwd -ConnectorSpecificSettingLoginUserName $WfmUserName -DesignatedActorId $teamsUserId -EnabledConnectorScenario $enabledConnectorScenario -EnabledWfiScenario $wfiSupportedScenario -SyncFrequencyInMin $syncFreq -ConnectorAdminEmail $AdminEmailList
$InstanceId = $InstanceResponse.id
$Etag = $InstanceResponse.etag
if ($InstanceId -ne $null){
Write-Host "Success"
} else {
throw "Connector instance creation failed"
}
#Retrieve the list of WFM instances
Write-Host "Listing the WFM team sites"
$WfmTeamIds = Get-CsTeamsShiftsConnectionWfmTeam -ConnectorInstanceId $InstanceId
write $WfmTeamIds
if ($WfmTeamIds -ne $NULL && $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-Host "Listing WFM users and roles"
$WFMUsers = Get-CsTeamsShiftsConnectionWfmUser -ConnectorInstanceId $InstanceId -WfmTeamId $WfmTeamId
write $WFMUsers
#Keep mapping teams until user stops it
while ($true)
{
#Create a new Teams team with owner set to system account and name set to the site name
Write-Host "Creating a Teams team"
$teamsTeamName = Read-Host -Prompt "Input the Teams team name"
$Team = New-Team -DisplayName $teamsTeamName -Visibility "Public" -Owner $teamsUserId
Write-Host "Success"
$TeamsTeamId=$Team.GroupId
#Add users to the Team for Shifts
Write-Host "Adding users to Teams team"
$currentUser = Read-Host -Prompt "Input the current user's user name or 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-Host "There are WFM users not existed in Teams tenant:"
write $failedWfmUsers
}
#Enable scheduling in the group
$RequestBody = @{
Enabled = $true
TimeZone = "America/Los_Angeles"
}
$teamUpdateUrl="https://graph.microsoft.com/v1.0/teams/"+$TeamsTeamId+"/schedule"
$Schedule = Invoke-MgGraphRequest -Uri $teamUpdateUrl -Method PUT -Body $RequestBody
#Create a mapping of the new team to the WFM instance
Write-Host "Create a mapping of the new team to the site"
$TimeZone = Read-Host -Prompt "Input the time zone of team mapping"
$teamMappingResult = New-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId $InstanceId -TeamId $TeamsTeamId -TimeZone $TimeZone -WfmTeamId $WfmTeamId
Write-Host "Success"
$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
}
}
#The Teams admin was set as an owner directly when creating a new team, removing it from owners
Remove-TeamUser -GroupId $TeamsTeamId -User $currentUser -Role Owner
Disconnect-MgGraph
接続を設定し、既存のチームにマップする
#Map WFM sites to existing teams script
Write-Host "Map WFM sites to existing teams"
Start-Sleep 1
#Ensure Teams module is at least version x
Write-Host "Checking Teams module version"
try {
Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 4.1.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-Host "Listing connector types available"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$connectors = Get-CsTeamsShiftsConnectionConnector
write $connectors
$blueYonder = $connectors | where {$_.Id -match $BlueYonderId}
$enabledConnectorScenario = $blueYonder.SupportedScenario
$wfiSupportedScenario = $blueYonder.wfiSupportedScenario
#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your WFM super user name'
$WfmPwd = Read-Host -Prompt 'Input your WFM password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))
#Test connection settings
Write-Host "Testing connection settings"
$InstanceName = Read-Host -Prompt 'Input connection instance 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 $InstanceName -ConnectorId $BlueYonderId -ConnectorSpecificSettingAdminApiUrl $adminApiUrl -ConnectorSpecificSettingCookieAuthUrl $cookieAuthUrl -ConnectorSpecificSettingEssApiUrl $essApiUrl -ConnectorSpecificSettingFederatedAuthUrl $federatedAuthUrl -ConnectorSpecificSettingRetailWebApiUrl $retailWebApiUrl -ConnectorSpecificSettingSiteManagerUrl $siteManagerUrl -ConnectorSpecificSettingLoginPwd $plainPwd -ConnectorSpecificSettingLoginUserName $WfmUserName
if ($testResult.Code -ne $NULL) {
write $testResult
throw "Validation failed, conflict found"
}
Write-Host "Test complete, no conflicts found"
#Create a connection instance (includes WFM site team ids)
Write-Host "Creating a connection instance"
$designatorName = Read-Host -Prompt "Enter your Microsoft 365 user name"
$domain = $designatorName.Split("@")[1]
$designator = Get-MgUser -UserId $designatorName
$teamsUserId = $designator.Id
$syncFreq = Read-Host -Prompt "Input sync frequency in minutes. Value should be equal to or more than 10."
#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 -Name $InstanceName -ConnectorId $BlueYonderId -ConnectorSpecificSettingAdminApiUrl $adminApiUrl -ConnectorSpecificSettingCookieAuthUrl $cookieAuthUrl -ConnectorSpecificSettingEssApiUrl $essApiUrl -ConnectorSpecificSettingFederatedAuthUrl $federatedAuthUrl -ConnectorSpecificSettingRetailWebApiUrl $retailWebApiUrl -ConnectorSpecificSettingSiteManagerUrl $siteManagerUrl -ConnectorSpecificSettingLoginPwd $plainPwd -ConnectorSpecificSettingLoginUserName $WfmUserName -DesignatedActorId $teamsUserId -EnabledConnectorScenario $enabledConnectorScenario -EnabledWfiScenario $wfiSupportedScenario -SyncFrequencyInMin $syncFreq -ConnectorAdminEmail AdminEmailList
$InstanceId = $InstanceResponse.id
$Etag = $InstanceResponse.etag
if ($InstanceId -ne $null){
Write-Host "Success"
} else {
throw "Connector instance creation failed"
}
#Retrieve the list of WFM instances
Write-Host "Listing the WFM team sites"
$WfmTeamIds = Get-CsTeamsShiftsConnectionWfmTeam -ConnectorInstanceId $InstanceId
write $WfmTeamIds
if ($WfmTeamIds -ne $NULL && $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-Host "Listing WFM users and roles"
$WFMUsers = Get-CsTeamsShiftsConnectionWfmUser -ConnectorInstanceId $InstanceId -WfmTeamId $WfmTeamId
write $WFMUsers
#Keep mapping teams until user stops it
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"
$startTime = Read-Host -Prompt "Input the start time of clear schedule"
$endTime = Read-Host -Prompt "Input the end time of clear schedule"
$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 -DateRangeStartDate $startTime -DateRangeEndDate $endTime -ClearSchedulingGroup:$True -EntityType $entityType -DesignatedActorId $$teamsUserId
#Create a mapping of the new team to the WFM instance
Write-Host "Create a mapping of the existing team to the site"
$TimeZone = Read-Host -Prompt "Input the time zone of team mapping"
$teamMappingResult = New-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId $InstanceId -TeamId $TeamsTeamId -TimeZone $TimeZone -WfmTeamId $WfmTeamId
Write-Host "Success"
$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
}
}
Disconnect-MgGraph
Shifts コネクタコマンドレット
スクリプトで使用されるコマンドレットを含む Shifts コネクタ コマンドレットのヘルプについては、Teams PowerShell コマンドレットリファレンスで CsTeamsShiftsConnection を検索します。 一般的に使用されるコマンドレットへのリンクを次に示します。
- Get-CsTeamsShiftsConnectionOperation
- New-CsTeamsShiftsConnectionInstance
- Get-CsTeamsShiftsConnectionInstance
- Set-CsTeamsShiftsConnectionInstance
- Remove-CsTeamsShiftsConnectionInstance
- Test-CsTeamsShiftsConnectionValidate
- New-CsTeamsShiftsConnectionTeamMap
- Get-CsTeamsShiftsConnectionTeamMap
- Remove-CsTeamsShiftsConnectionTeamMap
- Get-CsTeamsShiftsConnectionConnector
- Get-CsTeamsShiftsConnectionSyncResult
- Get-CsTeamsShiftsConnectionWfmUser
- Get-CsTeamsShiftsConnectionWfmTeam
- Get-CsTeamsShiftsConnectionErrorReport
- Remove-CsTeamsShiftsScheduleRecord