Doppelstunden im Stundenplan korrekt anzeigen

This commit is contained in:
2026-08-30 02:29:50 +02:00
parent da4b88c93d
commit b7c7d46ee4
2 changed files with 45 additions and 11 deletions
@@ -570,9 +570,10 @@ public partial class TimetableViewModel : ObservableObject
p.Material?.Contains("Experiment", StringComparison.OrdinalIgnoreCase) == true)) == true;
/// Eine Doppelstunde wird als eine Lesson an der ersten Periode gespeichert. Für die zweite
/// Rasterzelle liefern wir dieselbe Lesson nur dann, wenn der Stundenplan dort unmittelbar
/// fortgesetzt wird und der geplante Verlauf länger als die erste Periode ist. Eine exakt an
/// der Zielperiode verankerte Lesson hat immer Vorrang.
/// Rasterzelle liefern wir dieselbe Lesson, wenn der Stundenplan dort unmittelbar mit derselben
/// Lerngruppe fortgesetzt wird. Das darf nicht von bereits eingetragenen Phasendauern abhängen:
/// Gerade ein früher Entwurf hat oft erst Datum und Thema, gehört aber trotzdem zum kompletten
/// Doppelstundenblock. Eine exakt an der Zielperiode verankerte Lesson hat immer Vorrang.
private Lesson? FindLessonForSlot(Guid groupId, DateOnly date, int period)
{
var lessons = _lessons.GetByGroupAndDate(groupId, date);
@@ -584,14 +585,22 @@ public partial class TimetableViewModel : ObservableObject
var withoutPeriod = lessons.Where(l => l.LessonNumber is null).ToList();
if (withoutPeriod.Count == 1) return withoutPeriod[0];
var previous = lessons.Where(l => l.LessonNumber is int p && p == period - 1)
.OrderByDescending(l => l.UpdatedAt).FirstOrDefault();
if (previous?.LessonNumber is not int anchor) return null;
var isConsecutiveSlot = _slots.GetByGroup(groupId)
.Any(s => s.Weekday == date.DayOfWeek && s.PeriodNumber == period);
var firstPeriodMinutes = _periodSchedule.GetDurationMinutes(anchor);
return isConsecutiveSlot && firstPeriodMinutes > 0 &&
previous.Phases.Sum(p => p.DurationMinutes) > firstPeriodMinutes ? previous : null;
var periodsInBlock = _slots.GetByGroup(groupId)
.Where(s => s.Weekday == date.DayOfWeek)
.Select(s => s.PeriodNumber)
.ToHashSet();
// Vom angefragten Slot innerhalb desselben lückenlosen Blocks rückwärts zur verankerten
// Lesson laufen. Damit funktionieren neben Doppelstunden auch seltene Dreifachblöcke.
for (var candidatePeriod = period - 1;
periodsInBlock.Contains(candidatePeriod) && periodsInBlock.Contains(candidatePeriod + 1);
candidatePeriod--)
{
var blockLesson = lessons.Where(l => l.LessonNumber == candidatePeriod)
.OrderByDescending(l => l.UpdatedAt).FirstOrDefault();
if (blockLesson is not null) return blockLesson;
}
return null;
}
/// <summary>4.5.4: Hat die letzte vor <paramref name="date"/> liegende Lesson dieser Gruppe eine