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>
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user