Merge branch 'main' into UMBE

This commit is contained in:
UMBENOMENA
2025-02-22 18:48:50 +01:00
committed by GitHub
227 changed files with 2153661 additions and 982 deletions

16
.env Normal file
View File

@@ -0,0 +1,16 @@
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
POSTGRES_DB=main
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=main
POSTGRES_PASSWORD=hHMP8cd^N3SnzGRR
DB_CONTAINER_NAME=database
POSTGRES_DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
POSTGRES_DATABASE_URL_EXTERNAL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_CONTAINER_NAME}:${POSTGRES_PORT}/${POSTGRES_DB}"

5
.gitignore vendored
View File

@@ -20,9 +20,7 @@ pnpm-debug.log*
pnpm-lock.yaml
bun.lockb
# environment variables
.env
.env.production
src/astro-typesafe-api-caller.ts
# macOS-specific files
.DS_Store
@@ -32,3 +30,4 @@ public/fonts/
*.Identifier
src/lib/Berechnungen/BedarfsausweisWohnen/18599-Tabellenverfahren-Wohngebaeude-komplett-ocr.pdf
src/astro-typesafe-api-caller.ts

View File

@@ -1,10 +1,16 @@
FROM oven/bun:1.0.23
FROM postgres:latest
ENV POSTGRES_USER ${POSTGRES_USER}
ENV POSTGRES_PASSWORD ${POSTGRES_PASSWORD}
ENV POSTGRES_DB ${POSTGRES_DB}
EXPOSE 3000
COPY ./prisma/migrations/ /docker-entrypoint-initdb.d/
WORKDIR /online-energieausweis
COPY ./package.json ./
COPY . .
RUN bun install --prod
EXPOSE 5432
CMD ["bun", "run", "build:production"]
# Use a loop to copy migration.sql from each folder to the corresponding directory in the build context
RUN for folder in /docker-entrypoint-initdb.d/*; do \
if [ -d "$folder" ]; then \
cp "$folder/migration.sql" "$folder.sql"; \
rm -rf "$folder"; \
fi \
done

View File

@@ -1,31 +1,60 @@
.PHONY: dev database online-energieausweis all prod bun-install-database # api bun-install-api
.PHONY: dev online-energieausweis all prod backup run-database build-database install-dependencies wait-for-database prod database
DB_CONTAINER_NAME := database
DB_NAME := main
DB_USER := main
DB_PASSWORD := hHMP8cd^N3SnzGRR
DB_PORT := 5432
DB_VOLUME := postgres_data
PERSISTENT_DIR := $(HOME)/persistent/$(APP_NAME)
BACKUP_FILENAME := $(HOME)/backups/$(shell date +"%Y-%m-%d_%H-%M-%S").sql.gz
online-energieausweis:
bun run dev --host
dev: database online-energieausweis # api
dev: install-dependencies database online-energieausweis
database:
$(MAKE) -C ../database dev
docker compose up
bun-install-database:
cd ../database
bun link
backup:
mkdir -p $(PERSISTENT_DIR)
- docker exec -t $(DB_CONTAINER_NAME) pg_dump --data-only -U $(DB_USER) $(DB_NAME) | gzip > $(BACKUP_FILENAME)
rundatabase: stop_database
docker volume rm -f $(DB_VOLUME)
docker volume create $(DB_VOLUME)
docker build -t $(DB_CONTAINER_NAME) .
docker run -d --name $(DB_CONTAINER_NAME) \
-e POSTGRES_USER=$(DB_USER) \
-e POSTGRES_PASSWORD=$(DB_PASSWORD) \
-p $(DB_PORT):5432 \
-v $(DB_VOLUME):/var/lib/postgresql/data \
-v $(PERSISTENT_DIR):/persistent \
$(DB_CONTAINER_NAME)
stop-database:
-docker stop $(DB_CONTAINER_NAME)
-docker rm $(DB_CONTAINER_NAME)
wait-fordatabase:
@while ! docker exec $(DB_CONTAINER_NAME) pg_isready -U $(DB_USER) -h localhost -p $(DB_PORT) > /dev/null 2>&1; do \
sleep 1; \
done
restore-backup:
gunzip -c $(BACKUP_FILENAME) | docker exec -i $(DB_CONTAINER_NAME) psql -U $(DB_USER) -d postgres
install-dependencies:
bun install
# bun-install-api: bun-install-database
# cd ../api
# bun install
# bun link @ibcornelsen/database
# api:
# $(MAKE) -C ../api dev
bunx prisma generate
all:
mkdir -p ~/logs
bun run dev 2>&1 | tee ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log
prod: bun-install-database # bun-install-api
prod: install-dependencies run-database
bun run build
mkdir -p ~/logs
mkdir -p ~/persistent/online-energieausweis
@@ -36,17 +65,8 @@ prod: bun-install-database # bun-install-api
cd ../online-energieausweis; \
fi
# Auch die API sollte bereits laufen
# @if [ $$(pm2 pid api) -eq "0" ]; then \
# cd ../api; \
# $(MAKE) prod; \
# cd ../online-energieausweis; \
# fi
- rm -f ~/online-energieausweis/.env;
- touch ~/online-energieausweis/.env;
- echo "PRIVATE_KEY=$(cat /etc/letsencrypt/live/ibcornelsen.de/privkey.pem | base64 | tr -d '\n')" >> ~/online-energieausweis/.env;
- echo "CERTIFICATE=$(cat /etc/letsencrypt/live/ibcornelsen.de/fullchain.pem | base64 | tr -d '\n')" >> ~/online-energieausweis/.env;
# - echo "PRIVATE_KEY=$(cat /etc/letsencrypt/live/ibcornelsen.de/privkey.pem | base64 | tr -d '\n')" >> ~/online-energieausweis/.env;
# - echo "CERTIFICATE=$(cat /etc/letsencrypt/live/ibcornelsen.de/fullchain.pem | base64 | tr -d '\n')" >> ~/online-energieausweis/.env;
- pm2 delete online-energieausweis
pm2 start --name "online-energieausweis" --log ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log --time bun -- astro dev
pm2 start --name "online-energieausweis" --log ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log --time bun -- run ./server.ts

View File

@@ -4,38 +4,27 @@ import svelte from "@astrojs/svelte";
import tailwind from "@astrojs/tailwind";
import node from "@astrojs/node";
import mdx from "@astrojs/mdx";
import dsv from "@rollup/plugin-dsv"
import astroTypesafeAPI from "astro-typesafe-api"
import { fileURLToPath } from "url";
// https://astro.build/config
export default defineConfig({
integrations: [svelte(), tailwind(), mdx(), astroTypesafeAPI()],
outDir: "./dist",
output: "server",
adapter: node({
mode: "middleware",
}),
vite: {
optimizeDeps: {
exclude: ["@ibcornelsen/api", "@ibcornelsen/database"]
},
ssr: {
external: ["@prisma/client"],
resolve: {
alias: {
"#": fileURLToPath(new URL("./src", import.meta.url))
".prisma/client/index-browser": "./node_modules/.prisma/client/index-browser.js"
}
}
}
},
ssr: {
noExternal: ["@pdfme/generator", "@pdfme/common", "@pdfme/schemas"]
},
build: {
commonjsOptions: {
transformMixedEsModules: false
}
},
plugins: [dsv()]
},
adapter: node({
mode: "middleware"
}),
server: {
port: 3000
},

2074970
backup/klimafaktoren.json Normal file

File diff suppressed because it is too large Load Diff

71474
backup/postleitzahlen.json Normal file

File diff suppressed because it is too large Load Diff

448
bun.lock

File diff suppressed because it is too large Load Diff

715
dbml/schema.dbml Normal file
View File

@@ -0,0 +1,715 @@
//// ------------------------------------------------------
//// THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
//// ------------------------------------------------------
Project "IBCornelsen Database" {
database_type: 'PostgreSQL'
Note: ''
}
Table Anteilshaber {
id Int [pk, increment]
benutzer_id Int [not null]
rolle String
privilegien BigInt
uid String [unique, not null]
benutzer benutzer [not null]
objekt_id Int [not null]
objekt Objekt [not null]
}
Table ApiRequests {
id Int [pk, increment]
date DateTime [default: `now()`, not null]
ip String [not null]
method String [not null]
path String [not null]
status Int [not null]
responseTime Float [not null]
responseSize Int [not null]
userAgent String [not null]
user_id Int
user benutzer
}
Table Aufnahme {
id Int [pk, increment]
uid String [unique, not null, note: '@zod.describe("UID der Gebäude Aufnahme")']
benutzer_id Int
benutzer benutzer
ausweisart Ausweisart [note: '@zod.describe("Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen")']
gebaeudetyp String [note: '@zod.describe("Art des Gebäudes und seiner primären Nutzungsart")']
gebaeudeteil String [note: '@zod.describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil")']
baujahr_gebaeude Int[] [not null, note: '@zod.describe("Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde")']
baujahr_heizung Int[] [not null, note: '@zod.describe("Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde")']
baujahr_klima Int[] [not null, note: '@zod.describe("Alle Jahre in denen die Klimaanlage eingebaut oder grundlegend verändert wurde")']
einheiten Int [note: '@zod.describe("Anzahl der (Wohn)Einheiten im Gebäude")']
flaeche Int [note: '@zod.describe("Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden")']
nutzflaeche Int [note: '@zod.describe("(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche")']
saniert Boolean [note: '@zod.describe("Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen")']
keller Heizungsstatus [note: '@zod.describe("Ob ein Keller vorhanden, beheizt oder unbeheizt ist")']
dachgeschoss Heizungsstatus [note: '@zod.describe("Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist")']
lueftung Lueftungskonzept [note: '@zod.describe("Art der Gebäudelüftung")']
kuehlung String [note: '@zod.describe("Art der Gebäudekühlung")']
leerstand Int [note: '@zod.describe("Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr")']
alternative_heizung Boolean [note: '@zod.describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")']
alternative_warmwasser Boolean [note: '@zod.describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")']
alternative_lueftung Boolean [note: '@zod.describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")']
alternative_kuehlung Boolean [note: '@zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")']
brennstoff_1 String [note: '@zod.describe("Genutzer Brennstoff der primären Energiequelle")']
brennstoff_2 String [note: '@zod.describe("Genutzer Brennstoff der sekundären Energiequelle")']
boxpruefung Boolean [default: false]
energieeffizienzklasse String [note: '@zod.describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes")']
erstellungsdatum DateTime [default: `now()`, note: '@zod.describe("Datum an dem der Kunde den Ausweis erstellt hat")']
ausstellungsdatum DateTime [note: '@zod.describe("Datum an dem der Aussteller den Ausweis ausgestellt hat")']
zentralheizung Boolean [note: '@zod.describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen")']
solarsystem_warmwasser Boolean [note: '@zod.describe("Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen")']
warmwasser_rohre_gedaemmt Boolean [note: '@zod.describe("Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")']
niedertemperatur_kessel Boolean [note: '@zod.describe("Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen")']
brennwert_kessel Boolean [note: '@zod.describe("Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen")']
heizungsrohre_gedaemmt Boolean [note: '@zod.describe("Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")']
standard_kessel Boolean
waermepumpe Boolean [note: '@zod.describe("Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen")']
raum_temperatur_regler Boolean [note: '@zod.describe("Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen")']
photovoltaik Boolean [note: '@zod.describe("Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen")']
durchlauf_erhitzer Boolean [note: '@zod.describe("Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen")']
einzelofen Boolean
zirkulation Boolean [note: '@zod.describe("Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen")']
einfach_verglasung Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen")']
dreifach_verglasung Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen")']
fenster_teilweise_undicht Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen")']
doppel_verglasung Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen")']
fenster_dicht Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen")']
rolllaeden_kaesten_gedaemmt Boolean [note: '@zod.describe("Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen")']
isolier_verglasung Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen")']
tueren_undicht Boolean [note: '@zod.describe("Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen")']
tueren_dicht Boolean [note: '@zod.describe("Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen")']
dachgeschoss_gedaemmt Boolean [note: '@zod.describe("Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")']
keller_decke_gedaemmt Boolean [note: '@zod.describe("Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")']
keller_wand_gedaemmt Boolean [note: '@zod.describe("Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")']
aussenwand_gedaemmt Boolean [note: '@zod.describe("Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")']
oberste_geschossdecke_gedaemmt Boolean [note: '@zod.describe("Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")']
aussenwand_min_12cm_gedaemmt Boolean [note: '@zod.describe("Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen")']
dachgeschoss_min_12cm_gedaemmt Boolean [note: '@zod.describe("Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")']
oberste_geschossdecke_min_12cm_gedaemmt Boolean [note: '@zod.describe("Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")']
events Event [not null]
bilder Bild [not null]
unterlagen Unterlage [not null]
bedarfsausweise_wohnen BedarfsausweisWohnen [not null]
verbrauchsausweise_gewerbe VerbrauchsausweisGewerbe [not null]
verbrauchsausweise_wohnen VerbrauchsausweisWohnen [not null]
geg_nachweise_wohnen GEGNachweisWohnen [not null]
geg_nachweise_gewerbe GEGNachweisGewerbe [not null]
bedarfsausweise_gewerbe BedarfsausweisGewerbe [not null]
objekt_id Int [not null]
objekt Objekt [not null]
}
Table BedarfsausweisGewerbe {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")']
benutzer benutzer
aufnahme_id Int [unique, not null]
aufnahme Aufnahme [not null]
rechnung_id Int [unique]
rechnung Rechnung
geg_einpreisung_id Int [unique]
geg_einpreisung GEGEinpreisung
}
Table BedarfsausweisWohnen {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int
ausstellgrund Ausstellgrund
registriernummer String
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
decke_bauart String
dach_daemmung Float
decke_daemmung Float
aussenwand_daemmung Float
boden_daemmung Float
aussenwand_bauart String
boden_bauart String
warmwasser_verteilung String
warmwasser_speicherung String
warmwasser_erzeugung String
heizung_zentral Boolean
heizung_verteilung String
heizung_speicherung String
waerme_erzeugung_heizung String
anteil_zusatzheizung Float
kollektor_flaeche Float
ausgestellt Boolean [default: false]
storniert Boolean [default: false, note: '@zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
prueftext String [note: '@zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")']
beschreibung String
kontrolldatei_angefragt Boolean [default: false, note: '@zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")']
benutzer benutzer
rechnung_id Int [unique]
rechnung Rechnung
aufnahme_id Int [unique, not null, note: '@zod.describe("ID der korrespondierenden Gebäudeaufnahme")']
aufnahme Aufnahme [not null]
}
Table benutzer {
id Int [pk, increment]
uid String [unique, not null]
name String
vorname String
email String [unique, not null]
passwort String [not null]
profilbild String
plz String
ort String
adresse String
telefon String
anrede String
rolle BenutzerRolle [not null, default: 'USER']
firma String
lex_office_id String
BedarfsausweisWohnen BedarfsausweisWohnen [not null]
documenttemplates documenttemplates [not null]
objekte Objekt [not null]
rechnungen Rechnung [not null]
tokens tokens [not null]
VerbrauchsausweisGewerbe VerbrauchsausweisGewerbe [not null]
VerbrauchsausweisWohnen VerbrauchsausweisWohnen [not null]
ApiRequests ApiRequests [not null]
RefreshTokens RefreshTokens [not null]
aufnahmen Aufnahme [not null]
geg_einpreisungen GEGEinpreisung [not null]
geg_nachweise_gewerbe GEGNachweisGewerbe [not null]
geg_nachweise_wohnen GEGNachweisWohnen [not null]
bedarfsausweise_gewerbe BedarfsausweisGewerbe [not null]
ErstellteTickets Tickets [not null]
BearbeiteteTickets Tickets [not null]
events Event [not null]
}
Table Bild {
id Int [pk, increment]
kategorie BilderKategorie [not null]
uid String [unique, not null]
aufnahme_id Int
aufnahme Aufnahme
}
Table Event {
id Int [pk, increment]
uid String [unique, not null]
date DateTime [default: `now()`, not null]
title String [not null]
description String
aufnahme_id Int [not null]
aufnahme Aufnahme [not null]
benutzer_id Int
benutzer benutzer
}
Table GEGEinpreisung {
id Int [pk, increment]
uid String [unique, not null]
empfaenger String
strasse String
plz String
ort String
zusatzzeile String
telefon String
email String
abweichende_versand_adresse Boolean [default: false]
versand_empfaenger String
versand_strasse String
versand_plz String
versand_ort String
versand_zusatzzeile String
status Einpreisungsstatus [not null]
geg_nachweis_wohnen GEGNachweisWohnen
geg_nachweis_gewerbe GEGNachweisGewerbe
bedarfsausweis_gewerbe BedarfsausweisGewerbe
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, der diese Einpreisung bekommt.")']
benutzer benutzer
}
Table GEGNachweisGewerbe {
id Int [pk, increment]
uid String [unique, not null]
ausstellgrund Ausstellgrund [note: '@zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")']
keller_beheizt Boolean [note: '@zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")']
storniert Boolean [default: false, note: '@zod.describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
beschreibung String [note: '@zod.describe("Beschreibung des Bauvorhabens")']
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")']
benutzer benutzer
aufnahme_id Int [unique, not null]
aufnahme Aufnahme [not null]
rechnung_id Int [unique]
rechnung Rechnung
geg_einpreisung_id Int [unique]
geg_einpreisung GEGEinpreisung
}
Table GEGNachweisWohnen {
id Int [pk, increment]
uid String [unique, not null]
ausstellgrund Ausstellgrund [note: '@zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")']
keller_beheizt Boolean [note: '@zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")']
storniert Boolean [default: false, note: '@zod.describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
beschreibung String [note: '@zod.describe("Beschreibung des Bauvorhabens")']
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")']
benutzer benutzer
aufnahme_id Int [unique, not null]
aufnahme Aufnahme [not null]
rechnung_id Int [unique]
rechnung Rechnung
geg_einpreisung_id Int [unique]
geg_einpreisung GEGEinpreisung
}
Table Klimafaktoren {
id Int [pk, increment]
plz String [not null]
month Int [not null]
year Int [not null]
klimafaktor Float [not null, default: 1]
indexes {
(plz, month, year) [unique]
}
}
Table Objekt {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int
latitude Float
longitude Float
plz String [note: '@zod.describe("Postleitzahl des Gebäudes")']
ort String [note: '@zod.describe("Ort des Gebäudes")']
adresse String [note: '@zod.describe("Adresse (Straße und Hausnummer) des Gebäudes")']
erstellungsdatum DateTime [default: `now()`]
benutzer benutzer
aufnahmen Aufnahme [not null]
anteilshaber Anteilshaber [not null]
}
Table Postleitzahlen {
id Int [pk, increment]
plz String [not null]
stadt String [not null]
bundesland String [not null]
landkreis String [not null]
lat Float [not null]
lon Float [not null]
}
Table Rechnung {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int [not null]
empfaenger String
strasse String
plz String
ort String
zusatzzeile String
telefon String
email String
abweichende_versand_adresse Boolean [default: false]
versand_empfaenger String
versand_strasse String
versand_plz String
versand_ort String
versand_zusatzzeile String
bezahlmethode Bezahlmethoden [not null]
status Rechnungsstatus [not null]
services Service[] [not null]
ausweistyp AusweisTyp [not null, default: 'Standard']
betrag Float [not null]
erstellt_am DateTime [default: `now()`, not null]
bezahlt_am DateTime
storniert_am DateTime
transaktions_referenz String [unique]
benutzer benutzer [not null]
verbrauchsausweis_wohnen VerbrauchsausweisWohnen
verbrauchsausweis_gewerbe VerbrauchsausweisGewerbe
bedarfsausweis_wohnen BedarfsausweisWohnen
bedarfsausweis_gewerbe BedarfsausweisGewerbe
geg_nachweis_gewerbe GEGNachweisGewerbe
geg_nachweis_wohnen GEGNachweisWohnen
}
Table RefreshTokens {
id Int [pk, increment]
benutzer_id Int [not null]
token String [unique, not null]
ip String [not null]
expiry DateTime [not null]
user benutzer [not null]
}
Table Tickets {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int
created_at DateTime [default: `now()`, not null]
updated_at DateTime
deleted_at DateTime
status TicketStatus [not null, default: 'OFFEN']
titel String [not null]
beschreibung String [not null]
metadata Json
email String [not null]
bearbeiter_id Int
prioritaet Int [default: 0]
benutzer benutzer
bearbeiter benutzer
}
Table Unterlage {
id Int [pk, increment]
uid String [unique, not null]
name String
kategorie String
mime String
aufnahme_id Int
aufnahme Aufnahme
}
Table VerbrauchsausweisGewerbe {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int
ausstellgrund Ausstellgrund
registriernummer String
zusaetzliche_heizquelle Boolean
brennstoff_1 String
einheit_1 String
brennstoff_2 String
einheit_2 String
startdatum DateTime
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
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]
storniert Boolean [default: false, note: '@zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
prueftext String [note: '@zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")']
beschreibung String
kontrolldatei_angefragt Boolean [default: false, note: '@zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")']
benutzer benutzer
rechnung_id Int [unique]
rechnung Rechnung
aufnahme_id Int [unique, not null, note: '@zod.describe("ID der korrespondierenden Gebäudeaufnahme")']
aufnahme Aufnahme [not null]
}
Table VerbrauchsausweisWohnen {
id Int [pk, increment]
uid String [unique, not null, note: '@zod.describe("UID des Ausweises")']
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")']
ausstellgrund Ausstellgrund [note: '@zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")']
registriernummer String [note: '@zod.describe("Die Registriernummer des Ausweises")']
zusaetzliche_heizquelle Boolean [note: '@zod.describe("Falls eine sekundäre Heizquelle existiert, sollte dieser Wert auf true stehen")']
einheit_1 String [note: '@zod.describe("Einheit des Energieträgers der primären Heizquelle")']
einheit_2 String [note: '@zod.describe("Einheit des Energieträgers der sekundären Heizquelle")']
startdatum DateTime
verbrauch_1 Int [note: '@zod.describe("Energieverbrauch der primären Heizquelle im ersten der drei Verbrauchsjahre")']
verbrauch_2 Int [note: '@zod.describe("Energieverbrauch der primären Heizquelle im zweiten der drei Verbrauchsjahre")']
verbrauch_3 Int [note: '@zod.describe("Energieverbrauch der primären Heizquelle im letzten der drei Verbrauchsjahre")']
verbrauch_4 Int [note: '@zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im ersten der drei Verbrauchsjahre")']
verbrauch_5 Int [note: '@zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im zweiten der drei Verbrauchsjahre")']
verbrauch_6 Int [note: '@zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im letzten der drei Verbrauchsjahre")']
warmwasser_enthalten Boolean [note: '@zod.describe("Falls Warmwasser im Verbrauchswert enthalten ist, sollte dieser Wert auf true stehen")']
warmwasser_anteil_bekannt Boolean [note: '@zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen")']
keller_beheizt Boolean [note: '@zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")']
faktorKeller Float [note: '@zod.describe("Der Faktor mit dem die Wohnfläche erhöht wird wenn die beheizte Gesamtfläche (energetische Nutzfläche) unbekannt ist.")']
alternative_heizung Boolean [note: '@zod.describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet, sollte dieser Wert auf true stehen.")']
alternative_warmwasser Boolean [note: '@zod.describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme (z.B. Solarsystem, Wärmepumpe, etc.) beinhaltet, sollte dieser Wert auf true stehen.")']
alternative_lueftung Boolean [note: '@zod.describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen.")']
alternative_kuehlung Boolean [note: '@zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen.")']
anteil_warmwasser_1 Float [note: '@zod.describe("Anteil des Warmwassers am Gesamtverbrauch der primären Energiequelle in Prozent")']
anteil_warmwasser_2 Float [note: '@zod.describe("Anteil des Warmwassers am Gesamtverbrauch der sekundären Energiequelle in Prozent")']
ausgestellt Boolean [default: false]
storniert Boolean [default: false, note: '@zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
prueftext String [note: '@zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")']
beschreibung String
kontrolldatei_angefragt Boolean [default: false, note: '@zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")']
benutzer benutzer
rechnung_id Int [unique]
rechnung Rechnung
aufnahme_id Int [unique, not null, note: '@zod.describe("ID der korrespondierenden Gebäudeaufnahme")']
aufnahme Aufnahme [not null]
}
Table documenttemplates {
id Int [pk, increment]
name String [not null]
shortdescription String [not null]
longdescription String [not null]
user_id Int [not null]
is_private Boolean [not null, default: true]
documenttype Int [not null]
filename String [not null]
created_at DateTime [default: `now()`, not null]
updated_at DateTime [default: `now()`, not null]
benutzer benutzer [not null]
documenttypes documenttypes [not null]
}
Table documenttypes {
id Int [pk, increment]
name String [not null]
shortdescription String [not null]
longdescription String [not null]
documenttemplates documenttemplates [not null]
}
Table tokens {
id Int [pk, increment]
token String [not null]
user_id Int [not null]
date_created DateTime [default: `now()`, not null]
last_used DateTime [default: `now()`, not null]
times_used Int [not null, default: 0]
permissions Int [not null, default: 0]
benutzer benutzer [not null]
}
Enum Heizungsstatus {
BEHEIZT
UNBEHEIZT
NICHT_VORHANDEN
}
Enum Lueftungskonzept {
Fensterlueftung
Schachtlueftung
LueftungsanlageMitWaermerueckgewinnung
LueftungsanlageOhneWaermerueckgewinnung
}
Enum BenutzerRolle {
USER
ADMIN
}
Enum BilderKategorie {
Heizung
Fenster
Gebaeude
Daemmung
}
Enum Einpreisungsstatus {
open
canceled
pending
expired
}
Enum Bezahlmethoden {
paypal
giropay
sofort
creditcard
rechnung
}
Enum Rechnungsstatus {
open
canceled
pending
authorized
expired
failed
paid
}
Enum AusweisTyp {
Standard
Beratung
Offline
}
Enum TicketStatus {
OFFEN
IN_BEARBEITUNG
IN_WARTESCHLEIFE
GESCHLOSSEN
GELOEST
}
Enum UnterlagenKategorie {
Grundriss
Sonstiges
}
Enum Ausstellgrund {
Neubau
Vermietung
Verkauf
Modernisierung
Sonstiges
}
Enum Ausweisart {
VerbrauchsausweisWohnen
VerbrauchsausweisGewerbe
BedarfsausweisWohnen
BedarfsausweisGewerbe
GEGNachweisWohnen
GEGNachweisBedarfsausweis
GEGNachweisGewerbe
}
Enum Service {
Telefonberatung
Aushang
Qualitaetsdruck
SameDay
}
Ref: Anteilshaber.benutzer_id - benutzer.id [delete: No Action]
Ref: Anteilshaber.objekt_id > Objekt.id [delete: No Action]
Ref: ApiRequests.user_id > benutzer.id [delete: No Action]
Ref: Aufnahme.benutzer_id > benutzer.id [delete: No Action]
Ref: Aufnahme.objekt_id > Objekt.id [delete: No Action]
Ref: BedarfsausweisGewerbe.benutzer_id > benutzer.id [delete: No Action]
Ref: BedarfsausweisGewerbe.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: BedarfsausweisGewerbe.rechnung_id - Rechnung.id [delete: No Action]
Ref: BedarfsausweisGewerbe.geg_einpreisung_id - GEGEinpreisung.id [delete: No Action]
Ref: BedarfsausweisWohnen.benutzer_id > benutzer.id [delete: No Action]
Ref: BedarfsausweisWohnen.rechnung_id - Rechnung.id [delete: No Action]
Ref: BedarfsausweisWohnen.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: Bild.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: Event.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: Event.benutzer_id > benutzer.id [delete: No Action]
Ref: GEGEinpreisung.benutzer_id > benutzer.id [delete: No Action]
Ref: GEGNachweisGewerbe.benutzer_id > benutzer.id [delete: No Action]
Ref: GEGNachweisGewerbe.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: GEGNachweisGewerbe.rechnung_id - Rechnung.id [delete: No Action]
Ref: GEGNachweisGewerbe.geg_einpreisung_id - GEGEinpreisung.id [delete: No Action]
Ref: GEGNachweisWohnen.benutzer_id > benutzer.id [delete: No Action]
Ref: GEGNachweisWohnen.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: GEGNachweisWohnen.rechnung_id - Rechnung.id [delete: No Action]
Ref: GEGNachweisWohnen.geg_einpreisung_id - GEGEinpreisung.id [delete: No Action]
Ref: Objekt.benutzer_id > benutzer.id
Ref: Rechnung.benutzer_id > benutzer.id [delete: No Action]
Ref: RefreshTokens.benutzer_id > benutzer.id [delete: Cascade]
Ref: Tickets.benutzer_id > benutzer.id
Ref: Tickets.bearbeiter_id > benutzer.id
Ref: Unterlage.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: VerbrauchsausweisGewerbe.benutzer_id > benutzer.id [delete: No Action]
Ref: VerbrauchsausweisGewerbe.rechnung_id - Rechnung.id [delete: No Action]
Ref: VerbrauchsausweisGewerbe.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: VerbrauchsausweisWohnen.benutzer_id > benutzer.id [delete: No Action]
Ref: VerbrauchsausweisWohnen.rechnung_id - Rechnung.id [delete: No Action]
Ref: VerbrauchsausweisWohnen.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: documenttemplates.user_id > benutzer.id [delete: Cascade]
Ref: documenttemplates.documenttype > documenttypes.id [delete: Cascade]
Ref: tokens.user_id > benutzer.id [delete: No Action]

View File

@@ -1,26 +1,8 @@
version: '3'
services:
ibcornelsen-online-energieausweis:
build: ./
command: bun run dev --host
environment:
PORT: 3000
NODE_ENV: "development"
ports:
- "3000:3000"
volumes:
- ./:/online-energieausweis
- ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui
- ./node_modules/@ibcornelsen/database:/online-energieausweis/node_modules/@ibcornelsen/database
# - ./node_modules/@ibcornelsen/api:/online-energieausweis/node_modules/@ibcornelsen/api
- ./node_modules/radix-svelte-icons:/online-energieausweis/node_modules/radix-svelte-icons
- ../api/persistent:/persistent
ibcornelsen-api:
extends:
file: ../api/docker-compose.yml
service: ibcornelsen-api
database:
extends:
file: ../database/docker-compose.yml
service: database
build: ./
env_file:
- .env
ports:
- 5432:5432

View File

@@ -22,7 +22,6 @@
"@astrojs/node": "^8.3.4",
"@astrojs/svelte": "^2.2.0",
"@astrojs/tailwind": "^3.1.3",
"@ibcornelsen/database": "link:@ibcornelsen/database",
"@ibcornelsen/ui": "^0.0.2",
"@mollie/api-client": "^4.1.0",
"@pdfme/common": "^5.2.16",
@@ -52,6 +51,7 @@
"postcss-nested": "^7.0.2",
"radix-svelte-icons": "^1.0.0",
"sass": "^1.83.4",
"sharp": "^0.33.5",
"siema": "^1.5.1",
"soap": "^1.1.8",
"svelte": "^3.59.2",
@@ -68,6 +68,7 @@
"@rollup/plugin-dsv": "^3.0.5",
"@tailwindcss/typography": "^0.5.16",
"@types/body-scroll-lock": "^3.1.2",
"@types/bun": "^1.2.2",
"@types/express": "^5.0.0",
"@types/fontkit": "^2.0.7",
"@types/is-base64": "^1.1.3",
@@ -92,7 +93,12 @@
"postcss-import": "^16.1.0",
"postcss-nesting": "^13.0.1",
"prettier": "^2.8.8",
"typescript": "^4.9.5"
"prisma": "^6.4.1",
"prisma-dbml-generator": "^0.12.0",
"prisma-generator-fake-data": "^0.14.3",
"tsx": "^4.19.3",
"typescript": "^4.9.5",
"zod-prisma": "^0.5.4"
},
"overrides": {
"zod": "^3.24.1"

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@@ -0,0 +1,783 @@
-- CreateEnum
CREATE TYPE "Heizungsstatus" AS ENUM ('BEHEIZT', 'UNBEHEIZT', 'NICHT_VORHANDEN');
-- CreateEnum
CREATE TYPE "Lueftungskonzept" AS ENUM ('Fensterlueftung', 'Schachtlueftung', 'LueftungsanlageMitWaermerueckgewinnung', 'LueftungsanlageOhneWaermerueckgewinnung');
-- CreateEnum
CREATE TYPE "BenutzerRolle" AS ENUM ('USER', 'ADMIN');
-- CreateEnum
CREATE TYPE "BilderKategorie" AS ENUM ('Heizung', 'Fenster', 'Gebaeude', 'Daemmung');
-- CreateEnum
CREATE TYPE "Einpreisungsstatus" AS ENUM ('open', 'canceled', 'pending', 'expired');
-- CreateEnum
CREATE TYPE "Bezahlmethoden" AS ENUM ('paypal', 'giropay', 'sofort', 'creditcard', 'rechnung');
-- CreateEnum
CREATE TYPE "Rechnungsstatus" AS ENUM ('open', 'canceled', 'pending', 'authorized', 'expired', 'failed', 'paid');
-- CreateEnum
CREATE TYPE "AusweisTyp" AS ENUM ('Standard', 'Beratung', 'Offline');
-- CreateEnum
CREATE TYPE "TicketStatus" AS ENUM ('OFFEN', 'IN_BEARBEITUNG', 'IN_WARTESCHLEIFE', 'GESCHLOSSEN', 'GELOEST');
-- CreateEnum
CREATE TYPE "UnterlagenKategorie" AS ENUM ('Grundriss', 'Sonstiges');
-- CreateEnum
CREATE TYPE "Ausstellgrund" AS ENUM ('Neubau', 'Vermietung', 'Verkauf', 'Modernisierung', 'Sonstiges');
-- CreateEnum
CREATE TYPE "Ausweisart" AS ENUM ('VerbrauchsausweisWohnen', 'VerbrauchsausweisGewerbe', 'BedarfsausweisWohnen', 'BedarfsausweisGewerbe', 'GEGNachweisWohnen', 'GEGNachweisBedarfsausweis', 'GEGNachweisGewerbe');
-- CreateEnum
CREATE TYPE "Service" AS ENUM ('Telefonberatung', 'Aushang', 'Qualitaetsdruck', 'SameDay');
-- CreateTable
CREATE TABLE "Anteilshaber" (
"id" SERIAL NOT NULL,
"benutzer_id" INTEGER NOT NULL,
"rolle" VARCHAR,
"privilegien" BIGINT,
"uid" TEXT NOT NULL DEFAULT 'ant-' || gen_random_uuid(),
"objekt_id" INTEGER NOT NULL,
CONSTRAINT "Anteilshaber_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ApiRequests" (
"id" SERIAL NOT NULL,
"date" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"ip" VARCHAR(50) NOT NULL,
"method" VARCHAR(10) NOT NULL,
"path" VARCHAR(100) NOT NULL,
"status" INTEGER NOT NULL,
"responseTime" DOUBLE PRECISION NOT NULL,
"responseSize" INTEGER NOT NULL,
"userAgent" VARCHAR(500) NOT NULL,
"user_id" INTEGER,
CONSTRAINT "ApiRequests_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Aufnahme" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'auf-' || gen_random_uuid(),
"benutzer_id" INTEGER,
"ausweisart" "Ausweisart",
"gebaeudetyp" VARCHAR,
"gebaeudeteil" VARCHAR,
"baujahr_gebaeude" INTEGER[],
"baujahr_heizung" INTEGER[],
"baujahr_klima" INTEGER[],
"einheiten" INTEGER,
"flaeche" INTEGER,
"nutzflaeche" INTEGER,
"saniert" BOOLEAN,
"keller" "Heizungsstatus",
"dachgeschoss" "Heizungsstatus",
"lueftung" "Lueftungskonzept",
"kuehlung" VARCHAR(50),
"leerstand" INTEGER,
"alternative_heizung" BOOLEAN,
"alternative_warmwasser" BOOLEAN,
"alternative_lueftung" BOOLEAN,
"alternative_kuehlung" BOOLEAN,
"brennstoff_1" VARCHAR(50),
"brennstoff_2" VARCHAR(50),
"boxpruefung" BOOLEAN DEFAULT false,
"energieeffizienzklasse" VARCHAR(5),
"erstellungsdatum" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
"ausstellungsdatum" TIMESTAMP(3),
"zentralheizung" BOOLEAN,
"solarsystem_warmwasser" BOOLEAN,
"warmwasser_rohre_gedaemmt" BOOLEAN,
"niedertemperatur_kessel" BOOLEAN,
"brennwert_kessel" BOOLEAN,
"heizungsrohre_gedaemmt" BOOLEAN,
"standard_kessel" BOOLEAN,
"waermepumpe" BOOLEAN,
"raum_temperatur_regler" BOOLEAN,
"photovoltaik" BOOLEAN,
"durchlauf_erhitzer" BOOLEAN,
"einzelofen" BOOLEAN,
"zirkulation" BOOLEAN,
"einfach_verglasung" BOOLEAN,
"dreifach_verglasung" BOOLEAN,
"fenster_teilweise_undicht" BOOLEAN,
"doppel_verglasung" BOOLEAN,
"fenster_dicht" BOOLEAN,
"rolllaeden_kaesten_gedaemmt" BOOLEAN,
"isolier_verglasung" BOOLEAN,
"tueren_undicht" BOOLEAN,
"tueren_dicht" BOOLEAN,
"dachgeschoss_gedaemmt" BOOLEAN,
"keller_decke_gedaemmt" BOOLEAN,
"keller_wand_gedaemmt" BOOLEAN,
"aussenwand_gedaemmt" BOOLEAN,
"oberste_geschossdecke_gedaemmt" BOOLEAN,
"aussenwand_min_12cm_gedaemmt" BOOLEAN,
"dachgeschoss_min_12cm_gedaemmt" BOOLEAN,
"oberste_geschossdecke_min_12cm_gedaemmt" BOOLEAN,
"objekt_id" INTEGER NOT NULL,
CONSTRAINT "Aufnahme_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "BedarfsausweisGewerbe" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'bag-' || gen_random_uuid(),
"benutzer_id" INTEGER,
"aufnahme_id" INTEGER NOT NULL,
"rechnung_id" INTEGER,
"geg_einpreisung_id" INTEGER,
CONSTRAINT "BedarfsausweisGewerbe_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "BedarfsausweisWohnen" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'baw-' || gen_random_uuid(),
"benutzer_id" INTEGER,
"ausstellgrund" "Ausstellgrund",
"registriernummer" VARCHAR,
"alternative_heizung" BOOLEAN,
"alternative_warmwasser" BOOLEAN,
"alternative_lueftung" BOOLEAN,
"alternative_kuehlung" BOOLEAN,
"anzahl_vollgeschosse" INTEGER,
"geschosshoehe" DOUBLE PRECISION,
"anzahl_gauben" INTEGER,
"breite_gauben" DOUBLE PRECISION,
"masse_a" DOUBLE PRECISION,
"masse_b" DOUBLE PRECISION,
"masse_c" DOUBLE PRECISION,
"masse_d" DOUBLE PRECISION,
"masse_e" DOUBLE PRECISION,
"masse_f" DOUBLE PRECISION,
"fensterflaeche_so_sw" DOUBLE PRECISION,
"fensterflaeche_nw_no" DOUBLE PRECISION,
"aussenwandflaeche_unbeheizt" DOUBLE PRECISION,
"dachflaeche" DOUBLE PRECISION,
"deckenflaeche" DOUBLE PRECISION,
"dach_u_wert" DOUBLE PRECISION,
"decke_u_wert" DOUBLE PRECISION,
"aussenwand_flaeche" DOUBLE PRECISION,
"aussenwand_u_wert" DOUBLE PRECISION,
"fussboden_flaeche" DOUBLE PRECISION,
"fussboden_u_wert" DOUBLE PRECISION,
"volumen" DOUBLE PRECISION,
"dicht" BOOLEAN,
"fenster_flaeche_1" DOUBLE PRECISION,
"fenster_art_1" DOUBLE PRECISION,
"fenster_flaeche_2" DOUBLE PRECISION,
"fenster_art_2" DOUBLE PRECISION,
"dachfenster_flaeche" DOUBLE PRECISION,
"dachfenster_art" DOUBLE PRECISION,
"haustuer_flaeche" DOUBLE PRECISION,
"haustuer_art" DOUBLE PRECISION,
"dach_bauart" VARCHAR,
"decke_bauart" VARCHAR,
"dach_daemmung" DOUBLE PRECISION,
"decke_daemmung" DOUBLE PRECISION,
"aussenwand_daemmung" DOUBLE PRECISION,
"boden_daemmung" DOUBLE PRECISION,
"aussenwand_bauart" VARCHAR,
"boden_bauart" VARCHAR,
"warmwasser_verteilung" VARCHAR,
"warmwasser_speicherung" VARCHAR,
"warmwasser_erzeugung" VARCHAR,
"heizung_zentral" BOOLEAN,
"heizung_verteilung" VARCHAR,
"heizung_speicherung" VARCHAR,
"waerme_erzeugung_heizung" VARCHAR,
"anteil_zusatzheizung" DOUBLE PRECISION,
"kollektor_flaeche" DOUBLE PRECISION,
"ausgestellt" BOOLEAN DEFAULT false,
"storniert" BOOLEAN DEFAULT false,
"bestellt" BOOLEAN DEFAULT false,
"zurueckgestellt" BOOLEAN DEFAULT false,
"prueftext" VARCHAR(1000),
"beschreibung" TEXT,
"kontrolldatei_angefragt" BOOLEAN DEFAULT false,
"rechnung_id" INTEGER,
"aufnahme_id" INTEGER NOT NULL,
CONSTRAINT "BedarfsausweisWohnen_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "benutzer" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'usr-' || gen_random_uuid(),
"name" VARCHAR(50),
"vorname" VARCHAR(50),
"email" VARCHAR(255) NOT NULL,
"passwort" VARCHAR(255) NOT NULL,
"profilbild" VARCHAR,
"plz" VARCHAR(5),
"ort" VARCHAR(50),
"adresse" VARCHAR(100),
"telefon" VARCHAR(50),
"anrede" VARCHAR(50),
"rolle" "BenutzerRolle" NOT NULL DEFAULT 'USER',
"firma" TEXT,
"lex_office_id" TEXT,
CONSTRAINT "benutzer_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Bild" (
"id" SERIAL NOT NULL,
"kategorie" "BilderKategorie" NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'img-' || gen_random_uuid(),
"aufnahme_id" INTEGER,
CONSTRAINT "Bild_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Event" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'evt-' || gen_random_uuid(),
"date" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"title" VARCHAR(255) NOT NULL,
"description" TEXT,
"aufnahme_id" INTEGER NOT NULL,
"benutzer_id" INTEGER,
CONSTRAINT "Event_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "GEGEinpreisung" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'gge-' || gen_random_uuid(),
"empfaenger" VARCHAR,
"strasse" VARCHAR,
"plz" VARCHAR,
"ort" VARCHAR,
"zusatzzeile" VARCHAR,
"telefon" VARCHAR,
"email" VARCHAR,
"abweichende_versand_adresse" BOOLEAN DEFAULT false,
"versand_empfaenger" VARCHAR,
"versand_strasse" VARCHAR,
"versand_plz" VARCHAR,
"versand_ort" VARCHAR,
"versand_zusatzzeile" VARCHAR,
"status" "Einpreisungsstatus" NOT NULL,
"benutzer_id" INTEGER,
CONSTRAINT "GEGEinpreisung_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "GEGNachweisGewerbe" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'gnw-' || gen_random_uuid(),
"ausstellgrund" "Ausstellgrund",
"keller_beheizt" BOOLEAN,
"storniert" BOOLEAN DEFAULT false,
"bestellt" BOOLEAN DEFAULT false,
"zurueckgestellt" BOOLEAN DEFAULT false,
"beschreibung" TEXT,
"benutzer_id" INTEGER,
"aufnahme_id" INTEGER NOT NULL,
"rechnung_id" INTEGER,
"geg_einpreisung_id" INTEGER,
CONSTRAINT "GEGNachweisGewerbe_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "GEGNachweisWohnen" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'gnw-' || gen_random_uuid(),
"ausstellgrund" "Ausstellgrund",
"keller_beheizt" BOOLEAN,
"storniert" BOOLEAN DEFAULT false,
"bestellt" BOOLEAN DEFAULT false,
"zurueckgestellt" BOOLEAN DEFAULT false,
"beschreibung" TEXT,
"benutzer_id" INTEGER,
"aufnahme_id" INTEGER NOT NULL,
"rechnung_id" INTEGER,
"geg_einpreisung_id" INTEGER,
CONSTRAINT "GEGNachweisWohnen_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Klimafaktoren" (
"id" SERIAL NOT NULL,
"plz" VARCHAR(5) NOT NULL,
"month" INTEGER NOT NULL,
"year" INTEGER NOT NULL,
"klimafaktor" DOUBLE PRECISION NOT NULL DEFAULT 1,
CONSTRAINT "Klimafaktoren_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Objekt" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'obj-' || gen_random_uuid(),
"benutzer_id" INTEGER,
"latitude" DOUBLE PRECISION,
"longitude" DOUBLE PRECISION,
"plz" VARCHAR(5),
"ort" VARCHAR(50),
"adresse" VARCHAR(100),
"erstellungsdatum" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "Objekt_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Postleitzahlen" (
"id" SERIAL NOT NULL,
"plz" VARCHAR(5) NOT NULL,
"stadt" VARCHAR(100) NOT NULL,
"bundesland" VARCHAR(100) NOT NULL,
"landkreis" VARCHAR(100) NOT NULL,
"lat" DOUBLE PRECISION NOT NULL,
"lon" DOUBLE PRECISION NOT NULL,
CONSTRAINT "Postleitzahlen_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Rechnung" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'inv-' || gen_random_uuid(),
"benutzer_id" INTEGER NOT NULL,
"empfaenger" VARCHAR,
"strasse" VARCHAR,
"plz" VARCHAR,
"ort" VARCHAR,
"zusatzzeile" VARCHAR,
"telefon" VARCHAR,
"email" VARCHAR,
"abweichende_versand_adresse" BOOLEAN DEFAULT false,
"versand_empfaenger" VARCHAR,
"versand_strasse" VARCHAR,
"versand_plz" VARCHAR,
"versand_ort" VARCHAR,
"versand_zusatzzeile" VARCHAR,
"bezahlmethode" "Bezahlmethoden" NOT NULL,
"status" "Rechnungsstatus" NOT NULL,
"services" "Service"[],
"ausweistyp" "AusweisTyp" NOT NULL DEFAULT 'Standard',
"betrag" DOUBLE PRECISION NOT NULL,
"erstellt_am" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"bezahlt_am" TIMESTAMP(3),
"storniert_am" TIMESTAMP(3),
"transaktions_referenz" VARCHAR,
CONSTRAINT "Rechnung_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "RefreshTokens" (
"id" SERIAL NOT NULL,
"benutzer_id" INTEGER NOT NULL,
"token" TEXT NOT NULL,
"ip" TEXT NOT NULL,
"expiry" TIMESTAMP(3) NOT NULL,
CONSTRAINT "RefreshTokens_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Tickets" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'tkt-' || gen_random_uuid(),
"benutzer_id" INTEGER,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3),
"deleted_at" TIMESTAMP(3),
"status" "TicketStatus" NOT NULL DEFAULT 'OFFEN',
"titel" TEXT NOT NULL,
"beschreibung" TEXT NOT NULL,
"metadata" JSONB,
"email" TEXT NOT NULL,
"bearbeiter_id" INTEGER,
"prioritaet" INTEGER DEFAULT 0,
CONSTRAINT "Tickets_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Unterlage" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'pln-' || gen_random_uuid(),
"name" TEXT,
"kategorie" TEXT,
"mime" TEXT,
"aufnahme_id" INTEGER,
CONSTRAINT "Unterlage_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "VerbrauchsausweisGewerbe" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'vag-' || gen_random_uuid(),
"benutzer_id" INTEGER,
"ausstellgrund" "Ausstellgrund",
"registriernummer" VARCHAR,
"zusaetzliche_heizquelle" BOOLEAN,
"brennstoff_1" VARCHAR(50),
"einheit_1" VARCHAR(50),
"brennstoff_2" VARCHAR(50),
"einheit_2" VARCHAR(50),
"startdatum" TIMESTAMP(6),
"verbrauch_1" INTEGER,
"verbrauch_2" INTEGER,
"verbrauch_3" INTEGER,
"verbrauch_4" INTEGER,
"verbrauch_5" INTEGER,
"verbrauch_6" INTEGER,
"strom_1" INTEGER,
"strom_2" INTEGER,
"strom_3" INTEGER,
"stromverbrauch_enthaelt_heizung" BOOLEAN,
"stromverbrauch_enthaelt_warmwasser" BOOLEAN,
"stromverbrauch_enthaelt_lueftung" BOOLEAN,
"stromverbrauch_enthaelt_beleuchtung" BOOLEAN,
"stromverbrauch_enthaelt_kuehlung" BOOLEAN,
"stromverbrauch_enthaelt_sonstige" VARCHAR(50),
"kuehlung_enthalten" BOOLEAN,
"anteil_kuehlung_1" DOUBLE PRECISION,
"anteil_kuehlung_2" DOUBLE PRECISION,
"keller_beheizt" BOOLEAN,
"alternative_heizung" BOOLEAN,
"alternative_warmwasser" BOOLEAN,
"alternative_lueftung" BOOLEAN,
"alternative_kuehlung" BOOLEAN,
"warmwasser_enthalten" BOOLEAN,
"anteil_warmwasser_1" DOUBLE PRECISION,
"anteil_warmwasser_2" DOUBLE PRECISION,
"ausgestellt" BOOLEAN DEFAULT false,
"storniert" BOOLEAN DEFAULT false,
"bestellt" BOOLEAN DEFAULT false,
"zurueckgestellt" BOOLEAN DEFAULT false,
"prueftext" VARCHAR(1000),
"beschreibung" TEXT,
"kontrolldatei_angefragt" BOOLEAN DEFAULT false,
"rechnung_id" INTEGER,
"aufnahme_id" INTEGER NOT NULL,
CONSTRAINT "VerbrauchsausweisGewerbe_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "VerbrauchsausweisWohnen" (
"id" SERIAL NOT NULL,
"uid" TEXT NOT NULL DEFAULT 'vaw-' || gen_random_uuid(),
"benutzer_id" INTEGER,
"ausstellgrund" "Ausstellgrund",
"registriernummer" VARCHAR,
"zusaetzliche_heizquelle" BOOLEAN,
"einheit_1" VARCHAR(50),
"einheit_2" VARCHAR(50),
"startdatum" TIMESTAMPTZ(6),
"verbrauch_1" INTEGER,
"verbrauch_2" INTEGER,
"verbrauch_3" INTEGER,
"verbrauch_4" INTEGER,
"verbrauch_5" INTEGER,
"verbrauch_6" INTEGER,
"warmwasser_enthalten" BOOLEAN,
"warmwasser_anteil_bekannt" BOOLEAN,
"keller_beheizt" BOOLEAN,
"faktorKeller" DOUBLE PRECISION,
"alternative_heizung" BOOLEAN,
"alternative_warmwasser" BOOLEAN,
"alternative_lueftung" BOOLEAN,
"alternative_kuehlung" BOOLEAN,
"anteil_warmwasser_1" DOUBLE PRECISION,
"anteil_warmwasser_2" DOUBLE PRECISION,
"ausgestellt" BOOLEAN DEFAULT false,
"storniert" BOOLEAN DEFAULT false,
"bestellt" BOOLEAN DEFAULT false,
"zurueckgestellt" BOOLEAN DEFAULT false,
"prueftext" VARCHAR(1000),
"beschreibung" TEXT,
"kontrolldatei_angefragt" BOOLEAN DEFAULT false,
"rechnung_id" INTEGER,
"aufnahme_id" INTEGER NOT NULL,
CONSTRAINT "VerbrauchsausweisWohnen_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "documenttemplates" (
"id" SERIAL NOT NULL,
"name" VARCHAR(100) NOT NULL,
"shortdescription" VARCHAR(100) NOT NULL,
"longdescription" VARCHAR(5000) NOT NULL,
"user_id" INTEGER NOT NULL,
"is_private" BOOLEAN NOT NULL DEFAULT true,
"documenttype" INTEGER NOT NULL,
"filename" VARCHAR(100) NOT NULL,
"created_at" TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "PK_DOCUMENTTEMPLATES" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "documenttypes" (
"id" SERIAL NOT NULL,
"name" VARCHAR(100) NOT NULL,
"shortdescription" VARCHAR(100) NOT NULL,
"longdescription" VARCHAR(5000) NOT NULL,
CONSTRAINT "PK_DOCUMENTTYPES" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "tokens" (
"id" SERIAL NOT NULL,
"token" VARCHAR(36) NOT NULL,
"user_id" INTEGER NOT NULL,
"date_created" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"last_used" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"times_used" INTEGER NOT NULL DEFAULT 0,
"permissions" INTEGER NOT NULL DEFAULT 0,
CONSTRAINT "PK_TOKENS" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "Anteilshaber_uid_key" ON "Anteilshaber"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "Aufnahme_uid_key" ON "Aufnahme"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisGewerbe_uid_key" ON "BedarfsausweisGewerbe"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisGewerbe_aufnahme_id_key" ON "BedarfsausweisGewerbe"("aufnahme_id");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisGewerbe_rechnung_id_key" ON "BedarfsausweisGewerbe"("rechnung_id");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisGewerbe_geg_einpreisung_id_key" ON "BedarfsausweisGewerbe"("geg_einpreisung_id");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisWohnen_uid_key" ON "BedarfsausweisWohnen"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisWohnen_rechnung_id_key" ON "BedarfsausweisWohnen"("rechnung_id");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisWohnen_aufnahme_id_key" ON "BedarfsausweisWohnen"("aufnahme_id");
-- CreateIndex
CREATE UNIQUE INDEX "benutzer_uid_key" ON "benutzer"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "benutzer_email_idx" ON "benutzer"("email");
-- CreateIndex
CREATE UNIQUE INDEX "Bild_uid_key" ON "Bild"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "Event_uid_key" ON "Event"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "GEGEinpreisung_uid_key" ON "GEGEinpreisung"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisGewerbe_uid_key" ON "GEGNachweisGewerbe"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisGewerbe_aufnahme_id_key" ON "GEGNachweisGewerbe"("aufnahme_id");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisGewerbe_rechnung_id_key" ON "GEGNachweisGewerbe"("rechnung_id");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisGewerbe_geg_einpreisung_id_key" ON "GEGNachweisGewerbe"("geg_einpreisung_id");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisWohnen_uid_key" ON "GEGNachweisWohnen"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisWohnen_aufnahme_id_key" ON "GEGNachweisWohnen"("aufnahme_id");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisWohnen_rechnung_id_key" ON "GEGNachweisWohnen"("rechnung_id");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisWohnen_geg_einpreisung_id_key" ON "GEGNachweisWohnen"("geg_einpreisung_id");
-- CreateIndex
CREATE UNIQUE INDEX "Klimafaktoren_plz_month_year_key" ON "Klimafaktoren"("plz", "month", "year");
-- CreateIndex
CREATE UNIQUE INDEX "Objekt_uid_key" ON "Objekt"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "Rechnung_uid_key" ON "Rechnung"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "Rechnung_transaktions_referenz_key" ON "Rechnung"("transaktions_referenz");
-- CreateIndex
CREATE UNIQUE INDEX "RefreshTokens_token_key" ON "RefreshTokens"("token");
-- CreateIndex
CREATE UNIQUE INDEX "Tickets_uid_key" ON "Tickets"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "Unterlage_uid_key" ON "Unterlage"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "VerbrauchsausweisGewerbe_uid_key" ON "VerbrauchsausweisGewerbe"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "VerbrauchsausweisGewerbe_rechnung_id_key" ON "VerbrauchsausweisGewerbe"("rechnung_id");
-- CreateIndex
CREATE UNIQUE INDEX "VerbrauchsausweisGewerbe_aufnahme_id_key" ON "VerbrauchsausweisGewerbe"("aufnahme_id");
-- CreateIndex
CREATE UNIQUE INDEX "VerbrauchsausweisWohnen_uid_key" ON "VerbrauchsausweisWohnen"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "VerbrauchsausweisWohnen_rechnung_id_key" ON "VerbrauchsausweisWohnen"("rechnung_id");
-- CreateIndex
CREATE UNIQUE INDEX "VerbrauchsausweisWohnen_aufnahme_id_key" ON "VerbrauchsausweisWohnen"("aufnahme_id");
-- AddForeignKey
ALTER TABLE "Anteilshaber" ADD CONSTRAINT "Anteilshaber_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Anteilshaber" ADD CONSTRAINT "Anteilshaber_objekt_id_fkey" FOREIGN KEY ("objekt_id") REFERENCES "Objekt"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "ApiRequests" ADD CONSTRAINT "ApiRequests_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Aufnahme" ADD CONSTRAINT "Aufnahme_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Aufnahme" ADD CONSTRAINT "Aufnahme_objekt_id_fkey" FOREIGN KEY ("objekt_id") REFERENCES "Objekt"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisGewerbe" ADD CONSTRAINT "BedarfsausweisGewerbe_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisGewerbe" ADD CONSTRAINT "BedarfsausweisGewerbe_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisGewerbe" ADD CONSTRAINT "BedarfsausweisGewerbe_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisGewerbe" ADD CONSTRAINT "BedarfsausweisGewerbe_geg_einpreisung_id_fkey" FOREIGN KEY ("geg_einpreisung_id") REFERENCES "GEGEinpreisung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisWohnen" ADD CONSTRAINT "BedarfsausweisWohnen_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisWohnen" ADD CONSTRAINT "BedarfsausweisWohnen_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisWohnen" ADD CONSTRAINT "BedarfsausweisWohnen_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Bild" ADD CONSTRAINT "Bild_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Event" ADD CONSTRAINT "Event_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Event" ADD CONSTRAINT "Event_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGEinpreisung" ADD CONSTRAINT "GEGEinpreisung_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisGewerbe" ADD CONSTRAINT "GEGNachweisGewerbe_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisGewerbe" ADD CONSTRAINT "GEGNachweisGewerbe_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisGewerbe" ADD CONSTRAINT "GEGNachweisGewerbe_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisGewerbe" ADD CONSTRAINT "GEGNachweisGewerbe_geg_einpreisung_id_fkey" FOREIGN KEY ("geg_einpreisung_id") REFERENCES "GEGEinpreisung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisWohnen" ADD CONSTRAINT "GEGNachweisWohnen_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisWohnen" ADD CONSTRAINT "GEGNachweisWohnen_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisWohnen" ADD CONSTRAINT "GEGNachweisWohnen_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisWohnen" ADD CONSTRAINT "GEGNachweisWohnen_geg_einpreisung_id_fkey" FOREIGN KEY ("geg_einpreisung_id") REFERENCES "GEGEinpreisung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Objekt" ADD CONSTRAINT "Objekt_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Rechnung" ADD CONSTRAINT "Rechnung_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "RefreshTokens" ADD CONSTRAINT "RefreshTokens_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Tickets" ADD CONSTRAINT "Tickets_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Tickets" ADD CONSTRAINT "Tickets_bearbeiter_id_fkey" FOREIGN KEY ("bearbeiter_id") REFERENCES "benutzer"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Unterlage" ADD CONSTRAINT "Unterlage_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" ADD CONSTRAINT "VerbrauchsausweisGewerbe_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" ADD CONSTRAINT "VerbrauchsausweisGewerbe_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" ADD CONSTRAINT "VerbrauchsausweisGewerbe_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" ADD CONSTRAINT "VerbrauchsausweisWohnen_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" ADD CONSTRAINT "VerbrauchsausweisWohnen_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" ADD CONSTRAINT "VerbrauchsausweisWohnen_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "documenttemplates" ADD CONSTRAINT "benutzer_fk" FOREIGN KEY ("user_id") REFERENCES "benutzer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "documenttemplates" ADD CONSTRAINT "documenttypes_fk" FOREIGN KEY ("documenttype") REFERENCES "documenttypes"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "tokens" ADD CONSTRAINT "fk_benutzer_tokens_user_id" FOREIGN KEY ("user_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;

View File

@@ -0,0 +1,47 @@
-- AlterTable
ALTER TABLE "Anteilshaber" ALTER COLUMN "uid" SET DEFAULT 'ant-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Aufnahme" ALTER COLUMN "uid" SET DEFAULT 'auf-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'bag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'baw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Bild" ALTER COLUMN "uid" SET DEFAULT 'img-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Event" ALTER COLUMN "uid" SET DEFAULT 'evt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGEinpreisung" ALTER COLUMN "uid" SET DEFAULT 'gge-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Objekt" ALTER COLUMN "uid" SET DEFAULT 'obj-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Rechnung" ALTER COLUMN "uid" SET DEFAULT 'inv-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Tickets" ALTER COLUMN "uid" SET DEFAULT 'tkt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Unterlage" ALTER COLUMN "uid" SET DEFAULT 'pln-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'vag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'vaw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "benutzer" ALTER COLUMN "uid" SET DEFAULT 'usr-' || gen_random_uuid();

View File

@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "postgresql"

1
prisma/null.ts Normal file
View File

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

View File

@@ -0,0 +1,37 @@
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 const ${e.name} = {\n`;
e.values.forEach(({ name: value }) => {
enumString += ` ${value}: "${value}",\n`;
});
enumString += `} as const;\n\n`;
enumString += `export type ${e.name} = (typeof ${e.name})[keyof typeof ${e.name}];\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")
}

382
prisma/seed.ts Normal file
View File

@@ -0,0 +1,382 @@
// 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/lib/client/prisma";
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,
},
},
verbrauchsausweise_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,
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);
}

View File

@@ -9,6 +9,6 @@ app.use(ssrHandler);
app.use(express.json({ limit: "50mb" }))
app.use(express.urlencoded({ limit: "50mb" }))
app.listen(80, function() {
console.log('Server started on http://localhost:80');
app.listen(3000, function() {
console.log('Server started on http://localhost:3000');
});

View File

@@ -4,7 +4,7 @@ import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
export async function ausweisSpeichern(
ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,

View File

@@ -4,7 +4,7 @@ import {
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
import { addNotification, updateNotification } from "@ibcornelsen/ui";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";

View File

@@ -4,7 +4,7 @@ import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BildClient, ObjektClient, UnterlageClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
export async function nachweisSpeichern(
nachweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,

View File

@@ -1,7 +1,7 @@
<script lang="ts">
import { Buffer } from "buffer";
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
import { openWindowWithPost } from "#lib/helpers/window.js";
export let ausweis: VerbrauchsausweisWohnenClient;

View File

@@ -2,8 +2,6 @@
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import { Enums } from "@ibcornelsen/database/client";
import { hotWaterProductionTypes } from "#modules/BedarfsausweisWohnen/HotWaterProductionTypes.js";
export let ausweis;

View File

@@ -6,7 +6,7 @@
import ImageGrid from "#components/ImageGrid.svelte";
import {
Enums,
} from "@ibcornelsen/database/client";
} from "#lib/client/prisma";
import {
AufnahmeClient,

View File

@@ -7,7 +7,7 @@
import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { addNotification, deleteNotification } from "#components/Notifications/shared.js";
import TagInput from "../TagInput.svelte";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma.js";
import {
BedarfsausweisWohnenClient,
AufnahmeClient,

View File

@@ -5,14 +5,14 @@
import Overlay from "#components/Overlay.svelte";
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
import { AusweisTyp, Enums } from "@ibcornelsen/database/client";
import { AusweisTyp, Enums } from "#lib/client/prisma.js";
import { openWindowWithPost } from "#lib/helpers/window.js";
import { PRICES } from "#lib/constants.js";
import { nachweisSpeichern } from "#client/lib/nachweisSpeichern.js";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient | GEGNachweisWohnenClient;
export let bilder: UploadedGebaeudeBild[];
export let unterlagen: UnterlageClient[];
export let unterlagen: UnterlageClient[] = [];
export let user: BenutzerClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
@@ -20,7 +20,7 @@
export let showWeiter: boolean = true;
let ausweistyp: AusweisTyp = Enums.AusweisTyp.Standard;
export let ausweistyp: AusweisTyp = Enums.AusweisTyp.Standard;
async function ausweisAbschicken() {
openWindowWithPost("/kundendaten", {

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import ImageGrid from "../ImageGrid.svelte";;
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = [];

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import ImageGrid from "../ImageGrid.svelte";;
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = [];

View File

@@ -4,7 +4,7 @@
import Inputlabel from "#components/labels/InputLabel.svelte";
import ZipSearch from "#components/PlzSuche.svelte";
import { Enums } from "@ibcornelsen/database/client"
import { Enums } from "#lib/client/prisma.js"
import { AufnahmeClient, ObjektClient } from "./types.js";
export let aufnahme: AufnahmeClient;

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import ImageGrid from "../ImageGrid.svelte";;
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = [];

View File

@@ -9,7 +9,7 @@
VerbrauchsausweisWohnenClient,
} from "./types.js";
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;

View File

@@ -62,8 +62,8 @@
fuelMap[fuel[0]].push(fuel[1]);
}
let month = moment(ausweis.startdatum).month();
let year = moment(ausweis.startdatum).year();
let month = availableDates[availableDates.length - 1].month;
let year = availableDates[availableDates.length - 1].year;
$: {
if (typeof month === "number" && typeof year === "number") {

View File

@@ -12,7 +12,7 @@ import {
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
GEGNachweisWohnen,
} from "@ibcornelsen/database/client";
} from "#lib/client/prisma";
import { z, ZodSchema } from "zod";
export type OmitKeys<T, K extends keyof T> = Omit<T, K>;

View File

@@ -12,7 +12,7 @@
import { addNotification } from "#components/Notifications/shared.js";
import { CheckCircled, CrossCircled, Image } from "radix-svelte-icons";
import ChevronDown from "radix-svelte-icons/src/lib/icons/ChevronDown.svelte";
import { Event } from "@ibcornelsen/database/client";
import { Event } from "#lib/client/prisma.js";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
@@ -748,7 +748,7 @@
{#each bilder as image}
<div>
<h2 class="text-lg mb-4 font-bold">{image.kategorie}</h2>
<img src="/bilder/{image.uid}.webp">
<img src="/bilder/{image.uid}.jpg">
</div>
{/each}
{/if}

View File

@@ -13,7 +13,7 @@
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { Enums, Objekt } from "@ibcornelsen/database/client";
import { Enums, Objekt } from "#lib/client/prisma";
export let ausweis: VerbrauchsausweisWohnenClient;
export let aufnahme: AufnahmeKomplettClient;

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { ObjektKomplettClient } from "#components/Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/server";
import { Enums } from "#lib/client/prisma.js";
import moment from "moment";
import { File, OpenInNewWindow } from "radix-svelte-icons";
@@ -12,7 +12,7 @@
{@const bild = objekt.aufnahmen[0].bilder.find(bild => bild.kategorie === Enums.BilderKategorie.Gebaeude)}
{#if bild}
<img src="/bilder/{bild.uid}.webp" class="w-full max-h-72 object-cover rounded-t-lg" alt="Gebäude">
<img src="/bilder/{bild.uid}.jpg" class="w-full max-h-72 object-cover rounded-t-lg" alt="Gebäude">
{/if}
{/if}

View File

@@ -30,7 +30,7 @@
</button>
<a href="/" class="block md:hidden"
><img
src="/images/header/logo-big.svg"
src="/images/header/logo-IBC-big.svg"
class="w-24"
alt="IBCornelsen - Logo"
/></a
@@ -40,7 +40,7 @@
<aside class:hidden={!headerOpen} class="fixed left-0 top-16 w-full h-[calc(100%-4rem)] flex z-30 md:relative md:h-auto md:w-auto md:top-0 md:flex bg-base-200 border-r border-r-base-300 flex-col py-4">
<a href="/" class="px-8 hidden md:block"
><img
src="/images/header/logo-big.svg"
src="/images/header/logo-IBC-big.svg"
class="w-24"
alt="IBCornelsen - Logo"
/></a
@@ -83,16 +83,6 @@
Ausweise Prüfen
</a>
</li>
<li>
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/pdf-designer">
PDF Designer
</a>
</li>
<li>
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/pdf-viewer">
PDF Viewer
</a>
</li>
</ul>
</details></li>
{/if}

View File

@@ -1,7 +1,7 @@
<script lang="ts">
import { Buffer } from "buffer";
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
import { openWindowWithPost } from "#lib/helpers/window.js";
export let ausweis: VerbrauchsausweisWohnenClient;

View File

@@ -7,7 +7,7 @@
import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { addNotification, deleteNotification } from "#components/Notifications/shared.js";
import TagInput from "../TagInput.svelte";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma.js";
import {
AufnahmeClient,
ObjektClient,

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import UploadImages from "./UploadImages.svelte";
import type { Enums } from "@ibcornelsen/database/client";
import type { Enums } from "#lib/client/prisma";
import { BedarfsausweisWohnenClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons";
@@ -15,7 +15,7 @@
async function rotateImage(image: UploadedGebaeudeBild): Promise<UploadedGebaeudeBild> {
return new Promise((resolve, reject) => {
let img = new Image();
img.src = image.data ? image.data : `/bilder/${image.uid}.webp`;
img.src = image.data ? image.data : `/bilder/${image.uid}.jpg`;
img.onload = () => {
let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
@@ -25,7 +25,7 @@
ctx?.rotate((-90 * Math.PI) / 180);
ctx?.drawImage(img, -img.width / 2, -img.height / 2);
const clone = Object.assign({}, image)
clone.data = canvas.toDataURL("image/webp");
clone.data = canvas.toDataURL("image/jpeg");
clone.update = true;
resolve(clone)
};
@@ -42,7 +42,7 @@
{#if image.kategorie == kategorie}
<div class="relative group">
<img
src="/bilder/{image.uid}.webp"
src="/bilder/{image.uid}.jpg"
alt={kategorie}
class="h-full max-h-96 w-full rounded-lg border-2 group-hover:contrast-50 object-cover transition-all"
/>

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import type { Bezahlmethoden } from "@ibcornelsen/database/client";
import type { Bezahlmethoden } from "#lib/client/prisma";
export let name: string;
export let icon: string;

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte";
import type { Enums } from "@ibcornelsen/database/client";
import type { Enums } from "#lib/client/prisma";
export let max: number = 2;
export let min: number = 1;

View File

@@ -2,7 +2,7 @@
import { PRICES } from "#lib/constants";
export let bullets;
export let title;
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
bullets = [
["Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",true, true, true],

View File

@@ -2,7 +2,7 @@
import { PRICES } from "#lib/constants";
export let bullets;
export let title;
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
bullets = [
["Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",true, true, true],

View File

@@ -1,6 +1,6 @@
<script>
import { PRICES } from "#lib/constants";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
export let bullets;
export let title;

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
export let bullets;
export let title;

View File

@@ -1,6 +1,6 @@
<script>
import { PRICES } from "#lib/constants";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
</script>
<div class="mt-6 mb-6 m-auto w-[99%] relative">

View File

@@ -1,6 +1,6 @@
<script>
import { PRICES } from "#lib/constants";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
</script>
<div class="mt-6 mb-6 m-auto w-[99%] relative">

View File

@@ -4,7 +4,7 @@ import CardPriceiInfo from "#components/design/sidebars/cards/cardPriceiInfo.sve
import CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
import { PRICES } from "#lib/constants";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
---

View File

@@ -4,7 +4,7 @@ import CardPriceiInfo from "#components/design/sidebars/cards/cardPriceiInfo.sve
import CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
import { PRICES } from "#lib/constants";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
---
<div class="hidden 2xl:block">

View File

@@ -227,22 +227,22 @@
{#if innerWidth < 1023}
<li><a href="index">Verbrauchsausweis</a></li>
{/if}
<li><a href="/verbrauchsausweis/verbrauchsausweis-wohngebaeude">Verbrauchsausweis Wohngebäude</a></li>
<li><a href="/verbrauchsausweis/verbrauchsausweis-wohngebaeude/">Verbrauchsausweis Wohngebäude</a></li>
<li><a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/">Verbrauchsausweis online erstellen</a></li>
<li><a href="/verbrauchsausweis/haeufige-fragen-zum-verbrauchsausweis/">Häufige Fragen zum Verbrauchsausweis</a></li>
<li>
<a href="/verbrauchsausweis/statistiken-zum-verbrauchsausweis/">Statistiken zum Verbrauchsausweis Wohngebäude</a
>
</li>
<li><a href="index">Verbrauchsausweis Gewerbe</a></li>
<li><a href="/verbrauchsausweis/verbrauchsausweis-gewerbe/">Verbrauchsausweis Gewerbe</a></li>
<li>
<a href="index">Verbrauchsausweis Gewerbe online erstellen</a>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/">Verbrauchsausweis Gewerbe online erstellen</a>
</li>
<li>
<a href="index">Häufige Fragen zum Verbrauchsausweis Gewerbe</a>
<a href="/verbrauchsausweis/haeufige-fragen-zum-verbrauchsausweis-gewerbe/">Häufige Fragen zum Verbrauchsausweis Gewerbe</a>
</li>
<li>
<a href="index">Statistiken zum Verbrauchsausweis Gewerbe</a>
<a href="/verbrauchsausweis/statistiken-zum-verbrauchsausweis-gewerbe/">Statistiken zum Verbrauchsausweis Gewerbe</a>
</li>
</ul>
</div>
@@ -262,20 +262,18 @@
>
<ul class="dropdown-content bedarfsausweis">
{#if innerWidth < 1023}
<li><a href="index">Bedarfsausweis</a></li>
<li><a href="/bedarfsausweis/">Bedarfsausweis</a></li>
{/if}
<li><a href="index">Bedarfsausweis Wohngebäude</a></li>
<li><a href="index">Bedarfsausweis online erstellen</a></li>
<li><a href="index">Häufige Fragen zum Bedarfsausweis</a></li>
<li><a href="/bedarfsausweis/bedarfsausweis-wohngebaeude/">Bedarfsausweis Wohngebäude</a></li>
<li><a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/">Bedarfsausweis online erstellen</a></li>
<li><a href="/bedarfsausweis/haeufige-fragen-zum-bedarfsausweis/">Häufige Fragen zum Bedarfsausweis</a></li>
<li>
<a href="index">Statistiken zum Bedarfsausweis Wohngebäude</a>
<a href="/bedarfsausweis/statistiken-zum-bedarfsausweis/">Statistiken zum Bedarfsausweis Wohngebäude</a>
</li>
<li><a href="index">Bedarfsausweis Gewerbe</a></li>
<li><a href="index">Bedarfsausweis Gewerbe online erstellen</a></li>
<li><a href="/bedarfsausweis/bedarfsausweis-gewerbe/">Bedarfsausweis Gewerbe</a></li>
<li><a href="/angebot-anfragen/bedarfsausweis-gewerbe-anfragen">Bedarfsausweis Gewerbe anfragen</a></li>
<li>
<a href="index">Häufige Fragen zum Bedarfsausweis Gewerbe</a>
</li>
<li><a href="index">Statistiken zum Bedarfsausweis Gewerbe</a></li>
<a href="/bedarfsausweis/haeufige-fragen-zum-bedarfsausweis-gewerbe/">Häufige Fragen zum Bedarfsausweis Gewerbe</a>
</ul>
</div>
@@ -300,11 +298,11 @@
>
<ul class="dropdown-content energieausweis">
{#if innerWidth < 1023}
<li><a href="index">Energieausweis</a></li>
<li><a href="/energieausweis/">Energieausweis</a></li>
{/if}
<li><a href="index">Energieausweis Pflicht</a></li>
<li><a href="index">Energieausweis Kosten</a></li>
<li><a href="index">Energieausweis Haus</a></li>
<li><a href="/energieausweis/energieausweis-pflicht/">Energieausweis Pflicht</a></li>
<li><a href="/energieausweis/energieausweis-kosten/">Energieausweis Kosten</a></li>
<li><a href="/energieausweis/energieausweis-haus/">Energieausweis Haus</a></li>
</ul>
</div>

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
</script>
<div id ="cardBAGpromo"

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
</script>
<div id ="cardBApromo"

View File

@@ -1,6 +1,6 @@
<script>
import { PRICES } from "#lib/constants";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
</script>
<div id ="cardPriceinfo" class="box card hidden lg:block">

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
</script>
<div id ="cardVAGpromo"

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
</script>

View File

@@ -2,7 +2,7 @@
import { fade } from "svelte/transition";
import WidgetCardTemplate from "#components/widgets/WidgetCardTemplate_IBC.svelte";
import { PRICES } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
let gebaeudetyp: string = "bitte auswählen";
let anlass: string = "bitte auswählen";

View File

@@ -2,7 +2,7 @@
import { fade } from "svelte/transition";
import WidgetCardTemplate from "#components/widgets/immowelt/WidgetCardTemplate_immowelt.svelte";
import { PRICES } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { Enums } from "#lib/client/prisma";
let gebaeudetyp: string = "bitte auswählen";
let anlass: string = "bitte auswählen";

View File

@@ -1,4 +1,4 @@
import { prisma } from "@ibcornelsen/database/server";
import { prisma } from "#lib/server/prisma";
import moment from "moment";
import csv from "csvtojson"

View File

@@ -1,6 +1,6 @@
import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import { type Enums } from "@ibcornelsen/database/client";
import { type Enums } from "#lib/client/prisma";
import "cypress-file-upload"
import moment from "moment";

View File

@@ -1,6 +1,6 @@
import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import { type Enums } from "@ibcornelsen/database/client";
import { type Enums } from "#lib/client/prisma";
import "cypress-file-upload"

120
src/generated/enums.ts Normal file
View File

@@ -0,0 +1,120 @@
// This file was generated by a custom prisma generator, do not edit manually.
export const Heizungsstatus = {
BEHEIZT: "BEHEIZT",
UNBEHEIZT: "UNBEHEIZT",
NICHT_VORHANDEN: "NICHT_VORHANDEN",
} as const;
export type Heizungsstatus = (typeof Heizungsstatus)[keyof typeof Heizungsstatus];
export const Lueftungskonzept = {
Fensterlueftung: "Fensterlueftung",
Schachtlueftung: "Schachtlueftung",
LueftungsanlageMitWaermerueckgewinnung: "LueftungsanlageMitWaermerueckgewinnung",
LueftungsanlageOhneWaermerueckgewinnung: "LueftungsanlageOhneWaermerueckgewinnung",
} as const;
export type Lueftungskonzept = (typeof Lueftungskonzept)[keyof typeof Lueftungskonzept];
export const BenutzerRolle = {
USER: "USER",
ADMIN: "ADMIN",
} as const;
export type BenutzerRolle = (typeof BenutzerRolle)[keyof typeof BenutzerRolle];
export const BilderKategorie = {
Heizung: "Heizung",
Fenster: "Fenster",
Gebaeude: "Gebaeude",
Daemmung: "Daemmung",
} as const;
export type BilderKategorie = (typeof BilderKategorie)[keyof typeof BilderKategorie];
export const Einpreisungsstatus = {
open: "open",
canceled: "canceled",
pending: "pending",
expired: "expired",
} as const;
export type Einpreisungsstatus = (typeof Einpreisungsstatus)[keyof typeof Einpreisungsstatus];
export const Bezahlmethoden = {
paypal: "paypal",
giropay: "giropay",
sofort: "sofort",
creditcard: "creditcard",
rechnung: "rechnung",
} as const;
export type Bezahlmethoden = (typeof Bezahlmethoden)[keyof typeof Bezahlmethoden];
export const Rechnungsstatus = {
open: "open",
canceled: "canceled",
pending: "pending",
authorized: "authorized",
expired: "expired",
failed: "failed",
paid: "paid",
} as const;
export type Rechnungsstatus = (typeof Rechnungsstatus)[keyof typeof Rechnungsstatus];
export const AusweisTyp = {
Standard: "Standard",
Beratung: "Beratung",
Offline: "Offline",
} as const;
export type AusweisTyp = (typeof AusweisTyp)[keyof typeof AusweisTyp];
export const TicketStatus = {
OFFEN: "OFFEN",
IN_BEARBEITUNG: "IN_BEARBEITUNG",
IN_WARTESCHLEIFE: "IN_WARTESCHLEIFE",
GESCHLOSSEN: "GESCHLOSSEN",
GELOEST: "GELOEST",
} as const;
export type TicketStatus = (typeof TicketStatus)[keyof typeof TicketStatus];
export const UnterlagenKategorie = {
Grundriss: "Grundriss",
Sonstiges: "Sonstiges",
} as const;
export type UnterlagenKategorie = (typeof UnterlagenKategorie)[keyof typeof UnterlagenKategorie];
export const Ausstellgrund = {
Neubau: "Neubau",
Vermietung: "Vermietung",
Verkauf: "Verkauf",
Modernisierung: "Modernisierung",
Sonstiges: "Sonstiges",
} as const;
export type Ausstellgrund = (typeof Ausstellgrund)[keyof typeof Ausstellgrund];
export const Ausweisart = {
VerbrauchsausweisWohnen: "VerbrauchsausweisWohnen",
VerbrauchsausweisGewerbe: "VerbrauchsausweisGewerbe",
BedarfsausweisWohnen: "BedarfsausweisWohnen",
BedarfsausweisGewerbe: "BedarfsausweisGewerbe",
GEGNachweisWohnen: "GEGNachweisWohnen",
GEGNachweisBedarfsausweis: "GEGNachweisBedarfsausweis",
GEGNachweisGewerbe: "GEGNachweisGewerbe",
} as const;
export type Ausweisart = (typeof Ausweisart)[keyof typeof Ausweisart];
export const Service = {
Telefonberatung: "Telefonberatung",
Aushang: "Aushang",
Qualitaetsdruck: "Qualitaetsdruck",
SameDay: "SameDay",
} as const;
export type Service = (typeof Service)[keyof typeof Service];

View File

@@ -0,0 +1,10 @@
import * as z from "zod"
export const AnteilshaberSchema = z.object({
id: z.number().int(),
benutzer_id: z.number().int(),
rolle: z.string().nullish(),
privilegien: z.bigint().nullish(),
uid: z.string(),
objekt_id: z.number().int(),
})

View File

@@ -0,0 +1,14 @@
import * as z from "zod"
export const ApiRequestsSchema = z.object({
id: z.number().int(),
date: z.date(),
ip: z.string(),
method: z.string(),
path: z.string(),
status: z.number().int(),
responseTime: z.number(),
responseSize: z.number().int(),
userAgent: z.string(),
user_id: z.number().int().nullish(),
})

View File

@@ -0,0 +1,64 @@
import * as z from "zod"
import { Ausweisart, Heizungsstatus, Heizungsstatus, Lueftungskonzept } from "@prisma/client"
export const AufnahmeSchema = z.object({
id: z.number().int(),
uid: z.string().describe("UID der Gebäude Aufnahme"),
benutzer_id: z.number().int().nullish(),
ausweisart: z.nativeEnum(Ausweisart).describe("Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen").nullish(),
gebaeudetyp: z.string().describe("Art des Gebäudes und seiner primären Nutzungsart").nullish(),
gebaeudeteil: z.string().describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil").nullish(),
baujahr_gebaeude: z.number().int().array().describe("Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde"),
baujahr_heizung: z.number().int().array().describe("Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde"),
baujahr_klima: z.number().int().array().describe("Alle Jahre in denen die Klimaanlage eingebaut oder grundlegend verändert wurde"),
einheiten: z.number().int().describe("Anzahl der (Wohn)Einheiten im Gebäude").nullish(),
flaeche: z.number().int().describe("Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden").nullish(),
nutzflaeche: z.number().int().describe("(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche").nullish(),
saniert: z.boolean().describe("Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen").nullish(),
keller: z.nativeEnum(Heizungsstatus).describe("Ob ein Keller vorhanden, beheizt oder unbeheizt ist").nullish(),
dachgeschoss: z.nativeEnum(Heizungsstatus).describe("Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist").nullish(),
lueftung: z.nativeEnum(Lueftungskonzept).describe("Art der Gebäudelüftung").nullish(),
kuehlung: z.string().describe("Art der Gebäudekühlung").nullish(),
leerstand: z.number().int().describe("Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr").nullish(),
alternative_heizung: z.boolean().describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(),
alternative_warmwasser: z.boolean().describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(),
alternative_lueftung: z.boolean().describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(),
alternative_kuehlung: z.boolean().describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(),
brennstoff_1: z.string().describe("Genutzer Brennstoff der primären Energiequelle").nullish(),
brennstoff_2: z.string().describe("Genutzer Brennstoff der sekundären Energiequelle").nullish(),
boxpruefung: z.boolean().nullish(),
energieeffizienzklasse: z.string().describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes").nullish(),
erstellungsdatum: z.date().describe("Datum an dem der Kunde den Ausweis erstellt hat").nullish(),
ausstellungsdatum: z.date().describe("Datum an dem der Aussteller den Ausweis ausgestellt hat").nullish(),
zentralheizung: z.boolean().describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen").nullish(),
solarsystem_warmwasser: z.boolean().describe("Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen").nullish(),
warmwasser_rohre_gedaemmt: z.boolean().describe("Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
niedertemperatur_kessel: z.boolean().describe("Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen").nullish(),
brennwert_kessel: z.boolean().describe("Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen").nullish(),
heizungsrohre_gedaemmt: z.boolean().describe("Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
standard_kessel: z.boolean().nullish(),
waermepumpe: z.boolean().describe("Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen").nullish(),
raum_temperatur_regler: z.boolean().describe("Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen").nullish(),
photovoltaik: z.boolean().describe("Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen").nullish(),
durchlauf_erhitzer: z.boolean().describe("Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen").nullish(),
einzelofen: z.boolean().nullish(),
zirkulation: z.boolean().describe("Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen").nullish(),
einfach_verglasung: z.boolean().describe("Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
dreifach_verglasung: z.boolean().describe("Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
fenster_teilweise_undicht: z.boolean().describe("Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen").nullish(),
doppel_verglasung: z.boolean().describe("Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
fenster_dicht: z.boolean().describe("Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen").nullish(),
rolllaeden_kaesten_gedaemmt: z.boolean().describe("Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen").nullish(),
isolier_verglasung: z.boolean().describe("Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen").nullish(),
tueren_undicht: z.boolean().describe("Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen").nullish(),
tueren_dicht: z.boolean().describe("Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen").nullish(),
dachgeschoss_gedaemmt: z.boolean().describe("Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
keller_decke_gedaemmt: z.boolean().describe("Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
keller_wand_gedaemmt: z.boolean().describe("Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
aussenwand_gedaemmt: z.boolean().describe("Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
oberste_geschossdecke_gedaemmt: z.boolean().describe("Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
aussenwand_min_12cm_gedaemmt: z.boolean().describe("Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
dachgeschoss_min_12cm_gedaemmt: z.boolean().describe("Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
oberste_geschossdecke_min_12cm_gedaemmt: z.boolean().describe("Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
objekt_id: z.number().int(),
})

View File

@@ -0,0 +1,10 @@
import * as z from "zod"
export const BedarfsausweisGewerbeSchema = z.object({
id: z.number().int(),
uid: z.string(),
benutzer_id: z.number().int().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.number().int(),
rechnung_id: z.number().int().nullish(),
geg_einpreisung_id: z.number().int().nullish(),
})

View File

@@ -0,0 +1,71 @@
import * as z from "zod"
import { Ausstellgrund } from "@prisma/client"
export const BedarfsausweisWohnenSchema = z.object({
id: z.number().int(),
uid: z.string(),
benutzer_id: z.number().int().nullish(),
ausstellgrund: z.nativeEnum(Ausstellgrund).nullish(),
registriernummer: z.string().nullish(),
alternative_heizung: z.boolean().nullish(),
alternative_warmwasser: z.boolean().nullish(),
alternative_lueftung: z.boolean().nullish(),
alternative_kuehlung: z.boolean().nullish(),
anzahl_vollgeschosse: z.number().int().nullish(),
geschosshoehe: z.number().nullish(),
anzahl_gauben: z.number().int().nullish(),
breite_gauben: z.number().nullish(),
masse_a: z.number().nullish(),
masse_b: z.number().nullish(),
masse_c: z.number().nullish(),
masse_d: z.number().nullish(),
masse_e: z.number().nullish(),
masse_f: z.number().nullish(),
fensterflaeche_so_sw: z.number().nullish(),
fensterflaeche_nw_no: z.number().nullish(),
aussenwandflaeche_unbeheizt: z.number().nullish(),
dachflaeche: z.number().nullish(),
deckenflaeche: z.number().nullish(),
dach_u_wert: z.number().nullish(),
decke_u_wert: z.number().nullish(),
aussenwand_flaeche: z.number().nullish(),
aussenwand_u_wert: z.number().nullish(),
fussboden_flaeche: z.number().nullish(),
fussboden_u_wert: z.number().nullish(),
volumen: z.number().nullish(),
dicht: z.boolean().nullish(),
fenster_flaeche_1: z.number().nullish(),
fenster_art_1: z.number().nullish(),
fenster_flaeche_2: z.number().nullish(),
fenster_art_2: z.number().nullish(),
dachfenster_flaeche: z.number().nullish(),
dachfenster_art: z.number().nullish(),
haustuer_flaeche: z.number().nullish(),
haustuer_art: z.number().nullish(),
dach_bauart: z.string().nullish(),
decke_bauart: z.string().nullish(),
dach_daemmung: z.number().nullish(),
decke_daemmung: z.number().nullish(),
aussenwand_daemmung: z.number().nullish(),
boden_daemmung: z.number().nullish(),
aussenwand_bauart: z.string().nullish(),
boden_bauart: z.string().nullish(),
warmwasser_verteilung: z.string().nullish(),
warmwasser_speicherung: z.string().nullish(),
warmwasser_erzeugung: z.string().nullish(),
heizung_zentral: z.boolean().nullish(),
heizung_verteilung: z.string().nullish(),
heizung_speicherung: z.string().nullish(),
waerme_erzeugung_heizung: z.string().nullish(),
anteil_zusatzheizung: z.number().nullish(),
kollektor_flaeche: z.number().nullish(),
ausgestellt: z.boolean().nullish(),
storniert: z.boolean().describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen").nullish(),
bestellt: z.boolean().describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(),
zurueckgestellt: z.boolean().describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
prueftext: z.string().describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung").nullish(),
beschreibung: z.string().nullish(),
kontrolldatei_angefragt: z.boolean().describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde").nullish(),
rechnung_id: z.number().int().nullish(),
aufnahme_id: z.number().int().describe("ID der korrespondierenden Gebäudeaufnahme"),
})

View File

@@ -0,0 +1,20 @@
import * as z from "zod"
import { BenutzerRolle } from "@prisma/client"
export const BenutzerSchema = z.object({
id: z.number().int(),
uid: z.string(),
name: z.string().nullish(),
vorname: z.string().nullish(),
email: z.string(),
passwort: z.string(),
profilbild: z.string().nullish(),
plz: z.string().nullish(),
ort: z.string().nullish(),
adresse: z.string().nullish(),
telefon: z.string().nullish(),
anrede: z.string().nullish(),
rolle: z.nativeEnum(BenutzerRolle),
firma: z.string().nullish(),
lex_office_id: z.string().nullish(),
})

View File

@@ -0,0 +1,9 @@
import * as z from "zod"
import { BilderKategorie } from "@prisma/client"
export const BildSchema = z.object({
id: z.number().int(),
kategorie: z.nativeEnum(BilderKategorie),
uid: z.string(),
aufnahme_id: z.number().int().nullish(),
})

View File

@@ -0,0 +1,14 @@
import * as z from "zod"
export const documenttemplatesSchema = z.object({
id: z.number().int(),
name: z.string(),
shortdescription: z.string(),
longdescription: z.string(),
user_id: z.number().int(),
is_private: z.boolean(),
documenttype: z.number().int(),
filename: z.string(),
created_at: z.date(),
updated_at: z.date(),
})

View File

@@ -0,0 +1,8 @@
import * as z from "zod"
export const documenttypesSchema = z.object({
id: z.number().int(),
name: z.string(),
shortdescription: z.string(),
longdescription: z.string(),
})

View File

@@ -0,0 +1,11 @@
import * as z from "zod"
export const EventSchema = z.object({
id: z.number().int(),
uid: z.string(),
date: z.date(),
title: z.string(),
description: z.string().nullish(),
aufnahme_id: z.number().int(),
benutzer_id: z.number().int().nullish(),
})

Some files were not shown because too many files have changed in this diff Show More