@page "/summary" @page "/summary/{YearMonth}" @attribute [Authorize] @rendermode InteractiveServer @inject IWorkDayService WorkDayService Monthly Summary

Monthly Summary

@currentMonth.ToString("MMMM yyyy")

@if (loading) {

Loading...

} else if (summary is not null) {
Working Days
@summary.TotalWorkingDays
Counted Work Units
@summary.CountedWorkUnits
Total Worked Hours
@FormatHours(summary.TotalWorkedHours)
Preview Hours
@FormatHours(summary.TotalPreviewWorkedHours)
Preview Units
@summary.PreviewWorkUnits
Hours Off
@FormatHours(summary.TotalHoursOff)
Gross Income
€@summary.TotalGrossIncome.ToString("N2")
Net Income
€@summary.TotalNetIncome.ToString("N2")
Office Days
@summary.OfficeDays
Home Days
@summary.HomeDays
Holidays
@summary.HolidayDays
Closure Days
@summary.ClosureDays
Days Off
@summary.DaysOff
Sick Days
@summary.SickDays
} @code { [Parameter] public string? YearMonth { get; set; } private DateOnly currentMonth; private bool loading = true; private bool includePreview; private MonthlySummaryModel? summary; protected override async Task OnInitializedAsync() { if (!string.IsNullOrEmpty(YearMonth) && DateTime.TryParseExact(YearMonth, "yyyy-MM", null, System.Globalization.DateTimeStyles.None, out var parsed)) { currentMonth = new DateOnly(parsed.Year, parsed.Month, 1); } else { currentMonth = new DateOnly(DateTime.Today.Year, DateTime.Today.Month, 1); } await LoadSummary(); } private async Task OnIncludePreviewChanged(ChangeEventArgs e) { includePreview = e.Value is bool value && value; await LoadSummary(); } private async Task LoadSummary() { loading = true; summary = await WorkDayService.GetMonthlySummaryAsync(currentMonth.Year, currentMonth.Month, includePreview); loading = false; } private async Task PreviousMonth() { currentMonth = currentMonth.AddMonths(-1); await LoadSummary(); } private async Task NextMonth() { currentMonth = currentMonth.AddMonths(1); await LoadSummary(); } private static string FormatHours(decimal value) { var totalMinutes = (int)Math.Round(value * 60m, MidpointRounding.AwayFromZero); var hours = totalMinutes / 60; var minutes = totalMinutes % 60; return $"{hours:00}:{minutes:00}"; } }