Unit/Lesson/ExamTask/ParticipationSession referenzierten Kompetenzen bisher per Freitext-Code, case-insensitiv gegen den Katalog gematcht - fragil bei Umbenennungen und seit der Bildungsplan-Versionierung nicht mehr eindeutig (zwei Versionen können denselben Code vergeben). Neuer Werttyp CompetencyReference (ItemId + Code/Description-Momentaufnahme) löst das: solange die Id noch im Katalog auflösbar ist, zählt die live Fassung (Rename wirkt sofort), sonst bleibt die gespeicherte historische Fassung sichtbar statt spurlos zu verschwinden. Migration (Schema-Version 6) löst bestehende Codes gegen den Katalog auf; die zuvor dreifach duplizierte Kompetenz-Tag-UI ist jetzt in CompetencyTagGroupBuilder konsolidiert. add_lesson_competency/remove_lesson_competency nehmen jetzt itemId statt code und validieren gegen den Katalog (vorher ungeprüft). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
57 lines
2.8 KiB
C#
57 lines
2.8 KiB
C#
namespace LehrerApp.Core.Models;
|
|
|
|
public class CompetencyDomain
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public Guid SubjectId { get; set; }
|
|
public int GradeLevel { get; set; }
|
|
/// <summary>Bildungsplan-Version dieses Bereichs (<see cref="CompetencyCatalogVersion"/>) - ein
|
|
/// Fach kann mehrere parallel gültige Versionen haben (altes/neues Bildungsplan, während dieser
|
|
/// klassenstufenweise hochwächst). Wird von der Migration für bestehende Datensätze auf die
|
|
/// jeweilige Standardversion des Fachs gesetzt.</summary>
|
|
public Guid VersionId { get; set; }
|
|
public string Name { get; set; } = "";
|
|
public string Code { get; set; } = "";
|
|
public int SortOrder { get; set; }
|
|
public List<CompetencyItem> Items { get; set; } = [];
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
}
|
|
|
|
/// <summary>Eine Bildungsplan-Version eines Fachs (z.B. "Bildungsplan 2016" vs. "Bildungsplan 2026").
|
|
/// Ermöglicht es, während ein neuer Bildungsplan klassenstufenweise hochwächst, alten und neuen
|
|
/// Kompetenzkatalog parallel zu pflegen - <see cref="LearningGroup.CompetencyCatalogVersionId"/>
|
|
/// wählt je Kurs/Klasse, welche Version gilt. Je Fach ist genau eine Version <see cref="IsDefault"/>
|
|
/// (Kurse ohne explizite Wahl nutzen sie, siehe Doc-Kommentar auf <see cref="LearningGroup"/>).</summary>
|
|
public class CompetencyCatalogVersion
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public Guid SubjectId { get; set; }
|
|
public string Name { get; set; } = "";
|
|
public bool IsDefault { get; set; }
|
|
public int SortOrder { get; set; }
|
|
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
}
|
|
|
|
public class CompetencyItem
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public string Code { get; set; } = "";
|
|
public string Description { get; set; } = "";
|
|
public int SortOrder { get; set; }
|
|
}
|
|
|
|
/// <summary>Referenz auf eine Kompetenz aus dem Katalog, momentaufnahmeartig gespeichert (analog zu
|
|
/// Exam.GradingKey/Exam.Tasks, siehe Datenmodell.md "Bewusst gespeicherte Momentaufnahmen"):
|
|
/// Code/Description werden zum Zuordnungszeitpunkt kopiert. Solange ItemId noch im Katalog
|
|
/// auflösbar ist, zeigt die UI die live aufgelöste Fassung (ein Rename wirkt sich sofort überall
|
|
/// aus); wird das Item gelöscht, bleibt die hier gespeicherte historische Fassung lesbar statt
|
|
/// spurlos zu verschwinden. ItemId == Guid.Empty markiert eine nie aufgelöste Referenz (z.B. aus
|
|
/// einem plattformübergreifenden Import) - Code/Description sind dann die einzige Information.</summary>
|
|
public class CompetencyReference
|
|
{
|
|
public Guid ItemId { get; set; }
|
|
public string Code { get; set; } = "";
|
|
public string Description { get; set; } = "";
|
|
}
|