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 )] $Format, [parameter( Mandatory = $true )] $aadusers ) $SchuelerIdToObjTable = @{} foreach($klasse in $data.Klassen) { foreach($klassengruppe in $klasse.KlassenGruppen) { foreach($schueler in $klassengruppe.Klassenliste) { $upn = Get-Upn -vorname ($schueler.Vorname) -nachname ($schueler.Familienname) -gebdat ($schueler.GebDatum) -format $Format $SchuelerIdToObjTable.($schueler.SchuelerId) += @(($aadusers.$upn)) } } } return $SchuelerIdToObjTable } function Generate-TeacherIdToObjTable() { param ( [parameter( Mandatory = $true )] $data, [parameter( Mandatory = $true )] $Format, [parameter( Mandatory = $true )] $aadusers ) $TeacherIdToObjTable = @{} foreach($teacher in $data.Lehrer) { $upn = Get-Upn -vorname ($teacher.Vorname) -nachname ($teacher.Familienname) -format $Format $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)]$FormatPupil, [parameter(Mandatory = $true)]$FormatTeacher, [parameter(Mandatory=$true)]$FallbackOwner, $WhatIf = $false ) $allusers = Get-AadUserHashTable $allclasses = @{}; Get-AzureADGroup -All $true | % { $allclasses.Add($_.DisplayName, $_) } $groupToClass = Generate-ClassToGroupHashTable -data $Data $groupToStudents = Generate-ClassGroupsToStudentHashTable -data $Data $schuelerToObj = Generate-SchuelerIdToObjTable -data $Data -aadusers $allusers -Format $FormatPupil $teacherToObj = Generate-TeacherIdToObjTable -data $Data -aadusers $allusers -Format $FormatTeacher $out = @{} $Data.Unterrichtselemente | % { $klasse = $groupToClass.[int]$_.KlassenGruppeId if($null -eq $klasse) { Write-Host "[DBG] NO class found for id: $($_.KlassenGruppeId)" } $lehrkraft = $_.LehrkraftId #TODO PLACE ! INSIDE IF STATEMENT if( ($klasse -match '11' -or $klasse -match '12') ) { $val = New-Object PSObject $val | Add-Member -MemberType NoteProperty -Name Fach -Value ($Data.Faecher.[int]$_.FachId) $val | Add-Member -MemberType NoteProperty -Name Klasse -Value $klasse $val | Add-Member -MemberType NoteProperty -Name Bezeichnung -Value ($_.Bezeichnung) $val | Add-Member -MemberType NoteProperty -Name Klassenliste -Value ($groupToStudents.[int]$_.KlassenGruppeId) $val | Add-Member -MemberType NoteProperty -Name Lehrkraft -Value $lehrkraft $val | Add-Member -MemberType NoteProperty -Name Koppel -Value ($_.IsPseudoKoppel) if( $out.ContainsKey($_.Bezeichnung) ) { ( $out.($_.Bezeichnung) ).Klassenliste += ($groupToStudents.[int]$_.KlassenGruppeId) } else { $out.Add( ($_.Bezeichnung) , $val) } } } if($WhatIf){ $DbgOut = New-Object -TypeName "System.Collections.ArrayList" } foreach($o in $out.GetEnumerator()) { $teacher = Get-NullSaveStrFromHashTable -Table $teacherToObj -FallbackString $FallbackOwner -LookupKey $o.Value.Lehrkraft $dn = "{0} - {1}" -f ($o.Value.Klasse),($o.Value.Fach) if( (!$o.Value.Koppel) -or ($o.Value.Klasse -match "Q") ) { $dn = $o.Value.Bezeichnung } if($WhatIf) { Write-Host "[WHATIF] Would create Class: $($dn) | Subject: $($o.Value.Fach) | Pupil count: $($o.Value.Klassenliste.Count)" $o.Value | Add-Member -MemberType NoteProperty -Name DisplayName -Value $dn $DbgOut.Add($o.Value) } else { Write-Host "[CREATE] $($o.Value.Bezeichnung)" $team = New-Team -DisplayName $dn -Template EDU_Class -Owner ($teacher) foreach ($s in $o.Value.Klassenliste) { $obj = Get-NullSaveStrFromHashTable -Table $schuelerToObj -LookupKey $s.SchuelerId Write-Host "[CREATE] Add user $obj" Add-TeamUser -GroupId $team.GroupId -User $obj -Role Member } $team = $null } } if($WhatIf){return $DbgOut} return } |