Поделиться через


Используйте PowerShell для подключения Shifts к Blue Yonder Workforce Management

Обзор

Используйте соединитель Microsoft Teams Shifts для Blue Yonder для интеграции приложения Shifts в Microsoft Teams с Blue Yonder Workforce Management (Blue Yonder WFM). Ваши сотрудники первой линии могут легко просматривать свои расписания и управлять ими в 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 в качестве системы записи, ваши сотрудники первой линии могут эффективно управлять своим графиком и доступностью в сменах на своих устройствах. Руководители передней линии могут продолжать использовать 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. Это исправление устраняет проблему, из-за которой пользователи получают постоянное сообщение об ошибке в Сменах. Оно также устраняет проблему, которая не позволяет пользователям обновлять свою доступность в Сменах.

  • Вы знаете имя учетной записи, пароль и URL-адреса службы в Blue Yonder WFM:

    • URL-адрес федеративной проверки подлинности
    • URL-адрес проверки подлинности файлов cookie
    • URL-адрес самообслуживания сотрудника
    • URL-адрес API розничной торговли
    • URL-адрес API диспетчера сайтов
    • URL-адрес API администрирования

    Если у вас нет всех этих сведений, обратитесь в службу поддержки Blue Yonder. Учетная запись Blue Yonder создается на корневом уровне предприятия администратором предприятия Blue Yonder. Он должен иметь доступ к API, клиентский Администратор, диспетчер Магазинов и доступ к рабочей роли. Учетная запись и пароль необходимы для создания подключения.

  • В среде Blue Yonder WFM включена федеративная проверка подлинности единого входа. Обратитесь в службу поддержки Blue Yonder, чтобы убедиться, что федеративный единый вход включен. Вам потребуется предоставить следующие сведения:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize где {tenantId} — идентификатор клиента
    • proxyHeader: X-MS-AuthToken
  • У вас есть по крайней мере одна команда, настроенная в Teams.

  • Вы добавили общую учетную запись, так называемую системной учетной записью Microsoft 365, в качестве владельца команды для всех команд, которые вы хотите сопоставить.

    Создайте эту учетную запись в Центр администрирования Microsoft 365 и назначьте ей лицензию Microsoft 365. Затем добавьте эту учетную запись в качестве владельца команды во все команды, которые вы хотите сопоставить. Соединитель Смен использует эту учетную запись при синхронизации изменений в Сменах из Blue Yonder WFM. Мы рекомендуем создать учетную запись специально для этой цели и не использовать личную учетную запись пользователя.

Роль администратора для управления соединителем с помощью PowerShell

Для выполнения действий, описанных в этой статье, необходимо быть глобальным администратором Microsoft 365 или администратором соединителя Shifts.

Роль администратора соединителя Shifts — это настраиваемая роль, которую вы создаете в Microsoft Entra идентификаторе и назначаете пользователю. Роль должна иметь имя "Администратор соединителя Shifts". Роль не должна иметь каких-либо определенных разрешений, хотя при ее создании необходимо задать по крайней мере одно разрешение. Служба зависит от наличия роли для пользователя, а не от ее разрешений.

Дополнительные сведения см. в разделах Создание и назначение настраиваемой роли в Microsoft Entra id и Назначение Microsoft Entra ролей пользователям. Помните, что создание роли и ее применения к пользователю может занять до 24 часов.

Настройка среды

  1. Установите PowerShell версии 7 или более поздней. Пошаговые инструкции см. в разделе Установка PowerShell в Windows.

  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.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Настройте PowerShell на выход, если при запуске скрипта возникает ошибка.

    $ErrorActionPreference = "Stop" 
    
  6. Включите сценарии для выполнения в Windows.

    Set-ExecutionPolicy bypass 
    

Подключение к Teams

Чтобы подключиться к Teams, сделайте следующее.

Connect-MicrosoftTeams

При появлении запроса войдите в систему, используя свои учетные данные администратора. Теперь настройте запуск сценариев, описанных в этой статье, и командлетов соединителя Shifts.

Определите команды, которые вы хотите отобразить

Примечание.

Выполните этот шаг, если вы сопоставляете экземпляры Blue Yonder WFM с существующими командами. Если вы создаете новые команды для сопоставления, вы можете пропустить этот шаг.

На портале Azure перейдите на страницу Все группы и получите список TeamId команд в вашей организации.

Обратите внимание на TeamId команд, которые вы хотите сопоставить. Сценарий запросит ввод этих сведений.

Примечание.

Если у одной или нескольких команд есть расписание, сценарий удалит расписания из этих команд. В противном случае вы увидите повторяющиеся смены.

Запустите сценарий

Выполните один из следующих сценариев в зависимости от того, создаете ли вы новую команду или сопоставляете ее с существующей командой:

  • Чтобы настроить подключение, создайте новую команду в Teams и сопоставите экземпляр Blue Yonder WFM с новой командой, выполните новый сценарий teams.
  • Чтобы настроить подключение и сопоставить экземпляры Blue Yonder WFM с существующими командами в Teams, выполните существующий сценарий teams.

Следуйте инструкциям на экране при запуске скрипта. Скрипт выполняет следующие действия:

  1. Проверьте и проверьте подключение к Blue Yonder WFM с помощью учетных данных и URL-адресов служб Blue Yonder WFM.

  2. Применение параметров синхронизации. Эти параметры включают частоту синхронизации (в минутах) и данные расписания, синхронизированные между Blue Yonder WFM и shifts. Можно включить данные расписания, определенные в следующих сценариях: Shift, SwapRequest, UserShiftPreferences, OpenShift, OpenShiftRequest, TimeOff, , . TimeOffRequest

    Дополнительные сведения см. в статье New-CsTeamsShiftsConnectionInstance. Чтобы просмотреть список поддерживаемых параметров синхронизации для каждого параметра, запустите Get-CsTeamsShiftsConnectionConnector.

    Примечание.

    Скрипт включает синхронизацию для каждого поддерживаемого параметра синхронизации. Если вы хотите изменить параметры синхронизации, это можно сделать после настройки соединения. Дополнительные сведения см. в статье Использование PowerShell для управления подключением Shifts к Blue Yonder Workforce Management.

  3. Сопоставьте экземпляры Blue Yonder WFM с командами в Teams.

    • Если вы решили запустить новый сценарий teams для создания новых команд, сопоставления основаны на новых командах, которые вы создаете.
    • Если вы решили запустить существующий сценарий teams для сопоставления существующих команд, сопоставления основаны на идентификаторах экземпляров Blue Yonder и TeamId, которые вы вводите. Если у команды есть существующее расписание, скрипт удаляет все данные расписания.

После запуска скрипта появится сообщение Об успешном выполнении, которое подтверждает, успешно ли настроено подключение.

Управление подключением

После настройки подключения вы можете управлять и вносить в него изменения в Центр администрирования Microsoft 365 или с помощью PowerShell.

Использование Центр администрирования Microsoft 365

На странице Управление соединителями перечислены все настроенные подключения, а также такие сведения, как состояние работоспособности и сведения о интервале синхронизации. Вы также можете получить доступ к мастеру, чтобы внести изменения в любое из подключений. Например, можно обновить параметры синхронизации и сопоставления команд.

Дополнительные сведения см. в статье Использование Центр администрирования Microsoft 365 для управления подключением shifts к Workforce Management Blue Yonder.

Воспользуйтесь PowerShell

PowerShell можно использовать для просмотра отчета об ошибках, изменения параметров подключения, отключения синхронизации и многого другого. Пошаговые инструкции см. в разделе Использование PowerShell для управления подключением Shifts к Blue Yonder Workforce Management.

Сценарии

Настройка подключения и создание новой команды

#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

Командлеты соединителя смен

Чтобы получить справку по командлетам соединителя смен, включая командлеты, используемые в сценариях, выполните поиск CsTeamsShiftsConnection в справочнике по командлетам Teams PowerShell. Ниже приведены ссылки на некоторые часто используемые командлеты, сгруппированные по категориям:

Подключения

учетные данные систем WFM

Параметры синхронизации для поддерживаемых сценариев

Удаление данных расписания

Экземпляры подключения

Сопоставление пользователей и успешная синхронизация

Сопоставление команд

Идентификатор операции

Отчеты об ошибках