Astro build funktioniert

This commit is contained in:
Moritz Utcke
2025-02-22 10:20:20 +11:00
parent fa272cf0f3
commit 785e0f78ff
193 changed files with 4003 additions and 773 deletions

1
prisma/null.ts Normal file
View File

@@ -0,0 +1 @@
export const x = 5

View File

@@ -0,0 +1,36 @@
import { generatorHandler } from "@prisma/generator-helper";
import fs from "fs";
import path from "path";
const header = `// This file was generated by a custom prisma generator, do not edit manually.\n`;
generatorHandler({
onManifest() {
return {
defaultOutput: "./enums/index.ts",
prettyName: "Prisma Enum Generator",
};
},
async onGenerate(options) {
const enums = options.dmmf.datamodel.enums;
const output = enums.map((e) => {
let enumString = `export enum ${e.name} {\n`;
e.values.forEach(({ name: value }) => {
enumString += ` ${value} = "${value}",\n`;
});
enumString += `};\n\n`;
return enumString;
});
const outputFile = options.generator.output;
if (!outputFile || !outputFile.value) {
throw new Error("No output file specified");
}
const outputPath = path.resolve(outputFile.value);
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
fs.writeFileSync(outputPath, header + output.join("\n"), "utf-8");
},
});

View File

@@ -0,0 +1,11 @@
model Anteilshaber {
id Int @id @default(autoincrement())
benutzer_id Int
rolle String? @db.VarChar
privilegien BigInt?
uid String @unique @default(dbgenerated("'ant-' || gen_random_uuid()"))
benutzer Benutzer @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
objekt_id Int
objekt Objekt @relation(fields: [objekt_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,14 @@
model ApiRequests {
id Int @id @default(autoincrement())
date DateTime @default(now()) @db.Timestamp(6)
ip String @db.VarChar(50)
method String @db.VarChar(10)
path String @db.VarChar(100)
status Int
responseTime Float
responseSize Int
userAgent String @db.VarChar(500)
user_id Int?
user Benutzer? @relation(fields: [user_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,150 @@
enum Heizungsstatus {
BEHEIZT
UNBEHEIZT
NICHT_VORHANDEN
}
enum Lueftungskonzept {
Fensterlueftung
Schachtlueftung
LueftungsanlageMitWaermerueckgewinnung
LueftungsanlageOhneWaermerueckgewinnung
}
model Aufnahme {
id Int @id @default(autoincrement())
/// @zod.describe("UID der Gebäude Aufnahme")
uid String @unique @default(dbgenerated("'auf-' || gen_random_uuid()"))
benutzer_id Int?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen")
ausweisart Ausweisart?
/// @zod.describe("Art des Gebäudes und seiner primären Nutzungsart")
gebaeudetyp String? @db.VarChar
/// @zod.describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil")
gebaeudeteil String? @db.VarChar
/// @zod.describe("Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde")
baujahr_gebaeude Int[]
/// @zod.describe("Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde")
baujahr_heizung Int[]
/// @zod.describe("Alle Jahre in denen die Klimaanlage eingebaut oder grundlegend verändert wurde")
baujahr_klima Int[]
/// @zod.describe("Anzahl der (Wohn)Einheiten im Gebäude")
einheiten Int?
/// @zod.describe("Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden")
flaeche Int?
/// @zod.describe("(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche")
nutzflaeche Int?
/// @zod.describe("Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen")
saniert Boolean?
/// @zod.describe("Ob ein Keller vorhanden, beheizt oder unbeheizt ist")
keller Heizungsstatus?
/// @zod.describe("Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist")
dachgeschoss Heizungsstatus?
/// @zod.describe("Art der Gebäudelüftung")
lueftung Lueftungskonzept?
/// @zod.describe("Art der Gebäudekühlung")
kuehlung String? @db.VarChar(50)
/// @zod.describe("Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr")
leerstand Int?
/// @zod.describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
alternative_heizung Boolean?
/// @zod.describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
alternative_warmwasser Boolean?
/// @zod.describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
alternative_lueftung Boolean?
/// @zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
alternative_kuehlung Boolean?
/// @zod.describe("Genutzer Brennstoff der primären Energiequelle")
brennstoff_1 String? @db.VarChar(50)
/// @zod.describe("Genutzer Brennstoff der sekundären Energiequelle")
brennstoff_2 String? @db.VarChar(50)
boxpruefung Boolean? @default(false)
/// @zod.describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes")
energieeffizienzklasse String? @db.VarChar(5)
/// @zod.describe("Datum an dem der Kunde den Ausweis erstellt hat")
erstellungsdatum DateTime? @default(now())
/// @zod.describe("Datum an dem der Aussteller den Ausweis ausgestellt hat")
ausstellungsdatum DateTime?
/// @zod.describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen")
zentralheizung Boolean?
/// @zod.describe("Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen")
solarsystem_warmwasser Boolean?
/// @zod.describe("Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
warmwasser_rohre_gedaemmt Boolean?
/// @zod.describe("Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen")
niedertemperatur_kessel Boolean?
/// @zod.describe("Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen")
brennwert_kessel Boolean?
/// @zod.describe("Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
heizungsrohre_gedaemmt Boolean?
standard_kessel Boolean?
/// @zod.describe("Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen")
waermepumpe Boolean?
/// @zod.describe("Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen")
raum_temperatur_regler Boolean?
/// @zod.describe("Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen")
photovoltaik Boolean?
/// @zod.describe("Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen")
durchlauf_erhitzer Boolean?
einzelofen Boolean?
/// @zod.describe("Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen")
zirkulation Boolean?
/// @zod.describe("Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen")
einfach_verglasung Boolean?
/// @zod.describe("Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen")
dreifach_verglasung Boolean?
/// @zod.describe("Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen")
fenster_teilweise_undicht Boolean?
/// @zod.describe("Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen")
doppel_verglasung Boolean?
/// @zod.describe("Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen")
fenster_dicht Boolean?
/// @zod.describe("Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen")
rolllaeden_kaesten_gedaemmt Boolean?
/// @zod.describe("Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen")
isolier_verglasung Boolean?
/// @zod.describe("Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen")
tueren_undicht Boolean?
/// @zod.describe("Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen")
tueren_dicht Boolean?
/// @zod.describe("Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
dachgeschoss_gedaemmt Boolean?
/// @zod.describe("Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
keller_decke_gedaemmt Boolean?
/// @zod.describe("Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
keller_wand_gedaemmt Boolean?
/// @zod.describe("Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
aussenwand_gedaemmt Boolean?
/// @zod.describe("Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
oberste_geschossdecke_gedaemmt Boolean?
/// @zod.describe("Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen")
aussenwand_min_12cm_gedaemmt Boolean?
/// @zod.describe("Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")
dachgeschoss_min_12cm_gedaemmt Boolean?
/// @zod.describe("Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")
oberste_geschossdecke_min_12cm_gedaemmt Boolean?
events Event[]
bilder Bild[]
unterlagen Unterlage[]
bedarfsausweise_wohnen BedarfsausweisWohnen[]
verbrauchsausweise_gewerbe VerbrauchsausweisGewerbe[]
verbrauchsausweise_wohnen VerbrauchsausweisWohnen[]
geg_nachweise_wohnen GEGNachweisWohnen[]
geg_nachweise_gewerbe GEGNachweisGewerbe[]
bedarfsausweise_gewerbe BedarfsausweisGewerbe[]
objekt_id Int
objekt Objekt @relation(fields: [objekt_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,16 @@
model BedarfsausweisGewerbe {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'bag-' || gen_random_uuid()"))
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
aufnahme_id Int @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
geg_einpreisung_id Int? @unique
geg_einpreisung GEGEinpreisung? @relation(fields: [geg_einpreisung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,86 @@
model BedarfsausweisWohnen {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'baw-' || gen_random_uuid()"))
benutzer_id Int?
ausstellgrund Ausstellgrund?
registriernummer String? @db.VarChar
alternative_heizung Boolean?
alternative_warmwasser Boolean?
alternative_lueftung Boolean?
alternative_kuehlung Boolean?
anzahl_vollgeschosse Int?
geschosshoehe Float?
anzahl_gauben Int?
breite_gauben Float?
masse_a Float?
masse_b Float?
masse_c Float?
masse_d Float?
masse_e Float?
masse_f Float?
fensterflaeche_so_sw Float?
fensterflaeche_nw_no Float?
aussenwandflaeche_unbeheizt Float?
dachflaeche Float?
deckenflaeche Float?
dach_u_wert Float?
decke_u_wert Float?
aussenwand_flaeche Float?
aussenwand_u_wert Float?
fussboden_flaeche Float?
fussboden_u_wert Float?
volumen Float?
dicht Boolean?
fenster_flaeche_1 Float?
fenster_art_1 Float?
fenster_flaeche_2 Float?
fenster_art_2 Float?
dachfenster_flaeche Float?
dachfenster_art Float?
haustuer_flaeche Float?
haustuer_art Float?
dach_bauart String? @db.VarChar
decke_bauart String? @db.VarChar
dach_daemmung Float?
decke_daemmung Float?
aussenwand_daemmung Float?
boden_daemmung Float?
aussenwand_bauart String? @db.VarChar
boden_bauart String? @db.VarChar
warmwasser_verteilung String? @db.VarChar
warmwasser_speicherung String? @db.VarChar
warmwasser_erzeugung String? @db.VarChar
heizung_zentral Boolean?
heizung_verteilung String? @db.VarChar
heizung_speicherung String? @db.VarChar
waerme_erzeugung_heizung String? @db.VarChar
anteil_zusatzheizung Float?
kollektor_flaeche Float?
ausgestellt Boolean? @default(false)
/// @zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")
storniert Boolean? @default(false)
/// @zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")
bestellt Boolean? @default(false)
/// @zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")
zurueckgestellt Boolean? @default(false)
/// @zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")
prueftext String? @db.VarChar(1000)
beschreibung String? @db.Text
/// @zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")
kontrolldatei_angefragt Boolean? @default(false)
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("ID der korrespondierenden Gebäudeaufnahme")
aufnahme_id Int @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,52 @@
enum BenutzerRolle {
USER
ADMIN
}
model Benutzer {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'usr-' || gen_random_uuid()"))
name String? @db.VarChar(50)
vorname String? @db.VarChar(50)
email String @unique(map: "benutzer_email_idx") @db.VarChar(255)
passwort String @db.VarChar(255)
profilbild String? @db.VarChar
plz String? @db.VarChar(5)
ort String? @db.VarChar(50)
adresse String? @db.VarChar(100)
telefon String? @db.VarChar(50)
anrede String? @db.VarChar(50)
rolle BenutzerRolle @default(USER)
firma String?
lex_office_id String?
Anteilshaber Anteilshaber[] @ignore
BedarfsausweisWohnen BedarfsausweisWohnen[]
documenttemplates documenttemplates[]
objekte Objekt[]
rechnungen Rechnung[]
tokens tokens[]
VerbrauchsausweisGewerbe VerbrauchsausweisGewerbe[]
VerbrauchsausweisWohnen VerbrauchsausweisWohnen[]
ApiRequests ApiRequests[]
RefreshTokens RefreshTokens[]
aufnahmen Aufnahme[]
// ---------------------------------- GEG ----------------------------------
geg_einpreisungen GEGEinpreisung[]
geg_nachweise_gewerbe GEGNachweisGewerbe[]
geg_nachweise_wohnen GEGNachweisWohnen[]
bedarfsausweise_gewerbe BedarfsausweisGewerbe[]
ErstellteTickets Tickets[] @relation("ErstellteTickets")
BearbeiteteTickets Tickets[] @relation("BearbeiteteTickets")
events Event[]
@@map("benutzer")
}

16
prisma/schema/Bild.prisma Normal file
View File

@@ -0,0 +1,16 @@
enum BilderKategorie {
Heizung
Fenster
Gebaeude
Daemmung
}
model Bild {
id Int @id @default(autoincrement())
kategorie BilderKategorie
uid String @unique @default(dbgenerated("'img-' || gen_random_uuid()"))
aufnahme_id Int?
aufnahme Aufnahme? @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,20 @@
// Dieses Model wird für getriggerte Events verwendet
// Hier werden beispielsweise Events wie "Nachricht Verschickt" gespeichert.
// Diese Events werden dann in der Admin-Oberfläche angezeigt.
model Event {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'evt-' || gen_random_uuid()"))
date DateTime @default(now()) @db.Timestamp(6)
title String @db.VarChar(255)
description String? @db.Text
// Verlinkung des Gebäudes
aufnahme_id Int
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
// Verlinkung des Benutzers
benutzer_id Int?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,36 @@
enum Einpreisungsstatus {
open
canceled
pending
expired
}
model GEGEinpreisung {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'gge-' || gen_random_uuid()"))
empfaenger String? @db.VarChar
strasse String? @db.VarChar
plz String? @db.VarChar
ort String? @db.VarChar
zusatzzeile String? @db.VarChar
telefon String? @db.VarChar
email String? @db.VarChar
abweichende_versand_adresse Boolean? @default(false)
versand_empfaenger String? @db.VarChar
versand_strasse String? @db.VarChar
versand_plz String? @db.VarChar
versand_ort String? @db.VarChar
versand_zusatzzeile String? @db.VarChar
status Einpreisungsstatus
geg_nachweis_wohnen GEGNachweisWohnen?
geg_nachweis_gewerbe GEGNachweisGewerbe?
bedarfsausweis_gewerbe BedarfsausweisGewerbe?
/// @zod.describe("Die ID des Benutzers, der diese Einpreisung bekommt.")
benutzer_id Int?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,30 @@
model GEGNachweisGewerbe {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'gnw-' || gen_random_uuid()"))
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?
/// @zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")
keller_beheizt Boolean?
/// @zod.describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen")
storniert Boolean? @default(false)
/// @zod.describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen")
bestellt Boolean? @default(false)
/// @zod.describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")
zurueckgestellt Boolean? @default(false)
/// @zod.describe("Beschreibung des Bauvorhabens")
beschreibung String? @db.Text
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
aufnahme_id Int @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
geg_einpreisung_id Int? @unique
geg_einpreisung GEGEinpreisung? @relation(fields: [geg_einpreisung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,30 @@
model GEGNachweisWohnen {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'gnw-' || gen_random_uuid()"))
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?
/// @zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")
keller_beheizt Boolean?
/// @zod.describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen")
storniert Boolean? @default(false)
/// @zod.describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen")
bestellt Boolean? @default(false)
/// @zod.describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")
zurueckgestellt Boolean? @default(false)
/// @zod.describe("Beschreibung des Bauvorhabens")
beschreibung String? @db.Text
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
aufnahme_id Int @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
geg_einpreisung_id Int? @unique
geg_einpreisung GEGEinpreisung? @relation(fields: [geg_einpreisung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,11 @@
model Klimafaktoren {
id Int @id @default(autoincrement())
plz String @db.VarChar(5)
month Int
year Int
klimafaktor Float @default(1)
// Mithilfe eines composite keys können wir einfach den Monat und das Jahr mit der Postleitzahl verknüpfen
// somit müssen wir nicht mehr eine Zeile für jeden Monat anlegen.
@@unique([plz, month, year])
}

View File

@@ -0,0 +1,21 @@
model Objekt {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'obj-' || gen_random_uuid()"))
benutzer_id Int?
latitude Float?
longitude Float?
/// @zod.describe("Postleitzahl des Gebäudes")
plz String? @db.VarChar(5)
/// @zod.describe("Ort des Gebäudes")
ort String? @db.VarChar(50)
/// @zod.describe("Adresse (Straße und Hausnummer) des Gebäudes")
adresse String? @db.VarChar(100)
erstellungsdatum DateTime? @default(now())
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id])
aufnahmen Aufnahme[]
anteilshaber Anteilshaber[]
}

View File

@@ -0,0 +1,9 @@
model Postleitzahlen {
id Int @id @default(autoincrement())
plz String @db.VarChar(5)
stadt String @db.VarChar(100)
bundesland String @db.VarChar(100)
landkreis String @db.VarChar(100)
lat Float
lon Float
}

View File

@@ -0,0 +1,66 @@
enum Bezahlmethoden {
paypal
giropay
sofort
creditcard
rechnung
}
enum Rechnungsstatus {
open
canceled
pending
authorized
expired
failed
paid
}
enum AusweisTyp {
Standard
Beratung
Offline
}
model Rechnung {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'inv-' || gen_random_uuid()"))
benutzer_id Int
empfaenger String? @db.VarChar
strasse String? @db.VarChar
plz String? @db.VarChar
ort String? @db.VarChar
zusatzzeile String? @db.VarChar
telefon String? @db.VarChar
email String? @db.VarChar
abweichende_versand_adresse Boolean? @default(false)
versand_empfaenger String? @db.VarChar
versand_strasse String? @db.VarChar
versand_plz String? @db.VarChar
versand_ort String? @db.VarChar
versand_zusatzzeile String? @db.VarChar
bezahlmethode Bezahlmethoden
status Rechnungsstatus
services Service[]
ausweistyp AusweisTyp @default(Standard)
betrag Float
erstellt_am DateTime @default(now())
bezahlt_am DateTime?
storniert_am DateTime?
transaktions_referenz String? @unique @db.VarChar
benutzer Benutzer @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
verbrauchsausweis_wohnen VerbrauchsausweisWohnen?
verbrauchsausweis_gewerbe VerbrauchsausweisGewerbe?
bedarfsausweis_wohnen BedarfsausweisWohnen?
bedarfsausweis_gewerbe BedarfsausweisGewerbe?
geg_nachweis_gewerbe GEGNachweisGewerbe?
geg_nachweis_wohnen GEGNachweisWohnen?
}

View File

@@ -0,0 +1,13 @@
model RefreshTokens {
id Int @id @default(autoincrement())
benutzer_id Int
token String @unique
// Wir nehmen die IP Adresse des Clients mit auf.
// Falls sich die IP Adresse eines Refresh Token Owners ändert, können wir diesen einfach invalidieren.
ip String
expiry DateTime
// Relationen
user Benutzer @relation(fields: [benutzer_id], references: [id], onDelete: Cascade)
}

View File

@@ -0,0 +1,30 @@
enum TicketStatus {
OFFEN
IN_BEARBEITUNG
IN_WARTESCHLEIFE
GESCHLOSSEN
GELOEST
}
model Tickets {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'tkt-' || gen_random_uuid()"))
benutzer_id Int?
created_at DateTime @default(now())
updated_at DateTime? @updatedAt
deleted_at DateTime?
// Attribute
status TicketStatus @default(OFFEN)
titel String
beschreibung String
metadata Json?
email String
bearbeiter_id Int?
prioritaet Int? @default(0)
// Relationen
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], name: "ErstellteTickets")
bearbeiter Benutzer? @relation(fields: [bearbeiter_id], references: [id], name: "BearbeiteteTickets")
}

View File

@@ -0,0 +1,16 @@
enum UnterlagenKategorie {
Grundriss
Sonstiges
}
model Unterlage {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'pln-' || gen_random_uuid()"))
name String?
kategorie String?
mime String?
aufnahme_id Int?
aufnahme Aufnahme? @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,72 @@
model VerbrauchsausweisGewerbe {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'vag-' || gen_random_uuid()"))
benutzer_id Int?
ausstellgrund Ausstellgrund?
registriernummer String? @db.VarChar
zusaetzliche_heizquelle Boolean?
brennstoff_1 String? @db.VarChar(50)
einheit_1 String? @db.VarChar(50)
brennstoff_2 String? @db.VarChar(50)
einheit_2 String? @db.VarChar(50)
startdatum DateTime? @db.Timestamp(6)
verbrauch_1 Int?
verbrauch_2 Int?
verbrauch_3 Int?
verbrauch_4 Int?
verbrauch_5 Int?
verbrauch_6 Int?
strom_1 Int?
strom_2 Int?
strom_3 Int?
stromverbrauch_enthaelt_heizung Boolean?
stromverbrauch_enthaelt_warmwasser Boolean?
stromverbrauch_enthaelt_lueftung Boolean?
stromverbrauch_enthaelt_beleuchtung Boolean?
stromverbrauch_enthaelt_kuehlung Boolean?
stromverbrauch_enthaelt_sonstige String? @db.VarChar(50)
kuehlung_enthalten Boolean?
anteil_kuehlung_1 Float?
anteil_kuehlung_2 Float?
keller_beheizt Boolean?
alternative_heizung Boolean?
alternative_warmwasser Boolean?
alternative_lueftung Boolean?
alternative_kuehlung Boolean?
warmwasser_enthalten Boolean?
anteil_warmwasser_1 Float?
anteil_warmwasser_2 Float?
ausgestellt Boolean? @default(false)
/// @zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")
storniert Boolean? @default(false)
/// @zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")
bestellt Boolean? @default(false)
/// @zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")
zurueckgestellt Boolean? @default(false)
/// @zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")
prueftext String? @db.VarChar(1000)
beschreibung String? @db.Text
/// @zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")
kontrolldatei_angefragt Boolean? @default(false)
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("ID der korrespondierenden Gebäudeaufnahme")
aufnahme_id Int @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,77 @@
model VerbrauchsausweisWohnen {
id Int @id @default(autoincrement())
/// @zod.describe("UID des Ausweises")
uid String @unique @default(dbgenerated("'vaw-' || gen_random_uuid()"))
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?
/// @zod.describe("Die Registriernummer des Ausweises")
registriernummer String? @db.VarChar
/// @zod.describe("Falls eine sekundäre Heizquelle existiert, sollte dieser Wert auf true stehen")
zusaetzliche_heizquelle Boolean?
/// @zod.describe("Einheit des Energieträgers der primären Heizquelle")
einheit_1 String? @db.VarChar(50)
/// @zod.describe("Einheit des Energieträgers der sekundären Heizquelle")
einheit_2 String? @db.VarChar(50)
startdatum DateTime? @db.Timestamptz(6)
/// @zod.describe("Energieverbrauch der primären Heizquelle im ersten der drei Verbrauchsjahre")
verbrauch_1 Int?
/// @zod.describe("Energieverbrauch der primären Heizquelle im zweiten der drei Verbrauchsjahre")
verbrauch_2 Int?
/// @zod.describe("Energieverbrauch der primären Heizquelle im letzten der drei Verbrauchsjahre")
verbrauch_3 Int?
/// @zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im ersten der drei Verbrauchsjahre")
verbrauch_4 Int?
/// @zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im zweiten der drei Verbrauchsjahre")
verbrauch_5 Int?
/// @zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im letzten der drei Verbrauchsjahre")
verbrauch_6 Int?
/// @zod.describe("Falls Warmwasser im Verbrauchswert enthalten ist, sollte dieser Wert auf true stehen")
warmwasser_enthalten Boolean?
/// @zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen")
warmwasser_anteil_bekannt Boolean?
/// @zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")
keller_beheizt Boolean?
/// @zod.describe("Der Faktor mit dem die Wohnfläche erhöht wird wenn die beheizte Gesamtfläche (energetische Nutzfläche) unbekannt ist.")
faktorKeller Float?
/// @zod.describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet, sollte dieser Wert auf true stehen.")
alternative_heizung Boolean?
/// @zod.describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme (z.B. Solarsystem, Wärmepumpe, etc.) beinhaltet, sollte dieser Wert auf true stehen.")
alternative_warmwasser Boolean?
/// @zod.describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen.")
alternative_lueftung Boolean?
/// @zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen.")
alternative_kuehlung Boolean?
/// @zod.describe("Anteil des Warmwassers am Gesamtverbrauch der primären Energiequelle in Prozent")
anteil_warmwasser_1 Float?
/// @zod.describe("Anteil des Warmwassers am Gesamtverbrauch der sekundären Energiequelle in Prozent")
anteil_warmwasser_2 Float?
ausgestellt Boolean? @default(false)
/// @zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")
storniert Boolean? @default(false)
/// @zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")
bestellt Boolean? @default(false)
/// @zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")
zurueckgestellt Boolean? @default(false)
/// @zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")
prueftext String? @db.VarChar(1000)
beschreibung String? @db.Text
/// @zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")
kontrolldatei_angefragt Boolean? @default(false)
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("ID der korrespondierenden Gebäudeaufnahme")
aufnahme_id Int @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -0,0 +1,15 @@
model documenttemplates {
id Int @id(map: "PK_DOCUMENTTEMPLATES") @default(autoincrement())
name String @db.VarChar(100)
shortdescription String @db.VarChar(100)
longdescription String @db.VarChar(5000)
user_id Int
is_private Boolean @default(true)
documenttype Int
filename String @db.VarChar(100)
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @default(now()) @db.Timestamp(0)
benutzer Benutzer @relation(fields: [user_id], references: [id], onDelete: Cascade, map: "benutzer_fk")
documenttypes documenttypes @relation(fields: [documenttype], references: [id], onDelete: Cascade, map: "documenttypes_fk")
}

View File

@@ -0,0 +1,8 @@
model documenttypes {
id Int @id(map: "PK_DOCUMENTTYPES") @default(autoincrement())
name String @db.VarChar(100)
shortdescription String @db.VarChar(100)
longdescription String @db.VarChar(5000)
documenttemplates documenttemplates[]
}

View File

@@ -0,0 +1,66 @@
generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "debian-openssl-1.1.x"]
previewFeatures = ["prismaSchemaFolder"]
}
generator faker {
provider = "bunx prisma-generator-fake-data"
output = "../../src/types/fake-data.ts"
}
generator zod {
provider = "bunx zod-prisma"
output = "../../src/generated/zod"
relationModel = false
modelCase = "PascalCase"
modelSuffix = "Schema"
useDecimalJs = false
imports = ""
prismaJsonNullability = true
useNullish = true
}
generator enum {
provider = "tsx ./prisma/prisma-enum-generator.ts"
output = "../../src/generated/enums.ts"
}
generator dbml {
provider = "bunx prisma-dbml-generator"
output = "../../dbml"
outputName = "schema.dbml"
projectName = "IBCornelsen Database"
projectDatabaseType = "PostgreSQL"
}
datasource db {
provider = "postgresql"
url = env("POSTGRES_DATABASE_URL")
}
enum Ausstellgrund {
Neubau
Vermietung
Verkauf
Modernisierung
Sonstiges
}
enum Ausweisart {
VerbrauchsausweisWohnen
VerbrauchsausweisGewerbe
BedarfsausweisWohnen
BedarfsausweisGewerbe
GEGNachweisWohnen
GEGNachweisBedarfsausweis
GEGNachweisGewerbe
}
enum Service {
Telefonberatung
Aushang
Qualitaetsdruck
SameDay
}

View File

@@ -0,0 +1,11 @@
model tokens {
id Int @id(map: "PK_TOKENS") @default(autoincrement())
token String @db.VarChar(36)
user_id Int
date_created DateTime @default(now()) @db.Timestamp(6)
last_used DateTime @default(now()) @db.Timestamp(6)
times_used Int @default(0)
permissions Int @default(0)
benutzer Benutzer @relation(fields: [user_id], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "fk_benutzer_tokens_user_id")
}

383
prisma/seed.ts Normal file
View File

@@ -0,0 +1,383 @@
// Das wird ausgeführt, wenn wir `npx prisma db seed` ausführen
// Hier können wir unsere Datenbank mit Beispieldaten füllen
// Mehr Infos: https://www.prisma.io/docs/orm/prisma-migrate/workflows/seeding
import { PrismaClient } from "@prisma/client";
import crypto from "node:crypto";
import { faker } from "@faker-js/faker";
import { Enums } from "../src/types";
import moment from "moment";
function hashPassword(password: string): string {
const salt = crypto.randomBytes(16).toString("hex");
const hash = hashWithGivenSalt(password, salt) + salt;
return hash;
}
function hashWithGivenSalt(password: string, salt: string): string {
const hash = crypto.scryptSync(password, salt, 32).toString("hex");
return hash;
}
const prisma = new PrismaClient({
log: ["warn", "error"],
errorFormat: "pretty",
datasources: {
db: {
url: process.env.POSTGRES_DATABASE_URL,
},
},
});
// Wir wollen erstmal das Backup mit den Klimafaktoren und der PLZ Liste einfuegen.
// Dazu muessen wir die Tabelle leeren.
await prisma.klimafaktoren.deleteMany({
where: {
id: { not: 0 },
},
});
await prisma.postleitzahlen.deleteMany({
where: {
id: { not: 0 },
},
});
// Jetzt koennen wir die Daten aus dem Backup einlesen.
const klimafaktoren = await Bun.file("./backup/klimafaktoren.json").json();
await prisma.klimafaktoren.createMany({
data: klimafaktoren.map((klimafaktor: [number, number, number, string]) => {
return {
plz: klimafaktor[3],
month: klimafaktor[1],
year: klimafaktor[0],
klimafaktor: klimafaktor[2],
};
}),
});
const postleitzahlen = await Bun.file("./backup/postleitzahlen.json").json();
await prisma.postleitzahlen.createMany({
data: postleitzahlen.map(
(postleitzahl: {
plz: string;
ort: string;
landkreis: string;
bundesland: string;
lat: number;
lon: number;
}) => {
return {
plz: postleitzahl.plz,
stadt: postleitzahl.ort,
landkreis: postleitzahl.landkreis,
bundesland: postleitzahl.bundesland,
lat: postleitzahl.lat,
lon: postleitzahl.lon,
};
}
),
});
// Admin erstellen
await prisma.benutzer.create({
data: {
email: "admin@ib-cornelsen.de",
passwort: hashPassword("passwort"),
rolle: "ADMIN",
name: "Admin",
vorname: "Admin",
adresse: "Adminstraße 1",
plz: "12345",
},
});
// Test Benutzer erstellen
await prisma.benutzer.create({
data: {
email: "user@ib-cornelsen.de",
passwort: hashPassword("passwort"),
rolle: "USER",
name: "User",
vorname: "User",
adresse: "Userstraße 1",
plz: "12345",
},
});
// Benutzer erstellen
for (let i = 0; i < 10; i++) {
let firstName = faker.person.firstName();
let lastName = faker.person.lastName();
const benutzer = await prisma.benutzer.create({
data: {
email: faker.internet.email({
firstName: firstName,
lastName: lastName,
}),
passwort: hashPassword(faker.internet.password()),
name: lastName,
vorname: firstName,
adresse: faker.location.street(),
plz: faker.location.zipCode({ format: "#####" }),
ort: faker.location.city(),
rolle: "USER",
},
});
for (let j = 0; j < Math.round(Math.random() * 5); j++) {
// Für jeden Nutzer erstellen wir auch noch bis zu 5 Ausweise.
await prisma.objekt.create({
data: {
adresse: faker.location.street(),
latitude: faker.location.latitude(),
longitude: faker.location.longitude(),
ort: faker.location.city(),
plz: faker.location.zipCode({ format: "#####" }),
benutzer: {
connect: {
id: benutzer.id,
},
},
aufnahmen: {
create: {
alternative_heizung: faker.datatype.boolean(),
alternative_kuehlung: faker.datatype.boolean(),
alternative_lueftung: faker.datatype.boolean(),
alternative_warmwasser: faker.datatype.boolean(),
aussenwand_gedaemmt: faker.datatype.boolean(),
aussenwand_min_12cm_gedaemmt: faker.datatype.boolean(),
baujahr_gebaeude: [faker.date.past().getFullYear()],
baujahr_heizung: [faker.date.past().getFullYear()],
baujahr_klima: [faker.date.past().getFullYear()],
benutzer: {
connect: {
id: benutzer.id,
},
},
verbrauchsausweis_wohnen: {
create: {
benutzer: {
connect: {
id: benutzer.id,
},
},
},
},
},
},
},
});
}
}
export async function importVerbrauchsausweisWohnenAltesSystem(
count: number = 5
) {
const response = await fetch(
"https://online-energieausweis.org/user/ausweis-import.php",
{
method: "POST",
body: JSON.stringify({
i: count,
offset: 0,
q: {},
}),
}
);
const data = await response.json();
return data;
}
export async function verbrauchsausweisWohnenImportTranslate(
ausweis: Record<string, any>
) {
let firstName = faker.person.firstName();
let lastName = faker.person.lastName();
const benutzer = await prisma.benutzer.create({
data: {
email: faker.internet.email({
firstName: firstName,
lastName: lastName,
}),
passwort: hashPassword(faker.internet.password()),
name: lastName,
vorname: firstName,
adresse: faker.location.street(),
plz: faker.location.zipCode({ format: "#####" }),
ort: faker.location.city(),
rolle: "USER",
},
});
// TODO: Bilder Importieren
const gebaeudeStammdaten = await prisma.objekt.create({
data: {
adresse: ausweis.objekt_strasse,
plz: ausweis.objekt_plz,
ort: ausweis.objekt_ort,
uid: faker.string.uuid(),
latitude: null,
longitude: null,
benutzer: {
connect: {
id: benutzer.id,
},
},
},
});
const gebaeudeAufnahmeAllgemein =
await prisma.aufnahme.create({
data: {
benutzer: {
connect: {
id: benutzer.id,
},
},
baujahr_gebaeude: [parseInt(ausweis.baujahr_gebaeude)],
baujahr_heizung: ausweis.baujahr_anlage ? [parseInt(ausweis.baujahr_anlage)] : [],
baujahr_klima: ausweis.baujahr_klimaanlage ? [parseInt(ausweis.baujahr_klimaanlage)] : [],
nutzflaeche: parseInt(ausweis.nutzflaeche),
einheiten: parseInt(ausweis.anzahl_einheiten),
saniert: ausweis.objekt_saniert ? true : false,
keller:
ausweis.keller_beheizt == "Beheizt"
? Enums.Heizungsstatus.BEHEIZT
: ausweis.keller_beheizt == "Unbeheizt"
? Enums.Heizungsstatus.UNBEHEIZT
: Enums.Heizungsstatus.NICHT_VORHANDEN,
dachgeschoss:
ausweis.dachgeschoss == "Beheizt"
? Enums.Heizungsstatus.BEHEIZT
: ausweis.dachgeschoss == "Unbeheizt"
? Enums.Heizungsstatus.UNBEHEIZT
: Enums.Heizungsstatus.NICHT_VORHANDEN,
flaeche: parseInt(ausweis.wohnflaeche),
gebaeudetyp: ausweis.objekt_typ,
gebaeudeteil: ausweis.objekt_gebaeudeteil,
lueftung: ausweis.lueftungskonzept,
// NOTE: Warum ist das kein Bool?
kuehlung: ausweis.wird_gekuehlt ? "true" : "false",
brennstoff_1: ausweis.energietraeger_1,
brennstoff_2: ausweis.energietraeger_2,
alternative_heizung: ausweis.alheizung ? true : false,
alternative_kuehlung: ausweis.alkuehlung ? true : false,
alternative_lueftung: ausweis.allueftung ? true : false,
alternative_warmwasser: ausweis.alwarmwasser ? true : false,
ausweisart: Enums.Ausweisart.VerbrauchsausweisWohnen,
energieeffizienzklasse: "",
aussenwand_gedaemmt: ausweis.aussenwand_gedaemmt ? true : false,
aussenwand_min_12cm_gedaemmt: ausweis.aussenwand_min_12cm_gedaemmt ? true : false,
bestellt: ausweis.bestellt ? true : false,
boxpruefung: ausweis.boxpruefung ? true : false,
brennwert_kessel: ausweis.brennwert_kessel ? true : false,
dachgeschoss_gedaemmt: ausweis.dachgeschoss_gedaemmt ? true : false,
dachgeschoss_min_12cm_gedaemmt: ausweis.dachgeschoss_min_12cm_gedaemmt ? true : false,
doppel_verglasung: ausweis.doppel_verglasung ? true : false,
dreifach_verglasung: ausweis.dreifach_verglasung ? true : false,
durchlauf_erhitzer: ausweis.durchlauf_erhitzer ? true : false,
einfach_verglasung: ausweis.einfach_verglasung ? true : false,
einzelofen: ausweis.einzelofen ? true : false,
erledigt: ausweis.erledigt ? true : false,
fenster_dicht: ausweis.fenster_dicht ? true : false,
fenster_teilweise_undicht: ausweis.fenster_teilweise_undicht ? true : false,
heizungsrohre_gedaemmt: ausweis.heizungsrohre_gedaemmt ? true : false,
isolier_verglasung: ausweis.isolier_verglasung ? true : false,
keller_decke_gedaemmt: ausweis.keller_decke_gedaemmt ? true : false,
keller_wand_gedaemmt: ausweis.keller_wand_gedaemmt ? true : false,
niedertemperatur_kessel: ausweis.niedertemperatur_kessel ? true : false,
oberste_geschossdecke_gedaemmt: ausweis.oberste_geschossdecke_gedaemmt ? true : false,
oberste_geschossdecke_min_12cm_gedaemmt: ausweis.oberste_geschossdecke_min_12cm_gedaemmt ? true : false,
raum_temperatur_regler: ausweis.raum_temperatur_regler ? true : false,
rolllaeden_kaesten_gedaemmt: ausweis.rolllaeden_kaesten_gedaemmt ? true : false,
solarsystem_warmwasser: ausweis.solarsystem_warmwasser ? true : false,
standard_kessel: ausweis.standard_kessel ? true : false,
waermepumpe: ausweis.waermepumpe ? true : false,
warmwasser_rohre_gedaemmt: ausweis.warmwasser_rohre_gedaemmt ? true : false,
zentralheizung: ausweis.zentralheizung ? true : false,
zirkulation: ausweis.zirkulation ? true : false,
photovoltaik: ausweis.photovoltaik ? true : false,
leerstand: ausweis.leerstand,
prueftext: ausweis["check-texts"],
storniert: false,
tueren_dicht: ausweis.tueren_dicht ? true : false,
tueren_undicht: ausweis.tueren_undicht ? true : false,
zurueckgestellt: ausweis.zurueckGestellt ? true : false,
uid: faker.string.uuid(),
ausstellungsdatum: moment(ausweis.bestelldatum).toDate(),
erstellungsdatum: moment(ausweis.erstellungsdatum).toDate(),
objekt: {
connect: {
id: gebaeudeStammdaten.id,
},
},
},
});
let startdatum = moment(
`${ausweis.energieverbrauch_zeitraum_jahr}-${ausweis.energieverbrauch_zeitraum_monat}-01`
).toDate();
if (isNaN(startdatum.getTime())) {
startdatum = new Date();
}
const verbrauchsausweisWohnen = await prisma.verbrauchsausweisWohnen.create(
{
data: {
aufnahme: {
connect: {
id: gebaeudeAufnahmeAllgemein.id,
},
},
benutzer: {
connect: {
id: benutzer.id,
},
},
verbrauch_1: parseInt(ausweis.energieverbrauch_1_heizquelle_1),
verbrauch_2: parseInt(ausweis.energieverbrauch_2_heizquelle_1),
verbrauch_3: parseInt(ausweis.energieverbrauch_3_heizquelle_1),
verbrauch_4: parseInt(ausweis.energieverbrauch_1_heizquelle_2),
verbrauch_5: parseInt(ausweis.energieverbrauch_2_heizquelle_2),
verbrauch_6: parseInt(ausweis.energieverbrauch_3_heizquelle_2),
einheit_1: ausweis.energietraeger_einheit_heizquelle_1,
einheit_2: ausweis.energietraeger_einheit_heizquelle_2,
warmwasser_enthalten: ausweis.warmwasser_enthalten ? true : false,
uid: faker.string.uuid(),
alternative_heizung: ausweis.alheizung ? true : false,
alternative_kuehlung: ausweis.alkuehlung ? true : false,
alternative_lueftung: ausweis.allueftung ? true : false,
alternative_warmwasser: ausweis.alwarmwasser ? true : false,
anteil_warmwasser_1: ausweis.anteil_warmwasser_1,
anteil_warmwasser_2: ausweis.anteil_warmwasser_2,
ausstellgrund: ausweis.ausstellgrund,
keller_beheizt: ausweis.keller_beheizt ? true : false,
registriernummer: ausweis.regnummer,
// Der Monat im alten System ist 1-basiert, in der neuen Datenbank 0-basiert
// Also müssen wir hier 1 abziehen
startdatum,
warmwasser_anteil_bekannt: ausweis.warmwasser_anteil_bekannt ? true : false,
wird_gekuehlt: ausweis.wird_gekuehlt ? true : false,
zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle ? true : false,
},
}
);
return verbrauchsausweisWohnen;
}
const ausweise = (await importVerbrauchsausweisWohnenAltesSystem(10)) as { data: any[], result_count: number };
for (const ausweis of ausweise.data) {
await verbrauchsausweisWohnenImportTranslate(ausweis);
}