Files
LehrerApp/LehrerApp.Desktop/Services/GradeReportDrawingBuilder.cs
T
2026-10-22 11:24:43 +02:00

51 lines
2.7 KiB
C#

using LehrerApp.Core.Models;
using LehrerApp.Core.Services;
using LehrerApp.Templating;
namespace LehrerApp.Desktop.Services;
public static class GradeReportDrawingBuilder
{
public static DrawingValue Interim(InterimGrade grade, LoadedTemplate template) =>
Text(template, ReportTextDrawing.InterimGrades, "Vorläufiger Notenzwischenstand",
[
$"Stichtag: {grade.Date:dd.MM.yyyy} · {grade.Occasion}",
$"Mündlich: {Value(grade.OralValue)}",
$"Schriftlich: {Value(grade.WrittenValue)}",
$"Vorläufige Zeugnisnote: {Value(grade.OverallValue)}",
"Dieser Zwischenstand ist keine festgeschriebene Zeugnisnote.",
]);
public static DrawingValue Repeat(Exam exam, Exam? original, ExamResult? originalResult,
LoadedTemplate template)
{
if (exam.RepeatOfExamId is null) return new DrawingValue([], 0);
if (original is null || original.Id != exam.RepeatOfExamId || original.GroupId != exam.GroupId)
throw new InvalidDataException("Die verknüpfte erste Arbeit ist nicht verfügbar.");
var rule = exam.IsMakeUp ? "Die Nachschreibarbeit ersetzt die versäumte erste Arbeit. Liegen beide Noten vor, zählt die erste Arbeit."
: exam.RepeatGradeRule switch
{
RepeatGradeRule.Repeat => "Für die Bewertung zählt die Note der Wiederholungsarbeit.",
RepeatGradeRule.Original => "Für die Bewertung zählt die Note der ersten Arbeit.",
_ => "Für die Bewertung zählt die bessere Note aus beiden Arbeiten.",
};
var grade = originalResult?.Grade;
if (string.IsNullOrWhiteSpace(grade) && ExamCoverSheetService.IsCorrected(originalResult))
grade = new GradingService().CalculateGrade(originalResult!.TotalPoints,
ExamScoringService.Maximum(original.Tasks, originalResult.Variant), original.GradingKey);
var firstGrade = originalResult is { Absent: true } ? "abwesend" : Value(grade);
return Text(template, ReportTextDrawing.RepeatInfo,
exam.IsMakeUp ? "Nachschreibarbeit" : "Wiederholungsarbeit",
[$"Erste Arbeit: {original.Title} vom {original.Date:dd.MM.yyyy}",
$"Note der ersten Arbeit: {firstGrade}", rule]);
}
public static DrawingValue Text(LoadedTemplate template, string name, string title, IEnumerable<string> paragraphs)
{
if (DrawingBoxLocator.Find(template, name) is not { } box) return new DrawingValue([], 0);
return ReportTextDrawing.Build(title, paragraphs, box.Width, box.MillimeterScale, box.Height, box.IsFixed);
}
private static string Value(string? value) => string.IsNullOrWhiteSpace(value) ? "nicht erfasst" : value;
}