Arbeitszeit: Auswertung nach Kategorie/Gruppe + Pflichtstunden-Abgleich (Kapitel 6.3)

Dritter Tab "Auswertung": Zeitraum wahlweise Monat oder Schuljahr, Balken je Kategorie
und Gruppe. Neuer WorkloadSettingsService (gleiches JSON-Muster wie PeriodScheduleService)
für die Pflichtstundenzahl pro Woche, bewusst direkt im Auswertungs-Tab editierbar statt
in den Einstellungen, da das Feld nur dort gebraucht wird. Export (6.3.3) bleibt offen,
da er an das noch fehlende Kapitel 11 (Export-Infrastruktur) hängt.
This commit is contained in:
2026-08-15 23:26:06 +02:00
parent d8b05702bc
commit 52bb9c2c2f
10 changed files with 405 additions and 13 deletions
@@ -49,7 +49,7 @@
</Grid>
<ItemsControl ItemsSource="{Binding CategorySummaries}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:CategoryWeekSummary">
<DataTemplate x:DataType="vm:CategoryTimeSummary">
<Grid ColumnDefinitions="120,*,60" Margin="0,3">
<TextBlock Grid.Column="0" Text="{Binding Category}" FontSize="12" VerticalAlignment="Center"/>
<ProgressBar Grid.Column="1" Value="{Binding BarFraction}" Maximum="1" Height="8"
@@ -0,0 +1,80 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:LehrerApp.Desktop.ViewModels.Workload"
x:Class="LehrerApp.Desktop.Views.Workload.WorkloadEvaluationView"
x:DataType="vm:WorkloadEvaluationViewModel">
<ScrollViewer>
<StackPanel Margin="20,16" Spacing="16">
<!-- Zeitraum -->
<Grid ColumnDefinitions="Auto,Auto,Auto" HorizontalAlignment="Left">
<ComboBox Grid.Column="0" ItemsSource="{Binding PeriodModeOptions}"
SelectedItem="{Binding PeriodMode}" Margin="0,0,8,0"/>
<ComboBox Grid.Column="1" ItemsSource="{Binding MonthOptions}" SelectedItem="{Binding SelectedMonth}"
Margin="0,0,8,0" IsVisible="{Binding IsMonthMode}"/>
<ComboBox Grid.Column="2" ItemsSource="{Binding YearOptions}" SelectedItem="{Binding SelectedYear}"/>
</Grid>
<!-- Pflichtstunden (6.3.2) -->
<Border Background="{DynamicResource SystemControlBackgroundAltHighBrush}" CornerRadius="8" Padding="16">
<StackPanel Spacing="10">
<TextBlock Text="Pflichtstunden pro Woche" FontWeight="SemiBold" FontSize="14"/>
<Grid ColumnDefinitions="140,Auto">
<TextBox Grid.Column="0" Text="{Binding RequiredWeeklyHoursText}" PlaceholderText="z.B. 25"/>
<Button Grid.Column="1" Content="Speichern" Margin="8,0,0,0"
Command="{Binding SaveRequiredWeeklyHoursCommand}"/>
</Grid>
<TextBlock Text="{Binding RequiredVsActualDisplay}" FontSize="13" FontWeight="SemiBold"
IsVisible="{Binding RequiredVsActualDisplay, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
</StackPanel>
</Border>
<!-- Gesamtsumme -->
<TextBlock Text="{Binding TotalMinutesDisplay}" FontSize="18" FontWeight="SemiBold"/>
<!-- Nach Kategorie (6.3.1) -->
<Border Background="{DynamicResource SystemControlBackgroundAltHighBrush}" CornerRadius="8" Padding="16">
<StackPanel Spacing="10">
<TextBlock Text="Nach Kategorie" FontWeight="SemiBold" FontSize="14"/>
<ItemsControl ItemsSource="{Binding CategorySummaries}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:CategoryTimeSummary">
<Grid ColumnDefinitions="120,*,60" Margin="0,3">
<TextBlock Grid.Column="0" Text="{Binding Category}" FontSize="12" VerticalAlignment="Center"/>
<ProgressBar Grid.Column="1" Value="{Binding BarFraction}" Maximum="1" Height="8"
VerticalAlignment="Center" Margin="8,0"/>
<TextBlock Grid.Column="2" Text="{Binding MinutesDisplay}" FontSize="12"
HorizontalAlignment="Right" VerticalAlignment="Center"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Text="Keine Zeiten in diesem Zeitraum erfasst." Opacity="0.6" FontSize="12"
IsVisible="{Binding !CategorySummaries.Count}"/>
</StackPanel>
</Border>
<!-- Nach Gruppe (6.3.1) -->
<Border Background="{DynamicResource SystemControlBackgroundAltHighBrush}" CornerRadius="8" Padding="16">
<StackPanel Spacing="10">
<TextBlock Text="Nach Gruppe" FontWeight="SemiBold" FontSize="14"/>
<ItemsControl ItemsSource="{Binding GroupSummaries}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:GroupTimeSummary">
<Grid ColumnDefinitions="120,*,60" Margin="0,3">
<TextBlock Grid.Column="0" Text="{Binding GroupName}" FontSize="12" VerticalAlignment="Center"/>
<ProgressBar Grid.Column="1" Value="{Binding BarFraction}" Maximum="1" Height="8"
VerticalAlignment="Center" Margin="8,0"/>
<TextBlock Grid.Column="2" Text="{Binding MinutesDisplay}" FontSize="12"
HorizontalAlignment="Right" VerticalAlignment="Center"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Text="Keine gruppenbezogenen Zeiten in diesem Zeitraum." Opacity="0.6" FontSize="12"
IsVisible="{Binding !GroupSummaries.Count}"/>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</UserControl>
@@ -0,0 +1,8 @@
using Avalonia.Controls;
namespace LehrerApp.Desktop.Views.Workload;
public partial class WorkloadEvaluationView : UserControl
{
public WorkloadEvaluationView() => InitializeComponent();
}
@@ -19,6 +19,9 @@
<ContentPage Header="Zeiterfassung">
<views:TimeTrackingView DataContext="{Binding TimeTracking}"/>
</ContentPage>
<ContentPage Header="Auswertung">
<views:WorkloadEvaluationView DataContext="{Binding Evaluation}"/>
</ContentPage>
</TabbedPage>
</Grid>
</UserControl>