Migrate-Classes.ps1

<#
    .Synopsis
    Creates class teams in Microsoft Teams.
 
    .Description
    Reads ASV Data from Get-DataFromAsvXml and creates classes based on Unterrichtselemente.
    Has to be run after Start-StudentMigration and Start-TeacherMigration, otherwise there will be no users / teachers inside the teams.
 
    .Parameter data
    Object returned from Get-DataFromAsvXml
  
    .Parameter Suffix
    Suffix after @ in UPN firstname.lastname@SUFFIX (somedomain.tld)
 
    .Parameter IncludeSeniors
    Wether or not to import classes from 11th or 12th form
 
    .Example
    # Creates class teams
    Start-ClassMigration -data $data -Suffix myschool.tld -IncludeSeniors $false
#>


function Generate-ClassToGroupHashTable($data)
{
    $klassendata = @{}
    foreach ($k in $data.Klassen)
    {
      foreach ($kg in $k.KlassenGruppen)
      {
        $klassendata.Add([int]$kg.KlassenGruppenId, $k.Klassenname)
      }
    }
    return $klassendata
}

function Generate-ClassGroupsToStudentHashTable($data)
{
  $students = @{}
  foreach ($s in $data.Klassen.Klassengruppen)
  {
    $students.Add([int]$s.KlassenGruppenId, $s.Klassenliste)
  }
  return $students
}

function Generate-SchuelerIdToObjTable()
{
  param
  (
    [parameter(
        Mandatory = $true
    )]
    $data,
    [parameter(
        Mandatory = $true
    )]
    $Suffix,    
    [parameter(
        Mandatory = $true
    )]
    $aadusers
  )

  $SchuelerIdToObjTable = @{}
  
  foreach($klasse in $data.Klassen)
  {
    foreach($klassengruppe in $klasse.KlassenGruppen)
    {
      foreach($schueler in $klassengruppe.Klassenliste)
      {
        $upn =  '{0}.{1}.schueler@{2}' -f (Remove-DiacriticsAndSpaces $schueler.Vorname),(Remove-DiacriticsAndSpaces $schueler.Familienname),$Suffix
        $SchuelerIdToObjTable.($schueler.SchuelerId) += @(($aadusers.$upn))
      }
    }
  }
  return $SchuelerIdToObjTable  
}

function Generate-TeacherIdToObjTable()
{
  param
  (
    [parameter(
        Mandatory = $true
    )]
    $data,
    [parameter(
        Mandatory = $true
    )]
    $Suffix,
    [parameter(
        Mandatory = $true
    )]
    $aadusers
  )

  $TeacherIdToObjTable = @{}
  
  foreach($teacher in $data.Lehrer)
  {
    $upn =  '{0}.{1}@{2}' -f (Remove-DiacriticsAndSpaces $teacher.Vorname),(Remove-DiacriticsAndSpaces $teacher.Familienname),$Suffix
    $TeacherIdToObjTable.($teacher.TeacherId) += @(($aadusers.$upn))
  }
  return $TeacherIdToObjTable  
}
function Start-ClassMigration
{
  param
  (
    [parameter(
        Mandatory = $true,
        ValueFromPipeline = $true
    )]
    $Data,
    [parameter(
        Mandatory = $true
    )]
    $Suffix,
    [bool]$IncludeSeniors = $false
  )

  $allusers = Get-AadUserHashTable
  
  $groupToClass = Generate-ClassToGroupHashTable($Data)
  $groupToStudents = Generate-ClassGroupsToStudentHashTable ($Data)
  
  $schuelerToObj = Generate-SchuelerIdToObjTable -data $Data -aadusers $allusers -Suffix $Suffix
  $teacherToObj = Generate-TeacherIdToObjTable -data $Data -aadusers $allusers -Suffix $Suffix
  
  $out = @{}
  $Data.Unterrichtselemente | % {
    
    $klasse = $groupToClass.[int]$_.KlassenGruppeId
    $lehrkraft = $_.LehrkraftId
    
    if(!$IncludeSeniors -and 
    ( ($fach -match "11" -or $fach -match "12") -or ($klasse -match "11" -or $klasse -match "12") ))
    {
      # For performance reasons it's like this.
    } else
    {      
      $key = (($Data.Faecher.[int]$_.FachId) + "." + $klasse)
      
      $val = New-Object PSObject
      $val | Add-Member -MemberType NoteProperty -Name Klassenliste -Value ($groupToStudents.[int]$_.KlassenGruppeId)
      $val | Add-Member -MemberType NoteProperty -Name Lehrkraft -Value $lehrkraft
      
      if($out.ContainsKey($key))
      {
        $out[$key].Klassenliste += $val.Klassenliste
      }
      else
      {
        $out.Add($key, $val)
      }
    }
  }
  
  foreach($o in $out.GetEnumerator()) 
  { 
    $fach,$klasse = $o.Key.Split(".")
    
    $teacher = $teacherToObj.($o.Value.Lehrkraft)
    $team = New-Team -DisplayName ("$klasse - $fach") -Template EDU_Class -Owner $teacher[0].ToString()
    
    foreach ($s in $o.Value.Klassenliste)
    {
      $obj = $schuelerToObj.($s.SchuelerId)
      Add-TeamUser -GroupId $team.GroupId -User $obj[0].ToString() -Role Member
    }
  }
}