Neuer Tab in der Gruppendetailansicht (LearningGroup.IsClassTeacher-Flag), zeigt Klassenbucheinträge anderer Lehrkräfte sowie Fehlzeiten der ganzen Klasse über alle Fächer, pro Schüler*in und Tag zusammengefasst. Beides rein lesend, kein Übernehmen in lokale Daten. Fehlzeiten-Bericht (AbsencePerStudent) adressiert die Klasse über "KL"+getKlassen-ID, automatisch aufgelöst - noch nicht mit echtem WebUntis-Zugang gegengeprüft (siehe TODO.md). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
66 lines
2.6 KiB
C#
66 lines
2.6 KiB
C#
using LehrerApp.Desktop.Services;
|
|
using LehrerApp.Desktop.ViewModels.Groups;
|
|
using Xunit;
|
|
|
|
namespace LehrerApp.Desktop.Tests;
|
|
|
|
public sealed class ClassTeacherViewModelsTests
|
|
{
|
|
[Fact]
|
|
public void GroupByStudentAndDay_FasstFehlstundenProSchuelerUndTagZusammen()
|
|
{
|
|
var entries = new[]
|
|
{
|
|
new UntisClassAbsenceEntryDto("Muster Max", 1, "6a", 20260824, 1, 45, "HED", "Che", "Absent",
|
|
"Krank", 1, "24.08.26", true, null, 3, "nicht entsch.", false),
|
|
new UntisClassAbsenceEntryDto("Muster Max", 1, "6a", 20260824, 1, 45, "PAN", "Kunst", null,
|
|
"Krank", 2, "24.08.26", true, null, 5, "nicht entsch.", true),
|
|
new UntisClassAbsenceEntryDto("Andere Schuelerin", 2, "6a", 20260824, 1, 20, "BEN", "Deu",
|
|
"Verspätung", null, 3, "24.08.26", false, "Zug verpasst", 1, "entsch.", false),
|
|
};
|
|
|
|
var rows = ClassAbsenceDaySummaryRow.GroupByStudentAndDay(entries);
|
|
|
|
Assert.Equal(2, rows.Count);
|
|
|
|
var max = rows[1];
|
|
Assert.Equal("Muster Max", max.StudentName);
|
|
Assert.Equal(2, max.TotalAbsentPeriods);
|
|
Assert.Equal(90, max.TotalAbsentMinutes);
|
|
Assert.Equal(["Che", "Kunst"], max.Subjects);
|
|
Assert.Equal([3, 5], max.PeriodNumbers.Order());
|
|
Assert.Equal(["nicht entsch."], max.Statuses);
|
|
Assert.Equal(["Absent"], max.AbsenceReasons);
|
|
Assert.Equal("Krank", max.Note);
|
|
Assert.Null(max.ExcuseNote);
|
|
Assert.True(max.CountsAsFullDay);
|
|
|
|
var andere = rows[0];
|
|
Assert.Equal("Andere Schuelerin", andere.StudentName);
|
|
Assert.Equal(1, andere.TotalAbsentPeriods);
|
|
Assert.Equal(20, andere.TotalAbsentMinutes);
|
|
Assert.Equal(["Deu"], andere.Subjects);
|
|
Assert.Null(andere.Note);
|
|
Assert.Equal("Zug verpasst", andere.ExcuseNote);
|
|
Assert.False(andere.CountsAsFullDay);
|
|
}
|
|
|
|
[Fact]
|
|
public void GroupByStudentAndDay_TrenntGleichenNamenAnUnterschiedlichenTagen()
|
|
{
|
|
var entries = new[]
|
|
{
|
|
new UntisClassAbsenceEntryDto("Muster Max", 1, "6a", 20260824, 1, 45, "HED", "Che", null,
|
|
null, 1, "24.08.26", true, null, 3, "nicht entsch.", false),
|
|
new UntisClassAbsenceEntryDto("Muster Max", 1, "6a", 20260825, 1, 45, "HED", "Che", null,
|
|
null, 2, "25.08.26", true, null, 3, "nicht entsch.", false),
|
|
};
|
|
|
|
var rows = ClassAbsenceDaySummaryRow.GroupByStudentAndDay(entries);
|
|
|
|
Assert.Equal(2, rows.Count);
|
|
Assert.Equal(new DateOnly(2026, 8, 25), rows[0].Date);
|
|
Assert.Equal(new DateOnly(2026, 8, 24), rows[1].Date);
|
|
}
|
|
}
|