init 1.0.0

This commit is contained in:
2026-06-19 00:42:00 +02:00
commit 5ca960746b
67 changed files with 3261 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
using LehrerApp.Core.Models;
namespace LehrerApp.Core.Services;
public class GradingService
{
public string CalculateGrade(double achieved, double maximum, List<GradingKeyEntry> key)
{
if (maximum <= 0) return "-";
var percent = achieved / maximum * 100.0;
return key.OrderByDescending(k => k.MinPercent)
.FirstOrDefault(k => percent >= k.MinPercent)
?.Grade ?? key.OrderBy(k => k.MinPercent).First().Grade;
}
public static List<GradingKeyEntry> DefaultKey1To6() =>
[
new() { Grade = "1", MinPercent = 87.5 },
new() { Grade = "2", MinPercent = 75.0 },
new() { Grade = "3", MinPercent = 62.5 },
new() { Grade = "4", MinPercent = 50.0 },
new() { Grade = "5", MinPercent = 25.0 },
new() { Grade = "6", MinPercent = 0.0 },
];
public static List<GradingKeyEntry> DefaultKey0To15() =>
[
new() { Grade = "15", MinPercent = 95.0 },
new() { Grade = "14", MinPercent = 90.0 },
new() { Grade = "13", MinPercent = 85.0 },
new() { Grade = "12", MinPercent = 80.0 },
new() { Grade = "11", MinPercent = 75.0 },
new() { Grade = "10", MinPercent = 70.0 },
new() { Grade = "9", MinPercent = 65.0 },
new() { Grade = "8", MinPercent = 60.0 },
new() { Grade = "7", MinPercent = 55.0 },
new() { Grade = "6", MinPercent = 50.0 },
new() { Grade = "5", MinPercent = 45.0 },
new() { Grade = "4", MinPercent = 40.0 },
new() { Grade = "3", MinPercent = 33.0 },
new() { Grade = "2", MinPercent = 27.0 },
new() { Grade = "1", MinPercent = 20.0 },
new() { Grade = "0", MinPercent = 0.0 },
];
public double WeightedAverage(List<(string Grade, double Weight)> grades)
{
var numeric = grades
.Select(g => (Value: int.TryParse(g.Grade, out var n) ? (int?)n : null, g.Weight))
.Where(g => g.Value.HasValue).ToList();
if (numeric.Count == 0) return 0;
var total = numeric.Sum(g => g.Weight);
return total == 0 ? 0 : numeric.Sum(g => g.Value!.Value * g.Weight) / total;
}
}
@@ -0,0 +1,22 @@
namespace LehrerApp.Core.Services;
public class SchoolYearService
{
public string CurrentSchoolYear()
{
var now = DateTime.Today;
return FormatSchoolYear(now.Month >= 8 ? now.Year : now.Year - 1);
}
public string FormatSchoolYear(int startYear) =>
$"{startYear}/{(startYear + 1) % 100:D2}";
public DateOnly SchoolYearStart(string sy) =>
new(int.Parse(sy.Split('/')[0]), 8, 1);
public DateOnly SchoolYearEnd(string sy) =>
new(int.Parse(sy.Split('/')[0]) + 1, 7, 31);
public List<string> RecentSchoolYears(int count = 5)
{
var now = DateTime.Today;
var cur = now.Month >= 8 ? now.Year : now.Year - 1;
return Enumerable.Range(0, count).Select(i => FormatSchoolYear(cur - i)).ToList();
}
}