Merge remote-tracking branch 'origin/main' into Jens

This commit is contained in:
Jens Cornelsen
2025-02-22 01:32:54 +01:00
201 changed files with 2150608 additions and 832 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}"

4
.gitignore vendored
View File

@@ -20,10 +20,6 @@ pnpm-debug.log*
pnpm-lock.yaml pnpm-lock.yaml
bun.lockb bun.lockb
# environment variables
.env
.env.production
# macOS-specific files # macOS-specific files
.DS_Store .DS_Store

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 EXPOSE 5432
COPY ./package.json ./
COPY . .
RUN bun install --prod
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: online-energieausweis:
bun run dev --host bun run dev --host
dev: database online-energieausweis # api dev: install-dependencies database online-energieausweis
database: database:
$(MAKE) -C ../database dev docker compose up
bun-install-database: backup:
cd ../database mkdir -p $(PERSISTENT_DIR)
bun link - 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
bunx prisma generate
# bun-install-api: bun-install-database
# cd ../api
# bun install
# bun link @ibcornelsen/database
# api:
# $(MAKE) -C ../api dev
all: all:
mkdir -p ~/logs mkdir -p ~/logs
bun run dev 2>&1 | tee ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log 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 ~/logs
mkdir -p ~/persistent/online-energieausweis mkdir -p ~/persistent/online-energieausweis
@@ -35,18 +64,9 @@ prod: bun-install-database # bun-install-api
$(MAKE) prod; \ $(MAKE) prod; \
cd ../online-energieausweis; \ cd ../online-energieausweis; \
fi 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; # - echo "PRIVATE_KEY=$(cat /etc/letsencrypt/live/ibcornelsen.de/privkey.pem | base64 | tr -d '\n')" >> ~/online-energieausweis/.env;
- touch ~/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 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 tailwind from "@astrojs/tailwind";
import node from "@astrojs/node"; import node from "@astrojs/node";
import mdx from "@astrojs/mdx"; import mdx from "@astrojs/mdx";
import dsv from "@rollup/plugin-dsv"
import astroTypesafeAPI from "astro-typesafe-api" import astroTypesafeAPI from "astro-typesafe-api"
import { fileURLToPath } from "url";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
integrations: [svelte(), tailwind(), mdx(), astroTypesafeAPI()], integrations: [svelte(), tailwind(), mdx(), astroTypesafeAPI()],
outDir: "./dist", outDir: "./dist",
output: "server", output: "server",
vite: {
optimizeDeps: {
exclude: ["@ibcornelsen/api", "@ibcornelsen/database"]
},
resolve: {
alias: {
"#": fileURLToPath(new URL("./src", import.meta.url))
}
},
ssr: {
noExternal: ["@pdfme/generator", "@pdfme/common", "@pdfme/schemas"]
},
build: {
commonjsOptions: {
transformMixedEsModules: false
}
},
plugins: [dsv()]
},
adapter: node({ adapter: node({
mode: "middleware" mode: "middleware"
}), }),
vite: {
ssr: {
external: ["@prisma/client"],
resolve: {
alias: {
".prisma/client/index-browser": "./node_modules/.prisma/client/index-browser.js"
}
}
}
},
server: { server: {
port: 3000 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

433
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' version: '3'
services: 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: database:
extends: build: ./
file: ../database/docker-compose.yml env_file:
service: database - .env
ports:
- 5432:5432

View File

@@ -22,7 +22,6 @@
"@astrojs/node": "^8.3.4", "@astrojs/node": "^8.3.4",
"@astrojs/svelte": "^2.2.0", "@astrojs/svelte": "^2.2.0",
"@astrojs/tailwind": "^3.1.3", "@astrojs/tailwind": "^3.1.3",
"@ibcornelsen/database": "link:@ibcornelsen/database",
"@ibcornelsen/ui": "^0.0.2", "@ibcornelsen/ui": "^0.0.2",
"@mollie/api-client": "^4.1.0", "@mollie/api-client": "^4.1.0",
"@pdfme/common": "^5.2.16", "@pdfme/common": "^5.2.16",
@@ -68,6 +67,7 @@
"@rollup/plugin-dsv": "^3.0.5", "@rollup/plugin-dsv": "^3.0.5",
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.16",
"@types/body-scroll-lock": "^3.1.2", "@types/body-scroll-lock": "^3.1.2",
"@types/bun": "^1.2.2",
"@types/express": "^5.0.0", "@types/express": "^5.0.0",
"@types/fontkit": "^2.0.7", "@types/fontkit": "^2.0.7",
"@types/is-base64": "^1.1.3", "@types/is-base64": "^1.1.3",
@@ -92,7 +92,12 @@
"postcss-import": "^16.1.0", "postcss-import": "^16.1.0",
"postcss-nesting": "^13.0.1", "postcss-nesting": "^13.0.1",
"prettier": "^2.8.8", "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": { "overrides": {
"zod": "^3.24.1" "zod": "^3.24.1"

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.json({ limit: "50mb" }))
app.use(express.urlencoded({ limit: "50mb" })) app.use(express.urlencoded({ limit: "50mb" }))
app.listen(80, function() { app.listen(3000, function() {
console.log('Server started on http://localhost:80'); console.log('Server started on http://localhost:3000');
}); });

View File

@@ -12,11 +12,11 @@ export const createCaller = createCallerFactory({
"admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"), "admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"),
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"), "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
"admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"), "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"ausweise": await import("../src/pages/api/ausweise/index.ts"), "ausweise": await import("../src/pages/api/ausweise/index.ts"),
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),

View File

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

View File

@@ -4,7 +4,7 @@ import {
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.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 { addNotification, updateNotification } from "@ibcornelsen/ui";
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie"; import Cookies from "js-cookie";

View File

@@ -4,7 +4,7 @@ import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; 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 { 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( export async function nachweisSpeichern(
nachweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, nachweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,

View File

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

View File

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

View File

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

View File

@@ -5,7 +5,7 @@
import Overlay from "#components/Overlay.svelte"; import Overlay from "#components/Overlay.svelte";
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.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 { openWindowWithPost } from "#lib/helpers/window.js";
import { PRICES } from "#lib/constants.js"; import { PRICES } from "#lib/constants.js";
import { nachweisSpeichern } from "#client/lib/nachweisSpeichern.js"; import { nachweisSpeichern } from "#client/lib/nachweisSpeichern.js";
@@ -20,7 +20,7 @@
export let showWeiter: boolean = true; export let showWeiter: boolean = true;
let ausweistyp: AusweisTyp = Enums.AusweisTyp.Standard; export let ausweistyp: AusweisTyp = Enums.AusweisTyp.Standard;
async function ausweisAbschicken() { async function ausweisAbschicken() {
openWindowWithPost("/kundendaten", { openWindowWithPost("/kundendaten", {

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import ImageGrid from "../ImageGrid.svelte";; 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"; import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import ImageGrid from "../ImageGrid.svelte";; 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"; import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];

View File

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

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import ImageGrid from "../ImageGrid.svelte";; 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"; import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];

View File

@@ -9,7 +9,7 @@
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte"; 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"; import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;

View File

@@ -12,7 +12,7 @@ import {
VerbrauchsausweisGewerbe, VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen, VerbrauchsausweisWohnen,
GEGNachweisWohnen, GEGNachweisWohnen,
} from "@ibcornelsen/database/client"; } from "#lib/client/prisma";
import { z, ZodSchema } from "zod"; import { z, ZodSchema } from "zod";
export type OmitKeys<T, K extends keyof T> = Omit<T, K>; 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 { addNotification } from "#components/Notifications/shared.js";
import { CheckCircled, CrossCircled, Image } from "radix-svelte-icons"; import { CheckCircled, CrossCircled, Image } from "radix-svelte-icons";
import ChevronDown from "radix-svelte-icons/src/lib/icons/ChevronDown.svelte"; import ChevronDown from "radix-svelte-icons/src/lib/icons/ChevronDown.svelte";
import { Event } from "@ibcornelsen/database/client"; import { Event } from "#lib/client/prisma";
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";

View File

@@ -13,7 +13,7 @@
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; 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 ausweis: VerbrauchsausweisWohnenClient;
export let aufnahme: AufnahmeKomplettClient; export let aufnahme: AufnahmeKomplettClient;

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import { ObjektKomplettClient } from "#components/Ausweis/types.js"; import { ObjektKomplettClient } from "#components/Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/server"; import { Enums } from "#lib/client/prisma";
import moment from "moment"; import moment from "moment";
import { File, OpenInNewWindow } from "radix-svelte-icons"; import { File, OpenInNewWindow } from "radix-svelte-icons";

View File

@@ -83,16 +83,6 @@
Ausweise Prüfen Ausweise Prüfen
</a> </a>
</li> </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> </ul>
</details></li> </details></li>
{/if} {/if}

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import UploadImages from "./UploadImages.svelte"; 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 { BedarfsausweisWohnenClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons"; import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons";

View File

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

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte"; 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 max: number = 2;
export let min: number = 1; export let min: number = 1;

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
<script> <script>
import { PRICES } from "#lib/constants"; import { PRICES } from "#lib/constants";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "#lib/client/prisma";
</script> </script>
<div class="mt-6 mb-6 m-auto w-[99%] relative"> <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 CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
import { PRICES } from "#lib/constants"; 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 CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
import { PRICES } from "#lib/constants"; import { PRICES } from "#lib/constants";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "#lib/client/prisma";
--- ---
<div class="hidden 2xl:block"> <div class="hidden 2xl:block">

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,7 +2,7 @@
import { fade } from "svelte/transition"; import { fade } from "svelte/transition";
import WidgetCardTemplate from "#components/widgets/WidgetCardTemplate_IBC.svelte"; import WidgetCardTemplate from "#components/widgets/WidgetCardTemplate_IBC.svelte";
import { PRICES } from "#lib/constants.js"; 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 gebaeudetyp: string = "bitte auswählen";
let anlass: string = "bitte auswählen"; let anlass: string = "bitte auswählen";

View File

@@ -2,7 +2,7 @@
import { fade } from "svelte/transition"; import { fade } from "svelte/transition";
import WidgetCardTemplate from "#components/widgets/immowelt/WidgetCardTemplate_immowelt.svelte"; import WidgetCardTemplate from "#components/widgets/immowelt/WidgetCardTemplate_immowelt.svelte";
import { PRICES } from "#lib/constants.js"; 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 gebaeudetyp: string = "bitte auswählen";
let anlass: 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 moment from "moment";
import csv from "csvtojson" import csv from "csvtojson"

View File

@@ -1,6 +1,6 @@
import fuelList from "#components/Ausweis/brennstoffListe.js"; import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker"; 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 "cypress-file-upload"
import moment from "moment"; import moment from "moment";

View File

@@ -1,6 +1,6 @@
import fuelList from "#components/Ausweis/brennstoffListe.js"; import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker"; 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 "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(),
})

View File

@@ -0,0 +1,22 @@
import * as z from "zod"
import { Einpreisungsstatus } from "@prisma/client"
export const GEGEinpreisungSchema = z.object({
id: z.number().int(),
uid: z.string(),
empfaenger: z.string().nullish(),
strasse: z.string().nullish(),
plz: z.string().nullish(),
ort: z.string().nullish(),
zusatzzeile: z.string().nullish(),
telefon: z.string().nullish(),
email: z.string().nullish(),
abweichende_versand_adresse: z.boolean().nullish(),
versand_empfaenger: z.string().nullish(),
versand_strasse: z.string().nullish(),
versand_plz: z.string().nullish(),
versand_ort: z.string().nullish(),
versand_zusatzzeile: z.string().nullish(),
status: z.nativeEnum(Einpreisungsstatus),
benutzer_id: z.number().int().describe("Die ID des Benutzers, der diese Einpreisung bekommt.").nullish(),
})

View File

@@ -0,0 +1,17 @@
import * as z from "zod"
import { Ausstellgrund } from "@prisma/client"
export const GEGNachweisGewerbeSchema = z.object({
id: z.number().int(),
uid: z.string(),
ausstellgrund: z.nativeEnum(Ausstellgrund).describe("Ausstellgrund wie z.B. Vermietung oder Verkauf").nullish(),
keller_beheizt: z.boolean().describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen").nullish(),
storniert: z.boolean().describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen").nullish(),
bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(),
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
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,17 @@
import * as z from "zod"
import { Ausstellgrund } from "@prisma/client"
export const GEGNachweisWohnenSchema = z.object({
id: z.number().int(),
uid: z.string(),
ausstellgrund: z.nativeEnum(Ausstellgrund).describe("Ausstellgrund wie z.B. Vermietung oder Verkauf").nullish(),
keller_beheizt: z.boolean().describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen").nullish(),
storniert: z.boolean().describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen").nullish(),
bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(),
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
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,23 @@
export * from "./anteilshaber"
export * from "./apirequests"
export * from "./aufnahme"
export * from "./bedarfsausweisgewerbe"
export * from "./bedarfsausweiswohnen"
export * from "./benutzer"
export * from "./bild"
export * from "./event"
export * from "./gegeinpreisung"
export * from "./gegnachweisgewerbe"
export * from "./gegnachweiswohnen"
export * from "./klimafaktoren"
export * from "./objekt"
export * from "./postleitzahlen"
export * from "./rechnung"
export * from "./refreshtokens"
export * from "./tickets"
export * from "./unterlage"
export * from "./verbrauchsausweisgewerbe"
export * from "./verbrauchsausweiswohnen"
export * from "./documenttemplates"
export * from "./documenttypes"
export * from "./tokens"

View File

@@ -0,0 +1,9 @@
import * as z from "zod"
export const KlimafaktorenSchema = z.object({
id: z.number().int(),
plz: z.string(),
month: z.number().int(),
year: z.number().int(),
klimafaktor: z.number(),
})

View File

@@ -0,0 +1,13 @@
import * as z from "zod"
export const ObjektSchema = z.object({
id: z.number().int(),
uid: z.string(),
benutzer_id: z.number().int().nullish(),
latitude: z.number().nullish(),
longitude: z.number().nullish(),
plz: z.string().describe("Postleitzahl des Gebäudes").nullish(),
ort: z.string().describe("Ort des Gebäudes").nullish(),
adresse: z.string().describe("Adresse (Straße und Hausnummer) des Gebäudes").nullish(),
erstellungsdatum: z.date().nullish(),
})

View File

@@ -0,0 +1,11 @@
import * as z from "zod"
export const PostleitzahlenSchema = z.object({
id: z.number().int(),
plz: z.string(),
stadt: z.string(),
bundesland: z.string(),
landkreis: z.string(),
lat: z.number(),
lon: z.number(),
})

View File

@@ -0,0 +1,30 @@
import * as z from "zod"
import { Bezahlmethoden, Rechnungsstatus, Service, AusweisTyp } from "@prisma/client"
export const RechnungSchema = z.object({
id: z.number().int(),
uid: z.string(),
benutzer_id: z.number().int(),
empfaenger: z.string().nullish(),
strasse: z.string().nullish(),
plz: z.string().nullish(),
ort: z.string().nullish(),
zusatzzeile: z.string().nullish(),
telefon: z.string().nullish(),
email: z.string().nullish(),
abweichende_versand_adresse: z.boolean().nullish(),
versand_empfaenger: z.string().nullish(),
versand_strasse: z.string().nullish(),
versand_plz: z.string().nullish(),
versand_ort: z.string().nullish(),
versand_zusatzzeile: z.string().nullish(),
bezahlmethode: z.nativeEnum(Bezahlmethoden),
status: z.nativeEnum(Rechnungsstatus),
services: z.nativeEnum(Service).array(),
ausweistyp: z.nativeEnum(AusweisTyp),
betrag: z.number(),
erstellt_am: z.date(),
bezahlt_am: z.date().nullish(),
storniert_am: z.date().nullish(),
transaktions_referenz: z.string().nullish(),
})

View File

@@ -0,0 +1,9 @@
import * as z from "zod"
export const RefreshTokensSchema = z.object({
id: z.number().int(),
benutzer_id: z.number().int(),
token: z.string(),
ip: z.string(),
expiry: z.date(),
})

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