// Prisma Schema für Architektur-Planungs-App // Unterstützt PostgreSQL mit PostGIS generator client { provider = "prisma-client-js" previewFeatures = ["postgresqlExtensions"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") extensions = [postgis] } // ============================================================================ // ENUMS // ============================================================================ enum StatusProzess { EINGANG ANALYSE STUDIE PLANUNG BAURECHTSVERFAHREN UMSETZUNG ARCHIV } enum DokumentTyp { DATEI URL } enum TagTyp { KATASTER_OBJEKTE KATASTER_WERKELEITUNGEN KATASTER_BELASTETE_STANDORTE KATASTER_BAEUME ZONENPLAN PGB BZO PARKPLATZVERORDNUNG EIGENTUEMER_AUSKUNFT GRUNDBUCHAUSZUG } enum GeoTagTyp { REFERENZPUNKT_KAT1 REFERENZPUNKT_KAT2 REFERENZPUNKT_KAT3 GEOMETER_AUFNAHME } enum JaNein { LEER JA NEIN } // ============================================================================ // MODELS // ============================================================================ model Projekt { id String @id @default(uuid()) @db.Uuid label String statusProzess StatusProzess[] // Relationships perimeter ParzelleInProjekt[] dokumenteBauherrschaft ProjektDokumentBauherrschaft[] dokumentePlanung ProjektDokumentPlanung[] geoBaulinie GeoPunkt[] kontextInformationen Kontext[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("projekt") } model Parzelle { id String @id @default(uuid()) @db.Uuid label String parzellenNummern String[] eigentuemerschaaft String? strasseNr String? // Geografischer Kontext landId String? @db.Uuid kantonId String? @db.Uuid gemeindeId String? @db.Uuid // Geometrie (als GeoJSON oder WKT gespeichert) // Für echte PostGIS Integration: Unsupported.("geometry(POLYGON, 2056)") geoUmfangJson Json? // Alternative: GeoJSON Format // Bauliche Parameter bauzone String? az Float? bz Float? vollgeschossZahl Int? anrechenbarDachgeschoss Float? anrechenbarUntergeschoss Float? gebaeudehoehe_max Float? // Regelungen regelnGrenzabstand String? regelnMehrlaengenzuschlag String? regelnMehrhoehenzuschlag String? // Schutzzonen hochwasserschutzzone String? laermschutzzone String? grundwasserschutzzone String? // Eigenschaften parzelleBebaut JaNein? parzelleErschlossen JaNein? hanglage JaNein? // Relationships projekte ParzelleInProjekt[] nachbarEigentuemer_von ParzelleNachbar[] @relation("ParzelleNachbarVon") nachbarEigentuemer_zu ParzelleNachbar[] @relation("ParzelleNachbarZu") kontextLand Land? @relation(fields: [landId], references: [id]) kontextKanton Kanton? @relation(fields: [kantonId], references: [id]) kontextGemeinde Gemeinde? @relation(fields: [gemeindeId], references: [id]) spezifischeDokumente ParzelleDokument[] kontextInformationen Kontext[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("parzelle") } model Dokument { id String @id @default(uuid()) @db.Uuid label String versionsbezeichnung String? typ DokumentTyp format String? dokumentReferenz String tags TagTyp[] // Relationships projekteBauherrschaft ProjektDokumentBauherrschaft[] projektePlanung ProjektDokumentPlanung[] parzellen ParzelleDokument[] // Spezifische Dokumente für Gemeinde/Kanton gemeindeBzoAktuell Gemeinde[] @relation("GemeindeBZOAktuell") gemeindeBzoRevision Gemeinde[] @relation("GemeindeBZORevision") kantonBaureglementAktuell Kanton[] @relation("KantonBaureglementAktuell") kantonBaureglementRevision Kanton[] @relation("KantonBaureglementRevision") kantonBauverordnungAktuell Kanton[] @relation("KantonBauverordnungAktuell") kantonBauverordnungRevision Kanton[] @relation("KantonBauverordnungRevision") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("dokument") } model GeoPunkt { id String @id @default(uuid()) @db.Uuid x Float y Float z Float? referenzen GeoTagTyp[] // Foreign Keys projektId String? @db.Uuid projekt Projekt? @relation(fields: [projektId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("geo_punkt") } model Kontext { id String @id @default(uuid()) @db.Uuid thema String inhalt String @db.Text // Polymorphe Beziehung (kann zu verschiedenen Entitäten gehören) projektId String? @db.Uuid parzelleId String? @db.Uuid landId String? @db.Uuid kantonId String? @db.Uuid gemeindeId String? @db.Uuid // Relationships projekt Projekt? @relation(fields: [projektId], references: [id], onDelete: Cascade) parzelle Parzelle? @relation(fields: [parzelleId], references: [id], onDelete: Cascade) land Land? @relation(fields: [landId], references: [id], onDelete: Cascade) kanton Kanton? @relation(fields: [kantonId], references: [id], onDelete: Cascade) gemeinde Gemeinde? @relation(fields: [gemeindeId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("kontext") } model Gemeinde { id String @id @default(uuid()) @db.Uuid label String plz String? // BZO Dokumente bzoAktuellId String? @db.Uuid bzoRevisionId String? @db.Uuid // Relationships parzellen Parzelle[] kontextInformationen Kontext[] bzoAktuell Dokument? @relation("GemeindeBZOAktuell", fields: [bzoAktuellId], references: [id]) bzoRevision Dokument? @relation("GemeindeBZORevision", fields: [bzoRevisionId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("gemeinde") } model Kanton { id String @id @default(uuid()) @db.Uuid label String // Regelwerke baureglementAktuellId String? @db.Uuid baureglementRevisionId String? @db.Uuid bauverordnungAktuellId String? @db.Uuid bauverordnungRevisionId String? @db.Uuid // Relationships parzellen Parzelle[] kontextInformationen Kontext[] baureglementAktuell Dokument? @relation("KantonBaureglementAktuell", fields: [baureglementAktuellId], references: [id]) baureglementRevision Dokument? @relation("KantonBaureglementRevision", fields: [baureglementRevisionId], references: [id]) bauverordnungAktuell Dokument? @relation("KantonBauverordnungAktuell", fields: [bauverordnungAktuellId], references: [id]) bauverordnungRevision Dokument? @relation("KantonBauverordnungRevision", fields: [bauverordnungRevisionId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("kanton") } model Land { id String @id @default(uuid()) @db.Uuid label String // Relationships parzellen Parzelle[] kontextInformationen Kontext[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("land") } // ============================================================================ // JUNCTION TABLES (Many-to-Many) // ============================================================================ model ParzelleInProjekt { projektId String @db.Uuid parzelleId String @db.Uuid projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade) parzelle Parzelle @relation(fields: [parzelleId], references: [id], onDelete: Cascade) @@id([projektId, parzelleId]) @@map("projekt_parzelle") } model ParzelleNachbar { parzelleId String @db.Uuid nachbarId String @db.Uuid parzelle Parzelle @relation("ParzelleNachbarVon", fields: [parzelleId], references: [id], onDelete: Cascade) nachbar Parzelle @relation("ParzelleNachbarZu", fields: [nachbarId], references: [id], onDelete: Cascade) @@id([parzelleId, nachbarId]) @@map("parzelle_nachbar") } model ProjektDokumentBauherrschaft { projektId String @db.Uuid dokumentId String @db.Uuid projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade) dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade) @@id([projektId, dokumentId]) @@map("projekt_dokument_bauherrschaft") } model ProjektDokumentPlanung { projektId String @db.Uuid dokumentId String @db.Uuid projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade) dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade) @@id([projektId, dokumentId]) @@map("projekt_dokument_planung") } model ParzelleDokument { parzelleId String @db.Uuid dokumentId String @db.Uuid parzelle Parzelle @relation(fields: [parzelleId], references: [id], onDelete: Cascade) dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade) @@id([parzelleId, dokumentId]) @@map("parzelle_dokument") }