Files
adminandClaude Sonnet 5 d6dee72acc Unterrichtsplanung: Serienerzeugung, Stundenraster, Aufsichten & Vertretung (Kapitel 4.2/4.3 Nachtrag)
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>
2026-08-15 21:59:07 +02:00

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();
}
}