Jaa


Työvuorojen yhdistäminen UKG Pro Workforce Managementiin PowerShellin avulla

Yleiskatsaus

Integroi Shifts-sovellus Microsoft Teamsissa UKG Pro Workforce Managementin Microsoft Teams Shifts -liittimellä UKG Pro Workforce Managementiin (UKG Pro WFM). Etulinjan työntekijäsi voivat tarkastella ja hallita aikataulujaan saumattomasti UKG Pro WFM:ssä vuoroista alkaen.

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

Voit määrittää yhteyden suorittamalla PowerShell-komentosarjan. Komentosarja määrittää liittimen, ottaa käyttöön synkronointiasetukset, luo yhteyden ja yhdistää UKG Pro WFM -esiintymät (WFM-esiintymät) Teamsiin Teamsissa. Synkronointiasetukset määrittävät vuoroissa käytössä olevat ominaisuudet ja aikataulutiedot, jotka synkronoidaan UKG Pro WFM:n ja Vaihtojen välillä. Yhdistämismääritykset määrittävät WFM-esiintymien ja Tiimien välisen synkronointisuhteen Teamsissa. 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ä WFM-esiintymä voidaan yhdistää vain yhteen tiimiin milloin tahansa. Jos esiintymä on jo yhdistetty tiimiin, sitä ei voi yhdistää toiseen tiimiin.

Kun kirjausjärjestelmänä on UKG Pro WFM, etulinjan työntekijäsi voivat hallita tehokkaasti aikataulujaan ja käytettävyyttään laitteidensa työvuoroissa. Etulinjan johtajat voivat edelleen määrittää aikatauluja UKG Pro WFM:n avulla.

Huomautus

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

Alkuvalmistelut

Ennakkovaatimukset

Tarkastele tietoja ja suorita kaikki edellytykset ja määritystehtävät, jotka ovat kohdassa Teams Shifts -liittimen edellytykset ja vaatimukset UKG Pro Workforce Managementille.

Varmista, että suoritat kaikki tehtävät, ennen kuin noudatat tämän artikkelin ohjeita.

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 Microsoft 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 WFM-esiintymiä aiemmin luotuihin 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:

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

  1. Testaa ja tarkista yhteys UKG Pro WFM:hen KÄYTTÄMÄLLÄ UKG Pro WFM -palvelutilin tunnistetietoja ja palvelun URL-osoitteita, jotka annat.

  2. Ota synkronointiasetukset käyttöön. Näitä asetuksia ovat synkronointitiheys (minuutteina) ja UKG Pro WFM:n ja Vaihtojen välillä synkronoidut aikataulutiedot. Voit ottaa käyttöön näissä skenaarioissa määritetyt aikataulutiedot: Shift, , SwapRequest, OfferShiftRequest, 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 Työvuorojen yhteyden hallinta PowerShellin avulla UKG Pro Workforce Managementiin.

  3. Yhdistä 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 suorittaa aiemmin luodun Teams-komentosarjan aiemmin luotujen tiimien yhdistämiseksi, yhdistämismääritykset perustuvat WFM-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 Työvuorot-yhteyden hallinta Microsoft 365 -hallintakeskuksessa UKG Pro Workforce Managementiin.

PowerShellin käyttäminen

PowerShellin avulla voit tarkastella virheraporttia, muuttaa yhteysasetuksia, poistaa synkronoinnin käytöstä ja paljon muuta. Vaiheittaiset ohjeet ovat artikkelissa Työvuorojen yhteyden hallinta PowerShellin avulla UKG Pro Workforce Managementiin.

Skriptit

Määritä yhteys ja luo uusi ryhmä

#Map WFM instances 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
Write-Output "Listing connector types available"
$UkgId = "95BF2848-2DDA-4425-B0EE-D62AEED4C0A0"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors
$Ukg = $connectors | Where-Object {$_.Id -match $UkgId}
if ($NULL -eq $Ukg) {
    throw "UKG Dimensions not currently supported"
}

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your UKG account username'
$WfmPwd = Read-Host -Prompt 'Input your UKG 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'
$apiUrl = Read-Host -Prompt 'Input connector api url'
$ssoUrl = Read-Host -Prompt 'Input connector sso url'
$clientId = Read-Host -Prompt 'Input connector client id'
$AppKey = Read-Host -Prompt 'Input your app key' -AsSecureString
$plainKey =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($AppKey))
$ClientSecret = Read-Host -Prompt 'Input your client secret' -AsSecureString
$plainSecret =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($ClientSecret))

$testResult = Test-CsTeamsShiftsConnectionValidate `
    -Name $ConnectionName `
    -ConnectorId $UkgId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificUkgDimensionsSettingsRequest `
        -Property @{
            apiUrl = $apiUrl
            ssoUrl = $ssoUrl
            appKey = $plainKey
            clientId = $clientId
            clientSecret = $plainSecret
            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 $UkgId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificUkgDimensionsSettingsRequest `
        -Property @{
            apiUrl = $apiUrl
            ssoUrl = $ssoUrl
            appKey = $plainKey
            clientId = $clientId
            clientSecret = $plainSecret
            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" }
    }
}
$SyncScenarioOfferShiftRequest = GetSyncScenarioSetting "Offer Shift Request"
$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 `
    -SyncScenarioOfferShiftRequest $SyncScenarioOfferShiftRequest `
    -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 instances to existing teams script
Write-Host "Map WFM sites to existing teams"
Start-Sleep 1

#Ensure Teams module is at least version x
Write-Host "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
Write-Output "Listing connector types available"
$UkgId = "95BF2848-2DDA-4425-B0EE-D62AEED4C0A0"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors
$Ukg = $connectors | Where-Object {$_.Id -match $UkgId}
if ($NULL -eq $Ukg) {
    throw "UKG Dimensions not currently supported"
}

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your UKG account username'
$WfmPwd = Read-Host -Prompt 'Input your UKG 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'
$apiUrl = Read-Host -Prompt 'Input connector api url'
$ssoUrl = Read-Host -Prompt 'Input connector sso url'
$clientId = Read-Host -Prompt 'Input connector client id'
$AppKey = Read-Host -Prompt 'Input your app key' -AsSecureString
$plainKey =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($AppKey))
$ClientSecret = Read-Host -Prompt 'Input your client secret' -AsSecureString
$plainSecret =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($ClientSecret))

$testResult = Test-CsTeamsShiftsConnectionValidate `
    -Name $ConnectionName `
    -ConnectorId $UkgId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificUkgDimensionsSettingsRequest `
        -Property @{
            apiUrl = $apiUrl
            ssoUrl = $ssoUrl
            appKey = $plainKey
            clientId = $clientId
            clientSecret = $plainSecret
            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 $UkgId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificUkgDimensionsSettingsRequest `
        -Property @{
            apiUrl = $apiUrl
            ssoUrl = $ssoUrl
            appKey = $plainKey
            clientId = $clientId
            clientSecret = $plainSecret
            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" }
    }
}
$SyncScenarioOfferShiftRequest = GetSyncScenarioSetting "Offer Shift Request"
$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 `
    -SyncScenarioOfferShiftRequest $SyncScenarioOfferShiftRequest `
    -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