fix: update migration seeding condition to check for PrimaryColor instead of TenantColor

This commit is contained in:
MarcWieland
2026-06-26 23:50:03 +02:00
parent e2e57143b8
commit f47b4d86ba
9 changed files with 1090 additions and 2 deletions
@@ -13,8 +13,11 @@
@* --- Navigation Links --- *@
<div class="nav-content">
<MudNavMenu Class="custom-nav-menu">
<MudTooltip Text="Dashboard" Placement="Placement.Right">
<MudNavLink Href="" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Dashboard" Class="custom-nav-link">Dashboard</MudNavLink>
</MudTooltip>
<MudTooltip Text="Wochenübersicht" Placement="Placement.Right">
<MudNavLink Href="" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.CalendarMonth" Class="custom-nav-link">Wochenübersicht</MudNavLink>
<MudNavLink Href="week" Icon="@Icons.Material.Filled.CalendarMonth" Class="custom-nav-link">Wochenübersicht</MudNavLink>
</MudTooltip>
<MudTooltip Text="Monatsübersicht" Placement="Placement.Right">
<MudNavLink Href="month" Icon="@Icons.Material.Filled.CalendarViewMonth" Class="custom-nav-link">Monatsübersicht</MudNavLink>
@@ -0,0 +1,230 @@
@page "/"
@rendermode InteractiveWebAssembly
@attribute [Authorize]
@inject ITimetrackerService TrackerService
@inject AuthenticationStateProvider AuthStateProvider
@inject IJSRuntime JSRuntime
<PageTitle>Dashboard Timetracker</PageTitle>
@if (_loading)
{
<MudStack AlignItems="AlignItems.Center" Class="mt-16" Spacing="3">
<MudProgressCircular Color="Color.Primary" Indeterminate="true" Size="Size.Large" />
<MudText Color="Color.Secondary">Lade Dashboard…</MudText>
</MudStack>
}
else
{
<MudStack Spacing="4">
@* ── Header & Einstellungen ── *@
<MudStack Row="true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween">
<MudMenu Icon="@Icons.Material.Filled.Settings" AnchorOrigin="Origin.BottomRight" TransformOrigin="Origin.TopRight" Dense="true" Color="Color.Secondary">
<MudMenuItem OnClick="@(() => ToggleWidget("EarlyBird"))">
<MudCheckBox T="bool" Value="@_showEarlyBird" Label="Early Bird anzeigen" Color="Color.Primary" ReadOnly="true"/>
</MudMenuItem>
<MudMenuItem OnClick="@(() => ToggleWidget("NightOwl"))">
<MudCheckBox T="bool" Value="@_showNightOwl" Label="Night Owl anzeigen" Color="Color.Primary" ReadOnly="true"/>
</MudMenuItem>
<MudMenuItem OnClick="@(() => ToggleWidget("Pausenkonig"))">
<MudCheckBox T="bool" Value="@_showPausenkonig" Label="Pausenkönig anzeigen" Color="Color.Primary" ReadOnly="true"/>
</MudMenuItem>
<MudMenuItem OnClick="@(() => ToggleWidget("Streaks"))">
<MudCheckBox T="bool" Value="@_showStreaks" Label="Streaks anzeigen" Color="Color.Primary" ReadOnly="true"/>
</MudMenuItem>
<MudDivider />
<MudMenuItem OnClick="@(() => ToggleWidget("Charts"))">
<MudCheckBox T="bool" Value="@_showCharts" Label="Diagramme anzeigen" Color="Color.Primary" ReadOnly="true"/>
</MudMenuItem>
</MudMenu>
</MudStack>
@* ── Gamification Widgets ── *@
<MudGrid>
@if (_showEarlyBird)
{
<MudItem xs="12" sm="6" md="3">
<MudPaper Elevation="2" Class="pa-4 rounded-xl" Style="background: linear-gradient(135deg, #fdfbfb 0%, #ebedee 100%);">
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="3">
<MudAvatar Color="Color.Warning" Variant="Variant.Filled" Size="Size.Large">🌅</MudAvatar>
<MudStack Spacing="0">
<MudText Typo="Typo.subtitle2" Color="Color.Secondary">Early Bird</MudText>
<MudText Typo="Typo.h5" Style="font-weight: 700">@FormatTimeSpan(_stats.EarliestStart)</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary">Frühester Beginn im Monat</MudText>
</MudStack>
</MudStack>
</MudPaper>
</MudItem>
}
@if (_showNightOwl)
{
<MudItem xs="12" sm="6" md="3">
<MudPaper Elevation="2" Class="pa-4 rounded-xl" Style="background: linear-gradient(135deg, #304352 0%, #d7d2cc 100%); color: white;">
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="3">
<MudAvatar Color="Color.Dark" Variant="Variant.Filled" Size="Size.Large">🦉</MudAvatar>
<MudStack Spacing="0">
<MudText Typo="Typo.subtitle2" Style="opacity: 0.8">Night Owl</MudText>
<MudText Typo="Typo.h5" Style="font-weight: 700">@FormatTimeSpan(_stats.LatestEnd)</MudText>
<MudText Typo="Typo.caption" Style="opacity: 0.8">Spätestes Ende im Monat</MudText>
</MudStack>
</MudStack>
</MudPaper>
</MudItem>
}
@if (_showPausenkonig)
{
<MudItem xs="12" sm="6" md="3">
<MudPaper Elevation="2" Class="pa-4 rounded-xl" Style="background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);">
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="3">
<MudAvatar Color="Color.Info" Variant="Variant.Filled" Size="Size.Large">☕</MudAvatar>
<MudStack Spacing="0">
<MudText Typo="Typo.subtitle2" Color="Color.Secondary">Pausenkönig</MudText>
<MudText Typo="Typo.h5" Style="font-weight: 700">@((int)_stats.AverageBreak.TotalMinutes) Min.</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary">Ø Pause im Monat</MudText>
</MudStack>
</MudStack>
</MudPaper>
</MudItem>
}
@if (_showStreaks)
{
<MudItem xs="12" sm="6" md="3">
<MudPaper Elevation="2" Class="pa-4 rounded-xl" Style="background: linear-gradient(135deg, #f6d365 0%, #fda085 100%); color: white;">
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="3">
<MudAvatar Color="Color.Error" Variant="Variant.Filled" Size="Size.Large">🔥</MudAvatar>
<MudStack Spacing="0">
<MudText Typo="Typo.subtitle2" Style="opacity: 0.9">Streak</MudText>
<MudText Typo="Typo.h5" Style="font-weight: 700">@_stats.CurrentStreak / @_stats.LongestStreak</MudText>
<MudText Typo="Typo.caption" Style="opacity: 0.9">Aktuell / Bester (Tage)</MudText>
</MudStack>
</MudStack>
</MudPaper>
</MudItem>
}
</MudGrid>
@* ── Diagramme ── *@
@if (_showCharts)
{
<MudGrid>
<MudItem xs="12" md="8">
<MudPaper Elevation="2" Class="pa-4 rounded-xl h-100">
<MudText Typo="Typo.h6" Class="mb-4">Gleitzeit-Verlauf @DateTime.Today.Year</MudText>
<MudChart T="double" ChartType="ChartType.Bar"
ChartSeries="@_barChartSeries"
XAxisLabels="@_barChartLabels"
Width="100%" Height="300px" />
</MudPaper>
</MudItem>
<MudItem xs="12" md="4">
<MudPaper Elevation="2" Class="pa-4 rounded-xl h-100">
<MudText Typo="Typo.h6" Class="mb-4">Jahres-Verteilung</MudText>
<MudChart T="double" ChartType="ChartType.Pie"
InputData="@_pieChartData"
InputLabels="@_pieChartLabels"
Width="100%" Height="300px" />
</MudPaper>
</MudItem>
</MudGrid>
}
</MudStack>
}
@code {
private bool _loading = true;
private DashboardStatsVm _stats = new();
private DashboardChartDataVm _chartData = new();
private bool _showEarlyBird = true;
private bool _showNightOwl = true;
private bool _showPausenkonig = true;
private bool _showStreaks = true;
private bool _showCharts = true;
private List<ChartSeries<double>> _barChartSeries = new();
private string[] _barChartLabels = Array.Empty<string>();
private double[] _pieChartData = Array.Empty<double>();
private string[] _pieChartLabels = Array.Empty<string>();
protected override async Task OnInitializedAsync()
{
var authState = await AuthStateProvider.GetAuthenticationStateAsync();
var claim = authState.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
if (claim == null) return;
int userId = int.Parse(claim.Value);
int year = DateTime.Today.Year;
int month = DateTime.Today.Month;
await LoadSettings();
_stats = await TrackerService.GetDashboardStatsAsync(userId, year, month);
_chartData = await TrackerService.GetDashboardChartDataAsync(userId, year);
// Prepare Bar Chart
_barChartSeries = new List<ChartSeries<double>>
{
new ChartSeries<double> { Name = "Überstunden", Data = _chartData.MonthlyOvertime.Select(m => m.OvertimeHours).ToArray() }
};
_barChartLabels = _chartData.MonthlyOvertime.Select(m => m.MonthName).ToArray();
// Prepare Pie Chart
_pieChartData = new double[] { _chartData.WorkDaysCount, _chartData.VacationDaysCount, _chartData.PublicHolidaysCount };
_pieChartLabels = new string[] { "Arbeit", "Urlaub", "Feiertage" };
_loading = false;
}
private async Task LoadSettings()
{
try
{
var eb = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "widget_EarlyBird");
if (eb != null) _showEarlyBird = eb == "true";
var no = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "widget_NightOwl");
if (no != null) _showNightOwl = no == "true";
var pk = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "widget_Pausenkonig");
if (pk != null) _showPausenkonig = pk == "true";
var st = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "widget_Streaks");
if (st != null) _showStreaks = st == "true";
var ch = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "widget_Charts");
if (ch != null) _showCharts = ch == "true";
}
catch
{
// SSR Fallback
}
}
private async Task ToggleWidget(string widget)
{
bool newState = true;
if (widget == "EarlyBird") { _showEarlyBird = !_showEarlyBird; newState = _showEarlyBird; }
if (widget == "NightOwl") { _showNightOwl = !_showNightOwl; newState = _showNightOwl; }
if (widget == "Pausenkonig") { _showPausenkonig = !_showPausenkonig; newState = _showPausenkonig; }
if (widget == "Streaks") { _showStreaks = !_showStreaks; newState = _showStreaks; }
if (widget == "Charts") { _showCharts = !_showCharts; newState = _showCharts; }
try
{
await JSRuntime.InvokeVoidAsync("localStorage.setItem", $"widget_{widget}", newState.ToString().ToLower());
}
catch { }
}
private string FormatTimeSpan(TimeSpan? ts)
{
if (!ts.HasValue) return "-";
return $"{ts.Value.Hours:D2}:{ts.Value.Minutes:D2}";
}
}
@@ -1,4 +1,4 @@
@page "/"
@page "/week"
@rendermode InteractiveWebAssembly
@attribute [Authorize]
@inject ITimetrackerService TrackerService
@@ -70,4 +70,14 @@ public class ClientTimetrackerService : ITimetrackerService
{
return await _http.GetFromJsonAsync<List<WorkDay>>($"api/tracker/month?year={year}&month={month}") ?? [];
}
public async Task<DashboardStatsVm> GetDashboardStatsAsync(int userId, int year, int month)
{
return await _http.GetFromJsonAsync<DashboardStatsVm>($"api/tracker/dashboard/stats?year={year}&month={month}") ?? new DashboardStatsVm();
}
public async Task<DashboardChartDataVm> GetDashboardChartDataAsync(int userId, int year)
{
return await _http.GetFromJsonAsync<DashboardChartDataVm>($"api/tracker/dashboard/chart?year={year}") ?? new DashboardChartDataVm();
}
}
@@ -199,4 +199,144 @@ public class TimetrackerService(IDbContextFactory<TimetrackerDbContext> factory)
.OrderBy(w => w.Date)
.ToListAsync();
}
// ── Dashboard ─────────────────────────────────────────────────────────
public async Task<DashboardStatsVm> GetDashboardStatsAsync(int userId, int year, int month)
{
await using var db = await factory.CreateDbContextAsync();
var startDate = new DateOnly(year, month, 1);
var endDate = startDate.AddMonths(1).AddDays(-1);
var workDays = await db.WorkDays
.Include(w => w.Breaks)
.Where(w => w.UserId == userId && w.Date >= startDate && w.Date <= endDate)
.ToListAsync();
var stats = new DashboardStatsVm();
if (workDays.Any(w => w.StartTime.HasValue))
{
var earliest = workDays.Where(w => w.StartTime.HasValue).Min(w => w.StartTime!.Value);
stats.EarliestStart = earliest.ToTimeSpan();
}
if (workDays.Any(w => w.EndTime.HasValue))
{
var latest = workDays.Where(w => w.EndTime.HasValue).Max(w => w.EndTime!.Value);
stats.LatestEnd = latest.ToTimeSpan();
}
var daysWithBreaks = workDays.Where(w => w.Breaks.Any(b => b.StartTime.HasValue && b.EndTime.HasValue)).ToList();
if (daysWithBreaks.Any())
{
var totalBreakTicks = daysWithBreaks.Sum(w =>
w.Breaks.Where(b => b.StartTime.HasValue && b.EndTime.HasValue)
.Sum(b => (b.EndTime!.Value - b.StartTime!.Value).Ticks));
stats.AverageBreak = TimeSpan.FromTicks(totalBreakTicks / daysWithBreaks.Count);
}
var allUserDays = await db.WorkDays
.Where(w => w.UserId == userId && w.StartTime.HasValue && w.EndTime.HasValue)
.OrderBy(w => w.Date)
.Select(w => w.Date)
.ToListAsync();
if (allUserDays.Any())
{
int currentStreak = 1;
int maxStreak = 1;
int tempStreak = 1;
for (int i = 1; i < allUserDays.Count; i++)
{
if (allUserDays[i].DayNumber == allUserDays[i - 1].DayNumber + 1)
{
tempStreak++;
}
else if (allUserDays[i].DayNumber > allUserDays[i - 1].DayNumber + 1)
{
if (tempStreak > maxStreak) maxStreak = tempStreak;
tempStreak = 1;
}
}
if (tempStreak > maxStreak) maxStreak = tempStreak;
stats.LongestStreak = maxStreak;
var today = DateOnly.FromDateTime(DateTime.Today);
var yesterday = today.AddDays(-1);
if (allUserDays.Last() == today || allUserDays.Last() == yesterday)
{
stats.CurrentStreak = tempStreak;
}
else
{
stats.CurrentStreak = 0;
}
}
return stats;
}
public async Task<DashboardChartDataVm> GetDashboardChartDataAsync(int userId, int year)
{
await using var db = await factory.CreateDbContextAsync();
var chartData = new DashboardChartDataVm();
var settings = await GetSettingsAsync(userId);
var workDaysThisYear = await db.WorkDays
.Include(w => w.Breaks)
.Where(w => w.UserId == userId && w.Date.Year == year)
.ToListAsync();
var vacationsThisYear = await db.VacationDays
.Where(v => v.UserId == userId && v.Date.Year == year)
.ToListAsync();
var holidaysThisYear = await db.PublicHolidays
.Where(h => h.Date.Year == year && h.Counties.Contains(settings.GermanState))
.ToListAsync();
chartData.WorkDaysCount = workDaysThisYear.Count(w => w.StartTime.HasValue);
chartData.VacationDaysCount = vacationsThisYear.Count;
chartData.PublicHolidaysCount = holidaysThisYear.Count(h => settings.IsWorkDay(h.Date.DayOfWeek));
for (int month = 1; month <= 12; month++)
{
var daysInMonth = workDaysThisYear.Where(w => w.Date.Month == month).ToList();
if (!daysInMonth.Any(d => d.StartTime.HasValue)) continue;
double monthOvertime = 0;
foreach (var day in daysInMonth)
{
if (!day.StartTime.HasValue || !day.EndTime.HasValue) continue;
var gross = day.EndTime.Value - day.StartTime.Value;
var breakTicks = day.Breaks
.Where(b => b.StartTime.HasValue && b.EndTime.HasValue)
.Sum(b => (b.EndTime!.Value - b.StartTime!.Value).Ticks);
var enteredBreak = TimeSpan.FromTicks(breakTicks);
int minMinutes = gross.TotalHours >= 9.0 ? 45 : 30;
int finalMin = Math.Max(minMinutes, settings.MinimumBreakMinutes);
var minBreak = TimeSpan.FromMinutes(finalMin);
var effectiveBreak = enteredBreak > minBreak ? enteredBreak : minBreak;
var net = gross - effectiveBreak;
var target = TimeSpan.FromHours(settings.DailyTargetHours);
var isHoliday = holidaysThisYear.Any(h => h.Date == day.Date);
var isVacation = vacationsThisYear.Any(v => v.Date == day.Date);
var isWorkDay = settings.IsWorkDay(day.Date.DayOfWeek);
if (!isWorkDay || isHoliday || isVacation) target = TimeSpan.Zero;
monthOvertime += (net - target).TotalHours;
}
var monthName = new DateTime(year, month, 1).ToString("MMM", new System.Globalization.CultureInfo("de-DE"));
chartData.MonthlyOvertime.Add(new MonthlyOvertimeVm { MonthName = monthName, OvertimeHours = monthOvertime });
}
return chartData;
}
}
+18
View File
@@ -684,6 +684,24 @@ trackerApi.MapGet("/month", async (ClaimsPrincipal claimsPrincipal, [FromQuery]
return Results.Ok(days);
});
trackerApi.MapGet("/dashboard/stats", async (ClaimsPrincipal claimsPrincipal, [FromQuery] int year, [FromQuery] int month, ITimetrackerService trackerService) =>
{
var idClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
if (!int.TryParse(idClaim, out var userId)) return Results.Unauthorized();
var stats = await trackerService.GetDashboardStatsAsync(userId, year, month);
return Results.Ok(stats);
});
trackerApi.MapGet("/dashboard/chart", async (ClaimsPrincipal claimsPrincipal, [FromQuery] int year, ITimetrackerService trackerService) =>
{
var idClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
if (!int.TryParse(idClaim, out var userId)) return Results.Unauthorized();
var chartData = await trackerService.GetDashboardChartDataAsync(userId, year);
return Results.Ok(chartData);
});
trackerApi.MapGet("/export/week", async (ClaimsPrincipal claimsPrincipal, [FromQuery] string monday, ITimetrackerService trackerService, TimetrackerDbContext db) =>
{
var idClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
@@ -2158,3 +2158,659 @@ SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @year
ORDER BY "p"."Date"
2026-06-26 23:48:05.867 +02:00 [INF] File logging active. Writing logs to /Users/marcwieland/Uni/Master/Projects/Timetracker/timetracker/timetracker.Server/logs
2026-06-26 23:48:06.317 +02:00 [WRN] Entity 'WorkDay' has a global query filter defined and is the required end of a relationship with the entity 'BreakEntry'. This may lead to unexpected results when the required entity is filtered out. Either configure the navigation as optional, or define matching query filters for both entities in the navigation. See https://go.microsoft.com/fwlink/?linkid=2131316 for more information.
2026-06-26 23:48:06.382 +02:00 [INF] Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.
2026-06-26 23:48:06.393 +02:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT COUNT(*) FROM "sqlite_master" WHERE "name" = '__EFMigrationsLock' AND "type" = 'table';
2026-06-26 23:48:06.397 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
INSERT OR IGNORE INTO "__EFMigrationsLock"("Id", "Timestamp") VALUES(1, '2026-06-26 21:48:06.39604+00:00');
SELECT changes();
2026-06-26 23:48:06.447 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" (
"MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY,
"ProductVersion" TEXT NOT NULL
);
2026-06-26 23:48:06.453 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT COUNT(*) FROM "sqlite_master" WHERE "name" = '__EFMigrationsHistory' AND "type" = 'table';
2026-06-26 23:48:06.455 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "MigrationId", "ProductVersion"
FROM "__EFMigrationsHistory"
ORDER BY "MigrationId";
2026-06-26 23:48:06.459 +02:00 [INF] No migrations were applied. The database is already up to date.
2026-06-26 23:48:06.460 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DELETE FROM "__EFMigrationsLock";
2026-06-26 23:48:06.583 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "u"."Id", "u"."IsTenantAdmin", "u"."PasswordHash", "u"."PasswordSalt", "u"."TenantId", "u"."Username"
FROM "Users" AS "u"
WHERE "u"."TenantId" IS NULL AND "u"."Username" = 'marc'
LIMIT 1
2026-06-26 23:48:07.221 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:48:07.289 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:07.305 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:48:07.309 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:48:07.320 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:48:07.324 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:48:07.328 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:48:08.052 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:48:08.229 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:08.230 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:48:08.291 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:48:08.292 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:48:08.293 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:48:08.293 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:48:18.943 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @year
ORDER BY "p"."Date"
2026-06-26 23:48:18.943 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:18.947 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:18.957 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId
ORDER BY "w"."Date"
LIMIT 1
2026-06-26 23:48:18.960 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:18.963 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE "p"."Date" >= @startDate AND "p"."Date" <= @endDate
2026-06-26 23:48:18.967 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Date"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND "v"."Date" >= @startDate AND "v"."Date" <= @endDate
2026-06-26 23:48:19.847 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:19.854 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @from='?' (DbType = Date), @to='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @from AND "w"."Date" < @to
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:20.593 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:20.606 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId
ORDER BY "w"."Date"
LIMIT 1
2026-06-26 23:48:20.606 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:20.607 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE "p"."Date" >= @startDate AND "p"."Date" <= @endDate
2026-06-26 23:48:20.607 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Date"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND "v"."Date" >= @startDate AND "v"."Date" <= @endDate
2026-06-26 23:48:21.869 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:21.871 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:48:21.876 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:48:21.877 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:48:21.878 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:48:21.878 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:48:34.777 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:34.777 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId
ORDER BY "w"."Date"
LIMIT 1
2026-06-26 23:48:34.778 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:34.779 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:34.781 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE "p"."Date" >= @startDate AND "p"."Date" <= @endDate
2026-06-26 23:48:34.781 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Date"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND "v"."Date" >= @startDate AND "v"."Date" <= @endDate
2026-06-26 23:48:37.736 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:37.736 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:38.439 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:38.439 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:39.037 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:39.037 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:40.628 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:40.628 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:41.942 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:41.944 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:48:41.948 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:48:41.948 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:48:41.949 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:48:41.949 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:48:45.506 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:45.508 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:45.509 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId
ORDER BY "w"."Date"
LIMIT 1
2026-06-26 23:48:45.509 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:45.510 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE "p"."Date" >= @startDate AND "p"."Date" <= @endDate
2026-06-26 23:48:45.511 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Date"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND "v"."Date" >= @startDate AND "v"."Date" <= @endDate
2026-06-26 23:48:46.912 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @year
ORDER BY "v"."Date"
2026-06-26 23:48:46.913 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @from='?' (DbType = Date), @to='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @from AND "w"."Date" < @to
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:47.694 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32), @monday='?' (DbType = Date), @AddDays='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @userId AND "w"."Date" >= @monday AND "w"."Date" < @AddDays
ORDER BY "w"."Date", "w"."Id"
2026-06-26 23:48:47.704 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId
ORDER BY "w"."Date"
LIMIT 1
2026-06-26 23:48:47.704 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:47.705 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE "p"."Date" >= @startDate AND "p"."Date" <= @endDate
2026-06-26 23:48:47.705 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Date"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND "v"."Date" >= @startDate AND "v"."Date" <= @endDate
2026-06-26 23:48:49.284 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:48:49.285 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:48:49.290 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:48:49.291 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:48:49.291 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:48:49.292 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:49:14.550 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:14.551 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:49:14.551 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:49:14.552 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:14.552 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:49:14.552 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:49:14.552 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:49:15.148 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:15.307 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:49:15.307 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:49:15.371 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:15.372 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:49:15.372 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:49:15.372 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:15.372 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:49:15.372 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:49:15.373 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:49:15.968 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:16.144 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:49:16.146 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:49:16.194 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:16.195 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:49:16.196 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:49:16.196 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:49:25.894 +02:00 [INF] File logging active. Writing logs to /Users/marcwieland/Uni/Master/Projects/Timetracker/timetracker/timetracker.Server/logs
2026-06-26 23:49:26.340 +02:00 [WRN] Entity 'WorkDay' has a global query filter defined and is the required end of a relationship with the entity 'BreakEntry'. This may lead to unexpected results when the required entity is filtered out. Either configure the navigation as optional, or define matching query filters for both entities in the navigation. See https://go.microsoft.com/fwlink/?linkid=2131316 for more information.
2026-06-26 23:49:26.404 +02:00 [INF] Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.
2026-06-26 23:49:26.416 +02:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT COUNT(*) FROM "sqlite_master" WHERE "name" = '__EFMigrationsLock' AND "type" = 'table';
2026-06-26 23:49:26.420 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
INSERT OR IGNORE INTO "__EFMigrationsLock"("Id", "Timestamp") VALUES(1, '2026-06-26 21:49:26.418766+00:00');
SELECT changes();
2026-06-26 23:49:26.473 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" (
"MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY,
"ProductVersion" TEXT NOT NULL
);
2026-06-26 23:49:26.479 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT COUNT(*) FROM "sqlite_master" WHERE "name" = '__EFMigrationsHistory' AND "type" = 'table';
2026-06-26 23:49:26.482 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "MigrationId", "ProductVersion"
FROM "__EFMigrationsHistory"
ORDER BY "MigrationId";
2026-06-26 23:49:26.485 +02:00 [INF] No migrations were applied. The database is already up to date.
2026-06-26 23:49:26.493 +02:00 [INF] Executed DbCommand (7ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
DELETE FROM "__EFMigrationsLock";
2026-06-26 23:49:26.614 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "u"."Id", "u"."IsTenantAdmin", "u"."PasswordHash", "u"."PasswordSalt", "u"."TenantId", "u"."Username"
FROM "Users" AS "u"
WHERE "u"."TenantId" IS NULL AND "u"."Username" = 'marc'
LIMIT 1
2026-06-26 23:49:27.414 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:27.414 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:27.483 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:49:27.483 +02:00 [INF] Executed DbCommand (1ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:49:27.499 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:49:27.499 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:49:27.503 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:27.503 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:27.514 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:49:27.514 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:49:27.518 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:49:27.518 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:49:27.523 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:49:27.523 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
2026-06-26 23:49:28.237 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:28.401 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @startDate='?' (DbType = Date), @endDate='?' (DbType = Date)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."Date" >= @startDate AND "w"."Date" <= @endDate
ORDER BY "w"."Id"
2026-06-26 23:49:28.401 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Date"
FROM "WorkDays" AS "w"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND "w"."StartTime" IS NOT NULL AND "w"."EndTime" IS NOT NULL
ORDER BY "w"."Date"
2026-06-26 23:49:28.453 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@userId='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "a"."Id", "a"."DailyTargetHours", "a"."FlexTimeStartDate", "a"."FlexTimeStartingBalanceHours", "a"."GermanState", "a"."MinimumBreakMinutes", "a"."TenantId", "a"."UserId", "a"."VacationDaysPerYear", "a"."WorkFriday", "a"."WorkMonday", "a"."WorkSaturday", "a"."WorkSunday", "a"."WorkThursday", "a"."WorkTuesday", "a"."WorkWednesday"
FROM "AppSettings" AS "a"
WHERE "a"."TenantId" IS NULL AND "a"."UserId" = @userId
LIMIT 1
2026-06-26 23:49:28.454 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "w"."Id", "w"."Date", "w"."EndTime", "w"."StartTime", "w"."TenantId", "w"."UserId", "b"."Id", "b"."EndTime", "b"."StartTime", "b"."WorkDayId"
FROM "WorkDays" AS "w"
LEFT JOIN "BreakEntries" AS "b" ON "w"."Id" = "b"."WorkDayId"
WHERE "w"."TenantId" IS NULL AND "w"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "w"."Date") AS INTEGER) = @_8__locals1_year
ORDER BY "w"."Id"
2026-06-26 23:49:28.454 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_userId='?' (DbType = Int32), @_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "v"."Id", "v"."Date", "v"."Note", "v"."TenantId", "v"."UserId"
FROM "VacationDays" AS "v"
WHERE "v"."TenantId" IS NULL AND "v"."UserId" = @_8__locals1_userId AND CAST(strftime('%Y', "v"."Date") AS INTEGER) = @_8__locals1_year
2026-06-26 23:49:28.455 +02:00 [INF] Executed DbCommand (0ms) [Parameters=[@_8__locals1_year='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Counties", "p"."Date", "p"."Name"
FROM "PublicHolidays" AS "p"
WHERE CAST(strftime('%Y', "p"."Date") AS INTEGER) = @_8__locals1_year AND instr("p"."Counties", NULL) > 0
+29
View File
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
namespace timetracker.Shared
{
public class DashboardStatsVm
{
public TimeSpan? EarliestStart { get; set; }
public TimeSpan? LatestEnd { get; set; }
public TimeSpan AverageBreak { get; set; }
public int CurrentStreak { get; set; }
public int LongestStreak { get; set; }
}
public class DashboardChartDataVm
{
public List<MonthlyOvertimeVm> MonthlyOvertime { get; set; } = new();
public int WorkDaysCount { get; set; }
public int VacationDaysCount { get; set; }
public int SickDaysCount { get; set; }
public int PublicHolidaysCount { get; set; }
}
public class MonthlyOvertimeVm
{
public string MonthName { get; set; } = "";
public double OvertimeHours { get; set; }
}
}
@@ -11,4 +11,6 @@ public interface ITimetrackerService
Task RemoveVacationDayAsync(int userId, int id);
Task<TimeSpan> GetTotalOvertimeAsync(int userId, AppSettings settings);
Task<List<WorkDay>> GetMonthAsync(int userId, int year, int month);
Task<DashboardStatsVm> GetDashboardStatsAsync(int userId, int year, int month);
Task<DashboardChartDataVm> GetDashboardChartDataAsync(int userId, int year);
}