Jaa


Työvuorojen yhdistäminen Blue Yonder -työvoiman hallintaan PowerShellin avulla

Yleiskatsaus

Integroi Shifts-sovellus Microsoft Teamsissa Blue Yonderin Microsoft Teams Shifts -liittimellä Blue Yonder Workforce Managementin (Blue Yonder WFM) kanssa. Etulinjan työntekijät voivat tarkastella ja hallita aikataulujaan saumattomasti Blue Yonder WFM:ssä vuoroista alkaen.

Tässä artikkelissa kerrotaan, miten voit PowerShellin avulla määrittää ja määrittää liittimen integroimaan vaihtovuorot Blue Yonder WFM:n kanssa.

Voit määrittää yhteyden suorittamalla PowerShell-komentosarjan. Komentosarja määrittää liittimen, ottaa käyttöön synkronointiasetukset, luo yhteyden ja yhdistää Blue Yonder WFM -esiintymät tiimeihin. Synkronointiasetukset määrittävät vuoroissa käytössä olevat ominaisuudet ja ajoitetut tiedot, jotka synkronoidaan Blue Yonder WFM:n ja Shiftsin välillä. Yhdistämismääritykset määrittävät Blue Yonder WFM -esiintymien ja Teamsin tiimien välisen synkronointisuhteen. Voit yhdistää olemassa oleviin tiimeihin ja uusiin tiimeihin.

Tarjoamme kaksi komentosarjaa. Voit käyttää jompaakumpaa komentosarjaa sen mukaan, haluatko yhdistää olemassa oleviin tiimeihin vai luoda uusia ryhmiä, joita haluat yhdistää.

Voit määrittää useita yhteyksiä, joista jokaisella on erilaiset synkronointiasetukset. Jos organisaatiollasi on esimerkiksi useita sijainteja, joilla on erilaiset aikatauluvaatimukset, luo yhteys kunkin sijainnin yksilöllisten synkronointiasetusten avulla. Muista, että Blue Yonder WFM -esiintymä voidaan yhdistää vain yhteen tiimiin milloin tahansa. Jos esiintymä on jo yhdistetty tiimiin, sitä ei voi yhdistää toiseen tiimiin.

Kun tietuejärjestelmänä on Blue Yonder WFM, etulinjan työntekijäsi voivat hallita tehokkaasti aikataulujaan ja käytettävyyttään laitteidensa työvuoroissa. Etulinjan valvojat voivat jatkaa Blue Yonder WFM:n käyttöä aikataulujen määrittämiseen.

Huomautus

Voit käyttää myös Microsoft 365 -hallintakeskuksen ohjattua Vaihtovuorot-liitintä työvuorojen yhdistämiseen Blue Yonder WFM:hen.

Alkuvalmistelut

Ennakkovaatimukset

Ennen kuin aloitat, varmista, että täytät kaikki seuraavat edellytykset:

  • Sinulla on Blue Yonder WFM versio 2020.3, 2021.1 tai 2021.2.

    Huomautus

    Jos käytössäsi on Blue Yonder WFM 2020.3 tai 2021.1, käytä korjaustiedostoa 2020.3.0.4 tai 2021.1.0.3. Tämä korjaustiedosto korjaa ongelman, jossa käyttäjät saavat pysyvän virhesanoman vuoroissa. Se myös korjaa ongelman, joka estää käyttäjiä päivittämästä käytettävyyttään vuoroissa.

  • Tiedät Blue Yonder WFM -palvelutilisi nimen, salasanan ja palvelun URL-osoitteet:

    • Liitetyn todennuksen URL-osoite
    • Evästetodennuksen URL-osoite
    • Työntekijän omatoiminen URL-osoite
    • Jälleenmyynnin verkko-ohjelmointirajapinnan URL-osoite
    • Sivustonhallinnan ohjelmointirajapinnan URL-osoite
    • Hallinnan ohjelmointirajapinnan URL-osoite

    Jos sinulla ei ole kaikkia näitä tietoja, ota yhteyttä Blue Yonder -tukeen. Blue Yonder -yritysjärjestelmänvalvoja luo Blue Yonder -tilin yrityksen päätasolla. Sovelluksella on oltava ohjelmointirajapinnan käyttöoikeus, asiakasjärjestelmänvalvojan, säilön ylläpitäjän ja työntekijän käyttöoikeus. Yhteyden luominen edellyttää tiliä ja salasanaa.

  • Liitetty SSO-todennus on käytössä Blue Yonder WFM -ympäristössäsi. Ota yhteyttä Blue Yonder -tukeen varmistaaksesi, että liitetty kertakirjautuminen on käytössä. He tarvitsevat seuraavat tiedot:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize missä {tenantId} on tenantId
    • proxyHeader: X-MS-AuthToken
  • Sinulla on vähintään yksi tiimi määritettynä Teamsissa.

  • Olet lisännyt yleisen tilin, jota kutsumme Microsoft 365 -järjestelmätiliksi, tiimin omistajaksi kaikille tiimeille, jotka haluat yhdistää.

    Luo tämä tili Microsoft 365 -hallintakeskuksessa ja määritä sille Microsoft 365 -käyttöoikeus. Lisää sitten tili ryhmän omistajaksi kaikkiin tiimeihin, jotka haluat yhdistää. Shifts-liitin käyttää tätä tiliä synkronoitaessa Shifts-muutoksia Blue Yonder WFM:stä. Suosittelemme, että luot juuri tätä tarkoitusta varten tilin, etkä käytä henkilökohtaista käyttäjätiliäsi.

Järjestelmänvalvojan rooli liittimen hallintaan PowerShellin avulla

Sinun on oltava Microsoft 365:n yleinen järjestelmänvalvoja tai Shifts-yhdistimen järjestelmänvalvoja, jotta voit suorittaa tämän artikkelin vaiheet.

Shifts-liittimen järjestelmänvalvojan rooli on mukautettu rooli, jonka luot Microsoft Entra -tunnuksella ja määrität käyttäjälle. Roolin nimen on oltava Shifts-yhdistimen järjestelmänvalvoja. Roolilla ei tarvitse olla erityisiä käyttöoikeuksia, mutta vähintään yksi käyttöoikeus on määritettävä, kun luot sen. Palvelu luottaa rooliin käyttäjään sen käyttöoikeuksien sijaan.

Lisätietoja on artikkelissa Mukautetun roolin luominen ja määrittäminen Microsoft Entra ID: ssä ja Microsoft Entra -roolien määrittäminen käyttäjille. Muista, että roolin luominen ja lisääminen käyttäjään voi kestää jopa 24 tuntia.

Tärkeää

Microsoft suosittelee, että käytät rooleja, joilla on vähiten käyttöoikeuksia. Tämä auttaa parantamaan organisaatiosi suojausta. Yleinen järjestelmänvalvoja on hyvin etuoikeutettu rooli, joka tulisi rajata hätätilanteisiin, joissa et voi käyttää vähemmän etuoikeutettua roolia.

Ympäristön määrittäminen

  1. Asenna PowerShellin versio 7 tai uudempi. Vaiheittaiset ohjeet ovat artikkelissa PowerShellin asentaminen Windowsiin.

  2. Suorita PowerShell järjestelmänvalvojatilassa.

  3. Asenna Microsoft Graph PowerShell -moduuli.

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

    Varmista, että kyseessä on versio 1.6.1 tai uudempi versio.

    Get-InstalledModule Microsoft.Graph 
    
  4. Asenna Teams Preview PowerShell -moduuli.

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

    Varmista, että kyseessä on vähintään versio 4.7.0 ja että se sisältää Shifts-yhdistimen cmdlet-komennot.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Määritä PowerShell poistumaan, jos komentosarjaa suoritettaessa ilmenee virhe.

    $ErrorActionPreference = "Stop" 
    
  6. Ota komentosarjat käyttöön Windowsissa.

    Set-ExecutionPolicy bypass 
    

Yhdistä Teamsiin

Muodosta yhteys Teamsiin suorittamalla seuraava.

Connect-MicrosoftTeams

Kun näyttöön tulee kehote, kirjaudu sisään järjestelmänvalvojan tunnistetiedoilla. Olet nyt määritetty suorittamaan tämän artikkelin komentosarjat ja Shifts-yhdistimen cmdlet-komennot.

Yhdistettävien tiimien tunnistaminen

Huomautus

Suorita tämä vaihe, jos yhdistät Blue Yonder WFM -esiintymät olemassa oleviin tiimeihin. Jos olet luomassa uusia tiimejä, joita haluat yhdistää, voit ohittaa tämän vaiheen.

Siirry Azure-portaalissa Kaikki ryhmät -sivulle, jotta saat luettelon organisaatiosi tiimien TeamId-tunnusten luettelosta.

Ota huomioon yhdistettävien tiimien TeamId-tunnus. Komentosarja kehottaa antamaan nämä tiedot.

Huomautus

Jos yhdellä tai useammalla tiimillä on olemassa oleva aikataulu, komentosarja poistaa aikataulut kyseisistä tiimeistä. Muussa tapauksessa näet vuorojen kaksoiskappaleet.

Suorita komentosarja

Suorita jokin seuraavista komentosareista sen mukaan, luotko uuden tiimin vai yhdistätkö sen aiemmin luotuun tiimiin:

  • Jos haluat määrittää yhteyden, luo uusi tiimi Teamsissa ja liitä Blue Yonder WFM -esiintymä uuteen tiimiin suorittamalla uusi Teams-komentosarja.
  • Jos haluat määrittää yhteyden ja yhdistää Blue Yonder WFM -esiintymät Teamsin nykyisiin tiimeihin, suorita olemassa oleva Teams-komentosarja.

Noudata näytön ohjeita, kun suoritat komentosarjan. Komentosarja suorittaa seuraavat toiminnot:

  1. Testaa ja tarkista yhteys Blue Yonder WFM:hen käyttämällä Blue Yonder WFM -palvelutilin tunnistetietoja ja palvelun URL-osoitteita, jotka annat.

  2. Ota synkronointiasetukset käyttöön. Nämä asetukset sisältävät synkronointitiheyden (minuutteina) ja ajoitetut tiedot, jotka synkronoidaan Blue Yonder WFM:n ja Shiftsin välillä. Voit ottaa käyttöön näissä skenaarioissa määritetyt aikataulutiedot: Shift, , SwapRequest, UserShiftPreferences, OpenShift, OpenShiftRequest, , TimeOffTimeOffRequest.

    Lisätietoja on artikkelissa New-CsTeamsShiftsConnectionInstance. Jos haluat nähdä luettelon kunkin parametrin tuetuista synkronointivaihtoehdoista, suorita Get-CsTeamsShiftsConnectionConnector.

    Huomautus

    Komentosarja ottaa käyttöön jokaisen tuetun synkronointivaihtoehdon synkronoinnin. Jos haluat muuttaa synkronointiasetuksia, voit tehdä sen, kun yhteys on määritetty. Lisätietoja on artikkelissa Vuorojen yhteyden hallinta PowerShellin avulla Blue Yonder -työvoiman hallintaan.

  3. Yhdistä Siniset Yonder-WFM-esiintymät tiimeihisi Teamsissa.

    • Jos päätät luoda uusia tiimejä suorittamalla uuden Teams-komentosarjan , yhdistämismääritykset perustuvat luomiasi uusiin tiimeihin.
    • Jos päätät yhdistää olemassa olevia tiimejä suorittamalla olemassa olevan Teams-komentosarjan , yhdistämismääritykset perustuvat blue yonder -esiintymätunnuksiin ja teamid-tunnuksiin, jotka annat. Jos ryhmällä on olemassa oleva aikataulu, komentosarja poistaa kaikki aikataulutiedot.

Kun olet suorittanut komentosarjan, onnistumissanoma vahvistaa, onko yhteys määritetty onnistuneesti.

Hallitse yhteyttä

Kun yhteys on määritetty, voit hallita sitä ja tehdä siihen muutoksia Microsoft 365 -hallintakeskuksessa tai PowerShellin avulla.

Käytä Microsoft 365 -hallintakeskusta

Liittimien hallinta -sivulla on luettelo jokaisesta määrittämästäsi yhteydestä sekä tietoja, kuten kuntotila ja synkronointivälin tiedot. Voit myös käyttää ohjattua toimintoa ja tehdä muutoksia mihin tahansa yhteyksiin. Voit esimerkiksi päivittää synkronointiasetukset ja tiimien yhdistämismääritykset.

Lisätietoja on artikkelissa Vuorot-yhteyksien hallinta Microsoft 365 -hallintakeskuksessa Blue Yonder -työvoiman hallintaan.

PowerShellin käyttäminen

PowerShellin avulla voit tarkastella virheraporttia, muuttaa yhteysasetuksia, poistaa synkronoinnin käytöstä ja paljon muuta. Vaiheittaiset ohjeet ovat artikkelissa Vuorojen ja Blue Yonder -työvoiman hallinnan hallinta PowerShellin avulla.

Skriptit

Määritä yhteys ja luo uusi ryhmä

#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

Yhteyden määrittäminen ja olemassa olevan ryhmän yhdistäminen

#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

Vaihtoliittimen cmdlet-komennot

Saat lisätietoja Shifts-yhdistimen cmdlet-komennoista, mukaan lukien komentosarjoissa käytetyistä cmdlet-komennoista, artikkelista CsTeamsShiftsConnectionTeams PowerShellin cmdlet-viitteessä. Seuraavassa on linkkejä usein käytettyihin cmdlet-komentoihin luokan mukaan ryhmiteltyinä:

Yhteydet

WFM-järjestelmien tunnistetiedot

Tuettujen skenaarioiden synkronointiasetukset

Poista aikataulutiedot

Yhteysesiintymät

Käyttäjän yhdistäminen ja onnistunut synkronointi

Ryhmän yhdistäminen

Toiminnon tunnus

Virheraportit