Dela via


Använda PowerShell för att ansluta Arbetspass till personalhantering i Blue Yonder

Översikt

Använd Microsoft Teams Arbetspassanslutning för Blue Yonder för att integrera appen Arbetspass i Microsoft Teams med Blue Yonder Workforce Management (Blue Yonder WFM). Dina medarbetare i frontlinjen kan sömlöst visa och hantera sina scheman i Blue Yonder WFM inifrån Skift.

I den här artikeln går vi igenom hur du använder PowerShell för att konfigurera anslutningsappen för att integrera Arbetspass med Blue Yonder WFM.

Om du vill konfigurera anslutningen kör du ett PowerShell-skript. Skriptet konfigurerar anslutningsappen, tillämpar synkroniseringsinställningar, skapar anslutningen och mappar Blue Yonder WFM-instanser till team. Synkroniseringsinställningarna avgör vilka funktioner som är aktiverade i Arbetspass och schemainformationen som synkroniseras mellan Blue Yonder WFM och Arbetspass. Mappningar definierar synkroniseringsrelationen mellan dina Blue Yonder WFM-instanser och team i Teams. Du kan mappa till befintliga team och nya team.

Vi tillhandahåller två skript. Du kan använda båda skripten, beroende på om du vill mappa till befintliga team eller skapa nya team att mappa till.

Du kan konfigurera flera anslutningar, var och en med olika synkroniseringsinställningar. Om din organisation till exempel har flera platser med olika schemakrav skapar du en anslutning med unika synkroniseringsinställningar för varje plats. Tänk på att en Blue Yonder WFM-instans bara kan mappas till ett team vid en viss tidpunkt. Om en instans redan är mappad till ett team kan den inte mappas till ett annat team.

Med Blue Yonder WFM som arkivhandlingssystem kan dina medarbetare i frontlinjen effektivt hantera sina scheman och tillgänglighet i Skift på sina enheter. Chefer i frontlinjen kan fortsätta att använda Blue Yonder WFM för att konfigurera scheman.

Obs!

Du kan också använda guiden Förskjutningskoppling i Administrationscenter för Microsoft 365 för att ansluta Arbetspass till Blue Yonder WFM.

Innan du börjar

Förutsättningar

Innan du börjar måste du uppfylla följande krav:

  • Du har Blue Yonder WFM version 2020.3, 2021.1 eller 2021.2.

    Obs!

    Om du har Blue Yonder WFM 2020.3 eller 2021.1 använder du korrigeringen 2020.3.0.4 eller 2021.1.0.3. Den här korrigeringen åtgärdar ett problem där användare får ett beständigt felmeddelande i Arbetspass. Det åtgärdar också ett problem som hindrar användare från att uppdatera sin tillgänglighet i Arbetspass.

  • Du vet namnet på ditt Blue Yonder WFM-tjänstkonto, lösenord och tjänst-URL:er:

    • URL för federerad autentisering
    • URL för cookieautentisering
    • Employee Self-Service URL
    • API-URL för detaljhandeln
    • API-URL för webbplatsansvarig
    • Administration API-URL

    Om du inte har all den här informationen kontaktar du Blue Yonder-supporten. Ett Blue Yonder-konto skapas på rotföretagsnivå av en Blue Yonder-företagsadministratör. Den måste ha API-åtkomst, klientadministratör, Store Manager och arbetsåtkomst. Kontot och lösenordet krävs för att skapa en anslutning.

  • Federerad SSO-autentisering har aktiverats i din Blue Yonder WFM-miljö. Kontakta Blue Yonder-supporten för att kontrollera att federerad enkel inloggning är aktiverat. De behöver följande information:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize var {tenantId} är ditt tenantId
    • proxyHeader: X-MS-AuthToken
  • Du har minst ett team konfigurerat i Teams.

  • Du har lagt till ett allmänt konto, det vi kallar Microsoft 365-systemkontot, som teamägare för alla team som du vill mappa.

    Skapa det här kontot i administrationscentret för Microsoft 365 och tilldela det en Microsoft 365-licens. Lägg sedan till kontot som teamägare i alla team som du vill mappa. Arbetspasskopplingen använder det här kontot vid synkronisering av skiftändringar från Blue Yonder WFM. Vi rekommenderar att du skapar ett konto specifikt för detta ändamål och inte använder ditt personliga användarkonto.

Administratörsroll för att hantera anslutningsappen med PowerShell

Du måste vara global microsoft 365-administratör eller administratör för Shifts-anslutningsappen för att slutföra stegen i den här artikeln.

Administratörsrollen för Shifts-anslutningsappen är en anpassad roll som du skapar i Microsoft Entra-ID och tilldelar till en användare. Namnet på rollen måste vara "Administratör för Shifts-anslutningsappen". Rollen behöver inte ha några specifika behörigheter, men minst en behörighet måste anges när du skapar den. Tjänsten förlitar sig på användarens närvaro av rollen och inte dess behörigheter.

Mer information finns i Skapa och tilldela en anpassad roll i Microsoft Entra-ID och Tilldela Microsoft Entra-roller till användare. Tänk på att det kan ta upp till 24 timmar innan rollen skapas och tillämpas på en användare.

Viktigt

Microsoft rekommenderar att du använder roller med minst behörighet. Detta bidrar till att förbättra säkerheten för din organisation. Global administratör är en mycket privilegierad roll som bör begränsas till nödsituationsscenarier när du inte kan använda en mindre privilegierad roll.

Konfigurera din miljö

  1. Installera PowerShell version 7 eller senare. Stegvisa anvisningar finns i Installera PowerShell i Windows.

  2. Kör PowerShell i administratörsläge.

  3. Installera Microsoft Graph PowerShell-modulen.

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

    Kontrollera att det är version 1.6.1 eller senare.

    Get-InstalledModule Microsoft.Graph 
    
  4. Installera PowerShell-modulen Förhandsversion av Teams.

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

    Kontrollera att den är minst version 4.7.0 och innehåller cmdletarna för Shifts-anslutningsappen.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Ange att PowerShell ska avslutas om ett fel uppstår när skriptet körs.

    $ErrorActionPreference = "Stop" 
    
  6. Aktivera skript för att köras i Windows.

    Set-ExecutionPolicy bypass 
    

Anslut till Teams

Kör följande för att ansluta till Teams.

Connect-MicrosoftTeams

När du uppmanas att göra det loggar du in med dina administratörsautentiseringsuppgifter. Du är nu konfigurerad för att köra skripten i den här artikeln och cmdletar för Shifts-anslutningsappen.

Identifiera de team som du vill mappa

Obs!

Slutför det här steget om du mappar Blue Yonder WFM-instanser till befintliga team. Om du skapar nya team att mappa till kan du hoppa över det här steget.

I Azure Portal går du till sidan Alla grupper för att få en lista över team-ID:erna i din organisation.

Anteckna TeamIds för de team som du vill mappa. Skriptet uppmanar dig att ange den här informationen.

Obs!

Om ett eller flera team har ett befintligt schema tar skriptet bort scheman från dessa team. Annars visas dubbletter av arbetspass.

Kör skriptet

Kör något av följande skript, beroende på om du skapar ett nytt team eller mappar till ett befintligt team:

  • Om du vill konfigurera en anslutning skapar du ett nytt team i Teams och mappar en Blue Yonder WFM-instans till det nya teamet genom att köra det nya teams-skriptet.
  • Om du vill konfigurera en anslutning och mappa Blue Yonder WFM-instanser till befintliga team i Teams kör du det befintliga teams-skriptet.

Följ anvisningarna på skärmen när du kör skriptet. Skriptet slutför följande åtgärder:

  1. Testa och verifiera anslutningen till Blue Yonder WFM med autentiseringsuppgifterna för Blue Yonder WFM-tjänstkontot och tjänst-URL:er som du anger.

  2. Tillämpa synkroniseringsinställningar. De här inställningarna omfattar synkroniseringsfrekvensen (i minuter) och schemadata som synkroniseras mellan Blue Yonder WFM och Skift. Du kan aktivera schemadata som definieras av följande scenarier: Shift, SwapRequest, UserShiftPreferences, OpenShift, OpenShiftRequest, TimeOff, TimeOffRequest.

    Mer information finns i New-CsTeamsShiftsConnectionInstance. Kör Get-CsTeamsShiftsConnectionConnector för att se listan över synkroniseringsalternativ som stöds för varje parameter.

    Obs!

    Skriptet aktiverar synkronisering för varje synkroniseringsalternativ som stöds. Om du vill ändra synkroniseringsinställningarna kan du göra det när anslutningen har konfigurerats. Mer information finns i Använda PowerShell för att hantera din Arbetspass-anslutning till Blue Yonder Workforce Management.

  3. Mappa Blue Yonder WFM-instanser till dina team i Teams.

    • Om du väljer att köra det nya teams-skriptet för att skapa nya team baseras mappningarna på de nya team som du skapar.
    • Om du väljer att köra det befintliga teams-skriptet för att mappa befintliga team baseras mappningarna på blue yonder-instans-ID:n och TeamIds som du anger. Om ett team har ett befintligt schema tar skriptet bort alla schemadata.

När du har kört skriptet bekräftar ett meddelande om att anslutningen har konfigurerats.

Hantera anslutningen

När en anslutning har konfigurerats kan du hantera och göra ändringar i den i administrationscentret för Microsoft 365 eller med hjälp av PowerShell.

Använda administrationscentret för Microsoft 365

På sidan Hantering av anslutningsapp visas varje anslutning som du har konfigurerat, tillsammans med information som hälsostatus och information om synkroniseringsintervall. Du kan också komma åt guiden för att göra ändringar i någon av dina anslutningar. Du kan till exempel uppdatera synkroniseringsinställningar och teammappningar.

Mer information finns i Använda administrationscentret för Microsoft 365 för att hantera din Shifts-anslutning till Blue Yonder Workforce Management.

Använda PowerShell

Du kan använda PowerShell för att visa en felrapport, ändra anslutningsinställningar, inaktivera synkronisering med mera. Stegvisa anvisningar finns i Använda PowerShell för att hantera din Arbetspass-anslutning till Blue Yonder Workforce Management.

Skript

Konfigurera en anslutning och skapa ett nytt team

#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

Konfigurera en anslutning och mappa ett befintligt team

#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

Cmdletar för arbetspassanslutningar

Om du vill ha hjälp med Cmdletar för Shifts-anslutningsprogram, inklusive de cmdletar som används i skripten, söker du efter CsTeamsShiftsConnection i Teams PowerShell-cmdlet-referensen. Här är länkar till några vanliga cmdletar, grupperade efter kategori:

Anslutningar

Autentiseringsuppgifter för WFM-system

Synkroniseringsalternativ för scenarier som stöds

Ta bort schemadata

Anslutningsinstanser

Användarmappning och lyckad synkronisering

Teammappning

Åtgärds-ID

Felrapporter