Neben Wiederholung und Nachschreibarbeit gibt es im Arbeitsdialog die Art Förderarbeit (Exam.IsSupportWork). Sie darf am Tag der ersten Arbeit liegen, übernimmt dessen Datum als Vorschlag und ersetzt wie eine Nachschreibarbeit nur fehlende Noten. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
52 lines
2.9 KiB
C#
52 lines
2.9 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.IsSupportWork ? "Die Förderarbeit ersetzt die erste Arbeit. Liegen beide Noten vor, zählt die erste Arbeit."
|
|
: 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.IsSupportWork ? "Förderarbeit" : 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;
|
|
}
|