323 lines
9.1 KiB
Text
323 lines
9.1 KiB
Text
// 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")
|
|
}
|