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 } /// /// Prozentuale Gewichtung von Klausuren/Mitarbeit/sonstigen Leistungen für die Zeugnisnote. /// Entweder gruppenspezifisch ( gesetzt) oder als Voreinstellung je /// Gruppentyp ( gesetzt, null). /// 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 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 . public TimeOnly? StartTime { get; set; } public List 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; } /// /// Eine Zeile im tabellarischen Stundenverlaufsplan (Phase/Dauer/Tätigkeit/Material/Kurzsymbol). /// ist die primäre Eingabe (man plant in Zeitblöcken); die Uhrzeit /// je Phase wird im Editor daraus abgeleitet, wenn gesetzt ist. /// 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 () als auch aus bereits in anderen Stunden /// verwendeten Werten. /// 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; } = ""; /// /// null = Hauptweg. Sonst Verweis auf einen benannten 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. /// public Guid? AlternativePathId { get; set; } } public enum UnitStatus { Planned, Active, Completed } public enum LessonStatus { Planned, Conducted } /// /// Katalogeintrag für einen wiederverwendbaren "alternativen Ablauf" (z.B. "Kurzversion" bei /// Zeitmangel), dem einzelne -Zeilen über /// zugeordnet werden. Wird direkt beim Zuweisen im /// Verlaufsplan-Editor angelegt (kein separates Verwaltungs-UI in den Einstellungen bisher). /// 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; } /// /// Ein fester Termin im wöchentlichen Stundenplan (4.3): eine Lerngruppe trifft sich an einem /// Wochentag zu einer bestimmten Stunde. Wiederkehrendes Muster, kein konkretes Datum — für /// tatsächlich gehaltene Einzelstunden siehe . Pro Wochentag/Stunde ist /// höchstens eine Gruppe eingetragen (ein Lehrer kann nicht gleichzeitig an zwei Orten sein). /// public class TimetableSlot { public Guid Id { get; set; } = Guid.NewGuid(); public Guid GroupId { get; set; } public DayOfWeek Weekday { get; set; } public int PeriodNumber { get; set; } public string? Room { get; set; } } /// /// Unterrichtsfreier Zeitraum (4.3.5): Schulferien werden manuell gepflegt (nicht algorithmisch /// herleitbar, jährlich neu von den Bundesländern festgelegt). Gesetzliche Feiertage werden /// dagegen berechnet (PublicHolidayService) und nicht in der Datenbank gespeichert. /// public class SchoolHoliday { public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = ""; public DateOnly StartDate { get; set; } public DateOnly EndDate { get; set; } } public enum GermanState { BW, BY, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH } /// /// Zeugnisnote eines Schülers in einer Lerngruppe für einen Zeitraum (Halbjahr/Gesamtjahr). /// ist das zuletzt berechnete Ergebnis; /// überschreibt es bei pädagogischem Ermessen (erfordert ). /// Nach dem Festschreiben () wird der Datensatz nicht mehr neu berechnet. /// 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; }