import Link from "next/link"; import { addWeeks, format, getISOWeek, startOfDay, startOfWeek } from "date-fns"; import { de } from "date-fns/locale"; import { CalendarRange, Plus, Trash2 } from "lucide-react"; import { UserRole } from "@prisma/client"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { requireRole } from "@/lib/auth-utils"; import { prisma } from "@/lib/prisma"; import { createDutyType, deleteDutyType } from "./actions"; import { DutyPlanner, type DutyPlanAssignmentDto, type DutyPlanDutyTypeDto, type DutyPlanFamilyDto, type DutyPlanWeekDto, } from "./duty-planner"; export const metadata = { title: "Dienstplan · Kita-Planer" }; const DEFAULT_WEEK_COUNT = 12; const MAX_WEEK_COUNT = 104; export default async function DienstePage({ searchParams, }: { searchParams: Promise<{ start?: string; weeks?: string }>; }) { const session = await requireRole([UserRole.ADMIN, UserRole.SUPERADMIN]); if (!session.user.kitaId) { throw new Error("Kein Mandant zugeordnet."); } const resolvedSearchParams = await searchParams; const rangeStart = getRangeStart(resolvedSearchParams.start); const weekCount = getWeekCount(resolvedSearchParams.weeks); const weeks = buildWeeks(rangeStart, weekCount); const rangeEnd = startOfDay(new Date(weeks[weeks.length - 1].endDate)); const [dutyTypes, families, assignments] = await Promise.all([ prisma.dutyType.findMany({ where: { kitaId: session.user.kitaId }, select: { id: true, name: true, description: true, }, orderBy: { name: "asc" }, }), prisma.family.findMany({ where: { kitaId: session.user.kitaId }, select: { id: true, name: true, }, orderBy: { name: "asc" }, }), prisma.dutyAssignment.findMany({ where: { kitaId: session.user.kitaId, startDate: { gte: rangeStart, lte: rangeEnd, }, }, select: { id: true, dutyTypeId: true, familyId: true, startDate: true, }, }), ]); const dutyTypeDtos: DutyPlanDutyTypeDto[] = dutyTypes; const familyDtos: DutyPlanFamilyDto[] = families; const assignmentDtos: DutyPlanAssignmentDto[] = assignments.map( (assignment) => ({ id: assignment.id, dutyTypeId: assignment.dutyTypeId, familyId: assignment.familyId, startDate: toDateKey(assignment.startDate), }), ); return (

ADMIN · DIENSTPLAN

Dienste{" "} planen

Plane Dienste pro Kalenderwoche und Haushalt. Jede Änderung wird direkt gespeichert.

{dutyTypes.length} Diensttypen {families.length} Familien
Zeitraum

{weeks[0].label} bis {weeks[weeks.length - 1].label}

Diensttypen Beispiele sind Wäschedienst, Einkauf oder Gartendienst.