API größtenteils umgezogen und Funktionen angepasst

This commit is contained in:
Moritz Utcke
2025-01-21 23:34:01 +07:00
parent de8c859826
commit 5d73f5f7c7
74 changed files with 1715 additions and 818 deletions

View File

@@ -1 +1 @@
{"openapi":"3.0.3","info":{"title":"Title","version":"1.0.0","description":""},"paths":{"[id]":{"patch":{"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}}}}},"index":{"post":{"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}}}}}}}
{"openapi":"3.0.3","info":{"title":"Title","version":"1.0.0","description":""},"paths":{"postleitzahlen":{"get":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"plz":{"type":"string","minLength":1,"maxLength":5},"limit":{"type":"integer","maximum":50,"minimum":1,"default":10}},"required":["plz"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"plz":{"type":"string","minLength":4,"maxLength":5},"stadt":{"type":"string"},"bundesland":{"type":"string"},"landkreis":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["plz","stadt","bundesland","landkreis","lat","lon"],"additionalProperties":false}}}}}}}},"index":{"post":{"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}}}}},"[id]":{"patch":{"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}}}}},"refresh-token":{"get":{"description":"Erstellt sowohl einen neuen Refresh Token als auch einen Access Token für den gegebenen Benutzer. Der Refresh Token kann später für die Erstellung neuer Access Token genutzt werden.","tags":["Benutzer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"passwort":{"type":"string","minLength":8,"maxLength":100}},"required":["email","passwort"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"uid":{"type":"string","format":"uuid"},"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"refreshTokenBase64":{"type":"string"},"accessTokenBase64":{"type":"string"},"exp":{"type":"number"}},"required":["uid","accessToken","refreshToken","refreshTokenBase64","accessTokenBase64","exp"],"additionalProperties":false}}}}}}},"self":{"get":{"description":"Gibt die Daten des momentan eingeloggten Benutzers zurück. Falls der Authorization Key invalid ist wird stattdessen null zurückgegeben.","tags":["Benutzer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"uid":{"type":"string"},"name":{"type":"string","nullable":true},"vorname":{"type":"string","nullable":true},"email":{"type":"string"},"profilbild":{"type":"string","nullable":true},"plz":{"type":"string","nullable":true},"ort":{"type":"string","nullable":true},"adresse":{"type":"string","nullable":true},"telefon":{"type":"string","nullable":true},"anrede":{"type":"string","nullable":true},"rolle":{"type":"string","enum":["USER","ADMIN"]}},"required":["uid","email","rolle"],"additionalProperties":false},{"enum":["null"],"nullable":true}]}}}}}}}}}

View File

@@ -30,7 +30,8 @@
"@pdfme/ui": "^5.2.16",
"@trpc/client": "^10.45.2",
"@trpc/server": "^10.45.2",
"astro": "^4.16.18",
"astro": "^4.16.17",
"astro-typesafe-api": "link:astro-typesafe-api",
"body-scroll-lock": "^4.0.0-beta.0",
"buffer": "^6.0.3",
"bun": "^1.1.45",
@@ -38,6 +39,7 @@
"express": "^4.21.2",
"flag-icons": "^6.15.0",
"fontkit": "^2.0.4",
"is-base64": "^1.1.0",
"js-cookie": "^3.0.5",
"js-interpolate": "^1.3.2",
"jsonwebtoken": "^9.0.2",
@@ -63,7 +65,9 @@
"@types/body-scroll-lock": "^3.1.2",
"@types/express": "^5.0.0",
"@types/fontkit": "^2.0.7",
"@types/is-base64": "^1.1.3",
"@types/js-cookie": "^3.0.6",
"@types/jsonwebtoken": "^9.0.7",
"@types/uuid": "^9.0.8",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
@@ -79,5 +83,8 @@
"postcss-nesting": "^13.0.1",
"prettier": "^2.8.8",
"typescript": "^4.9.5"
},
"overrides": {
"zod": "^3.24.1"
}
}

View File

@@ -1,16 +1,19 @@
import { createCallerFactory } from "astro-typesafe-api/server";
import { type AstroGlobal } from "astro";
export const createCaller = createCallerFactory({
"aufnahme/[id]": await import("../src/pages/api/aufnahme/[id].ts"),
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
"ticket": await import("../src/pages/api/ticket.ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"user/self": await import("../src/pages/api/user/self.ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"objekt/[id]": await import("../src/pages/api/objekt/[id].ts"),
"objekt": await import("../src/pages/api/objekt/index.ts"),
"user/self": await import("../src/pages/api/user/self.ts"),
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
"verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
"verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"),
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
"objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"),
"objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"),
})

View File

@@ -1,7 +1,9 @@
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME, API_UID_COOKIE_NAME } from "#lib/constants.js";
import { client } from "../../trpc.js";
import moment from "moment";
import jwt from "jsonwebtoken"
import { TokenData, TokenType } from "#lib/auth/token.js";
import { api } from "astro-typesafe-api/client";
export async function validateAccessTokenClient() {
@@ -9,10 +11,12 @@ export async function validateAccessTokenClient() {
const refreshToken = Cookies.get(API_REFRESH_TOKEN_COOKIE_NAME);
if (accessToken) {
const { valid } = await client.v1.benutzer.validateAccessToken.query({accessToken})
const { exp, typ, uid } = jwt.decode(accessToken, {
json: true
}) as TokenData
if (valid) {
return valid;
if (exp > Date.now() && typ === TokenType.Access) {
return true;
} else {
Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME);
}
@@ -33,7 +37,7 @@ export async function validateAccessTokenClient() {
// Wenn das klappt, dann haben wir auch einen neuen Access Token.
// Wenn das nicht klappt, dann müssen wir uns neu anmelden.
try {
const { accessToken: newAccessToken, accessTokenExpiry, refreshToken: newRefreshToken, refreshTokenExpiry } = await client.v1.benutzer.getAccessToken.query({
const { accessToken: newAccessToken, accessTokenExpiry, refreshToken: newRefreshToken, refreshTokenExpiry } = await api.auth["access-token"].GET.fetch({
refreshToken
})

View File

@@ -1,86 +1,116 @@
import {
BenutzerClient,
GebaeudeAufnahmeClient,
GebaeudeClient,
UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js";
import { api } from "astro-typesafe-api/client"
import { exclude } from "#lib/exclude.js";
import { client } from "src/trpc.js";
import { bilderHochladen } from "./bilderHochladen.js";
import { addNotification } from "@ibcornelsen/ui";
import { prisma } from "@ibcornelsen/database/server";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js";
// import { addNotification } from "@ibcornelsen/ui";
export async function verbrauchsausweisWohnenSpeichern(
ausweis: VerbrauchsausweisWohnenClient,
gebaeude: GebaeudeClient,
gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient,
objekt: ObjektClient,
aufnahme: AufnahmeClient,
images: (UploadedGebaeudeBild & { base64?: string })[],
user: BenutzerClient
) {
if (ausweis.uid) {
// Anscheinend wurde der Ausweis bereits erstellt und hat eine UID.
// Jetzt müssen wir ihn nun nur noch abspeichern.
try {
await client.v1.objekt.speichern.mutate()
if (objekt.uid) {
await api.objekt._uid.PATCH.fetch({
...exclude(objekt, ["uid"])
}, {
params: {
uid: objekt.uid
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { uid } = await api.objekt.PUT.fetch({
...exclude(objekt, ["uid"])
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
await client.v1.verbrauchsausweisWohnen[2016].speichern.mutate({
...ausweis,
gebaeude_aufnahme_allgemein: {
...exclude(
gebaeude_aufnahme_allgemein,
["erstellungsdatum", "events", "ausstellungsdatum", "rechnungen"]
),
gebaeude_stammdaten: {
...exclude(gebaeude, [
"gebaeude_bilder",
]),
},
},
});
images = await bilderHochladen(images, gebaeude.uid);
return { uid: ausweis.uid, gebaeude_uid: gebaeude.uid, gebaeude_aufnahme_uid: gebaeude_aufnahme_allgemein.uid };
} catch (e) {
}
} else {
// Wir speichern den Ausweis ab und leiten auf die "ausweis-gespeichert" Seite weiter.
try {
const response =
await client.v1.verbrauchsausweisWohnen[2016].erstellen.mutate({
...ausweis,
gebaeude_aufnahme_allgemein: {
...gebaeude_aufnahme_allgemein,
gebaeude_stammdaten: {
...gebaeude,
},
},
});
images = await bilderHochladen(images, response.gebaeude_uid);
return response;
} catch (e: any) {
await client.v1.tickets.erstellen.mutate({
titel: "Ausweis konnte nicht gespeichert werden",
beschreibung: e.stack,
email: user.email ?? "",
metadata: JSON.stringify({
ausweis,
}),
});
}
objekt.uid = uid;
}
addNotification({
dismissable: false,
message:
"Ausweis konnte nicht gespeichert werden, bitte versuchen sie es erneut.",
subtext:
"Sollte das Problem weiterhin bestehen, kontaktieren sie bitte den Support.",
timeout: 6000,
type: "error",
});
if (aufnahme.uid) {
await api.aufnahme._uid.PATCH.fetch({
...exclude(aufnahme, ["uid"])
}, {
params: {
uid: aufnahme.uid
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { uid } = await api.aufnahme.PUT.fetch({
aufnahme,
uid_objekt: objekt.uid
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
aufnahme.uid = uid
}
if (ausweis.uid) {
await api["verbrauchsausweis-wohnen"]._uid.PATCH.fetch({
...exclude(ausweis, ["uid"])
}, {
params: {
uid: ausweis.uid
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
await api["verbrauchsausweis-wohnen"].PUT.fetch({
ausweis,
uid_aufnahme: aufnahme.uid
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
}
return {
uid_ausweis: ausweis.uid,
uid_aufnahme: aufnahme.uid,
uid_objekt: objekt.uid
}
// await client.v1.tickets.erstellen.mutate({
// titel: "Ausweis konnte nicht gespeichert werden",
// beschreibung: e.stack,
// email: user.email ?? "",
// metadata: JSON.stringify({
// ausweis,
// }),
// });
// addNotification({
// dismissable: false,
// message:
// "Ausweis konnte nicht gespeichert werden, bitte versuchen sie es erneut.",
// subtext:
// "Sollte das Problem weiterhin bestehen, kontaktieren sie bitte den Support.",
// timeout: 6000,
// type: "error",
// });
return null;
}

View File

@@ -1,8 +1,8 @@
<script lang="ts">
import AnsichtsausweisButton from "#components/AnsichtsausweisButton.svelte";
import DatenblattButton from "#components/DatenblattButton.svelte";
import HelpLabel from "#labels/HelpLabel.svelte";
import Inputlabel from "#labels/InputLabel.svelte";
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import ImageGrid from "#components/ImageGrid.svelte";
import {
Enums,

View File

@@ -1,6 +1,4 @@
<script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
@@ -18,15 +16,14 @@
VerbrauchsausweisWohnenClient,
} from "./types.js";
export let gebaeude: GebaeudeClient;
export let objekt: GebaeudeClient;
export let ausweis:
| VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnenClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: GebaeudeAufnahmeClient;
export let Energieausweis;
console.log('HALLO:'+Energieausweis);
export let ausweisart: Enums.Ausweisart;
</script>
<div id="ausweisart" class="bereich-box grid
@@ -70,11 +67,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
name="gebaeudetyp"
data-test="gebaeudetyp"
required
bind:value={gebaeude_aufnahme_allgemein.gebaeudetyp}
bind:value={aufnahme.gebaeudetyp}
>
<option disabled selected value={false}>Bitte auswählen</option>
{#if Energieausweis=="Verbrauchsausweis Wohngebäude"}
{#if ausweisart=="VerbrauchsausweisWohnen"}
<option value="Einfamilienhaus">Einfamilienhaus</option>
<option value="Freistehendes Einfamilienhaus">Freistehendes Einfamilienhaus</option>
<option value="Freistehendes Zweifamilienhaus">Freistehendes Zweifamilienhaus</option>
@@ -86,7 +83,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<option value="Atrium-Bungalow">Atrium-Bungalow</option>
<option value="Winkelbungalow">Winkelbungalow</option>
{:else if Energieausweis=="Verbrauchsausweis Gewerbe"}
{:else if ausweisart=="VerbrauchsausweisGewerbe"}
<option value="Verwaltungsgebäude (allgemein)">Verwaltungsgebäude (allgemein)</option>
<option value="Parlaments- und Gerichtsgebäude">Parlaments- und Gerichtsgebäude</option>
<option value="Ministerien u. Ämter u. Behörden">Ministerien u. Ämter u. Behörden</option>
@@ -162,7 +159,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
autocomplete="off"
data-msg="Pflichtfeld"
maxlength="3"
bind:value={gebaeude_aufnahme_allgemein.einheiten}
bind:value={aufnahme.einheiten}
/>
<div class="help-label">
@@ -181,7 +178,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
name="saniert"
required
bind:value={gebaeude_aufnahme_allgemein.saniert}
bind:value={aufnahme.saniert}
>
<option disabled selected>Bitte auswählen</option>
<option value={true}>saniert</option>
@@ -221,10 +218,10 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
onFocusOut={() => {
deleteNotification("GEBAEUDE_BAUJAHR");
}}
className={auditHeizungGebaeudeBaujahr(gebaeude_aufnahme_allgemein)
className={auditHeizungGebaeudeBaujahr(aufnahme)
? "linked"
: ""}
bind:tags={gebaeude_aufnahme_allgemein.baujahr_gebaeude}
bind:tags={aufnahme.baujahr_gebaeude}
/>
<div class="help-label">
@@ -259,10 +256,10 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
onFocusOut={() => {
deleteNotification("HEIZUNG_BAUJAHR");
}}
className={auditHeizungGebaeudeBaujahr(gebaeude_aufnahme_allgemein)
className={auditHeizungGebaeudeBaujahr(aufnahme)
? "linked"
: ""}
bind:tags={gebaeude_aufnahme_allgemein.baujahr_heizung}
bind:tags={aufnahme.baujahr_heizung}
/>
<div class="help-label">

View File

@@ -19,7 +19,7 @@
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: GebaeudeAufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient;
export let images: UploadedGebaeudeBild[];
</script>
@@ -37,18 +37,18 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
">
<SanierungsOption label="Zentral/Etage" name="zentralheizung" help="Bitte anklicken wenn die Heizwärme <b>zentral erzeugt</b> und von dort in die Räume verteilt wird. Gasthermen und Etagenheizungen in der Wohnung gehören auch dazu." value="ZH" bind:checked={gebaeude_aufnahme_allgemein.zentralheizung}></SanierungsOption>
<SanierungsOption label="Einzelofen" name="einzelofen" help="Bei <b>dezentraler Erzeugung</b> in den Räumen wie z.B. Nachtspeicher, Kami- oder Kachelofen. Dezentrale Klimageräte zur Wärmeerzeugung gehören auch dazu." value="EO" bind:checked={gebaeude_aufnahme_allgemein.einzelofen}></SanierungsOption>
<SanierungsOption label="Durchlauferhitzer (elektrisch)" name="durchlauf_erhitzer" help="Wenn <b>dezentrale</b> elektrische <b>Warmwassererzeugung</b> vorhanden ist" value="DH" bind:checked={gebaeude_aufnahme_allgemein.durchlauf_erhitzer}></SanierungsOption>
<SanierungsOption label="Standardkessel" name="standard_kessel" help="Gemeint sind Konstanttemperaturkessel und ältere Gebläse- oder Feststoffkessel" value="SK" bind:checked={gebaeude_aufnahme_allgemein.standard_kessel}></SanierungsOption>
<SanierungsOption label="Solarsystem für Warmwasser" name="solarsystem_warmwasser" help="Solarpanele auf dem Dach zur <b>alternativen Warmwassererzeugung</b> aus Sonnenenergie. Nicht zu verwechseln mit Photovoltaik." value="SSWW" bind:checked={gebaeude_aufnahme_allgemein.solarsystem_warmwasser}></SanierungsOption>
<SanierungsOption label="Wärmepumpe" name="waermepumpe" help="Elektrisch betriebener Wärmerzeuger der thermische Energie aus natürlichen Wärmequellen wie der <b>Umgebungsluft, dem Erdreich oder Grundwasser</b> nutzbar macht." value="WP" bind:checked={gebaeude_aufnahme_allgemein.waermepumpe}></SanierungsOption>
<SanierungsOption label="Niedertemperaturkessel" name="niedertemperatur_kessel" help="Heizkessel der mit <b>niedrigen Vorlauftemperaturen</b> (35-75 °C) arbeitet. Im Vergleich zum Brennwertkessel ist er weniger effizient, wird aber noch in älteren Heizsystemen eingesetzt." value="NK" bind:checked={gebaeude_aufnahme_allgemein.niedertemperatur_kessel}></SanierungsOption>
<SanierungsOption label="Brennwertkessel" name="brennwert_kessel" help="Hat einen besonders <b>hohen Wirkungsgrad</b> weil er die im Abgas enthaltene Kondensationswärme zurückgewinnt. Auch zu erkennen am doppelwandigem Abgasrohr welches sich nicht erhitzt." value="BWK" bind:checked={gebaeude_aufnahme_allgemein.brennwert_kessel}></SanierungsOption>
<SanierungsOption label="Warmwasserrohre gedämmt" name="warmwasser_rohre_gedaemmt" help="Gemeint sind die sichtbaren Rohre des Verteilsystems Warmwasser. Gedämmte Rohre sind an den <b>dunklen Ummantelungen</b> (Manschetten) zu erkennen." value="BWK" bind:checked={gebaeude_aufnahme_allgemein.warmwasser_rohre_gedaemmt}></SanierungsOption>
<SanierungsOption label="Heizungsrohre gedämmt" name="heizungsrohre_gedaemmt" help="Gemeint sind die sichtbaren Rohre des Verteilsystems Heizung. Gedämmte Rohre sind an den <b>dunklen Ummantelungen</b> (Manschetten) zu erkennen.ext" value="HRGD" bind:checked={gebaeude_aufnahme_allgemein.heizungsrohre_gedaemmt}></SanierungsOption>
<SanierungsOption label="Zirkulation" name="zirkulation" help="Kreislauf von Heizungs- oder Warmwasser <b>innerhalb eines Leitungssystems</b>, um eine gleichmäßige Wärmeverteilung sicherzustellen." value="ZK" bind:checked={gebaeude_aufnahme_allgemein.zirkulation}></SanierungsOption>
<SanierungsOption label="Photovoltaik auf dem Dach" name="photovoltaik" help="Direkte Umwandlung von Sonnenlicht in <b>elektrische Energie</b> mittels Solarzellen, die den photoelektrischen Effekt nutzen." value="PV" bind:checked={gebaeude_aufnahme_allgemein.photovotaik}></SanierungsOption>
<SanierungsOption label="Zentral/Etage" name="zentralheizung" help="Bitte anklicken wenn die Heizwärme <b>zentral erzeugt</b> und von dort in die Räume verteilt wird. Gasthermen und Etagenheizungen in der Wohnung gehören auch dazu." value="ZH" bind:checked={aufnahme.zentralheizung}></SanierungsOption>
<SanierungsOption label="Einzelofen" name="einzelofen" help="Bei <b>dezentraler Erzeugung</b> in den Räumen wie z.B. Nachtspeicher, Kami- oder Kachelofen. Dezentrale Klimageräte zur Wärmeerzeugung gehören auch dazu." value="EO" bind:checked={aufnahme.einzelofen}></SanierungsOption>
<SanierungsOption label="Durchlauferhitzer (elektrisch)" name="durchlauf_erhitzer" help="Wenn <b>dezentrale</b> elektrische <b>Warmwassererzeugung</b> vorhanden ist" value="DH" bind:checked={aufnahme.durchlauf_erhitzer}></SanierungsOption>
<SanierungsOption label="Standardkessel" name="standard_kessel" help="Gemeint sind Konstanttemperaturkessel und ältere Gebläse- oder Feststoffkessel" value="SK" bind:checked={aufnahme.standard_kessel}></SanierungsOption>
<SanierungsOption label="Solarsystem für Warmwasser" name="solarsystem_warmwasser" help="Solarpanele auf dem Dach zur <b>alternativen Warmwassererzeugung</b> aus Sonnenenergie. Nicht zu verwechseln mit Photovoltaik." value="SSWW" bind:checked={aufnahme.solarsystem_warmwasser}></SanierungsOption>
<SanierungsOption label="Wärmepumpe" name="waermepumpe" help="Elektrisch betriebener Wärmerzeuger der thermische Energie aus natürlichen Wärmequellen wie der <b>Umgebungsluft, dem Erdreich oder Grundwasser</b> nutzbar macht." value="WP" bind:checked={aufnahme.waermepumpe}></SanierungsOption>
<SanierungsOption label="Niedertemperaturkessel" name="niedertemperatur_kessel" help="Heizkessel der mit <b>niedrigen Vorlauftemperaturen</b> (35-75 °C) arbeitet. Im Vergleich zum Brennwertkessel ist er weniger effizient, wird aber noch in älteren Heizsystemen eingesetzt." value="NK" bind:checked={aufnahme.niedertemperatur_kessel}></SanierungsOption>
<SanierungsOption label="Brennwertkessel" name="brennwert_kessel" help="Hat einen besonders <b>hohen Wirkungsgrad</b> weil er die im Abgas enthaltene Kondensationswärme zurückgewinnt. Auch zu erkennen am doppelwandigem Abgasrohr welches sich nicht erhitzt." value="BWK" bind:checked={aufnahme.brennwert_kessel}></SanierungsOption>
<SanierungsOption label="Warmwasserrohre gedämmt" name="warmwasser_rohre_gedaemmt" help="Gemeint sind die sichtbaren Rohre des Verteilsystems Warmwasser. Gedämmte Rohre sind an den <b>dunklen Ummantelungen</b> (Manschetten) zu erkennen." value="BWK" bind:checked={aufnahme.warmwasser_rohre_gedaemmt}></SanierungsOption>
<SanierungsOption label="Heizungsrohre gedämmt" name="heizungsrohre_gedaemmt" help="Gemeint sind die sichtbaren Rohre des Verteilsystems Heizung. Gedämmte Rohre sind an den <b>dunklen Ummantelungen</b> (Manschetten) zu erkennen.ext" value="HRGD" bind:checked={aufnahme.heizungsrohre_gedaemmt}></SanierungsOption>
<SanierungsOption label="Zirkulation" name="zirkulation" help="Kreislauf von Heizungs- oder Warmwasser <b>innerhalb eines Leitungssystems</b>, um eine gleichmäßige Wärmeverteilung sicherzustellen." value="ZK" bind:checked={aufnahme.zirkulation}></SanierungsOption>
<SanierungsOption label="Photovoltaik auf dem Dach" name="photovoltaik" help="Direkte Umwandlung von Sonnenlicht in <b>elektrische Energie</b> mittels Solarzellen, die den photoelektrischen Effekt nutzen." value="PV" bind:checked={aufnahme.photovotaik}></SanierungsOption>
</div>
@@ -86,7 +86,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="einfach_verglasung"
bind:checked={gebaeude_aufnahme_allgemein.einfach_verglasung}
bind:checked={aufnahme.einfach_verglasung}
value="EG"
/>Einfachglas</label
>
@@ -97,7 +97,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="doppel_verglasung"
bind:checked={gebaeude_aufnahme_allgemein.doppel_verglasung}
bind:checked={aufnahme.doppel_verglasung}
value="DF"
/>Doppelverglasung</label
>
@@ -108,7 +108,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="isolier_verglasung"
bind:checked={gebaeude_aufnahme_allgemein.isolier_verglasung}
bind:checked={aufnahme.isolier_verglasung}
value="IVG"
/>Isolierverglasung</label
>
@@ -119,7 +119,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="dreifach_verglasung"
bind:checked={gebaeude_aufnahme_allgemein.dreifach_verglasung}
bind:checked={aufnahme.dreifach_verglasung}
value="PHF"
/>Dreifachverglasung</label
>
@@ -130,7 +130,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="fenster_dicht"
bind:checked={gebaeude_aufnahme_allgemein.fenster_dicht}
bind:checked={aufnahme.fenster_dicht}
value="FD"
/>Alle Fenster dicht</label
>
@@ -141,7 +141,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="fenster_teilweise_undicht"
bind:checked={gebaeude_aufnahme_allgemein.fenster_teilweise_undicht}
bind:checked={aufnahme.fenster_teilweise_undicht}
value="FTUD"
/>Fenster teilweise undicht</label
>
@@ -152,7 +152,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="tueren_dicht"
bind:checked={gebaeude_aufnahme_allgemein.tueren_dicht}
bind:checked={aufnahme.tueren_dicht}
value="TD"
/>Alle Türen dicht</label
>
@@ -163,7 +163,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="tueren_undicht"
bind:checked={gebaeude_aufnahme_allgemein.tueren_undicht}
bind:checked={aufnahme.tueren_undicht}
value="TUD"
/>Türen teilweise undicht</label
>
@@ -174,7 +174,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="rolllaeden_kaesten_gedaemmt"
bind:checked={gebaeude_aufnahme_allgemein.rolllaeden_kaesten_gedaemmt}
bind:checked={aufnahme.rolllaeden_kaesten_gedaemmt}
value="RKD"
/>Rollladenkästen gedämmt, luftdicht</label
>
@@ -207,7 +207,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="aussenwand_gedaemmt"
bind:checked={gebaeude_aufnahme_allgemein.aussenwand_gedaemmt}
bind:checked={aufnahme.aussenwand_gedaemmt}
value="AWD"
/>Außenwand gedämmt</label
>
@@ -218,7 +218,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="keller_wand_gedaemmt"
bind:checked={gebaeude_aufnahme_allgemein.keller_wand_gedaemmt}
bind:checked={aufnahme.keller_wand_gedaemmt}
value="KWD"
/>Kelleraußenwand gedämmt</label
>
@@ -229,7 +229,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="keller_decke_gedaemmt"
bind:checked={gebaeude_aufnahme_allgemein.keller_decke_gedaemmt}
bind:checked={aufnahme.keller_decke_gedaemmt}
value="KDD"
/>Kellerdecke gedämmt</label
>
@@ -240,7 +240,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="dachgeschoss_gedaemmt"
bind:checked={gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt}
bind:checked={aufnahme.dachgeschoss_gedaemmt}
value="DGD"
/>Dachgeschoss gedämmt</label
>
@@ -251,7 +251,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="oberste_geschossdecke_gedaemmt"
bind:checked={gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt}
bind:checked={aufnahme.oberste_geschossdecke_gedaemmt}
value="OGDDW"
/>Oberste Geschossdecke gedämmt</label
>
@@ -262,7 +262,7 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
type="checkbox"
class="checkbox"
name="oberste_geschossdecke_min_12cm_gedaemmt"
bind:checked={gebaeude_aufnahme_allgemein.oberste_geschossdecke_min_12cm_gedaemmt}
bind:checked={aufnahme.oberste_geschossdecke_min_12cm_gedaemmt}
value="OGDD"
/>Oberste Geschossdecke min. 12cm gedämmt</label
>

View File

@@ -6,7 +6,7 @@
export let images;
export let user;
export let gebaeude;
export let gebaeude_aufnahme_allgemein;
export let aufnahme;
export let spaeterWeitermachen;
@@ -29,7 +29,7 @@
bind:images
bind:user
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
></AusweisWeiter>
</div>

View File

@@ -6,7 +6,7 @@
export let images;
export let user;
export let gebaeude;
export let gebaeude_aufnahme_allgemein;
export let aufnahme;
export let spaeterWeitermachen;

View File

@@ -6,7 +6,7 @@
import ZipSearch from "#components/PlzSuche.svelte";
import { Enums } from "@ibcornelsen/database/client"
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: GebaeudeAufnahmeClient;
</script>
@@ -29,7 +29,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required
data-msg-minlength="min. 5 Zeichen"
data-msg-maxlength="max. 40 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.adresse}
bind:value={aufnahme.adresse}
/>
<div class="help-label">
@@ -47,8 +47,8 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<Inputlabel title="PLZ *"></Inputlabel>
<ZipSearch
bind:zip={gebaeude_aufnahme_allgemein.plz}
bind:city={gebaeude_aufnahme_allgemein.ort}
bind:zip={aufnahme.plz}
bind:city={aufnahme.ort}
name="plz"
/>
@@ -61,7 +61,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
name="ort"
data-test="ort"
readonly={true}
bind:value={gebaeude_aufnahme_allgemein.ort}
bind:value={aufnahme.ort}
type="text"
/>
@@ -89,7 +89,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.flaeche}
bind:value={aufnahme.flaeche}
/>
<div class="help-label">
@@ -110,7 +110,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
name="dachgeschoss"
data-test="dachgeschoss"
bind:value={gebaeude_aufnahme_allgemein.dachgeschoss}
bind:value={aufnahme.dachgeschoss}
required
>
<option disabled selected value={false}>Bitte auswählen</option>
@@ -136,7 +136,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
name="keller"
data-test="keller"
required
bind:value={gebaeude_aufnahme_allgemein.keller}
bind:value={aufnahme.keller}
>
<option disabled selected value={false}>Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}>nicht vorhanden</option>
@@ -168,7 +168,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.nutzflaeche}
bind:value={aufnahme.nutzflaeche}
/>
<div class="help-label">

View File

@@ -3,7 +3,7 @@
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: GebaeudeAufnahmeClient;
</script>
@@ -25,7 +25,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
name="gebaeudeteil"
data-test="gebaeudeteil"
bind:value={gebaeude_aufnahme_allgemein.gebaeudeteil}
bind:value={aufnahme.gebaeudeteil}
required
>
<option disabled selected value={false}>Bitte auswählen</option>
@@ -53,7 +53,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
data-test="leerstand"
maxlength="2"
type="number"
bind:value={gebaeude_aufnahme_allgemein.leerstand}
bind:value={aufnahme.leerstand}
/>
<div class="help-label">
@@ -76,7 +76,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
name="lueftung"
data-test="lueftung"
required
bind:value={gebaeude_aufnahme_allgemein.lueftung}
bind:value={aufnahme.lueftung}
>
<option disabled selected value={false}>Bitte auswählen</option>
<option value="Fensterlüftung">Fensterlüftung</option>
@@ -109,7 +109,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
name="kuehlung"
data-test="kuehlung"
required
bind:value={gebaeude_aufnahme_allgemein.kuehlung}
bind:value={aufnahme.kuehlung}
>
<option disabled selected value={false}>Bitte auswählen</option>
<option value="1">vorhanden</option>

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import ThickArrowDown from "radix-svelte-icons/src/lib/icons/ThickArrowDown.svelte";
import {
BedarfsausweisWohnenClient,
@@ -7,12 +7,12 @@
GebaeudeClient,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types";
} from "./types.js";
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
export let ausweis: VerbrauchsausweisWohnenClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let gebaeude: GebaeudeClient;
export let aufnahme: GebaeudeAufnahmeClient;
export let objekt: GebaeudeClient;
let maxPerformance = 250;
@@ -56,14 +56,12 @@
(async () => {
const result = await endEnergieVerbrauchVerbrauchsausweis_2016({
...ausweis,
gebaeude_aufnahme_allgemein: {
...gebaeude_aufnahme_allgemein,
gebaeude_stammdaten: gebaeude,
aufnahme: {
...aufnahme,
objekt: objekt,
},
});
console.log(result, ausweis);
if (!result) {
return;
}

View File

@@ -16,7 +16,7 @@
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"
export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: GebaeudeAufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient
export let images: UploadedGebaeudeBild[];
@@ -32,15 +32,15 @@
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
">
<SanierungsOption label="Einfachglas" name="einfach_verglasung" help="" value="EG" bind:checked={gebaeude_aufnahme_allgemein.einfach_verglasung}></SanierungsOption>
<SanierungsOption label="Doppelverglasung" name="doppel_verglasung" help="" value="DF" bind:checked={gebaeude_aufnahme_allgemein.doppel_verglasung}></SanierungsOption>
<SanierungsOption label="Dreifachverglasung" name="dreifach_verglasung" help="" value="PHF" bind:checked={gebaeude_aufnahme_allgemein.dreifach_verglasung}></SanierungsOption>
<SanierungsOption label="Isolierverglasung" name="isolier_verglasung" help="" value="IVG" bind:checked={gebaeude_aufnahme_allgemein.isolier_verglasung}></SanierungsOption>
<SanierungsOption label="Alle Fenster dicht" name="fenster_dicht" help="" value="FD" bind:checked={gebaeude_aufnahme_allgemein.fenster_dicht}></SanierungsOption>
<SanierungsOption label="Fenster teilweise undicht" name="fenster_teilweise_undicht" help="" value="FTUD" bind:checked={gebaeude_aufnahme_allgemein.fenster_teilweise_undicht}></SanierungsOption>
<SanierungsOption label="Rollladenkästen gedämmt, luftdicht" name="rolllaeden_kaesten_gedaemmt" help="" value="TUD" bind:checked={gebaeude_aufnahme_allgemein.rolllaeden_kaesten_gedaemmt}></SanierungsOption>
<SanierungsOption label="Alle Türen dicht" name="tueren_dicht" help="" value="TD" bind:checked={gebaeude_aufnahme_allgemein.tueren_dicht}></SanierungsOption>
<SanierungsOption label="Einfachglas" name="einfach_verglasung" help="" value="EG" bind:checked={aufnahme.einfach_verglasung}></SanierungsOption>
<SanierungsOption label="Doppelverglasung" name="doppel_verglasung" help="" value="DF" bind:checked={aufnahme.doppel_verglasung}></SanierungsOption>
<SanierungsOption label="Dreifachverglasung" name="dreifach_verglasung" help="" value="PHF" bind:checked={aufnahme.dreifach_verglasung}></SanierungsOption>
<SanierungsOption label="Isolierverglasung" name="isolier_verglasung" help="" value="IVG" bind:checked={aufnahme.isolier_verglasung}></SanierungsOption>
<SanierungsOption label="Alle Fenster dicht" name="fenster_dicht" help="" value="FD" bind:checked={aufnahme.fenster_dicht}></SanierungsOption>
<SanierungsOption label="Fenster teilweise undicht" name="fenster_teilweise_undicht" help="" value="FTUD" bind:checked={aufnahme.fenster_teilweise_undicht}></SanierungsOption>
<SanierungsOption label="Rollladenkästen gedämmt, luftdicht" name="rolllaeden_kaesten_gedaemmt" help="" value="TUD" bind:checked={aufnahme.rolllaeden_kaesten_gedaemmt}></SanierungsOption>
<SanierungsOption label="Alle Türen dicht" name="tueren_dicht" help="" value="TD" bind:checked={aufnahme.tueren_dicht}></SanierungsOption>
<SanierungsOption label="Türen teilweise undicht" name="tueren_undicht" help="" value="TUD" bind:checked={aufnahme.tueren_undicht}></SanierungsOption>
</div>
@@ -84,7 +84,7 @@
><input
type="checkbox"
class="checkbox"
name="aussenwand_gedaemmt"
name="aussenwand_gedaemmt"
bind:checked={aufnahme.aussenwand_gedaemmt}
value="AWD"
/>Außenwand gedämmt</label
@@ -95,7 +95,7 @@
><input
type="checkbox"
class="checkbox"
name="keller_wand_gedaemmt"
name="keller_wand_gedaemmt"
bind:checked={aufnahme.keller_wand_gedaemmt}
value="KWD"
/>Kelleraußenwand gedämmt</label
@@ -106,7 +106,7 @@
><input
type="checkbox"
class="checkbox"
name="keller_decke_gedaemmt"
name="keller_decke_gedaemmt"
bind:checked={aufnahme.keller_decke_gedaemmt}
value="KDD"
/>Kellerdecke gedämmt</label
@@ -117,7 +117,7 @@
><input
type="checkbox"
class="checkbox"
name="dachgeschoss_gedaemmt"
name="dachgeschoss_gedaemmt"
bind:checked={aufnahme.dachgeschoss_gedaemmt}
value="DGD"
/>Dachgeschoss gedämmt</label
@@ -128,7 +128,7 @@
><input
type="checkbox"
class="checkbox"
name="oberste_geschossdecke_gedaemmt"
name="oberste_geschossdecke_gedaemmt"
bind:checked={aufnahme.oberste_geschossdecke_gedaemmt}
value="OGDDW"
/>Oberste Geschossdecke gedämmt</label
@@ -139,7 +139,7 @@
><input
type="checkbox"
class="checkbox"
name="oberste_geschossdecke_min_12cm_gedaemmt"
name="oberste_geschossdecke_min_12cm_gedaemmt"
bind:checked={aufnahme.oberste_geschossdecke_min_12cm_gedaemmt}
value="OGDD"
/>Oberste Geschossdecke min. 12cm gedämmt</label

View File

@@ -17,7 +17,7 @@
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"
export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: GebaeudeAufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient
export let images: UploadedGebaeudeBild[];
@@ -33,18 +33,18 @@
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
">
<SanierungsOption label="Zentral/Etage" name="zentralheizung" help="Bitte anklicken wenn die Heizwärme <strong>zentral erzeugt</strong> und von dort in die Räume verteilt wird. Gasthermen und Etagenheizungen in der Wohnung gehören auch dazu." value="ZH" bind:checked={gebaeude_aufnahme_allgemein.zentralheizung}></SanierungsOption>
<SanierungsOption label="Einzelofen" name="einzelofen" help="Bei <strong>dezentraler Erzeugung</strong> in den Räumen wie z.B. Nachtspeicher, Kami- oder Kachelofen. Dezentrale Klimageräte zur Wärmeerzeugung gehören auch dazu." value="EO" bind:checked={gebaeude_aufnahme_allgemein.einzelofen}></SanierungsOption>
<SanierungsOption label="Durchlauferhitzer (elektrisch)" name="durchlauf_erhitzer" help="Wenn <strong>dezentrale</strong> elektrische <strong>Warmwassererzeugung</strong> vorhanden ist" value="DH" bind:checked={gebaeude_aufnahme_allgemein.durchlauf_erhitzer}></SanierungsOption>
<SanierungsOption label="Standardkessel" name="standard_kessel" help="Gemeint sind Konstanttemperaturkessel und ältere Gebläse- oder Feststoffkessel" value="SK" bind:checked={gebaeude_aufnahme_allgemein.standard_kessel}></SanierungsOption>
<SanierungsOption label="Solarsystem für Warmwasser" name="solarsystem_warmwasser" help="Solarpanele auf dem Dach zur <strong>alternativen Warmwassererzeugung</strong> aus Sonnenenergie. Nicht zu verwechseln mit Photovoltaik." value="SSWW" bind:checked={gebaeude_aufnahme_allgemein.solarsystem_warmwasser}></SanierungsOption>
<SanierungsOption label="Wärmepumpe" name="waermepumpe" help="Elektrisch betriebener Wärmerzeuger der thermische Energie aus natürlichen Wärmequellen wie der <strong>Umgebungsluft, dem Erdreich oder Grundwasser</strong> nutzbar macht." value="WP" bind:checked={gebaeude_aufnahme_allgemein.waermepumpe}></SanierungsOption>
<SanierungsOption label="Niedertemperaturkessel" name="niedertemperatur_kessel" help="Heizkessel der mit <strong>niedrigen Vorlauftemperaturen</strong> (35-75 °C) arbeitet. Im Vergleich zum Brennwertkessel ist er weniger effizient, wird aber noch in älteren Heizsystemen eingesetzt." value="NK" bind:checked={gebaeude_aufnahme_allgemein.niedertemperatur_kessel}></SanierungsOption>
<SanierungsOption label="Brennwertkessel" name="brennwert_kessel" help="Hat einen besonders <strong>hohen Wirkungsgrad</strong> weil er die im Abgas enthaltene Kondensationswärme zurückgewinnt. Auch zu erkennen am doppelwandigem Abgasrohr welches sich nicht erhitzt." value="BWK" bind:checked={gebaeude_aufnahme_allgemein.brennwert_kessel}></SanierungsOption>
<SanierungsOption label="Warmwasserrohre gedämmt" name="warmwasser_rohre_gedaemmt" help="Gemeint sind die sichtbaren Rohre des Verteilsystems Warmwasser. Gedämmte Rohre sind an den <strong>dunklen Ummantelungen</strong> (Manschetten) zu erkennen." value="BWK" bind:checked={gebaeude_aufnahme_allgemein.warmwasser_rohre_gedaemmt}></SanierungsOption>
<SanierungsOption label="Heizungsrohre gedämmt" name="heizungsrohre_gedaemmt" help="Gemeint sind die sichtbaren Rohre des Verteilsystems Heizung. Gedämmte Rohre sind an den <strong>dunklen Ummantelungen</strong> (Manschetten) zu erkennen.ext" value="HRGD" bind:checked={gebaeude_aufnahme_allgemein.heizungsrohre_gedaemmt}></SanierungsOption>
<SanierungsOption label="Zirkulation" name="zirkulation" help="Kreislauf von Heizungs- oder Warmwasser <strong>innerhalb eines Leitungssystems</strong>, um eine gleichmäßige Wärmeverteilung sicherzustellen." value="ZK" bind:checked={gebaeude_aufnahme_allgemein.zirkulation}></SanierungsOption>
<SanierungsOption label="Zentral/Etage" name="zentralheizung" help="Bitte anklicken wenn die Heizwärme <strong>zentral erzeugt</strong> und von dort in die Räume verteilt wird. Gasthermen und Etagenheizungen in der Wohnung gehören auch dazu." value="ZH" bind:checked={aufnahme.zentralheizung}></SanierungsOption>
<SanierungsOption label="Einzelofen" name="einzelofen" help="Bei <strong>dezentraler Erzeugung</strong> in den Räumen wie z.B. Nachtspeicher, Kami- oder Kachelofen. Dezentrale Klimageräte zur Wärmeerzeugung gehören auch dazu." value="EO" bind:checked={aufnahme.einzelofen}></SanierungsOption>
<SanierungsOption label="Durchlauferhitzer (elektrisch)" name="durchlauf_erhitzer" help="Wenn <strong>dezentrale</strong> elektrische <strong>Warmwassererzeugung</strong> vorhanden ist" value="DH" bind:checked={aufnahme.durchlauf_erhitzer}></SanierungsOption>
<SanierungsOption label="Standardkessel" name="standard_kessel" help="Gemeint sind Konstanttemperaturkessel und ältere Gebläse- oder Feststoffkessel" value="SK" bind:checked={aufnahme.standard_kessel}></SanierungsOption>
<SanierungsOption label="Solarsystem für Warmwasser" name="solarsystem_warmwasser" help="Solarpanele auf dem Dach zur <strong>alternativen Warmwassererzeugung</strong> aus Sonnenenergie. Nicht zu verwechseln mit Photovoltaik." value="SSWW" bind:checked={aufnahme.solarsystem_warmwasser}></SanierungsOption>
<SanierungsOption label="Wärmepumpe" name="waermepumpe" help="Elektrisch betriebener Wärmerzeuger der thermische Energie aus natürlichen Wärmequellen wie der <strong>Umgebungsluft, dem Erdreich oder Grundwasser</strong> nutzbar macht." value="WP" bind:checked={aufnahme.waermepumpe}></SanierungsOption>
<SanierungsOption label="Niedertemperaturkessel" name="niedertemperatur_kessel" help="Heizkessel der mit <strong>niedrigen Vorlauftemperaturen</strong> (35-75 °C) arbeitet. Im Vergleich zum Brennwertkessel ist er weniger effizient, wird aber noch in älteren Heizsystemen eingesetzt." value="NK" bind:checked={aufnahme.niedertemperatur_kessel}></SanierungsOption>
<SanierungsOption label="Brennwertkessel" name="brennwert_kessel" help="Hat einen besonders <strong>hohen Wirkungsgrad</strong> weil er die im Abgas enthaltene Kondensationswärme zurückgewinnt. Auch zu erkennen am doppelwandigem Abgasrohr welches sich nicht erhitzt." value="BWK" bind:checked={aufnahme.brennwert_kessel}></SanierungsOption>
<SanierungsOption label="Warmwasserrohre gedämmt" name="warmwasser_rohre_gedaemmt" help="Gemeint sind die sichtbaren Rohre des Verteilsystems Warmwasser. Gedämmte Rohre sind an den <strong>dunklen Ummantelungen</strong> (Manschetten) zu erkennen." value="BWK" bind:checked={aufnahme.warmwasser_rohre_gedaemmt}></SanierungsOption>
<SanierungsOption label="Heizungsrohre gedämmt" name="heizungsrohre_gedaemmt" help="Gemeint sind die sichtbaren Rohre des Verteilsystems Heizung. Gedämmte Rohre sind an den <strong>dunklen Ummantelungen</strong> (Manschetten) zu erkennen.ext" value="HRGD" bind:checked={aufnahme.heizungsrohre_gedaemmt}></SanierungsOption>
<SanierungsOption label="Zirkulation" name="zirkulation" help="Kreislauf von Heizungs- oder Warmwasser <strong>innerhalb eines Leitungssystems</strong>, um eine gleichmäßige Wärmeverteilung sicherzustellen." value="ZK" bind:checked={aufnahme.zirkulation}></SanierungsOption>
<SanierungsOption label="Photovoltaik auf dem Dach" name="photovoltaik" help="Direkte Umwandlung von Sonnenlicht in <strong>elektrische Energie</strong> mittels Solarzellen, die den photoelektrischen Effekt nutzen." value="PV" bind:checked={aufnahme.photovotaik}></SanierungsOption>
</div>
@@ -74,7 +74,7 @@
><input
type="checkbox"
class="checkbox"
name="aussenwand_gedaemmt"
name="aussenwand_gedaemmt"
bind:checked={aufnahme.aussenwand_gedaemmt}
value="AWD"
/>Außenwand gedämmt</label
@@ -85,7 +85,7 @@
><input
type="checkbox"
class="checkbox"
name="keller_wand_gedaemmt"
name="keller_wand_gedaemmt"
bind:checked={aufnahme.keller_wand_gedaemmt}
value="KWD"
/>Kelleraußenwand gedämmt</label
@@ -96,7 +96,7 @@
><input
type="checkbox"
class="checkbox"
name="keller_decke_gedaemmt"
name="keller_decke_gedaemmt"
bind:checked={aufnahme.keller_decke_gedaemmt}
value="KDD"
/>Kellerdecke gedämmt</label
@@ -107,7 +107,7 @@
><input
type="checkbox"
class="checkbox"
name="dachgeschoss_gedaemmt"
name="dachgeschoss_gedaemmt"
bind:checked={aufnahme.dachgeschoss_gedaemmt}
value="DGD"
/>Dachgeschoss gedämmt</label
@@ -118,7 +118,7 @@
><input
type="checkbox"
class="checkbox"
name="oberste_geschossdecke_gedaemmt"
name="oberste_geschossdecke_gedaemmt"
bind:checked={aufnahme.oberste_geschossdecke_gedaemmt}
value="OGDDW"
/>Oberste Geschossdecke gedämmt</label
@@ -129,7 +129,7 @@
><input
type="checkbox"
class="checkbox"
name="oberste_geschossdecke_min_12cm_gedaemmt"
name="oberste_geschossdecke_min_12cm_gedaemmt"
bind:checked={aufnahme.oberste_geschossdecke_min_12cm_gedaemmt}
value="OGDD"
/>Oberste Geschossdecke min. 12cm gedämmt</label

View File

@@ -17,7 +17,7 @@
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"
export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: GebaeudeAufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient
export let images: UploadedGebaeudeBild[];
@@ -33,12 +33,12 @@
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
">
<SanierungsOption label="Außenwand gedämmt" name="aussenwand_gedaemmt" help="" value="AWD" bind:checked={gebaeude_aufnahme_allgemein.aussenwand_gedaemmt}></SanierungsOption>
<SanierungsOption label="Kelleraußenwand gedämmt" name="keller_wand_gedaemmt" help="" value="KWD" bind:checked={gebaeude_aufnahme_allgemein.keller_wand_gedaemmt}></SanierungsOption>
<SanierungsOption label="Kellerdecke gedämmt" name="keller_decke_gedaemmt" help="" value="KDD" bind:checked={gebaeude_aufnahme_allgemein.keller_decke_gedaemmt}></SanierungsOption>
<SanierungsOption label="Dachgeschoss gedämmt" name="dachgeschoss_gedaemmt" help="" value="DGD" bind:checked={gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt}></SanierungsOption>
<SanierungsOption label="Oberste Geschossdecke gedämmt" name="oberste_geschossdecke_gedaemmt" help="" value="DGD" bind:checked={gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt}></SanierungsOption>
<SanierungsOption label="Außenwand gedämmt" name="aussenwand_gedaemmt" help="" value="AWD" bind:checked={aufnahme.aussenwand_gedaemmt}></SanierungsOption>
<SanierungsOption label="Kelleraußenwand gedämmt" name="keller_wand_gedaemmt" help="" value="KWD" bind:checked={aufnahme.keller_wand_gedaemmt}></SanierungsOption>
<SanierungsOption label="Kellerdecke gedämmt" name="keller_decke_gedaemmt" help="" value="KDD" bind:checked={aufnahme.keller_decke_gedaemmt}></SanierungsOption>
<SanierungsOption label="Dachgeschoss gedämmt" name="dachgeschoss_gedaemmt" help="" value="DGD" bind:checked={aufnahme.dachgeschoss_gedaemmt}></SanierungsOption>
<SanierungsOption label="Oberste Geschossdecke gedämmt" name="oberste_geschossdecke_gedaemmt" help="" value="DGD" bind:checked={aufnahme.oberste_geschossdecke_gedaemmt}></SanierungsOption>
<SanierungsOption label="Oberste Geschossdecke min. 12cm gedämmt" name="oberste_geschossdecke_min_12cm_gedaemmt" help="" value="DGD" bind:checked={aufnahme.oberste_geschossdecke_min_12cm_gedaemmt}></SanierungsOption>
</div>

View File

@@ -1,10 +1,10 @@
<script lang="ts">
import HelpLabel from "#labels/HelpLabel.svelte";
import Inputlabel from "#labels/InputLabel.svelte";
import Verbrauchslabel from "#labels/VerbrauchsLabel.svelte";
import StromVerbrauchslabel from "#labels/StromVerbrauchslabel.svelte";
import VerbrauchsHelpLabel from "#labels/VerbrauchsHelpLabel.svelte";
import StromVerbrauchsHelpLabel from "#labels/StromVerbrauchsHelpLabel.svelte";
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import Verbrauchslabel from "#components/labels/VerbrauchsLabel.svelte";
import StromVerbrauchslabel from "#components/labels/StromVerbrauchslabel.svelte";
import VerbrauchsHelpLabel from "#components/labels/VerbrauchsHelpLabel.svelte";
import StromVerbrauchsHelpLabel from "#components/labels/StromVerbrauchsHelpLabel.svelte";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"
@@ -21,7 +21,7 @@
import { addNotification } from "#components/Notifications/shared.js";
export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: GebaeudeAufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient;
// Wir dürfen bis zu 4.5 Jahre alte Klimafaktoren benutzen, also nehmen wir alle Monate seitdem und generieren daraus die Auswahl.
@@ -48,12 +48,12 @@
];
const startDate = moment(
ausweis.gebaeude_aufnahme_allgemein.erstellungsdatum || Date.now()
ausweis.aufnahme.erstellungsdatum || Date.now()
)
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment(
ausweis.gebaeude_aufnahme_allgemein.erstellungsdatum || Date.now()
ausweis.aufnahme.erstellungsdatum || Date.now()
).subtract(3, "years");
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
@@ -236,7 +236,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
class="rounded-e-none"
name="brennstoff_1"
bind:value={gebaeude_aufnahme_allgemein.brennstoff_1}
bind:value={aufnahme.brennstoff_1}
required
>
<option disabled selected value={false}>Bitte auswählen</option>
@@ -268,11 +268,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
class="rounded-s-none"
name="einheit_1"
bind:value={ausweis.einheit_1}
disabled={!gebaeude_aufnahme_allgemein.brennstoff_1}
disabled={!aufnahme.brennstoff_1}
required
>
<option disabled selected value={false}>Bitte auswählen</option>
{#each fuelMap.hasOwnProperty(gebaeude_aufnahme_allgemein.brennstoff_1) ? fuelMap[gebaeude_aufnahme_allgemein.brennstoff_1] : [] as unit}
{#each fuelMap.hasOwnProperty(aufnahme.brennstoff_1) ? fuelMap[aufnahme.brennstoff_1] : [] as unit}
<option value={unit}>{unit}</option>
{/each}
</select>
@@ -308,7 +308,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={1}
heizquelle={1}
></VerbrauchsHelpLabel>
@@ -336,7 +336,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={2}
heizquelle={1}
></VerbrauchsHelpLabel>
@@ -364,7 +364,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={3}
heizquelle={1}
></VerbrauchsHelpLabel>
@@ -416,7 +416,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
class="rounded-e-none"
name="brennstoff_2"
bind:value={gebaeude_aufnahme_allgemein.brennstoff_2}
bind:value={aufnahme.brennstoff_2}
required
>
<option disabled selected value={false}
@@ -450,13 +450,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
class="rounded-s-none"
name="einheit_2"
bind:value={ausweis.einheit_2}
disabled={!gebaeude_aufnahme_allgemein.brennstoff_2}
disabled={!aufnahme.brennstoff_2}
required
>
<option disabled selected value={false}
>Bitte auswählen</option
>
{#each fuelMap.hasOwnProperty(gebaeude_aufnahme_allgemein.brennstoff_2) ? fuelMap[gebaeude_aufnahme_allgemein.brennstoff_2] : [] as unit}
{#each fuelMap.hasOwnProperty(aufnahme.brennstoff_2) ? fuelMap[aufnahme.brennstoff_2] : [] as unit}
<option value={unit}>{unit}</option>
{/each}
</select>
@@ -490,7 +490,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={1}
heizquelle={2}
></VerbrauchsHelpLabel>
@@ -517,7 +517,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={2}
heizquelle={2}
></VerbrauchsHelpLabel>
@@ -544,7 +544,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={3}
heizquelle={2}
></VerbrauchsHelpLabel>
@@ -579,7 +579,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<StromVerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={1}
heizquelle={1}
></StromVerbrauchsHelpLabel>
@@ -606,7 +606,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<StromVerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={2}
heizquelle={1}
></StromVerbrauchsHelpLabel>
@@ -633,7 +633,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<StromVerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={3}
heizquelle={1}
></StromVerbrauchsHelpLabel>
@@ -655,11 +655,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<!-- Enthält Stromverbrauch für: -->
<SanierungsOption label="Heizung" name="stromverbrauch_enthaelt_heizung" help="" bind:checked={gebaeude_aufnahme_allgemein.stromverbrauch_enthaelt_heizung}></SanierungsOption>
<SanierungsOption label="Warmwasser " name="stromverbrauch_enthaelt_warmwasser" help="" bind:checked={gebaeude_aufnahme_allgemein.stromverbrauch_enthaelt_warmwasser}></SanierungsOption>
<SanierungsOption label="Lüftung " name="stromverbrauch_enthaelt_lueftung" help="" bind:checked={gebaeude_aufnahme_allgemein.stromverbrauch_enthaelt_lueftung}></SanierungsOption>
<SanierungsOption label="Beleuchtung" name="stromverbrauch_enthaelt_beleuchtung" help="" bind:checked={gebaeude_aufnahme_allgemein.stromverbrauch_enthaelt_beleuchtung}></SanierungsOption>
<SanierungsOption label="Kühlung" name="stromverbrauch_enthaelt_kuehlung" help="" bind:checked={gebaeude_aufnahme_allgemein.stromverbrauch_enthaelt_kuehlung}></SanierungsOption>
<SanierungsOption label="Heizung" name="stromverbrauch_enthaelt_heizung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_heizung}></SanierungsOption>
<SanierungsOption label="Warmwasser " name="stromverbrauch_enthaelt_warmwasser" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_warmwasser}></SanierungsOption>
<SanierungsOption label="Lüftung " name="stromverbrauch_enthaelt_lueftung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_lueftung}></SanierungsOption>
<SanierungsOption label="Beleuchtung" name="stromverbrauch_enthaelt_beleuchtung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_beleuchtung}></SanierungsOption>
<SanierungsOption label="Kühlung" name="stromverbrauch_enthaelt_kuehlung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_kuehlung}></SanierungsOption>
<div class="input-standard">
<Inputlabel title="Sonstige"></Inputlabel>

View File

@@ -1,7 +1,7 @@
<script lang="ts">
import HelpLabel from "#labels/HelpLabel.svelte";
import Inputlabel from "#labels/InputLabel.svelte";
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
export let ausweis;

View File

@@ -10,14 +10,14 @@
import fuelList from "./brennstoffListe.js";
import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung.js";
import {
GebaeudeAufnahmeClient,
GebaeudeClient,
AufnahmeClient,
ObjektClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import { addNotification } from "#components/Notifications/shared.js";
export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let gebaeude: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient;
// Wir dürfen bis zu 4.5 Jahre alte Klimafaktoren benutzen, also nehmen wir alle Monate seitdem und generieren daraus die Auswahl.
@@ -44,12 +44,12 @@
];
const startDate = moment(
ausweis.aufnahme.erstellungsdatum || Date.now()
aufnahme.erstellungsdatum || Date.now()
)
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment(
ausweis.aufnahme.erstellungsdatum || Date.now()
aufnahme.erstellungsdatum || Date.now()
).subtract(3, "years");
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
@@ -232,7 +232,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
class="rounded-e-none"
name="brennstoff_1"
bind:value={gebaeude_aufnahme_allgemein.brennstoff_1}
bind:value={aufnahme.brennstoff_1}
required
>
<option disabled selected value={false}>Bitte auswählen</option>
@@ -264,11 +264,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
class="rounded-s-none"
name="einheit_1"
bind:value={ausweis.einheit_1}
disabled={!gebaeude_aufnahme_allgemein.brennstoff_1}
disabled={!aufnahme.brennstoff_1}
required
>
<option disabled selected value={false}>Bitte auswählen</option>
{#each fuelMap.hasOwnProperty(gebaeude_aufnahme_allgemein.brennstoff_1) ? fuelMap[gebaeude_aufnahme_allgemein.brennstoff_1] : [] as unit}
{#each fuelMap.hasOwnProperty(aufnahme.brennstoff_1) ? fuelMap[aufnahme.brennstoff_1] : [] as unit}
<option value={unit}>{unit}</option>
{/each}
</select>
@@ -304,7 +304,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={1}
heizquelle={1}
></VerbrauchsHelpLabel>
@@ -332,7 +332,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={2}
heizquelle={1}
></VerbrauchsHelpLabel>
@@ -360,7 +360,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={3}
heizquelle={1}
></VerbrauchsHelpLabel>
@@ -412,7 +412,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
class="rounded-e-none"
name="brennstoff_2"
bind:value={gebaeude_aufnahme_allgemein.brennstoff_2}
bind:value={aufnahme.brennstoff_2}
required
>
<option disabled selected value={false}
@@ -446,13 +446,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
class="rounded-s-none"
name="einheit_2"
bind:value={ausweis.einheit_2}
disabled={!gebaeude_aufnahme_allgemein.brennstoff_2}
disabled={!aufnahme.brennstoff_2}
required
>
<option disabled selected value={false}
>Bitte auswählen</option
>
{#each fuelMap.hasOwnProperty(gebaeude_aufnahme_allgemein.brennstoff_2) ? fuelMap[gebaeude_aufnahme_allgemein.brennstoff_2] : [] as unit}
{#each fuelMap.hasOwnProperty(aufnahme.brennstoff_2) ? fuelMap[aufnahme.brennstoff_2] : [] as unit}
<option value={unit}>{unit}</option>
{/each}
</select>
@@ -486,7 +486,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={1}
heizquelle={2}
></VerbrauchsHelpLabel>
@@ -513,7 +513,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={2}
heizquelle={2}
></VerbrauchsHelpLabel>
@@ -540,7 +540,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<HelpLabel>
<VerbrauchsHelpLabel
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
addYear={3}
heizquelle={2}
></VerbrauchsHelpLabel>

View File

@@ -1,11 +1,18 @@
import { AppRouter } from "@ibcornelsen/api";
import { Benutzer, GebaeudeBilder } from "@ibcornelsen/database/client";
import { inferProcedureInput, inferProcedureOutput } from "@trpc/server";
import {
Aufnahme,
BedarfsausweisWohnen,
Benutzer,
GebaeudeBilder,
Objekt,
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
} from "@ibcornelsen/database/client";
export type UploadedGebaeudeBild = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
>["gebaeude_aufnahme_allgemein"]["gebaeude_stammdaten"]["gebaeude_bilder"][0] & { base64?: string, update?: boolean };
type OmitKeys<T, K extends keyof T> = Omit<T, K>;
export type UploadedGebaeudeBild = OmitKeys<GebaeudeBilder, "id" | "objekt_id"> & {
base64: string
}
/**
* Das ist der Typescript Type für den Verbrauchsausweis Wohnen mit allen Feldern die
@@ -17,8 +24,28 @@ AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
* @export
* @typedef {VerbrauchsausweisWohnenClient}
*/
export type VerbrauchsausweisWohnenClient = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
export type VerbrauchsausweisWohnenClient = OmitKeys<
VerbrauchsausweisWohnen,
"id" | "aufnahme_id" | "benutzer_id"
> & {
uid_objekt: string,
uid_aufnahme: string,
uid_benutzer?: string
};
/**
* Das ist der Typescript Type für den Verbrauchsausweis Gewerbe mit allen Feldern die
* von der API erwartet werden. Das Backend wird dem Client nur diese Daten zur Verfügung stellen.
* Hiermit kann sichergestellt werden, dass eine Funktion auf dem Client mit den richtigen Daten
* ausgeführt werden kann.
* @date 1/14/2024 - 3:33:33 PM
*
* @export
* @typedef {VerbrauchsausweisWohnenClient}
*/
export type VerbrauchsausweisGewerbeClient = OmitKeys<
VerbrauchsausweisGewerbe,
"id" | "aufnahme_id" | "benutzer_id"
>;
/**
@@ -31,25 +58,10 @@ AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
* @export
* @typedef {VerbrauchsausweisWohnenClient}
*/
export type VerbrauchsausweisGewerbeClient = inferProcedureInput<
AppRouter["v1"]["verbrauchsausweisGewerbe"]["2016"]["speichern"]
>["ausweis"];
/**
* Das ist der Typescript Type für den Verbrauchsausweis Gewerbe mit allen Feldern die
* von der API erwartet werden. Das Backend wird dem Client nur diese Daten zur Verfügung stellen.
* Hiermit kann sichergestellt werden, dass eine Funktion auf dem Client mit den richtigen Daten
* ausgeführt werden kann.
* @date 1/14/2024 - 3:33:33 PM
*
* @export
* @typedef {VerbrauchsausweisWohnenClient}
*/
export type BedarfsausweisWohnenClient = inferProcedureInput<
AppRouter["v1"]["bedarfsausweisWohen"]["2016"]["speichern"]
>["ausweis"];
export type BedarfsausweisWohnenClient = OmitKeys<
BedarfsausweisWohnen,
"id" | "aufnahme_id" | "benutzer_id"
>;
/**
* Das ist der Typescript Type für die Gebäude Stammdaten mit allen Feldern die
@@ -59,15 +71,13 @@ export type BedarfsausweisWohnenClient = inferProcedureInput<
* @date 1/14/2024 - 3:33:33 PM
*
* @export
* @typedef {GebaeudeClient}
* @typedef {ObjektClient}
*/
export type GebaeudeClient = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
>["gebaeude_aufnahme_allgemein"]["gebaeude_stammdaten"];
export type ObjektClient = OmitKeys<Objekt, "benutzer_id" | "id">;
export type AufnahmeClient = OmitKeys<
Aufnahme,
"id" | "objekt_id" | "benutzer_id"
>;
export type GebaeudeAufnahmeClient = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
>["gebaeude_aufnahme_allgemein"];
export type BenutzerClient = inferProcedureOutput<AppRouter["v1"]["benutzer"]["fromPublicId"]>
export type BenutzerClient = OmitKeys<Benutzer, "id" | "passwort">;

View File

@@ -17,12 +17,12 @@
console.log(ausweis);
const gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein
const aufnahme = ausweis.aufnahme
const ausweisArt = "VA"; // TODO: Das ist ein Platzhalter, hier muss die Ausweisart aus dem Ausweisobjekt kommen
const images = ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder;
const images = ausweis.aufnahme.objekt.gebaeude_bilder;
let verbrauchWWGesamt_1 = "";
let verbrauchWWGesamt_2 = "";
@@ -97,12 +97,12 @@
let Abgeschlossen: any;
if (gebaeude_aufnahme_allgemein.erledigt) {
if (aufnahme.erledigt) {
Ausweisbild = "/images/dashboard/ausweishaken.jpg";
DatenBlattBild = "/images/dashboard/datenblatthaken.jpg";
StatusIcon = "/images/dashboard/erledigt.svg";
Abgeschlossen = 0;
} else if (gebaeude_aufnahme_allgemein.bestellt) {
} else if (aufnahme.bestellt) {
Ausweisbild = "/images/dashboard/ausweis.jpg";
DatenBlattBild = "/images/dashboard/datenblatt.jpg";
StatusIcon = "/images/dashboard/bestellt.svg";
@@ -114,13 +114,13 @@
Abgeschlossen = 2;
}
if (gebaeude_aufnahme_allgemein.boxpruefung) {
if (aufnahme.boxpruefung) {
symbolPruefung = "/images/dashboard/kreishaken.png";
} else {
symbolPruefung = "/images/dashboard/kreiskreuz.png";
}
if (gebaeude_aufnahme_allgemein.zurueckgestellt) {
if (aufnahme.zurueckgestellt) {
zurueckGestellt =
"<img src='/images/dashboard/zurueckGestellt.svg' alt='Status' width=\"25\" height=\"25\"></img>";
} else {
@@ -143,7 +143,7 @@
ausweis.warmwasser_enthalten &&
ausweis.warmwasser_anteil_bekannt
) {
if (gebaeude_aufnahme_allgemein.solarsystem_warmwasser) {
if (aufnahme.solarsystem_warmwasser) {
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
verbrauchWWGesamt_1 = `${calculations?.energieVerbrauchGesamt_1} kWh x ${ausweis.anteil_warmwasser_1 / 100} x 0.6`;
verbrauchWWGesamt_2 = `${calculations?.energieVerbrauchGesamt_2} kWh x ${ausweis.anteil_warmwasser_2 / 100} x 0.6`;
@@ -155,7 +155,7 @@
solarsystemWarmwasser = "kein Solarsystem Warmwasser";
}
} else {
if (gebaeude_aufnahme_allgemein.solarsystem_warmwasser) {
if (aufnahme.solarsystem_warmwasser) {
// Wenn Warmwasser Anteil unbekannt und Solarsystem
verbrauchWWGesamt_1 =
calculations?.energetischeNutzflaeche +
@@ -176,11 +176,11 @@
tooltip3Z2 =
ausweis.faktorKeller +
" x " +
gebaeude_aufnahme_allgemein.flaeche +
aufnahme.flaeche +
" m² Energetische Nutzfläche (Keller " +
ausweis.keller_beheizt +
" ) in m²";
table3Z1 = gebaeude_aufnahme_allgemein.flaeche;
table3Z1 = aufnahme.flaeche;
table3Z2 = calculations?.energetischeNutzflaeche;
@@ -202,7 +202,7 @@
" kWh/" +
ausweis.einheit_1 +
" >> Verbrauch 1 " +
gebaeude_aufnahme_allgemein.brennstoff_1 +
aufnahme.brennstoff_1 +
" in kWh";
tooltip4Z2 =
"(" +
@@ -222,7 +222,7 @@
" kWh/" +
ausweis.einheit_2 +
" >> Verbrauch 2 " +
gebaeude_aufnahme_allgemein.brennstoff_2 +
aufnahme.brennstoff_2 +
" in kWh";
table4Z1 = calculations?.energieVerbrauchGesamt_1;
table4Z2 = calculations?.energieVerbrauchGesamt_2;
@@ -411,7 +411,7 @@
" Primärenergieverbrauch in kWh/m²a";
tooltip16Z2 = "Effizienzklasse";
table16Z1 = calculations?.primaerEnergieVerbrauchGesamt;
table16Z2 = gebaeude_aufnahme_allgemein.energieeffizienzklasse;
table16Z2 = aufnahme.energieeffizienzklasse;
let imagePreview = "";
@@ -436,7 +436,7 @@
timeout: 3000,
})
ausweis.gebaeude_aufnahme_allgemein.storniert = true;
ausweis.aufnahme.storniert = true;
ausweis = ausweis;
}
@@ -452,11 +452,11 @@
<td><button on:click={() => infoVisible = !infoVisible}><ChevronDown size={22} class="transition-all {infoVisible ? "" : "rotate-180"}"></ChevronDown></button></td>
<td class="w-6 px-2"
>
{#if gebaeude_aufnahme_allgemein.erledigt}
{#if aufnahme.erledigt}
<div class="tooltip" data-tip="Ausweis wurde ausgestellt">
<div class="rounded-full w-6 h-6 bg-success"></div>
</div>
{:else if gebaeude_aufnahme_allgemein.bestellt}
{:else if aufnahme.bestellt}
<div class="tooltip" data-tip="Ausweis wurde bestellt">
<div class="rounded-full w-6 h-6 bg-warning"></div>
</div>
@@ -471,12 +471,12 @@
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{gebaeude_aufnahme_allgemein.adresse} {gebaeude_aufnahme_allgemein.plz} {gebaeude_aufnahme_allgemein.ort}</span>
<span>{aufnahme.adresse} {aufnahme.plz} {aufnahme.ort}</span>
<br>
<span>{gebaeude_aufnahme_allgemein.gebaeudetyp}, Einheiten: {gebaeude_aufnahme_allgemein.einheiten}</span>
<span>{aufnahme.gebaeudetyp}, Einheiten: {aufnahme.einheiten}</span>
</div>
<span>{ausweisArt} - {gebaeude_aufnahme_allgemein.id}</span>
<span>{moment(gebaeude_aufnahme_allgemein.erstellungsdatum).format("DD.MM.YYYY")}</span>
<span>{ausweisArt} - {aufnahme.id}</span>
<span>{moment(aufnahme.erstellungsdatum).format("DD.MM.YYYY")}</span>
</AusweisPruefenTooltip></td
>
<td width="35px"
@@ -485,8 +485,8 @@
<div slot="tooltip">
<span>Baujahr Gebäude / Baujahr Heizung</span>
</div>
<span>{gebaeude_aufnahme_allgemein.baujahr_gebaeude.join(", ")}</span>
<span>{gebaeude_aufnahme_allgemein.baujahr_heizung.join(", ")}</span>
<span>{aufnahme.baujahr_gebaeude.join(", ")}</span>
<span>{aufnahme.baujahr_heizung.join(", ")}</span>
</AusweisPruefenTooltip>
<div class="tooltip" data-tip="">
@@ -498,9 +498,9 @@
<div slot="tooltip">
<span>Wohnfläche in m²</span>
<br>
<span>{ausweis.faktorKeller} x {gebaeude_aufnahme_allgemein.flaeche}m² Energetische Nutzfläche (Keller {gebaeude_aufnahme_allgemein.keller}) in m²</span>
<span>{ausweis.faktorKeller} x {aufnahme.flaeche}m² Energetische Nutzfläche (Keller {aufnahme.keller}) in m²</span>
</div>
<span>{gebaeude_aufnahme_allgemein.flaeche}</span>
<span>{aufnahme.flaeche}</span>
<span><strong>{calculations?.energetischeNutzflaeche}</strong></span>
</AusweisPruefenTooltip>
</td
@@ -697,9 +697,9 @@
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{gebaeude_aufnahme_allgemein.prueftext}</span>
<span>{aufnahme.prueftext}</span>
</div>
{#if gebaeude_aufnahme_allgemein.boxpruefung}
{#if aufnahme.boxpruefung}
<CheckCircled size={22}></CheckCircled>
{:else}
<CrossCircled size={22}></CrossCircled>
@@ -740,7 +740,7 @@
<td title="Ausweis ausstellen" class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => ausweisAusstellen(gebaeude_aufnahme_allgemein.uid)}>A</button
on:click={() => ausweisAusstellen(aufnahme.uid)}>A</button
></td
>
<td
@@ -748,7 +748,7 @@
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => ausweisAusstellenPost(gebaeude_aufnahme_allgemein.uid)}>P</button
on:click={() => ausweisAusstellenPost(aufnahme.uid)}>P</button
></td
>
<td
@@ -756,7 +756,7 @@
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => ausweisnichtAusstellen(gebaeude_aufnahme_allgemein.uid)}>N</button
on:click={() => ausweisnichtAusstellen(aufnahme.uid)}>N</button
></td
>
<td
@@ -764,7 +764,7 @@
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => bestellBestaetigung(gebaeude_aufnahme_allgemein.uid)}>B</button
on:click={() => bestellBestaetigung(aufnahme.uid)}>B</button
></td
>
<td
@@ -772,7 +772,7 @@
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => erinnern(gebaeude_aufnahme_allgemein.uid)}
on:click={() => erinnern(aufnahme.uid)}
>E</button
></td
>
@@ -782,17 +782,17 @@
><a
class="btn btn-xs btn-ghost"
target="_blank"
href="/energieausweis-erstellen/gespeichert?id={gebaeude_aufnahme_allgemein.uid}">F</a
href="/energieausweis-erstellen/gespeichert?id={aufnahme.uid}">F</a
></td
>
{#if gebaeude_aufnahme_allgemein.kontrolldatei}
{#if aufnahme.kontrolldatei}
<td title="XML-Datei an das DiBT verschicken." class="w-4 p-1"><button class="btn btn-xs btn-ghost" on:click={() => {
xmlAbschicken(gebaeude_aufnahme_allgemein.uid)
xmlAbschicken(aufnahme.uid)
}}>X</button></td>
{/if}
{#if !gebaeude_aufnahme_allgemein.registriernummer}
{#if !aufnahme.registriernummer}
<td title="Registriernummer vom DiBT anfordern." class="w-4 p-1"><button class="btn btn-xs btn-ghost" on:click={() => {
registriernummerAnfordern(gebaeude_aufnahme_allgemein.uid)
registriernummerAnfordern(aufnahme.uid)
}}>R</button></td>
{/if}
</tr>
@@ -815,7 +815,7 @@
</tr>
<tr>
<td>Informationen des Nutzers</td>
<td>{gebaeude_aufnahme_allgemein.boxpruefung}</td>
<td>{aufnahme.boxpruefung}</td>
</tr>
<tr>
<td>UID</td>
@@ -837,7 +837,7 @@
</div>
<hr/>
</li>
{#each ausweis.gebaeude_aufnahme_allgemein.events as event, i}
{#each ausweis.aufnahme.events as event, i}
<li>
<hr />
<div class="timeline-middle">

View File

@@ -37,7 +37,7 @@
uid: ausweis.uid
})
ausweis.gebaeude_aufnahme_allgemein.storniert = true;
ausweis.aufnahme.storniert = true;
ausweis = ausweis;
dialogs.alert({
@@ -58,14 +58,14 @@
</script>
<div class="card lg:card-side bg-base-200 card-bordered border-base-300">
{#if ausweis.gebaeude_aufnahme_allgemein.storniert}
{#if ausweis.aufnahme.storniert}
<div class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none">
<h1 class="absolute -rotate-[25deg] text-5xl md:text-7xl tracking-wide uppercase text-red-500 border-4 border-red-500 rounded-lg top-[50%] translate-y-[-50%] left-[50%] translate-x-[-50%]">Storniert</h1>
</div>
{/if}
<figure class="lg:w-1/2">
<img
src={(ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder && `/bilder/${ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder[0]?.uid}.webp`) || "/images/placeholder.jpg"}
src={(ausweis.aufnahme.objekt.gebaeude_bilder && `/bilder/${ausweis.aufnahme.objekt.gebaeude_bilder[0]?.uid}.webp`) || "/images/placeholder.jpg"}
class="object-cover w-full h-full"
alt="Gebäudebild"
/>
@@ -95,15 +95,15 @@
</ul>
</div>
<div class="flex flex-row flex-wrap gap-2">
{#if ausweis.gebaeude_aufnahme_allgemein.ausweisart == "VerbrauchsausweisWohnen"}
{#if ausweis.aufnahme.ausweisart == "VerbrauchsausweisWohnen"}
<div class="badge badge-accent font-semibold">
Verbrauchsausweis Wohnen
</div>
{:else if ausweis.gebaeude_aufnahme_allgemein.ausweisart == "BedarfsausweisWohnen"}
{:else if ausweis.aufnahme.ausweisart == "BedarfsausweisWohnen"}
<div class="badge badge-accent font-semibold">
Bedarfsausweis Wohnen
</div>
{:else if ausweis.gebaeude_aufnahme_allgemein.ausweisart == "VerbrauchsausweisGewerbe"}
{:else if ausweis.aufnahme.ausweisart == "VerbrauchsausweisGewerbe"}
<div class="badge badge-accent font-semibold">
Verbrauchsausweis Gewerbe
</div>
@@ -113,7 +113,7 @@
<div class="badge badge-success font-semibold">Ausgestellt</div>
{/if}
</div>
<h2 class="card-title">{ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.adresse}</h2>
<h2 class="card-title">{ausweis.aufnahme.objekt.adresse}</h2>
<div class="mb-4 flex flex-row items-center gap-4">
<progress class="progress w-full" value={progress} max="100"></progress>
<!-- TODO: Metrics für den Fortschritt festlegen -->
@@ -144,16 +144,16 @@
<span
class="font-bold text-base-content"
title="Gebäude / Heizung"
>{ausweis.gebaeude_aufnahme_allgemein.baujahr_gebaeude[0] || "N/A"} /
{ausweis.gebaeude_aufnahme_allgemein.baujahr_heizung[0] ||
>{ausweis.aufnahme.baujahr_gebaeude[0] || "N/A"} /
{ausweis.aufnahme.baujahr_heizung[0] ||
"N/A"}</span
>
</div>
<div class="flex flex-row justify-between">
<span>Wohnfläche</span>
<span class="font-bold text-base-content"
>{ausweis.gebaeude_aufnahme_allgemein.flaeche
? `${ausweis.gebaeude_aufnahme_allgemein.flaeche}m²`
>{ausweis.aufnahme.flaeche
? `${ausweis.aufnahme.flaeche}m²`
: "N/A"}</span
>
</div>

View File

@@ -1,8 +1,6 @@
<script lang="ts">
import Label from "./Label.svelte";
import { client } from "src/trpc";
import type { inferProcedureOutput } from "@trpc/server";
import type { AppRouter } from "@ibcornelsen/api";
import { API, api, inferOutput } from "astro-typesafe-api/client";
export let name: string;
export let readonly: boolean = false;
@@ -11,7 +9,7 @@
let hideZipDropdown: boolean = true;
let zipCodes: inferProcedureOutput<AppRouter["v1"]["postleitzahlen"]> = [];
let zipCodes: inferOutput<API["postleitzahlen"]["GET"]> = [];
async function fetchZipCodeInformation() {
if (!zip || (zip.length < 2)) {
@@ -19,7 +17,7 @@
}
try {
const result = await client.v1.postleitzahlen.query({ plz: zip });
const result = await api.postleitzahlen.GET.fetch({ plz: zip });
if (result.length > 0) {
zipCodes = result;
@@ -67,7 +65,7 @@
maxlength="5"
/>
<div data-test="plz-container" class="absolute top-[calc(100%+4px)] left-0 w-full bg-white py-2 shadow-md rounded-lg" hidden={hideZipDropdown}>
<div data-test="plz-container" class="absolute top-[calc(100%+4px)] left-0 w-full bg-white py-2 shadow-md rounded-lg z-50" hidden={hideZipDropdown}>
{#each zipCodes as zipCode}
<div class="hover:bg-gray-100 cursor-pointer px-2 py-0.5" tabindex="-1" on:click={() => {
zip = zipCode.plz;

View File

@@ -3,17 +3,17 @@ import { AuditType, hidden } from "./hidden.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
export async function auditEndEnergie(ausweis: VerbrauchsausweisWohnenClient, gebaeude: GebaeudeClient, gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient): Promise<boolean> {
export async function auditEndEnergie(ausweis: VerbrauchsausweisWohnenClient, gebaeude: GebaeudeClient, aufnahme: GebaeudeAufnahmeClient): Promise<boolean> {
if (hidden.has(AuditType.END_ENERGIE)) {
return false;
}
//sobald Fläche, Klimafaktoren und alle Verbrauchsjahre eingegeben wurden.
if (gebaeude_aufnahme_allgemein){
if (gebaeude_aufnahme_allgemein.flaeche && ausweis.verbrauch_1 && ausweis.verbrauch_2 && ausweis.verbrauch_3) {
if (aufnahme){
if (aufnahme.flaeche && ausweis.verbrauch_1 && ausweis.verbrauch_2 && ausweis.verbrauch_3) {
try {
const response = await getKlimafaktoren(ausweis.startdatum, gebaeude.plz);
// Alle Klimfaktoren konnten abgefragt werden.
const eevva = await endEnergieVerbrauchVerbrauchsausweis_2016({...ausweis, gebaeude_aufnahme_allgemein: {...gebaeude_aufnahme_allgemein, gebaeude_stammdaten: gebaeude}});
const eevva = await endEnergieVerbrauchVerbrauchsausweis_2016({...ausweis, aufnahme: {...aufnahme, objekt: gebaeude}});
if (eevva){
if (eevva?.endEnergieVerbrauchGesamt <= 45 || eevva?.endEnergieVerbrauchGesamt >= 500) {
return true;

View File

@@ -1,14 +1,14 @@
import { GebaeudeAufnahmeClient } from "#components/Ausweis/types.js";
import { client } from "src/trpc.js";
import { GebaeudeClient } from "#components/Ausweis/types.js";
import { memoize } from "src/lib/Memoization.js";
import { AuditType, hidden } from "../audits/hidden.js";
import { api } from "astro-typesafe-api/client";
export const auditPlzNichtErkannt = memoize(
async (gebaeude: GebaeudeAufnahmeClient) => {
async (gebaeude: GebaeudeClient) => {
if (gebaeude.plz) {
if (gebaeude.plz.length == 5) {
try {
const result = await client.v1.postleitzahlen.query({
const result = await api.postleitzahlen.GET.fetch({
plz: gebaeude.plz,
limit: 1,
});

View File

@@ -10,5 +10,6 @@ export enum AuditType {
WARM_WASSER,
LEER_STAND,
END_ENERGIE,
WOHNFLAECHE_GROESSER_GESAMTFLAECHE
WOHNFLAECHE_GROESSER_GESAMTFLAECHE,
PLZ_NICHT_ERKANNT
}

View File

@@ -3,7 +3,7 @@
export let addYear: number;
export let heizquelle: number;
export let gebaeude_aufnahme_allgemein;
export let aufnahme;
export let ausweis;
</script>

View File

@@ -3,21 +3,21 @@
export let addYear: number;
export let heizquelle: number;
export let gebaeude_aufnahme_allgemein;
export let aufnahme;
export let ausweis;
</script>
{#if ausweis.startdatum}
Bitte geben Sie Ihren
{#if heizquelle == 1}
{#if gebaeude_aufnahme_allgemein.brennstoff_1}<b>
{gebaeude_aufnahme_allgemein.brennstoff_1}
{#if aufnahme.brennstoff_1}<b>
{aufnahme.brennstoff_1}
</b>{/if}
Verbrauch {#if ausweis.einheit_1}
in <b>{ausweis.einheit_1} </b>{/if}
{:else if heizquelle == 2}
{#if gebaeude_aufnahme_allgemein.brennstoff_2}<b>
{gebaeude_aufnahme_allgemein.brennstoff_2}
{#if aufnahme.brennstoff_2}<b>
{aufnahme.brennstoff_2}
</b>{/if}
Verbräuche {#if ausweis.einheit_2}
in <b>{ausweis.einheit_2} </b>{/if}

File diff suppressed because one or more lines are too long

View File

@@ -1,38 +0,0 @@
import type { ZodError } from "zod";
export function success(data: any = {}) {
return new Response(JSON.stringify({
success: true,
data
}))
}
export function error(errors: any[]) {
return new Response(JSON.stringify({
success: false,
errors
}))
}
export function MissingPropertyError(properties: string[]) {
return error(properties.map(property => {
return `Missing property '${property}' in request body.`
}));
}
/**
* Signalisiert ein fehlendes Objekt und gibt den Fehler als HTTP Response zurück.
* @param name Der Name der Entität, die nicht gefunden werden konnte.
* @returns {Response} HTTP Response Objekt
*/
export function MissingEntityError(name: string): Response {
return error([`Missing entity, ${name} does not exist.`])
}
export function ActionFailedError(): Response {
return error(["Failed executing action, error encountered."]);
}
export function InvalidDataError(err: ZodError): Response {
return error(err.issues);
}

View File

@@ -10,7 +10,7 @@ export function convertAusweisData(
let pdfInputs: z.infer<typeof verbrauchsausweisWohnenPDFValidator> = {
...inputs,
pdf: {
"brennstoff": [inputs.gebaeude_aufnahme_allgemein?.brennstoff_1, inputs.gebaeude_aufnahme_allgemein?.brennstoff_2].filter(x => x).join(", ")
"brennstoff": [inputs.aufnahme?.brennstoff_1, inputs.aufnahme?.brennstoff_2].filter(x => x).join(", ")
}
}
let result = recursiveFlatten(inputs, "");

View File

@@ -5,7 +5,7 @@ import moment from "moment";
export function energetischeNutzflaecheBedarfsausweisWohnen_18599(
ausweis: BedarfsausweisWohnenClient
): number {
if (!ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten) {
if (!ausweis.aufnahme.objekt) {
return 0
}
@@ -15,7 +15,7 @@ export function energetischeNutzflaecheBedarfsausweisWohnen_18599(
export async function endEnergieBedarfBedarfsausweis_18599(
ausweis: BedarfsausweisWohnenClient
) {
if (!ausweis.gebaeude_aufnahme_allgemein || !ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten) {
if (!ausweis.aufnahme || !ausweis.aufnahme.objekt) {
return null;
}

View File

@@ -11,7 +11,7 @@ export function berechnungRechnerischeLauzeitHeizung(ausweis: VerbrauchsausweisW
let rechnerischeLaufzeiten = new Array(12).fill(0) as unknown as FixedLengthArray<number, 12>
if (ausweis.gebaeude_aufnahme_allgemein.gebaeudetyp === "Einfamilienhaus") {
if (ausweis.aufnahme.gebaeudetyp === "Einfamilienhaus") {
for (let i = 0; i < 12; i++) {
rechnerischeLaufzeiten[i] = zeitkonstanteHeizung * faktorWochenendAbschaltung * zeitkonstanteRechnerischeLaufzeitEinfamilienhaus[i]
}

View File

@@ -7,27 +7,27 @@ import moment from "moment";
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016(
ausweis: VerbrauchsausweisWohnenClient
): number {
if (!ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten) {
if (!ausweis.aufnahme.objekt) {
return 0
}
let faktorKeller = 1.2;
// Falls das Gebäude einen Keller besitzt der Beheizt ist erhöhen wir die Nutzfläche um 15%
if (ausweis.gebaeude_aufnahme_allgemein.keller == Enums.Heizungsstatus.BEHEIZT && (ausweis.gebaeude_aufnahme_allgemein.einheiten || 1) <= 2) {
if (ausweis.aufnahme.keller == Enums.Heizungsstatus.BEHEIZT && (ausweis.aufnahme.einheiten || 1) <= 2) {
faktorKeller = 1.35;
}
if ((ausweis.gebaeude_aufnahme_allgemein.nutzflaeche || 0) > 0) {
return ausweis.gebaeude_aufnahme_allgemein.nutzflaeche || 0;
if ((ausweis.aufnahme.nutzflaeche || 0) > 0) {
return ausweis.aufnahme.nutzflaeche || 0;
} else {
return (ausweis.gebaeude_aufnahme_allgemein.flaeche || 0) * faktorKeller;
return (ausweis.aufnahme.flaeche || 0) * faktorKeller;
}
}
export async function endEnergieVerbrauchVerbrauchsausweis_2016(
ausweis: VerbrauchsausweisWohnenClient
) {
if (!ausweis.gebaeude_aufnahme_allgemein || !ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten) {
if (!ausweis.aufnahme || !ausweis.aufnahme.objekt) {
return null;
}
@@ -50,7 +50,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
}];
try {
const response = await getKlimafaktoren(ausweis.startdatum, ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.plz)
const response = await getKlimafaktoren(ausweis.startdatum, ausweis.aufnahme.objekt.plz)
if (response) {
klimafaktoren = response
@@ -65,11 +65,11 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
// Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let brennstoff_1 = getHeizwertfaktor(
ausweis.gebaeude_aufnahme_allgemein.brennstoff_1 as string,
ausweis.aufnahme.brennstoff_1 as string,
ausweis.einheit_1 as string
);
let brennstoff_2 = getHeizwertfaktor(
ausweis.gebaeude_aufnahme_allgemein.brennstoff_2 as string,
ausweis.aufnahme.brennstoff_2 as string,
ausweis.einheit_2 as string
);
@@ -91,10 +91,10 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
let energieVerbrauchWarmwasser_2 = 0;
let leerstandsZuschlagWarmwasser = 0;
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
let leerstand = (ausweis.gebaeude_aufnahme_allgemein.leerstand || 0) / 100;
let leerstand = (ausweis.aufnahme.leerstand || 0) / 100;
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
if (ausweis.gebaeude_aufnahme_allgemein.solarsystem_warmwasser) {
if (ausweis.aufnahme.solarsystem_warmwasser) {
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
energieVerbrauchWarmwasser_1 =
energieVerbrauchGesamt_1 *
@@ -117,7 +117,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
leerstand *
(energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2);
} else {
if (ausweis.gebaeude_aufnahme_allgemein.solarsystem_warmwasser) {
if (ausweis.aufnahme.solarsystem_warmwasser) {
// Wenn Warmwasser Anteil unbekannt und Solarsystem
energieVerbrauchWarmwasser_1 = energetischeNutzflaeche * 12 * 3;
energieVerbrauchWarmwasser_2 = 0;
@@ -189,7 +189,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
let primaerfaktorww = 0;
let primaerfaktorww_1 = 0;
if (!ausweis.warmwasser_enthalten && ausweis.gebaeude_aufnahme_allgemein.durchlauf_erhitzer) {
if (!ausweis.warmwasser_enthalten && ausweis.aufnahme.durchlauf_erhitzer) {
primaerfaktorww = 1.8;
primaerfaktorww_1 = 1.8;
} else {

View File

@@ -2,19 +2,19 @@ import { getKlimafaktoren } from "#lib/Klimafaktoren";
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor";
import type { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database/client";
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2023(ausweis: VerbrauchsausweisWohnen & { gebaeude_stammdaten: GebaeudeStammdaten }): number {
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2023(ausweis: VerbrauchsausweisWohnen & { objekt: GebaeudeStammdaten }): number {
return (
ausweis.gebaeude_stammdaten.flaeche *
(ausweis.gebaeude_stammdaten.keller ? 1.35 : 1.2)
ausweis.objekt.flaeche *
(ausweis.objekt.keller ? 1.35 : 1.2)
);
}
export async function endEnergieVerbrauchVerbrauchsausweis_2023(ausweis: VerbrauchsausweisWohnen & { gebaeude_stammdaten: GebaeudeStammdaten }): Promise<number> {
export async function endEnergieVerbrauchVerbrauchsausweis_2023(ausweis: VerbrauchsausweisWohnen & { objekt: GebaeudeStammdaten }): Promise<number> {
const date = ausweis.startdatum;
const klimafaktoren = await getKlimafaktoren(
date,
ausweis.gebaeude_stammdaten.plz
ausweis.objekt.plz
);
// Endenergieverbrauch
@@ -50,7 +50,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2023(ausweis: Verbrau
warmwasserZuschlag = 20 * energetischeNutzflaeche * 3;
}
if (ausweis.gebaeude_stammdaten.leerstand > 0) {
if (ausweis.objekt.leerstand > 0) {
let durchschnittsKlimafaktor =
klimafaktoren.reduce((a, b) => a + b, 0) / 3;
@@ -61,11 +61,11 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2023(ausweis: Verbrau
verbrauch_4_kwh +
verbrauch_5_kwh +
verbrauch_6_kwh) *
(ausweis.gebaeude_stammdaten.leerstand / 100)) /
(ausweis.objekt.leerstand / 100)) /
durchschnittsKlimafaktor;
}
if (ausweis.gebaeude_stammdaten.energiequelle_2_nutzung[3]) {
if (ausweis.objekt.energiequelle_2_nutzung[3]) {
kuehlungsZuschlag = 6 * energetischeNutzflaeche * 3;
}

View File

@@ -1,7 +1,7 @@
import type { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database/client";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen & { gebaeude_stammdaten: GebaeudeStammdaten }): Promise<number> {
export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen & { objekt: GebaeudeStammdaten }): Promise<number> {
const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis);
if (!result) {

View File

@@ -1,6 +1,7 @@
import moment from "moment";
import { memoize } from "./Memoization.js";
import { client } from "src/trpc.js";
import { api } from "astro-typesafe-api/client"
export const getKlimafaktoren = memoize(async (date: Date, plz: string) => {
if (!plz || !date) {
@@ -8,7 +9,7 @@ export const getKlimafaktoren = memoize(async (date: Date, plz: string) => {
}
try {
const response = await client.v1.klimafaktoren.query({
const response = await api.klimafaktoren.GET.fetch({
plz,
genauigkeit: "years",
startdatum: moment(date).utc(true).toDate(),

View File

@@ -26,7 +26,7 @@ export function verbrauchsausweisWohnenCalculateFormProgress(ausweis: Verbrauchs
progress: 100,
errors: []
};
} else if (ausweis.gebaeude_aufnahme_allgemein.storniert) {
} else if (ausweis.aufnahme.storniert) {
// Der Ausweis wurde storniert, also ist der Fortschritt 0%
return {
progress: 0,
@@ -34,7 +34,7 @@ export function verbrauchsausweisWohnenCalculateFormProgress(ausweis: Verbrauchs
};
}
if (ausweis.gebaeude_aufnahme_allgemein.baujahr_gebaeude.length === 0) {
if (ausweis.aufnahme.baujahr_gebaeude.length === 0) {
errors.push({
title: "Fehlendes Baujahr",
description: "Eines ihrer Gebäude hat noch kein Baujahr angegeben. Beheben sie dies indem sie auf den untenstehenden Link klicken.",
@@ -44,11 +44,11 @@ export function verbrauchsausweisWohnenCalculateFormProgress(ausweis: Verbrauchs
}
if (ausweis.gebaeude_aufnahme_allgemein.adresse) {
if (ausweis.aufnahme.adresse) {
progress += 5;
}
if (ausweis.gebaeude_aufnahme_allgemein.ort) {
if (ausweis.aufnahme.ort) {
progress += 5;
}

View File

@@ -14,7 +14,7 @@ export class AusweisBerechnungen2016 {
}
public getAusweisart() {
switch (this.ausweis.gebaeude_aufnahme_allgemein.ausweisart.toLowerCase()) {
switch (this.ausweis.aufnahme.ausweisart.toLowerCase()) {
case ('va'):
return {'typ' : 'Wohngebaeude', 'art' : 'Verbrauchsausweis Wohngebäude', 'kuerzel' : 'va'};
case ('ba'):
@@ -73,7 +73,7 @@ export class AusweisBerechnungen2016 {
public getGebaeudeTeil() {
if (this.gebaeude.gebaeudeteil == "Gesamtgebäude") {
return "Ganzes Gebäude";
} else if (this.gebaeude.gebaeudeteil == "Wohnen" && this.ausweis.gebaeude_aufnahme_allgemein.ausweisart == "VANW") {
} else if (this.gebaeude.gebaeudeteil == "Wohnen" && this.ausweis.aufnahme.ausweisart == "VANW") {
return "Teil des Wohngebäudes";
} else {
return "Teil des Nichtwohngebäudes";

View File

@@ -14,10 +14,10 @@ import moment from "moment";
export async function xmlVerbrauchsausweisWohnen_2016(
ausweis: VerbrauchsausweisWohnen & {
gebaeude_stammdaten: GebaeudeStammdaten;
objekt: GebaeudeStammdaten;
}
): Promise<string> {
const gebaeude = ausweis.gebaeude_stammdaten;
const gebaeude = ausweis.objekt;
const bundesland = await prisma.postleitzahlen.findUnique({
where: {
@@ -35,7 +35,7 @@ export async function xmlVerbrauchsausweisWohnen_2016(
const berechnungen = new AusweisBerechnungen2016(
ausweis,
ausweis.gebaeude_stammdaten,
ausweis.objekt,
result
);
const klimafaktoren = await getKlimafaktoren(

View File

@@ -7,28 +7,28 @@ export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient): {
description: string,
anlagenteil: string
}[] {
let Warmwasserrohre_gedaemmt = ausweis.gebaeude_aufnahme_allgemein.warmwasser_rohre_gedaemmt;
let Heizungsrohre_gedaemmt = ausweis.gebaeude_aufnahme_allgemein.heizungsrohre_gedaemmt;
let Waermepumpe = ausweis.gebaeude_aufnahme_allgemein.waermepumpe;
let Kellerwand_gedaemmt = ausweis.gebaeude_aufnahme_allgemein.keller_wand_gedaemmt;
let Keller = ausweis.gebaeude_aufnahme_allgemein.keller;
let Kellerdecke_Kalraeume_gedaemmt = ausweis.gebaeude_aufnahme_allgemein.keller_decke_gedaemmt;
let Brennwertkessel = ausweis.gebaeude_aufnahme_allgemein.brennwert_kessel;
let baujahr_anlagesanlage = ausweis.gebaeude_aufnahme_allgemein.baujahr_heizung[0];
let Zentralheizung = ausweis.gebaeude_aufnahme_allgemein.zentralheizung;
let photovoltaik = ausweis.gebaeude_aufnahme_allgemein.photovoltaik;
let Brennstoff = ausweis.gebaeude_aufnahme_allgemein.brennstoff_1;
let Aussenwand_gedaemmt = ausweis.gebaeude_aufnahme_allgemein.aussenwand_gedaemmt;
let Dachgeschoss = ausweis.gebaeude_aufnahme_allgemein.dachgeschoss;
let Dachgeschoss_gedaemmt = ausweis.gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt;
let Oberste_Geschossdecke_gedaemmt = ausweis.gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt;
let Einfachglas = ausweis.gebaeude_aufnahme_allgemein.einfach_verglasung;
let Doppelfenster = ausweis.gebaeude_aufnahme_allgemein.doppel_verglasung;
let Fenster_teilw_undicht = ausweis.gebaeude_aufnahme_allgemein.fenster_teilweise_undicht;
let Warmwasserrohre_gedaemmt = ausweis.aufnahme.warmwasser_rohre_gedaemmt;
let Heizungsrohre_gedaemmt = ausweis.aufnahme.heizungsrohre_gedaemmt;
let Waermepumpe = ausweis.aufnahme.waermepumpe;
let Kellerwand_gedaemmt = ausweis.aufnahme.keller_wand_gedaemmt;
let Keller = ausweis.aufnahme.keller;
let Kellerdecke_Kalraeume_gedaemmt = ausweis.aufnahme.keller_decke_gedaemmt;
let Brennwertkessel = ausweis.aufnahme.brennwert_kessel;
let baujahr_anlagesanlage = ausweis.aufnahme.baujahr_heizung[0];
let Zentralheizung = ausweis.aufnahme.zentralheizung;
let photovoltaik = ausweis.aufnahme.photovoltaik;
let Brennstoff = ausweis.aufnahme.brennstoff_1;
let Aussenwand_gedaemmt = ausweis.aufnahme.aussenwand_gedaemmt;
let Dachgeschoss = ausweis.aufnahme.dachgeschoss;
let Dachgeschoss_gedaemmt = ausweis.aufnahme.dachgeschoss_gedaemmt;
let Oberste_Geschossdecke_gedaemmt = ausweis.aufnahme.oberste_geschossdecke_gedaemmt;
let Einfachglas = ausweis.aufnahme.einfach_verglasung;
let Doppelfenster = ausweis.aufnahme.doppel_verglasung;
let Fenster_teilw_undicht = ausweis.aufnahme.fenster_teilweise_undicht;
let empfehlungen = [];
if (ausweis.gebaeude_aufnahme_allgemein.einfach_verglasung || (Doppelfenster && Fenster_teilw_undicht)) {
if (ausweis.aufnahme.einfach_verglasung || (Doppelfenster && Fenster_teilw_undicht)) {
empfehlungen.push({
"title" : "Erneuerung der Fenster",
"description" : "Alte und undichte Fenster mit Wärmeschutzfenstern auswechseln.",
@@ -38,7 +38,7 @@ export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient): {
});
}
if (ausweis.gebaeude_aufnahme_allgemein.dachgeschoss == Enums.Heizungsstatus.UNBEHEIZT && !Oberste_Geschossdecke_gedaemmt) {
if (ausweis.aufnahme.dachgeschoss == Enums.Heizungsstatus.UNBEHEIZT && !Oberste_Geschossdecke_gedaemmt) {
empfehlungen.push({
"title" : "Zusätzliche Dämmung des Fußbodens des kalten Dachraumes",
"description" : "Beim Einbringen sollten mindestens 16cm Dämmstoff verarbeitet werden. Das Einsparpotenzial ist für jeden zusätzlichen cm Dämmung sehr hoch.",

View File

@@ -20,7 +20,7 @@ export async function importVerbrauchsausweisWohnenAltesSystem(count: number = 5
export function verbrauchsausweisWohnenImportTranslate(ausweis: Record<string, any>) {
const ausweisTranslated: VerbrauchsausweisWohnenClient = {
gebaeude_aufnahme_allgemein: {
aufnahme: {
rechnungen: null,
baujahr_gebaeude: [ausweis.baujahr_gebaeude],
baujahr_heizung: [ausweis.baujahr_anlage],
@@ -38,7 +38,7 @@ export function verbrauchsausweisWohnenImportTranslate(ausweis: Record<string, a
gebaeudeteil: ausweis.objekt_gebaeudeteil,
lueftung: ausweis.lueftungskonzept,
kuehlung: ausweis.wird_gekuehlt,
gebaeude_stammdaten: {
objekt: {
adresse: ausweis.objekt_strasse,
plz: ausweis.objekt_plz,
ort: ausweis.objekt_ort,

View File

@@ -10,7 +10,7 @@ export function verbrauchsausweisWohnenFaker(seed: number = 42): Verbrauchsauswe
const verbrauch_4 = faker.number.int({ min: 5000, max: 15000 });
const ausweis: VerbrauchsausweisWohnenClient = {
gebaeude_aufnahme_allgemein: {
aufnahme: {
rechnungen: [],
baujahr_gebaeude: [faker.number.int({ min: 1960, max: 2014 })],
baujahr_heizung: [faker.number.int({ min: 1960, max: 2014 })],
@@ -28,7 +28,7 @@ export function verbrauchsausweisWohnenFaker(seed: number = 42): Verbrauchsauswe
gebaeudeteil: "Gesamtgebäude",
lueftung: "Fensterlüftung",
kuehlung: "Vorhanden",
gebaeude_stammdaten: {
objekt: {
adresse: faker.location.streetAddress(),
plz: faker.location.zipCode({ format: "#####" }),
ort: faker.location.city(),

View File

@@ -79,3 +79,11 @@ export async function authorizationMiddleware(input: any, context: TypesafeAPICo
message: "Invalid authorization method in 'Authorization' header."
})
}
export async function maybeAuthorizationMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
try {
return authorizationMiddleware(input, ctx)
} catch(e) {
return null;
}
}

View File

@@ -55,7 +55,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
<text size="12">Ausweis ID: ${ausweis.uid}</text>
</flex>
<text size="12" lineHeight="14" font="bold" marginTop="10">Gebäudedaten</text>
<text size="12" lineHeight="14">Adresse: ${ausweis.gebaeude_aufnahme_allgemein.adresse}, ${ausweis.gebaeude_aufnahme_allgemein.plz} ${ausweis.gebaeude_aufnahme_allgemein.ort}</text>
<text size="12" lineHeight="14">Adresse: ${ausweis.aufnahme.objekt.adresse}, ${ausweis.aufnahme.objekt.plz} ${ausweis.aufnahme.objekt.ort}</text>
<flex direction="row" justify="space-between" width="${innerWidth}" marginTop="25">
<flex direction="row" gap="5" align="center">
@@ -80,29 +80,29 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
<flex direction="column" width="${(innerWidth) / 2 - 7.5}">
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
<text size="12" lineHeight="14">Gebäudetyp:</text>
<text size="12" lineHeight="14">${ausweis.gebaeude_aufnahme_allgemein.gebaeudetyp}</text>
<text size="12" lineHeight="14">${ausweis.aufnahme.gebaeudetyp}</text>
</flex>
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
<text size="12" lineHeight="14">Wohnfläche:</text>
<text size="12" lineHeight="14">DIN Wohnfläche innen ${ausweis.gebaeude_aufnahme_allgemein.flaeche} m²</text>
<text size="12" lineHeight="14">DIN Wohnfläche innen ${ausweis.aufnahme.flaeche} m²</text>
</flex>
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
<text size="12" lineHeight="14">Leerstand:</text>
<text size="12" lineHeight="14">${ausweis.gebaeude_aufnahme_allgemein.leerstand || 0}%</text>
<text size="12" lineHeight="14">${ausweis.aufnahme.leerstand || 0}%</text>
</flex>
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
<text size="12" lineHeight="14">Wohnungen:</text>
<text size="12" lineHeight="14">${ausweis.gebaeude_aufnahme_allgemein.einheiten}</text>
<text size="12" lineHeight="14">${ausweis.aufnahme.einheiten}</text>
</flex>
</flex>
<flex direction="column" width="${(innerWidth) / 2 - 7.5}">
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
<text size="12" lineHeight="14">Dachgeschoss:</text>
<text size="12" lineHeight="14">${translateHeizungsstatus[ausweis.gebaeude_aufnahme_allgemein.dachgeschoss || "NICHT_VORHANDEN"]}</text>
<text size="12" lineHeight="14">${translateHeizungsstatus[ausweis.aufnahme.dachgeschoss || "NICHT_VORHANDEN"]}</text>
</flex>
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
<text size="12" lineHeight="14">Keller:</text>
<text size="12" lineHeight="14">${translateHeizungsstatus[ausweis.gebaeude_aufnahme_allgemein.keller || "NICHT_VORHANDEN"]}</text>
<text size="12" lineHeight="14">${translateHeizungsstatus[ausweis.aufnahme.keller || "NICHT_VORHANDEN"]}</text>
</flex>
</flex>
</flex>
@@ -126,14 +126,14 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
</flex>
<flex direction="column" gap="4">
<text></text>
<text size="12" font="bold">${ausweis.gebaeude_aufnahme_allgemein.brennstoff_1}</text>
<text size="12" font="bold">${ausweis.aufnahme.brennstoff_1}</text>
<text size="12">${ausweis.verbrauch_1} ${ausweis.einheit_1}</text>
<text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text>
<text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text>
</flex>
<flex direction="column" gap="4">
<text size="12">zusätzliche Heizquelle</text>
<text size="12" font="bold">${ausweis.gebaeude_aufnahme_allgemein.brennstoff_2 || ""}</text>
<text size="12" font="bold">${ausweis.aufnahme.brennstoff_2 || ""}</text>
<text size="12">${ausweis.verbrauch_4 || ""} ${ausweis.einheit_2 || ""}</text>
<text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text>
<text size="12">${ausweis.verbrauch_6 || ""} ${ausweis.einheit_2 || ""}</text>
@@ -152,55 +152,55 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
<flex direction="column" gap="4">
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.zentralheizung || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.zentralheizung || false}"></checkbox>
<text size="12">Zentralheizung</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.einzelofen || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.einzelofen || false}"></checkbox>
<text size="12">Einzelöfen</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.durchlauf_erhitzer || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.durchlauf_erhitzer || false}"></checkbox>
<text size="12">Durchlauferhitzer</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.standard_kessel || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.standard_kessel || false}"></checkbox>
<text size="12">Standardkessel</text>
</flex>
</flex>
<flex direction="column" gap="4">
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.solarsystem_warmwasser || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.solarsystem_warmwasser || false}"></checkbox>
<text size="12">Solarsystem für Warmwasser</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.waermepumpe || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.waermepumpe || false}"></checkbox>
<text size="12">Wärmepumpe</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.niedertemperatur_kessel || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.niedertemperatur_kessel || false}"></checkbox>
<text size="12">Niedertemperaturkessel</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.brennwert_kessel || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.brennwert_kessel || false}"></checkbox>
<text size="12">Brennwertkessel</text>
</flex>
</flex>
<flex direction="column" gap="4">
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.warmwasser_rohre_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.warmwasser_rohre_gedaemmt || false}"></checkbox>
<text size="12">Warmwasserrohre gedämmt</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.heizungsrohre_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.heizungsrohre_gedaemmt || false}"></checkbox>
<text size="12">Heizungsrohre gedämmt</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.zirkulation || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.zirkulation || false}"></checkbox>
<text size="12">Zirkulation</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.raum_temperatur_regler || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.raum_temperatur_regler || false}"></checkbox>
<text size="12">Raumtemperaturregelung</text>
</flex>
</flex>
@@ -209,15 +209,15 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
<flex direction="column" gap="4">
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.einfach_verglasung || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.einfach_verglasung || false}"></checkbox>
<text size="12">Einfachglas</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.doppel_verglasung || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.doppel_verglasung || false}"></checkbox>
<text size="12">Doppelverglasung</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.isolier_verglasung || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.isolier_verglasung || false}"></checkbox>
<text size="12">Isolierverglasung</text>
</flex>
</flex>
@@ -227,25 +227,25 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
<text size="12">Passivhausfenster</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.fenster_dicht || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.fenster_dicht || false}"></checkbox>
<text size="12">Alle Fenster dicht</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.fenster_teilweise_undicht || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.fenster_teilweise_undicht || false}"></checkbox>
<text size="12">Fenster teilweise undicht</text>
</flex>
</flex>
<flex direction="column" gap="4">
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.tueren_undicht || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.tueren_undicht || false}"></checkbox>
<text size="12">Türen teilweise undicht</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.tueren_dicht || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.tueren_dicht || false}"></checkbox>
<text size="12">Alle Türen dicht</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.rolllaeden_kaesten_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.rolllaeden_kaesten_gedaemmt || false}"></checkbox>
<text size="12">Rollladenkästen gedämmt</text>
</flex>
</flex>
@@ -254,33 +254,33 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
<flex direction="column" gap="4">
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.keller_wand_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.keller_wand_gedaemmt || false}"></checkbox>
<text size="12">Kelleraußenwand gedämmt</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.keller_decke_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.keller_decke_gedaemmt || false}"></checkbox>
<text size="12">Kellerdecke gedämmt</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.aussenwand_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.aussenwand_gedaemmt || false}"></checkbox>
<text size="12">Außenwand gedämmt</text>
</flex>
</flex>
<flex direction="column" gap="4">
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.dachgeschoss_min_12cm_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.dachgeschoss_min_12cm_gedaemmt || false}"></checkbox>
<text size="12">Dachgeschoss min. 12cm gedämmt</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.dachgeschoss_gedaemmt || false}"></checkbox>
<text size="12">Dachgeschoss gedämmt</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.oberste_geschossdecke_gedaemmt || false}"></checkbox>
<text size="12">Oberste Geschossdecke gedämmt</text>
</flex>
<flex direction="row" gap="4" align="center">
<checkbox width="8" height="8" checked="${ausweis.gebaeude_aufnahme_allgemein.oberste_geschossdecke_min_12cm_gedaemmt || false}"></checkbox>
<checkbox width="8" height="8" checked="${ausweis.aufnahme.oberste_geschossdecke_min_12cm_gedaemmt || false}"></checkbox>
<text size="12">Oberste Geschossdecke min. 12cm gedämmt</text>
</flex>
</flex>

View File

@@ -41,38 +41,38 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}
}
const gebaeudetyp = fillFormField("gebaeudetyp", ausweis.gebaeude_aufnahme_allgemein.gebaeudetyp)
const gebaeudetyp = fillFormField("gebaeudetyp", ausweis.aufnahme.gebaeudetyp)
const adresse = fillFormField("adresse", ausweis.gebaeude_aufnahme_allgemein.adresse)
const adresse = fillFormField("adresse", ausweis.aufnahme.objekt.adresse)
const gebaeudeteil = fillFormField("gebaeudeteil", ausweis.gebaeude_aufnahme_allgemein.gebaeudeteil)
const gebaeudeteil = fillFormField("gebaeudeteil", ausweis.aufnahme.gebaeudeteil)
const baujahr_gebaeude = fillFormField("baujahr_gebaeude", ausweis.gebaeude_aufnahme_allgemein.baujahr_gebaeude.toString())
const baujahr_gebaeude = fillFormField("baujahr_gebaeude", ausweis.aufnahme.baujahr_gebaeude.toString())
const baujahr_heizung = fillFormField("baujahr_heizung", ausweis.gebaeude_aufnahme_allgemein.baujahr_heizung.toString())
const baujahr_heizung = fillFormField("baujahr_heizung", ausweis.aufnahme.baujahr_heizung.toString())
const einheiten = fillFormField("einheiten", ausweis.gebaeude_aufnahme_allgemein.einheiten.toString())
const einheiten = fillFormField("einheiten", ausweis.aufnahme.einheiten.toString())
const nutzflaeche = fillFormField("nutzflaeche", `${ausweis.gebaeude_aufnahme_allgemein.nutzflaeche.toString()}`)
const nutzflaeche = fillFormField("nutzflaeche", `${ausweis.aufnahme.nutzflaeche.toString()}`)
fillFormField("energietraeger_heizung", `${ausweis.gebaeude_aufnahme_allgemein.brennstoff_1}, ${ausweis.gebaeude_aufnahme_allgemein.brennstoff_2 || ""}`)
fillFormField("energietraeger_heizung", `${ausweis.aufnahme.brennstoff_1}, ${ausweis.aufnahme.brennstoff_2 || ""}`)
if (ausweis.warmwasser_enthalten) {
fillFormField("energietraeger_warmwasser", `${ausweis.gebaeude_aufnahme_allgemein.brennstoff_1}, ${ausweis.gebaeude_aufnahme_allgemein.brennstoff_2 || ""}`)
fillFormField("energietraeger_warmwasser", `${ausweis.aufnahme.brennstoff_1}, ${ausweis.aufnahme.brennstoff_2 || ""}`)
}
toggleCheck("fensterlueftung", ausweis.gebaeude_aufnahme_allgemein.lueftung == Enums.Lueftungskonzept.Fensterlueftung)
toggleCheck("schachtlueftung", ausweis.gebaeude_aufnahme_allgemein.lueftung == Enums.Lueftungskonzept.Schachtlueftung)
toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", ausweis.gebaeude_aufnahme_allgemein.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung)
toggleCheck("lueftungsanlage_waermerueckgewinnung", ausweis.gebaeude_aufnahme_allgemein.lueftung == Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung)
toggleCheck("fensterlueftung", ausweis.aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung)
toggleCheck("schachtlueftung", ausweis.aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung)
toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", ausweis.aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung)
toggleCheck("lueftungsanlage_waermerueckgewinnung", ausweis.aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung)
toggleCheck("anlass_neubau", ausweis.ausstellgrund == "Neubau")
toggleCheck("anlass_vermietung", ausweis.ausstellgrund == "Vermietung" || ausweis.ausstellgrund == "Verkauf")
toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung")
toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges")
const gebaeudeBild = ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder?.find(image => image.kategorie === "Gebaeude");
const gebaeudeBild = ausweis.aufnahme.objekt.gebaeude_bilder?.find(image => image.kategorie === "Gebaeude");
/* -------------------------------- Seite 2 -------------------------------- */
@@ -247,7 +247,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"),
ausweis.gebaeude_aufnahme_allgemein.brennstoff_1,
ausweis.aufnahme.brennstoff_1,
berechnungen?.primaerfaktorww.toString(),
Math.round(berechnungen?.verbrauch_1_kwh).toString(),
Math.round(
@@ -262,7 +262,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
addVerbrauch(
moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"),
moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"),
ausweis.gebaeude_aufnahme_allgemein.brennstoff_1,
ausweis.aufnahme.brennstoff_1,
berechnungen?.primaerfaktorww.toString(),
Math.round(berechnungen?.verbrauch_2_kwh).toString(),
Math.round(
@@ -277,7 +277,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
addVerbrauch(
moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "year").format("MM.YYYY"),
ausweis.gebaeude_aufnahme_allgemein.brennstoff_1,
ausweis.aufnahme.brennstoff_1,
berechnungen?.primaerfaktorww.toString(),
Math.round(berechnungen?.verbrauch_3_kwh).toString(),
Math.round(

View File

@@ -62,9 +62,9 @@ const UseDynamicFontSize = (props: PropPanelWidgetProps) => {
rootElement.appendChild(label);
};
type AusweisIndex = keyof Omit<Omit<VerbrauchsausweisWohnenClient, "gebaeude_aufnahme_allgemein">, "rechnungen">
| `gebaeude_aufnahme_allgemein.${keyof VerbrauchsausweisWohnenClient["gebaeude_aufnahme_allgemein"]}`
| `gebaeude_aufnahme_allgemein.gebaeude_stammdaten.${keyof VerbrauchsausweisWohnenClient["gebaeude_aufnahme_allgemein"]["gebaeude_stammdaten"]}`
type AusweisIndex = keyof Omit<Omit<VerbrauchsausweisWohnenClient, "aufnahme">, "rechnungen">
| `aufnahme.${keyof VerbrauchsausweisWohnenClient["aufnahme"]}`
| `aufnahme.objekt.${keyof VerbrauchsausweisWohnenClient["aufnahme"]["objekt"]}`
| `rechnungen.${keyof Rechnungen}`;
const ausweisKeys = zodGetKeys(verbrauchsausweisWohnenPDFValidator);

File diff suppressed because one or more lines are too long

255
src/lib/validators/index.ts Normal file
View File

@@ -0,0 +1,255 @@
import {
VerbrauchsausweisWohnenSchema,
AufnahmeSchema,
ObjektSchema,
GebaeudeBilderSchema,
RechnungSchema,
EventSchema,
BenutzerSchema,
GebaeudePlaeneSchema,
AnteilshaberSchema,
BedarfsausweisWohnenSchema,
VerbrauchsausweisGewerbeSchema
} from "@ibcornelsen/database/client";
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 GebaeudeBilderValidator = GebaeudeBilderSchema.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(),
gebaeude_bilder: z.array(
GebaeudeBilderValidator
).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({
gebaeude_bilder: z.array(
GebaeudeBilderSchema.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({
gebaeude_bilder: z.array(
GebaeudeBilderSchema.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({
gebaeude_bilder: z.array(
GebaeudeBilderSchema.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,
});

View File

@@ -23,11 +23,11 @@
export let ausweis: BedarfsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let aufnahme = ausweis.aufnahme || {};
let gebaeude =
ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
ausweis.aufnahme?.objekt || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] =
ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten
ausweis.aufnahme?.objekt
?.gebaeude_bilder || [];
let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4];
@@ -54,7 +54,7 @@
// const result = await verbrauchsausweisWohnenSpeichern(
// ausweis,
// gebaeude,
// gebaeude_aufnahme_allgemein,
// aufnahme,
// images,
// user
// );
@@ -63,7 +63,7 @@
// // Sonst müsste er alles neu eingeben...
// ausweis.uid = result.uid;
// gebaeude.uid = result.gebaeude_uid;
// gebaeude_aufnahme_allgemein.uid = result.gebaeude_aufnahme_uid;
// aufnahme.uid = result.gebaeude_aufnahme_uid;
// window.history.pushState(
// {},
// "",
@@ -153,8 +153,8 @@
<div class="w-full rounded-lg border-gray/35 border-2 relative px-4">
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:gebaeude
bind:aufnahme={aufnahme}
bind:objekt={gebaeude}
/>
</div>
</div>
@@ -165,8 +165,8 @@
<div id="formular-box" class="formular-boxen ring-0">
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:objekt={gebaeude}
bind:aufnahme={aufnahme}
bind:ausweis
/>
</Bereich>
@@ -177,7 +177,7 @@
<Bereich
bereich="B"
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
><GebaeudeDaten bind:gebaeude_aufnahme_allgemein /></Bereich
><GebaeudeDaten bind:aufnahme /></Bereich
>
<hr />
@@ -1360,7 +1360,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
<BilderZusatzsysteme
{ausweis}
{gebaeude}
{gebaeude_aufnahme_allgemein}
{aufnahme}
{images}
/>
<hr />

View File

@@ -87,7 +87,7 @@
<div class="flex flex-col gap-4">
{#each ausweise as ausweis}
<div class="rounded-lg border p-2 flex flex-row items-center justify-between">
<h2 class="text-black">{ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.adresse}</h2>
<h2 class="text-black">{ausweis.aufnahme.objekt.adresse}</h2>
<button class="btn btn-square btn-ghost p-1.5" on:click={() => {
changeInputs(ausweis)
}}><Check size={20}/></button>

View File

@@ -23,8 +23,8 @@
export let title;
export let bullets;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let aufnahme = ausweis.aufnahme || {};
let gebaeude = ausweis.aufnahme?.objekt || {};
let services = [
{
@@ -58,8 +58,8 @@
let prices: number[] = [];
if (ausweis.gebaeude_aufnahme_allgemein.ausweisart) {
prices = PRICES[ausweis.gebaeude_aufnahme_allgemein.ausweisart];
if (ausweis.aufnahme.ausweisart) {
prices = PRICES[ausweis.aufnahme.ausweisart];
}
let basePrice: number = prices[0];
@@ -102,8 +102,8 @@
<div id="performance-box" class="w-full box relative px-4 order-2 2xl:order-1 self-stretch grid grid-cols-1">
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:gebaeude
bind:aufnahme={aufnahme}
bind:objekt={gebaeude}
/>
</div>

View File

@@ -47,8 +47,8 @@
let prices: number[] = [];
if (ausweis.gebaeude_aufnahme_allgemein.ausweisart) {
prices = PRICES[ausweis.gebaeude_aufnahme_allgemein.ausweisart];
if (ausweis.aufnahme.ausweisart) {
prices = PRICES[ausweis.aufnahme.ausweisart];
}
let basePrice: number = prices[0];

View File

@@ -16,7 +16,7 @@
import SanierungszustandWaermedammung from "#components/Ausweis/SanierungszustandWaermedammung.svelte";
import AusweisPreviewContainer from "#components/Ausweis/AusweisPreviewContainer.svelte";
import Bereich from "#labels/Bereich.svelte";
import Bereich from "#components/labels/Bereich.svelte";
import HelpLabel from "#components/HelpLabel.svelte";
import Verbrauch from "#components/Ausweis/Verbrauch.svelte";
import StromVerbrauch from "#components/Ausweis/StromVerbrauch.svelte";
@@ -35,9 +35,9 @@
export let Energieausweis = "Verbrauchsausweis Gewerbe";
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten?.gebaeude_bilder || [];
let aufnahme = ausweis.aufnahme || {};
let gebaeude = ausweis.aufnahme?.objekt || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.aufnahme?.objekt?.gebaeude_bilder || [];
function automatischAusfüllen() {
}
@@ -46,7 +46,7 @@
const result = await verbrauchsausweisWohnenSpeichern(
ausweis,
gebaeude,
gebaeude_aufnahme_allgemein,
aufnahme,
images,
user
);
@@ -56,7 +56,7 @@
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid;
gebaeude.uid = result.gebaeude_uid;
gebaeude_aufnahme_allgemein.uid = result.gebaeude_aufnahme_uid;
aufnahme.uid = result.gebaeude_aufnahme_uid;
window.history.pushState(
{},
"",
@@ -76,8 +76,8 @@
<div id="performance-box" class="w-full box relative px-4 order-2 2xl:order-1 self-stretch grid grid-cols-1">
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:gebaeude
bind:aufnahme={aufnahme}
bind:objekt={gebaeude}
/>
</div>
@@ -104,9 +104,9 @@
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
bind:ausweis
{Energieausweis}
ausweisart={Energieausweis}
/>
</Bereich>
@@ -117,7 +117,7 @@
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
>
<GebaeudeDaten
bind:gebaeude_aufnahme_allgemein />
bind:aufnahme />
</Bereich
>
@@ -129,7 +129,7 @@
>
<StromVerbrauch
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
bind:ausweis
/>
</Bereich>
@@ -151,7 +151,7 @@
<Bereich
bereich="E"
title="Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand"
><LueftungundLeerstand bind:gebaeude_aufnahme_allgemein /></Bereich
><LueftungundLeerstand bind:aufnahme /></Bereich
>
<!-- F Angaben zur Heizungsanlage -->
@@ -160,7 +160,7 @@
><SanierungszustandHeizungsanlage
bind:images
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
bind:ausweis
/></Bereich
>
@@ -171,7 +171,7 @@
><SanierungszustandFensterTueren
bind:images
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
bind:ausweis
/></Bereich
>
@@ -181,7 +181,7 @@
><SanierungszustandWaermedammung
bind:images
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
bind:ausweis
/></Bereich
>
@@ -202,7 +202,7 @@
bind:images
bind:user
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
>
</ButtonWeiterHilfe>

View File

@@ -1,17 +1,18 @@
<script lang="ts">
import { BenutzerClient, GebaeudeAufnahmeClient, GebaeudeClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { addNotification, updateNotification } from "@ibcornelsen/ui";
import { validateAccessTokenClient } from "../../client/lib/validateAccessToken.js";
import { client } from "src/trpc.js";
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
import Overlay from "#components/Overlay.svelte";
import { validateAccessTokenClient } from "#client/lib/validateAccessToken.js";
import { verbrauchsausweisWohnenSpeichern } from "#client/lib/verbrauchsausweisWohnenSpeichern.js";
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { addNotification, updateNotification } from "#components/Notifications/index.js";
import Overlay from "#components/Overlay.svelte";
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
export let gebaeude: GebaeudeClient;
import { api } from "astro-typesafe-api/client"
export let objekt: ObjektClient;
export let images: UploadedGebaeudeBild[];
export let ausweis: VerbrauchsausweisWohnenClient;
export let user: BenutzerClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: AufnahmeClient;
async function bilderHochladen() {
// Alle Bilder hochladen
@@ -34,10 +35,13 @@
}
try {
const response = await client.v1.bilder.upload.mutate({
const response = await api.objekt._uid.bilder.PUT.fetch({
base64: image.base64,
kategorie: image.kategorie,
gebaeude_uid: gebaeude.uid
kategorie: image.kategorie
}, {
params: {
uid: objekt.uid
}
})
image.uid = response.uid
@@ -75,8 +79,8 @@
// Wir speichern den Ausweis ab und leiten auf die "ausweis-gespeichert" Seite weiter.
try {
const response = await verbrauchsausweisWohnenSpeichern(ausweis,
gebaeude,
gebaeude_aufnahme_allgemein,
objekt,
aufnahme,
images,
user)
@@ -84,22 +88,22 @@
await bilderHochladen();
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = response.uid;
gebaeude.uid = response.gebaeude_uid;
gebaeude_aufnahme_allgemein.uid = response.gebaeude_aufnahme_uid;
ausweis.uid = response.uid_ausweis;
objekt.uid = response.uid_objekt;
aufnahme.uid = response.uid_aufnahme;
return true
}
return false;
} catch (e: any) {
await client.v1.tickets.erstellen.mutate({
await api.ticket.PUT.fetch({
titel: "Ausweis konnte nicht gespeichert werden",
beschreibung: e.stack,
email: user.email ?? "",
metadata: JSON.stringify({
ausweis,
gebaeude
gebaeude: objekt
})
})
}

View File

@@ -30,48 +30,48 @@
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
// wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert...
// wenn aufnahme oder objekt nicht existiert...
export let ausweis: VerbrauchsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten?.gebaeude_bilder || [];
let aufnahme = ausweis.aufnahme || {};
let gebaeude = ausweis.aufnahme?.objekt || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.aufnahme?.objekt?.gebaeude_bilder || [];
async function spaeterWeitermachen() {
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, gebaeude_aufnahme_allgemein, images, user);
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, aufnahme, images, user);
if (result !== null) {
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid
gebaeude.uid = result.gebaeude_uid
gebaeude_aufnahme_allgemein.uid = result.gebaeude_aufnahme_uid
aufnahme.uid = result.gebaeude_aufnahme_uid
window.history.pushState({}, "", `${location.pathname}?uid=${result.uid}`);
speichernOverlayHidden = false;
}
}
function automatischAusfüllen() {
gebaeude_aufnahme_allgemein.baujahr_gebaeude = [1962];
gebaeude_aufnahme_allgemein.baujahr_heizung = [1952];
gebaeude_aufnahme_allgemein.saniert = true;
gebaeude_aufnahme_allgemein.einheiten = 1;
aufnahme.baujahr_gebaeude = [1962];
aufnahme.baujahr_heizung = [1952];
aufnahme.saniert = true;
aufnahme.einheiten = 1;
ausweis.ausstellgrund = "Vermietung";
ausweis.verbrauch_1 = 15000;
ausweis.verbrauch_2 = 14000;
ausweis.verbrauch_3 = 16000;
gebaeude_aufnahme_allgemein.flaeche = 152;
gebaeude_aufnahme_allgemein.nutzflaeche = 172;
aufnahme.flaeche = 152;
aufnahme.nutzflaeche = 172;
ausweis.keller_beheizt = true;
gebaeude_aufnahme_allgemein.brennstoff_1 = "Erdgas H";
aufnahme.brennstoff_1 = "Erdgas H";
ausweis.einheit_1 = "kWh";
ausweis.anteil_warmwasser_1 = 18;
ausweis.startdatum = moment("01.01.2019").toDate();
gebaeude_aufnahme_allgemein.plz = "21039";
gebaeude_aufnahme_allgemein.ort = "Hamburg";
gebaeude_aufnahme_allgemein.adresse = "Curslacker Deich 170";
gebaeude_aufnahme_allgemein.gebaeudeteil = "Gesamtgebäude";
aufnahme.plz = "21039";
aufnahme.ort = "Hamburg";
aufnahme.adresse = "Curslacker Deich 170";
aufnahme.gebaeudeteil = "Gesamtgebäude";
gebaeude = gebaeude;
ausweis = ausweis;
@@ -80,14 +80,14 @@
async function ausweisAbschicken(e: SubmitEvent) {
if (e && e.preventDefault) e.preventDefault();
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, gebaeude_aufnahme_allgemein, images, user);
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, aufnahme, images, user);
if (result !== null) {
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid
gebaeude.uid = result.gebaeude_uid
gebaeude_aufnahme_allgemein.uid = result.gebaeude_aufnahme_uid
aufnahme.uid = result.gebaeude_aufnahme_uid
window.history.pushState({}, "", `${location.pathname}?uid=${result.uid}`);
window.location.href = `/kundendaten?uid=${result.uid}`;
}
@@ -97,12 +97,12 @@
let speichernOverlayHidden = true;
$: {
if (gebaeude_aufnahme_allgemein.saniert
&& gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt === undefined
&& gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt === undefined) {
if (aufnahme.saniert
&& aufnahme.oberste_geschossdecke_gedaemmt === undefined
&& aufnahme.dachgeschoss_gedaemmt === undefined) {
gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt = true;
gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt = true;
aufnahme.oberste_geschossdecke_gedaemmt = true;
aufnahme.dachgeschoss_gedaemmt = true;
}
}
</script>
@@ -127,8 +127,8 @@
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:gebaeude
bind:aufnahme={aufnahme}
bind:objekt={gebaeude}
/>
</div>
@@ -153,8 +153,8 @@
<Label>A - Prüfung der Ausweisart</Label>
<Ausweisart
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:objekt={gebaeude}
bind:aufnahme={aufnahme}
bind:ausweis
/>
@@ -181,7 +181,7 @@
required
data-msg-minlength="min. 5 Zeichen"
data-msg-maxlength="max. 40 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.adresse}
bind:value={aufnahme.adresse}
/>
</div>
</div>
@@ -189,8 +189,8 @@
<!-- PLZ -->
<div class="form-group col-md-4 PLZ">
<ZipSearch
bind:zip={gebaeude_aufnahme_allgemein.plz}
bind:city={gebaeude_aufnahme_allgemein.ort}
bind:zip={aufnahme.plz}
bind:city={aufnahme.ort}
name="plz"
/>
</div>
@@ -204,7 +204,7 @@
name="ort"
data-test="ort"
readonly={true}
bind:value={gebaeude_aufnahme_allgemein.ort}
bind:value={aufnahme.ort}
type="text"
/>
</div>
@@ -227,7 +227,7 @@
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.flaeche}
bind:value={aufnahme.flaeche}
/>
</div>
</div>
@@ -240,7 +240,7 @@
name="keller"
data-test="keller"
required
bind:value={gebaeude_aufnahme_allgemein.keller}
bind:value={aufnahme.keller}
>
<option disabled>Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}
@@ -263,7 +263,7 @@
<select
name="dachgeschoss"
data-test="dachgeschoss"
bind:value={gebaeude_aufnahme_allgemein.dachgeschoss}
bind:value={aufnahme.dachgeschoss}
required
>
<option disabled>Bitte auswählen</option>
@@ -299,7 +299,7 @@
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.nutzflaeche}
bind:value={aufnahme.nutzflaeche}
/>
</div>
</div>
@@ -312,7 +312,7 @@
<div class="GRB">
<Verbrauch
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
bind:ausweis
/>
</div>
@@ -455,7 +455,7 @@
<select
name="gebaeudetyp"
data-test="gebaeudetyp"
bind:value={gebaeude_aufnahme_allgemein.gebaeudetyp}
bind:value={aufnahme.gebaeudetyp}
required
>
<option disabled>Bitte auswählen</option>
@@ -499,7 +499,7 @@
<select
name="gebaeudeteil"
data-test="gebaeudeteil"
bind:value={gebaeude_aufnahme_allgemein.gebaeudeteil}
bind:value={aufnahme.gebaeudeteil}
required
>
<option disabled>Bitte auswählen</option>
@@ -520,7 +520,7 @@
name="lueftung"
data-test="lueftung"
required
bind:value={gebaeude_aufnahme_allgemein.lueftung}
bind:value={aufnahme.lueftung}
>
<option disabled>Bitte auswählen</option>
<option value="Fensterlüftung">Fensterlüftung</option>
@@ -546,7 +546,7 @@
name="kuehlung"
data-test="kuehlung"
required
bind:value={gebaeude_aufnahme_allgemein.kuehlung}
bind:value={aufnahme.kuehlung}
>
<option disabled>Bitte auswählen</option>
<option value="1">vorhanden</option>
@@ -568,7 +568,7 @@
data-test="leerstand"
maxlength="2"
type="number"
bind:value={gebaeude_aufnahme_allgemein.leerstand}
bind:value={aufnahme.leerstand}
/>
</div>
</div>
@@ -580,7 +580,7 @@
>F - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
Gebäudes</Label
>
<BilderZusatzsysteme bind:images bind:gebaeude bind:gebaeude_aufnahme_allgemein bind:ausweis />
<BilderZusatzsysteme bind:images bind:gebaeude bind:aufnahme bind:ausweis />
<hr />
<div class="flex flex-row justify-between">
<Hilfe />
@@ -596,7 +596,7 @@
</RawNotification>
{/each}
{#if auditBedarfsausweisBenoetigt(ausweis, gebaeude_aufnahme_allgemein)}
{#if auditBedarfsausweisBenoetigt(ausweis, aufnahme)}
<RawNotification
notification={{
message: "Bedarfsausweis benötigt!",
@@ -612,7 +612,7 @@
</RawNotification>
{/if}
{#await auditPlzNichtErkannt(gebaeude_aufnahme_allgemein) then result}
{#await auditPlzNichtErkannt(objekt) then result}
{#if result}
<RawNotification
notification={{
@@ -630,7 +630,7 @@
{/if}
{/await}
{#if auditHeizungGebaeudeBaujahr(gebaeude_aufnahme_allgemein)}
{#if auditHeizungGebaeudeBaujahr(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -639,7 +639,7 @@
dismissable: true,
onUserDismiss: () => {
hidden.add(AuditType.HEIZUNG_GEBAEUDE_BAUJAHR);
gebaeude_aufnahme_allgemein = gebaeude_aufnahme_allgemein;
aufnahme = aufnahme;
},
type: "warning",
}}
@@ -649,7 +649,7 @@
</RawNotification>
{/if}
{#if auditHeizungJuengerDreiJahre(gebaeude_aufnahme_allgemein)}
{#if auditHeizungJuengerDreiJahre(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -719,7 +719,7 @@
{/if}
{/await}
{#if auditWohnFlaeche(gebaeude_aufnahme_allgemein)}
{#if auditWohnFlaeche(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -758,7 +758,7 @@
</RawNotification>
{/if}
{#if auditLeerStand(gebaeude_aufnahme_allgemein)}
{#if auditLeerStand(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -778,7 +778,7 @@
</RawNotification>
{/if}
{#if auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein).length > 0}
{#if auditVerbrauchAbweichung(ausweis, aufnahme).length > 0}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -794,14 +794,14 @@
>
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung(
ausweis,
gebaeude_aufnahme_allgemein,
)[0]} und {auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein)[1]} beträgt mehr
aufnahme,
)[0]} und {auditVerbrauchAbweichung(ausweis, aufnahme)[1]} beträgt mehr
als 30% und sie haben keinen Leerstand angegeben. Sind sie sich sicher,
dass das stimmt?
</RawNotification>
{/if}
{#await auditEndEnergie(ausweis, gebaeude, gebaeude_aufnahme_allgemein) then result}
{#await auditEndEnergie(ausweis, gebaeude, aufnahme) then result}
{#if result}
<RawNotification
notification={{
@@ -823,7 +823,7 @@
{/if}
{/await}
{#if auditWohnflaecheGroesserGesamtflaeche(gebaeude_aufnahme_allgemein)}
{#if auditWohnflaecheGroesserGesamtflaeche(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",

View File

@@ -47,41 +47,39 @@
VerbrauchsausweisWohnenClient,
BenutzerClient,
UploadedGebaeudeBild,
ObjektClient,
AufnahmeClient,
} from "#components/Ausweis/types.js";
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
import { Enums } from "@ibcornelsen/database/client";
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
// wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert...
// wenn aufnahme oder objekt nicht existiert...
export let ausweis: VerbrauchsausweisWohnenClient;
export let objekt: ObjektClient
export let aufnahme: AufnahmeClient
export let user: BenutzerClient = {} as BenutzerClient;
let aufnahme = ausweis.aufnahme || {};
let objekt =
ausweis.aufnahme?.objekt || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] =
ausweis.aufnahme?.objekt
?.gebaeude_bilder || [];
export let bilder: UploadedGebaeudeBild[] = []
async function spaeterWeitermachen() {
const result = await verbrauchsausweisWohnenSpeichern(
ausweis,
objekt,
aufnahme,
images,
bilder,
user
);
if (result !== null) {
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid;
objekt.uid = result.gebaeude_uid;
aufnahme.uid = result.gebaeude_aufnahme_uid;
ausweis.uid = result.uid_ausweis;
objekt.uid = result.uid_objekt;
aufnahme.uid = result.uid_aufnahme;
window.history.pushState(
{},
"",
`${location.pathname}?uid=${result.uid}`
`${location.pathname}?uid=${result.uid_ausweis}`
);
speichernOverlayHidden = false;
}
@@ -126,22 +124,22 @@
ausweis,
objekt,
aufnahme,
images,
bilder,
user
);
if (result !== null) {
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid;
objekt.uid = result.gebaeude_uid;
aufnahme.uid = result.gebaeude_aufnahme_uid;
ausweis.uid = result.uid_ausweis;
objekt.uid = result.uid_objekt;
aufnahme.uid = result.uid_aufnahme;
window.history.pushState(
{},
"",
`${location.pathname}?uid=${result.uid}`
`${location.pathname}?uid=${result.uid_ausweis}`
);
window.location.href = `/kundendaten?uid=${result.uid}`;
window.location.href = `/kundendaten?uid=${result.uid_ausweis}`;
}
}
@@ -160,6 +158,7 @@
}
}
const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen"
</script>
<Overlay bind:hidden={speichernOverlayHidden}>
@@ -186,16 +185,16 @@
<div id="performance-box" class="w-full box relative px-4 order-2 2xl:order-1 self-stretch grid grid-cols-1">
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein={aufnahme}
bind:gebaeude={objekt}
bind:aufnahme={aufnahme}
bind:objekt={objekt}
/>
</div>
<div id="progress-box" class="w-full box relative px-4 py-3 text-center order-1 2xl:order-2 self-stretch">
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
<h2 class="text-primary text-xl">{Energieausweis} {PRICES.VerbrauchsausweisWohnen[0]}</h2>
<ProgressBar progress={0} />
<h2 class="text-primary text-xl">{ausweisart} {PRICES.VerbrauchsausweisWohnen[0]}</h2>
<Progressbar progress={0} />
</div>
</div>
@@ -211,10 +210,10 @@
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart
bind:gebaeude={objekt}
bind:gebaeude_aufnahme_allgemein={aufnahme}
bind:objekt={objekt}
bind:aufnahme={aufnahme}
bind:ausweis
{Energieausweis}
{ausweisart}
/>
</Bereich>
@@ -223,7 +222,7 @@
<Bereich
bereich="B"
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
><GebaeudeDaten bind:gebaeude_aufnahme_allgemein={aufnahme} /></Bereich
><GebaeudeDaten bind:aufnahme={aufnahme} /></Bereich
>
<!-- C Eingabe von 3 zusammenhängenden Verbrauchsjahren -->
@@ -233,7 +232,7 @@
title="Eingabe von 3 zusammenhängenden Verbrauchsjahren"
><Verbrauch
bind:gebaeude={objekt}
bind:gebaeude_aufnahme_allgemein={aufnahme}
bind:aufnahme={aufnahme}
bind:ausweis
/></Bereich
>
@@ -251,16 +250,16 @@
<Bereich
bereich="E"
title="Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand"
><LueftungundLeerstand bind:gebaeude_aufnahme_allgemein={aufnahme} /></Bereich
><LueftungundLeerstand bind:aufnahme={aufnahme} /></Bereich
>
<!-- F Angaben zur Heizungsanlage -->
<Bereich bereich="F" title="Angaben zur Heizunganlage"
><SanierungszustandHeizungsanlage
bind:images
bind:images={bilder}
bind:gebaeude={objekt}
bind:gebaeude_aufnahme_allgemein={aufnahme}
bind:aufnahme={aufnahme}
bind:ausweis
/></Bereich
>
@@ -269,9 +268,9 @@
<Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
><SanierungszustandFensterTueren
bind:images
bind:images={bilder}
bind:gebaeude={objekt}
bind:gebaeude_aufnahme_allgemein={aufnahme}
bind:aufnahme={aufnahme}
bind:ausweis
/></Bereich
>
@@ -279,9 +278,9 @@
<Bereich bereich="H" title="Angaben zur Wärmedämmung"
><SanierungszustandWaermedammung
bind:images
bind:images={bilder}
bind:gebaeude={objekt}
bind:gebaeude_aufnahme_allgemein={aufnahme}
bind:aufnahme={aufnahme}
bind:ausweis
/></Bereich
>
@@ -290,7 +289,7 @@
<Bereich bereich="I" title="Gebäudebild und Energieausweis PDF Vorschau"
><AusweisPreviewContainer
bind:images
bind:images={bilder}
bind:ausweis
bind:gebaeude={objekt}
/></Bereich
@@ -299,10 +298,10 @@
<ButtonWeiterHilfe {spaeterWeitermachen}
bind:ausweis
bind:images
bind:images={bilder}
bind:user
bind:gebaeude={objekt}
bind:gebaeude_aufnahme_allgemein={aufnahme}
bind:aufnahme={aufnahme}
>
</ButtonWeiterHilfe>
@@ -364,7 +363,7 @@
</RawNotification>
{/if}
{#await auditPlzNichtErkannt(aufnahme) then result}
{#await auditPlzNichtErkannt(objekt) then result}
{#if result}
<RawNotification
notification={{

View File

@@ -31,48 +31,48 @@
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
// wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert...
// wenn aufnahme oder objekt nicht existiert...
export let ausweis: VerbrauchsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten?.gebaeude_bilder || [];
let aufnahme = ausweis.aufnahme || {};
let gebaeude = ausweis.aufnahme?.objekt || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.aufnahme?.objekt?.gebaeude_bilder || [];
async function spaeterWeitermachen() {
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, gebaeude_aufnahme_allgemein, images, user);
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, aufnahme, images, user);
if (result !== null) {
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid
gebaeude.uid = result.gebaeude_uid
gebaeude_aufnahme_allgemein.uid = result.gebaeude_aufnahme_uid
aufnahme.uid = result.gebaeude_aufnahme_uid
window.history.pushState({}, "", `${location.pathname}?uid=${result.uid}`);
speichernOverlayHidden = false;
}
}
function automatischAusfüllen() {
gebaeude_aufnahme_allgemein.baujahr_gebaeude = [1962];
gebaeude_aufnahme_allgemein.baujahr_heizung = [1952];
gebaeude_aufnahme_allgemein.saniert = true;
gebaeude_aufnahme_allgemein.einheiten = 1;
aufnahme.baujahr_gebaeude = [1962];
aufnahme.baujahr_heizung = [1952];
aufnahme.saniert = true;
aufnahme.einheiten = 1;
ausweis.ausstellgrund = "Vermietung";
ausweis.verbrauch_1 = 15000;
ausweis.verbrauch_2 = 14000;
ausweis.verbrauch_3 = 16000;
gebaeude_aufnahme_allgemein.flaeche = 152;
gebaeude_aufnahme_allgemein.nutzflaeche = 172;
aufnahme.flaeche = 152;
aufnahme.nutzflaeche = 172;
ausweis.keller_beheizt = true;
gebaeude_aufnahme_allgemein.brennstoff_1 = "Erdgas H";
aufnahme.brennstoff_1 = "Erdgas H";
ausweis.einheit_1 = "kWh";
ausweis.anteil_warmwasser_1 = 18;
ausweis.startdatum = moment("01.01.2019").toDate();
gebaeude_aufnahme_allgemein.plz = "21039";
gebaeude_aufnahme_allgemein.ort = "Hamburg";
gebaeude_aufnahme_allgemein.adresse = "Curslacker Deich 170";
gebaeude_aufnahme_allgemein.gebaeudeteil = "Gesamtgebäude";
aufnahme.plz = "21039";
aufnahme.ort = "Hamburg";
aufnahme.adresse = "Curslacker Deich 170";
aufnahme.gebaeudeteil = "Gesamtgebäude";
gebaeude = gebaeude;
ausweis = ausweis;
@@ -81,14 +81,14 @@
async function ausweisAbschicken(e: SubmitEvent) {
if (e && e.preventDefault) e.preventDefault();
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, gebaeude_aufnahme_allgemein, images, user);
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, aufnahme, images, user);
if (result !== null) {
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid
gebaeude.uid = result.gebaeude_uid
gebaeude_aufnahme_allgemein.uid = result.gebaeude_aufnahme_uid
aufnahme.uid = result.gebaeude_aufnahme_uid
window.history.pushState({}, "", `${location.pathname}?uid=${result.uid}`);
window.location.href = `/kundendaten?uid=${result.uid}`;
}
@@ -98,12 +98,12 @@
let speichernOverlayHidden = true;
$: {
if (gebaeude_aufnahme_allgemein.saniert
&& gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt === undefined
&& gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt === undefined) {
if (aufnahme.saniert
&& aufnahme.oberste_geschossdecke_gedaemmt === undefined
&& aufnahme.dachgeschoss_gedaemmt === undefined) {
gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt = true;
gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt = true;
aufnahme.oberste_geschossdecke_gedaemmt = true;
aufnahme.dachgeschoss_gedaemmt = true;
}
}
</script>
@@ -128,7 +128,7 @@
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
bind:gebaeude
/>
</div>-->
@@ -155,8 +155,8 @@ xs:grid-cols-2
<div class="bereich-box">
<Ausweisart
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:objekt={gebaeude}
bind:aufnahme={aufnahme}
bind:ausweis
/>
@@ -192,7 +192,7 @@ xs:grid-cols-2
required
data-msg-minlength="min. 5 Zeichen"
data-msg-maxlength="max. 40 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.adresse}
bind:value={aufnahme.adresse}
/>
</div>
</div>
@@ -201,8 +201,8 @@ xs:grid-cols-2
<div class="PLZ">
<Label>* PLZ</Label>
<ZipSearch
bind:zip={gebaeude_aufnahme_allgemein.plz}
bind:city={gebaeude_aufnahme_allgemein.ort}
bind:zip={aufnahme.plz}
bind:city={aufnahme.ort}
name="plz"
/>
</div>
@@ -217,7 +217,7 @@ xs:grid-cols-2
name="ort"
data-test="ort"
readonly={true}
bind:value={gebaeude_aufnahme_allgemein.ort}
bind:value={aufnahme.ort}
type="text"
/>
</div>
@@ -248,7 +248,7 @@ xs:grid-cols-2
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.flaeche}
bind:value={aufnahme.flaeche}
/>
</div>
</div>
@@ -272,7 +272,7 @@ xs:grid-cols-2
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude_aufnahme_allgemein.nutzflaeche}
bind:value={aufnahme.nutzflaeche}
/>
</div>
</div>
@@ -285,7 +285,7 @@ xs:grid-cols-2
name="keller"
data-test="keller"
required
bind:value={gebaeude_aufnahme_allgemein.keller}
bind:value={aufnahme.keller}
>
<option disabled>Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}
@@ -308,7 +308,7 @@ xs:grid-cols-2
<select
name="dachgeschoss"
data-test="dachgeschoss"
bind:value={gebaeude_aufnahme_allgemein.dachgeschoss}
bind:value={aufnahme.dachgeschoss}
required
>
<option disabled>Bitte auswählen</option>
@@ -345,7 +345,7 @@ xs:grid-cols-2
<Verbrauch
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:aufnahme
bind:ausweis
/>
</div>
@@ -486,7 +486,7 @@ xs:grid-cols-2
</RawNotification>
{/each}
{#if auditBedarfsausweisBenoetigt(ausweis, gebaeude_aufnahme_allgemein)}
{#if auditBedarfsausweisBenoetigt(ausweis, aufnahme)}
<RawNotification
notification={{
message: "Bedarfsausweis benötigt!",
@@ -502,7 +502,7 @@ xs:grid-cols-2
</RawNotification>
{/if}
{#await auditPlzNichtErkannt(gebaeude_aufnahme_allgemein) then result}
{#await auditPlzNichtErkannt(objekt) then result}
{#if result}
<RawNotification
notification={{
@@ -520,7 +520,7 @@ xs:grid-cols-2
{/if}
{/await}
{#if auditHeizungGebaeudeBaujahr(gebaeude_aufnahme_allgemein)}
{#if auditHeizungGebaeudeBaujahr(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -529,7 +529,7 @@ xs:grid-cols-2
dismissable: true,
onUserDismiss: () => {
hidden.add(AuditType.HEIZUNG_GEBAEUDE_BAUJAHR);
gebaeude_aufnahme_allgemein = gebaeude_aufnahme_allgemein;
aufnahme = aufnahme;
},
type: "warning",
}}
@@ -539,7 +539,7 @@ xs:grid-cols-2
</RawNotification>
{/if}
{#if auditHeizungJuengerDreiJahre(gebaeude_aufnahme_allgemein)}
{#if auditHeizungJuengerDreiJahre(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -609,7 +609,7 @@ xs:grid-cols-2
{/if}
{/await}
{#if auditWohnFlaeche(gebaeude_aufnahme_allgemein)}
{#if auditWohnFlaeche(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -648,7 +648,7 @@ xs:grid-cols-2
</RawNotification>
{/if}
{#if auditLeerStand(gebaeude_aufnahme_allgemein)}
{#if auditLeerStand(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -668,7 +668,7 @@ xs:grid-cols-2
</RawNotification>
{/if}
{#if auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein).length > 0}
{#if auditVerbrauchAbweichung(ausweis, aufnahme).length > 0}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
@@ -684,14 +684,14 @@ xs:grid-cols-2
>
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung(
ausweis,
gebaeude_aufnahme_allgemein,
)[0]} und {auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein)[1]} beträgt mehr
aufnahme,
)[0]} und {auditVerbrauchAbweichung(ausweis, aufnahme)[1]} beträgt mehr
als 30% und sie haben keinen Leerstand angegeben. Sind sie sich sicher,
dass das stimmt?
</RawNotification>
{/if}
{#await auditEndEnergie(ausweis, gebaeude, gebaeude_aufnahme_allgemein) then result}
{#await auditEndEnergie(ausweis, gebaeude, aufnahme) then result}
{#if result}
<RawNotification
notification={{
@@ -713,7 +713,7 @@ xs:grid-cols-2
{/if}
{/await}
{#if auditWohnflaecheGroesserGesamtflaeche(gebaeude_aufnahme_allgemein)}
{#if auditWohnflaecheGroesserGesamtflaeche(aufnahme)}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",

View File

@@ -1,9 +1,41 @@
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "@ibcornelsen/database/server";
import { AufnahmeSchema, prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
export const PATCH = defineApiRoute({
fetch(input, context) {},
input: AufnahmeSchema.omit({
id: true,
uid: true,
benutzer_id: true,
objekt_id: true,
}),
output: z.void(),
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { uid } = ctx.params
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid,
benutzer_id: user.id
},
});
if (!aufnahme) {
throw new APIError({
code: "NOT_FOUND",
message: "Aufnahme mit dieser UID existiert nicht oder gehört nicht dem aktuellen Benutzer."
})
}
await prisma.aufnahme.update({
where: {
uid
},
data: input
})
},
});
export const GET = defineApiRoute({

View File

@@ -0,0 +1,59 @@
import { authorizationMiddleware } from "#lib/middleware/authorization.js"
import { AufnahmeSchema, ObjektSchema, prisma } from "@ibcornelsen/database/server"
import { APIError, defineApiRoute } from "astro-typesafe-api/server"
import { z } from "zod"
export const PUT = defineApiRoute({
input: z.object({
aufnahme: AufnahmeSchema.omit({
id: true,
uid: true,
benutzer_id: true,
objekt_id: true,
}).merge(z.object({
baujahr_klima: z.array(z.number().int().positive()).optional()
})),
uid_objekt: z.string().uuid()
}),
output: z.object({
uid: z.string().uuid()
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const objekt = await prisma.objekt.findUnique({
where: {
uid: input.uid_objekt,
benutzer: {
id: user.id
}
}
})
if (!objekt) {
throw new APIError({
code: "NOT_FOUND",
message: "Objekt konnte nicht gefunden werden oder gehört nicht diesem Benutzer."
})
}
const aufnahme = await prisma.aufnahme.create({
data: {
...input.aufnahme,
benutzer: {
connect: {
id: user.id
}
},
objekt: {
connect: {
uid: input.uid_objekt
}
}
},
})
return {
uid: aufnahme.uid
}
},
})

View File

@@ -5,7 +5,7 @@ import { TokenType, encodeToken } from "../../../lib/auth/token.js";
import { TRPCError } from "@trpc/server";
import { defineApiRoute } from "astro-typesafe-api/server";
export const tRPC_V1_BenutzerGetAccessTokenProcedure = defineApiRoute({
export const GET = defineApiRoute({
meta: {
description:
"Erstellt, basierend auf einem existierenden und gültigen Refresh Tokens, einen neuen Access Token, welcher zur Authentifizierung genutzt werden kann. Der resultierende Access Token ist nur 2 Tage gültig und muss danach neu generiert werden. Diese Funktion gibt ebenfalls einen neuen Refresh Token zurück, der alte wird dadurch invalidiert.",

View File

@@ -0,0 +1,77 @@
import { z } from "zod";
import moment from "moment";
import { prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
export const GET = defineApiRoute({
input: z.object({
plz: z.string().min(4).max(5),
startdatum: z.coerce.date(),
enddatum: z.coerce.date(),
genauigkeit: z.enum(["months", "years"]),
}),
output: z.array(
z.object({
month: z.number(),
year: z.number(),
klimafaktor: z.number(),
})
),
async fetch(input, ctx) {
const start = moment(input.startdatum);
const end = moment(input.enddatum);
if (start.isSameOrAfter(end)) {
throw new APIError({
code: "PRECONDITION_FAILED",
message: "Das Startdatum kann nicht vor dem Enddatum liegen.",
});
}
const intervals = [];
let currentDate = start.clone();
while (currentDate.isSameOrBefore(end)) {
let copy = currentDate.clone();
intervals.push(copy);
currentDate.add(1, input.genauigkeit);
}
let klimafaktoren = await prisma.klimafaktoren.findMany({
where: {
plz: input.plz,
month: intervals[0].month(),
OR: intervals.map((date) => {
return {
year: date.year(),
};
}),
},
});
if (!klimafaktoren) {
throw new APIError({
code: "NOT_FOUND",
message:
"Die Klimafaktoren konnten nicht geladen werden. Das kann daran liegen, dass sie für diesen Zeitraum oder Ort nicht verfügbar sind.",
});
}
// NOTE: Sollten wir hier lieber den Output padden und trotzdem die gefundenen zurückgeben?
if (klimafaktoren.length !== intervals.length) {
throw new APIError({
code: "NOT_FOUND",
message:
"Für diesen Zeitraum konnten nicht alle Klimafaktoren gefunden werden.",
});
}
return klimafaktoren.map((klimafaktor) => ({
month: klimafaktor.month,
year: klimafaktor.year,
klimafaktor: klimafaktor.klimafaktor,
}));
},
});

View File

@@ -0,0 +1,122 @@
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { GebaeudeBilderSchema, prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "astro:content";
import isBase64 from "is-base64";
export const PUT = defineApiRoute({
input: GebaeudeBilderSchema.pick({
kategorie: true,
}).merge(z.object({
base64: z.string()
})),
output: z.object({
uid: z.string({ description: "Die UID des Bildes." })
}),
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const base64 = input.base64;
if (!isBase64(base64, { mimeRequired: true })) {
throw new APIError({
code: "BAD_REQUEST",
message: "Das Bild ist nicht base64 kodiert.",
});
}
let objekt = await prisma.objekt.findUnique({
where: {
uid: ctx.params.uid,
benutzer_id: user.id
},
});
if (!objekt) {
throw new APIError({
code: "NOT_FOUND",
message: "Objekt nicht gefunden oder gehört einem anderen Benutzer.",
});
}
const dataWithoutPrefix = base64.replace(
/^data:image\/\w+;base64,/,
""
);
const buffer = Buffer.from(dataWithoutPrefix, "base64");
const bild = await prisma.gebaeudeBilder.create({
data: {
kategorie: input.kategorie,
objekt: {
connect: {
id: objekt.id,
},
},
},
select: {
uid: true,
},
});
const filePath = `/persistent/images/${bild.uid}.webp`;
try {
// Wir optimieren das Bild und konvertieren es in WebP
// TODO: Sharp scheint nicht zu funktionieren, wir müssen das nochmal testen
// const optimizedBuffer = await sharp(buffer).webp({ quality: 80 }).toArray();
await Bun.write(filePath, buffer)
} catch(e) {
// Bild wurde nicht gespeichert, wir löschen den Eintrag wieder
await prisma.gebaeudeBilder.delete({
where: {
uid: bild.uid
}
})
// Und geben einen Fehler zurück
throw new APIError({
code: "INTERNAL_SERVER_ERROR",
message: "Bild konnte nicht gespeichert werden.",
});
}
return {
uid: bild.uid
};
},
})
export const GET = defineApiRoute({
middleware: authorizationMiddleware,
output: z.array(GebaeudeBilderSchema.pick({
kategorie: true,
uid: true
})),
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const objekt = await prisma.objekt.findUnique({
where: {
uid
},
select: {
benutzer_id: true,
gebaeude_bilder: {
select: {
kategorie: true,
uid: true
}
}
}
})
if (!objekt || objekt.benutzer_id !== user.id) {
throw new APIError({
code: "FORBIDDEN",
message: "Objekt existiert nicht oder gehört einem anderen Benutzer."
})
}
return objekt.gebaeude_bilder
},
})

View File

@@ -1,10 +1,44 @@
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "@ibcornelsen/database/server";
import { ObjektSchema, prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
export const PATCH = defineApiRoute({
fetch(input, context) {},
});
input: ObjektSchema.omit({
uid: true,
id: true,
benutzer_id: true
}),
output: z.void(),
headers: {
"Authorization": z.string()
},
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const objekt = await prisma.objekt.findUnique({
where: {
uid: ctx.params.uid,
benutzer: {
id: user.id
}
}
})
if (!objekt) {
throw new APIError({
code: "NOT_FOUND",
message: "Objekt konnte nicht gefunden werden."
})
}
await prisma.objekt.update({
where: {
uid: ctx.params.uid
},
data: input
})
},
})
export const GET = defineApiRoute({
meta: {
@@ -24,8 +58,8 @@ export const GET = defineApiRoute({
}
},
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const objekt = await prisma.objekt.findUnique({
where: {

View File

@@ -3,9 +3,31 @@ import { ObjektSchema, prisma } from "@ibcornelsen/database/server";
import { defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
export const POST = defineApiRoute({
fetch(input, context) {
export const PUT = defineApiRoute({
input: ObjektSchema.omit({
id: true,
uid: true,
benutzer_id: true
}),
output: z.object({
uid: z.string().uuid()
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const objekt = await prisma.objekt.create({
data: {
...input,
benutzer: {
connect: {
id: user.id
}
}
},
})
return {
uid: objekt.uid
}
},
})

View File

@@ -0,0 +1,49 @@
import { z } from "zod";
import { prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
export const GET = defineApiRoute({
input: z.object({
plz: z.string().min(1).max(5),
limit: z.number().int().max(50).min(1).default(10).optional(),
}),
output: z.array(
z.object({
plz: z.string().min(4).max(5),
stadt: z.string(),
bundesland: z.string(),
landkreis: z.string(),
lat: z.number(),
lon: z.number(),
})
),
async fetch(input, context) {
const plz = input.plz;
const postleitzahlen = await prisma.postleitzahlen.findMany({
where: {
plz: {
startsWith: plz,
},
},
take: input.limit,
select: {
plz: true,
stadt: true,
bundesland: true,
landkreis: true,
lat: true,
lon: true,
},
});
if (postleitzahlen.length === 0) {
throw new APIError({
code: "NOT_FOUND",
message: "Postleitzahl nicht gefunden",
});
}
return postleitzahlen;
},
});

73
src/pages/api/ticket.ts Normal file
View File

@@ -0,0 +1,73 @@
import { z } from "zod";
import { TicketsSchema, prisma } from "@ibcornelsen/database/server";
import { defineApiRoute } from "astro-typesafe-api/server";
import { maybeAuthorizationMiddleware } from "#lib/middleware/authorization.js";
export const PUT = defineApiRoute({
meta: {
contentTypes: ["application/json"],
description:
"Erstellt ein neues Support Ticket und weist den Ersteller diesem zu, falls ein Authorization Header mitgegeben wurde.",
summary: "Erstellt ein neues Support Ticket.",
tags: ["Tickets"],
},
input: TicketsSchema.omit({
bearbeiter_id: true,
benutzer_id: true,
created_at: true,
deleted_at: true,
id: true,
prioritaet: true,
status: true,
uid: true,
updated_at: true,
}),
output: z.object({
uid: z.string().uuid(),
}),
middleware: maybeAuthorizationMiddleware,
async fetch(input, ctx, user) {
if (user === null) {
// Der Benutzer ist nicht authentifiziert.
// Wir erstellen das Ticket anonym.
const ticket = await prisma.tickets.create({
data: {
beschreibung: input.beschreibung,
email: input.email,
titel: input.titel,
metadata: input.metadata,
},
select: {
uid: true,
},
});
return {
uid: ticket.uid,
};
}
// Der Benutzer ist authentifiziert.
// Wir verlinken den Benutzer und das Ticket.
const ticket = await prisma.tickets.create({
data: {
benutzer: {
connect: {
id: user.id,
},
},
beschreibung: input.beschreibung,
email: input.email,
titel: input.titel,
metadata: input.metadata,
},
select: {
uid: true,
},
});
return {
uid: ticket.uid,
};
},
});

View File

@@ -1,71 +0,0 @@
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
export const PATCH = defineApiRoute({
fetch(input, context) {},
});
export const GET = defineApiRoute({
meta: {
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
tags: ["Gebäude"],
headers: {
"Authorization": {
description: "Ein gültiger Authentifizierungstoken",
required: true,
allowEmptyValue: false,
examples: {
Bearer: {
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
}
}
},
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid: input.uid,
},
include: {
benutzer: true,
aufnahme: {
include: {
objekt: {
include: {
gebaeude_bilder: true
},
},
rechnungen: true,
events: {
include: {
benutzer: {
select: {
uid: true
}
}
},
orderBy: {
date: "asc"
}
}
},
}
},
});
if (!ausweis || (ausweis.benutzer_id !== null && ausweis.benutzer_id !== user.id)) {
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis konnte nicht gefunden werden.",
});
}
return ausweis
},
});

View File

@@ -0,0 +1,117 @@
import { exclude } from "#lib/exclude.js";
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma, VerbrauchsausweisWohnenSchema } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
export const PATCH = defineApiRoute({
input: VerbrauchsausweisWohnenSchema.omit({
uid: true,
id: true,
benutzer_id: true,
aufnahme_id: true,
}),
output: z.void(),
headers: {
"Authorization": z.string()
},
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const objekt = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid: ctx.params.uid,
benutzer: {
id: user.id
}
}
})
if (!objekt) {
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
})
}
await prisma.verbrauchsausweisWohnen.update({
where: {
uid: ctx.params.uid
},
data: input
})
},
})
export const GET = defineApiRoute({
meta: {
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
tags: ["Gebäude"],
headers: {
"Authorization": {
description: "Ein gültiger Authentifizierungstoken",
required: true,
allowEmptyValue: false,
examples: {
Bearer: {
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
}
}
},
output: VerbrauchsausweisWohnenSchema.merge(z.object({
uid_aufnahme: z.string().uuid(),
uid_objekt: z.string().uuid(),
uid_benutzer: z.string().uuid().optional()
})).omit({
id: true,
aufnahme_id: true,
benutzer_id: true,
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
console.log(uid);
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid,
benutzer_id: user.id
},
include: {
benutzer: {
select: {
uid: true
}
},
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true
}
}
}
}
}
});
if (!ausweis) {
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis konnte nicht gefunden werden.",
});
}
return {
uid_aufnahme: ausweis.aufnahme.uid,
uid_objekt: ausweis.aufnahme.objekt.uid,
uid_benutzer: ausweis.benutzer?.uid,
...exclude(ausweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
}
},
});

View File

@@ -1,27 +1,101 @@
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "@ibcornelsen/database/server";
import { prisma, VerbrauchsausweisWohnenSchema } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
export const PATCH = defineApiRoute({
fetch(input, context) {},
});
export const PUT = defineApiRoute({
meta: {
contentTypes: ["application/json"],
description:
"Erstellt einen neuen Verbrauchsausweis für Wohngebäude nach dem Schema der EnEV von 2016. Als Input wird ein bestehendes Gebäude benötigt. Falls keine UID einer bestehenden Gebäudeaufnahme mitgegeben wird, wird automatisch eine erstellt.",
tags: ["Verbrauchsausweis Wohnen"],
},
input: z.object({
ausweis: VerbrauchsausweisWohnenSchema.omit({
id: true,
benutzer_id: true,
uid: true,
aufnahme_id: true
}),
uid_aufnahme: z.string().uuid()
}),
output: z.object({
uid: z.string().uuid(),
objekt_uid: z.string().uuid(),
aufnahme_uid: z.string().uuid(),
}),
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: input.uid_aufnahme
}
})
if (!aufnahme || aufnahme.benutzer_id !== user.id) {
throw new APIError({
code: "FORBIDDEN",
message: "Aufnahme konnte nicht gefunden werden oder gehört nicht zu diesem Benutzer."
})
}
const createdAusweis = await prisma.verbrauchsausweisWohnen.create({
data: {
...input.ausweis,
benutzer: {
connect: {
id: user.id,
},
},
aufnahme: {
connect: {
uid: aufnahme.uid,
},
},
},
select: {
uid: true,
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true,
},
},
},
},
},
});
return {
uid: createdAusweis.uid,
objekt_uid: createdAusweis.aufnahme.objekt.uid,
aufnahme_uid: createdAusweis.aufnahme.uid,
};
},
});
export const GET = defineApiRoute({
meta: {
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
tags: ["Gebäude"],
headers: {
"Authorization": {
Authorization: {
description: "Ein gültiger Authentifizierungstoken",
required: true,
allowEmptyValue: false,
examples: {
Bearer: {
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
}
}
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
},
},
},
},
},
middleware: authorizationMiddleware,
async fetch(input, context, user) {
@@ -37,7 +111,7 @@ export const GET = defineApiRoute({
include: {
objekt: {
include: {
gebaeude_bilder: true
gebaeude_bilder: true,
},
},
rechnungen: true,
@@ -45,20 +119,23 @@ export const GET = defineApiRoute({
include: {
benutzer: {
select: {
uid: true
}
}
uid: true,
},
},
},
orderBy: {
date: "asc"
}
}
date: "asc",
},
},
},
}
},
},
});
if (!ausweis || (ausweis.benutzer_id !== null && ausweis.benutzer_id !== user.id)) {
if (
!ausweis ||
(ausweis.benutzer_id !== null && ausweis.benutzer_id !== user.id)
) {
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
@@ -66,6 +143,6 @@ export const GET = defineApiRoute({
});
}
return ausweis
return ausweis;
},
});

View File

@@ -7,7 +7,7 @@ import { createCaller } from "#lib/caller";
const uid = Astro.url.searchParams.get("uid");
let ausweis: Partial<BedarfsausweisWohnenClient> = {
gebaeude_aufnahme_allgemein: { gebaeude_stammdaten: {} },
aufnahme: { objekt: {} },
energiequelle_2_nutzung: []
} as Partial<BedarfsausweisWohnenClient>;

View File

@@ -7,7 +7,7 @@ import { createCaller } from "#lib/caller";
const uid = Astro.url.searchParams.get("uid");
let ausweis: VerbrauchsausweisGewerbeClient = {
gebaeude_aufnahme_allgemein: { gebaeude_stammdaten: {} },
aufnahme: { objekt: {} },
} as VerbrauchsausweisGewerbeClient;
const caller = createCaller(Astro);

View File

@@ -1,27 +1,56 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { createCaller } from "../../../astro-typesafe-api-caller.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
const uid = Astro.url.searchParams.get("uid");
let ausweis: VerbrauchsausweisWohnenClient = {
aufnahme: { objekt: {} },
} as VerbrauchsausweisWohnenClient;
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: UploadedGebaeudeBild[] = []
const caller = await createCaller(Astro);
const caller = createCaller(Astro);
if (uid) {
try {
ausweis = await caller["verbrauchsausweis-wohnen"]._id.GET.fetch(null, {
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, {
headers: {
authorization: "Basic "
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
id: "123"
uid
}
});
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_aufnahme
}
})
objekt = await caller.objekt._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
}
})
if (!ausweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
@@ -38,5 +67,5 @@ if (uid) {
---
<AusweisLayout title="Verbrauchsausweis erstellen">
<VerbrauchsausweisWohnenModule client:load ausweis={ausweis} />
<VerbrauchsausweisWohnenModule client:load {ausweis} {objekt} {aufnahme} {bilder} />
</AusweisLayout>

View File

@@ -17,7 +17,7 @@ describe('Energieverbrauch', async () => {
let missingKlimafaktoren: boolean = false;
test("Klimafaktoren", async () => {
console.log("PLZ: " + ausweisNeu.gebaeude_aufnahme_allgemein.plz)
console.log("PLZ: " + ausweisNeu.aufnahme.plz)
console.log("Startdatum: " + ausweisNeu.startdatum)
expect(berechnungen?.klimafaktoren).toHaveLength(3)
try {