Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39b02f4de4 | ||
|
|
92817b6b8e | ||
|
|
079d913451 |
18
.env
18
.env
@@ -1,16 +1,2 @@
|
|||||||
# Environment variables declared in this file are automatically made available to Prisma.
|
DB_USER=main
|
||||||
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
|
DB_PASSWORD=hHMP8cd^N3SnzGRR
|
||||||
|
|
||||||
# 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}"
|
|
||||||
16
Dockerfile
16
Dockerfile
@@ -1,16 +0,0 @@
|
|||||||
FROM postgres:latest
|
|
||||||
ENV POSTGRES_USER ${POSTGRES_USER}
|
|
||||||
ENV POSTGRES_PASSWORD ${POSTGRES_PASSWORD}
|
|
||||||
ENV POSTGRES_DB ${POSTGRES_DB}
|
|
||||||
|
|
||||||
COPY ./prisma/migrations/ /docker-entrypoint-initdb.d/
|
|
||||||
|
|
||||||
EXPOSE 5432
|
|
||||||
|
|
||||||
# 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
|
|
||||||
9
bun.lock
9
bun.lock
@@ -45,6 +45,7 @@
|
|||||||
"soap": "^1.1.8",
|
"soap": "^1.1.8",
|
||||||
"sqids": "^0.3.0",
|
"sqids": "^0.3.0",
|
||||||
"ssh2-sftp-client": "^12.0.0",
|
"ssh2-sftp-client": "^12.0.0",
|
||||||
|
"surrealdb": "^1.3.2",
|
||||||
"svelte": "^3.59.2",
|
"svelte": "^3.59.2",
|
||||||
"svelte-dialogs": "^1.2.2",
|
"svelte-dialogs": "^1.2.2",
|
||||||
"svelte-preprocess": "^5.1.4",
|
"svelte-preprocess": "^5.1.4",
|
||||||
@@ -1615,6 +1616,8 @@
|
|||||||
|
|
||||||
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||||
|
|
||||||
|
"isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="],
|
||||||
|
|
||||||
"isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="],
|
"isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="],
|
||||||
|
|
||||||
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
|
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
|
||||||
@@ -2457,6 +2460,8 @@
|
|||||||
|
|
||||||
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
||||||
|
|
||||||
|
"surrealdb": ["surrealdb@1.3.2", "", { "dependencies": { "isows": "^1.0.6", "uuidv7": "^1.0.1" }, "peerDependencies": { "tslib": "^2.6.3", "typescript": "^5.0.0" } }, "sha512-mL7nij33iuon3IQP72F46fgX3p2LAxFCWCBDbZB7IohZ13RTEwJVNq7nZeP1eMSceQUpKzS6OHIWOuF9LYAkNw=="],
|
||||||
|
|
||||||
"svelte": ["svelte@3.59.2", "", {}, "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA=="],
|
"svelte": ["svelte@3.59.2", "", {}, "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA=="],
|
||||||
|
|
||||||
"svelte-dialogs": ["svelte-dialogs@1.2.2", "", { "peerDependencies": { "svelte": "^3.5.0" } }, "sha512-Pf25Xua2nDIIR4v45PNbn+yFrFLNc0ns9+sO8Ms77Hm/CdxFuXm01XO8Qkw8Ej66BvboX+kIJ3TCm8uwP/XmyQ=="],
|
"svelte-dialogs": ["svelte-dialogs@1.2.2", "", { "peerDependencies": { "svelte": "^3.5.0" } }, "sha512-Pf25Xua2nDIIR4v45PNbn+yFrFLNc0ns9+sO8Ms77Hm/CdxFuXm01XO8Qkw8Ej66BvboX+kIJ3TCm8uwP/XmyQ=="],
|
||||||
@@ -2617,6 +2622,8 @@
|
|||||||
|
|
||||||
"uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
|
"uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
|
||||||
|
|
||||||
|
"uuidv7": ["uuidv7@1.0.2", "", { "bin": { "uuidv7": "cli.js" } }, "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA=="],
|
||||||
|
|
||||||
"v8-compile-cache": ["v8-compile-cache@2.4.0", "", {}, "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw=="],
|
"v8-compile-cache": ["v8-compile-cache@2.4.0", "", {}, "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw=="],
|
||||||
|
|
||||||
"validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
|
"validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
|
||||||
@@ -2663,6 +2670,8 @@
|
|||||||
|
|
||||||
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
|
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
|
||||||
|
|
||||||
|
"ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="],
|
||||||
|
|
||||||
"xml-crypto": ["xml-crypto@6.0.0", "", { "dependencies": { "@xmldom/is-dom-node": "^1.0.1", "@xmldom/xmldom": "^0.8.10", "xpath": "^0.0.33" } }, "sha512-L3RgnkaDrHaYcCnoENv4Idzt1ZRj5U1z1BDH98QdDTQfssScx8adgxhd9qwyYo+E3fXbQZjEQH7aiXHLVgxGvw=="],
|
"xml-crypto": ["xml-crypto@6.0.0", "", { "dependencies": { "@xmldom/is-dom-node": "^1.0.1", "@xmldom/xmldom": "^0.8.10", "xpath": "^0.0.33" } }, "sha512-L3RgnkaDrHaYcCnoENv4Idzt1ZRj5U1z1BDH98QdDTQfssScx8adgxhd9qwyYo+E3fXbQZjEQH7aiXHLVgxGvw=="],
|
||||||
|
|
||||||
"xpath": ["xpath@0.0.33", "", {}, "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA=="],
|
"xpath": ["xpath@0.0.33", "", {}, "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA=="],
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
version: '3'
|
version: '3'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
database:
|
surrealdb:
|
||||||
build: ./
|
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
|
entrypoint:
|
||||||
|
- /surreal
|
||||||
|
- start
|
||||||
|
- --user
|
||||||
|
- $DB_USER
|
||||||
|
- --pass
|
||||||
|
- $DB_PASSWORD
|
||||||
|
image: surrealdb/surrealdb:latest
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 8000:8000
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
"soap": "^1.1.8",
|
"soap": "^1.1.8",
|
||||||
"sqids": "^0.3.0",
|
"sqids": "^0.3.0",
|
||||||
"ssh2-sftp-client": "^12.0.0",
|
"ssh2-sftp-client": "^12.0.0",
|
||||||
|
"surrealdb": "^1.3.2",
|
||||||
"svelte": "^3.59.2",
|
"svelte": "^3.59.2",
|
||||||
"svelte-dialogs": "^1.2.2",
|
"svelte-dialogs": "^1.2.2",
|
||||||
"svelte-preprocess": "^5.1.4",
|
"svelte-preprocess": "^5.1.4",
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 256 B |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 10 MiB |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 10 MiB |
@@ -5,6 +5,9 @@ export const createCaller = createCallerFactory({
|
|||||||
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
|
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
|
||||||
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
|
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
|
||||||
"unterlage": await import("../src/pages/api/unterlage.ts"),
|
"unterlage": await import("../src/pages/api/unterlage.ts"),
|
||||||
|
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||||
|
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
|
||||||
|
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
||||||
"admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"),
|
"admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"),
|
||||||
"admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"),
|
"admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"),
|
||||||
"admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"),
|
"admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"),
|
||||||
@@ -12,12 +15,9 @@ export const createCaller = createCallerFactory({
|
|||||||
"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"),
|
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
|
||||||
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
|
||||||
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
|
|
||||||
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
|
||||||
"bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"),
|
"bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"),
|
||||||
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
|
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
|
||||||
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
|
|
||||||
"bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"),
|
"bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"),
|
||||||
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
||||||
"bilder/[id]": await import("../src/pages/api/bilder/[id].ts"),
|
"bilder/[id]": await import("../src/pages/api/bilder/[id].ts"),
|
||||||
|
|||||||
@@ -21,15 +21,9 @@
|
|||||||
|
|
||||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||||
export let aufnahme: AufnahmeKomplettClient;
|
export let aufnahme: AufnahmeKomplettClient;
|
||||||
export let rechnung: RechnungClient | null;
|
export let rechnung: RechnungClient;
|
||||||
export let objekt: Objekt;
|
export let objekt: Objekt;
|
||||||
export let benutzer: BenutzerClient;
|
export let benutzer: BenutzerClient;
|
||||||
import { FileText } from "radix-svelte-icons";
|
|
||||||
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
|
|
||||||
import DashboardNotification from "./DashboardNotification.svelte";
|
|
||||||
import { notifications } from "#components/NotificationProvider/shared.js";
|
|
||||||
import { Bell } from "radix-svelte-icons";
|
|
||||||
import { A13BerechnungRechnerischeLaufzeitHeizung } from "#lib/Berechnungen/BedarfsausweisWohnen/A13BerechnungRechnerischeLaufzeitHeizung.js";
|
|
||||||
const progress = ausweis.ausgestellt ? 100 : ausweis.bestellt ? 66 : 33;
|
const progress = ausweis.ausgestellt ? 100 : ausweis.bestellt ? 66 : 33;
|
||||||
|
|
||||||
const ausweisart = getAusweisartFromId(ausweis.id);
|
const ausweisart = getAusweisartFromId(ausweis.id);
|
||||||
@@ -224,17 +218,6 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-row flex-wrap items-center gap-2">
|
<div class="flex flex-row flex-wrap items-center gap-2">
|
||||||
{#if ausweis.ausgestellt}
|
|
||||||
<span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>
|
|
||||||
{:else if ausweis.bestellt}
|
|
||||||
<span class="bg-primary px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
|
|
||||||
{:else}
|
|
||||||
{#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
|
|
||||||
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Angefordert</span>
|
|
||||||
{:else}
|
|
||||||
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</span>
|
|
||||||
{/if}
|
|
||||||
{/if}
|
|
||||||
<div class="text-lg font-semibold">
|
<div class="text-lg font-semibold">
|
||||||
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
|
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||||
Verbrauchsausweis Wohnen
|
Verbrauchsausweis Wohnen
|
||||||
@@ -249,15 +232,27 @@
|
|||||||
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
|
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
|
||||||
Bedarfsausweis Gewerbe
|
Bedarfsausweis Gewerbe
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
|
||||||
</div>
|
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
|
||||||
<div class="badge badge-accent font-semibold text-black text-m">
|
(Beratung)
|
||||||
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
|
|
||||||
mit Beratung
|
|
||||||
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
|
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
|
||||||
Offline
|
(Offline)
|
||||||
{/if}
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{#if ausweis.ausgestellt}
|
||||||
|
<span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>
|
||||||
|
{:else if ausweis.bestellt}
|
||||||
|
<span class="bg-primary px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
|
||||||
|
{:else}
|
||||||
|
{#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
|
||||||
|
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</span>
|
||||||
|
{:else}
|
||||||
|
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Angefordert</span>
|
||||||
|
{/if}
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="badge badge-accent font-semibold text-black text-m">{objekt.adresse}</div>
|
||||||
<div class="mb-4 flex flex-row items-center gap-4">
|
<div class="mb-4 flex flex-row items-center gap-4">
|
||||||
<div class="w-full border rounded-lg my-2">
|
<div class="w-full border rounded-lg my-2">
|
||||||
<div class="bg-green-600 h-4 rounded-lg" class:bg-red-600={progress == 33} class:bg-primary={progress == 66} style="width: {progress}%;"></div>
|
<div class="bg-green-600 h-4 rounded-lg" class:bg-red-600={progress == 33} class:bg-primary={progress == 66} style="width: {progress}%;"></div>
|
||||||
@@ -266,16 +261,17 @@
|
|||||||
>{progress}%</span
|
>{progress}%</span
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
{#if ausweis.bestellt}
|
||||||
|
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
|
||||||
|
<p class="text-sm font-semibold">Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden innerhalb der nächsten 48 Stunden über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.</p>
|
||||||
|
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
|
||||||
|
<p class="text-sm font-semibold">Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen Ihres Energieversorgers.</p>
|
||||||
|
{:else if !ausweis.ausgestellt}
|
||||||
|
<p class="text-sm font-semibold">Der Ausweis wurde von Ihnen freigegeben und befindet sich in Prüfung vom IB Cornelsen</p>
|
||||||
|
{/if}
|
||||||
|
{/if}
|
||||||
{#await calculations then calculations}
|
{#await calculations then calculations}
|
||||||
<div class="flex flex-col mb-4">
|
<div class="flex flex-col gap-2">
|
||||||
<div class="flex flex-row justify-between">
|
|
||||||
<span>Erstellungsdatum</span>
|
|
||||||
<span class="font-bold text-base-content"
|
|
||||||
>{moment(aufnahme.erstellungsdatum).format(
|
|
||||||
"DD.MM.YYYY"
|
|
||||||
)}</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-row justify-between">
|
<div class="flex flex-row justify-between">
|
||||||
<span>Energieverbrauch</span>
|
<span>Energieverbrauch</span>
|
||||||
<span class="font-bold text-base-content"
|
<span class="font-bold text-base-content"
|
||||||
@@ -288,6 +284,14 @@
|
|||||||
>{calculations?.co2EmissionenGesamt}Kg/A</span
|
>{calculations?.co2EmissionenGesamt}Kg/A</span
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
|
<span>Erstellungsdatum</span>
|
||||||
|
<span class="font-bold text-base-content"
|
||||||
|
>{moment(aufnahme.erstellungsdatum).format(
|
||||||
|
"DD.MM.YYYY"
|
||||||
|
)}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
<div class="flex flex-row justify-between">
|
<div class="flex flex-row justify-between">
|
||||||
<span>Baujahr</span>
|
<span>Baujahr</span>
|
||||||
<span
|
<span
|
||||||
@@ -305,38 +309,17 @@
|
|||||||
: "N/A"}</span
|
: "N/A"}</span
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
|
<span>ID</span>
|
||||||
|
<span class="font-bold text-base-content"
|
||||||
|
>{id}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/await}
|
{/await}
|
||||||
|
|
||||||
|
<div class="flex flex-row justify-end items-center gap-4 mt-4">
|
||||||
<div class="flex flex-row justify-start items-center mb-4">
|
{#if !ausweis.storniert && !ausweis.ausgestellt}
|
||||||
<a
|
|
||||||
class="p-1 rounded-lg hover:bg-gray-200 mr-2 border-2 border-gray-300"
|
|
||||||
title="PDF Herunterladen"
|
|
||||||
target="_blank"
|
|
||||||
href="/pdf/ansichtsausweis?id={ausweis.id}"
|
|
||||||
>
|
|
||||||
{#if ausweis.ausgestellt}
|
|
||||||
<img src="../../images/dashboard/AusweisHaken.svg" width="65" alt="Energieausweis">
|
|
||||||
{:else}
|
|
||||||
<img src="../../images/dashboard/AusweisKreuz.svg" width="65" alt="Energieausweis">
|
|
||||||
{/if}
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
class="p-1 rounded-lg hover:bg-gray-200 border-2 border-gray-300"
|
|
||||||
title="PDF Herunterladen"
|
|
||||||
target="_blank"
|
|
||||||
href="/pdf/datenblatt?id={ausweis.id}"
|
|
||||||
>
|
|
||||||
{#if ausweis.ausgestellt}
|
|
||||||
<img src="../../images/dashboard/DatenblattHaken.svg" width="65" alt="Energieausweis">
|
|
||||||
{:else}
|
|
||||||
<img src="../../images/dashboard/DatenblattKreuz.svg" width="65" alt="Energieausweis">
|
|
||||||
{/if}
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div class="flex flex-col gap-2 justify-end items-center ml-4">
|
|
||||||
{#if !ausweis.storniert && !ausweis.ausgestellt}
|
|
||||||
<!--
|
<!--
|
||||||
<a
|
<a
|
||||||
class="button text-sm"
|
class="button text-sm"
|
||||||
@@ -409,237 +392,24 @@
|
|||||||
<button class="button text-sm" title="Stornieren" on:click={stornieren}>S</button>
|
<button class="button text-sm" title="Stornieren" on:click={stornieren}>S</button>
|
||||||
<button class="button text-sm" title="Registriernummer anfordern" on:click={registriernummer}>R</button>
|
<button class="button text-sm" title="Registriernummer anfordern" on:click={registriernummer}>R</button>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="mt-8">
|
|
||||||
{#if ausweis.bestellt}
|
|
||||||
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
|
|
||||||
<p class="text-sm">Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden <span class="font-bold">innerhalb der nächsten 48 Stunden</span> über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.</p>
|
|
||||||
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
|
|
||||||
<p class="text-sm">Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte <span class="font-bold">übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen</span> Ihres Energieversorgers.</p>
|
|
||||||
{:else if !ausweis.ausgestellt}
|
|
||||||
<p class="text-sm">Der Ausweis wurde von Ihnen freigegeben und befindet sich <span class="font-bold">in Prüfung durch IB Cornelsen</span></p>
|
|
||||||
{/if}
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mr-4">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="flex flex-row flex-wrap items-center gap-2">
|
|
||||||
|
|
||||||
<div class="text-lg font-semibold">{aufnahme.gebaeudetyp}
|
<a
|
||||||
{#if (aufnahme.einheiten > 0 && aufnahme.einheiten !== null)}
|
class="p-2 rounded-lg hover:bg-gray-200"
|
||||||
mit {aufnahme.einheiten} Wohneinheiten
|
title="PDF Herunterladen"
|
||||||
{/if}
|
target="_blank"
|
||||||
</div>
|
href="/pdf/ansichtsausweis?id={ausweis.id}"
|
||||||
|
|
||||||
<div class="text-sm">
|
|
||||||
<span class="font-bold">Gebäude (Bj {aufnahme.baujahr_gebaeude})</span> mit
|
|
||||||
{#if aufnahme.flaeche > 0 && aufnahme.flaeche !== null}
|
|
||||||
{aufnahme.flaeche} m² Wohnfläche
|
|
||||||
sowie
|
|
||||||
{/if}
|
|
||||||
{aufnahme.nutzflaeche} m² energetische Nutzfläche. Als Ausstellgrund wurde {ausweis.ausstellgrund} angegeben.
|
|
||||||
{aufnahme.gebaeudeteil === "Wohnen"
|
|
||||||
? "Die eingegebenen Daten beziehen sich auf den Wohnteil eines gemischt genutzten Gebäudes."
|
|
||||||
: "Die eingegebenen Daten beziehen sich auf das gesamte Gebäude."}
|
|
||||||
{aufnahme.saniert ? "Das Gebäude ist in unsaniertem Zustand." : "Das Gebäude ist in saniertem Zustand."}
|
|
||||||
</div>
|
|
||||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
|
||||||
<div class="text-sm">
|
|
||||||
<span class="font-bold">Gebäudestrom</span> der Jahre vom
|
|
||||||
{moment(ausweis.startdatum).format("MM.YYYY")} bis {moment(ausweis.startdatum).add("3", "years").format("MM.YYYY")} beträgt
|
|
||||||
{ausweis.strom_1} kWh, {ausweis.strom_2} kWh und {ausweis.strom_3} kWh.
|
|
||||||
Im Stromverbrauch enthalten sind
|
|
||||||
{ausweis.stromverbrauch_enthealt_heizung ? "Heizung, " : ""}
|
|
||||||
{ausweis.stromverbrauch_enthaelt_warmwasser ? "Warmwasser, " : ""}
|
|
||||||
{ausweis.stromverbrauch_enthaelt_lueftung ? "Lüftung, " : ""}
|
|
||||||
{ausweis.stromverbrauch_enthaelt_beleuchtung ? "Beleuchtung, " : ""}
|
|
||||||
{ausweis.stromverbrauch_enthaelt_kuehlung ? "Kühlung, " : ""}
|
|
||||||
{#if ausweis.stromverbrauch_sonstig !== null}
|
|
||||||
sowie {ausweis.stromverbrauch_enthaelt_sonstige}.
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
<div class="text-sm">
|
|
||||||
<span class="font-bold">Heizung (Bj {aufnahme.baujahr_heizung})</span> wird mit {ausweis.brennstoff_1} betrieben. Die Verbräuche vom
|
|
||||||
{moment(ausweis.startdatum).format("MM.YYYY")} bis {moment(ausweis.startdatum).add("3", "years").format("MM.YYYY")} betragen
|
|
||||||
{ausweis.verbrauch_1} {ausweis.einheit_1}, {ausweis.verbrauch_2} {ausweis.einheit_1} und {ausweis.verbrauch_3} {ausweis.einheit_1}.
|
|
||||||
{#if ausweis.zusaetzliche_heizquelle} -
|
|
||||||
Eine weitere Heizung wird mit {ausweis.brennstoff_2} betrieben mit den Verbräuchen {ausweis.verbrauch_4} {ausweis.einheit_2}, {ausweis.verbrauch_5}
|
|
||||||
{ausweis.einheit_2} und {ausweis.verbrauch_6} {ausweis.einheit_2}.
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
<div class="text-sm">
|
|
||||||
{#if ausweis.anteil_warmwasser_1 !== null && ausweis.anteil_warmwasser_1 > 0}
|
|
||||||
{#if aufnahme.solarsystem_warmwasser}
|
|
||||||
Da ein Solarsystem für Warmwasser vorhanden ist,
|
|
||||||
wurde ein Warmwasseranteil von {ausweis.anteil_warmwasser_1 * 0.6}% berücksichtigt.
|
|
||||||
{:else}
|
|
||||||
Es wurde ein Warmwasseranteil von {ausweis.anteil_warmwasser_1}% berücksichtigt.
|
|
||||||
{/if}
|
|
||||||
{:else}
|
|
||||||
{#if aufnahme.solarsystem_warmwasser}
|
|
||||||
Da ein Solarsystem für Warmwasser vorhanden ist, wurde ein reduzierter Warmwasserzuschlag von 12 kWh/m²a angesetzt.
|
|
||||||
{:else}
|
|
||||||
Es wurde ein Warmwasserzuschlag von 20 kWh/m²a angesetzt.
|
|
||||||
{/if}
|
|
||||||
{/if}
|
|
||||||
{#if !ausweis.alternative_heizung && !ausweis.alternative_warmwasser && !ausweis.alternative_lueftung && !ausweis.alternative_kuehlung}
|
|
||||||
Alternative Energieversorgung wird nicht verwendet
|
|
||||||
{:else}
|
|
||||||
Alternative Energieversorgung wird verwendet für {ausweis.alternative_heizung ? "Heizung, " : ""}{ausweis.alternative_warmwasser ? "Warmwasser, " : ""}{ausweis.alternative_lueftung ? "Lüftung, " : ""}{ausweis.alternative_kuehlung ? "Kühlung, " : ""}
|
|
||||||
{/if}.
|
|
||||||
Der Leerstand beträgt {aufnahme.leerstand}%. Das Gebäude verfügt über eine
|
|
||||||
{#if aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung}
|
|
||||||
Fensterlüftung
|
|
||||||
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung}
|
|
||||||
Schachtlüftung
|
|
||||||
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung}
|
|
||||||
Lüftungsanlage mit Wärmerückgewinnung
|
|
||||||
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung}
|
|
||||||
Lüftungsanlage ohne Wärmerückgewinnung
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.kuehlung_enthalten && ausweis.kuehlung_entahlten !== null}
|
|
||||||
und wird thermisch gekühlt.
|
|
||||||
{:else if aufnahme.kuehlung === "1" && aufnahme.kuhlung !== null}
|
|
||||||
und wird gekühlt.
|
|
||||||
{:else}
|
|
||||||
und wird nicht gekühlt.
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
<div class="text-sm">
|
|
||||||
<span class="font-bold">Heizung: </span>
|
|
||||||
{aufnahme.zentralheizung ? "Zentral/Etagenheizung, " : ""}
|
|
||||||
{aufnahme.einzelofen ? "Einzelofen, " : ""}
|
|
||||||
{aufnahme.waermepumpe ? "Wärmepumpe, " : ""}
|
|
||||||
{aufnahme.niedertemperatur_kessel ? "Niedertemperaturkessel, " : ""}
|
|
||||||
{aufnahme.standard_kessel ? "Standardkessel, " : ""}
|
|
||||||
{aufnahme.durchlauf_erhitzer ? "Durchlauferhitzer, " : ""}
|
|
||||||
{aufnahme.solarsystem_warmwasser ? "Solarsystem für Warmwasser, " : ""}
|
|
||||||
{aufnahme.waermepumpe ? "Wärmepumpe, " : ""}
|
|
||||||
{aufnahme.brennwert_kessel ? "Brennwertkessel, " : ""}
|
|
||||||
{aufnahme.standard_kessel ? "Standardkessel, " : ""}
|
|
||||||
{aufnahme.warmwasser_rohre_gedaemmt ? "Warmwasserrohre gedämmt, " : ""}
|
|
||||||
{aufnahme.heizungsrohre_gedaemmt ? "Heizungsrohre gedämmt, " : ""}
|
|
||||||
{aufnahme.photovoltaik ? "Photovoltaik, " : ""}
|
|
||||||
{aufnahme.raum_temperatur_regler ? "Raumtemperaturregler, " : ""}
|
|
||||||
{aufnahme.zirkulation ? "Zirkulation, " : ""}
|
|
||||||
</div>
|
|
||||||
<div class="text-sm">
|
|
||||||
<span class="font-bold">Fenster: </span>
|
|
||||||
{aufnahme.isolier_verglasung ? "Fenster Isolierglas, " : ""}
|
|
||||||
{aufnahme.dreifach_verglasung ? "Dreifachverglasung, " : ""}
|
|
||||||
{aufnahme.doppel_verglasung ? "Doppelverglasung, " : ""}
|
|
||||||
{aufnahme.einfach_verglasung ? "Einfachverglasung, " : ""}
|
|
||||||
{aufnahme.fenster_dicht ? "Fenster dicht, " : ""}
|
|
||||||
{aufnahme.fenster_teilweise_undicht ? "Fenster teilweise undicht, " : ""}
|
|
||||||
{aufnahme.tueren_undicht ? "Türen undicht, " : ""}
|
|
||||||
{aufnahme.tueren_dicht ? "Türen dicht, " : ""}
|
|
||||||
{aufnahme.rolllaeden_kaesten_gedaemmt ? "Rollladenkästen gedämmt" : ""}
|
|
||||||
</div>
|
|
||||||
<div class="text-sm">
|
|
||||||
<span class="font-bold">Dämmung: </span>
|
|
||||||
{aufnahme.dachgeschoss_gedaemmt ? "Dachgeschoss gedämmt, " : ""}
|
|
||||||
{aufnahme.aussenwand_gedaemmt ? "Außenwand gedämmt, " : ""}
|
|
||||||
{aufnahme.keller_decke_gedaemmt ? "Kellerdecke gedämmt, " : ""}
|
|
||||||
{aufnahme.keller_wand_gedaemmt ? "Kellerwand gedämmt, " : ""}
|
|
||||||
{aufnahme.oberste_geschossdecke_gedaemmt ? "oberste Geschossdecke gedämmt, " : ""}
|
|
||||||
{aufnahme.oberste_geschossdecke_min_12cm_gedaemmt ? "oberste Geschossdecke min. 12cm gedämmt, " : ""}
|
|
||||||
{aufnahme.dachgeschoss_min_12cm_gedaemmt ? "Dachgeschoss min. 12cm gedämmt, " : ""}
|
|
||||||
{aufnahme.aussenwand_min_12cm_gedaemmt ? "Außenwand min. 12cm gedämmt" : ""}
|
|
||||||
</div>
|
|
||||||
<div class="text-xs space-y-1 p-2">
|
|
||||||
<span class="font-semibold">Hiermit bestätige ich {benutzer.vorname} {benutzer.name} als Besteller folgende Angaben:</span><br>
|
|
||||||
{#if ausweis.pruefpunkt_heizungsalter}
|
|
||||||
<div>Das Heizungsalter ist jünger als 3 Jahre. Es betrifft einen Heizungstausch ohne energetische Verbesserung.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_verbrauch_niedrig}
|
|
||||||
<div>Ich habe die Verbrauchsangaben kontrolliert. Der niedrige Energiekennwert ist korrekt.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_verbrauch_hoch}
|
|
||||||
<div>Ich habe die Verbrauchsangaben kontrolliert. Der hohe Energiekennwert ist korrekt.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_verbrauch_null}
|
|
||||||
<div>Die eingegebenen Heizverbräuche sind korrekt und alle 3 Felder wurden vollständig eingegeben.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_verbrauch_abweichung}
|
|
||||||
<div>Die eingegebenen Heizverbräuche sind korrekt und die Abweichung lässt sich begründen.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_wohnflaeche_einheiten}
|
|
||||||
<div>Die Angabe der Wohnfläche ist korrekt und bezieht sich auf das gesamte Gebäude.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_strom_null}
|
|
||||||
<div>Die eingegebenen Stromverbräuche sind korrekt. Alle 3 Felder wurden vollständig eingegeben.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_strom_abweichung}
|
|
||||||
<div>Die eingegebenen Stromverbräuche sind korrekt und die Abweichung lässt sich begründen.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_heizungsanlage}
|
|
||||||
<div>Das Baujahr der Heizungsanlage ist kleiner als das Baujahr des Gebäudes und begründet.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_anteil_warmwasser}
|
|
||||||
<div>Ich habe den Warmwasseranteil nochmal überprüft. Dieser ist korrekt und begründet.</div>
|
|
||||||
{/if}
|
|
||||||
{#if ausweis.pruefpunkt_wohnflaeche}
|
|
||||||
<div>Ich habe die Wohnfläche nochmal überprüft und bestätige die Richtigkeit. Es handelt sich lediglich um die Wohnfläche innerhalb des Gebäudes.</div>
|
|
||||||
{/if}
|
|
||||||
<div>Ich habe die AGB und DSGVO im <a href="/impressum#agb" target="_blank" rel="noopener noreferrer">Impressum</a> gelesen und akzeptiert. Ich bestätige die Richtigkeit der Eingabe.</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="flex flex-row flex-wrap items-center gap-2">
|
|
||||||
<div class="text-sm">
|
|
||||||
<span class="font-bold">Rechnungsadresse</span><br>
|
|
||||||
{rechnung?.empfaenger},
|
|
||||||
{#if rechnung?.zusatzzeile !== null}
|
|
||||||
{rechnung?.zusatzzeile},
|
|
||||||
{/if}
|
|
||||||
{rechnung?.strasse}, {rechnung?.plz} {rechnung?.ort}
|
|
||||||
</div>
|
|
||||||
<div class="text-sm mb-2">
|
|
||||||
<span class="font-bold">Versandadresse</span><br>
|
|
||||||
{rechnung?.versand_empfaenger},
|
|
||||||
{#if rechnung?.versand_zusatzzeile !== null}
|
|
||||||
{rechnung?.versand_zusatzzeile},
|
|
||||||
{/if}
|
|
||||||
{rechnung?.versand_strasse}, {rechnung?.versand_plz} {rechnung?.versand_ort}
|
|
||||||
</div>
|
|
||||||
<div class="text-lg font-semibold">Unterlagen</div>
|
|
||||||
<div class="text-sm">
|
|
||||||
<a href="" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 rounded-lg p-1"><FileText size={24}></FileText>Grundrissplan_O....pdf</a>
|
|
||||||
<a href="" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 rounded-lg p-1"><FileText size={24}></FileText>Grundrissplan_OG....pdf</a>
|
|
||||||
<a href="" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 rounded-lg p-1"><FileText size={24}></FileText>Grundrissplan_OG....pdf</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="dropdown dropdown-top items-end absolute bottom-4 right-4 z-50">
|
|
||||||
<div class="indicator">
|
|
||||||
{#if Object.keys($notifications).length > 0}
|
|
||||||
<span class="indicator-item badge badge-accent text-xs"
|
|
||||||
>{Object.keys($notifications).length}</span
|
|
||||||
>
|
|
||||||
{/if}
|
|
||||||
<button
|
|
||||||
tabindex="0"
|
|
||||||
class="hover:bg-gray-200 p-3 rounded-lg"
|
|
||||||
>
|
|
||||||
<Bell size={24} />
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<ul
|
|
||||||
class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80"
|
|
||||||
>
|
>
|
||||||
<NotificationProvider component={DashboardNotification} />
|
<img src="/images/ausweis.webp" width="32" alt="Energieausweis">
|
||||||
</ul>
|
</a>
|
||||||
|
<a
|
||||||
|
class="p-2 rounded-lg hover:bg-gray-200"
|
||||||
|
title="PDF Herunterladen"
|
||||||
|
target="_blank"
|
||||||
|
href="/pdf/datenblatt?id={ausweis.id}"
|
||||||
|
>
|
||||||
|
<img src="/images/datenblatt.webp" width="32" alt="Datenblatt">
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -680,10 +450,3 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
<style lang="postcss">
|
|
||||||
|
|
||||||
*{@apply font-sans
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
@@ -44,119 +44,14 @@
|
|||||||
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
|
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
|
||||||
<a class="button-tab" href="/dashboard">
|
<a class="button-tab" href="/dashboard">
|
||||||
<Reader width={22} height={22} />
|
<Reader width={22} height={22} />
|
||||||
Ausweise
|
Vorgänge
|
||||||
|
</a>
|
||||||
|
<a class="button-tab" href="/dashboard">
|
||||||
|
<Reader width={22} height={22} />
|
||||||
|
Inbox
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<hr class="border-gray-600" />
|
|
||||||
|
|
||||||
Besteller
|
|
||||||
|
|
||||||
<div class="flex flex-row mb-4">
|
|
||||||
<div class="item-center mr-4">
|
|
||||||
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
MIchael Makler
|
|
||||||
</div>
|
|
||||||
<div class="text-xs text-gray-500">
|
|
||||||
Eigentümer oder im Auftrag
|
|
||||||
</div>
|
|
||||||
<div class="text-xs text-gray-500">
|
|
||||||
<!-- Soll für den Aussteller sichtbar sein -->
|
|
||||||
Telefon {benutzer.telefon}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="border-gray-600" />
|
<hr class="border-gray-600" />
|
||||||
|
|
||||||
<!--
|
|
||||||
Mitwirkende
|
|
||||||
|
|
||||||
<div class="flex flex-row mb-1">
|
|
||||||
<div class="item-center mr-4">
|
|
||||||
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
Ernie Energieberater
|
|
||||||
</div>
|
|
||||||
<div class="text-xs text-gray-500">
|
|
||||||
Energieberater
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex flex-row mb-1">
|
|
||||||
<div class="item-center mr-4">
|
|
||||||
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
Peter Planer
|
|
||||||
</div>
|
|
||||||
<div class="text-xs text-gray-500">
|
|
||||||
Architekt
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex flex-row mb-1">
|
|
||||||
<div class="item-center mr-4">
|
|
||||||
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
Hans Meier
|
|
||||||
</div>
|
|
||||||
<div class="text-xs text-gray-500">
|
|
||||||
Eigentümer
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="border-gray-600" />
|
|
||||||
|
|
||||||
Experten in der Nähe
|
|
||||||
|
|
||||||
<div class="flex flex-row mb-1">
|
|
||||||
<div class="item-center mr-4">
|
|
||||||
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
Thorsten Maas
|
|
||||||
</div>
|
|
||||||
<div class="text-xs text-gray-500">
|
|
||||||
Energieberater
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex flex-row mb-1">
|
|
||||||
<div class="item-center mr-4">
|
|
||||||
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
Herbert Holm
|
|
||||||
</div>
|
|
||||||
<div class="text-xs text-gray-500">
|
|
||||||
Gutachter
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="border-gray-600" />
|
|
||||||
|
|
||||||
<div class="flex justify-end mt-2 mb-2">
|
|
||||||
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center">
|
|
||||||
Einladen
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
|
|
||||||
{#if benutzer.rolle === "ADMIN"}
|
{#if benutzer.rolle === "ADMIN"}
|
||||||
<li>
|
<li>
|
||||||
<details class="[&_.caret]:open:rotate-180" open>
|
<details class="[&_.caret]:open:rotate-180" open>
|
||||||
@@ -191,8 +86,30 @@
|
|||||||
</li>
|
</li>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="items-end bottom-4 right-4 z-50 mt-4">
|
<div class="mt-10 flex flex-col gap-4 px-8">
|
||||||
<div class="flex flex-row justify-end items-end">
|
<div class="flex flex-row justify-between items-center">
|
||||||
|
<ThemeController bind:lightTheme></ThemeController>
|
||||||
|
<div class="dropdown dropdown-top">
|
||||||
|
<div class="indicator">
|
||||||
|
{#if Object.keys($notifications).length > 0}
|
||||||
|
<span class="indicator-item badge badge-accent text-xs"
|
||||||
|
>{Object.keys($notifications).length}</span
|
||||||
|
>
|
||||||
|
{/if}
|
||||||
|
<button
|
||||||
|
tabindex="0"
|
||||||
|
class="hover:bg-gray-200 p-3 rounded-lg"
|
||||||
|
>
|
||||||
|
<Bell size={24} />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<ul
|
||||||
|
class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80"
|
||||||
|
>
|
||||||
|
<NotificationProvider component={DashboardNotification} />
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
<a
|
<a
|
||||||
href="/dashboard/einstellungen"
|
href="/dashboard/einstellungen"
|
||||||
class="hover:bg-gray-200 p-3 rounded-lg"
|
class="hover:bg-gray-200 p-3 rounded-lg"
|
||||||
@@ -201,6 +118,12 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="divider px-8"></div>
|
||||||
|
<a
|
||||||
|
href="/dashboard/einstellungen"
|
||||||
|
class="hover:bg-gray-200 no-animation focus:shadow-none justify-start py-4 h-auto px-8 rounded-none w-full flex flex-row gap-4"
|
||||||
|
>
|
||||||
|
</a>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
42
src/lib/AusweisData.ts
Normal file
42
src/lib/AusweisData.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { verbrauchsausweisWohnenPDFValidator } from "./validators/verbrauchsausweis-wohnen-pdf-validator";
|
||||||
|
|
||||||
|
export function convertAusweisData(
|
||||||
|
inputs: Partial<VerbrauchsausweisWohnenClient>
|
||||||
|
): Record<string, string> {
|
||||||
|
// Wir wollen alle Werte zu einem Flachen Objekt umwandeln, sodass wir dass später benutzen können.
|
||||||
|
// Dazu kommen noch einige wichtige Eigenschaften die man im PDF brauchen könnte.
|
||||||
|
let pdfInputs: z.infer<typeof verbrauchsausweisWohnenPDFValidator> = {
|
||||||
|
...inputs,
|
||||||
|
pdf: {
|
||||||
|
"brennstoff": [inputs.aufnahme?.brennstoff_1, inputs.aufnahme?.brennstoff_2].filter(x => x).join(", ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let result = recursiveFlatten(inputs, "");
|
||||||
|
// Außerdem müssen wir alle Werte zu strings umwandeln.
|
||||||
|
for (const key in result) {
|
||||||
|
result[key] = String(result[key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function recursiveFlatten(obj: any, parentKey = ""): Record<string, string> {
|
||||||
|
const result: Record<string, string> = {};
|
||||||
|
|
||||||
|
for (const key in obj) {
|
||||||
|
const value = obj[key];
|
||||||
|
|
||||||
|
const newKey = parentKey ? `${parentKey}.${key}` : key;
|
||||||
|
|
||||||
|
if (typeof value === "object") {
|
||||||
|
Object.assign(result, recursiveFlatten(value, newKey));
|
||||||
|
} else {
|
||||||
|
result[newKey] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -108,7 +108,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
}
|
}
|
||||||
|
|
||||||
let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; let kuehlungsZuschlag = 0;
|
let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; let kuehlungsZuschlag = 0;
|
||||||
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null && (ausweis.stromverbrauch_enthaelt_kuehlung === false || ausweis.stromverbrauch_enthaelt_kuehlung === null)) {
|
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null && ausweis.stromverbrauch_enthaelt_kuehlung === false) {
|
||||||
|
|
||||||
kuehlungsZuschlag = 6 * nutzflaeche * 3;
|
kuehlungsZuschlag = 6 * nutzflaeche * 3;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
|||||||
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
|
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
|
||||||
let leerstand = (aufnahme.leerstand || 0) / 100;
|
let leerstand = (aufnahme.leerstand || 0) / 100;
|
||||||
|
|
||||||
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt && ausweis.anteil_warmwasser_1 !== 0) {
|
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
|
||||||
if (aufnahme.solarsystem_warmwasser) {
|
if (aufnahme.solarsystem_warmwasser) {
|
||||||
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
|
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
|
||||||
energieVerbrauchWarmwasser_1 =
|
energieVerbrauchWarmwasser_1 =
|
||||||
|
|||||||
@@ -534,7 +534,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ausweis.warmwasser_enthalten || ausweis.anteil_warmwasser_1 === 0) {
|
if (!ausweis.warmwasser_enthalten) {
|
||||||
/**
|
/**
|
||||||
* Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
|
* Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
|
||||||
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
|
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, RechnungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||||
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
|
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
|
||||||
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
||||||
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
|
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
|
||||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
||||||
import { Enums, prisma, Rechnung } from "#lib/server/prisma.js";
|
import { Enums, prisma, Rechnung } from "#lib/server/prisma.js";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID.
|
* Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID.
|
||||||
* @param id Die Ausweis UID
|
* @param id Die Ausweis UID
|
||||||
|
|||||||
@@ -151,4 +151,34 @@ export async function getRechnung(rechnung_id: string) {
|
|||||||
id: rechnung_id
|
id: rechnung_id
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
import Surreal from "surrealdb"
|
||||||
|
|
||||||
|
// Define the database configuration interface
|
||||||
|
interface DbConfig {
|
||||||
|
url: string;
|
||||||
|
namespace: string;
|
||||||
|
database: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define the default database configuration
|
||||||
|
const DEFAULT_CONFIG: DbConfig = {
|
||||||
|
url: "http://127.0.0.1:8000/rpc",
|
||||||
|
namespace: "main",
|
||||||
|
database: "main",
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function db(config: DbConfig = DEFAULT_CONFIG): Promise<Surreal> {
|
||||||
|
const db = new Surreal();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await db.connect(config.url);
|
||||||
|
await db.use({ namespace: config.namespace, database: config.database });
|
||||||
|
return db;
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Failed to connect to SurrealDB:", err instanceof Error ? err.message : String(err));
|
||||||
|
await db.close();
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -281,24 +281,6 @@ export async function createInvoice(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getLexOfficeVoucherNumber(rechnung: Rechnung) {
|
|
||||||
const request = await fetch(
|
|
||||||
`https://api.lexoffice.io/v1/invoices/${rechnung.lex_office_id}`,
|
|
||||||
{
|
|
||||||
method: "GET",
|
|
||||||
headers: {
|
|
||||||
Accept: `application/json`,
|
|
||||||
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const response = await request.json();
|
|
||||||
|
|
||||||
return response["voucherNumber"]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
255
src/lib/validators/index.ts
Normal file
255
src/lib/validators/index.ts
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
import {
|
||||||
|
VerbrauchsausweisWohnenSchema,
|
||||||
|
AufnahmeSchema,
|
||||||
|
ObjektSchema,
|
||||||
|
BildSchema,
|
||||||
|
RechnungSchema,
|
||||||
|
EventSchema,
|
||||||
|
BenutzerSchema,
|
||||||
|
GebaeudePlaeneSchema,
|
||||||
|
AnteilshaberSchema,
|
||||||
|
BedarfsausweisWohnenSchema,
|
||||||
|
VerbrauchsausweisGewerbeSchema
|
||||||
|
} from "#lib/client/prisma";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
export const RechnungValidator = RechnungSchema.omit({
|
||||||
|
aufnahme_id: true,
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true
|
||||||
|
})
|
||||||
|
|
||||||
|
export const GebaeudePlaeneValidator = GebaeudePlaeneSchema.omit({
|
||||||
|
id: true,
|
||||||
|
objekt_id: true
|
||||||
|
})
|
||||||
|
|
||||||
|
export const AnteilshaberValidator = AnteilshaberSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
objekt_id: true
|
||||||
|
})
|
||||||
|
|
||||||
|
export const BildValidator = BildSchema.omit({
|
||||||
|
id: true,
|
||||||
|
objekt_id: true
|
||||||
|
})
|
||||||
|
|
||||||
|
export const AufnahmeValidator = AufnahmeSchema.omit({
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
objekt_id: true,
|
||||||
|
}).merge(
|
||||||
|
z.object({
|
||||||
|
verbrauchsausweis_wohnen: VerbrauchsausweisWohnenSchema.omit({
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
aufnahme_id: true,
|
||||||
|
}).nullable(),
|
||||||
|
bedarfsausweis_wohnen: VerbrauchsausweisWohnenSchema.omit({
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
aufnahme_id: true,
|
||||||
|
}).nullable(),
|
||||||
|
verbrauchsausweis_gewerbe: VerbrauchsausweisWohnenSchema.omit({
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
aufnahme_id: true,
|
||||||
|
}).nullable(),
|
||||||
|
rechnungen: z.array(
|
||||||
|
RechnungValidator
|
||||||
|
),
|
||||||
|
events: z.array(
|
||||||
|
EventSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
}).merge(
|
||||||
|
z.object({
|
||||||
|
benutzer: BenutzerSchema.pick({ uid: true }),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
export const ObjektValidator = ObjektSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true
|
||||||
|
}).merge(z.object({
|
||||||
|
aufnahme: z.array(
|
||||||
|
AufnahmeValidator
|
||||||
|
).nullable().optional(),
|
||||||
|
bilder: z.array(
|
||||||
|
BildValidator
|
||||||
|
).nullable().optional(),
|
||||||
|
gebaeude_plaene: z.array(
|
||||||
|
GebaeudePlaeneValidator
|
||||||
|
).nullable().optional(),
|
||||||
|
Anteilshaber: z.array(
|
||||||
|
AnteilshaberValidator
|
||||||
|
).nullable().optional()
|
||||||
|
}))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runtime überprüfung für den Verbrauchsausweis Wohnen
|
||||||
|
* Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
|
||||||
|
*/
|
||||||
|
export const VerbrauchsausweisWohnenValidator =
|
||||||
|
VerbrauchsausweisWohnenSchema.merge(
|
||||||
|
z.object({
|
||||||
|
benutzer: BenutzerSchema.omit({
|
||||||
|
id: true,
|
||||||
|
passwort: true
|
||||||
|
}),
|
||||||
|
aufnahme: AufnahmeSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
objekt_id: true,
|
||||||
|
id: true,
|
||||||
|
}).merge(
|
||||||
|
z.object({
|
||||||
|
objekt: ObjektSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
}).merge(
|
||||||
|
z.object({
|
||||||
|
bilder: z.array(
|
||||||
|
BildSchema.omit({
|
||||||
|
id: true,
|
||||||
|
objekt_id: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
),
|
||||||
|
rechnungen: RechnungSchema.omit({
|
||||||
|
aufnahme_id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
}).array(),
|
||||||
|
events: z.array(
|
||||||
|
EventSchema.omit({
|
||||||
|
aufnahme_id: true,
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true
|
||||||
|
}).merge(z.object({
|
||||||
|
benutzer: BenutzerSchema.pick({
|
||||||
|
uid: true
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
).omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
aufnahme_id: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const VerbrauchsausweisWohnenBerechnungValidator2024 = z.object({
|
||||||
|
endEnergieVerbrauchGesamt: z.number(),
|
||||||
|
primaerEnergieVerbrauchGesamt: z.number(),
|
||||||
|
energieEffizienzKlasse: z.string(),
|
||||||
|
co2EmissionenGesamt: z.number()
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runtime überprüfung für den Verbrauchsausweis Wohnen
|
||||||
|
* Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
|
||||||
|
*/
|
||||||
|
export const BedarfsausweisWohnenValidator =
|
||||||
|
BedarfsausweisWohnenSchema.merge(
|
||||||
|
z.object({
|
||||||
|
aufnahme: AufnahmeSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
objekt_id: true,
|
||||||
|
id: true,
|
||||||
|
}).merge(
|
||||||
|
z.object({
|
||||||
|
objekt: ObjektSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
}).merge(
|
||||||
|
z.object({
|
||||||
|
bilder: z.array(
|
||||||
|
BildSchema.omit({
|
||||||
|
id: true,
|
||||||
|
objekt_id: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
),
|
||||||
|
rechnungen: RechnungSchema.omit({
|
||||||
|
aufnahme_id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
}).array(),
|
||||||
|
events: z.array(
|
||||||
|
EventSchema.omit({
|
||||||
|
aufnahme_id: true,
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true
|
||||||
|
}).merge(z.object({
|
||||||
|
benutzer: BenutzerSchema.pick({
|
||||||
|
uid: true
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
).omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
aufnahme_id: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runtime überprüfung für den Verbrauchsausweis Wohnen
|
||||||
|
* Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
|
||||||
|
*/
|
||||||
|
export const VerbrauchsausweisGewerbeValidator =
|
||||||
|
VerbrauchsausweisGewerbeSchema.merge(
|
||||||
|
z.object({
|
||||||
|
aufnahme: AufnahmeSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
objekt_id: true,
|
||||||
|
id: true,
|
||||||
|
}).merge(
|
||||||
|
z.object({
|
||||||
|
objekt: ObjektSchema.omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
}).merge(
|
||||||
|
z.object({
|
||||||
|
bilder: z.array(
|
||||||
|
BildSchema.omit({
|
||||||
|
id: true,
|
||||||
|
objekt_id: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
),
|
||||||
|
rechnungen: RechnungSchema.omit({
|
||||||
|
aufnahme_id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
}).array(),
|
||||||
|
events: z.array(
|
||||||
|
EventSchema.omit({
|
||||||
|
aufnahme_id: true,
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true
|
||||||
|
}).merge(z.object({
|
||||||
|
benutzer: BenutzerSchema.pick({
|
||||||
|
uid: true
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
).omit({
|
||||||
|
benutzer_id: true,
|
||||||
|
id: true,
|
||||||
|
aufnahme_id: true,
|
||||||
|
});
|
||||||
@@ -169,19 +169,19 @@
|
|||||||
|
|
||||||
<!-- C - Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen -->
|
<!-- C - Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen -->
|
||||||
|
|
||||||
<Bereich
|
<!-- <Bereich
|
||||||
bereich="C"
|
bereich="C"
|
||||||
title="Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen"
|
title="Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen"
|
||||||
><GebaeudeVolumen bind:ausweis /></Bereich
|
><GebaeudeVolumen bind:ausweis /></Bereich
|
||||||
>
|
> -->
|
||||||
|
|
||||||
<!-- D - Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden -->
|
<!-- D - Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden -->
|
||||||
|
|
||||||
<Bereich
|
<!-- <Bereich
|
||||||
bereich="D"
|
bereich="D"
|
||||||
title="Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden"
|
title="Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden"
|
||||||
><Fensterflaechen bind:ausweis /></Bereich
|
><Fensterflaechen bind:ausweis /></Bereich
|
||||||
>
|
> -->
|
||||||
|
|
||||||
<!-- E - Angabe zu Lüftung und Kühlung -->
|
<!-- E - Angabe zu Lüftung und Kühlung -->
|
||||||
|
|
||||||
@@ -190,7 +190,7 @@
|
|||||||
>
|
>
|
||||||
|
|
||||||
<!-- F Angaben zur Heizungsanlage -->
|
<!-- F Angaben zur Heizungsanlage -->
|
||||||
<!-- <Bereich bereich="D" title="Angaben zur Heizunganlage"
|
<Bereich bereich="D" title="Angaben zur Heizunganlage"
|
||||||
><SanierungszustandHeizungsanlage
|
><SanierungszustandHeizungsanlage
|
||||||
bind:images={bilder}
|
bind:images={bilder}
|
||||||
bind:objekt
|
bind:objekt
|
||||||
@@ -200,7 +200,7 @@
|
|||||||
/></Bereich
|
/></Bereich
|
||||||
>
|
>
|
||||||
|
|
||||||
<Bereich bereich="D" title="Gebäudepläne & Unterlagen">
|
<Bereich bereich="E" title="Gebäudepläne & Unterlagen">
|
||||||
<div
|
<div
|
||||||
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
|
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
|
||||||
>
|
>
|
||||||
@@ -239,7 +239,7 @@
|
|||||||
|
|
||||||
<!-- G Angaben zur Fenster, Dachfenster und Türen -->
|
<!-- G Angaben zur Fenster, Dachfenster und Türen -->
|
||||||
|
|
||||||
<Bereich bereich="E" title="Angaben zu Fenster, Dachfenster und Türen"
|
<Bereich bereich="F" title="Angaben zu Fenster, Dachfenster und Türen"
|
||||||
><SanierungszustandFensterTueren
|
><SanierungszustandFensterTueren
|
||||||
bind:images={bilder}
|
bind:images={bilder}
|
||||||
bind:objekt
|
bind:objekt
|
||||||
@@ -249,7 +249,7 @@
|
|||||||
>
|
>
|
||||||
<!-- H Angaben zur Wärmedammung -->
|
<!-- H Angaben zur Wärmedammung -->
|
||||||
|
|
||||||
<Bereich bereich="F" title="Angaben zur Wärmedämmung"
|
<Bereich bereich="G" title="Angaben zur Wärmedämmung"
|
||||||
><SanierungszustandWaermedammung
|
><SanierungszustandWaermedammung
|
||||||
bind:images={bilder}
|
bind:images={bilder}
|
||||||
bind:objekt
|
bind:objekt
|
||||||
@@ -260,7 +260,7 @@
|
|||||||
|
|
||||||
<!-- I Gebäudebild und Energieausweis PDF Vorschau -->
|
<!-- I Gebäudebild und Energieausweis PDF Vorschau -->
|
||||||
|
|
||||||
<Bereich bereich="G" title="Gebäudebild und Energieausweis PDF Vorschau"
|
<Bereich bereich="H" title="Gebäudebild und Energieausweis PDF Vorschau"
|
||||||
><AusweisPreviewContainer
|
><AusweisPreviewContainer
|
||||||
bind:images={bilder}
|
bind:images={bilder}
|
||||||
bind:ausweis
|
bind:ausweis
|
||||||
|
|||||||
@@ -1,24 +1,18 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { AufnahmeKomplettClient, BenutzerClient } from "#components/Ausweis/types.js";
|
import { AufnahmeKomplettClient, BenutzerClient } from "#components/Ausweis/types.js";
|
||||||
|
import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte";
|
||||||
import Carousel from "#components/Carousel.svelte";
|
import Carousel from "#components/Carousel.svelte";
|
||||||
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
||||||
|
import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte";
|
||||||
import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte";
|
import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte";
|
||||||
import { Aufnahme, BedarfsausweisWohnen, Bild, Objekt, Rechnung, Unterlage, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
|
import { Objekt } from "#lib/client/prisma.js";
|
||||||
import mime from "mime"
|
import mime from "mime"
|
||||||
import { CaretRight, ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons";
|
import { ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons";
|
||||||
import CaretLeft from "radix-svelte-icons/src/lib/icons/CaretLeft.svelte";
|
|
||||||
|
|
||||||
export let ausweis: (VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen) & {
|
export let user: BenutzerClient;
|
||||||
rechnung: Rechnung,
|
export let aufnahme: AufnahmeKomplettClient;
|
||||||
aufnahme: Aufnahme & {
|
export let objekt: Objekt;
|
||||||
bilder: Bild[],
|
|
||||||
unterlagen: Unterlage[],
|
|
||||||
objekt: Objekt
|
|
||||||
}
|
|
||||||
};
|
|
||||||
export let benutzer: BenutzerClient;
|
export let benutzer: BenutzerClient;
|
||||||
export let page: number;
|
|
||||||
export let totalPageCount: number;
|
|
||||||
|
|
||||||
|
|
||||||
let dropdownOpen = false;
|
let dropdownOpen = false;
|
||||||
@@ -28,46 +22,42 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="justify-between items-center flex flex-row">
|
<h1>{objekt.adresse}, {objekt.plz} {objekt.ort}</h1>
|
||||||
<div class="text-2xl rounded-lg gap-2 bg-grey-200 text-center">
|
|
||||||
ID: {ausweis.id}
|
|
||||||
</div>
|
|
||||||
<div class="text-2xl">{ausweis.aufnahme.objekt.adresse}, {ausweis.aufnahme.objekt.plz} {ausweis.aufnahme.objekt.ort}</div>
|
|
||||||
<div class="relative">
|
|
||||||
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center" on:click={toggleDropdown}>
|
|
||||||
Ausweis erstellen +
|
|
||||||
</button>
|
|
||||||
{#if dropdownOpen}
|
|
||||||
<div class="absolute top-15 left-0 mt-2 w-50 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 z-[9999]" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation>
|
|
||||||
<div class="py-1 w-full" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
|
|
||||||
<a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?aufnahme={ausweis.aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis<br>Wohnen Erstellen</a>
|
|
||||||
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?aufnahme={ausweis.aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis<br>Gewerbe Erstellen</a>
|
|
||||||
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?aufnahme={ausweis.aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis<br>Wohnen Erstellen</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
<div class="relative mb-6">
|
||||||
|
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center" on:click={toggleDropdown}>
|
||||||
|
Ausweis erstellen +
|
||||||
|
</button>
|
||||||
|
{#if dropdownOpen}
|
||||||
|
<div class="absolut mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation>
|
||||||
|
<div class="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
|
||||||
|
<a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Wohnen Erstellen</a>
|
||||||
|
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Gewerbe Erstellen</a>
|
||||||
|
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis Erstellen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="my-4 grid grid-cols-1 md:grid-cols-1 lg:grid-cols-1 gap-2">
|
<div class="my-4 grid grid-cols-1 md:grid-cols-1 lg:grid-cols-1 gap-2">
|
||||||
|
|
||||||
<div class="relative bg-gray-100 rounded-md flex justify-center items-center">
|
<div class="relative bg-gray-100 rounded-md flex justify-center items-center">
|
||||||
{#if ausweis.aufnahme.bilder.length > 0}
|
{#if aufnahme.bilder.length > 0}
|
||||||
<Carousel perPage={4}>
|
<Carousel perPage={3}>
|
||||||
{#each ausweis.aufnahme.bilder as bild, i (i)}
|
{#each aufnahme.bilder as bild, i (i)}
|
||||||
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[15vh] h-full w-full object-contain">
|
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[25vh] h-full w-full object-contain">
|
||||||
{/each}
|
{/each}
|
||||||
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
|
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
|
||||||
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>
|
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>
|
||||||
</Carousel>
|
</Carousel>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{#if ausweis.aufnahme.unterlagen.length > 0}
|
{#if aufnahme.unterlagen.length > 0}
|
||||||
<h3 class="font-semibold">Unterlagen</h3>
|
<h3 class="font-semibold">Unterlagen</h3>
|
||||||
<div class="grid grid-flow-col gap-4">
|
<div class="grid grid-flow-col gap-4">
|
||||||
{#each ausweis.aufnahme.unterlagen as unterlage}
|
{#each aufnahme.unterlagen as unterlage}
|
||||||
<a href="/unterlagen/{unterlage.id}.{mime.getExtension(unterlage.mime)}" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 p-2 rounded-lg"><FileText size={32}></FileText> {unterlage.name}</a>
|
<a href="/unterlagen/{unterlage.id}.{mime.getExtension(unterlage.mime)}" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 p-2 rounded-lg"><FileText size={32}></FileText> {unterlage.name}</a>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
@@ -75,38 +65,36 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="my-4 grid grid-cols-[1fr] md:grid-cols-[7fr,16fr,5fr] lg:grid-cols-[7fr,16fr,5fr] min-h-[600px]">
|
|
||||||
<DashboardAusweis {benutzer} {ausweis} aufnahme={ausweis.aufnahme} objekt={ausweis.aufnahme.objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex items-center justify-between">
|
|
||||||
{#if page > 1}
|
|
||||||
<a class="p-2 rounded-lg hover:bg-gray-200 cursor-pointer" href="/dashboard/objekte/{page - 1}">
|
|
||||||
<CaretLeft size={30}></CaretLeft>
|
|
||||||
</a>
|
|
||||||
{:else}
|
|
||||||
<div></div>
|
|
||||||
{/if}
|
|
||||||
<div class="text-lg">Ausweis {page} / {totalPageCount}</div>
|
|
||||||
{#if totalPageCount > page}
|
|
||||||
<a class="p-2 rounded-lg hover:bg-gray-200 cursor-pointer" href="/dashboard/objekte/{page + 1}">
|
|
||||||
<CaretRight size={30}></CaretRight>
|
|
||||||
</a>
|
|
||||||
{:else}
|
|
||||||
<div></div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
|
|
||||||
<NotificationWrapper></NotificationWrapper>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
/* TODO: Das kann auch als Tailwind Klasse gemacht werden */
|
|
||||||
.button {
|
.button {
|
||||||
padding: 0.5rem 1rem;
|
padding: 0.5rem 1rem;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<div class="my-4 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
|
||||||
|
{#each aufnahme.verbrauchsausweise_wohnen as ausweis}
|
||||||
|
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
|
||||||
|
{/each}
|
||||||
|
{#each aufnahme.bedarfsausweise_wohnen as ausweis}
|
||||||
|
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
|
||||||
|
{/each}
|
||||||
|
{#each aufnahme.verbrauchsausweise_gewerbe as ausweis}
|
||||||
|
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
|
||||||
|
{/each}
|
||||||
|
{#each aufnahme.geg_nachweise_wohnen as nachweis}
|
||||||
|
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
|
||||||
|
{/each}
|
||||||
|
{#each aufnahme.geg_nachweise_gewerbe as nachweis}
|
||||||
|
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
|
||||||
|
{/each}
|
||||||
|
{#each aufnahme.bedarfsausweise_gewerbe as nachweis}
|
||||||
|
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
|
||||||
|
<NotificationWrapper></NotificationWrapper>
|
||||||
|
</div>
|
||||||
@@ -71,6 +71,36 @@
|
|||||||
<Person size={22} />
|
<Person size={22} />
|
||||||
Profil
|
Profil
|
||||||
</Tab>
|
</Tab>
|
||||||
|
<Tab>
|
||||||
|
<Reader width={22} height={22} />
|
||||||
|
Ausweise
|
||||||
|
</Tab>
|
||||||
|
<Tab>
|
||||||
|
<EnvelopeClosed width={22} height={22} />
|
||||||
|
Kontakt
|
||||||
|
</Tab>
|
||||||
|
<li>
|
||||||
|
<details>
|
||||||
|
<summary class="tab w-full outline-0 hover:outline-0">
|
||||||
|
<Cube width={22} height={22} />
|
||||||
|
Services</summary
|
||||||
|
>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<Tab>
|
||||||
|
<EnvelopeClosed width={22} height={22} />
|
||||||
|
Kontakt
|
||||||
|
</Tab>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Tab>
|
||||||
|
<EnvelopeClosed width={22} height={22} />
|
||||||
|
Kontakt
|
||||||
|
</Tab>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</details>
|
||||||
|
</li>
|
||||||
</TabList>
|
</TabList>
|
||||||
<div
|
<div
|
||||||
class="border border-base-300 w-full h-full rounded-lg bg-base-200 p-8"
|
class="border border-base-300 w-full h-full rounded-lg bg-base-200 p-8"
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
import Pagination from "#components/Pagination.svelte";
|
import Pagination from "#components/Pagination.svelte";
|
||||||
import { Enums, Objekt } from "#lib/client/prisma.js";
|
import { Enums, Objekt } from "#lib/client/prisma.js";
|
||||||
|
|
||||||
|
|
||||||
export let user: BenutzerClient;
|
export let user: BenutzerClient;
|
||||||
export let objekte: ObjektKomplettClient[];
|
export let objekte: ObjektKomplettClient[];
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import { BASE_URI } from "#lib/constants.js";
|
|||||||
import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js";
|
import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js";
|
||||||
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||||
import { s3Client } from "#lib/s3.js";
|
import { s3Client } from "#lib/s3.js";
|
||||||
import { createInvoice, getLexOfficeRechnung, getLexOfficeVoucherNumber } from "#lib/server/invoice.js";
|
import { createInvoice, getLexOfficeRechnung } from "#lib/server/invoice.js";
|
||||||
import { tryCatch } from "#lib/tryCatch.js";
|
import { tryCatch } from "#lib/tryCatch.js";
|
||||||
import SFTPClient from 'ssh2-sftp-client';
|
import SFTPClient from 'ssh2-sftp-client';
|
||||||
import {
|
import {
|
||||||
@@ -95,7 +95,6 @@ export const GET = defineApiRoute({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let voucherNumber: string = "";
|
|
||||||
if (!rechnung.lex_office_id) {
|
if (!rechnung.lex_office_id) {
|
||||||
const [result, error] = await tryCatch(
|
const [result, error] = await tryCatch(
|
||||||
createInvoice(ausweis, rechnung)
|
createInvoice(ausweis, rechnung)
|
||||||
@@ -106,13 +105,10 @@ export const GET = defineApiRoute({
|
|||||||
code: "BAD_REQUEST",
|
code: "BAD_REQUEST",
|
||||||
message:
|
message:
|
||||||
"Die Rechnung konnte bei LexOffice nicht angelegt werden..",
|
"Die Rechnung konnte bei LexOffice nicht angelegt werden..",
|
||||||
cause: error
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const { id, voucherNumber: lexOfficeVoucherNumber } = result;
|
const { id, voucherNumber } = result;
|
||||||
|
|
||||||
voucherNumber = lexOfficeVoucherNumber;
|
|
||||||
|
|
||||||
await prisma.rechnung.update({
|
await prisma.rechnung.update({
|
||||||
where: {
|
where: {
|
||||||
@@ -122,8 +118,6 @@ export const GET = defineApiRoute({
|
|||||||
lex_office_id: id,
|
lex_office_id: id,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
voucherNumber = await getLexOfficeVoucherNumber(rechnung)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const pdfAusweis = await getAnsichtsausweis(
|
const pdfAusweis = await getAnsichtsausweis(
|
||||||
@@ -288,7 +282,7 @@ export const GET = defineApiRoute({
|
|||||||
<tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td>
|
<tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td>
|
||||||
<tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td>
|
<tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td>
|
||||||
<tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td>
|
<tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td>
|
||||||
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${voucherNumber}</b></td>
|
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.lex_office_id}</b></td>
|
||||||
</table>
|
</table>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
|||||||
@@ -20,11 +20,12 @@ export const PATCH = defineApiRoute({
|
|||||||
|
|
||||||
const aufnahme = await prisma.aufnahme.findUnique({
|
const aufnahme = await prisma.aufnahme.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id
|
id,
|
||||||
|
benutzer_id: user.id
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!aufnahme || (aufnahme.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
if (!aufnahme) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Aufnahme mit dieser UID existiert nicht oder gehört nicht dem aktuellen Benutzer."
|
message: "Aufnahme mit dieser UID existiert nicht oder gehört nicht dem aktuellen Benutzer."
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
|||||||
import { TokenType } from "#lib/auth/types.js";
|
import { TokenType } from "#lib/auth/types.js";
|
||||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||||
|
|
||||||
|
|
||||||
export const GET = defineApiRoute({
|
export const GET = defineApiRoute({
|
||||||
meta: {
|
meta: {
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
|||||||
import { generatePrefixedId } from "#lib/db.js";
|
import { generatePrefixedId } from "#lib/db.js";
|
||||||
import { exclude } from "#lib/exclude.js";
|
import { exclude } from "#lib/exclude.js";
|
||||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
import { prisma } from "#lib/server/prisma.js";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { BedarfsausweisGewerbeSchema } from "src/generated/zod/bedarfsausweisgewerbe.js";
|
import { BedarfsausweisGewerbeSchema } from "src/generated/zod/bedarfsausweisgewerbe.js";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
@@ -31,10 +31,13 @@ export const PATCH = defineApiRoute({
|
|||||||
const objekt = await prisma.bedarfsausweisGewerbe.findUnique({
|
const objekt = await prisma.bedarfsausweisGewerbe.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id: ctx.params.id,
|
id: ctx.params.id,
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
if (!objekt) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
|||||||
import { generatePrefixedId } from "#lib/db.js";
|
import { generatePrefixedId } from "#lib/db.js";
|
||||||
import { exclude } from "#lib/exclude.js";
|
import { exclude } from "#lib/exclude.js";
|
||||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
import { prisma } from "#lib/server/prisma.js";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
|
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
@@ -30,11 +30,14 @@ export const PATCH = defineApiRoute({
|
|||||||
async fetch(input, ctx, user) {
|
async fetch(input, ctx, user) {
|
||||||
const objekt = await prisma.bedarfsausweisWohnen.findUnique({
|
const objekt = await prisma.bedarfsausweisWohnen.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id: ctx.params.id
|
id: ctx.params.id,
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
if (!objekt) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
|||||||
import { generatePrefixedId } from "#lib/db.js";
|
import { generatePrefixedId } from "#lib/db.js";
|
||||||
import { exclude } from "#lib/exclude.js";
|
import { exclude } from "#lib/exclude.js";
|
||||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
import { prisma } from "#lib/server/prisma.js";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { GEGNachweisGewerbeSchema } from "src/generated/zod/gegnachweisgewerbe.js";
|
import { GEGNachweisGewerbeSchema } from "src/generated/zod/gegnachweisgewerbe.js";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
@@ -30,11 +30,14 @@ export const PATCH = defineApiRoute({
|
|||||||
async fetch(input, ctx, user) {
|
async fetch(input, ctx, user) {
|
||||||
const objekt = await prisma.gEGNachweisGewerbe.findUnique({
|
const objekt = await prisma.gEGNachweisGewerbe.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id: ctx.params.id
|
id: ctx.params.id,
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
if (!objekt) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
|||||||
import { generatePrefixedId } from "#lib/db.js";
|
import { generatePrefixedId } from "#lib/db.js";
|
||||||
import { exclude } from "#lib/exclude.js";
|
import { exclude } from "#lib/exclude.js";
|
||||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
import { prisma } from "#lib/server/prisma.js";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { GEGNachweisWohnenSchema } from "src/generated/zod/gegnachweiswohnen.js";
|
import { GEGNachweisWohnenSchema } from "src/generated/zod/gegnachweiswohnen.js";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
@@ -30,11 +30,14 @@ export const PATCH = defineApiRoute({
|
|||||||
async fetch(input, ctx, user) {
|
async fetch(input, ctx, user) {
|
||||||
const objekt = await prisma.gEGNachweisWohnen.findUnique({
|
const objekt = await prisma.gEGNachweisWohnen.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id: ctx.params.id
|
id: ctx.params.id,
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
if (!objekt) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||||
|
|||||||
@@ -20,11 +20,14 @@ export const PATCH = defineApiRoute({
|
|||||||
async fetch(input, ctx, user) {
|
async fetch(input, ctx, user) {
|
||||||
const objekt = await prisma.objekt.findUnique({
|
const objekt = await prisma.objekt.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id: ctx.params.id
|
id: ctx.params.id,
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
if (!objekt) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Objekt konnte nicht gefunden werden."
|
message: "Objekt konnte nicht gefunden werden."
|
||||||
|
|||||||
@@ -27,11 +27,14 @@ export const PATCH = defineApiRoute({
|
|||||||
async fetch(input, ctx, user) {
|
async fetch(input, ctx, user) {
|
||||||
const objekt = await prisma.verbrauchsausweisGewerbe.findUnique({
|
const objekt = await prisma.verbrauchsausweisGewerbe.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id: ctx.params.id
|
id: ctx.params.id,
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
if (!objekt) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||||
|
|||||||
@@ -28,11 +28,14 @@ export const PATCH = defineApiRoute({
|
|||||||
async fetch(input, ctx, user) {
|
async fetch(input, ctx, user) {
|
||||||
const objekt = await prisma.verbrauchsausweisWohnen.findUnique({
|
const objekt = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id: ctx.params.id
|
id: ctx.params.id,
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
if (!objekt) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||||
|
|||||||
@@ -39,49 +39,31 @@ const aufnahme = await prisma.aufnahme.findUnique({
|
|||||||
bilder: true,
|
bilder: true,
|
||||||
unterlagen: true,
|
unterlagen: true,
|
||||||
bedarfsausweise_wohnen: {
|
bedarfsausweise_wohnen: {
|
||||||
orderBy: {
|
|
||||||
updated_at: "desc"
|
|
||||||
},
|
|
||||||
include: {
|
include: {
|
||||||
rechnung: true
|
rechnung: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
verbrauchsausweise_gewerbe: {
|
verbrauchsausweise_gewerbe: {
|
||||||
orderBy: {
|
|
||||||
updated_at: "desc"
|
|
||||||
},
|
|
||||||
include: {
|
include: {
|
||||||
rechnung: true
|
rechnung: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
verbrauchsausweise_wohnen: {
|
verbrauchsausweise_wohnen: {
|
||||||
orderBy: {
|
|
||||||
updated_at: "desc"
|
|
||||||
},
|
|
||||||
include: {
|
include: {
|
||||||
rechnung: true
|
rechnung: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
bedarfsausweise_gewerbe: {
|
bedarfsausweise_gewerbe: {
|
||||||
orderBy: {
|
|
||||||
updated_at: "desc"
|
|
||||||
},
|
|
||||||
include: {
|
include: {
|
||||||
rechnung: true
|
rechnung: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
geg_nachweise_gewerbe: {
|
geg_nachweise_gewerbe: {
|
||||||
orderBy: {
|
|
||||||
updated_at: "desc"
|
|
||||||
},
|
|
||||||
include: {
|
include: {
|
||||||
rechnung: true
|
rechnung: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
geg_nachweise_wohnen: {
|
geg_nachweise_wohnen: {
|
||||||
orderBy: {
|
|
||||||
updated_at: "desc"
|
|
||||||
},
|
|
||||||
include: {
|
include: {
|
||||||
rechnung: true
|
rechnung: true
|
||||||
}
|
}
|
||||||
|
|||||||
80
src/pages/dashboard/aufnahme/index.astro
Normal file
80
src/pages/dashboard/aufnahme/index.astro
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||||
|
import { prisma, Enums } from "#lib/server/prisma";
|
||||||
|
import { createCaller } from "src/astro-typesafe-api-caller";
|
||||||
|
|
||||||
|
const caller = createCaller(Astro)
|
||||||
|
|
||||||
|
const id = Astro.url.searchParams.get("id");
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
return Astro.redirect("/dashboard/objekte")
|
||||||
|
}
|
||||||
|
|
||||||
|
const user = await caller.user.self.GET.fetch(undefined, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
|
return Astro.redirect("/auth/login")
|
||||||
|
}
|
||||||
|
|
||||||
|
const objekte = await prisma.objekt.findFirst({
|
||||||
|
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
},
|
||||||
|
} : {
|
||||||
|
...(id ? {OR: [
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
verbrauchsausweise_gewerbe: {
|
||||||
|
some: {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
verbrauchsausweise_wohnen: {
|
||||||
|
some: {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
bedarfsausweise_wohnen: {
|
||||||
|
some: {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},]} : {})
|
||||||
|
},
|
||||||
|
orderBy: {
|
||||||
|
erstellungsdatum: "desc"
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
aufnahmen: {
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
unterlagen: true,
|
||||||
|
bedarfsausweise_wohnen: true,
|
||||||
|
verbrauchsausweise_gewerbe: true,
|
||||||
|
verbrauchsausweise_wohnen: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
---
|
||||||
@@ -2,5 +2,4 @@
|
|||||||
return Astro.redirect("/dashboard/objekte/1", 301);
|
return Astro.redirect("/dashboard/objekte/1", 301);
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
<script></script>
|
<script></script>
|
||||||
@@ -1,134 +1,168 @@
|
|||||||
---
|
---
|
||||||
import UserLayout from "#layouts/DashboardLayout.astro";
|
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||||
import { Enums, prisma } from "#lib/server/prisma";
|
import { Enums, prisma } from "#lib/server/prisma";
|
||||||
|
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
||||||
import { getCurrentUser } from "#lib/server/user";
|
import { getCurrentUser } from "#lib/server/user";
|
||||||
import DashboardAufnahmeModule from "#modules/Dashboard/DashboardAufnahmeModule.svelte";
|
|
||||||
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
|
|
||||||
|
|
||||||
const params = Astro.params;
|
const params = Astro.params;
|
||||||
|
const page = Number(params.page)
|
||||||
const page = Number(params.page);
|
|
||||||
|
|
||||||
const id = Astro.url.searchParams.get("id") || undefined;
|
const id = Astro.url.searchParams.get("id") || undefined;
|
||||||
|
|
||||||
const user = await getCurrentUser(Astro);
|
const user = await getCurrentUser(Astro)
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return Astro.redirect("/auth/login");
|
return Astro.redirect("/auth/login")
|
||||||
}
|
}
|
||||||
|
|
||||||
const totalPageCount = await prisma.aufnahme.count({
|
const totalPages = await prisma.objekt.count({
|
||||||
where:
|
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||||
user.rolle === Enums.BenutzerRolle.USER
|
benutzer: {
|
||||||
? {
|
id: user.id
|
||||||
benutzer: {
|
}
|
||||||
id: user.id,
|
} : {}
|
||||||
},
|
})
|
||||||
}
|
|
||||||
: {},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (page < 1 || page > totalPageCount) {
|
let objekte = []
|
||||||
return Astro.redirect("/dashboard/objekte/1");
|
if (id) {
|
||||||
}
|
objekte = await prisma.objekt.findMany({
|
||||||
|
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||||
let ausweis,
|
benutzer: {
|
||||||
result: { id: string; updated_at: Date }[] = [];
|
id: user.id
|
||||||
// Wir fragen den neuesten Ausweis ab
|
|
||||||
// Falls der Nutzer ein Admin ist dann kommt der ganz neueste ansonsten der neueste des eingeloggten Benutzers.
|
|
||||||
if (user.rolle === Enums.BenutzerRolle.USER) {
|
|
||||||
if (id) {
|
|
||||||
const adapter = getPrismaAusweisAdapter(id);
|
|
||||||
ausweis = await adapter?.findUnique({
|
|
||||||
where: {
|
|
||||||
id,
|
|
||||||
benutzer_id: user.id,
|
|
||||||
},
|
},
|
||||||
include: {
|
} : {
|
||||||
rechnung: true,
|
...(id ? {
|
||||||
aufnahme: {
|
OR: [
|
||||||
include: {
|
{
|
||||||
bilder: true,
|
aufnahmen: {
|
||||||
unterlagen: true,
|
every: {
|
||||||
objekt: true,
|
verbrauchsausweise_gewerbe: {
|
||||||
},
|
some: {
|
||||||
|
id: {
|
||||||
|
contains: id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
},
|
{
|
||||||
});
|
aufnahmen: {
|
||||||
} else {
|
every: {
|
||||||
result =
|
verbrauchsausweise_wohnen: {
|
||||||
await prisma.$queryRaw`SELECT id, updated_at FROM "VerbrauchsausweisWohnen" WHERE benutzer_id = ${user.id} UNION ALL
|
some: {
|
||||||
SELECT id, updated_at FROM "VerbrauchsausweisGewerbe" WHERE benutzer_id = ${user.id} UNION ALL
|
id: {
|
||||||
SELECT id, updated_at FROM "BedarfsausweisWohnen" WHERE benutzer_id = ${user.id} UNION ALL
|
contains: id
|
||||||
SELECT id, updated_at FROM "BedarfsausweisGewerbe" WHERE benutzer_id = ${user.id} UNION ALL
|
}
|
||||||
SELECT id, updated_at FROM "GEGNachweisWohnen" WHERE benutzer_id = ${user.id} UNION ALL
|
}
|
||||||
SELECT id, updated_at FROM "GEGNachweisGewerbe" WHERE benutzer_id = ${user.id}
|
},
|
||||||
ORDER BY updated_at DESC LIMIT 1 OFFSET ${page - 1}`;
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (id) {
|
|
||||||
const adapter = getPrismaAusweisAdapter(id);
|
|
||||||
ausweis = await adapter?.findUnique({
|
|
||||||
where: {
|
|
||||||
id,
|
|
||||||
},
|
|
||||||
include: {
|
|
||||||
rechnung: true,
|
|
||||||
aufnahme: {
|
|
||||||
include: {
|
|
||||||
bilder: true,
|
|
||||||
unterlagen: true,
|
|
||||||
objekt: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
{
|
||||||
});
|
aufnahmen: {
|
||||||
} else {
|
every: {
|
||||||
result =
|
bedarfsausweise_wohnen: {
|
||||||
await prisma.$queryRaw`SELECT id, updated_at FROM "VerbrauchsausweisWohnen" UNION ALL
|
some: {
|
||||||
SELECT id, updated_at FROM "VerbrauchsausweisGewerbe" UNION ALL
|
id: {
|
||||||
SELECT id, updated_at FROM "BedarfsausweisWohnen" UNION ALL
|
contains: id
|
||||||
SELECT id, updated_at FROM "BedarfsausweisGewerbe" UNION ALL
|
}
|
||||||
SELECT id, updated_at FROM "GEGNachweisWohnen" UNION ALL
|
}
|
||||||
SELECT id, updated_at FROM "GEGNachweisGewerbe"
|
},
|
||||||
ORDER BY updated_at DESC LIMIT 1 OFFSET ${page - 1}`;
|
}
|
||||||
}
|
}
|
||||||
}
|
},]} : {})
|
||||||
|
},
|
||||||
if (result.length > 0) {
|
orderBy: {
|
||||||
const adapter = getPrismaAusweisAdapter(result[0].id);
|
erstellungsdatum: "desc"
|
||||||
|
|
||||||
ausweis = await adapter?.findUnique({
|
|
||||||
where: {
|
|
||||||
id: result[0].id,
|
|
||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
rechnung: true,
|
aufnahmen: {
|
||||||
aufnahme: {
|
|
||||||
include: {
|
include: {
|
||||||
bilder: true,
|
bilder: true,
|
||||||
unterlagen: true,
|
unterlagen: true,
|
||||||
objekt: true,
|
bedarfsausweise_wohnen: true,
|
||||||
},
|
verbrauchsausweise_gewerbe: true,
|
||||||
},
|
verbrauchsausweise_wohnen: true,
|
||||||
|
bedarfsausweise_gewerbe: true,
|
||||||
|
geg_nachweise_gewerbe: true,
|
||||||
|
geg_nachweise_wohnen: true
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
});
|
take: 25,
|
||||||
|
skip: (page - 1) * 25
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
objekte = await prisma.objekt.findMany({
|
||||||
|
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
},
|
||||||
|
} : {
|
||||||
|
OR: [
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
verbrauchsausweise_gewerbe: {
|
||||||
|
some: {
|
||||||
|
ausgestellt: false,
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
verbrauchsausweise_wohnen: {
|
||||||
|
some: {
|
||||||
|
ausgestellt: false,
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
bedarfsausweise_wohnen: {
|
||||||
|
some: {
|
||||||
|
ausgestellt: false,
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
orderBy: {
|
||||||
|
erstellungsdatum: "desc"
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
aufnahmen: {
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
unterlagen: true,
|
||||||
|
bedarfsausweise_wohnen: true,
|
||||||
|
verbrauchsausweise_gewerbe: true,
|
||||||
|
verbrauchsausweise_wohnen: true,
|
||||||
|
bedarfsausweise_gewerbe: true,
|
||||||
|
geg_nachweise_gewerbe: true,
|
||||||
|
geg_nachweise_wohnen: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
take: 25,
|
||||||
|
skip: (page - 1) * 25
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ausweis) {
|
|
||||||
return Astro.redirect("/dashboard/objekte/1")
|
|
||||||
}
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<UserLayout title="Objekte" {user}>
|
<UserLayout title="Objekte" {user}>
|
||||||
<DashboardAufnahmeModule
|
<DashboardModule {user} {objekte} totalPages={Math.ceil(totalPages / 25)} page={page} {id} client:load />
|
||||||
{ausweis}
|
</UserLayout>
|
||||||
benutzer={user}
|
|
||||||
{totalPageCount}
|
|
||||||
{page}
|
|
||||||
client:load
|
|
||||||
/>
|
|
||||||
<!-- {!aufnahme ? <p>Keine weiteren Ausweise vorhanden.</p> : <DashboardAufnahmeModule {user} {aufnahme} benutzer={user} objekt={aufnahme.objekt} client:load/>} -->
|
|
||||||
<!-- <DashboardModule {user} {objekte} totalPages={Math.ceil(totalPages / 25)} page={page} {id} client:load /> -->
|
|
||||||
</UserLayout>
|
|
||||||
@@ -61,7 +61,7 @@ if (id) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
aufnahme = await getAufnahme(aufnahme_id) as Aufnahme
|
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
|
||||||
|
|
||||||
if (!aufnahme) {
|
if (!aufnahme) {
|
||||||
// Die Aufnahme existiert wohl nicht.
|
// Die Aufnahme existiert wohl nicht.
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ if (id) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
aufnahme = await getAufnahme(aufnahme_id) as Aufnahme
|
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
|
||||||
|
|
||||||
if (!aufnahme) {
|
if (!aufnahme) {
|
||||||
// Die Aufnahme existiert wohl nicht.
|
// Die Aufnahme existiert wohl nicht.
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ if (id) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
aufnahme = await getAufnahme(aufnahme_id) as Aufnahme
|
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
|
||||||
|
|
||||||
if (!aufnahme) {
|
if (!aufnahme) {
|
||||||
// Die Aufnahme existiert wohl nicht.
|
// Die Aufnahme existiert wohl nicht.
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ export const GET: APIRoute = async (Astro) => {
|
|||||||
return new Response(null, { status: 404 });
|
return new Response(null, { status: 404 });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const ausweisart = getAusweisartFromId(ausweis_id)
|
const ausweisart = getAusweisartFromId(ausweis_id)
|
||||||
|
|
||||||
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | null = null;
|
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | null = null;
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import Layout from "#layouts/Layout.astro";
|
|||||||
import { BASE_URI } from "#lib/constants";
|
import { BASE_URI } from "#lib/constants";
|
||||||
import { transport } from "#lib/mail";
|
import { transport } from "#lib/mail";
|
||||||
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
|
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
|
||||||
import { Enums } from "#lib/server/prisma";
|
|
||||||
import { getCurrentUser } from "#lib/server/user";
|
import { getCurrentUser } from "#lib/server/user";
|
||||||
|
|
||||||
const user = await getCurrentUser(Astro)
|
const user = await getCurrentUser(Astro)
|
||||||
@@ -13,11 +12,6 @@ if (!user || !id) {
|
|||||||
return Astro.redirect("/")
|
return Astro.redirect("/")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wir wollen keine Bestätigungsmail wenn ein Admin speichert.
|
|
||||||
if (user.rolle === Enums.BenutzerRolle.ADMIN) {
|
|
||||||
return Astro.redirect("/dashboard")
|
|
||||||
}
|
|
||||||
|
|
||||||
const adapter = getPrismaAusweisAdapter(id || "")
|
const adapter = getPrismaAusweisAdapter(id || "")
|
||||||
|
|
||||||
if (!adapter) {
|
if (!adapter) {
|
||||||
|
|||||||
4
surreal/Anteilshaber.sql
Normal file
4
surreal/Anteilshaber.sql
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
DEFINE TABLE Anteilshaber TYPE RELATION IN Benutzer OUT VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen | BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe SCHEMAFULL PERMISSIONS NONE;
|
||||||
|
|
||||||
|
DEFINE FIELD rolle ON TABLE Anteilshaber
|
||||||
|
TYPE 'Besteller' | 'Aussteller' | 'Zuarbeiter' | 'Interessierter';
|
||||||
109
surreal/Aufnahme.sql
Normal file
109
surreal/Aufnahme.sql
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
DEFINE TABLE Aufnahme SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD benutzer ON TABLE Aufnahme TYPE record<Benutzer>;
|
||||||
|
-- @zod.describe("Art des Gebäudes und seiner primären Nutzungsart")
|
||||||
|
DEFINE FIELD gebaeudetyp ON TABLE Aufnahme TYPE string;
|
||||||
|
-- @zod.describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil")
|
||||||
|
DEFINE FIELD gebaeudeteil ON TABLE Aufnahme TYPE string;
|
||||||
|
-- @zod.describe("Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde")
|
||||||
|
DEFINE FIELD baujahr_gebaeude ON TABLE Aufnahme TYPE array<int>;
|
||||||
|
-- @zod.describe("Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde")
|
||||||
|
DEFINE FIELD baujahr_heizung ON TABLE Aufnahme TYPE array<int>;
|
||||||
|
-- @zod.describe("Alle Jahre in denen die Klimaanlage eingebaut oder grundlegend verändert wurde")
|
||||||
|
DEFINE FIELD baujahr_klima ON TABLE Aufnahme TYPE array<int>;
|
||||||
|
-- @zod.describe("Anzahl der (Wohn)Einheiten im Gebäude")
|
||||||
|
DEFINE FIELD einheiten ON TABLE Aufnahme TYPE option<int>;
|
||||||
|
-- @zod.describe("Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden")
|
||||||
|
DEFINE FIELD flaeche ON TABLE Aufnahme TYPE option<int>;
|
||||||
|
-- @zod.describe("(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche")
|
||||||
|
DEFINE FIELD nutzflaeche ON TABLE Aufnahme TYPE option<int>;
|
||||||
|
-- @zod.describe("Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD saniert ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Ob ein Keller vorhanden, beheizt oder unbeheizt ist")
|
||||||
|
DEFINE FIELD keller ON TABLE Aufnahme TYPE "BEHEIZT" | "UNBEHEIZT" | "NICHT_VORHANDEN";
|
||||||
|
-- @zod.describe("Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist")
|
||||||
|
DEFINE FIELD dachgeschoss ON TABLE Aufnahme TYPE "BEHEIZT" | "UNBEHEIZT" | "NICHT_VORHANDEN";
|
||||||
|
-- @zod.describe("Art der Gebäudelüftung")
|
||||||
|
DEFINE FIELD lueftung ON TABLE Aufnahme TYPE "Fensterlueftung" | "Schachtlueftung" | "LueftungsanlageMitWaermerueckgewinnung" | "LueftungsanlageOhneWaermerueckgewinnung";
|
||||||
|
-- @zod.describe("Art der Gebäudekühlung")
|
||||||
|
DEFINE FIELD kuehlung ON TABLE Aufnahme TYPE option<string>;
|
||||||
|
-- @zod.describe("Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr")
|
||||||
|
DEFINE FIELD leerstand ON TABLE Aufnahme TYPE option<int>;
|
||||||
|
|
||||||
|
-- @zod.describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD alternative_heizung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD alternative_warmwasser ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD alternative_lueftung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD alternative_kuehlung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
|
||||||
|
-- @zod.describe("Datum an dem der Kunde die Aufnahme erstellt hat")
|
||||||
|
DEFINE FIELD erstellungsdatum ON TABLE Aufnahme TYPE datetime DEFAULT time::now();
|
||||||
|
|
||||||
|
-- @zod.describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD zentralheizung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD solarsystem_warmwasser ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD warmwasser_rohre_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD niedertemperatur_kessel ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD brennwert_kessel ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD heizungsrohre_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
DEFINE FIELD standard_kessel ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD waermepumpe ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD raum_temperatur_regler ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD photovoltaik ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD durchlauf_erhitzer ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
DEFINE FIELD einzelofen ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD zirkulation ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD einfach_verglasung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD dreifach_verglasung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD fenster_teilweise_undicht ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD doppel_verglasung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD fenster_dicht ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD rolllaeden_kaesten_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD isolier_verglasung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD tueren_undicht ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD tueren_dicht ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD dachgeschoss_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD keller_decke_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD keller_wand_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD aussenwand_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD oberste_geschossdecke_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD aussenwand_min_12cm_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD dachgeschoss_min_12cm_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD oberste_geschossdecke_min_12cm_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
|
||||||
|
DEFINE FIELD events ON TABLE Aufnahme TYPE array<record<Event>>;
|
||||||
|
DEFINE FIELD bilder ON TABLE Aufnahme TYPE array<record<Bild>>;
|
||||||
|
DEFINE FIELD unterlagen ON TABLE Aufnahme TYPE array<record<Unterlage>>;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
22
surreal/Benutzer.sql
Normal file
22
surreal/Benutzer.sql
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
DEFINE TABLE Benutzer SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD id ON TABLE Benutzer TYPE string;
|
||||||
|
DEFINE FIELD alte_id ON TABLE Benutzer TYPE int;
|
||||||
|
DEFINE FIELD name ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD vorname ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD email ON TABLE Benutzer TYPE string;
|
||||||
|
DEFINE FIELD passwort ON TABLE Benutzer TYPE string;
|
||||||
|
DEFINE FIELD profilbild ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD plz ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD ort ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD adresse ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD telefon ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD anrede ON TABLE Benutzer TYPE option<string>;
|
||||||
|
|
||||||
|
DEFINE FIELD rolle ON TABLE Benutzer TYPE "USER" | "ADMIN";
|
||||||
|
|
||||||
|
DEFINE FIELD firma ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD lex_office_id ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD verified ON TABLE Benutzer TYPE bool DEFAULT false;
|
||||||
|
DEFINE FIELD created_at ON TABLE Benutzer TYPE datetime DEFAULT time::now();
|
||||||
|
DEFINE FIELD updated_at ON TABLE Benutzer TYPE datetime DEFAULT time::now();
|
||||||
10
surreal/Bild.sql
Normal file
10
surreal/Bild.sql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
DEFINE TABLE Bild SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD name ON TABLE Bild TYPE string;
|
||||||
|
DEFINE FIELD mime ON TABLE Bild TYPE string;
|
||||||
|
DEFINE FIELD kategorie ON TABLE Bild TYPE "Heizung" | "Fenster" | "Gebaeude" | "Daemmung" | "AnlagenTechnik";
|
||||||
|
|
||||||
|
DEFINE FIELD created_at ON TABLE Bild TYPE datetime DEFAULT time::now();
|
||||||
|
DEFINE FIELD updated_at ON TABLE Bild TYPE datetime VALUE time::now();
|
||||||
|
|
||||||
|
DEFINE FIELD aufnahme ON TABLE Bild TYPE option<record<Aufnahme>>;
|
||||||
10
surreal/Event.sql
Normal file
10
surreal/Event.sql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
DEFINE TABLE Event SCHEMAFULL;
|
||||||
|
DEFINE FIELD erstellungsdatum ON TABLE Event TYPE datetime DEFAULT time::now();
|
||||||
|
|
||||||
|
DEFINE FIELD title ON TABLE Event TYPE string;
|
||||||
|
DEFINE FIELD description ON TABLE Event TYPE option<string>;
|
||||||
|
|
||||||
|
-- Verlinkung des Gebäudes
|
||||||
|
DEFINE FIELD aufnahme ON TABLE Event TYPE record<Aufnahme>;
|
||||||
|
-- Verlinkung des Benutzers
|
||||||
|
DEFINE FIELD benutzer ON TABLE Event TYPE record<Benutzer>;
|
||||||
16
surreal/Objekt.sql
Normal file
16
surreal/Objekt.sql
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
DEFINE TABLE Objekt SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD id ON TABLE Objekt TYPE string;
|
||||||
|
DEFINE FIELD latitude ON TABLE Objekt TYPE option<float>;
|
||||||
|
DEFINE FIELD longitude ON TABLE Objekt TYPE option<float>;
|
||||||
|
|
||||||
|
-- @zod.describe("Postleitzahl des Gebäudes")
|
||||||
|
DEFINE FIELD plz ON TABLE Objekt TYPE option<string>;
|
||||||
|
-- @zod.describe("Ort des Gebäudes")
|
||||||
|
DEFINE FIELD ort ON TABLE Objekt TYPE option<string>;
|
||||||
|
-- @zod.describe("Adresse (Straße und Hausnummer) des Gebäudes")
|
||||||
|
DEFINE FIELD adresse ON TABLE Objekt TYPE option<string>;
|
||||||
|
|
||||||
|
DEFINE FIELD erstellungsdatum ON TABLE Objekt TYPE datetime DEFAULT time::now();
|
||||||
|
|
||||||
|
DEFINE FIELD aufnahmen ON TABLE Objekt TYPE array<record<Aufnahme>>;
|
||||||
10
surreal/Unterlage.sql
Normal file
10
surreal/Unterlage.sql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
DEFINE TABLE Unterlage SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD name ON TABLE Unterlage TYPE string;
|
||||||
|
DEFINE FIELD mime ON TABLE Unterlage TYPE string;
|
||||||
|
DEFINE FIELD kategorie ON TABLE Unterlage TYPE "Grundriss" | "Sonstiges";
|
||||||
|
|
||||||
|
DEFINE FIELD created_at ON TABLE Unterlage TYPE datetime DEFAULT time::now();
|
||||||
|
DEFINE FIELD updated_at ON TABLE Unterlage TYPE datetime VALUE time::now();
|
||||||
|
|
||||||
|
DEFINE FIELD aufnahme ON TABLE Unterlage TYPE option<record<Aufnahme>>;
|
||||||
67
surreal/VerbrauchsausweisWohnen.sql
Normal file
67
surreal/VerbrauchsausweisWohnen.sql
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
DEFINE TABLE VerbrauchsausweisWohnen SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD ausstellgrund ON VerbrauchsausweisWohnen TYPE "Neubau" | "Vermietung" | "Verkauf" | "Modernisierung" | "Sonstiges" DEFAULT "Sonstiges";
|
||||||
|
DEFINE FIELD registriernummer ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD zusaetzliche_heizquelle ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD einheit_1 ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD einheit_2 ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD brennstoff_1 ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD brennstoff_2 ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD energieeffizienzklasse ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD ausstellungsdatum ON VerbrauchsausweisWohnen TYPE datetime;
|
||||||
|
DEFINE FIELD boxpruefung ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD startdatum ON VerbrauchsausweisWohnen TYPE datetime;
|
||||||
|
|
||||||
|
DEFINE FIELD verbrauch_1 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_2 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_3 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_4 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_5 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_6 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
|
||||||
|
DEFINE FIELD warmwasser_enthalten ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD warmwasser_anteil_bekannt ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD faktorKeller ON VerbrauchsausweisWohnen TYPE option<float>;
|
||||||
|
|
||||||
|
DEFINE FIELD alternative_heizung ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD alternative_warmwasser ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD alternative_lueftung ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD alternative_kuehlung ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
|
||||||
|
DEFINE FIELD anteil_warmwasser_1 ON VerbrauchsausweisWohnen TYPE option<float>;
|
||||||
|
DEFINE FIELD anteil_warmwasser_2 ON VerbrauchsausweisWohnen TYPE option<float>;
|
||||||
|
|
||||||
|
DEFINE FIELD ausgestellt ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD storniert ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD bestellt ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD zurueckgestellt ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD prueftext ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD beschreibung ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
|
||||||
|
DEFINE FIELD kontrolldatei_angefragt ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
|
||||||
|
DEFINE FIELD ausweistyp ON VerbrauchsausweisWohnen TYPE "Standard" | "StandardXL" | "Beratung" | "BeratungXL" | "Offline" | "OfflineXL" DEFAULT "Standard";
|
||||||
|
DEFINE FIELD ausweisart ON VerbrauchsausweisWohnen TYPE "VerbrauchsausweisWohnen" | "VerbrauchsausweisGewerbe" | "BedarfsausweisWohnen" | "BedarfsausweisGewerbe" | "GEGNachweisWohnen" | "GEGNachweisGewerbe" DEFAULT "VerbrauchsausweisWohnen";
|
||||||
|
|
||||||
|
DEFINE FIELD created_at ON VerbrauchsausweisWohnen TYPE datetime DEFAULT time::now();
|
||||||
|
DEFINE FIELD updated_at ON VerbrauchsausweisWohnen TYPE datetime VALUE time::now();
|
||||||
|
|
||||||
|
-- Prüfpunkte
|
||||||
|
DEFINE FIELD pruefpunkt_heizungsalter ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_verbrauch_niedrig ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_verbrauch_hoch ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_verbrauch_null ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_verbrauch_abweichung ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_wohnflaeche_einheiten ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_strom_null ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_strom_abweichung ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_plz ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_heizungsanlage ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_anteil_warmwasser ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_wohnflaeche ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_geometrie ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_fenster ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
|
||||||
|
DEFINE FIELD benutzer ON VerbrauchsausweisWohnen TYPE option<record<Benutzer>>;
|
||||||
|
DEFINE FIELD rechnung ON VerbrauchsausweisWohnen TYPE option<record<Rechnung>>;
|
||||||
|
DEFINE FIELD aufnahme ON VerbrauchsausweisWohnen TYPE record<Aufnahme>;
|
||||||
Reference in New Issue
Block a user