Rollen Chunk 6: Team-Tab mit Matrix-Kalender und Genehmigungen
Docker Image / test (push) Canceled after 0s
Docker Image / image (push) Canceled after 0s

This commit is contained in:
loki committed 2026-10-11 20:19:05 +02:00
1 parent 73ade9d4ec
commit f35afca3f5
1 file changed
+64
+64
View File
@@ -0,0 +1,64 @@
import { NextResponse } from "next/server";
import { authedRole } from "@/lib/auth";
import { getDb, initializeDatabase } from "@/lib/db";
import { germanPublicHolidays } from "@/lib/domain/holidays";
import { errorResponse, isValidYear } from "@/lib/http";
import { getFederalState } from "@/lib/region";
import {
ensureYearSettings,
getWeeklyTargets,
listAllUsers,
listDeletedVacationRequests,
listSickDays,
listVacationRequests,
sumPendingUnitsByYear,
sumVacationUnitsByYear,
} from "@/lib/repository";
export async function GET(request: Request) {
const user = await authedRole(request, ["admin", "teamleiter"]);
if (user instanceof NextResponse) {
return user;
}
const yearParam = new URL(request.url).searchParams.get("year");
if (!isValidYear(yearParam)) {
return errorResponse(400, "invalidYear", "Query parameter year must be YYYY.");
}
const year = Number(yearParam);
const db = getDb();
initializeDatabase(db);
const team = listAllUsers(db).map((member) => {
const settings = ensureYearSettings(db, member.id, year);
const usedUnits = sumVacationUnitsByYear(db, member.id, year);
const pendingUnits = sumPendingUnitsByYear(db, member.id, year);
const state = getFederalState(db, member.id);
return {
id: member.id,
name: member.name,
email: member.email,
role: member.role,
entitlementUnits: settings.entitlementUnits,
carryoverUnits: settings.carryoverUnits,
usedUnits,
pendingUnits,
remainingUnits: Math.max(
0,
settings.entitlementUnits +
settings.carryoverUnits -
usedUnits -
pendingUnits,
),
requests: listVacationRequests(
db,
member.id,
`${year}-01-01`,
`${year}-12-31`,
),
trash: listDeletedVacationRequests(db, member.id).length,
sickDays: listSickDays(db, member.id, `${year}-01-01`, `${year}-12-31`),
weekdayTargets: getWeeklyTargets(db, member.id),
holidays: [...germanPublicHolidays(year, state)],
};
});
return NextResponse.json({ year, team });
}