diff --git a/src/admin/utils/dashboardHelpers.ts b/src/admin/utils/dashboardHelpers.ts index f544019..13dcead 100644 --- a/src/admin/utils/dashboardHelpers.ts +++ b/src/admin/utils/dashboardHelpers.ts @@ -16,6 +16,7 @@ export const STATUS_LABELS: Record = { away: "Přestávka", out: "Nepřihlášen", leave: "Nepřítomen", + absent: "Nepřítomen", }; // Re-exported from the single source of truth so the dashboard activity feed diff --git a/src/routes/admin/dashboard.ts b/src/routes/admin/dashboard.ts index 3f3d9da..4c5003b 100644 --- a/src/routes/admin/dashboard.ts +++ b/src/routes/admin/dashboard.ts @@ -69,7 +69,7 @@ export default async function dashboardRoutes( // Attendance admin — only for attendance.manage if (has("attendance.manage")) { - const [todayAttendance, onLeaveToday, usersCount] = await Promise.all([ + const [todayAttendance, onLeaveToday, activeUsers] = await Promise.all([ prisma.attendance.findMany({ where: { shift_date: { gte: todayStart, lt: todayEnd }, @@ -89,8 +89,13 @@ export default async function dashboardRoutes( users: { select: { id: true, first_name: true, last_name: true } }, }, }), - prisma.users.count({ where: { is_active: true } }), + prisma.users.findMany({ + where: { is_active: true }, + select: { id: true, first_name: true, last_name: true }, + orderBy: [{ last_name: "asc" }, { first_name: "asc" }], + }), ]); + const usersCount = activeUsers.length; const userAttendanceMap = new Map(); for (const a of todayAttendance) { @@ -153,6 +158,25 @@ export default async function dashboardRoutes( }); } + // Show every active employee — those with no attendance record today + // appear as "absent" so the card reflects the whole team, not just those + // who clocked in or are on leave. + const recordedUserIds = new Set([ + ...userAttendanceMap.keys(), + ...leaveUserIds, + ]); + for (const user of activeUsers) { + if (recordedUserIds.has(user.id)) continue; + attendanceUsers.push({ + user_id: user.id, + name: `${user.first_name} ${user.last_name}`, + initials: + `${user.first_name?.charAt(0) ?? ""}${user.last_name?.charAt(0) ?? ""}`.toUpperCase(), + status: "absent", + arrived_at: null, + }); + } + result.attendance = { present_today: presentCount, total_active: usersCount,