Schreibgeschützter LessonViewerDialog (größere Schrift, ohne Bearbeitungs-/Verlängern-/ Verschieben-Funktion) für den Einsatz während des Unterrichtens, erreichbar über "Anzeigen" im Stunden-Toolbar. Alternative Unterrichtsabläufe (z.B. Kurzversion bei Zeitmangel) laufen jetzt über einen echten Katalog (neues Modell AlternativeLessonPath: Name + Beschreibung) statt Freitext direkt an der Phase: im Verlaufsplan-Editor eine kompakte, farbig unterstützte Checkbox statt einer durchgehend sichtbaren Eingabespalte, Zuordnung/Neuanlage über einen eigenen Dialog. Der Viewer gruppiert Phasen entsprechend und zeigt die hinterlegte Beschreibung. Schema-Migration v3→v4 führt bestehende Freitextwerte verlustfrei in Katalogeinträge über. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
131 lines
6.0 KiB
C#
131 lines
6.0 KiB
C#
namespace LehrerApp.Core.Models;
|
|
|
|
public class Grade
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public Guid StudentId { get; set; }
|
|
public Guid GroupId { get; set; }
|
|
public GradeCategory Category { get; set; }
|
|
public string Value { get; set; } = "";
|
|
public DateOnly Date { get; set; }
|
|
public double Weight { get; set; } = 1.0;
|
|
public string? Note { get; set; }
|
|
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
|
}
|
|
public enum GradeCategory { Oral, Homework, Participation, Project, Other }
|
|
|
|
/// <summary>
|
|
/// Prozentuale Gewichtung von Klausuren/Mitarbeit/sonstigen Leistungen für die Zeugnisnote.
|
|
/// Entweder gruppenspezifisch (<see cref="GroupId"/> gesetzt) oder als Voreinstellung je
|
|
/// Gruppentyp (<see cref="GroupType"/> gesetzt, <see cref="GroupId"/> null).
|
|
/// </summary>
|
|
public class GradingScheme
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public Guid? GroupId { get; set; }
|
|
public GroupType? GroupType { get; set; }
|
|
public double ExamsPercent { get; set; }
|
|
public double ParticipationPercent { get; set; }
|
|
public double OtherPercent { get; set; }
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
}
|
|
|
|
public class Unit
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public Guid GroupId { get; set; }
|
|
public string Title { get; set; } = "";
|
|
public DateOnly? StartDate { get; set; }
|
|
public DateOnly? EndDate { get; set; }
|
|
public List<string> Competencies { get; set; } = [];
|
|
public UnitStatus Status { get; set; } = UnitStatus.Planned;
|
|
public string? Notes { get; set; }
|
|
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
}
|
|
public class Lesson
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public Guid UnitId { get; set; }
|
|
public Guid GroupId { get; set; }
|
|
public DateOnly Date { get; set; }
|
|
public int? LessonNumber { get; set; }
|
|
public string Topic { get; set; } = "";
|
|
/// Optionaler Stundenbeginn — solange kein Stundenplan (Kapitel 4.3) existiert, manuell
|
|
/// gepflegt. Dient nur der abgeleiteten Uhrzeit-Anzeige je Phase in <see cref="Phases"/>.
|
|
public TimeOnly? StartTime { get; set; }
|
|
public List<LessonPhaseStep> Phases { get; set; } = [];
|
|
public string? Homework { get; set; }
|
|
public string? Reflection { get; set; }
|
|
public LessonStatus Status { get; set; } = LessonStatus.Planned;
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Eine Zeile im tabellarischen Stundenverlaufsplan (Phase/Dauer/Tätigkeit/Material/Kurzsymbol).
|
|
/// <see cref="DurationMinutes"/> ist die primäre Eingabe (man plant in Zeitblöcken); die Uhrzeit
|
|
/// je Phase wird im Editor daraus abgeleitet, wenn <see cref="Lesson.StartTime"/> gesetzt ist.
|
|
/// <see cref="Shorthand"/> ist bewusst ein einzelnes Freitextfeld statt einer erzwungenen
|
|
/// Von/Nach-Struktur: manchmal ist es ein Materialfluss-Pfeil ("AB001->S"), manchmal nur eine
|
|
/// Sozialform ohne Pfeil ("Plenum", "LDE"). Vorschläge kommen sowohl aus dem in den Einstellungen
|
|
/// gepflegten Kürzel-Katalog (<see cref="ShorthandCode"/>) als auch aus bereits in anderen Stunden
|
|
/// verwendeten Werten.
|
|
/// </summary>
|
|
public class LessonPhaseStep
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public string Name { get; set; } = "";
|
|
public int DurationMinutes { get; set; }
|
|
public string Activity { get; set; } = "";
|
|
public string Material { get; set; } = "";
|
|
public string Shorthand { get; set; } = "";
|
|
/// <summary>
|
|
/// null = Hauptweg. Sonst Verweis auf einen benannten <see cref="AlternativeLessonPath"/> aus
|
|
/// dem Katalog, über den Phasen alternativer Unterrichtsverläufe zusammengehören —
|
|
/// Verlaufsplan-Editor und -Ansicht gruppieren danach. Bewusst kein Fork-Punkt-Bezug zum
|
|
/// Hauptweg: eine Alternative beginnt in der Anzeige unabhängig ab dem Stundenbeginn, nicht ab
|
|
/// einer gemeinsamen Verzweigungsstelle — für den schnellen Überblick ausreichend, siehe TODO.md.
|
|
/// </summary>
|
|
public Guid? AlternativePathId { get; set; }
|
|
}
|
|
|
|
public enum UnitStatus { Planned, Active, Completed }
|
|
public enum LessonStatus { Planned, Conducted }
|
|
|
|
/// <summary>
|
|
/// Katalogeintrag für einen wiederverwendbaren "alternativen Ablauf" (z.B. "Kurzversion" bei
|
|
/// Zeitmangel), dem einzelne <see cref="LessonPhaseStep"/>-Zeilen über
|
|
/// <see cref="LessonPhaseStep.AlternativePathId"/> zugeordnet werden. Wird direkt beim Zuweisen im
|
|
/// Verlaufsplan-Editor angelegt (kein separates Verwaltungs-UI in den Einstellungen bisher).
|
|
/// </summary>
|
|
public class AlternativeLessonPath
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public string Name { get; set; } = "";
|
|
/// Freitext, wann/wofür dieser Ablauf gedacht ist, z.B. "Bei Zeitmangel, wenn Aufgabe 3 nicht
|
|
/// mehr passt." Absichtlich kein strukturiertes Bedingungsfeld (z.B. "wenn an Stelle X weniger
|
|
/// als Y Minuten übrig sind") — das setzt eine Live-Zeiterfassung während des Unterrichtens
|
|
/// voraus, die es noch nicht gibt (siehe Live-Unterrichtsmodus-Ideensammlung in TODO.md).
|
|
public string? Description { get; set; }
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Zeugnisnote eines Schülers in einer Lerngruppe für einen Zeitraum (Halbjahr/Gesamtjahr).
|
|
/// <see cref="CalculatedValue"/> ist das zuletzt berechnete Ergebnis; <see cref="OverrideValue"/>
|
|
/// überschreibt es bei pädagogischem Ermessen (erfordert <see cref="OverrideReason"/>).
|
|
/// Nach dem Festschreiben (<see cref="IsLocked"/>) wird der Datensatz nicht mehr neu berechnet.
|
|
/// </summary>
|
|
public class ReportGrade
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public Guid StudentId { get; set; }
|
|
public Guid GroupId { get; set; }
|
|
public string Period { get; set; } = "";
|
|
public string CalculatedValue { get; set; } = "";
|
|
public string? OverrideValue { get; set; }
|
|
public string? OverrideReason { get; set; }
|
|
public bool IsLocked { get; set; }
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
}
|