generator client { provider = "prisma-client-js" binaryTargets = ["darwin-arm64", "linux-arm64-openssl-3.0.x", "debian-openssl-3.0.x", "linux-musl-openssl-3.0.x"] output = "../node_modules/.prisma/client" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model Admin { id Int @id @default(1) password String } model EmailConfig { id Int @id @default(1) subject String @default("Praktikumsplatz-Zusage") template String @default("Sehr geehrte/r {anrede} {nachname},\n\nwir freuen uns, Ihnen mitteilen zu können, dass Ihre Bewerbung für ein Praktikum erfolgreich war.\n\nSie wurden für das Praktikum bei folgender Dienststelle angenommen:\n{dienststelle}\n\nWeitere Informationen erhalten Sie in den kommenden Tagen.\n\nMit freundlichen Grüßen\nIhr Praktikumsteam") @@map("email_config") } model Dienststelle { id Int @id @default(autoincrement()) name String @unique plaetze Int @default(0) // Standard-Plätze, wird nicht mehr direkt verwendet anmeldungenWunsch1 Anmeldung[] @relation("Wunsch1") anmeldungenWunsch2 Anmeldung[] @relation("Wunsch2") anmeldungenWunsch3 Anmeldung[] @relation("Wunsch3") zugewiesene Anmeldung[] @relation("Zugewiesen") // Neue Relation zu ZeitraumPlaetze zeitraumPlaetze ZeitraumPlaetze[] } model Praktikumszeitraum { id Int @id @default(autoincrement()) bezeichnung String @unique // z. B. "Frühjahr 2025" startDatum DateTime endDatum DateTime anmeldungen Anmeldung[] @relation("PraktikumszeitraumAnmeldungen") // Neue Relation zu ZeitraumPlaetze zeitraumPlaetze ZeitraumPlaetze[] } // Neue Zwischentabelle für Plätze pro Zeitraum und Dienststelle model ZeitraumPlaetze { id Int @id @default(autoincrement()) zeitraumId Int dienststelleId Int plaetze Int @default(0) zeitraum Praktikumszeitraum @relation(fields: [zeitraumId], references: [id], onDelete: Cascade) dienststelle Dienststelle @relation(fields: [dienststelleId], references: [id], onDelete: Cascade) // Unique constraint: Pro Zeitraum und Dienststelle nur ein Eintrag @@unique([zeitraumId, dienststelleId]) @@index([zeitraumId]) @@index([dienststelleId]) @@map("zeitraum_plaetze") } // Erweiterte Status-Enum für bessere Nachverfolgung enum Status { OFFEN // pending - neu eingegangen BEARBEITUNG // processing - wird gerade bearbeitet ANGENOMMEN // accepted - wurde angenommen ABGELEHNT // rejected - wurde abgelehnt } model Anmeldung { id Int @id @default(autoincrement()) anrede String vorname String nachname String geburtsdatum String // Neu hinzugefügt strasse String // Neu hinzugefügt hausnummer String // Neu hinzugefügt ort String // Neu hinzugefügt plz String // Neu hinzugefügt telefon String // Neu hinzugefügt email String schulart String // Neu hinzugefügt schulklasse String? // Neu hinzugefügt noteDeutsch Int // Geändert von String zu Int noteMathe Int // Geändert von String zu Int sozialverhalten String? motivation String? // Neu hinzugefügt alter Int? // Neu hinzugefügt für Altersvalidierung status Status @default(OFFEN) // Neue Felder für Status-Tracking processedAt DateTime? // Wann wurde sie bearbeitet // Praktikumszeitraum Relation praktikumId Int? praktikum Praktikumszeitraum? @relation("PraktikumszeitraumAnmeldungen", fields: [praktikumId], references: [id]) // Dienststellen Relationen zugewiesenId Int? zugewiesen Dienststelle? @relation("Zugewiesen", fields: [zugewiesenId], references: [id]) wunsch1Id Int? wunsch1 Dienststelle? @relation("Wunsch1", fields: [wunsch1Id], references: [id]) wunsch2Id Int? wunsch2 Dienststelle? @relation("Wunsch2", fields: [wunsch2Id], references: [id]) wunsch3Id Int? wunsch3 Dienststelle? @relation("Wunsch3", fields: [wunsch3Id], references: [id]) timestamp DateTime @default(now()) pdfs PdfDatei[] // Indizes für bessere Performance @@index([status]) @@index([processedAt]) @@index([zugewiesenId]) @@map("anmeldungen") } model PdfDatei { id Int @id @default(autoincrement()) pfad String anmeldung Anmeldung @relation(fields: [anmeldungId], references: [id], onDelete: Cascade) anmeldungId Int }