From 4d0f83ff51310a600f1ad8a3ab0e67ff7fbc64d5 Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Thu, 10 Sep 2026 16:33:34 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20Demo-Daten=20f=C3=BCr=20die=20neuen=20?= =?UTF-8?q?Seiten=20erweitern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erfundene Aufgaben mit einer Mischung aus überfällig, heute, später und ohne Termin, dazu Inbox, Ideen und ein Projekt mit Arbeitspaketen und einem Meilenstein. Die Fälligkeiten stehen als Versatz zum festen Demo-Zeitpunkt, damit die Bilder zwischen zwei Läufen gleich bleiben. Eine Aufgabe trägt eine erfundene Zammad-Herkunft, damit die Darstellung der Quelle in den Bildern zu sehen ist. Co-Authored-By: Claude Opus 5 (1M context) --- prisma/demo-seed.ts | 183 +++++++++++++++++++++++++++++++++++++ screenshots/bilder.spec.ts | 4 + 2 files changed, 187 insertions(+) diff --git a/prisma/demo-seed.ts b/prisma/demo-seed.ts index 2b5592c..068b213 100644 --- a/prisma/demo-seed.ts +++ b/prisma/demo-seed.ts @@ -105,6 +105,118 @@ const PROTOKOLL = [ }, ] +/** + * Erfundene Aufgaben. Die Fälligkeit steht als Versatz in Tagen zum festen + * Demo-Zeitpunkt, damit die Bilder immer dieselbe Mischung aus überfällig, + * heute und später zeigen. + */ +const AUFGABEN = [ + // Überfällig + { + titel: 'Angebot Heizungstausch nachfassen', + bereich: 'Gewerbe', + versatz: -3, + prioritaet: 2, + aufwand: 30, + }, + { + titel: 'Rechnung 2026-114 korrigieren', + bereich: 'Gewerbe', + versatz: -1, + prioritaet: 1, + aufwand: 20, + }, + // Heute und morgen + { + titel: 'Wochenbericht an die Geschäftsführung', + bereich: 'Firma', + versatz: 0, + prioritaet: 2, + aufwand: 45, + }, + { + titel: 'Rückruf Frau Sonnenberg', + bereich: 'Firma', + versatz: 0, + prioritaet: 1, + aufwand: 15, + }, + { + titel: 'Zahnarzttermin bestätigen', + bereich: 'Privat', + versatz: 1, + prioritaet: 3, + aufwand: 10, + }, + // Später + { + titel: 'Backup-Strategie für den Server überdenken', + bereich: 'Homelab', + versatz: 9, + prioritaet: 4, + aufwand: 120, + }, + { + titel: 'Reifen wechseln lassen', + bereich: 'Privat', + versatz: 14, + prioritaet: 3, + aufwand: 60, + }, + // Ohne Termin + { + titel: 'Ablage im Keller sortieren', + bereich: 'Privat', + versatz: null, + prioritaet: 5, + aufwand: 180, + }, + // Erledigt + { + titel: 'Steuerunterlagen zusammenstellen', + bereich: 'Gewerbe', + versatz: -5, + prioritaet: 3, + aufwand: 90, + status: 'ERLEDIGT' as const, + }, +] + +/** Liegt noch in der Inbox – ohne Bereich. */ +const INBOX = [ + { titel: 'Sicherungskasten beschriften' }, + { titel: 'Angebot Netzwerkschrank einholen' }, +] + +const IDEEN = [ + { titel: 'Newsletter für Bestandskunden' }, + { titel: 'Werkstatt-Podcast aufnehmen' }, + { titel: 'Regale im Lager neu beschriften' }, +] + +const PROJEKT_AUFGABEN = [ + { + titel: 'Anforderungen sammeln', + typ: 'ARBEITSPAKET' as const, + status: 'ERLEDIGT' as const, + }, + { + titel: 'Entwurf abstimmen', + typ: 'ARBEITSPAKET' as const, + status: 'ERLEDIGT' as const, + }, + { titel: 'Texte schreiben', typ: 'ARBEITSPAKET' as const, status: 'OFFEN' as const }, + { titel: 'Fotos beauftragen', typ: 'ARBEITSPAKET' as const, status: 'WARTET' as const }, + { titel: 'Seite ist online', typ: 'MEILENSTEIN' as const, status: 'OFFEN' as const }, +] + +/** Fester Bezugspunkt, passend zu src/server/zeitgeber.ts. */ +const DEMO_JETZT = new Date('2026-03-17T08:20:00.000Z') + +function tageVersetzt(tage: number): Date { + return new Date(DEMO_JETZT.getTime() + tage * 24 * 60 * 60 * 1000) +} + async function main(): Promise { console.log('Demo-Daten einspielen.') @@ -158,6 +270,77 @@ async function main(): Promise { }, }) + // --- Aufgaben, Ideen und ein Projekt ------------------------------------- + await db.aufgabe.deleteMany({}) + await db.projekt.deleteMany({}) + + const bereichsKennung = new Map( + (await db.bereich.findMany({ select: { id: true, name: true } })).map((b) => [ + b.name, + b.id, + ]), + ) + + for (const eintrag of AUFGABEN) { + await db.aufgabe.create({ + data: { + titel: eintrag.titel, + bereichId: bereichsKennung.get(eintrag.bereich) ?? null, + prioritaet: eintrag.prioritaet, + aufwandMinuten: eintrag.aufwand, + faelligAm: eintrag.versatz === null ? null : tageVersetzt(eintrag.versatz), + status: eintrag.status ?? 'OFFEN', + erledigtAm: eintrag.status === 'ERLEDIGT' ? tageVersetzt(-4) : null, + }, + }) + } + + for (const eintrag of INBOX) { + await db.aufgabe.create({ data: { titel: eintrag.titel } }) + } + + for (const eintrag of IDEEN) { + await db.aufgabe.create({ data: { titel: eintrag.titel, typ: 'IDEE' } }) + } + + const projekt = await db.projekt.create({ + data: { + name: 'Website neu aufsetzen', + beschreibung: + 'Der alte Auftritt ist von 2019 und auf dem Handy kaum lesbar. Fertig ist es, wenn die neue Seite online ist und das Kontaktformular ankommt.', + bereichId: bereichsKennung.get('Gewerbe') ?? null, + zielAm: tageVersetzt(45), + }, + }) + + for (const eintrag of PROJEKT_AUFGABEN) { + await db.aufgabe.create({ + data: { + titel: eintrag.titel, + typ: eintrag.typ, + status: eintrag.status, + projektId: projekt.id, + bereichId: bereichsKennung.get('Gewerbe') ?? null, + aufwandMinuten: eintrag.typ === 'MEILENSTEIN' ? null : 120, + erledigtAm: eintrag.status === 'ERLEDIGT' ? tageVersetzt(-7) : null, + }, + }) + } + + // Eine Aufgabe, die von außen kam – zeigt die Herkunft in der Liste. + await db.aufgabe.create({ + data: { + titel: 'Störung Klimagerät Serverraum prüfen', + bereichId: bereichsKennung.get('Firma') ?? null, + prioritaet: 2, + aufwandMinuten: 60, + faelligAm: tageVersetzt(2), + quelle: 'ZAMMAD', + quelleRef: 'demo-38421', + quelleUrl: 'https://zammad.example.invalid/ticket/38421', + }, + }) + console.log(`Demo-Daten stehen bereit. Anmeldung: ${DEMO_EMAIL}`) } diff --git a/screenshots/bilder.spec.ts b/screenshots/bilder.spec.ts index 067f83f..a55d80b 100644 --- a/screenshots/bilder.spec.ts +++ b/screenshots/bilder.spec.ts @@ -29,6 +29,10 @@ type Aufnahme = { const AUFNAHMEN: Aufnahme[] = [ { name: 'anmelden', pfad: '/anmelden' }, { name: 'start', pfad: '/' }, + { name: 'inbox', pfad: '/inbox' }, + { name: 'aufgaben', pfad: '/aufgaben' }, + { name: 'projekte', pfad: '/projekte' }, + { name: 'ideen', pfad: '/ideen' }, { name: 'bereiche', pfad: '/bereiche' }, { name: 'einstellungen', pfad: '/einstellungen' }, { name: 'protokoll', pfad: '/verwaltung/protokoll' },