Aracılığıyla paylaş


Vardiyaları Blue Yonder Workforce Management'a bağlamak için PowerShell kullanma

Genel bakış

Microsoft Teams'deki Vardiyalar uygulamasını Blue Yonder Workforce Management (Blue Yonder WFM) ile tümleştirmek için Blue Yonder için Microsoft Teams Vardiyaları bağlayıcısını kullanın. Ön cephe çalışanlarınız Vardiyalar'ın içinden Blue Yonder WFM'de zamanlamalarını sorunsuz bir şekilde görüntüleyebilir ve yönetebilir.

Bu makalede, Bağlayıcıyı Ayarlama ve Yapılandırma için PowerShell'i kullanma konusunda size yol gösteririz.

Bağlantıyı kurmak için bir PowerShell betiği çalıştırırsınız. Betik bağlayıcıyı yapılandırıyor, eşitleme ayarlarını uyguluyor, bağlantıyı oluşturuyor ve Blue Yonder WFM örneklerini ekiplere eşler. Eşitleme ayarları, Vardiyalar'da etkinleştirilen özellikleri ve Blue Yonder WFM ile Vardiyalar arasında eşitlenen zamanlama bilgilerini belirler. Eşlemeler, Teams'deki Blue Yonder WFM örnekleriniz ve ekipleriniz arasındaki eşitleme ilişkisini tanımlar. Mevcut ekiplere ve yeni ekiplere eşleyebilirsiniz.

İki betik sağlıyoruz. Mevcut ekiplere eşlemek veya eşlemek için yeni ekipler oluşturmak istediğinize bağlı olarak betiklerden birini kullanabilirsiniz.

Her birinde farklı eşitleme ayarları olan birden çok bağlantı ayarlayabilirsiniz. Örneğin, kuruluşunuzun farklı zamanlama gereksinimlerine sahip birden çok konumu varsa, her konum için benzersiz eşitleme ayarlarıyla bir bağlantı oluşturun. Blue Yonder WFM örneğinin herhangi bir anda yalnızca bir ekiple eşlenebileceğini unutmayın. Bir örnek zaten bir takımla eşlenmişse, başka bir takımla eşlenemez.

Kayıt sistemi olarak Blue Yonder WFM ile ön cephe çalışanlarınız, cihazlarında Vardiyalar'da zamanlamalarını ve kullanılabilirliklerini verimli bir şekilde yönetebilir. Ön cephe yöneticileri, zamanlamaları ayarlamak için Blue Yonder WFM kullanmaya devam edebilir.

Not

Shift'leri Blue Yonder WFM'ye bağlamak için Microsoft 365 yönetim merkezindeki Vardiyalar bağlayıcısı sihirbazını da kullanabilirsiniz.

Başlamadan önce

Önkoşullar

Başlamadan önce aşağıdaki tüm önkoşulları karşıladığınızdan emin olun:

  • Blue Yonder WFM sürüm 2020.3, 2021.1 veya 2021.2'ye sahipsiniz.

    Not

    Blue Yonder WFM 2020.3 veya 2021.1'iniz varsa, 2020.3.0.4 veya 2021.1.0.3 düzeltme ekini uygulayın. Bu düzeltme eki, kullanıcıların Vardiyalar'da kalıcı bir hata iletisi alması sorununu düzeltir. Ayrıca, kullanıcıların Vardiyalar'da kullanılabilirliklerini güncelleştirmelerini engelleyen bir sorunu da düzeltir.

  • Blue Yonder WFM hizmet hesabı adınızı, parolanızı ve hizmet URL'lerinizi biliyorsunuz:

    • Federasyon kimlik doğrulaması URL'si
    • Tanımlama bilgisi kimlik doğrulaması URL'si
    • Çalışan self servis URL'si
    • Perakende web API'si URL'si
    • Site yöneticisi API'si URL'si
    • Yönetim API'si URL'si

    Tüm bu bilgilere sahip değilseniz Blue Yonder desteğine başvurun. Blue Yonder kuruluş yöneticisi tarafından kök kuruluş düzeyinde bir Mavi Yonder hesabı oluşturulur. API Erişimi, İstemci Yöneticisi, Mağaza Yöneticisi ve Çalışan erişimi olmalıdır. Bağlantı oluşturmak için hesap ve parola gereklidir.

  • Federasyon SSO kimlik doğrulaması, Blue Yonder WFM ortamınızda etkinleştirilir. Federasyon SSO'nun etkinleştirildiğinden emin olmak için Mavi Yonder desteğine başvurun. Aşağıdaki bilgilere ihtiyaçları olacaktır:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize tenantId değeriniz nerede {tenantId} ?
    • proxyHeader: X-MS-AuthToken
  • Teams'de en az bir ekibiniz ayarlanmıştır.

  • Microsoft 365 sistem hesabı olarak adlandırdığımız genel bir hesabı eşlemek istediğiniz tüm takımlara ekip sahibi olarak eklediniz.

    Bu hesabı Microsoft 365 yönetim merkezinde oluşturun ve bir Microsoft 365 lisansı atayın. Ardından hesabı eşlemek istediğiniz tüm ekiplere ekip sahibi olarak ekleyin. Shifts bağlayıcısı, Shifts değişiklikleri Blue Yonder WFM'den eşitlenirken bu hesabı kullanır. Özel olarak bu amaçla bir hesap oluşturmanızı ve kişisel kullanıcı hesabınızı kullanmamanızı öneririz.

PowerShell kullanarak bağlayıcıyı yönetmek için yönetici rolü

Bu makaledeki adımları tamamlamak için Microsoft 365 Genel Yöneticisi veya Shifts bağlayıcı yöneticisi olmanız gerekir.

Vardiyalar bağlayıcısı yönetici rolü, Microsoft Entra Kimliği'nde oluşturduğunuz ve bir kullanıcıya atadığınız özel bir roldür. Rolün adı "Shifts bağlayıcı yöneticisi" olmalıdır. Rolün belirli izinlere sahip olması gerekmez, ancak oluşturduğunuzda en az bir izin ayarlanmalıdır. Hizmet, izinlerine değil, rolün kullanıcı üzerinde varlığına bağlıdır.

Daha fazla bilgi edinmek için bkz. Microsoft Entra Id'de özel rol oluşturma ve atama ve Kullanıcılara Microsoft Entra rolleri atama. Rolün oluşturulmasının ve kullanıcıya uygulanmasının 24 saat kadar sürebileceğini unutmayın.

Önemli

Microsoft, rolleri en az izinle kullanmanızı önerir. Bu, kuruluşunuzun güvenliğini artırmaya yardımcı olur. Genel Yönetici, daha az ayrıcalıklı bir rol kullanamıyorsanız acil durum senaryolarıyla sınırlı olması gereken yüksek ayrıcalıklı bir roldür.

Ortamınızı ayarlama

  1. PowerShell sürüm 7 veya üzerini yükleyin. Adım adım yönergeler için bkz . PowerShell'i Windows'a yükleme.

  2. PowerShell'i yönetici modunda çalıştırın.

  3. Microsoft Graph PowerShell modülünü yükleyin.

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

    Sürüm 1.6.1 veya üzeri olduğunu doğrulayın.

    Get-InstalledModule Microsoft.Graph 
    
  4. Teams Preview PowerShell modülünü yükleyin.

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

    En az sürüm 4.7.0 olduğunu ve Shifts bağlayıcı cmdlet'lerini içerdiğini doğrulayın.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Betik çalıştırılırken bir hata oluşursa PowerShell'i çıkış olarak ayarlayın.

    $ErrorActionPreference = "Stop" 
    
  6. Betiklerin Windows'ta çalıştırılmasını etkinleştirin.

    Set-ExecutionPolicy bypass 
    

Teams'e bağlanma

Teams'e bağlanmak için aşağıdakileri çalıştırın.

Connect-MicrosoftTeams

İstendiğinde yönetici kimlik bilgilerinizi kullanarak oturum açın. Artık bu makaledeki betikleri ve Shifts bağlayıcısı cmdlet'lerini çalıştıracak şekilde ayarlandınız.

Eşlemek istediğiniz ekipleri belirleme

Not

Blue Yonder WFM örneklerini mevcut ekiplere eşlerken bu adımı tamamlayın. Eşleme için yeni ekipler oluşturuyorsanız bu adımı atlayabilirsiniz.

Azure portalında Tüm gruplar sayfasına giderek kuruluşunuzdaki ekiplerin TeamId'lerinin listesini alın.

Eşlemek istediğiniz ekiplerin TeamId değerlerini not alın. Betik bu bilgileri girmenizi ister.

Not

Bir veya daha fazla ekibin mevcut bir zamanlaması varsa, betik bu ekiplerden zamanlamaları kaldırır. Aksi takdirde yinelenen vardiyalar görürsünüz.

Betiği çalıştırma

Yeni bir ekip oluşturup oluşturmadığınıza veya mevcut bir ekiple eşleme yaptığınıza bağlı olarak aşağıdaki betiklerden birini çalıştırın:

  • Bağlantı kurmak, Teams'de yeni bir ekip oluşturmak ve bir Blue Yonder WFM örneğini yeni ekiple eşlemek için yeni teams betiğini çalıştırın.
  • Bir bağlantı kurmak ve Blue Yonder WFM örneklerini Teams'deki mevcut ekiplerle eşlemek için mevcut ekipler betiğini çalıştırın.

Betiği çalıştırırken ekrandaki yönergeleri izleyin. Betik aşağıdaki eylemleri tamamlar:

  1. Girdiğiniz Blue Yonder WFM hizmet hesabı kimlik bilgilerini ve hizmet URL'lerini kullanarak Blue Yonder WFM bağlantısını test edin ve doğrulayın.

  2. Eşitleme ayarlarını uygulama. Bu ayarlar arasında eşitleme sıklığı (dakika cinsinden) ve Blue Yonder WFM ile Vardiyalar arasında eşitlenen zamanlama verileri bulunur. Şu senaryolar tarafından tanımlanan zamanlama verilerini etkinleştirebilirsiniz: Shift, SwapRequest, UserShiftPreferences, OpenShift, OpenShiftRequest, , TimeOff. TimeOffRequest

    Daha fazla bilgi için bkz. New-CsTeamsShiftsConnectionInstance. Her parametre için desteklenen eşitleme seçeneklerinin listesini görmek için Get-CsTeamsShiftsConnectionConnector komutunu çalıştırın.

    Not

    Betik, desteklenen her eşitleme seçeneği için eşitlemeyi etkinleştirir. Eşitleme ayarlarını değiştirmek istiyorsanız, bağlantı kurulduktan sonra bunu yapabilirsiniz. Daha fazla bilgi edinmek için bkz. PowerShell kullanarak Blue Yonder Workforce Management'a vardiyalar bağlantınızı yönetme.

  3. Teams'de Mavi Yonder WFM örneklerini ekiplerinize eşleyin.

    • Yeni ekipler oluşturmak için yeni teams betiğini çalıştırmayı seçtiyseniz eşlemeler, oluşturduğunuz yeni ekipleri temel alır.
    • Mevcut ekipleri eşlemek için mevcut ekip betiğini çalıştırmayı seçtiyseniz eşlemeler, girdiğiniz Mavi Yonder örnek kimliklerini ve TeamId'leri temel alır. Bir ekibin mevcut bir zamanlaması varsa betik tüm zamanlama verilerini kaldırır.

Betiği çalıştırdıktan sonra, bağlantınızın başarıyla ayarlandığını onaylayan bir Başarı iletisi görüntülenir.

Bağlantınızı yönetme

Bağlantı kurulduktan sonra, Microsoft 365 yönetim merkezinde veya PowerShell kullanarak bu bağlantıyı yönetebilir ve bu bağlantıda değişiklik yapabilirsiniz.

Microsoft 365 yönetim merkezini kullanma

Bağlayıcı Yönetimi sayfasında, ayarladığınız her bağlantının yanı sıra sistem durumu ve eşitleme aralığı ayrıntıları gibi bilgiler listelenir. Bağlantılarınızdan herhangi birinde değişiklik yapmak için sihirbaza da erişebilirsiniz. Örneğin, eşitleme ayarlarını ve ekip eşlemelerini güncelleştirebilirsiniz.

Daha fazla bilgi edinmek için bkz. Microsoft 365 yönetim merkezini kullanarak Blue Yonder Workforce Management ile Vardiyalar bağlantınızı yönetme.

PowerShell kullanma

PowerShell'i kullanarak hata raporunu görüntüleyebilir, bağlantı ayarlarını değiştirebilir, eşitlemeyi devre dışı bırakabilir ve daha fazlasını yapabilirsiniz. Adım adım yönergeler için bkz. Blue Yonder Workforce Management ile Vardiyalar bağlantınızı yönetmek için PowerShell kullanma.

Komut dosyaları

Bağlantı kurma ve yeni bir ekip oluşturma

#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

Bağlantı kurma ve mevcut bir ekibi eşleme

#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 bağlayıcı cmdlet'leri

Betiklerde kullanılan cmdlet'ler de dahil olmak üzere Shifts bağlayıcı cmdlet'leri ile ilgili yardım için Teams PowerShell cmdlet başvurusundaCsTeamsShiftsConnection araması yapın. Yaygın olarak kullanılan bazı cmdlet'lerin kategoriye göre gruplandırılmış bağlantıları şunlardır:

Bağlantı

WFM sistemleri kimlik bilgileri

Desteklenen senaryolar için eşitleme seçenekleri

Zamanlama verilerini kaldırma

Bağlantı örnekleri

Kullanıcı eşlemesi ve başarılı eşitleme

Ekip eşlemesi

İşlem Kimliği

Hata raporları