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;
}