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' },