feat: Untis-Hub für WebUntis-Sync-Gesundheitsstatus
CI / build-and-test (push) Canceled after 0s

Zeigt die Fälligkeit der vier bestehenden, manuell ausgelösten WebUntis-Abgleiche
(Fehlzeiten je Lerngruppe, offene Stunden, Klassenbuch-, Hausaufgabenabgleich) in
einem neuen Hub-Fenster, ohne selbst WebUntis anzufragen - nur gespeicherte
Zeitstempel werden ausgewertet. Konsolidiert die bisher verstreuten Einstiegspunkte
(Sidebar-Button, Dashboard-Buttons) in ein neues WebUntis-Menü plus einen
kompakten Gesundheits-Indikator auf dem Dashboard.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-10 23:41:12 +02:00
co-authored by Claude Sonnet 5
parent bd0d7e47ea
commit ba52109eaa
20 changed files with 660 additions and 44 deletions
@@ -0,0 +1,58 @@
using Avalonia.Controls;
using Avalonia.Interactivity;
using LehrerApp.Core.Interfaces;
using LehrerApp.Core.Models;
using LehrerApp.Core.Services;
using LehrerApp.Desktop.Services;
using LehrerApp.Desktop.ViewModels.UntisHub;
using Microsoft.Extensions.DependencyInjection;
namespace LehrerApp.Desktop.Views.UntisHub;
public partial class UntisHubDialog : Window
{
public UntisHubDialog()
{
InitializeComponent();
DataContext = new UntisHubViewModel(
App.Services.GetRequiredService<UntisHubService>(),
App.Services.GetRequiredService<IGroupRepository>(),
App.Services.GetRequiredService<WebUntisIntegrationService>());
}
private void OnRefreshClick(object? sender, RoutedEventArgs e)
{
if (DataContext is UntisHubViewModel vm) vm.Load();
}
private async void OnCheckClick(object? sender, RoutedEventArgs e)
{
if (DataContext is not UntisHubViewModel vm || sender is not Button { DataContext: UntisHubRowViewModel row })
return;
var hub = App.Services.GetRequiredService<UntisHubService>();
var today = DateOnly.FromDateTime(DateTime.Today);
switch (row.Kind)
{
case UntisHubJobKind.FehlzeitenKurz or UntisHubJobKind.FehlzeitenLang:
var group = row.GroupId is { } id ? vm.FindGroup(id) : null;
if (group is null) return;
var schoolYears = App.Services.GetRequiredService<SchoolYearService>();
var start = row.Kind == UntisHubJobKind.FehlzeitenKurz
? today.AddDays(-30)
: schoolYears.SchoolYearStart(schoolYears.CurrentSchoolYear());
await UntisHubActions.RunFehlzeitenAsync(this, group, row.Kind, start, today, hub);
break;
case UntisHubJobKind.OffenePeriods:
await UntisHubActions.RunOffenePeriodsAsync(this, hub);
break;
case UntisHubJobKind.Klassenbuchabgleich:
await UntisHubActions.RunKlassenbuchAsync(this, hub);
break;
case UntisHubJobKind.Hausaufgabenabgleich:
await UntisHubActions.RunHausaufgabenAsync(this, hub);
break;
}
vm.Load();
}
}