Compare commits
105 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a588837605 | ||
|
|
cfc6d3c230 | ||
|
|
b6aa1fdf6d | ||
|
|
68bffa8944 | ||
|
|
f8e890e9a9 | ||
|
|
64eb0d4e15 | ||
|
|
d7a862e061 | ||
|
|
6a2c386b5d | ||
|
|
62e6dd44b9 | ||
|
|
05b31a4862 | ||
|
|
55305f31b7 | ||
|
|
1f86a063ef | ||
|
|
217885587e | ||
|
|
28f8933f72 | ||
|
|
5360ec3d24 | ||
|
|
6339a3aeda | ||
|
|
974d0e28a1 | ||
|
|
e9dab58a57 | ||
|
|
3aa72ea258 | ||
|
|
0b161cf53e | ||
|
|
590723b297 | ||
|
|
fd390238d9 | ||
|
|
bef1cff348 | ||
|
|
03389a04ba | ||
|
|
008a6f05a5 | ||
|
|
f0ae1a9205 | ||
|
|
af7da9c07f | ||
|
|
4106253b58 | ||
|
|
c787dce10c | ||
|
|
b265910b2a | ||
|
|
5e3f4c0f59 | ||
|
|
2fe07ebfad | ||
|
|
5b3b81551e | ||
|
|
21446b3bf3 | ||
|
|
fa195a79f5 | ||
|
|
f6a367c567 | ||
|
|
d3ffbca858 | ||
|
|
db4fc19c1a | ||
|
|
eefae0635a | ||
|
|
1d7c12ec60 | ||
|
|
4d7f94e292 | ||
|
|
e13810b16a | ||
|
|
d4be779cf1 | ||
|
|
3912262f4b | ||
|
|
ed753b71c1 | ||
|
|
5b78e8b075 | ||
|
|
71dd1de503 | ||
|
|
2a95f7750a | ||
|
|
6d3dcb503a | ||
|
|
57c6bbd96c | ||
|
|
3f18ad9c59 | ||
|
|
c09cdcc788 | ||
|
|
473ff8d774 | ||
|
|
4ec3f42a8b | ||
|
|
36a4d7415c | ||
|
|
df81964b86 | ||
|
|
bfa79fb06e | ||
|
|
52e2459d47 | ||
|
|
f14c376791 | ||
|
|
071fd8c7be | ||
|
|
fd93f3fd54 | ||
|
|
9035de79ce | ||
|
|
2304de45b1 | ||
|
|
f1007d325f | ||
|
|
44679dbef0 | ||
|
|
682c97b3e7 | ||
|
|
b65c3eeeaa | ||
|
|
883c019293 | ||
|
|
50c2e3a6ce | ||
|
|
b7082e2318 | ||
|
|
f30b1cbd09 | ||
|
|
8936479c78 | ||
|
|
f02b30c6b5 | ||
|
|
fd34f6bcf7 | ||
|
|
e9eb113c33 | ||
|
|
1caee4e19e | ||
|
|
e18188d2a8 | ||
|
|
682cf056b6 | ||
|
|
5d11889fb2 | ||
|
|
566780b5e2 | ||
|
|
2d025b9fde | ||
|
|
64e97b6593 | ||
|
|
a05daedc54 | ||
|
|
e5756abb4d | ||
|
|
bfd30ace70 | ||
|
|
5858bff825 | ||
|
|
99c1a127b4 | ||
|
|
70af2e2d07 | ||
|
|
7db145af7c | ||
|
|
dfe13dd6bd | ||
|
|
33596e4b61 | ||
|
|
ca9c1b025a | ||
|
|
ca5102cd77 | ||
|
|
cfe160f34d | ||
|
|
d0a7033bf4 | ||
|
|
415291b083 | ||
|
|
4208c3ecc5 | ||
|
|
76dbe27c5d | ||
|
|
cfbf1dd69b | ||
|
|
313b6e328e | ||
|
|
22532f3783 | ||
|
|
3ced32b235 | ||
|
|
300b1d5ea3 | ||
|
|
40df8c7104 | ||
|
|
43d2c114f4 |
18
.env
18
.env
@@ -1,2 +1,16 @@
|
||||
DB_USER=main
|
||||
DB_PASSWORD=hHMP8cd^N3SnzGRR
|
||||
# Environment variables declared in this file are automatically made available to Prisma.
|
||||
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
|
||||
|
||||
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
|
||||
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
|
||||
|
||||
POSTGRES_DB=main
|
||||
POSTGRES_HOST=localhost
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_USER=main
|
||||
POSTGRES_PASSWORD=hHMP8cd^N3SnzGRR
|
||||
|
||||
DB_CONTAINER_NAME=database
|
||||
|
||||
POSTGRES_DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
|
||||
POSTGRES_DATABASE_URL_EXTERNAL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_CONTAINER_NAME}:${POSTGRES_PORT}/${POSTGRES_DB}"
|
||||
16
Dockerfile
Normal file
16
Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
||||
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,7 +45,6 @@
|
||||
"soap": "^1.1.8",
|
||||
"sqids": "^0.3.0",
|
||||
"ssh2-sftp-client": "^12.0.0",
|
||||
"surrealdb": "^1.3.2",
|
||||
"svelte": "^3.59.2",
|
||||
"svelte-dialogs": "^1.2.2",
|
||||
"svelte-preprocess": "^5.1.4",
|
||||
@@ -1616,8 +1615,6 @@
|
||||
|
||||
"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=="],
|
||||
|
||||
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
|
||||
@@ -2460,8 +2457,6 @@
|
||||
|
||||
"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-dialogs": ["svelte-dialogs@1.2.2", "", { "peerDependencies": { "svelte": "^3.5.0" } }, "sha512-Pf25Xua2nDIIR4v45PNbn+yFrFLNc0ns9+sO8Ms77Hm/CdxFuXm01XO8Qkw8Ej66BvboX+kIJ3TCm8uwP/XmyQ=="],
|
||||
@@ -2622,8 +2617,6 @@
|
||||
|
||||
"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=="],
|
||||
|
||||
"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=="],
|
||||
@@ -2670,8 +2663,6 @@
|
||||
|
||||
"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=="],
|
||||
|
||||
"xpath": ["xpath@0.0.33", "", {}, "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA=="],
|
||||
|
||||
@@ -1,16 +1,8 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
surrealdb:
|
||||
database:
|
||||
build: ./
|
||||
env_file:
|
||||
- .env
|
||||
entrypoint:
|
||||
- /surreal
|
||||
- start
|
||||
- --user
|
||||
- $DB_USER
|
||||
- --pass
|
||||
- $DB_PASSWORD
|
||||
image: surrealdb/surrealdb:latest
|
||||
ports:
|
||||
- 8000:8000
|
||||
- 5432:5432
|
||||
@@ -59,7 +59,6 @@
|
||||
"soap": "^1.1.8",
|
||||
"sqids": "^0.3.0",
|
||||
"ssh2-sftp-client": "^12.0.0",
|
||||
"surrealdb": "^1.3.2",
|
||||
"svelte": "^3.59.2",
|
||||
"svelte-dialogs": "^1.2.2",
|
||||
"svelte-preprocess": "^5.1.4",
|
||||
|
||||
BIN
persistent/images/haken.png
Normal file
BIN
persistent/images/haken.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 256 B |
40586
public/images/dashboard/DatenblattHaken.svg
Normal file
40586
public/images/dashboard/DatenblattHaken.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 10 MiB |
40596
public/images/dashboard/DatenblattKreuz.svg
Normal file
40596
public/images/dashboard/DatenblattKreuz.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 10 MiB |
@@ -5,9 +5,6 @@ export const createCaller = createCallerFactory({
|
||||
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
|
||||
"postleitzahlen": await import("../src/pages/api/postleitzahlen.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/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"),
|
||||
"admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"),
|
||||
@@ -15,9 +12,12 @@ export const createCaller = createCallerFactory({
|
||||
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
|
||||
"admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"),
|
||||
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
|
||||
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
|
||||
"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"),
|
||||
"bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].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": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
||||
"bilder/[id]": await import("../src/pages/api/bilder/[id].ts"),
|
||||
|
||||
@@ -21,9 +21,15 @@
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let aufnahme: AufnahmeKomplettClient;
|
||||
export let rechnung: RechnungClient;
|
||||
export let rechnung: RechnungClient | null;
|
||||
export let objekt: Objekt;
|
||||
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 ausweisart = getAusweisartFromId(ausweis.id);
|
||||
@@ -218,6 +224,17 @@
|
||||
</ul>
|
||||
</div>
|
||||
<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">
|
||||
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||
Verbrauchsausweis Wohnen
|
||||
@@ -232,27 +249,15 @@
|
||||
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
|
||||
Bedarfsausweis Gewerbe
|
||||
{/if}
|
||||
|
||||
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
|
||||
(Beratung)
|
||||
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
|
||||
(Offline)
|
||||
{/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 class="badge badge-accent font-semibold text-black text-m">{objekt.adresse}</div>
|
||||
<div class="badge badge-accent font-semibold text-black text-m">
|
||||
{#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}
|
||||
Offline
|
||||
{/if}
|
||||
</div>
|
||||
<div class="mb-4 flex flex-row items-center gap-4">
|
||||
<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>
|
||||
@@ -261,17 +266,16 @@
|
||||
>{progress}%</span
|
||||
>
|
||||
</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}
|
||||
<div class="flex flex-col gap-2">
|
||||
<div class="flex flex-col mb-4">
|
||||
<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">
|
||||
<span>Energieverbrauch</span>
|
||||
<span class="font-bold text-base-content"
|
||||
@@ -284,14 +288,6 @@
|
||||
>{calculations?.co2EmissionenGesamt}Kg/A</span
|
||||
>
|
||||
</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">
|
||||
<span>Baujahr</span>
|
||||
<span
|
||||
@@ -309,17 +305,38 @@
|
||||
: "N/A"}</span
|
||||
>
|
||||
</div>
|
||||
<div class="flex flex-row justify-between">
|
||||
<span>ID</span>
|
||||
<span class="font-bold text-base-content"
|
||||
>{id}</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
{/await}
|
||||
|
||||
<div class="flex flex-row justify-end items-center gap-4 mt-4">
|
||||
{#if !ausweis.storniert && !ausweis.ausgestellt}
|
||||
|
||||
<div class="flex flex-row justify-start items-center mb-4">
|
||||
<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
|
||||
class="button text-sm"
|
||||
@@ -392,24 +409,237 @@
|
||||
<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>
|
||||
{/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">
|
||||
|
||||
<a
|
||||
class="p-2 rounded-lg hover:bg-gray-200"
|
||||
title="PDF Herunterladen"
|
||||
target="_blank"
|
||||
href="/pdf/ansichtsausweis?id={ausweis.id}"
|
||||
>
|
||||
<img src="/images/ausweis.webp" width="32" alt="Energieausweis">
|
||||
</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 class="text-lg font-semibold">{aufnahme.gebaeudetyp}
|
||||
{#if (aufnahme.einheiten > 0 && aufnahme.einheiten !== null)}
|
||||
mit {aufnahme.einheiten} Wohneinheiten
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<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} />
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -450,3 +680,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
|
||||
<style lang="postcss">
|
||||
|
||||
*{@apply font-sans
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -44,14 +44,119 @@
|
||||
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
|
||||
<a class="button-tab" href="/dashboard">
|
||||
<Reader width={22} height={22} />
|
||||
Vorgänge
|
||||
</a>
|
||||
<a class="button-tab" href="/dashboard">
|
||||
<Reader width={22} height={22} />
|
||||
Inbox
|
||||
Ausweise
|
||||
</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" />
|
||||
|
||||
<!--
|
||||
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"}
|
||||
<li>
|
||||
<details class="[&_.caret]:open:rotate-180" open>
|
||||
@@ -86,30 +191,8 @@
|
||||
</li>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="mt-10 flex flex-col gap-4 px-8">
|
||||
<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>
|
||||
|
||||
<div class="items-end bottom-4 right-4 z-50 mt-4">
|
||||
<div class="flex flex-row justify-end items-end">
|
||||
<a
|
||||
href="/dashboard/einstellungen"
|
||||
class="hover:bg-gray-200 p-3 rounded-lg"
|
||||
@@ -118,12 +201,6 @@
|
||||
</a>
|
||||
</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>
|
||||
|
||||
<style>
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
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;
|
||||
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null && ausweis.stromverbrauch_enthaelt_kuehlung === false) {
|
||||
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null && (ausweis.stromverbrauch_enthaelt_kuehlung === false || ausweis.stromverbrauch_enthaelt_kuehlung === null)) {
|
||||
|
||||
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.
|
||||
let leerstand = (aufnahme.leerstand || 0) / 100;
|
||||
|
||||
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
|
||||
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt && ausweis.anteil_warmwasser_1 !== 0) {
|
||||
if (aufnahme.solarsystem_warmwasser) {
|
||||
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
|
||||
energieVerbrauchWarmwasser_1 =
|
||||
|
||||
@@ -534,7 +534,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
);
|
||||
}
|
||||
|
||||
if (!ausweis.warmwasser_enthalten) {
|
||||
if (!ausweis.warmwasser_enthalten || ausweis.anteil_warmwasser_1 === 0) {
|
||||
/**
|
||||
* Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
|
||||
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, RechnungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
|
||||
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
||||
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
|
||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.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.
|
||||
* @param id Die Ausweis UID
|
||||
|
||||
@@ -151,34 +151,4 @@ export async function getRechnung(rechnung_id: string) {
|
||||
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,6 +281,24 @@ 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"]
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,255 +0,0 @@
|
||||
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 -->
|
||||
|
||||
<!-- <Bereich
|
||||
<Bereich
|
||||
bereich="C"
|
||||
title="Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen"
|
||||
><GebaeudeVolumen bind:ausweis /></Bereich
|
||||
> -->
|
||||
>
|
||||
|
||||
<!-- D - Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden -->
|
||||
|
||||
<!-- <Bereich
|
||||
<Bereich
|
||||
bereich="D"
|
||||
title="Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden"
|
||||
><Fensterflaechen bind:ausweis /></Bereich
|
||||
> -->
|
||||
>
|
||||
|
||||
<!-- E - Angabe zu Lüftung und Kühlung -->
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
>
|
||||
|
||||
<!-- F Angaben zur Heizungsanlage -->
|
||||
<Bereich bereich="D" title="Angaben zur Heizunganlage"
|
||||
<!-- <Bereich bereich="D" title="Angaben zur Heizunganlage"
|
||||
><SanierungszustandHeizungsanlage
|
||||
bind:images={bilder}
|
||||
bind:objekt
|
||||
@@ -200,7 +200,7 @@
|
||||
/></Bereich
|
||||
>
|
||||
|
||||
<Bereich bereich="E" title="Gebäudepläne & Unterlagen">
|
||||
<Bereich bereich="D" title="Gebäudepläne & Unterlagen">
|
||||
<div
|
||||
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 -->
|
||||
|
||||
<Bereich bereich="F" title="Angaben zu Fenster, Dachfenster und Türen"
|
||||
<Bereich bereich="E" title="Angaben zu Fenster, Dachfenster und Türen"
|
||||
><SanierungszustandFensterTueren
|
||||
bind:images={bilder}
|
||||
bind:objekt
|
||||
@@ -249,7 +249,7 @@
|
||||
>
|
||||
<!-- H Angaben zur Wärmedammung -->
|
||||
|
||||
<Bereich bereich="G" title="Angaben zur Wärmedämmung"
|
||||
<Bereich bereich="F" title="Angaben zur Wärmedämmung"
|
||||
><SanierungszustandWaermedammung
|
||||
bind:images={bilder}
|
||||
bind:objekt
|
||||
@@ -260,7 +260,7 @@
|
||||
|
||||
<!-- I Gebäudebild und Energieausweis PDF Vorschau -->
|
||||
|
||||
<Bereich bereich="H" title="Gebäudebild und Energieausweis PDF Vorschau"
|
||||
<Bereich bereich="G" title="Gebäudebild und Energieausweis PDF Vorschau"
|
||||
><AusweisPreviewContainer
|
||||
bind:images={bilder}
|
||||
bind:ausweis
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
<script lang="ts">
|
||||
import { AufnahmeKomplettClient, BenutzerClient } from "#components/Ausweis/types.js";
|
||||
import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte";
|
||||
import Carousel from "#components/Carousel.svelte";
|
||||
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
||||
import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte";
|
||||
import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte";
|
||||
import { Objekt } from "#lib/client/prisma.js";
|
||||
import { Aufnahme, BedarfsausweisWohnen, Bild, Objekt, Rechnung, Unterlage, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
|
||||
import mime from "mime"
|
||||
import { ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons";
|
||||
import { CaretRight, ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons";
|
||||
import CaretLeft from "radix-svelte-icons/src/lib/icons/CaretLeft.svelte";
|
||||
|
||||
export let user: BenutzerClient;
|
||||
export let aufnahme: AufnahmeKomplettClient;
|
||||
export let objekt: Objekt;
|
||||
export let ausweis: (VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen) & {
|
||||
rechnung: Rechnung,
|
||||
aufnahme: Aufnahme & {
|
||||
bilder: Bild[],
|
||||
unterlagen: Unterlage[],
|
||||
objekt: Objekt
|
||||
}
|
||||
};
|
||||
export let benutzer: BenutzerClient;
|
||||
export let page: number;
|
||||
export let totalPageCount: number;
|
||||
|
||||
|
||||
let dropdownOpen = false;
|
||||
@@ -22,42 +28,46 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<h1>{objekt.adresse}, {objekt.plz} {objekt.ort}</h1>
|
||||
<div class="justify-between items-center flex flex-row">
|
||||
<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>
|
||||
|
||||
<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="relative bg-gray-100 rounded-md flex justify-center items-center">
|
||||
{#if aufnahme.bilder.length > 0}
|
||||
<Carousel perPage={3}>
|
||||
{#each aufnahme.bilder as bild, i (i)}
|
||||
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[25vh] h-full w-full object-contain">
|
||||
{#if ausweis.aufnahme.bilder.length > 0}
|
||||
<Carousel perPage={4}>
|
||||
{#each ausweis.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">
|
||||
{/each}
|
||||
<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>
|
||||
</Carousel>
|
||||
{/if}
|
||||
</div>
|
||||
{#if aufnahme.unterlagen.length > 0}
|
||||
{#if ausweis.aufnahme.unterlagen.length > 0}
|
||||
<h3 class="font-semibold">Unterlagen</h3>
|
||||
<div class="grid grid-flow-col gap-4">
|
||||
{#each aufnahme.unterlagen as unterlage}
|
||||
{#each ausweis.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>
|
||||
{/each}
|
||||
</div>
|
||||
@@ -65,36 +75,38 @@
|
||||
|
||||
</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>
|
||||
/* TODO: Das kann auch als Tailwind Klasse gemacht werden */
|
||||
.button {
|
||||
padding: 0.5rem 1rem;
|
||||
font-size: 1rem;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
}
|
||||
</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>
|
||||
</style>
|
||||
@@ -71,36 +71,6 @@
|
||||
<Person size={22} />
|
||||
Profil
|
||||
</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>
|
||||
<div
|
||||
class="border border-base-300 w-full h-full rounded-lg bg-base-200 p-8"
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import Pagination from "#components/Pagination.svelte";
|
||||
import { Enums, Objekt } from "#lib/client/prisma.js";
|
||||
|
||||
|
||||
export let user: BenutzerClient;
|
||||
export let objekte: ObjektKomplettClient[];
|
||||
|
||||
@@ -20,7 +20,7 @@ import { BASE_URI } from "#lib/constants.js";
|
||||
import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js";
|
||||
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||
import { s3Client } from "#lib/s3.js";
|
||||
import { createInvoice, getLexOfficeRechnung } from "#lib/server/invoice.js";
|
||||
import { createInvoice, getLexOfficeRechnung, getLexOfficeVoucherNumber } from "#lib/server/invoice.js";
|
||||
import { tryCatch } from "#lib/tryCatch.js";
|
||||
import SFTPClient from 'ssh2-sftp-client';
|
||||
import {
|
||||
@@ -95,6 +95,7 @@ export const GET = defineApiRoute({
|
||||
});
|
||||
}
|
||||
|
||||
let voucherNumber: string = "";
|
||||
if (!rechnung.lex_office_id) {
|
||||
const [result, error] = await tryCatch(
|
||||
createInvoice(ausweis, rechnung)
|
||||
@@ -105,10 +106,13 @@ export const GET = defineApiRoute({
|
||||
code: "BAD_REQUEST",
|
||||
message:
|
||||
"Die Rechnung konnte bei LexOffice nicht angelegt werden..",
|
||||
cause: error
|
||||
});
|
||||
}
|
||||
|
||||
const { id, voucherNumber } = result;
|
||||
const { id, voucherNumber: lexOfficeVoucherNumber } = result;
|
||||
|
||||
voucherNumber = lexOfficeVoucherNumber;
|
||||
|
||||
await prisma.rechnung.update({
|
||||
where: {
|
||||
@@ -118,6 +122,8 @@ export const GET = defineApiRoute({
|
||||
lex_office_id: id,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
voucherNumber = await getLexOfficeVoucherNumber(rechnung)
|
||||
}
|
||||
|
||||
const pdfAusweis = await getAnsichtsausweis(
|
||||
@@ -282,7 +288,7 @@ export const GET = defineApiRoute({
|
||||
<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>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td>
|
||||
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.lex_office_id}</b></td>
|
||||
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${voucherNumber}</b></td>
|
||||
</table>
|
||||
<br>
|
||||
|
||||
|
||||
@@ -20,12 +20,11 @@ export const PATCH = defineApiRoute({
|
||||
|
||||
const aufnahme = await prisma.aufnahme.findUnique({
|
||||
where: {
|
||||
id,
|
||||
benutzer_id: user.id
|
||||
id
|
||||
}
|
||||
});
|
||||
|
||||
if (!aufnahme) {
|
||||
if (!aufnahme || (aufnahme.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Aufnahme mit dieser UID existiert nicht oder gehört nicht dem aktuellen Benutzer."
|
||||
|
||||
@@ -7,6 +7,7 @@ import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { TokenType } from "#lib/auth/types.js";
|
||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||
|
||||
|
||||
export const GET = defineApiRoute({
|
||||
meta: {
|
||||
description:
|
||||
|
||||
@@ -3,7 +3,7 @@ import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||
import { generatePrefixedId } from "#lib/db.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { prisma } from "#lib/server/prisma.js";
|
||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { BedarfsausweisGewerbeSchema } from "src/generated/zod/bedarfsausweisgewerbe.js";
|
||||
import { z } from "zod";
|
||||
@@ -31,13 +31,10 @@ export const PATCH = defineApiRoute({
|
||||
const objekt = await prisma.bedarfsausweisGewerbe.findUnique({
|
||||
where: {
|
||||
id: ctx.params.id,
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
if (!objekt) {
|
||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
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 { exclude } from "#lib/exclude.js";
|
||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { prisma } from "#lib/server/prisma.js";
|
||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
|
||||
import { z } from "zod";
|
||||
@@ -30,14 +30,11 @@ export const PATCH = defineApiRoute({
|
||||
async fetch(input, ctx, user) {
|
||||
const objekt = await prisma.bedarfsausweisWohnen.findUnique({
|
||||
where: {
|
||||
id: ctx.params.id,
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
id: ctx.params.id
|
||||
}
|
||||
})
|
||||
|
||||
if (!objekt) {
|
||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
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 { exclude } from "#lib/exclude.js";
|
||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { prisma } from "#lib/server/prisma.js";
|
||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { GEGNachweisGewerbeSchema } from "src/generated/zod/gegnachweisgewerbe.js";
|
||||
import { z } from "zod";
|
||||
@@ -30,14 +30,11 @@ export const PATCH = defineApiRoute({
|
||||
async fetch(input, ctx, user) {
|
||||
const objekt = await prisma.gEGNachweisGewerbe.findUnique({
|
||||
where: {
|
||||
id: ctx.params.id,
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
id: ctx.params.id
|
||||
}
|
||||
})
|
||||
|
||||
if (!objekt) {
|
||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
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 { exclude } from "#lib/exclude.js";
|
||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { prisma } from "#lib/server/prisma.js";
|
||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { GEGNachweisWohnenSchema } from "src/generated/zod/gegnachweiswohnen.js";
|
||||
import { z } from "zod";
|
||||
@@ -30,14 +30,11 @@ export const PATCH = defineApiRoute({
|
||||
async fetch(input, ctx, user) {
|
||||
const objekt = await prisma.gEGNachweisWohnen.findUnique({
|
||||
where: {
|
||||
id: ctx.params.id,
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
id: ctx.params.id
|
||||
}
|
||||
})
|
||||
|
||||
if (!objekt) {
|
||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||
|
||||
@@ -20,14 +20,11 @@ export const PATCH = defineApiRoute({
|
||||
async fetch(input, ctx, user) {
|
||||
const objekt = await prisma.objekt.findUnique({
|
||||
where: {
|
||||
id: ctx.params.id,
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
id: ctx.params.id
|
||||
}
|
||||
})
|
||||
|
||||
if (!objekt) {
|
||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Objekt konnte nicht gefunden werden."
|
||||
|
||||
@@ -27,14 +27,11 @@ export const PATCH = defineApiRoute({
|
||||
async fetch(input, ctx, user) {
|
||||
const objekt = await prisma.verbrauchsausweisGewerbe.findUnique({
|
||||
where: {
|
||||
id: ctx.params.id,
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
id: ctx.params.id
|
||||
}
|
||||
})
|
||||
|
||||
if (!objekt) {
|
||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||
|
||||
@@ -28,14 +28,11 @@ export const PATCH = defineApiRoute({
|
||||
async fetch(input, ctx, user) {
|
||||
const objekt = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||
where: {
|
||||
id: ctx.params.id,
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
id: ctx.params.id
|
||||
}
|
||||
})
|
||||
|
||||
if (!objekt) {
|
||||
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||
|
||||
@@ -39,31 +39,49 @@ const aufnahme = await prisma.aufnahme.findUnique({
|
||||
bilder: true,
|
||||
unterlagen: true,
|
||||
bedarfsausweise_wohnen: {
|
||||
orderBy: {
|
||||
updated_at: "desc"
|
||||
},
|
||||
include: {
|
||||
rechnung: true
|
||||
}
|
||||
},
|
||||
verbrauchsausweise_gewerbe: {
|
||||
orderBy: {
|
||||
updated_at: "desc"
|
||||
},
|
||||
include: {
|
||||
rechnung: true
|
||||
}
|
||||
},
|
||||
verbrauchsausweise_wohnen: {
|
||||
orderBy: {
|
||||
updated_at: "desc"
|
||||
},
|
||||
include: {
|
||||
rechnung: true
|
||||
}
|
||||
},
|
||||
bedarfsausweise_gewerbe: {
|
||||
orderBy: {
|
||||
updated_at: "desc"
|
||||
},
|
||||
include: {
|
||||
rechnung: true
|
||||
}
|
||||
},
|
||||
geg_nachweise_gewerbe: {
|
||||
orderBy: {
|
||||
updated_at: "desc"
|
||||
},
|
||||
include: {
|
||||
rechnung: true
|
||||
}
|
||||
},
|
||||
geg_nachweise_wohnen: {
|
||||
orderBy: {
|
||||
updated_at: "desc"
|
||||
},
|
||||
include: {
|
||||
rechnung: true
|
||||
}
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
---
|
||||
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,4 +2,5 @@
|
||||
return Astro.redirect("/dashboard/objekte/1", 301);
|
||||
---
|
||||
|
||||
|
||||
<script></script>
|
||||
@@ -1,168 +1,134 @@
|
||||
---
|
||||
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||
import { Enums, prisma } from "#lib/server/prisma";
|
||||
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
||||
import { getCurrentUser } from "#lib/server/user";
|
||||
import DashboardAufnahmeModule from "#modules/Dashboard/DashboardAufnahmeModule.svelte";
|
||||
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
|
||||
|
||||
const params = Astro.params;
|
||||
const page = Number(params.page)
|
||||
|
||||
const page = Number(params.page);
|
||||
|
||||
const id = Astro.url.searchParams.get("id") || undefined;
|
||||
|
||||
const user = await getCurrentUser(Astro)
|
||||
const user = await getCurrentUser(Astro);
|
||||
|
||||
if (!user) {
|
||||
return Astro.redirect("/auth/login")
|
||||
return Astro.redirect("/auth/login");
|
||||
}
|
||||
|
||||
const totalPages = await prisma.objekt.count({
|
||||
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
} : {}
|
||||
})
|
||||
|
||||
let objekte = []
|
||||
if (id) {
|
||||
objekte = await prisma.objekt.findMany({
|
||||
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||
benutzer: {
|
||||
id: user.id
|
||||
},
|
||||
} : {
|
||||
...(id ? {
|
||||
OR: [
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
verbrauchsausweise_gewerbe: {
|
||||
some: {
|
||||
id: {
|
||||
contains: id
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
verbrauchsausweise_wohnen: {
|
||||
some: {
|
||||
id: {
|
||||
contains: id
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
bedarfsausweise_wohnen: {
|
||||
some: {
|
||||
id: {
|
||||
contains: id
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
},]} : {})
|
||||
},
|
||||
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
|
||||
const totalPageCount = await prisma.aufnahme.count({
|
||||
where:
|
||||
user.rolle === Enums.BenutzerRolle.USER
|
||||
? {
|
||||
benutzer: {
|
||||
id: user.id,
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
take: 25,
|
||||
skip: (page - 1) * 25
|
||||
})
|
||||
: {},
|
||||
});
|
||||
|
||||
if (page < 1 || page > totalPageCount) {
|
||||
return Astro.redirect("/dashboard/objekte/1");
|
||||
}
|
||||
|
||||
let ausweis,
|
||||
result: { id: string; updated_at: Date }[] = [];
|
||||
// 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,
|
||||
aufnahme: {
|
||||
include: {
|
||||
bilder: true,
|
||||
unterlagen: true,
|
||||
objekt: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
} else {
|
||||
result =
|
||||
await prisma.$queryRaw`SELECT id, updated_at FROM "VerbrauchsausweisWohnen" WHERE benutzer_id = ${user.id} UNION ALL
|
||||
SELECT id, updated_at FROM "VerbrauchsausweisGewerbe" WHERE benutzer_id = ${user.id} UNION ALL
|
||||
SELECT id, updated_at FROM "BedarfsausweisWohnen" WHERE benutzer_id = ${user.id} UNION ALL
|
||||
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 {
|
||||
objekte = await prisma.objekt.findMany({
|
||||
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||
benutzer: {
|
||||
id: user.id
|
||||
if (id) {
|
||||
const adapter = getPrismaAusweisAdapter(id);
|
||||
ausweis = await adapter?.findUnique({
|
||||
where: {
|
||||
id,
|
||||
},
|
||||
} : {
|
||||
OR: [
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
verbrauchsausweise_gewerbe: {
|
||||
some: {
|
||||
ausgestellt: false,
|
||||
bestellt: true
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
include: {
|
||||
rechnung: true,
|
||||
aufnahme: {
|
||||
include: {
|
||||
bilder: true,
|
||||
unterlagen: true,
|
||||
objekt: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
verbrauchsausweise_wohnen: {
|
||||
some: {
|
||||
ausgestellt: false,
|
||||
bestellt: true
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
bedarfsausweise_wohnen: {
|
||||
some: {
|
||||
ausgestellt: false,
|
||||
bestellt: true
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}]
|
||||
},
|
||||
orderBy: {
|
||||
erstellungsdatum: "desc"
|
||||
},
|
||||
});
|
||||
} else {
|
||||
result =
|
||||
await prisma.$queryRaw`SELECT id, updated_at FROM "VerbrauchsausweisWohnen" UNION ALL
|
||||
SELECT id, updated_at FROM "VerbrauchsausweisGewerbe" UNION ALL
|
||||
SELECT id, updated_at FROM "BedarfsausweisWohnen" UNION ALL
|
||||
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) {
|
||||
const adapter = getPrismaAusweisAdapter(result[0].id);
|
||||
|
||||
ausweis = await adapter?.findUnique({
|
||||
where: {
|
||||
id: result[0].id,
|
||||
},
|
||||
include: {
|
||||
aufnahmen: {
|
||||
rechnung: true,
|
||||
aufnahme: {
|
||||
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
|
||||
}
|
||||
}
|
||||
objekt: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
take: 25,
|
||||
skip: (page - 1) * 25
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
if (!ausweis) {
|
||||
return Astro.redirect("/dashboard/objekte/1")
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
<UserLayout title="Objekte" {user}>
|
||||
<DashboardModule {user} {objekte} totalPages={Math.ceil(totalPages / 25)} page={page} {id} client:load />
|
||||
</UserLayout>
|
||||
<DashboardAufnahmeModule
|
||||
{ausweis}
|
||||
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(ausweis.aufnahme_id) as Aufnahme
|
||||
aufnahme = await getAufnahme(aufnahme_id) as Aufnahme
|
||||
|
||||
if (!aufnahme) {
|
||||
// Die Aufnahme existiert wohl nicht.
|
||||
|
||||
@@ -61,7 +61,7 @@ if (id) {
|
||||
);
|
||||
}
|
||||
|
||||
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
|
||||
aufnahme = await getAufnahme(aufnahme_id) as Aufnahme
|
||||
|
||||
if (!aufnahme) {
|
||||
// Die Aufnahme existiert wohl nicht.
|
||||
|
||||
@@ -60,7 +60,7 @@ if (id) {
|
||||
);
|
||||
}
|
||||
|
||||
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
|
||||
aufnahme = await getAufnahme(aufnahme_id) as Aufnahme
|
||||
|
||||
if (!aufnahme) {
|
||||
// Die Aufnahme existiert wohl nicht.
|
||||
|
||||
@@ -16,6 +16,7 @@ export const GET: APIRoute = async (Astro) => {
|
||||
return new Response(null, { status: 404 });
|
||||
}
|
||||
|
||||
|
||||
const ausweisart = getAusweisartFromId(ausweis_id)
|
||||
|
||||
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | null = null;
|
||||
|
||||
@@ -3,6 +3,7 @@ import Layout from "#layouts/Layout.astro";
|
||||
import { BASE_URI } from "#lib/constants";
|
||||
import { transport } from "#lib/mail";
|
||||
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
|
||||
import { Enums } from "#lib/server/prisma";
|
||||
import { getCurrentUser } from "#lib/server/user";
|
||||
|
||||
const user = await getCurrentUser(Astro)
|
||||
@@ -12,6 +13,11 @@ if (!user || !id) {
|
||||
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 || "")
|
||||
|
||||
if (!adapter) {
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
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';
|
||||
@@ -1,109 +0,0 @@
|
||||
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>>;
|
||||
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
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();
|
||||
@@ -1,10 +0,0 @@
|
||||
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>>;
|
||||
@@ -1,10 +0,0 @@
|
||||
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>;
|
||||
@@ -1,16 +0,0 @@
|
||||
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>>;
|
||||
@@ -1,10 +0,0 @@
|
||||
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>>;
|
||||
@@ -1,67 +0,0 @@
|
||||
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