import { DutyAssignmentStatus, EventParticipationStatus, TerminStatus, UserRole, } from "@prisma/client"; import { requireKitaSession } from "@/lib/auth-utils"; import { prisma } from "@/lib/prisma"; import { AdminTerminModal } from "./_components/admin-termin-modal"; import { PendingAnfragen, type PendingTerminDto } from "./_components/pending-anfragen"; import { TerminList, type CalendarListItemDto } from "./_components/termin-list"; import { TerminRequestModal } from "./_components/termin-request-modal"; export default async function KalenderPage({ searchParams, }: { searchParams: { tab?: string }; }) { const session = await requireKitaSession(); const isAdmin = session.user.role === UserRole.ADMIN || session.user.role === UserRole.KOORDINATOR; const familyIdForParticipation = session.user.familyId ?? "__no_family__"; const currentTab = searchParams.tab || "übersicht"; const confirmedTermineRows = await prisma.termin.findMany({ where: { kitaId: session.user.kitaId, status: TerminStatus.CONFIRMED, }, select: { id: true, title: true, description: true, type: true, status: true, startDate: true, endDate: true, allDay: true, mitbringselListEnabled: true, requiresRsvp: true, participantInfo: true, mitbringselItems: { select: { id: true, userId: true, content: true, user: { select: { firstName: true, lastName: true, }, }, }, }, participations: { where: { child: { familyId: familyIdForParticipation, }, }, select: { childId: true, status: true, }, }, }, orderBy: { startDate: "asc" }, }); const myPendingTermineRows = await prisma.termin.findMany({ where: { kitaId: session.user.kitaId, status: TerminStatus.PENDING, createdById: session.user.id, }, select: { id: true, title: true, description: true, type: true, status: true, startDate: true, endDate: true, allDay: true, mitbringselListEnabled: true, requiresRsvp: true, participantInfo: true, mitbringselItems: { select: { id: true, userId: true, content: true, user: { select: { firstName: true, lastName: true, }, }, }, }, participations: { where: { child: { familyId: familyIdForParticipation, }, }, select: { childId: true, status: true, }, }, }, orderBy: { startDate: "asc" }, }); const dutyAssignmentRows = await prisma.dutyAssignment.findMany({ where: { kitaId: session.user.kitaId, status: DutyAssignmentStatus.PLANNED, endDate: { gte: new Date() }, }, select: { id: true, startDate: true, endDate: true, status: true, dutyType: { select: { name: true, }, }, family: { select: { name: true, }, }, }, orderBy: { startDate: "asc" }, }); const allUserTermine: CalendarListItemDto[] = [ ...confirmedTermineRows.map((termin) => ({ ...termin, kind: "termin" as const, showParticipantInfo: isAdmin || termin.participations.some( (participation) => participation.status === EventParticipationStatus.ATTENDING, ), })), ...myPendingTermineRows.map((termin) => ({ ...termin, kind: "termin" as const, showParticipantInfo: isAdmin || termin.participations.some( (participation) => participation.status === EventParticipationStatus.ATTENDING, ), })), ...dutyAssignmentRows.map((assignment) => ({ kind: "duty" as const, id: assignment.id, title: assignment.dutyType.name, familyName: assignment.family.name, status: assignment.status, startDate: assignment.startDate, endDate: assignment.endDate, })), ].sort((a, b) => a.startDate.getTime() - b.startDate.getTime()); let allPendingTermine: PendingTerminDto[] = []; if (isAdmin) { allPendingTermine = await prisma.termin.findMany({ where: { kitaId: session.user.kitaId, status: TerminStatus.PENDING, }, select: { id: true, title: true, startDate: true, allDay: true, createdBy: { select: { firstName: true, lastName: true, }, }, }, orderBy: { createdAt: "desc" }, }); } return (

Terminkalender

Alle anstehenden Termine, Feste und Schließtage im Überblick.

{isAdmin && }
{isAdmin ? (
Übersicht Ausstehende Anfragen {allPendingTermine.length > 0 && ( {allPendingTermine.length} )}
{currentTab === "übersicht" ? ( ) : ( )}
) : ( )}
); }