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의 팀 간의 동기화 관계를 정의합니다. 기존 팀과 새 팀에 매핑할 수 있습니다.

두 가지 스크립트를 제공합니다. 기존 팀에 매핑할지 아니면 매핑할 새 팀을 생성할지 여부에 따라 두 스크립트 중 하나를 사용할 수 있습니다.

각각 다른 동기화 설정으로 여러 연결을 설정할 수 있습니다. 예를 들어 조직에 일정 요구 사항이 다른 여러 위치가 있는 경우 각 위치에 대해 고유한 동기화 설정을 사용하여 연결을 만듭니다. Blue Yonder WFM 인스턴스는 주어진 시간에 한 팀에만 매핑할 수 있습니다. 인스턴스가 이미 팀에 매핑되어 있으면 다른 팀에 매핑할 수 없습니다.

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 패치를 적용합니다. 이 패치는 사용자가 교대 근무에서 계속하여 오류 메시지를 받는 문제를 해결합니다. 또한 사용자가 교대 근무에서 상태를 업데이트하지 못하는 문제를 해결합니다.

  • Blue Yonder WFM 서비스 계정 이름, 암호 및 서비스 URL을 알고 있습니다.

    • 페더레이션 인증 URL
    • 쿠키 인증 URL
    • Employee Self-Service URL
    • 소매 웹 API URL
    • 사이트 관리자 API URL
    • 관리 API URL

    이 모든 정보가 없는 경우 Blue Yonder 지원에 문의하세요. Blue Yonder 계정은 Blue Yonder 엔터프라이즈 관리자가 루트 엔터프라이즈 수준에서 만듭니다. API 액세스, 클라이언트 관리, 스토어 관리자 및 작업자 액세스 권한이 있어야 합니다. 연결을 만들려면 계정 및 암호가 필요합니다.

  • Blue Yonder WFM 환경에서 페더레이션 SSO 인증이 활성화된 상태입니다. Blue Yonder 지원팀에 문의하여 페더레이션 SSO가 활성화되어 있는지 확인합니다. 다음 정보가 필요합니다.

    • 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
  • Teams에 하나 이상의 팀이 설정되어 있습니다.

  • Microsoft 365 시스템 계정이라고 하는 일반 계정을 매핑하려는 모든 팀에 팀 소유자로 추가했습니다.

    Microsoft 365 관리 센터 이 계정을 만들고 Microsoft 365 라이선스를 할당합니다. 그런 다음, 계정을 매핑하려는 모든 팀에 팀 소유자로 추가합니다. 교대 근무 커넥터는 Blue Yonder WFM에서 교대 근무 변경 내용을 동기화할 때 이 계정을 사용합니다. 이 목적을 위해 특별히 계정을 만들고 개인 사용자 계정을 사용하지 않는 것이 좋습니다.

PowerShell을 사용하여 커넥터를 관리하는 관리자 역할

이 문서의 단계를 완료하려면 Microsoft 365 전역 관리자 또는 Shifts 커넥터 관리자여야 합니다.

Shifts 커넥터 관리자 역할은 Microsoft Entra ID에서 만들고 사용자에게 할당하는 사용자 지정 역할입니다. 역할 이름은 "Shifts connector admin"이어야 합니다. 역할에 특정 권한이 없어도 되지만 생성할 때 최소한 하나의 권한을 설정해야 합니다. 서비스는 권한이 아니라 사용자에 대한 역할의 존재 여부에 의존합니다.

자세한 내용은 Microsoft Entra ID에서 사용자 지정 역할 만들기 및 할당사용자에게 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 Preview 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

메시지가 표시되면 관리자 자격 증명을 사용하여 로그인합니다. 이제 이 문서의 스크립트와 Shifts 커넥터 cmdlet을 실행하도록 설정되었습니다.

매핑하려는 팀 식별

참고

Blue Yonder WFM 인스턴스를 기존 팀에 매핑하는 경우 이 단계를 완료하세요. 매핑할 새 팀을 만드는 경우 이 단계를 건너뛸 수 있습니다.

Azure Portal에서 모든 그룹 페이지로 이동하여 조직 내 팀의 TeamId 목록을 가져옵니다.

매핑하려는 팀의 TeamId를 기록해 둡니다. 스크립트는 이 정보를 입력하라는 메시지를 표시합니다.

참고

하나 이상의 팀에 기존 일정이 있는 경우 스크립트는 해당 팀에서 일정을 제거합니다. 그렇지 않으면 중복 교대조가 표시됩니다.

스크립트 실행

새 팀을 만들거나 기존 팀에 매핑하는지에 따라 다음 스크립트 중 하나를 실행합니다.

  • 연결을 설정하려면 Teams에서 새 팀을 만들고 Blue Yonder WFM instance 새 팀에 매핑하고 새 팀 스크립트를 실행합니다.
  • 연결을 설정하고 Blue Yonder WFM 인스턴스를 Teams의 기존 팀에 매핑하려면 기존 팀 스크립트를 실행합니다.

스크립트를 실행할 때 화면의 지침을 따릅니다. 스크립트는 다음 작업을 완료합니다.

  1. 입력한 Blue Yonder WFM 서비스 계정 자격 증명 및 서비스 URL을 사용하여 Blue Yonder WFM 대한 연결을 테스트하고 확인합니다.

  2. 동기화 설정을 적용합니다. 이러한 설정에는 동기화 빈도(분)와 Blue Yonder WFM 및 Shifts 간에 동기화되는 일정 데이터가 포함됩니다. , TimeOffSwapRequestTimeOffRequestUserShiftPreferencesOpenShiftRequestOpenShift등의 시나리오Shift에서 정의된 일정 데이터를 사용하도록 설정할 수 있습니다.

    자세한 내용은 New-CsTeamsShiftsConnectionInstance를 참조하세요. 각 매개 변수에 지원되는 동기화 옵션 목록을 보려면 Get-CsTeamsShiftsConnectionConnector를 실행하세요.

    참고

    스크립트는 지원되는 각 동기화 옵션에 대해 동기화를 사용하도록 설정합니다. 동기화 설정을 변경하려면 연결이 설정된 후에 변경할 수 있습니다. 자세한 내용은 PowerShell을 사용하여 Blue Yonder Workforce Management에 대한 Shifts 연결 관리를 참조하세요.

  3. Blue Yonder WFM 인스턴스를 Teams의 팀에 매핑합니다.

    • 새 팀을 만들기 위해 새 팀 스크립트를 실행하도록 선택한 경우 매핑은 사용자가 만든 새 팀을 기반으로 합니다.
    • 기존 팀 스크립트를 실행하여 기존 팀을 매핑하도록 선택한 경우 매핑은 입력한 Blue Yonder instance ID 및 TeamId를 기반으로 합니다. 팀에 기존 일정이 있는 경우 스크립트는 모든 일정 데이터를 제거합니다.

스크립트를 실행하면 연결이 성공적으로 설정되었는지 확인하는 성공 메시지가 표시됩니다.

연결 관리

연결이 설정되면 Microsoft 365 관리 센터 또는 PowerShell을 사용하여 연결을 관리하고 변경할 수 있습니다.

Microsoft 365 관리 센터 사용

커넥터 관리 페이지에는 설정한 각 연결과 상태 상태 및 동기화 간격 세부 정보와 같은 정보가 나열됩니다. 마법사에 액세스하여 연결을 변경할 수도 있습니다. 예를 들어 동기화 설정 및 팀 매핑을 업데이트할 수 있습니다.

자세한 내용은 Microsoft 365 관리 센터 사용하여 Blue Yonder Workforce Management 대한 Shifts 연결 관리를 참조하세요.

PowerShell 사용

PowerShell을 사용하여 오류 보고서를 보고, 연결 설정을 변경하고, 동기화를 사용하지 않도록 설정하는 등의 작업을 수행할 수 있습니다. 단계별 지침은 PowerShell을 사용하여 Blue Yonder Workforce Management에 대한 Shifts 연결 관리를 참조하세요.

스크립트

연결 설정 및 새 팀 만들기

#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

Shifts 커넥터 cmdlet

스크립트에 사용된 cmdlet을 포함하여 Shifts 커넥터 cmdlet에 대한 도움말을 보려면 Teams PowerShell cmdlet 참조에서 CsTeamsShiftsConnection을 검색하세요. 다음은 범주별로 그룹화된 몇 가지 일반적으로 사용되는 cmdlet에 대한 링크입니다.

Connections

시스템 자격 증명 WFM

지원되는 시나리오에 대한 동기화 옵션

일정 데이터 제거

연결 인스턴스

사용자 매핑 및 성공적인 동기화

팀 매핑

작업 ID

오류 보고서