Notenschlüssel-Editor (1.3) und Einstellungen in Tabs strukturiert
- Notenschlüssel-Editor im ExamDialog: Stufen (Note/Prozentgrenze) bearbeitbar, Vorbelegung passend zum GradingSystem der Gruppe, Live-Anzeige der absoluten Punktegrenze je Stufe, Validierung (lückenlos, keine Dopplungen) über GradingService.ValidateGradingKey. - Neues Modell GradingKeyTemplate + Repository: Notenschlüssel als Vorlage speichern/anwenden, direkt aus dem ExamDialog heraus. - Einstellungen: Fächer / Kompetenzen / Notenschlüssel-Vorlagen sind jetzt eigene Tabs statt einer gemeinsam wachsenden Liste. Vorlagen zeigen nur noch eine kompakte Zeile; die Stufen-Bearbeitung läuft über ein Popup-Fenster (GradingKeyTemplateDialog). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -41,6 +41,14 @@ public interface IExamResultRepository
|
||||
void Save(ExamResult result);
|
||||
void SaveMany(List<ExamResult> results);
|
||||
}
|
||||
public interface IGradingKeyTemplateRepository
|
||||
{
|
||||
List<GradingKeyTemplate> GetAll();
|
||||
List<GradingKeyTemplate> GetByGradingSystem(GradingSystem system);
|
||||
GradingKeyTemplate? GetById(Guid id);
|
||||
void Save(GradingKeyTemplate template);
|
||||
void Delete(Guid id);
|
||||
}
|
||||
public interface IGradeRepository
|
||||
{
|
||||
List<Grade> GetByStudentAndGroup(Guid studentId, Guid groupId);
|
||||
|
||||
@@ -29,6 +29,14 @@ public class GradingKeyEntry
|
||||
public string Grade { get; set; } = "";
|
||||
public double MinPercent { get; set; }
|
||||
}
|
||||
public class GradingKeyTemplate
|
||||
{
|
||||
public Guid Id { get; set; } = Guid.NewGuid();
|
||||
public string Name { get; set; } = "";
|
||||
public GradingSystem GradingSystem { get; set; }
|
||||
public List<GradingKeyEntry> Entries { get; set; } = [];
|
||||
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
||||
}
|
||||
public class ExamResult
|
||||
{
|
||||
public Guid Id { get; set; } = Guid.NewGuid();
|
||||
|
||||
@@ -40,6 +40,21 @@ public class GradingService
|
||||
new() { Grade = "1", MinPercent = 20.0 },
|
||||
new() { Grade = "0", MinPercent = 0.0 },
|
||||
];
|
||||
public string? ValidateGradingKey(List<GradingKeyEntry> entries)
|
||||
{
|
||||
if (entries.Count < 2) return "Der Notenschlüssel braucht mindestens zwei Stufen.";
|
||||
if (entries.Any(e => string.IsNullOrWhiteSpace(e.Grade)))
|
||||
return "Jede Stufe braucht eine Bezeichnung.";
|
||||
if (entries.Any(e => e.MinPercent < 0 || e.MinPercent > 100))
|
||||
return "Prozentgrenzen müssen zwischen 0 und 100 liegen.";
|
||||
var sorted = entries.OrderByDescending(e => e.MinPercent).ToList();
|
||||
if (sorted.Select(e => e.MinPercent).Distinct().Count() != sorted.Count)
|
||||
return "Prozentgrenzen dürfen sich nicht doppeln.";
|
||||
if (sorted.Last().MinPercent != 0)
|
||||
return "Die unterste Stufe muss bei 0 % liegen (lückenlose Abdeckung).";
|
||||
return null;
|
||||
}
|
||||
|
||||
public double WeightedAverage(List<(string Grade, double Weight)> grades)
|
||||
{
|
||||
var numeric = grades
|
||||
|
||||
Reference in New Issue
Block a user