From d8d3227c82896e1d74f41929b44f7d13d4565b90 Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Thu, 10 Sep 2026 18:12:04 +0200 Subject: [PATCH] feat(kalender): Belegung des Tages auf der Startseite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jeder Bereich zeigt, wie voll der heutige Tag schon ist: Termine aus allen verbundenen Kalendern gegen die Tageskapazität dieses Bereichs. Alle Kalender zählen gegen jeden Bereich, weil ein Termin die Zeit ohnehin blockiert, gleich zu welchem Lebensbereich er gehört. Wer um 14 Uhr beim Zahnarzt sitzt, kann zur selben Zeit nichts für die Firma tun. Ohne verbundenen Kalender bleibt der Balken weg. Er wäre sonst immer bei null und sähe nach "alles frei" aus — eine Zahl, die lügt, ist schlechter als keine. Co-Authored-By: Claude Opus 5 --- src/app/(app)/page.tsx | 50 ++++++++++++++++------ src/server/abfragen/kalender.ts | 75 +++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 12 deletions(-) create mode 100644 src/server/abfragen/kalender.ts diff --git a/src/app/(app)/page.tsx b/src/app/(app)/page.tsx index 164dcd7..bfb27b8 100644 --- a/src/app/(app)/page.tsx +++ b/src/app/(app)/page.tsx @@ -1,6 +1,7 @@ import Link from 'next/link' import { AufgabenListe } from '@/components/aufgaben/aufgaben-liste' import { Schnellerfassung } from '@/components/aufgaben/schnellerfassung' +import { Fortschrittsbalken } from '@/components/fortschrittsbalken' import { Card, CardBeschreibung, @@ -16,6 +17,7 @@ import { projekteZurAuswahlLaden, zaehlstaende, } from '@/server/abfragen/aufgaben' +import { belegungHeute, hatKalenderkonto } from '@/server/abfragen/kalender' import { verlangeAnmeldung } from '@/server/berechtigung' import { db } from '@/server/db' import { jetzt } from '@/server/zeitgeber' @@ -24,16 +26,19 @@ export default async function StartSeite() { const benutzer = await verlangeAnmeldung('/') const heute = jetzt() - const [alleOffenen, bereiche, projekte, zahlen, bereichsListe] = await Promise.all([ - aufgabenLaden({ nurOffen: true, ohneIdeen: true }, 200), - bereicheLaden(), - projekteZurAuswahlLaden(), - zaehlstaende(), - db.bereich.findMany({ - where: { aktiv: true }, - orderBy: [{ reihenfolge: 'asc' }, { name: 'asc' }], - }), - ]) + const [alleOffenen, bereiche, projekte, zahlen, bereichsListe, belegung, mitKalender] = + await Promise.all([ + aufgabenLaden({ nurOffen: true, ohneIdeen: true }, 200), + bereicheLaden(), + projekteZurAuswahlLaden(), + zaehlstaende(), + db.bereich.findMany({ + where: { aktiv: true }, + orderBy: [{ reihenfolge: 'asc' }, { name: 'asc' }], + }), + belegungHeute(benutzer.id, heute), + hatKalenderkonto(benutzer.id), + ]) // Was jetzt zählt: überfällig, heute oder morgen fällig. const dran = alleOffenen.filter( @@ -108,9 +113,10 @@ export default async function StartSeite() {