Migrate-Classes.ps1
function Generate-ClassToGroupHashTable { param ( [Parameter(Mandatory=$true)] $data ) $klassendata = @{} foreach ($k in $data.Klassen) { foreach ($kg in $k.KlassenGruppen) { $klassendata.Add([int]$kg.KlassenGruppenId, $k.Klassenname) } } return $klassendata } function Generate-ClassGroupsToStudentHashTable { param ( [Parameter(Mandatory=$true)] $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 { <# .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 #> param ( [parameter( Mandatory = $true, ValueFromPipeline = $true )] $Data, [parameter( Mandatory = $true )] $Suffix, [bool]$IncludeSeniors = $false ) $allusers = Get-AadUserHashTable $groupToClass = Generate-ClassToGroupHashTable -data $Data $groupToStudents = Generate-ClassGroupsToStudentHashTable -data $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 ($klasse -match '11' -or $klasse -match '12')) ) { $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 ("{0} - {1}" -f $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 } } } |