Stunden serienweise aus dem Stundenplan erzeugen (4.2.5); Stundenraster (Uhrzeiten je Stunde) in den Einstellungen mit Zeitbedarf-Rückmeldung im Verlaufsplan-Editor; wiederkehrende Pausenaufsicht; neuer "Vertretung eintragen"-Dialog für einmalige Vertretungsaufsicht, Vertretungsstunde, Sondereinsätze (Ausflüge, Berufsmessen) und schlichten Stundenausfall. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
63 lines
2.0 KiB
C#
63 lines
2.0 KiB
C#
using System.Text.Json;
|
|
|
|
namespace LehrerApp.Core.Services;
|
|
|
|
public class PeriodTimeEntry
|
|
{
|
|
public int PeriodNumber { get; set; }
|
|
public TimeOnly Start { get; set; }
|
|
public TimeOnly End { get; set; }
|
|
}
|
|
|
|
internal class PeriodScheduleConfig
|
|
{
|
|
public List<PeriodTimeEntry> Periods { get; set; } = [];
|
|
}
|
|
|
|
/// <summary>
|
|
/// Uhrzeiten der Einzelstunden (Stundenraster) — Grundlage für die Zeitbedarf-Rückmeldung im
|
|
/// Verlaufsplan-Editor (4.2.2 Nachtrag). Nicht jede Schule/Stunde muss konfiguriert sein: fehlt
|
|
/// eine Stunde, liefert <see cref="GetDurationMinutes"/> 0 statt eines Standardwerts — die
|
|
/// Zeitbedarf-Anzeige blendet sich dann einfach aus, statt eine erfundene Dauer vorzutäuschen.
|
|
/// </summary>
|
|
public class PeriodScheduleService
|
|
{
|
|
private readonly string _configPath;
|
|
private PeriodScheduleConfig _config;
|
|
|
|
public IReadOnlyList<PeriodTimeEntry> Periods => _config.Periods;
|
|
|
|
public PeriodScheduleService(string appDataPath)
|
|
{
|
|
_configPath = Path.Combine(appDataPath, "periodschedule.json");
|
|
_config = Load();
|
|
}
|
|
|
|
public void SetPeriods(List<PeriodTimeEntry> periods)
|
|
{
|
|
_config.Periods = periods;
|
|
File.WriteAllText(_configPath, JsonSerializer.Serialize(_config));
|
|
}
|
|
|
|
public (TimeOnly Start, TimeOnly End)? GetTimes(int periodNumber)
|
|
{
|
|
var entry = _config.Periods.FirstOrDefault(p => p.PeriodNumber == periodNumber);
|
|
return entry is null ? null : (entry.Start, entry.End);
|
|
}
|
|
|
|
public int GetDurationMinutes(int periodNumber) =>
|
|
GetTimes(periodNumber) is { } t ? (int)(t.End - t.Start).TotalMinutes : 0;
|
|
|
|
private PeriodScheduleConfig Load()
|
|
{
|
|
try
|
|
{
|
|
if (File.Exists(_configPath))
|
|
return JsonSerializer.Deserialize<PeriodScheduleConfig>(File.ReadAllText(_configPath))
|
|
?? new PeriodScheduleConfig();
|
|
}
|
|
catch { /* beschädigte Konfiguration -> Standardwert */ }
|
|
return new PeriodScheduleConfig();
|
|
}
|
|
}
|