Stundenplan: Wochenraster, Wochennavigation, Ferien/Feiertage (Kapitel 4.3)

Neuer Stundenplan mit "Heute"-Standardansicht (Tagesliste unten angedockt,
gruppenübergreifendes Wochenraster mit Fach/Klasse/Raum/Thema, Vor-/Zurück-
Navigation zwischen Kalenderwochen) und separatem Bearbeiten-Raster für die
wöchentliche Zuordnung. Badges für Ferien-/Klausur-Nähe und ausgegraute
Ferientage direkt im Plan statt einer separaten Liste. Ferien-/Feiertage-
Pflege (Bundesland, Schulferien) sitzt jetzt in den Einstellungen statt im
Stundenplan selbst.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 02:29:18 +02:00
co-authored by Claude Sonnet 5
parent ee1a47641e
commit 99b2de6519
26 changed files with 2154 additions and 18 deletions
+59
View File
@@ -529,4 +529,63 @@ public sealed class RepositoryTests
Assert.Empty(repo.GetAll());
}
// ── TimetableSlotRepository ───────────────────────────────────────────────
[Fact]
public void TimetableSlotRepository_GetByGroup_FindetNurSlotsDerGruppe()
{
using var db = NewInMemoryContext();
var repo = new TimetableSlotRepository(db);
var groupA = Guid.NewGuid();
var groupB = Guid.NewGuid();
repo.Save(new TimetableSlot { GroupId = groupA, Weekday = DayOfWeek.Monday, PeriodNumber = 1 });
repo.Save(new TimetableSlot { GroupId = groupB, Weekday = DayOfWeek.Monday, PeriodNumber = 2 });
var result = repo.GetByGroup(groupA);
Assert.Single(result);
Assert.Equal(groupA, result[0].GroupId);
}
[Fact]
public void TimetableSlotRepository_Save_LehntDoppelbelegungDerselbenStundeAb()
{
using var db = NewInMemoryContext();
var repo = new TimetableSlotRepository(db);
repo.Save(new TimetableSlot { GroupId = Guid.NewGuid(), Weekday = DayOfWeek.Tuesday, PeriodNumber = 3 });
Assert.Throws<InvalidOperationException>(() =>
repo.Save(new TimetableSlot { GroupId = Guid.NewGuid(), Weekday = DayOfWeek.Tuesday, PeriodNumber = 3 }));
}
[Fact]
public void TimetableSlotRepository_Save_AktualisierenDesselbenSlotsIstErlaubt()
{
using var db = NewInMemoryContext();
var repo = new TimetableSlotRepository(db);
var slot = new TimetableSlot { GroupId = Guid.NewGuid(), Weekday = DayOfWeek.Tuesday, PeriodNumber = 3 };
repo.Save(slot);
slot.Room = "R204";
repo.Save(slot);
Assert.Equal("R204", repo.GetAll().Single().Room);
}
// ── SchoolHolidayRepository ───────────────────────────────────────────────
[Fact]
public void SchoolHolidayRepository_GetAll_SortiertNachStartdatum()
{
using var db = NewInMemoryContext();
var repo = new SchoolHolidayRepository(db);
repo.Save(new SchoolHoliday { Name = "Sommerferien", StartDate = new DateOnly(2026, 7, 1), EndDate = new DateOnly(2026, 8, 10) });
repo.Save(new SchoolHoliday { Name = "Osterferien", StartDate = new DateOnly(2026, 3, 30), EndDate = new DateOnly(2026, 4, 10) });
var result = repo.GetAll();
Assert.Equal("Osterferien", result[0].Name);
Assert.Equal("Sommerferien", result[1].Name);
}
}