Share via


使用 PowerShell 以將班次連線至 Blue Yonder 勞動力管理

概觀

使用適用於 Blue Yonder 的 Microsoft Teams 班次連接器,將 Microsoft Teams 中的班次用程式與 Blue Yonder 勞動力管理 (Blue Yonder WFM) 進行整合。 您的一線員工可以在 Blue Yonder 中順暢地檢視和管理他們的排程,WFM從 Shifts 內進行。

此文章將介紹如何使用 PowerShell 來安裝並設定連接器,以將班次與 Blue Yonder WFM 整合。

若要設定連線,請執行 PowerShell 指令碼。 指令碼會設定連接器、套用同步設定、建立連線,並將 Blue Yonder WFM 實例對應至團隊。 同步設定會決定班次中啟用的功能,以及 Blue Yonder WFM 與班次之間同步的排程資訊。 對應定義了 Blue Yonder WFM 實例與 Teams 中團隊之間的同步處理關聯。 可以將現有的團隊與新團隊進行對應。

我們提供兩個指令碼。 您可以使用任一指令碼,視您是否要對應至現有的小組或建立為其對應的新團隊。

您可以設定多個連線,每個連線都具有不同的同步設定。 例如,如果您的組織有多個具有不同排程需求的位置,請為每個位置建立具有唯一同步處理設定的連線。 請記得,Blue Yonder WFM 實例只能在任何特定時間內對應至一個團隊。 如果實例已對應至團隊,它即無法對應至另一個團隊。

使用 Blue Yonder WFM作為記錄系統,您的一線員工可以有效率地管理其裝置上 Shifts 的排程和可用性。 前線經理可以繼續使用 Blue Yonder WFM 來設定排程。

注意事項

您也可以使用 Microsoft 365 系統管理中心的 [班次連接器精靈],將 班次連線至 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
    • 零售網路 API URL
    • 網站管理員 API URL
    • 系統管理 API URL

    如果您沒有這項資訊,請連絡 Blue Yonder 支援。 Blue Yonder 帳戶是由 Blue Yonder 企業系統管理員在根企業層級建立。 它必須具有 API 存取權、用戶端管理員、存放區管理員和背景工作角色存取權。 帳戶和密碼是建立連線的必要項目。

  • 同盟 SSO 驗證已在您的 Blue Yonder WFM 環境中啟用。 請連絡 Blue Yonder 客戶服務以確定已啟用同盟 SSO。 他們會需要下列資訊:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize 其中 {tenantId} 是您的 tenantId
    • proxyHeader:X-MS-AuthToken
  • 您在 Teams 中至少已設定一個小組。

  • 您新增了一般帳戶,我們稱之為 Microsoft 365 系統帳戶,作為您想要對應之所有小組的小組擁有者。

    在Microsoft 365 系統管理中心中建立此帳戶,並為其指派 Microsoft 365 授權。 然後,將帳戶新增為您想要對應之所有小組的團隊擁有者。 Shifts 連接器會在同步處理來自 Blue Yonder WFM 的 Shifts 變更時使用此帳戶。 我們建議您特別為此目的建立帳戶,而不要使用您的個人使用者帳戶。

使用 PowerShell 管理連接器的系統管理員角色

您必須是 Microsoft 365 全域管理員或 Shifts 連接器系統管理員,才能完成本文中的步驟。

Shifts 連接器系統管理員角色是您在Microsoft Entra識別碼中建立並指派給使用者的自訂角色。 此角色的名稱必須是「Shifts 連接器系統管理員」。 此角色不需要具備任何特定權限,不過,當您建立此角色時,必須設定至少一個權限。 此服務依賴使用者身上的角色存在,而不是其權限。

若要深入瞭解,請參閱在Microsoft Entra識別碼中建立和指派自訂角色將Microsoft Entra角色指派給使用者。 請記住,最多可能需要 24 小時的時間才能建立角色並套用至使用者。

設立您的環境

  1. 安裝 PowerShell 版本 7 或更新版本。 如需逐步指引,請參閱 安裝 Windows 版 PowerShell

  2. 在系統管理員模式下執行 PowerShell。

  3. 安裝 Microsoft Graph PowerShell 模組。

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

    確認其版本為 1.6.1 或更新版本。

    Get-InstalledModule Microsoft.Graph 
    
  4. 安裝 Teams 預覽 PowerShell 模組。

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

    確認其至少為 4.7.0 版,且包含 Shifts 連接器 Cmdlet。

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. 如果執行指令碼時發生錯誤,請將 PowerShell 設定為結束。

    $ErrorActionPreference = "Stop" 
    
  6. 啟用指令碼以在 Windows 中執行。

    Set-ExecutionPolicy bypass 
    

與 Teams 連線

執行下列動作以連線至 Teams。

Connect-MicrosoftTeams

當您看到提示時,使用您的系統管理員認證進行登入。 現在您已完成設定,將可執行此文章中的指令碼和班次連接器 Cmdlets。

識別您想要對應的團隊

注意事項

如果您要將 Blue Yonder WFM 實例與現有的團隊進行對應,請完成此步驟。 如果您要建立為其對應的新團隊,則可以略過此步驟。

在 Azure 入口網站中,請移至 [所有群組] 頁面,以取得組織中團隊的 TeamIds 清單。

記下您想要為其對應之團隊的 TeamIds。 指令碼將提示您輸入訊息。

注意事項

如果一或多個團隊具有現有的排程,指令碼將會從這些團隊中移除排程。 否則,您將看到重複的班次。

執行指令碼

執行下列其中一個腳本,視您要建立新的小組或對應至現有的小組而定:

  • 若要設定連線,請在 Teams 中建立新小組,並將 Blue Yonder WFM實例對應至新小組,然後執行新的小組腳本
  • 若要設定連線並將 Blue Yonder WFM實例對應至 Teams 中的現有小組,請執行現有的 Teams 腳本

執行腳本時,請遵循畫面上的指示。 腳本會完成下列動作:

  1. 使用您輸入的 Blue Yonder WFM服務帳戶認證和服務 URL,測試並確認與 Blue Yonder WFM的連線。

  2. 套用同步處理設定。 這些設定包括) 分鐘 (同步處理頻率,以及在 Blue Yonder WFM 和 Shifts 之間同步處理的排程資料。 您可以啟用這些案例所定義的排程資料: Shift 、、 SwapRequestUserShiftPreferencesOpenShiftOpenShiftRequest 、、。 TimeOffRequestTimeOff

    若要深入了解,請參閱 New-CsTeamsShiftsConnectionInstance。 若要查看每個參數支援的同步選項清單,請執行 Get-CsTeamsShiftsConnectionConnector

    注意事項

    腳本會針對每個支援的同步選項啟用同步處理。 如果您想要變更同步設定,您可以在設定好連線後變更同步設定。 如需詳細資料,請參閱使用 PowerShell 管理班次與 Blue Yonder 勞動力管理的連線。

  3. 將 Blue Yonder WFM實例對應至 Teams 中的小組。

    • 如果您選擇執行 新的小組腳本來 建立新小組,則對應會以您建立的新團隊為基礎。
    • 如果您選擇執行 現有的 Teams 腳本 來對應現有的小組,則對應是以您輸入的 Blue Yonder 實例識別碼和 TeamId 為基礎。 如果小組有現有的排程,腳本會移除所有排程資料。

執行腳本之後, 成功 訊息會確認您的連線是否已成功設定。

管理您的連線

設定連線之後,您可以在Microsoft 365 系統管理中心或使用 PowerShell 來管理和變更連線。

使用Microsoft 365 系統管理中心

[連接器管理] 頁面會列出您已設定的每個連線,以及健康情況狀態和同步間隔詳細資料等資訊。 您也可以存取精靈來變更任何連線。 例如,您可以更新同步處理設定和小組對應。

若要深入瞭解,請參閱使用Microsoft 365 系統管理中心來管理與 Blue Yonder Workforce Management的 Shifts 連線

使用 PowerShell

您可以使用 PowerShell 來檢視錯誤報表、變更連線設定、停用同步處理等等。 如需逐步指引,請參閱 使用 PowerShell 管理 Shifts 與 Blue Yonder 勞動力管理的連線。

指令碼

設定連線並建立新的小組

#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

設定連線並對應現有的小組

#Map WFM sites to existing teams script
Write-Output "Map WFM sites to existing teams"
Start-Sleep 1

#Ensure Teams module is at least version x
Write-Output "Checking Teams module version"
try {
	Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 5.2.0
} catch {
	throw
}

#Connect to MS Graph
Connect-MgGraph -Scopes "User.Read.All","Group.ReadWrite.All"

#List connector types available (comment out if not implemented for preview)
Write-Output "Listing connector types available"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your Blue Yonder account username'
$WfmPwd = Read-Host -Prompt 'Input your Blue Yonder account password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))

#Test connection settings
Write-Output "Testing connection settings"
$ConnectionName = Read-Host -Prompt 'Input connection name'
$adminApiUrl = Read-Host -Prompt 'Input admin api url'
$cookieAuthUrl = Read-Host -Prompt 'Input cookie authorization url'
$essApiUrl = Read-Host -Prompt 'Input ess api url'
$federatedAuthUrl = Read-Host -Prompt 'Input federated authorization url'
$retailWebApiUrl = Read-Host -Prompt 'Input retail web api url'
$siteManagerUrl = Read-Host -Prompt 'Input site manager url'

$testResult = Test-CsTeamsShiftsConnectionValidate `
	-Name $ConnectionName `
	-ConnectorId $BlueYonderId `
	-ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
		-Property @{
			AdminApiUrl = $adminApiUrl
			SiteManagerUrl = $siteManagerUrl
			EssApiUrl = $essApiUrl
			RetailWebApiUrl = $retailWebApiUrl
			CookieAuthUrl = $cookieAuthUrl
			FederatedAuthUrl = $federatedAuthUrl
			LoginUserName = $WfmUserName
			LoginPwd = $plainPwd
		})
		
if ($NULL -ne $testResult.Code) {
	Write-Output $testResult
	throw "Validation failed, conflict found"
}
Write-Host "Test complete, no conflicts found"

#Create a connection
Write-Output "Creating a connection"
$ConnectionResponse = New-CsTeamsShiftsConnection `
    -Name $ConnectionName `
    -ConnectorId $BlueYonderId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
		-Property @{
			AdminApiUrl = $adminApiUrl
			SiteManagerUrl = $siteManagerUrl
			EssApiUrl = $essApiUrl
			RetailWebApiUrl = $retailWebApiUrl
			CookieAuthUrl = $cookieAuthUrl
			FederatedAuthUrl = $federatedAuthUrl
			LoginUserName = $WfmUserName
			LoginPwd = $plainPwd
		})

$ConnectionId = $ConnectionResponse.Id
if ($null -ne $ConnectionId){
	Write-Output "Successfully created connection"
} else {
	throw "Connection creation failed"
}

#Create a connection instance
Write-Output "Creating a connection instance"
$designatedActorName = Read-Host -Prompt "Input Microsoft 365 System Account (person@contoso.com)"
$designator = Get-MgUser -UserId $designatedActorName
$teamsUserId = $designator.Id
$syncFreq = Read-Host -Prompt "Input sync frequency in minutes"
$InstanceName = Read-Host -Prompt "Input connection instance name"

#Read sync scenarios for connection instance
function GetSyncScenarioSetting {
	param (
		$SettingName
	)
	$TwoWay = New-Object System.Management.Automation.Host.ChoiceDescription '&TwoWay', 'TwoWay'
	$Disabled = New-Object System.Management.Automation.Host.ChoiceDescription '&Disabled', 'Disabled'
	$FromWfmToShifts = New-Object System.Management.Automation.Host.ChoiceDescription '&FromWfmToShifts', 'FromWfmToShifts'
	$options = [System.Management.Automation.Host.ChoiceDescription[]]($TwoWay, $Disabled, $FromWfmToShifts)
	$result = $host.ui.PromptForChoice("Set sync scenario for $SettingName", "", $options, 0)

	switch ($result)
	{
		0 { return "TwoWay" }
		1 { return "Disabled" }
		2 { return "FromWfmToShifts" }
	}
}
$SyncScenarioOpenShift = GetSyncScenarioSetting "Open Shift"
$SyncScenarioOpenShiftRequest = GetSyncScenarioSetting "Open Shift Request"
$SyncScenarioShift = GetSyncScenarioSetting "Shift"
$SyncScenarioSwapRequest = GetSyncScenarioSetting "Swap Request"
$SyncScenarioTimeCard = GetSyncScenarioSetting "Time Card"
$SyncScenarioTimeOff = GetSyncScenarioSetting "Time Off"
$SyncScenarioTimeOffRequest = GetSyncScenarioSetting "Time Off Request"
$SyncScenarioUserShiftPreference = GetSyncScenarioSetting "User Shift Preferences"

#Read admin email list
[psobject[]]$AdminEmailList = @()
while ($true){
	$AdminEmail = Read-Host -Prompt "Enter admin's email to receive error report"
	$AdminEmailList += $AdminEmail
	$title    = 'Adding another email'
	$question = 'Would you like to add another admin email?'
	$choices  = '&Yes', '&No'
	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$InstanceResponse = New-CsTeamsShiftsConnectionInstance `
	-ConnectionId $ConnectionId `
    -ConnectorAdminEmail $AdminEmailList `
    -DesignatedActorId $teamsUserId `
    -Name $InstanceName `
    -SyncFrequencyInMin $syncFreq `
	-SyncScenarioOpenShift $SyncScenarioOpenShift `
	-SyncScenarioOpenShiftRequest $SyncScenarioOpenShiftRequest `
	-SyncScenarioShift $SyncScenarioShift `
	-SyncScenarioSwapRequest $SyncScenarioSwapRequest `
	-SyncScenarioTimeCard $SyncScenarioTimeCard `
	-SyncScenarioTimeOff $SyncScenarioTimeOff `
	-SyncScenarioTimeOffRequest $SyncScenarioTimeOffRequest `
	-SyncScenarioUserShiftPreference $SyncScenarioUserShiftPreference

$InstanceId = $InstanceResponse.id
if ($null -ne $InstanceId){
    Write-Output "Success"
} else {
    throw "Connector instance creation failed"
}

#Keep mapping teams until user stops it
$mappings=@()
while ($true)
{
	$TeamsTeamId = Read-Host -Prompt "Input the ID of the Teams team to be mapped"
	#Clear schedule of the Teams team
	Write-Host "Clear schedule of the existing team"

	$entityTypeString = Read-Host -Prompt 'Input the entity types of clear schedule'
	$Delimiters = ",", ".", ":", ";", " ", "`t"
	$entityType = $entityTypeString -Split {$Delimiters -contains $_}
	$entityType = $entityType.Trim()
	$entityType = $entityType.Split('',[System.StringSplitOptions]::RemoveEmptyEntries)
	Remove-CsTeamsShiftsScheduleRecord -TeamId $TeamsTeamId -ClearSchedulingGroup:$True -EntityType $entityType

	#Retrieve the list of wfm locations
	Write-Output "Listing the WFM team sites"
	$WfmTeamIds = Get-CsTeamsShiftsConnectionWfmTeam -ConnectorInstanceId $InstanceId
	Write-Output $WfmTeamIds
	if (($NULL -ne $WfmTeamIds) -and ($WfmTeamIds.Count -gt 0)){
		[System.String]$WfmTeamId = Read-Host -Prompt "Input the ID of WFM team you want to map"
	}
	else {
		throw "The WfmTeamId list is null or empty"
	}

	#Retrieve the list of WFM users and their roles
	Write-Output "Listing WFM users and roles"
	$WFMUsers = Get-CsTeamsShiftsConnectionWfmUser -ConnectorInstanceId $InstanceId -WfmTeamId $WfmTeamId
	Write-Output $WFMUsers

	#Create a mapping of the existing team to the instance
	Write-Host "Create a mapping of the existing team to the site"
	$TimeZone = Read-Host -Prompt "Input the time zone of team mapping"
	$mapping = @{
		teamId = $TeamsTeamId
		wfmTeamId = $WfmTeamId
		timeZone = $TimeZone
		}
	$mappings += , $mapping

	$title    = 'Connecting another team'
	$question = 'Would you like to connect another team?'
	$choices  = '&Yes', '&No'

	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$batchMappingResponse = New-CsTeamsShiftsConnectionBatchTeamMap -ConnectorInstanceId $InstanceId -TeamMapping @($mappings)
if ($null -ne $batchMappingResponse.OperationId){
	"The mapping has begun asynchronously. To query mapping results run Get-CsTeamsShiftsConnectionOperation with the operation Id."
}
else {
	throw "The mapping has failed due to validation errors."
}
Write-Output $batchMappingResponse

Disconnect-MgGraph

班次連接器 Cmdlets

有關班次連接器 Cmdlet (包括指命碼中使用的 Cmdlets) 的說明,請搜尋 Teams PowerShell Cmdlets 參考中的 CsTeamsShiftsConnection。 以下是一些常用 Cmdlet 的連結,依類別分組:

連線

WFM系統認證

支援的案例同步處理選項

移除排程資料

連線實例

使用者對應和成功同步處理

小組對應

作業識別碼

錯誤報告