Merge branch 'dev-moritz'

This commit is contained in:
Moritz Utcke
2025-02-02 20:49:01 +07:00
199 changed files with 11024 additions and 5394 deletions

View File

@@ -0,0 +1,22 @@
import { createCallerFactory } from "astro-typesafe-api/server";
export const createCaller = createCallerFactory({
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
"postleitzahlen": await import("../src/pages/api/postleitzahlen.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"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
"objekt": await import("../src/pages/api/objekt/index.ts"),
"ticket": await import("../src/pages/api/ticket/index.ts"),
"user": await import("../src/pages/api/user/index.ts"),
"user/self": await import("../src/pages/api/user/self.ts"),
"verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"),
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.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,65 +1,95 @@
import { GebaeudeClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import {
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { Enums } from "@ibcornelsen/database/client";
import { addNotification, updateNotification } from "@ibcornelsen/ui";
import { client } from "src/trpc";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
export async function bilderHochladen(images: (UploadedGebaeudeBild & { base64?: string })[], gebaeude_uid: string) {
if (images.length == 0) {
return images;
}
export async function bilderHochladen(
images: (UploadedGebaeudeBild & { base64?: string, update?: boolean })[],
gebaeude_uid: string
) {
if (images.length == 0) {
return images;
}
// Wenn Bilder hochgeladen werden konvertieren wir sie zu base64, das heißt, dass die base64 Eigenschaft bei diesen Bildern
// existiert. Das müssen wir TypeScript nur wissen lassen, damit es uns in Ruhe lässt.
const imagesToUpload = images.filter(image => !image.uid || image.update) as unknown as { base64: string, kategorie: string, uid?: string, update: boolean }[];
// Wenn Bilder hochgeladen werden konvertieren wir sie zu base64, das heißt, dass die base64 Eigenschaft bei diesen Bildern
// existiert. Das müssen wir TypeScript nur wissen lassen, damit es uns in Ruhe lässt.
const imagesToUpload = images.filter(
(image) => !image.uid || image.update
) as unknown as {
base64: string;
kategorie: string;
uid?: string;
update: boolean;
}[];
if (imagesToUpload.length == 0) {
return images;
}
if (imagesToUpload.length == 0) {
return images;
}
// Alle Bilder hochladen
const notification = addNotification({
dismissable: false,
message: "Bilder hochladen.",
subtext: `${imagesToUpload.length} Bilder werden hochgeladen, bitte haben sie Geduld.`,
timeout: 0,
type: "info"
})
for (let i = 0; i < imagesToUpload.length; i++) {
const image = imagesToUpload[i];
// Alle Bilder hochladen
const notification = addNotification({
dismissable: false,
message: "Bilder hochladen.",
subtext: `${imagesToUpload.length} Bilder werden hochgeladen, bitte haben sie Geduld.`,
timeout: 0,
type: "info",
});
for (let i = 0; i < imagesToUpload.length; i++) {
const image = imagesToUpload[i];
try {
if (image.update) {
await client.v1.bilder.update.mutate({
uid: image.uid as string,
base64: image.base64,
kategorie: image.kategorie as Enums.BilderKategorie
})
} else {
const response = await client.v1.bilder.upload.mutate({
base64: image.base64,
kategorie: image.kategorie as Enums.BilderKategorie,
gebaeude_uid
})
image.uid = response.uid
}
try {
if (image.update) {
await api.bilder._uid.PATCH.fetch({
base64: image.base64,
kategorie: image.kategorie as Enums.BilderKategorie,
}, {
params: {
uid: image.uid as string,
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
});
} else {
const response = await api.objekt._uid.bilder.PUT.fetch({
base64: image.base64,
kategorie: image.kategorie as Enums.BilderKategorie
}, {
params: {
uid: gebaeude_uid
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
});
updateNotification(notification, {
dismissable: true,
message: "Bild hochgeladen.",
subtext: `${i + 1}/${imagesToUpload.length} Bildern wurden erfolgreich hochgeladen.`,
timeout: 3000
})
} catch (e) {
updateNotification(notification, {
dismissable: true,
message: "Bild konnte nicht hochgeladen werden.",
subtext: `Eines ihrer Bilder konnte nicht hochgeladen werden. Wir haben bereits ein Ticket erstellt und melden uns so schnell wie möglich bei ihnen.`,
timeout: 15000,
type: "error"
})
}
}
image.uid = response.uid;
}
return images;
}
updateNotification(notification, {
dismissable: true,
message: "Bild hochgeladen.",
subtext: `${i + 1}/${
imagesToUpload.length
} Bildern wurden erfolgreich hochgeladen.`,
timeout: 3000,
});
} catch (e) {
updateNotification(notification, {
dismissable: true,
message: "Bild konnte nicht hochgeladen werden.",
subtext: `Eines ihrer Bilder konnte nicht hochgeladen werden. Wir haben bereits ein Ticket erstellt und melden uns so schnell wie möglich bei ihnen.`,
timeout: 15000,
type: "error",
});
}
}
return images;
}

View File

@@ -1,6 +1,6 @@
import { dialogs } from "../../../svelte-dialogs.config";
import { addNotification } from "#components/Notifications/shared";
import { client } from "src/trpc";
import { dialogs } from "../../../svelte-dialogs.config.js";
import { addNotification } from "#components/Notifications/shared.js";
import { api } from "astro-typesafe-api/client";
export async function spawnSignupPrompt() {
const result = await dialogs.prompt(
@@ -46,7 +46,7 @@ export async function spawnSignupPrompt() {
const [vorname, name, email, passwort] = result;
try {
const response = await client.v1.benutzer.erstellen.mutate({
const response = await api.user.PUT.fetch({
email,
passwort,
vorname,

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 { TokenData, TokenType } from "#lib/auth/types.js";
import { api } from "astro-typesafe-api/client";
import { jwtDecode } from "jwt-decode"
export async function validateAccessTokenClient() {
@@ -9,10 +11,10 @@ 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 } = jwtDecode(accessToken) 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 +35,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,133 @@
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 Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, 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,
images: (UploadedGebaeudeBild & { base64?: string })[],
user: BenutzerClient
objekt: ObjektClient,
aufnahme: AufnahmeClient,
bilder: (UploadedGebaeudeBild & { base64?: string })[]
) {
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.verbrauchsausweisWohnen[2016].speichern.mutate({
...ausweis,
gebaeude_aufnahme_allgemein: {
...exclude(
gebaeude_aufnahme_allgemein,
["erstellungsdatum", "events", "ausstellungsdatum", "rechnungen"]
),
gebaeude_stammdaten: {
...exclude(gebaeude, [
"gebaeude_bilder",
]),
},
},
});
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)}`
}
})
images = await bilderHochladen(images, gebaeude.uid);
return { uid: ausweis.uid, gebaeude_uid: gebaeude.uid, gebaeude_aufnahme_uid: gebaeude_aufnahme_allgemein.uid };
} catch (e) {
// TODO: Ticket mit Fehldermeldung abschicken.
}
} 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,
}),
});
// TODO: Ticket mit Fehldermeldung abschicken.
}
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)}`
}
})
}
for (const bild of bilder) {
if (bild.uid) {
continue;
}
const response = await api.objekt._uid.bilder.PUT.fetch({
base64: bild.base64,
kategorie: bild.kategorie
}, {
params: {
uid: objekt.uid
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
bild.uid = response.uid
}
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,7 +1,6 @@
import { AppRouter } from "@ibcornelsen/api";
import { inferProcedureInput } from "@trpc/server";
import { client } from "src/trpc";
import { OmitKeys, TicketClient } from "#components/Ausweis/types.js";
import { api } from "astro-typesafe-api/client";
export async function createTicket(info: inferProcedureInput<AppRouter["v1"]["tickets"]["erstellen"]>) {
return await client.v1.tickets.erstellen.mutate(info)
export async function createTicket(info: OmitKeys<TicketClient, "created_at" | "deleted_at" | "prioritaet" | "updated_at" | "status" | "uid">) {
return await api.ticket.PUT.fetch(info)
}

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,8 +1,6 @@
<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";
//import Label from "#components/Label.svelte";
@@ -18,14 +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;
export let ausweisart: Enums.Ausweisart;
</script>
<div id="ausweisart" class="bereich-box grid
@@ -69,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" || Energieausweis=="Bedarfsausweis Wohngebäude"}
{#if ausweisart=="VerbrauchsausweisWohnen"}
<option value="Einfamilienhaus">Einfamilienhaus</option>
<option value="Freistehendes Einfamilienhaus">Freistehendes Einfamilienhaus</option>
<option value="Freistehendes Zweifamilienhaus">Freistehendes Zweifamilienhaus</option>
@@ -85,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>
@@ -161,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">
@@ -180,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>
@@ -220,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">
@@ -258,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

@@ -1,6 +1,6 @@
<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";
import HeizungImage from "./HeizungImage.svelte";
import AusweisPreviewContainer from "./AusweisPreviewContainer.svelte";
@@ -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

@@ -1,12 +1,13 @@
<script lang="ts">
import AusweisWeiter from "#modules/VerbrauchsausweisWohnen/AusweisWeiter.svelte";
import Hilfe from "#components/Ausweis/Hilfe.svelte";
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js";
export let ausweis;
export let images;
export let user;
export let gebaeude;
export let gebaeude_aufnahme_allgemein;
export let ausweis: VerbrauchsausweisWohnenClient;
export let bilder: UploadedGebaeudeBild[];
export let user: BenutzerClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let spaeterWeitermachen;
@@ -26,10 +27,10 @@
<div class="">
<AusweisWeiter
bind:ausweis
bind:images
bind:bilder
bind:user
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:objekt
bind:aufnahme
></AusweisWeiter>
</div>

View File

@@ -1,13 +1,13 @@
<script lang="ts">
import AusweisWeiter from "#modules/VerbrauchsausweisWohnen/AusweisWeiter.svelte";
import Hilfe from "#components/Ausweis/Hilfe.svelte";
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js";
export let ausweis;
export let images;
export let user;
export let gebaeude;
export let gebaeude_aufnahme_allgemein;
export let ausweis: VerbrauchsausweisWohnenClient;
export let bilder: UploadedGebaeudeBild[];
export let user: BenutzerClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let spaeterWeitermachen;
</script>

View File

@@ -1,12 +1,14 @@
<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";
import ZipSearch from "#components/PlzSuche.svelte";
import { Enums } from "@ibcornelsen/database/client"
import { AufnahmeClient, ObjektClient } from "./types.js";
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let aufnahme: AufnahmeClient;
export let objekt: ObjektClient;
</script>
@@ -29,7 +31,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={objekt.adresse}
/>
<div class="help-label">
@@ -46,9 +48,9 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<div class="input-noHelp">
<Inputlabel title="PLZ *"></Inputlabel>
<ZipSearch
bind:zip={gebaeude_aufnahme_allgemein.plz}
bind:city={gebaeude_aufnahme_allgemein.ort}
<ZipSearch
bind:zip={objekt.plz}
bind:city={objekt.ort}
name="plz"
/>
@@ -61,7 +63,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={objekt.ort}
type="text"
/>
@@ -91,7 +93,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">
@@ -112,7 +114,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>
@@ -138,7 +140,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>
@@ -170,7 +172,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

@@ -1,9 +1,9 @@
<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 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

@@ -1,27 +1,34 @@
<script lang="ts">
export let bereich: string;
export let bereich: string;
export let title: string;
export let bullets: string;
export let bullets: [string, boolean][];
</script>
<div class="">
<strong>{bereich} - {title}</strong>
<div class="mt-4 mb-6">
{#each bullets as [bullet, check]}
<div class="bullets grid grid-cols-[1fr_40px] items-center border-b-[1px] border-b-black/10">
<strong>{bereich} - {title}</strong>
<div class="mt-4 mb-6">
{#each bullets as [bullet, check]}
<div
class="bullets grid grid-cols-[1fr_40px] items-center border-b-[1px] border-b-black/10"
>
<span>{@html bullet}</span>
<div class="justify-self-end" class:check={check} class:check-no={!check}>{check ? "✔" : "✘"}</div>
<div
class="justify-self-end"
class:check
class:check-no={!check}
>
{check ? "✔" : "✘"}
</div>
</div>
{/each}
</div>
{/each}
</div>
</div>
<style lang="postcss">
.check{@apply self-center font-bold text-green-700}
.check-no{@apply self-center font-bold text-red-700}
</style>
.check {
@apply self-center font-bold text-green-700;
}
.check-no {
@apply self-center font-bold text-red-700;
}
</style>

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import HelpLabel from "#labels/HelpLabel.svelte";
import HelpLabel from "#components/labels/HelpLabel.svelte";
export let checked: boolean | null | undefined;
export let name: string;

View File

@@ -1,6 +1,6 @@
<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";
import FensterImage from "./FensterImage.svelte";
@@ -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

@@ -1,6 +1,6 @@
<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";
import HeizungImage from "./HeizungImage.svelte";
@@ -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

@@ -1,6 +1,6 @@
<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";
import DaemmungImage from "./DaemmungImage.svelte";
@@ -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

@@ -1,8 +1,8 @@
<script lang="ts">
import HelpLabel from "#labels/HelpLabel.svelte";
import Inputlabel from "#labels/InputLabel.svelte";
import Verbrauchslabel from "#labels/VerbrauchsLabel.svelte";
import VerbrauchsHelpLabel from "#labels/VerbrauchsHelpLabel.svelte";
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import Verbrauchslabel from "#components/labels/VerbrauchsLabel.svelte";
import VerbrauchsHelpLabel from "#components/labels/VerbrauchsHelpLabel.svelte";
import Label from "../Label.svelte";
@@ -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.gebaeude_aufnahme_allgemein.erstellungsdatum || Date.now()
aufnahme.erstellungsdatum || Date.now()
)
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment(
ausweis.gebaeude_aufnahme_allgemein.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,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

@@ -1,11 +1,23 @@
import { AppRouter } from "@ibcornelsen/api";
import { Benutzer, GebaeudeBilder } from "@ibcornelsen/database/client";
import { inferProcedureInput, inferProcedureOutput } from "@trpc/server";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import {
Aufnahme,
BedarfsausweisWohnen,
Benutzer,
Enums,
GebaeudeBilder,
Objekt,
Rechnung,
Tickets,
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
} from "@ibcornelsen/database/client";
import { z, ZodSchema } from "zod";
export type UploadedGebaeudeBild = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
>["gebaeude_aufnahme_allgemein"]["gebaeude_stammdaten"]["gebaeude_bilder"][0] & { base64?: string, update?: boolean };
export 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 +29,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 +63,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 +76,67 @@ 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"
> & {
uid_objekt: string
};
export type GebaeudeAufnahmeClient = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
>["gebaeude_aufnahme_allgemein"];
export type TicketClient = OmitKeys<Tickets, "bearbeiter_id" | "benutzer_id" | "id">
export type BenutzerClient = inferProcedureOutput<AppRouter["v1"]["benutzer"]["fromPublicId"]>
export type BenutzerClient = OmitKeys<Benutzer, "id" | "passwort">;
export type RechnungClient = OmitKeys<Rechnung, "aufnahme_id" | "benutzer_id" | "id">
export function ZodOverlap<T, S = z.ZodType<T, z.ZodTypeDef, T>>(arg: S): S {
return arg;
}
type PickNullable<T> = {
[P in keyof T as null extends T[P] ? P : never]: T[P]
}
type PickNotNullable<T> = {
[P in keyof T as null extends T[P] ? never : P]: T[P]
}
export type OptionalNullable<T> = T extends object ? {
[K in keyof PickNullable<T>]?: OptionalNullable<T[K]>
} & {
[K in keyof PickNotNullable<T>]: OptionalNullable<T[K]>
} : T;
export const UUidWithPrefix = z.string().refine((value) => {
const prefixedUUidRegex = /^([0-9a-z]+)-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
const match = value.match(prefixedUUidRegex)
if (match && match[1] in VALID_UUID_PREFIXES) {
return true;
}
return false;
})
export function getAusweisartFromUUID(uid: string): Enums.Ausweisart | null {
if (!UUidWithPrefix.safeParse(uid).success) {
return null
}
if (uid.startsWith("vaw")) {
return Enums.Ausweisart.VerbrauchsausweisWohnen
} else if (uid.startsWith("vag")) {
return Enums.Ausweisart.VerbrauchsausweisGewerbe
} else if (uid.startsWith("baw")) {
return Enums.Ausweisart.BedarfsausweisWohnen
} else if (uid.startsWith("bag")) {
return Enums.Ausweisart.BedarfsausweisGewerbe
}
return null;
}

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

@@ -1,8 +1,4 @@
<script lang="ts">
import { get_current_component } from "svelte/internal";
const component = get_current_component();
export let image: string;
export let name: string;
export let description: string;
@@ -23,14 +19,10 @@
</div>
</div>
<div class="join">
<button class="btn btn-sm join-item" disabled={!removable && quantity == 1} on:click={() => {
<button class="p-3.5 border rounded-lg" disabled={!removable && quantity == 1} on:click={() => {
quantity--
if ((quantity == 0) && removable) {
component.$destroy();
}
}}>-</button>
<button class="btn btn-sm join-item btn-ghost">{quantity}</button>
<button class="btn btn-sm join-item" disabled={quantity <= maxQuantity} on:click={() => quantity++}>+</button>
<button class="p-3.5 border rounded-lg">{quantity}</button>
<button class="p-3.5 border rounded-lg" disabled={quantity <= maxQuantity} on:click={() => quantity++}>+</button>
</div>
</div>

View File

@@ -1,5 +1,8 @@
<script lang="ts">
import {
AufnahmeClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js";
import moment from "moment";
@@ -12,9 +15,14 @@
QuestionMarkCircled,
} from "radix-svelte-icons";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { client } from "src/trpc.js";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
export let ausweis: VerbrauchsausweisWohnenClient;
export let aufnahme: AufnahmeClient;
export let bilder: UploadedGebaeudeBild[];
export let objekt: ObjektClient;
export let progress: number;
async function ausweisStornieren() {
@@ -33,11 +41,16 @@
});
if (result === true) {
await client.v1.verbrauchsausweisWohnen.stornieren.mutate({
uid: ausweis.uid
await api["verbrauchsausweis-wohnen"]._uid.DELETE.fetch(undefined, {
params: {
uid: ausweis.uid
},
headers: {
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
ausweis.gebaeude_aufnahme_allgemein.storniert = true;
aufnahme.storniert = true;
ausweis = ausweis;
dialogs.alert({
@@ -58,14 +71,14 @@
</script>
<div class="card lg:card-side bg-base-200 card-bordered border-base-300">
{#if ausweis.gebaeude_aufnahme_allgemein.storniert}
{#if 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={(bilder.length > 0 && `/bilder/${bilder[0].uid}.webp`) || "/images/placeholder.jpg"}
class="object-cover w-full h-full"
alt="Gebäudebild"
/>
@@ -95,25 +108,25 @@
</ul>
</div>
<div class="flex flex-row flex-wrap gap-2">
{#if ausweis.gebaeude_aufnahme_allgemein.ausweisart == "VerbrauchsausweisWohnen"}
{#if aufnahme.ausweisart == "VerbrauchsausweisWohnen"}
<div class="badge badge-accent font-semibold">
Verbrauchsausweis Wohnen
</div>
{:else if ausweis.gebaeude_aufnahme_allgemein.ausweisart == "BedarfsausweisWohnen"}
{:else if aufnahme.ausweisart == "BedarfsausweisWohnen"}
<div class="badge badge-accent font-semibold">
Bedarfsausweis Wohnen
</div>
{:else if ausweis.gebaeude_aufnahme_allgemein.ausweisart == "VerbrauchsausweisGewerbe"}
{:else if aufnahme.ausweisart == "VerbrauchsausweisGewerbe"}
<div class="badge badge-accent font-semibold">
Verbrauchsausweis Gewerbe
</div>
{/if}
{#if ausweis.erledigt}
{#if aufnahme.erledigt}
<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">{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 -->
@@ -134,7 +147,7 @@
<div class="flex flex-row justify-between">
<span>Erstellungsdatum</span>
<span class="font-bold text-base-content"
>{moment(ausweis.erstellungsdatum).format(
>{moment(aufnahme.erstellungsdatum).format(
"DD.MM.YYYY"
)}</span
>
@@ -144,16 +157,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] ||
>{aufnahme.baujahr_gebaeude[0] || "N/A"} /
{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²`
>{aufnahme.flaeche
? `${aufnahme.flaeche}m²`
: "N/A"}</span
>
</div>

View File

@@ -1,19 +0,0 @@
<script lang="ts">
import katex from "katex";
export let math: string;
export let displayMode: boolean = false;
const options = {
displayMode: displayMode,
throwOnError: false
}
let katexString: any;
$: katexString = katex.renderToString(math, options)
</script>
<svelte:head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
</svelte:head>
{@html katexString}

View File

@@ -4,6 +4,29 @@
import { fly } from "svelte/transition";
export let notification: Partial<Notification> & { uid: string };
function focusSelector() {
const element = document.querySelector(notification.selector as string) as HTMLElement | null;
if (!element) {
return
}
element.classList.add("bg-red-300")
element.scrollIntoView({
behavior: "smooth",
block: "center",
inline: "center"
})
element.focus()
deleteNotification(notification.uid)
setTimeout(() => {
element?.classList.remove("bg-red-300")
}, 3000)
}
</script>
<div
@@ -15,32 +38,7 @@
>
<div class="flex flex-col px-4 py-2">
<h2 class="text-xl font-semibold flex flex-row items-center gap-3">{@html notification.message} {#if notification.selector}
<button on:click={() => {
if (!notification.selector) {
return
}
const element = document.querySelector(notification.selector);
if (!element) {
return
}
element.classList.add("bg-red-300")
element.scrollIntoView({
behavior: "smooth",
block: "center",
inline: "center"
})
element.focus()
deleteNotification(notification.uid)
setTimeout(() => {
element?.classList.remove("bg-red-300")
}, 3000)
}} class="p-1.5 border rounded-lg" title="Anzeigen"><OpenInNewWindow size={18}></OpenInNewWindow></button>
<button on:click={focusSelector} class="p-1.5 border rounded-lg" title="Anzeigen"><OpenInNewWindow size={18}></OpenInNewWindow></button>
{/if}</h2>
<p class="text-gray-600 text-lg"><slot></slot></p>
</div>

View File

@@ -1,8 +1,5 @@
<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 +8,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 +16,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;
@@ -68,7 +65,7 @@
maxlength="5"
/>
<div data-test="plz-container" class="absolute top-[calc(100%+4px)] left-0 z-10 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 text-nowrap" tabindex="-1" on:click={() => {
zip = zipCode.plz;

View File

@@ -0,0 +1,229 @@
<script lang="ts">
import { BedarfsausweisWohnenClient } from "#components/Ausweis/types.js";
export let ausweis: BedarfsausweisWohnenClient;
</script>
<div class="overflow-x-auto mt-16">
<table class="table-auto border-collapse border border-gray-300 w-full text-left">
<thead>
<tr class="bg-gray-200 text-left">
<th colspan="12" class="border border-gray-300 p-2">
<h2>Tabelle A.12 — Heizung Berechnung des Nutzenergiebedarfs</h2>
</th>
</tr>
<tr class="text-center">
<tr class="bg-gray-200 text-left">
<th colspan="12" class="border border-gray-300 p-2 text-xl">
Heizbedarf des Wohngebäudes
</th>
</tr>
<th colspan="1" class="border border-gray-300 p-2">min. Außen-<br>temperatur<br>&#952;<sub>e,min</sub> [°C]</th>
<th colspan="1" class="border border-gray-300 p-2">Innen-<br>temperatur<br>&#952;<sub>i,h,soll</sub> [°C]</th>
<th colspan="2" class="border border-gray-300 p-2">maximaler Wärmestrom<br><sub>ges</sub> [W]<br>aus Tabelle A.6 (1)</th>
<th colspan="8" class="border border-gray-300 p-2"></th>
<tr class="text-center h-10">
<th colspan="1" class="border border-gray-300 p-2 bg-gray-100">-12</th>
<th colspan="1" class="border border-gray-300 p-2 bg-gray-100">20</th>
<th colspan="2" class="border border-gray-300 p-2 bg-yellow-100"></th>
<th colspan="8" class="border border-gray-300 p-2"></th>
</tr>
<tr>
<th class="border border-gray-300 px-2 py-1">Tage im Monat<br>d<sub>mth</sub> [d]</th>
<th class="border border-gray-300 px-2 py-1">Bilanzinnen-<br>temperatur<br>&#952;<sub>i,h</sub> [°C]<br>aus Tabelle 8 (EFH) bzw. 10 (MFH)</th>
<th class="border border-gray-300 px-2 py-1">mittlere Außen-<br>temp.<br>&#952;<sub>e,m</sub> [°C]</th>
<th class="border border-gray-300 px-2 py-1">Mittlere Belastung<br>&#946;<sub>e,m</sub><br>aus Tabelle 9 bzw. 11 (2)</th>
<th class="border border-gray-300 px-2 py-1">P<sub>h,sink</sub> = Q̇<sub>ges</sub> · (&#952;<sub>i,h</sub> - &#952;<sub>e,min</sub>) / (&#952;<sub>i,h,soll</sub> - &#952;<sub>e,min</sub>) · &#946;<sub>e,m</sub> [W] (3)</th>
<th class="border border-gray-300 px-2 py-1">P<sub>h,source</sub> = P<sub>i,ges</sub><br>aus Tabelle A.11 (4)</th>
<th class="border border-gray-300 px-2 py-1">&#947;<sub>m</sub> = P<sub>h,source</sub> / P<sub>h,sink</sub><br>(5) = (4) / (3)</th>
<th class="border border-gray-300 px-2 py-1">&#951;<sub>m</sub> = f(γ) aus Tabelle 18<br>(6)</th>
<th class="border border-gray-300 px-2 py-1">(7) = max[1 - (5) · (6);0]</th>
<th class="border border-gray-300 px-2 py-1">&#946;<sub>m</sub><br>(8) = (2) · (7)</th>
<th class="border border-gray-300 px-2 py-1">t<sub>h,m</sub> [h] (9)</th>
<th class="border border-gray-300 px-2 py-1">Q<sub>h,b</sub> [kWh] (10)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">1,0</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">28</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">1,9</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">4,7</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">30</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">9,2</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">14,1</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">30</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">16,7</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">19,0</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">18,6</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">30</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">14,3</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">9,4</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">30</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">4,1</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">31</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border border-gray-300 px-2 py-1 bg-gray-100">0,9</td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-yellow-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border border-gray-300 px-2 py-1 bg-blue-100"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
<td class="border-2 border-gray-600 px-2 py-1"></td>
</tr>
<tr class="text-center h-10">
<th colspan="9" class="border border-gray-300 p-2 text-left">Spalte 9:&nbsp;&nbsp;(8) &gt; 0,05 → (9) = d<sub>mth</sub> · 24 &nbsp;&nbsp;&nbsp;
(8) &leq; 0,05 → (9) = (8) / 0,05 · d<sub>mth</sub> · 24</th>
<th colspan="1" class="border border-gray-300 p-2">Summe</th>
<th colspan="1" class="border-2 border-gray-600 p-2"></th>
<th colspan="1" class="border-2 border-gray-600 p-2"></th>
</tr>
<tr class="text-center h-10">
<th colspan="10" class="border border-gray-300 p-2 text-left">Spalte 10:&nbsp;&nbsp;(10) = (3) · (7) · (9) / 1000</th>
<th colspan="1" class="border border-gray-300 p-2"></th>
<th colspan="1" class="border border-gray-300 p-2"></th>
</tr>
</tbody>
</table>
</div>

View File

@@ -0,0 +1,75 @@
<script lang="ts">
import { BedarfsausweisWohnenClient } from "#components/Ausweis/types.js";
export let ausweis: BedarfsausweisWohnenClient;
</script>
<div class="overflow-x-auto mt-16">
<table class="table-auto border-collapse border border-gray-300 w-full text-sm">
<!-- Tabellenkopf -->
<thead>
<tr class="bg-gray-200 text-left">
<th colspan="6" class="border border-gray-300 p-2">
<h2>Tabelle A.1 Anlage allgemein Anlagenbeschreibung</h2>
</th>
</tr>
<tr class="bg-yellow-100 text-left">
<th colspan="1" class="border border-gray-300 p-2 text-xl bg-white">Objekt:</th>
<th colspan="5" class="border border-gray-300 p-2"></th>
</tr>
<tr class="text-center">
<th class="border border-gray-300 p-2">Anlage</th>
<th class="border border-gray-300 p-2">Übergabe</th>
<th class="border border-gray-300 p-2">Verteilung</th>
<th class="border border-gray-300 p-2">Speicherung</th>
<th class="border border-gray-300 p-2">Erzeugung</th>
</tr>
</thead>
<!-- Tabellenkörper -->
<tbody>
<tr class="bg-yellow-100 h-10">
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr class="bg-yellow-100 h-10">
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr class="bg-yellow-100 h-10">
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr class="bg-yellow-100 h-10">
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr class="bg-yellow-100 h-10">
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr class="bg-yellow-100 h-10">
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
</tbody>
</table>
</div>

View File

@@ -0,0 +1,296 @@
<script lang="ts">
import { BedarfsausweisWohnenClient } from "#components/Ausweis/types.js";
export let ausweis: BedarfsausweisWohnenClient;
</script>
<div class="overflow-x-auto mt-16">
<table class="table-auto border-collapse border border-gray-300 w-full text-sm">
<!-- Tabellenkopf -->
<thead>
<tr class="bg-gray-200 text-left">
<th colspan="6" class="border border-gray-300 p-2">
<h2>Tabelle A.2 Gebäude Wintergarten</h2>
</th>
</tr>
<tr class="bg-gray-200 text-left">
<th colspan="6" class="border border-gray-300 p-2 text-xl">
Solare Einstrahlung in den Wintergarten
</th>
</tr>
</thead>
<!-- Tabellenkörper -->
<thead>
<tr class="bg-yellow-100 text-left">
<th class="border border-gray-300 p-2 w-4/12 bg-white">Orientierung</th>
<th class="border border-gray-300 p-2 w-1/12"></th>
<th class="border border-gray-300 p-2 w-1/12"></th>
<th class="border border-gray-300 p-2 w-1/12"></th>
<th class="border border-gray-300 p-2 w-1/12"></th>
<th class="border border-gray-300 p-2 w-2/12 bg-white text-center">Gesamtfläche</th>
</tr>
</thead>
<!-- Tabellenkörper -->
<tbody>
<tr class="bg-yellow-100">
<td class="border border-gray-300 p-2 bg-white">Neigung</td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center bg-white">[m²]</td>
</tr>
<tr class="bg-yellow-100">
<td class="border border-gray-300 p-2 bg-white">Bauteilfläche A<sub>ue</sub> [m²] (1)</td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border-2 border-gray-600 p-2 text-center bg-white"></td>
</tr>
<tr class="bg-yellow-100">
<td class="border border-gray-300 p-2 bg-white">Gesamtenergiedurchlassgrad g<sub>ue</sub> (2)</td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center bg-white"></td>
</tr>
<tr class="bg-gray-100">
<td class="border border-gray-300 p-2 bg-white">Abm. Rahmenanteil F<sub>F,ue</sub> (3)</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center bg-white"></td>
</tr>
<tr class="bg-gray-100">
<td class="border border-gray-300 p-2 bg-white">Abm. Strahlungseinfluss F<sub>w,ue</sub> (4)</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center bg-white"></td>
</tr>
<tr class="bg-gray-100">
<td class="border border-gray-300 p-2 bg-white ">Abm. Verschattung F<sub>s,ue</sub> (5)</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center">0,9</td>
<td class="border border-gray-300 p-2 text-center bg-white"></td>
</tr>
<tr>
<td class="border border-gray-300 p-2">wirks. Gesamtenergiedurchlassgrad<br>
g<sub>eff,ue</sub> = g<sub>ue</sub> · F<sub>w,ue</sub> · F<sub>s,ue</sub><br>
(6) = (2) · (4) · (5)</td>
<td class="border-2 border-gray-600 p-2 text-center"></td>
<td class="border-2 border-gray-600 p-2 text-center"></td>
<td class="border-2 border-gray-600 p-2 text-center"></td>
<td class="border-2 border-gray-600 p-2 text-center"></td>
<td class="border border-gray-300 p-2 text-center bg-white"></td>
</tr>
</tbody>
</table>
<br>
<table class="table-auto border-collapse border border-gray-300 w-full text-sm">
<!-- Tabellenkopf -->
<thead>
<tr class="text-center">
<th colspan="2" class="border border-gray-300 p-2 text-left">E<sub>sol</sub> aus Tabelle 17</th>
<th colspan="3" class="border border-gray-300 p-2 text-left">
Q<sub>S,tr</sub> = A<sub>ue</sub> ⋅ F<sub>F,ue</sub> ⋅ g<sub>eff,ue</sub>
⋅ E<sub>sol</sub></th>
<th colspan="6" class="border border-gray-300 p-2 text-left">Φ<sub>S,u</sub> = ∑ Q<sub>S,tr</sub> ⋅ 1000 (24 ⋅ d<sub>mth</sub>)</th>
</tr>
<tr class="text-center">
<th class="border border-gray-300 p-2 w-1/12">Tage im Monat<br>(7)</th>
<th class="border border-gray-300 p-2 w-1/12">E<sub>sol</sub><br>[kWh/m²]<br>(8)</th>
<th class="border border-gray-300 p-2 w-1/12">Q<sub>S,tr</sub><br>[kWh]<br>(9) = (1) ⋅ (3) ⋅ (6) ⋅ (8)</th>
<th class="border border-gray-300 p-2 w-1/12">E<sub>sol</sub><br>[kWh/m²]<br>(10)</th>
<th class="border border-gray-300 p-2 w-1/12">Q<sub>S,tr</sub><br>[kWh]<br>(11) = (1) ⋅ (3) ⋅ (6) ⋅ (10)</th>
<th class="border border-gray-300 p-2 w-1/12">E<sub>sol</sub><br>[kWh/m²]<br>(12)</th>
<th class="border border-gray-300 p-2 w-1/12">Q<sub>S,tr</sub><br>[kWh]<br>(13) = (1) ⋅ (3) ⋅ (6) ⋅ (12)</th>
<th class="border border-gray-300 p-2 w-1/12">E<sub>sol</sub><br>[kWh/m²]<br>(14)</th>
<th class="border border-gray-300 p-2 w-1/12">Q<sub>S,tr</sub><br>[kWh]<br>(15) = (1) ⋅ (3) ⋅ (6) ⋅ (14)</th>
<th class="border border-gray-300 p-2 w-1/12">ΣQ<sub>S,tr</sub><br>[kWh]<br>(16) = (9) + (11) + (13) + (15)</th>
<th class="border border-gray-300 p-2 w-1/12">Φ<sub>S,u</sub><br>[W]<br>(17) = (16) ⋅ 1000 / [24] ⋅ (7)</th>
</tr>
</thead>
<!-- Tabellenkörper -->
<tbody>
<tr class="text-center">
<td class="border border-gray-300 p-2">31</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">28</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">31</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">30</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">31</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">30</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">31</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">31</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">30</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">31</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">30</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2">31</td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="border border-gray-300 p-2">Jahressumme</td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="p-2"></td>
</tr>
</tbody>
</table>
</div>

View File

@@ -0,0 +1,253 @@
<script lang="ts">
import { BedarfsausweisWohnenClient } from "#components/Ausweis/types.js";
export let ausweis: BedarfsausweisWohnenClient;
</script>
<div class="overflow-x-auto mt-16">
<table class="table-auto border-collapse border border-gray-300 w-full text-sm">
<!-- Tabellenüberschrift -->
<thead>
<tr class="bg-gray-200 text-left">
<th colspan="6" class="border border-gray-300 p-2 text-left">
<h2>Tabelle A.5 — Gebäude Berechnung Wärmetransferkoeffizienten und maximaler Wärmeströme</h2>
</th>
</tr>
<tr class="bg-gray-200 text-left">
<th colspan="6" class="border border-gray-300 p-2 text-left text-xl">
Wärmesenken
</th>
</tr>
</thead>
<!-- Objektdaten -->
<tbody>
<tr class="bg-yellow-100">
<td colspan="1" class="border border-gray-300 p-2 text-left bg-white">Objekt:</td>
<td colspan="5" class="border border-gray-300 p-2 text-left"></td>
</tr>
<tr>
<td class="border border-gray-300 p-2 w-2/6">Nettogrundfläche</td>
<td class="border border-gray-300 p-2 w-1/6">A<sub>NGF</sub> [m²]</td>
<td class="border border-gray-300 p-2 w-1/6 bg-yellow-100"></td>
<td class="border border-gray-300 p-2">θ<sub>e,min</sub> [°C]</td>
<td class="border border-gray-300 p-2 bg-gray-100 text-center">12</td>
<td class="border border-gray-300 p-2" rowspan="2"></td>
</tr>
<tr>
<td class="border border-gray-300 p-2">Lichte Raumhöhe</td>
<td class="border border-gray-300 p-2">h<sub>G</sub> [m]</td>
<td class="border border-gray-300 p-2 w-1/6 bg-yellow-100"></td>
<td class="border border-gray-300 p-2">θ<sub>i,h,soll</sub> [°C]</td>
<td class="border border-gray-300 p-2 bg-gray-100 text-center">20</td>
</tr>
<tr>
<td class="border border-gray-300 p-2">Volumen (Innenmaß)</td>
<td class="border border-gray-300 p-2">V = A<sub>NGF</sub> · h<sub>G</sub> [m³]</td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2">Δθ<sub>max</sub> = θ<sub>i,h,soll</sub> θ<sub>e,min</sub></td>
<td class="border border-gray-300 p-2 bg-gray-100 text-center">32</td>
</tr>
<tr>
<td class="border border-gray-300 p-2">Volumen (Außenmaß)</td>
<td class="border border-gray-300 p-2">V<sub>e</sub> [m³]</td>
<td class="border border-gray-300 p-2 w-1/6 bg-yellow-100"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr>
<td class="border border-gray-300 p-2">Faktor (kleine Gebäude: 0,76 / große Gebäude: 0,8)</td>
<td class="border border-gray-300 p-2">n*</td>
<td class="border border-gray-300 p-2 w-1/6 bg-yellow-100"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr>
<td class="border border-gray-300 p-2">Volumen (Innenmaß)</td>
<td class="border border-gray-300 p-2 italic">V = n* · V<sub>e</sub> [m³]</td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2">A/V-Verhätnis [1/m]</td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
</tbody>
</table>
<br>
<table class="table-auto border-collapse border border-gray-300 w-full text-sm">
<!-- Tabellenkopf -->
<thead>
<tr class="text-center">
<th class="border border-gray-300 p-2" colspan="2">Bauteil</th>
<th class="border border-gray-300 p-2">Fläche<br>A<sub>i</sub> (m²)</th>
<th class="border border-gray-300 p-2">Wärmedurchgangs-<br>koeffizient U<sub>i</sub><br>(W/m²·K)</th>
<th class="border border-gray-300 p-2">H<sub>T,i*</sub><br>= U<sub>i</sub> · A<sub>i</sub><br>(W/K)</th>
<th class="border border-gray-300 p-2">F<sub>xi</sub><br>aus Tabelle C.3/C.4</th>
<th class="border border-gray-300 p-2">H<sub>T,i</sub><br>= U<sub>i</sub> · A<sub>i</sub> · F<sub>xi</sub><br>(W/K)</th>
<th class="border border-gray-300 p-2">maximaler Wärmestrom<br><sub>T,i</sub> = H<sub>T,i</sub> · ΔΘ<sub>max</sub><br>(W)</th>
</tr>
</thead>
<!-- Tabellenkörper -->
<tbody>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Außenwand</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Fenster</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Fenstertür</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Haustür</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Dach</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Oberste Geschossdecke</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Wand gegen Abseitenraum</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Kellerdecke / Fußboden zum Erdreich</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2 font-bold" colspan="2">Summen</td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr class="text-center">
<td class="p-2" colspan="2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
</tr>
<tr class="text-center">
<td class="p-2" colspan="2"></td>
<td class="p-2">Gesamthüllfläche
A = ∑<sub>i</sub> A<sub>i</sub> [m²]</td>
<td class="p-2">Wärmebrückenzuschlag<br> ΔU<sub>WB</sub> [W/m²K]
aus C.5</td>
<td class="p-2">
H<sub>T,WB</sub> = ΔU<sub>WB</sub> · A [W/K]</td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
</tr>
<tr class="text-center">
<td class="border border-gray-300 p-2" colspan="2">Berücksichtigung von Wärmebrücken</td>
<td class="border border-gray-300 p-2 bg-yellow-100"></td>
<td class="border border-gray-300 p-2 bg-blue-100"></td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr class="text-center">
<td class="p-2" colspan="2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
</tr>
<tr class="text-center">
<td class="p-2" colspan="2"></td>
<td class="p-2">H<sub>T,ges</sub> = ∑ H<sub>Ti</sub> + H<sub>T,WB</sub> [W/K]</td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
</tr>
<tr class="text-left">
<td class="border border-gray-300 font-bold p-2" colspan="2">Wärmetransferkoeffizient für Transmission</td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
<tr class="text-center">
<td class="p-2" colspan="2"></td>
<td class="p-2"><sub>T</sub> = H<sub>T,ges</sub> · ΔΘ<sub>max</sub> [W]</td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
<td class="p-2"></td>
</tr>
<tr class="text-left">
<td class="border border-gray-300 font-bold p-2" colspan="2">maximaler Wärmestrom</td>
<td class="border-2 border-gray-600 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
<td class="border border-gray-300 p-2"></td>
</tr>
</tbody>
</table>
</div>

View File

@@ -33,7 +33,7 @@
</tr>
<tr class="text-center h-10">
<th class="w-1/4 border border-gray-300 p-2 bg-yellow-100">
<input type="number" bind:value={gebaeude_aufnahme.nutzflaeche}>
<input type="number" bind:value={gebaeude_aufnahme.flaeche}>
</th>
<th class="w-1/4 border border-gray-300 p-2 bg-blue-100">{flaechenBezogenerWaermebedarf}</th>
</tr>

View File

@@ -1,6 +1,5 @@
<script lang="ts">
import { addNotification } from "#components/Notifications/shared";
import { client } from "src/trpc";
import { api } from "astro-typesafe-api/client";
import { getClose } from "svelte-dialogs";
const close = getClose();
@@ -8,7 +7,7 @@
async function createTicket(e: SubmitEvent) {
e.preventDefault();
try {
await client.v1.tickets.erstellen.mutate({
await api.ticket.PUT.fetch({
beschreibung: description,
email: email,
metadata: {

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

@@ -1,8 +0,0 @@
---
const currentYear = new Date().getFullYear();
---
<div class="flex flex-row justify-between px-4 items-center bg-primary py-2 mt-auto">
<a class="text-white font-medium text-lg" href="/impressum">Impressum und Datenschutz</a>
<a class="text-white font-medium text-lg" href="/">© {currentYear} IB Cornelsen Hamburg.</a>
</div>

View File

@@ -1,5 +1,5 @@
---
import HeaderLogin from "#header/HeaderLogin.svelte";
import HeaderLogin from "#components/design/header/HeaderLogin.svelte";
---
<header id="header">

View File

@@ -1,5 +1,5 @@
---
import HeaderLogin from "#header/HeaderLogin.svelte";
import HeaderLogin from "#components/design/header/HeaderLogin.svelte";
---
<header id="header">

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { loginClient } from "#lib/login";
import { loginClient } from "#lib/login.js";
import { CrossCircled } from "radix-svelte-icons";
import { fade } from "svelte/transition";

View File

@@ -1,67 +0,0 @@
---
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import ThemeController from "./ThemeController.svelte";
const valid = await validateAccessTokenServer(Astro)
const lightTheme = Astro.cookies.get("theme")?.value === "light";
---
<header>
<a class="hidden md:block w-full h-48 bg-base-200" href="/">
<img
src="/images/header/header-bg.jpg"
class="w-full h-full object-cover"
alt="Hintergrund - Rollen Architektenpapier"
/>
<img
src="/images/header/logo-big.svg"
class="absolute top-4 right-0 w-[464px]"
alt="IBCornelsen - Logo"
/>
<h2
class="text-secondary font-semibold text-2xl absolute top-8 right-4"
>
Energieausweis online erstellen
</h2>
<h2
class="text-primary font-semibold text-xl absolute top-16 right-4"
>
Energieausweise nach aktueller GEG
</h2>
</a>
<div class="px-4 flex flex-row w-full md:justify-end items-center bg-primary">
<a
class="header-button hidden md:block"
href="/energieausweis-erstellen/verbrauchsausweis-erstellen"
>Energieausweis erstellen</a
>
<a class="header-button hidden md:block" href="/kontakt"
>Kontakt</a
>
<a class="header-button hidden md:block" href="/agb">AGB</a>
{
valid ? (
<a class="header-button" href="/dashboard">
Profil
</a>
) : (
<a class="header-button" href="/auth/login">
Login
</a>
)
}
<ThemeController lightTheme={lightTheme} client:load />
<a class="hamburger_menu"
><img src="/images/hamburger.png" width="22" alt="hamburger" /></a
>
</div>
</header>
<style>
.header-button {
@apply px-4 py-2 text-primary-content font-medium text-lg tracking-normal hover:bg-secondary h-full;
}
</style>

View File

@@ -1,7 +1,7 @@
---
import CardNavigation from "#sidebarCards/cardNavigation.svelte";
import CardPriceiInfo from "#sidebarCards/cardPriceiInfo.svelte";
import CardProduktSidebar from "#sidebarCards/CardProduktSidebar.svelte";
import NavigationCard from "#components/design/sidebars/cards/NavigationCard.svelte";
import CardPriceiInfo from "#components/design/sidebars/cards/cardPriceiInfo.svelte";
import CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
import { PRICES } from "#lib/constants";
---
@@ -9,7 +9,7 @@ import { PRICES } from "#lib/constants";
<div class="">
<CardNavigation client:load/>
<NavigationCard client:load/>
<CardProduktSidebar art="Verbrauchsausweis Gewerbe" price={PRICES.VerbrauchsausweisGewerbe[0]}></CardProduktSidebar>
<CardPriceiInfo />

View File

@@ -1,7 +1,7 @@
---
import CardContact from "#sidebarCards/cardContact.svelte";
import CardPriceiInfo from "#sidebarCards/cardPriceiInfo.svelte";
import CardProduktSidebar from "#sidebarCards/CardProduktSidebar.svelte";
import CardContact from "#components/design/sidebars/cards/ContactCard.svelte";
import CardPriceiInfo from "#components/design/sidebars/cards/cardPriceiInfo.svelte";
import CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
import { PRICES } from "#lib/constants";
---

View File

@@ -1,4 +1,4 @@
<div id ="cardContact" class="box card">
<div class="box card">
<div class="grid grid-cols-[max-content,1fr] gap-x-2 border-b-[1px] pb-2 mb-4">

View File

@@ -23,7 +23,6 @@
</script>
<div
id="cardLogin"
class="box card"
>
<div class="grid">

View File

@@ -0,0 +1,455 @@
<script lang="ts">
let innerWidth: number;
function dropdown() {
if (innerWidth < 1024) {
const check_element = this.lastChild;
const rotate_list = document.querySelectorAll(".dd-symbol-clone");
const rotate_element = this.childNodes[0].children[0];
var first_check = check_element.classList.contains(
"show-dropdown-content"
);
const nodeList = document.querySelectorAll(".dropdown-content");
if (first_check == true) {
check_element.classList.remove("show-dropdown-content");
rotate_element.classList.toggle("rotate-symbol");
} else {
for (let i = 0; i < nodeList.length; i++) {
const element = nodeList[i];
element.classList.remove("show-dropdown-content");
}
for (let i = 0; i < rotate_list.length; i++) {
const element = rotate_list[i];
element.classList.remove("rotate-symbol");
}
check_element.classList.add("show-dropdown-content");
rotate_element.classList.add("rotate-symbol");
}
}
}
function hover() {
if (innerWidth > 1024) {
const check_element = this.firstChild.lastChild;
check_element.style.visibility = "visible";
}
}
function hoverout() {
if (innerWidth > 1024) {
const check_element = this.firstChild.lastChild;
check_element.style.visibility = "hidden";
}
}
function hamburger() {
const nodeList = document.querySelectorAll(".dropdown-content");
for (let i = 0; i < nodeList.length; i++) {
nodeList[i].classList.remove("show-dropdown-content");
}
var element = document.getElementById("cardNavigation");
element.classList.toggle("hidden");
const spans = this.children;
var first_check = spans[0].classList.contains("hamburger-swing-0");
if (first_check == true) {
for (let i = 0; i < spans.length; i++) {
spans[i].classList.remove("hamburger-swing-" + i);
}
const rotate_list = document.querySelectorAll(".dd-symbol");
for (let i = 0; i < rotate_list.length; i++) {
rotate_list[i].classList.remove("rotate-symbol");
}
} else {
for (let i = 0; i < spans.length; i++) {
spans[i].classList.add("hamburger-swing-" + i);
}
}
}
</script>
<svelte:window bind:innerWidth />
<div
class="hamburger_menu py-1 px-2 bg-secondary
xs:px-4
lg:hidden"
>
<div
id="hamburger"
on:click={hamburger}
on:keydown={hamburger}
class="cursor-pointer"
>
<span></span>
<span></span>
<span></span>
</div>
</div>
<nav
id="cardNavigation"
class="cardNavigation box hidden relative ring-0 md:ring-2 ring-primary/50 rounded-tr-none lg:block mb-0 lg:mb-5"
>
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
Jetzt bestellen
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/welcher-energieausweis/"
>Welcher Energieausweis?</a
>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
{#if innerWidth > 1023}
<a href={undefined} class="nav-element-child"
>Energieausweis erstellen<span class="dd-symbol-clone"></span
><span class="dd-symbol"></span></a
>
{:else}
<a href={undefined} class="nav-element-child"
>Energieausweis erstellen<span class="dd-symbol-clone"></span
><span class="dd-symbol"></span></a
>
{/if}
<ul class="dropdown-content energieasusweis-erstellen">
{#if innerWidth < 1023}
<li>
<a href="/energieausweis-erstellen"
>Energieausweis erstellen</a
>
</li>
{/if}
<li>
<a
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/"
>Verbrauchsausweis erstellen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
>Bedarfsausweis erstellen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
>Verbrauchsausweis Gewerbe erstellen</a
>
</li>
</ul>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
{#if innerWidth > 1023}
<a href={undefined} class="nav-element-child"
>Angebot anfragen<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
{:else}
<a href={undefined} class="nav-element-child"
>Angebot anfragen<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
{/if}
<ul class="dropdown-content angebot-anfragen">
{#if innerWidth < 1023}
<li>
<a href="/energieausweis-erstellen">Angebot anfragen</a>
</li>
{/if}
<li>
<a
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/"
>Bedarfsausweis Gewerbe anfragen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
>GEG Nachweis Wohnen anfragen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
>GEG Nachweis Gewerbe anfragen</a
>
</li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan"
>Sanierungsfahrplan (iSFP)</a
>
</div>
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
Produkte & Preise
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
<a href={undefined} class="nav-element-child"
>Verbrauchsausweis<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
<ul class="dropdown-content verbrauchsausweis">
{#if innerWidth < 1023}
<li><a href="index">Verbrauchsausweis</a></li>
{/if}
<li><a href="index">Verbrauchsausweis Wohngebäude</a></li>
<li><a href="index">Verbrauchsausweis online erstellen</a></li>
<li><a href="index">Häufige Fragen zum Verbrauchsausweis</a></li>
<li>
<a href="index">Statistiken zum Verbrauchsausweis Wohngebäude</a
>
</li>
<li><a href="index">Verbrauchsausweis Gewerbe</a></li>
<li>
<a href="index">Verbrauchsausweis Gewerbe online erstellen</a>
</li>
<li>
<a href="index">Häufige Fragen zum Verbrauchsausweis Gewerbe</a>
</li>
<li>
<a href="index">Statistiken zum Verbrauchsausweis Gewerbe</a>
</li>
</ul>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
<a href={undefined} class="nav-element-child"
>Bedarfsausweis<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
<ul class="dropdown-content bedarfsausweis">
{#if innerWidth < 1023}
<li><a href="index">Bedarfsausweis</a></li>
{/if}
<li><a href="index">Bedarfsausweis Wohngebäude</a></li>
<li><a href="index">Bedarfsausweis online erstellen</a></li>
<li><a href="index">Häufige Fragen zum Bedarfsausweis</a></li>
<li>
<a href="index">Statistiken zum Bedarfsausweis Wohngebäude</a>
</li>
<li><a href="index">Bedarfsausweis Gewerbe</a></li>
<li><a href="index">Bedarfsausweis Gewerbe online erstellen</a></li>
<li>
<a href="index">Häufige Fragen zum Bedarfsausweis Gewerbe</a>
</li>
<li><a href="index">Statistiken zum Bedarfsausweis Gewerbe</a></li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan"
>Sanierungsfahrplan</a
>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
<a href={undefined} class="nav-element-child"
>Energieausweis<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
<ul class="dropdown-content energieausweis">
{#if innerWidth < 1023}
<li><a href="index">Energieausweis</a></li>
{/if}
<li><a href="index">Energieausweis Pflicht</a></li>
<li><a href="index">Energieausweis Kosten</a></li>
<li><a href="index">Energieausweis Haus</a></li>
</ul>
</div>
<div class="nav-element">
<a
class="no-dropdown nav-element-child"
href="/energieausweis-aussteller">Energieberater finden</a
>
</div>
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
FAQ & Hilfe
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
{#if innerWidth > 1023}
<a href="/bestellprozess-energieausweis" class="nav-element-child"
>Bestellprozess Energieausweis<span class="dd-symbol-clone"
></span
><span class="dd-symbol"></span></a
>
{:else}
<a href="/bestellprozess-energieausweis" class="nav-element-child"
>Bestellprozess Energieausweis<span class="dd-symbol-clone"
></span
><span class="dd-symbol"></span></a
>
{/if}
<ul class="dropdown-content bestellprozess-energieausweis">
{#if innerWidth < 1023}
<li>
<a href="/bestellprozess-energieausweis"
>Bestellprozess Energieausweis</a
>
</li>
{/if}
<li>
<a
href="/bestellprozess-energieausweis/merkblatt-verbrauchsausweis-wohnen/"
>Merkblatt Verbrauchsausweis Wohnen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
>Merkblatt Bedarfsausweis Wohnen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
>Merkblatt Verbrauchsausweis Gewerbe</a
>
</li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/geg/"
>Gebäudeenergiegesetz (GEG)</a
>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/enev-zusammenfassung/"
>EnEV Zusammenfassung - Archiv</a
>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/faq/">FAQ</a>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/glossar/">Glossar</a>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/kundenbewertungen/"
>Kundenbewertungen</a
>
</div>
<div class="nav-element">
<a
class="no-dropdown nav-element-child lg:!rounded-b-lg xl:!rounded-b-xl"
href="/fuer-entwickler/">Für Entwickler</a
>
</div>
</nav>
<style lang="scss">
.dd-symbol::before {
content: "";
font-size: 0.95rem;
position: absolute;
top: 0px;
left: -7px;
animation-name: flim;
animation-duration: 2s;
animation-iteration-count: infinite;
}
.dd-symbol {
visibility: hidden;
}
.dd-symbol::after {
content: "";
font-size: 0.95rem;
position: absolute;
top: 0px;
right: -7px;
animation-name: flim;
animation-duration: 2s;
animation-delay: 1s;
animation-iteration-count: infinite;
}
@keyframes flim {
0% {
opacity: 0;
}
16.66% {
opacity: 0.25;
}
33.32% {
opacity: 0.5;
}
49.98% {
opacity: 0.75;
}
66.64% {
opacity: 0.5;
}
83.33% {
opacity: 0.25;
}
100% {
opacity: 0;
}
}
</style>

View File

@@ -1,286 +0,0 @@
<script>
let innerWidth
function dropdown(){
const innerWidth = window.innerWidth;
if(innerWidth<1024){
const check_element = this.lastChild;
const rotate_list = document.querySelectorAll(".dd-symbol-clone");
const rotate_element = this.childNodes[0].children[0];
var first_check = check_element.classList.contains("show-dropdown-content");
const nodeList = document.querySelectorAll(".dropdown-content");
if(first_check == true){
check_element.classList.remove("show-dropdown-content");
rotate_element.classList.toggle("rotate-symbol");
}else{
for (let i = 0; i < nodeList.length; i++) {
const element = nodeList[i];
element.classList.remove("show-dropdown-content");
}
for (let i = 0; i < rotate_list.length; i++) {
const element = rotate_list[i];
element.classList.remove("rotate-symbol");
}
check_element.classList.add("show-dropdown-content");
rotate_element.classList.add("rotate-symbol");
}
}
}
function hover(){
const innerWidth = window.innerWidth;
if(innerWidth>1024){
const check_element = this.firstChild.lastChild;
check_element.style.visibility = "visible";
}
}
function hoverout(){
const innerWidth = window.innerWidth;
if(innerWidth>1024){
const check_element = this.firstChild.lastChild;
check_element.style.visibility = "hidden";
}
}
function hamburger(){
const nodeList = document.querySelectorAll(".dropdown-content");
for (let i = 0; i < nodeList.length; i++) {
nodeList[i].classList.remove("show-dropdown-content");}
var element = document.getElementById("cardNavigation");
element.classList.toggle("hidden");
const spans = this.children;
var first_check = spans[0].classList.contains("hamburger-swing-0");
if(first_check == true){
for (let i = 0; i < spans.length; i++)
{spans[i].classList.remove("hamburger-swing-"+i);}
const rotate_list = document.querySelectorAll(".dd-symbol");
for (let i = 0; i < rotate_list.length; i++)
{rotate_list[i].classList.remove("rotate-symbol");}
}else{
for (let i = 0; i < spans.length; i++)
{spans[i].classList.add("hamburger-swing-"+i);} }
}
</script>
<svelte:window bind:innerWidth />
<div class="hamburger_menu py-1 px-2 bg-secondary
xs:px-4
lg:hidden">
<div id="hamburger" on:click={hamburger} on:keydown={hamburger} class="cursor-pointer">
<span></span>
<span></span>
<span></span>
</div>
</div>
<nav id="cardNavigation" class="cardNavigation box hidden relative ring-0 md:ring-2 ring-primary/50 rounded-tr-none lg:block mb-0 lg:mb-5">
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">Jetzt bestellen</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/welcher-energieausweis/">Welcher Energieausweis?</a>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
{#if innerWidth > 1023}
<a href={undefined} class="nav-element-child" >Energieausweis erstellen<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
{:else}
<a href={undefined} class="nav-element-child">Energieausweis erstellen<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
{/if}
<ul class="dropdown-content energieasusweis-erstellen">
{#if innerWidth < 1023}
<li><a href="/energieausweis-erstellen">Energieausweis erstellen</a></li>
{/if}
<li><a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/">Verbrauchsausweis erstellen</a></li>
<li><a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/">Bedarfsausweis erstellen</a></li>
<li><a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/">Verbrauchsausweis Gewerbe erstellen</a></li>
</ul>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
{#if innerWidth > 1023}
<a href={undefined} class="nav-element-child" >Angebot anfragen<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
{:else}
<a href={undefined} class="nav-element-child">Angebot anfragen<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
{/if}
<ul class="dropdown-content angebot-anfragen">
{#if innerWidth < 1023}
<li><a href="/energieausweis-erstellen">Angebot anfragen</a></li>
{/if}
<li><a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/">Bedarfsausweis Gewerbe anfragen</a></li>
<li><a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/">GEG Nachweis Wohnen anfragen</a></li>
<li><a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/">GEG Nachweis Gewerbe anfragen</a></li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan">Sanierungsfahrplan (iSFP)</a>
</div>
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">Produkte & Preise</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
<a href={undefined} class="nav-element-child">Verbrauchsausweis<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
<ul class="dropdown-content verbrauchsausweis">
{#if innerWidth < 1023}
<li><a href="index">Verbrauchsausweis</a></li>
{/if}
<li><a href="index">Verbrauchsausweis Wohngebäude</a></li>
<li><a href="index">Verbrauchsausweis online erstellen</a></li>
<li><a href="index">Häufige Fragen zum Verbrauchsausweis</a></li>
<li><a href="index">Statistiken zum Verbrauchsausweis Wohngebäude</a></li>
<li><a href="index">Verbrauchsausweis Gewerbe</a></li>
<li><a href="index">Verbrauchsausweis Gewerbe online erstellen</a></li>
<li><a href="index">Häufige Fragen zum Verbrauchsausweis Gewerbe</a></li>
<li><a href="index">Statistiken zum Verbrauchsausweis Gewerbe</a></li>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
<a href={undefined} class="nav-element-child">Bedarfsausweis<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
<ul class="dropdown-content bedarfsausweis">
{#if innerWidth < 1023}
<li><a href="index">Bedarfsausweis</a></li>
{/if}
<li><a href="index">Bedarfsausweis Wohngebäude</a></li>
<li><a href="index">Bedarfsausweis online erstellen</a></li>
<li><a href="index">Häufige Fragen zum Bedarfsausweis</a></li>
<li><a href="index">Statistiken zum Bedarfsausweis Wohngebäude</a></li>
<li><a href="index">Bedarfsausweis Gewerbe</a></li>
<li><a href="index">Bedarfsausweis Gewerbe online erstellen</a></li>
<li><a href="index">Häufige Fragen zum Bedarfsausweis Gewerbe</a></li>
<li><a href="index">Statistiken zum Bedarfsausweis Gewerbe</a></li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan">Sanierungsfahrplan</a>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
<a href={undefined} class="nav-element-child">Energieausweis<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
<ul class="dropdown-content energieausweis">
{#if innerWidth < 1023}
<li><a href="index">Energieausweis</a></li>
{/if}
<li><a href="index">Energieausweis Pflicht</a></li>
<li><a href="index">Energieausweis Kosten</a></li>
<li><a href="index">Energieausweis Haus</a></li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/energieausweis-aussteller">Energieberater finden</a>
</div>
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">FAQ & Hilfe</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
{#if innerWidth > 1023}
<a href="/bestellprozess-energieausweis" class="nav-element-child" >Bestellprozess Energieausweis<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
{:else}
<a href="/bestellprozess-energieausweis" class="nav-element-child">Bestellprozess Energieausweis<span class="dd-symbol-clone"></span><span class="dd-symbol"></span></a>
{/if}
<ul class="dropdown-content bestellprozess-energieausweis">
{#if innerWidth < 1023}
<li><a href="/bestellprozess-energieausweis">Bestellprozess Energieausweis</a></li>
{/if}
<li><a href="/bestellprozess-energieausweis/merkblatt-verbrauchsausweis-wohnen/">Merkblatt Verbrauchsausweis Wohnen</a></li>
<li><a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/">Merkblatt Bedarfsausweis Wohnen</a></li>
<li><a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/">Merkblatt Verbrauchsausweis Gewerbe</a></li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/geg/">Gebäudeenergiegesetz (GEG)</a>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/enev-zusammenfassung/">EnEV Zusammenfassung - Archiv</a>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/faq/">FAQ</a>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/glossar/">Glossar</a>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/kundenbewertungen/">Kundenbewertungen</a>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child lg:!rounded-b-lg xl:!rounded-b-xl"href="/fuer-entwickler/">Für Entwickler</a>
</div>
</nav>
<style lang="scss">
.dd-symbol::before{
content:'';
font-size:0.95rem;
position:absolute;
top:0px;
left:-7px;
animation-name: flim;
animation-duration: 2s;
animation-iteration-count: infinite;
}
.dd-symbol{visibility: hidden;}
.dd-symbol::after{
content:'';
font-size:0.95rem;
position:absolute;
top:0px;
right:-7px;
animation-name: flim;
animation-duration: 2s;
animation-delay: 1s;
animation-iteration-count: infinite;
}
@keyframes flim{
0% {opacity: 0;}
16.66% {opacity: 0.25;}
33.32% {opacity: 0.5;}
49.98% {opacity: 0.75;}
66.64% {opacity: 0.5;}
83.33% {opacity: 0.25;}
100% {opacity: 0;}
}
</style>

View File

@@ -1,253 +0,0 @@
<div class="flex flex-col gap-6">
<nav>
<div class="nav-card">
<div class="card-menu-option dropdown dropdown-right dropdown-hover">
<a href="/energieausweis-erstellen/verbrauchsausweis-wohnen"
>Energieausweis erstellen</a
>
<div class="dropdown-content">
<a href="/energieausweis-erstellen/verbrauchsausweis-wohnen">Verbrauchsausweis erstellen</a>
<a href="/bedarfsausweis">Bedarfsausweis erstellen</a>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe"
>Verbrauchsausweis Gewerbe erstellen</a
>
<a href="/bedarfsausweis-gewerbe"
>Bedarfsausweis Gewerbe anfragen</a
>
</div>
</div>
<a class="card-menu-option" href="/welcher-energieausweis"
>Welcher Energieausweis ?</a
>
<div class="card-menu-option dropdown dropdown-right dropdown-hover">
<a href="/energieausweis-erstellen/verbrauchsausweis-wohnen">Verbrauchsausweis</a>
<div class="dropdown-content">
<a
href="/energieausweis-erstellen/verbrauchsausweis-wohnenverbrauchsausweis-wohngebaeude"
>Verbrauchsausweis Wohngebäude</a
>
<a
href="/energieausweis-erstellen/verbrauchsausweis-erstellen"
>Verbrauchsausweis online erstellen</a
>
<a
href="/energieausweis-erstellen/verbrauchsausweis-wohnenhaeufige-fragen-zum-verbrauchsausweis"
>Häufige Fragen zum Verbrauchsausweis</a
>
<a
href="/energieausweis-erstellen/verbrauchsausweis-wohnenstatistiken-zum-verbrauchsausweis"
>Statistiken zum Verbrauchsausweis Wohngebäude</a
>
<hr class="nav-hr" />
<a href="/energieausweis-erstellen/verbrauchsausweis-wohnenverbrauchsausweis-gewerbe"
>Verbrauchsausweis Gewerbe</a
>
<a
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe-erstellen"
>Verbrauchsausweis Gewerbe online erstellen</a
>
<a
href="/energieausweis-erstellen/verbrauchsausweis-wohnenhaeufige-fragen-zum-verbrauchsausweis-gewerbe"
>Häufige Fragen zum Verbrauchsausweis Gewerbe</a
>
<a
href="/energieausweis-erstellen/verbrauchsausweis-wohnenstatistiken-zum-verbrauchsausweis-gewerbe"
>Statistiken zum Verbrauchsausweis Gewerbe</a
>
</div>
</div>
<div class="card-menu-option dropdown dropdown-right dropdown-hover">
<a href="/bedarfsausweis/">Bedarfsausweis</a>
<div class="dropdown-content">
<a href="/bedarfsausweis/bedarfsausweis-wohngebaeude"
>Bedarfsausweis Wohngebäude</a
>
<a
href="/energieausweis-erstellen/bedarfsausweis-erstellen"
>Bedarfsausweis online erstellen</a
>
<a
href="/bedarfsausweis/haeufige-fragen-zum-bedarfsausweis"
>Häufige Fragen zum Bedarfsausweis</a
>
<a href="/bedarfsausweis/statistiken-zum-bedarfsausweis"
>Statistiken zum Bedarfsausweis Wohngebäude</a
>
<hr class="nav-hr" />
<a href="/bedarfsausweis/bedarfsausweis-gewerbe"
>Bedarfsausweis Gewerbe</a
>
<a
href="/energieausweis-erstellen/bedarfsausweis-gewerbe-anfragen"
>Bedarfsausweis Gewerbe anfragen</a
>
<a
href="/bedarfsausweis/haeufige-fragen-zum-bedarfsausweis-gewerbe"
>Häufige Fragen zum Bedarfsausweis Gewerbe</a
>
</div>
</div>
<div class="card-menu-option dropdown dropdown-right dropdown-hover">
<a href="/">Energieausweis</a>
<div class="dropdown-content">
<a href="/energieausweis-pflicht"
>Energieausweis Pflicht</a
>
<a href="/energieausweis-kosten"
>Energieausweis Kosten</a
>
<a href="/energieausweis-haus">Energieausweis Haus</a>
</div>
</div>
<a class="card-menu-option" href="/enev-zusammenfassung"
>EnEV Zusammenfassung - Archiv</a
>
<a class="card-menu-option" href="/energieausweis-aussteller"
>Energieausweis Aussteller</a
>
<a class="card-menu-option" href="/kundenbewertungen"
>Kundenbewertungen</a
>
<a class="card-menu-option" href="/faq">FAQ</a>
<a class="card-menu-option" href="/developers">Für Entwickler</a>
</div>
</nav>
<div class="infoCard">
<div class="flex-column align-center">
<img
src="/images/right-sidebar/ing-niedersachsen.png"
alt="Mitglied Ingenieurkammer Niedersachen"
style="height: 150px;margin-bottom: 25px; width: auto;"
/>
<img
src="/images/right-sidebar/mitglied-haendlerbund.png"
alt="Mitglied im Händlerbund"
style="width:auto;
"
/>
</div>
</div>
<div class="infoCard">
<div class="heading1">Was wird der Energieausweis kosten?</div>
<hr style="margin-bottom:15px;" />
<ul>
<li>Verbrauchsausweis Wohngebäude<br />45€ inkl. MwSt.<hr /></li>
<li>Bedarfsausweis Wohngebäude<br />75€ inkl. MwSt.<hr /></li>
<li>Verbrauchsausweis Gewerbe<br />65€ inkl. MwSt.<hr /></li>
<li>Bedarfsausweis Gewerbe<br />ab 300€ inkl. MwSt.<hr /></li>
<li>EnEV-Nachweis Wohngebäude<br />ab 400€ inkl. MwSt.<hr /></li>
<li>EnEV-Nachweis Gewerbe<br />ab 450€ inkl. MwSt.</li>
</ul>
<hr />
</div>
<div class="infoCard">
<div class="heading1">Zahlungsoptionen</div>
<hr style="margin-bottom:15px;" />
<p style="text-align:center; font-size: 1.1em;">
Ihre online Zahlungen werden sicher über eine SSL Verschlüsselung
abgewickelt.
</p>
<hr style="margin-bottom:15px;" />
<div class="align-center">
<img
src="/images/left-sidebar/payment.png"
alt="Bezahloptionen - Paypal, Visa, Kreditkarte..."
/>
</div>
</div>
</div>
<style>
.nav-card {
@apply rounded-lg w-full flex flex-col shadow-md border border-base-300;
}
.infoCard {
@apply bg-base-200 border-base-300 rounded-lg border p-4 shadow-md;
}
.dropdown-content > .card-menu-option,
.dropdown-content > a {
@apply block w-[350px] bg-base-200 border text-lg px-4 py-2 border-base-300;
}
.dropdown-content > a:first-child {
@apply rounded-tr-lg rounded-tl-lg;
}
.dropdown-content > a:last-child {
@apply rounded-br-lg rounded-bl-lg;
}
.dropdown-content > .card-menu-option:hover,
.dropdown-content > a:hover {
background-color: #444f94 !important;
color: #fff !important;
}
.dropdown-content {
@apply absolute bg-base-200 left-full top-[-1px] shadow-md z-10 hidden rounded-lg;
}
.dropdown:hover > .dropdown-content {
@apply block;
}
.dropdown::after {
content: "\276F";
position: absolute;
top: 20px;
right: 10px;
font-size: 14px;
font-weight: 300;
transform: translate(0, -50%) rotate(0deg);
transition: transform 0.25s;
}
.dropdown {
position: relative;
}
.dropdown-content:hover {
display: none;
}
.dropdown::after {
content: "\276F";
font-size: 14px;
font-weight: 300;
position: absolute;
right: 10px;
top: 20px;
transform: translate(0, -50%) rotate(0deg);
transition: transform 0.25s;
}
.card-menu-option {
@apply bg-base-200 border-b border-base-300 text-base-content text-lg py-2.5 px-5 select-none no-underline w-auto cursor-pointer;
}
.nav-card .card-menu-option:first-child {
@apply rounded-tr-lg rounded-tl-lg;
}
.nav-card .card-menu-option:last-child {
@apply rounded-br-lg rounded-bl-lg;
}
.nav-card .card-menu-option a {
@apply text-base-content;
text-decoration: none;
}
.nav-card .card-menu-option:hover > a {
color: #fff;
}
.nav-card .card-menu-option:hover {
background-color: #ff7d26;
color: #fff;
text-decoration: none;
}
</style>

View File

@@ -1,144 +0,0 @@
---
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import SidebarWidgetLogin from "./SidebarWidgetLogin.svelte";
import SidebarWidgetProfile from "./SidebarWidgetProfile.svelte"
const loggedin = await validateAccessTokenServer(Astro)
---
<div class="flex flex-col gap-4">
{ !loggedin ?
<SidebarWidgetLogin client:load></SidebarWidgetLogin> : <SidebarWidgetProfile></SidebarWidgetProfile>}
<div class="infoCard">
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
Rufen Sie uns an<br /> Wir sind gerne für Sie da
</h2>
<hr style="margin-bottom:15px;" />
<div class="flex-row justify-between">
<div class="flex-column align-left">
<p>Telefonische Beratung unter</p>
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
<a href="tel:+4940209339850">040 / 209 339 850</a>
</h2>
</div>
<img
src="/images/right-sidebar/telefon-1.png"
style="width:70px; height: 73px;"
alt="Telefon - Rufen sie uns an."
/>
</div>
</div>
<div class="infoCard">
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
Bitte bewerten Sie uns!
</h2>
<hr style="margin-bottom:15px;" />
<div
class="review-widget_net"
data-uuid="d908c994-f1f2-4ab6-bad1-b2d3538086e7"
data-template="7"
data-filter=""
data-lang="de"
data-theme="light"
>
<a href="https://www.review-widget.net/" target="_blank" rel="noopener"
><img
src="https://grwapi.net/assets/spinner/spin.svg"
title="Google Review Widget"
alt="Review Widget"
/></a>
</div><script async src="https://grwapi.net/widget.min.js"></script>
<hr />
</div>
<div class="infoCard">
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
Verbrauchsausweis für Wohngebäude
</h2>
<hr style="margin-bottom:15px;" />
<div class="flex-column align-center">
<img
src="/images/right-sidebar/wohnhaus-1.png"
alt="Verbrauchsausweis ab 45€ für Wohngebäude."
/>
<a
href="/energieausweis-erstellen/verbrauchsausweis-erstellen"
class="large-button">Jetzt Verbrauchsausweis erstellen</a
>
</div>
</div>
<div class="infoCard">
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
Welche Häuser benötigen einen Energieausweis?
</h2>
<hr style="margin-bottom:15px;" />
<ul>
<li>Wohngebäude &gt; 50m² mit dauerhaftem Aufenthalt<hr /></li>
<li>Nichtwohngebäude &gt; 50m² mit dauerhaftem Aufenthalt<hr /></li>
<li>Beheizte Gebäude &gt; 50m²<hr /></li>
<li>Neubauten<hr /></li>
<li>Anbauten &gt; 50 m²<hr /></li>
<li>Sanierung mit Austausch der Heizungsanlage</li>
</ul>
<hr />
</div>
<div class="infoCard">
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
Bedarfsausweis für Wohngebäude
</h2>
<hr style="margin-bottom:15px;" />
<div class="flex-column align-center">
<img
src="/images/right-sidebar/wohnhaus-ba-1.png"
alt="Bedarfsausweis ab 75€ für Wohngebäude"
/>
<a
href="/energieausweis-erstellen/bedarfsausweis-erstellen"
class="large-button">Jetzt Bedarfsausweis erstellen</a
>
</div>
</div>
<div class="infoCard">
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
Welcher Energieausweis ist der richtige?
</h2>
<hr style="margin-bottom:15px;" />
<ul>
<li>
Verbrauchsausweis bei Vermietung, Verkauf und Aushang (Baujahr nach 1977
bzw. saniert).<hr />
</li>
<li>
Bedarfsausweis bei Neubau, Sanierung, Erweiterung und
Fördermittelantrag.
</li>
</ul>
<hr />
</div>
<div class="infoCard">
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
Verbrauchsausweis für Gewerbe
</h2>
<hr style="margin-bottom:15px;" />
<div class="flex-column align-center">
<img
src="/images/right-sidebar/gewerbe-1.png"
alt="Verbrauchsausweis Gewerbe für 65€"
/>
<a
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe-erstellen"
class="large-button">Jetzt Verbrauchsausweis erstellen</a
>
</div>
</div>
</div>
<style>
.infoCard {
@apply bg-base-200 rounded-lg border border-base-300 p-4 shadow-md;
}
</style>

View File

@@ -1,25 +0,0 @@
---
import Login from "#sidebarCards/cardlogin_1.svelte";
import Contact from "#sidebarCards/cardcontact.svelte";
import Review from "#sidebarCards/cardreview.svelte";
import VApromo from "#sidebarCards/cardVApromo.svelte";
import VAGpromo from "#sidebarCards/cardVAGpromo.svelte";
import BApromo from "#sidebarCards/cardBApromo.svelte";
import BAGpromo from "#sidebarCards/cardBAGpromo.svelte";
---
<div class="hidden
xl:flex xl:flex-col xl:grow
">
<Login client:load />
<Contact client:load />
<Review client:load />
<VApromo client:load />
<VAGpromo client:load />
<BApromo client:load />
<BAGpromo client:load />
</div>
</div>

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}

View File

@@ -0,0 +1,277 @@
import fuelList from "#components/Ausweis/brennstoffListe";
import { faker } from "@faker-js/faker";
import { Enums } from "@ibcornelsen/database/client";
import "cypress-file-upload"
describe("Verbrauchsausweis erstellen Schritt 1", () => {
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
cy.visit("/energieausweis-erstellen/verbrauchsausweis-gewerbe");
cy.wait(1000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("input[name='ausstellgrund']")
.should("have.length", Object.values(Enums.Ausstellgrund).length)
.eq(
faker.number.int({
min: 0,
max: Object.values(Enums.Ausstellgrund).length - 1,
})
)
.check();
// Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']")
.should("have.attr", "type", "number")
.type(
faker.number.int({ min: 1900, max: 2021 }).toString() +
"{enter}",
{ delay: 50 }
);
// Jetzt Füllen wir das Baujahr der Heizung aus.
cy.get("input[name='baujahr_heizung']")
.should("have.attr", "type", "number")
.type(
faker.number.int({ min: 1900, max: 2021 }).toString() +
"{enter}",
{ delay: 50 }
);
// Anzahl Einheiten
cy.get("input[name='einheiten']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 1, max: 5 }).toString());
// Sanierungsstatus
cy.get("select[name='saniert']").select(
Math.random() > 0.5 ? "true" : "false"
);
// Adresse
cy.get("input[name='adresse']").type(faker.location.streetAddress());
// Postleitzahl
cy.get("input[name='plz']").type(
faker.location.zipCode({
format: "#####",
})
);
// TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
// Flaeche
cy.get("input[name='flaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Nutzlaeche
cy.get("input[name='nutzflaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Keller
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length,
min: 1
}));
// Dachgeschoss
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length,
min: 1
}));
// Brennstoff und Einheit 1
const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
// Verbrauchszeitraum
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(faker.number.int({ min: 1, max: 12 }).toString());
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(faker.number.int({ min: 2018, max: 2019 }).toString());
// Verbrauch
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
const zusaetzlicheHeizquelle = Math.random() > 0.5;
if (zusaetzlicheHeizquelle) {
cy.get("input[name='zusaetzliche_heizquelle']").check();
// Brennstoff und Einheit 2
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
cy.get("select[name='brennstoff_2']").select(brennstoffKombo2[0]);
cy.get("select[name='einheit_2']").select(brennstoffKombo2[1]);
// Verbrauch
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
}
// Gebäudestrom
cy.get("input[name='strom_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='strom_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='strom_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// Stromverbrauch Enthält
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_heizung']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_warmwasser']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_lueftung']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_beleuchtung']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_kuehlung']").check();
// Warmwasser enthalten und bekannt
const warmwasserEnthalten = Math.random() > 0.5;
const anteilBekannt = Math.random() > 0.5;
if (warmwasserEnthalten) {
cy.get("input[name='warmwasser_enthalten']").check();
if (anteilBekannt) {
// Der Anteil ist bekannt, wir müssen ihn also angeben.
cy.get("input[name='warmwasser_anteil_bekannt']").check();
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
if (zusaetzlicheHeizquelle) {
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
}
}
}
// Thermische Kühlung enthalten
const kuehlungEnthalten = Math.random() > 0.5;
if (kuehlungEnthalten) {
cy.get("input[name='kuehlung_enthalten']").check();
cy.get("input[name='anteil_kuehlung_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
if (zusaetzlicheHeizquelle) {
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
cy.get("input[name='anteil_kuehlung_2']").type(faker.number.int({ min: 0, max: 50 }).toString());
}
}
// Alternative Energieversorgungssysteme
if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check();
if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check();
if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check();
if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check();
// Gebäudetyp
cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='gebaeudetyp']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Gebäudeteil
cy.get("select[name='gebaeudeteil']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='gebaeudeteil']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Lüftung
cy.get("select[name='lueftung']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='lueftung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Kühlung
cy.get("select[name='kuehlung']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Leerstand
cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString());
// Heizungsanlage Daten
if (Math.random() > 0.5) cy.get("input[name='zentralheizung']").check();
if (Math.random() > 0.5) cy.get("input[name='einzelofen']").check();
if (Math.random() > 0.5) cy.get("input[name='durchlauf_erhitzer']").check();
if (Math.random() > 0.5) cy.get("input[name='standard_kessel']").check();
if (Math.random() > 0.5) cy.get("input[name='solarsystem_warmwasser']").check();
if (Math.random() > 0.5) cy.get("input[name='waermepumpe']").check();
if (Math.random() > 0.5) cy.get("input[name='niedertemperatur_kessel']").check();
if (Math.random() > 0.5) cy.get("input[name='brennwert_kessel']").check();
if (Math.random() > 0.5) cy.get("input[name='warmwasser_rohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='heizungsrohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='zirkulation']").check();
if (Math.random() > 0.5) cy.get("input[name='raum_temperatur_regler']").check();
// Heizungsanlage Bilder
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" });
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/2.jpeg", { subjectType: "input" });
// Fenster Daten
if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check();
if (Math.random() > 0.5) cy.get("input[name='doppel_verglasung']").check();
if (Math.random() > 0.5) cy.get("input[name='isolier_verglasung']").check();
if (Math.random() > 0.5) cy.get("input[name='dreifach_verglasung']").check();
if (Math.random() > 0.5) cy.get("input[name='fenster_dicht']").check();
if (Math.random() > 0.5) cy.get("input[name='fenster_teilweise_undicht']").check();
if (Math.random() > 0.5) cy.get("input[name='tueren_dicht']").check();
if (Math.random() > 0.5) cy.get("input[name='tueren_undicht']").check();
if (Math.random() > 0.5) cy.get("input[name='rolllaeden_kaesten_gedaemmt']").check();
// Fenster Bilder
cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/1.jpeg", { subjectType: "input" });
cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/2.jpeg", { subjectType: "input" });
// Wärmedämmung Daten
if (Math.random() > 0.5) cy.get("input[name='aussenwand_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='keller_wand_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='keller_decke_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='dachgeschoss_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_min_12cm_gedaemmt']").check();
// Wärmedämmung Bilder
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" });
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
// Gebäude Bild
cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
// Jetzt können wir den Verbrauchsausweis erstellen.
cy.get("form[name='ausweis'] button[type='submit']").click({ force: true });
// Wir sind nicht eingeloggt also sollte jetzt ein Login Screen erscheinen.
// Wir klicken auf registrieren und erstellen einen neuen Benutzer, danach loggen wir uns mit diesem ein.
cy.get("button[name='registrieren']").click();
const email = faker.internet.email();
const passwort = faker.internet.password();
const vorname = faker.person.firstName();
const nachname = faker.person.lastName();
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").type(email);
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
cy.get("form[name='signup'] button[type='submit']").click();
// Wir sind jetzt registriert und können uns nun einloggen.
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
cy.get("form[name='login'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
cy.get("form[name='login'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.get("form[name='login'] button[type='submit']").click();
// Der Ausweis sollte jetzt schon erstellt worden sein.
});
});

View File

@@ -0,0 +1,286 @@
import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import { Enums } from "@ibcornelsen/database/client";
import "cypress-file-upload"
describe("Verbrauchsausweis erstellen Schritt 1", () => {
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
cy.visit("/energieausweis-erstellen/verbrauchsausweis-wohngebaeude");
console.log(Enums);
// cy.wait(1000);
// // Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
// cy.get("input[name='ausstellgrund']")
// .should("have.length", Object.values(Enums.Ausstellgrund).length)
// .eq(
// faker.number.int({
// min: 0,
// max: Object.values(Enums.Ausstellgrund).length - 1,
// })
// )
// .check();
// // Jetzt Füllen wir das Baujahr vom Gebäude aus.
// cy.get("input[name='baujahr_gebaeude']")
// .should("have.attr", "type", "number")
// .type(
// faker.number.int({ min: 1900, max: 2021 }).toString() +
// "{enter}",
// { delay: 50 }
// );
// // Jetzt Füllen wir das Baujahr der Heizung aus.
// cy.get("input[name='baujahr_heizung']")
// .should("have.attr", "type", "number")
// .type(
// faker.number.int({ min: 1900, max: 2021 }).toString() +
// "{enter}",
// { delay: 50 }
// );
// // Anzahl Einheiten
// cy.get("input[name='einheiten']")
// .should("have.attr", "type", "number")
// .type(faker.number.int({ min: 1, max: 5 }).toString());
// // Sanierungsstatus
// cy.get("select[name='saniert']").select(
// Math.random() > 0.5 ? "true" : "false"
// );
// // Adresse
// cy.get("input[name='adresse']").type(faker.location.streetAddress());
// // Postleitzahl
// cy.get("input[name='plz']").type(
// faker.location.zipCode({
// format: "#####",
// })
// );
// // TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
// // Flaeche
// cy.get("input[name='flaeche']")
// .should("have.attr", "type", "number")
// .type(faker.number.int({ min: 50, max: 1000 }).toString());
// // Nutzflaeche
// cy.get("input[name='nutzflaeche']")
// .should("have.attr", "type", "number")
// .type(faker.number.int({ min: 50, max: 1000 }).toString());
// // Keller
// cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
// max: Object.values(Enums.Heizungsstatus).length,
// min: 1
// }));
// // Dachgeschoss
// cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
// max: Object.values(Enums.Heizungsstatus).length,
// min: 1
// }));
// // Brennstoff und Einheit 1
// const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
// cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
// cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
// // Verbrauchszeitraum
// cy.get("select[name='energieverbrauch_zeitraum_monat']").select(faker.number.int({ min: 1, max: 12 }).toString());
// cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(faker.number.int({ min: 2018, max: 2019 }).toString());
// // Verbrauch
// cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// const zusaetzlicheHeizquelle = Math.random() > 0.5;
// if (zusaetzlicheHeizquelle) {
// cy.get("input[name='zusaetzliche_heizquelle']").check();
// // Brennstoff und Einheit 2
// const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
// cy.get("select[name='brennstoff_2']").select(brennstoffKombo2[0]);
// cy.get("select[name='einheit_2']").select(brennstoffKombo2[1]);
// // Verbrauch
// cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// }
// // Warmwasser enthalten und bekannt
// const warmwasserEnthalten = Math.random() > 0.5;
// const anteilBekannt = Math.random() > 0.5;
// if (warmwasserEnthalten) {
// cy.get("input[name='warmwasser_enthalten']").check();
// if (anteilBekannt) {
// // Der Anteil ist bekannt, wir müssen ihn also angeben.
// cy.get("input[name='warmwasser_anteil_bekannt']").check();
// cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
// if (zusaetzlicheHeizquelle) {
// // Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
// cy.get("input[name='anteil_warmwasser_2']").type(faker.number.int({ min: 0, max: 50 }).toString());
// }
// }
// }
// // Alternative Energieversorgungssysteme
// if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check();
// if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check();
// if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check();
// if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check();
// // Gebäudetyp
// cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
// const options = $dropdown.find('option');
// // Select the option at the random index
// cy.get("select[name='gebaeudetyp']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
// });
// // Gebäudeteil
// cy.get("select[name='gebaeudeteil']").then(($dropdown) => {
// const options = $dropdown.find('option');
// // Select the option at the random index
// cy.get("select[name='gebaeudeteil']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
// });
// // Lüftung
// cy.get("select[name='lueftung']").then(($dropdown) => {
// const options = $dropdown.find('option');
// // Select the option at the random index
// cy.get("select[name='lueftung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
// });
// // Kühlung
// cy.get("select[name='kuehlung']").then(($dropdown) => {
// const options = $dropdown.find('option');
// // Select the option at the random index
// cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
// });
// // Leerstand
// cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString());
// // Heizungsanlage Daten
// if (Math.random() > 0.5) cy.get("input[name='zentralheizung']").check();
// if (Math.random() > 0.5) cy.get("input[name='einzelofen']").check();
// if (Math.random() > 0.5) cy.get("input[name='durchlauf_erhitzer']").check();
// if (Math.random() > 0.5) cy.get("input[name='standard_kessel']").check();
// if (Math.random() > 0.5) cy.get("input[name='solarsystem_warmwasser']").check();
// if (Math.random() > 0.5) cy.get("input[name='waermepumpe']").check();
// if (Math.random() > 0.5) cy.get("input[name='niedertemperatur_kessel']").check();
// if (Math.random() > 0.5) cy.get("input[name='brennwert_kessel']").check();
// if (Math.random() > 0.5) cy.get("input[name='warmwasser_rohre_gedaemmt']").check();
// if (Math.random() > 0.5) cy.get("input[name='heizungsrohre_gedaemmt']").check();
// if (Math.random() > 0.5) cy.get("input[name='zirkulation']").check();
// if (Math.random() > 0.5) cy.get("input[name='raum_temperatur_regler']").check();
// // Heizungsanlage Bilder
// cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" });
// cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/2.jpeg", { subjectType: "input" });
// // Fenster Daten
// if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check();
// if (Math.random() > 0.5) cy.get("input[name='doppel_verglasung']").check();
// if (Math.random() > 0.5) cy.get("input[name='isolier_verglasung']").check();
// if (Math.random() > 0.5) cy.get("input[name='dreifach_verglasung']").check();
// if (Math.random() > 0.5) cy.get("input[name='fenster_dicht']").check();
// if (Math.random() > 0.5) cy.get("input[name='fenster_teilweise_undicht']").check();
// if (Math.random() > 0.5) cy.get("input[name='tueren_dicht']").check();
// if (Math.random() > 0.5) cy.get("input[name='tueren_undicht']").check();
// if (Math.random() > 0.5) cy.get("input[name='rolllaeden_kaesten_gedaemmt']").check();
// // Fenster Bilder
// cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/1.jpeg", { subjectType: "input" });
// cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/2.jpeg", { subjectType: "input" });
// // Wärmedämmung Daten
// if (Math.random() > 0.5) cy.get("input[name='aussenwand_gedaemmt']").check();
// if (Math.random() > 0.5) cy.get("input[name='keller_wand_gedaemmt']").check();
// if (Math.random() > 0.5) cy.get("input[name='keller_decke_gedaemmt']").check();
// if (Math.random() > 0.5) cy.get("input[name='dachgeschoss_gedaemmt']").check();
// if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check();
// if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_min_12cm_gedaemmt']").check();
// // Wärmedämmung Bilder
// cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" });
// cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
// // Gebäude Bild
// cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
// // Jetzt können wir den Verbrauchsausweis erstellen.
// cy.get("form[name='ausweis'] button[type='submit']").click({ force: true });
// // Wir sind nicht eingeloggt also sollte jetzt ein Login Screen erscheinen.
// // Wir klicken auf registrieren und erstellen einen neuen Benutzer, danach loggen wir uns mit diesem ein.
// cy.get("button[name='registrieren']").click();
// const email = faker.internet.email();
// const passwort = "test1234";
// const vorname = faker.person.firstName();
// const nachname = faker.person.lastName();
// cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").type(email);
// cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
// cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
// cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
// cy.get("form[name='signup'] button[type='submit']").click();
// // Wir sind jetzt registriert und können uns nun einloggen.
// // Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
// cy.get("form[name='login'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
// cy.get("form[name='login'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
// cy.get("form[name='login'] button[type='submit']").click();
// // Der Ausweis sollte jetzt schon erstellt worden sein und wir sollten auf die kundendaten seite weitergeleitet worden sein.
// cy.url().should("contain", "/kundendaten");
// cy.wait(1000)
// // Wir füllen jetzt die Kundendaten aus.
// cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
// cy.get("input[name='vorname']").should("contain.value", vorname);
// cy.get("input[name='name']").should("contain.value", nachname);
// cy.get("input[name='email']").should("contain.value", email);
// cy.get("input[name='telefon']").type(faker.phone.number());
// cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`);
// cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress());
// // TODO: Random Plz generieren, allerdings muss die auch in der Datenbank vorhanden sein...
// cy.get("input[name='rechnung_plz']").type("2103");
// // Jetzt sollte der PLZ Container erscheinen, dort klicken wir einfach das erste Element an.
// cy.get("div[data-test='plz-container']").children().first().click();
// cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
// cy.get("input[name='rechnung_email']").type(faker.internet.email());
// cy.get("button[data-test='paypal']").click();
// // Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab.
// cy.get("input[name='agb-akzeptieren']").check()
// cy.get("input[name='datenschutz-akzeptieren']").check()
// cy.get("button[type='submit']").click();
// cy.origin('https://www.mollie.com', () => {
// // Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus
// cy.get("input[type='radio'][name='final_state'][value='paid']").check();
// // Da wird unser Test fehlschlagen, da die localhost domain von Mollie aus nicht erreichbar ist.
// })
});
});

View File

@@ -0,0 +1,48 @@
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import {faker} from "@faker-js/faker";
describe('Benutzer Authentifizierung', () => {
// Wir generieren uns einen zufälligen Nutzer
const email = faker.internet.email()
const password = faker.internet.password()
const name = faker.person.firstName()
const surname = faker.person.lastName()
it("erstellt einen Nutzer und leitet auf die Login Seite weiter", () => {
cy.visit("/auth/signup")
cy.wait(1000)
cy.get('input[name="email"]').type(email)
cy.get('input[name="passwort"]').type(password)
cy.get('input[name="vorname"]').type(name)
cy.get('input[name="name"]').type(surname)
cy.get('button[type="submit"]').click()
cy.url().should("include", "/auth/login")
})
it("meldet einen Nutzer an und leitet auf die Startseite weiter", () => {
cy.visit("/auth/login")
cy.wait(1000)
cy.get('input[name="email"]').type(email)
cy.get('input[name="passwort"]').type(password)
cy.get('button[type="submit"]').click()
cy.url().should("include", "/dashboard")
// Wir sollten nun einen Access Token und Refresh Token in unseren Cookies sehen.
cy.getCookie(API_ACCESS_TOKEN_COOKIE_NAME).should("exist")
cy.getCookie(API_REFRESH_TOKEN_COOKIE_NAME).should("exist")
})
it("meldet einen Nutzer ab und leitet auf die Login Seite weiter", () => {
cy.visit("/auth/logout")
cy.url().should("include", "/auth/login")
})
})

View File

@@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -0,0 +1,37 @@
/// <reference types="cypress" />
// ***********************************************
// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
//
// declare global {
// namespace Cypress {
// interface Chainable {
// login(email: string, password: string): Chainable<void>
// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
// }
// }
// }

View File

@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Components App</title>
</head>
<body>
<div data-cy-root></div>
</body>
</html>

View File

@@ -0,0 +1,39 @@
// ***********************************************************
// This example support/component.ts is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands.js'
// Alternatively you can use CommonJS syntax:
// require('./commands')
import { mount } from 'cypress/svelte'
// Augment the Cypress namespace to include type definitions for
// your custom command.
// Alternatively, can be defined in cypress/support/component.d.ts
// with a <reference path="./component" /> at the top of your spec.
declare global {
namespace Cypress {
interface Chainable {
mount: typeof mount
}
}
}
Cypress.Commands.add('mount', mount)
// Example use:
// cy.mount(MyComponent)

File diff suppressed because one or more lines are too long

8
src/env.d.ts vendored
View File

@@ -1,4 +1,12 @@
/// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" />
/// <reference types="../.astro/astro-typesafe-api.d.ts" />
/// <reference path="../.astro-i18n/generated.d.ts" />
/// <reference path="../.astro/astro-typesafe-api.d.ts" />
declare module "*.csv" {
export default <{ [key: string]: any }>Array;
}

View File

@@ -2,9 +2,9 @@
import "../style/global.css";
import "../style/formular.css";
import "../../svelte-dialogs.config"
import Header from "#header/AusweisHeader.astro";
import Footer from "#footer/Footer.astro";
import SidebarLeft from "#sidebarLeft/SidebarLeft.astro";
import Header from "#components/design/header/AusweisHeader.astro";
import Footer from "#components/design/footer/Footer.astro";
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {

View File

@@ -2,9 +2,9 @@
import "../style/global.css";
import "../style/formular.css";
import "../../svelte-dialogs.config"
import Header from "#header/AusweisHeader.astro";
import Footer from "#footer/Footer.astro";
import SidebarLeft from "#sidebarLeft/SidebarLeft.astro";
import Header from "#components/design/header/AusweisHeader.astro";
import Footer from "#components/design/footer/Footer.astro";
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {

View File

@@ -1,7 +1,5 @@
---
import i18next from "i18next";
import "../style/global.scss";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {
@@ -37,7 +35,7 @@ const schema = JSON.stringify({
---
<!DOCTYPE html>
<html lang={i18next.language}>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />

View File

@@ -1,10 +1,10 @@
---
import "../style/global.css";
import "../../svelte-dialogs.config"
import Header from "#header/Header.astro";
import Footer from "#footer/Footer.astro";
import SidebarLeft from "#sidebarLeft/SidebarLeft.astro";
import SidebarRight from "#sidebarRight/SidebarRight.astro";
import Header from "#components/design/header/Header.astro";
import Footer from "#components/design/footer/Footer.astro";
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
import SidebarRight from "#components/design/sidebars/SidebarRight.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {

View File

@@ -1,63 +0,0 @@
---
import "../style/global.css";
import "../../svelte-dialogs.config"
import Header from "#header/Header_1.astro";
import Footer from "#footer/Footer.astro";
import SidebarLeft from "#sidebarLeft/SidebarLeft.astro";
import SidebarRight from "#sidebarRight/SidebarRight_1.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {
title: string;
}
const { title } = Astro.props;
---
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
<meta
name="description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<title>
{title || "Energieausweis online erstellen - Online Energieausweis"}
</title>
</head>
<body>
<container class="w-full max-w-[1920px]">
<Header />
<main
class="w-full p-0 grid
sm:grid-cols-[minmax(1fr,1fr)] sm:gap-1 sm:px-0
md:grid-cols-[minmax(1fr,1fr)] md:gap-2 md:px-0
lg:grid-cols-[minmax(250px,250px)1fr] lg:gap-3 lg:p-3
xl:grid-cols-[minmax(350px,350px)1fr] xl:gap-4 xl:p-4
2xl:grid-cols-[minmax(350px,350px)1fr_minmax(350px,350px)] 2xl:gap-5 2xl:p-5
">
<SidebarLeft />
<article class="box grow rounded-tl-none">
<slot />
</article>
<SidebarRight />
</main>
<Footer />
<NotificationWrapper client:load />
</container>
</body>
</html>

View File

@@ -1,5 +1,4 @@
---
import i18next from "i18next";
import "#style/global.css";
import "../../svelte-dialogs.config"
@@ -42,7 +41,7 @@ const lightTheme = Astro.cookies.get("theme")?.value === "light";
---
<!DOCTYPE html>
<html lang={i18next.language}>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />

View File

@@ -1,154 +0,0 @@
---
import i18next from "i18next";
import "../style/UMBE_global.css";
import "#style/global.css";
import "../../svelte-dialogs.config"
import Footer from "../components/Footer.astro";
import Header from "../components/Header.astro";
import SidebarLeft from "../components/SidebarLeft.astro";
import SidebarRight from "../components/SidebarRight.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
import TicketPopup from "../components/Tickets/TicketButton.svelte"
export interface Props {
title: string;
}
const { title } = Astro.props;
const schema = JSON.stringify({
"@context": "http://schema.org",
"@type": "Corporation",
name: "IB Cornelsen",
alternateName: "online-energieausweis.org",
url: "https://online-energieausweis.org",
logo: "https://online-energieausweis.org/ib-cornelsen.png",
address: {
"@type": "PostalAddress",
streetAddress: "Katendeich 5A",
addressLocality: "Hamburg",
postalCode: "21035",
addressCountry: "Deutschland",
email: "info@online-energieausweis.org",
},
contactPoint: {
"@type": "ContactPoint",
telephone: "+49-040-209339850",
faxNumber: "+49-040-209339859",
contactType: "customer service",
areaServed: "DE",
availableLanguage: "German",
},
});
---
<!DOCTYPE html>
<html lang={i18next.language}>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<script type="application/ld+json" set:html={schema}></script>
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
<meta
name="description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<link rel="canonical" href="https://online-energieausweis.org/" />
<meta property="og:locale" content="de_DE" />
<meta property="og:type" content="website" />
<meta
property="og:title"
content="Energieausweis online erstellen - Online Energieausweis"
/>
<meta
property="og:description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<meta property="og:url" content="https://online-energieausweis.org/" />
<meta
property="og:site_name"
content="Energieausweis online erstellen"
/>
<meta name="twitter:card" content="summary_large_image" />
<meta
name="twitter:description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<meta
name="twitter:title"
content="Energieausweis online erstellen - Online Energieausweis"
/>
<meta
name="twitter:image"
content="https://online-energieausweis.org/images/energieausweis-online-erstellen.jpg"
/>
<title>
{title || "Energieausweis online erstellen - Online Energieausweis"}
</title>
</head>
<body>
<Header />
<main
class="lg:grid gap-6 md:p-6 lg:grid-cols-[2fr,6fr,2fr] max-w-[1920px] w-full bg-base-100"
>
<SidebarLeft />
<article class="w-full max-w-full bg-base-200 border border-base-300">
<slot />
</article>
<div class="hidden lg:block">
<SidebarRight />
<div>
</main>
<Footer />
<NotificationWrapper client:load />
<TicketPopup client:load />
</body>
</html>
<style is:global lang="scss">
:root {
@apply bg-base-100 text-base-content;
}
article {
@apply rounded-lg w-full shadow-md border;
}
.mainContent {
p, h1, h2, h3, h4, h5, h6 {
@apply text-base-content;
}
}
body {
min-height: 100vh;
}
.button {
@apply px-8 py-2 bg-secondary rounded-lg text-white font-medium hover:shadow-lg transition-all hover:underline active:bg-blue-900 text-center cursor-pointer;
color: #fff !important;
}
h3 {
@apply text-xl font-medium mt-6 mb-4;
}
input {
@apply py-1.5 px-4 w-full rounded-lg outline-none text-lg text-slate-700 border bg-gray-50 transition-colors;
}
input:hover,
input:focus {
@apply bg-gray-100;
}
label {
@apply text-base font-semibold;
}
</style>

View File

@@ -1,5 +1,4 @@
---
import i18next from "i18next";
import "#style/global.css";
import "../../svelte-dialogs.config"
@@ -54,7 +53,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
---
<!DOCTYPE html>
<html lang={i18next.language}>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />

View File

@@ -1,23 +0,0 @@
---
---
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
<meta
name="description"
content="IB Cornelsen - Widget"
/>
<title>
IB Cornelsen - Widget
</title>
</head>
<body>
<slot />
</body>
</html>

View File

@@ -1,10 +1,10 @@
---
import "../style/global.css";
import "../../svelte-dialogs.config"
import Header from "#header/Header.astro";
import Footer from "#footer/Footer.astro";
import SidebarLeft from "#sidebarLeft/SidebarLeft.astro";
import SidebarRight from "#sidebarRight/SidebarRight.astro";
import Header from "#components/design/header/Header.astro";
import Footer from "#components/design/footer/Footer.astro";
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
import SidebarRight from "#components/design/sidebars/SidebarRight.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {

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

@@ -24,7 +24,9 @@ export function A9BerechnungNutzenergiebedarfTrinkwarmwasser(ausweis: Bedarfsaus
if (flaecheProEinheit < 10) {
flaechenBezogenerWaermebedarf = 16.5
} else if (flaecheProEinheit < 160) {
} else if (flaecheProEinheit >= 160) {
flaechenBezogenerWaermebedarf = 8.5
} else {
flaechenBezogenerWaermebedarf = linearInterpolation([{
x: 10,
y: 16
@@ -32,9 +34,6 @@ export function A9BerechnungNutzenergiebedarfTrinkwarmwasser(ausweis: Bedarfsaus
x: 150,
y: 9
}], flaecheProEinheit)
} else {
flaechenBezogenerWaermebedarf = 8.5
}
// Q_w,b

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

@@ -0,0 +1,82 @@
// Beispiel für Tabellen 59-62, Beispielwert Spalte1=235
type DataPoint = {
Spalte1: number;
Spalte2: number;
Spalte3: number;
Spalte4: number;
Spalte5: number;
Spalte6: number;
Spalte7: number;
Spalte8: number;
};
function interpolateForX(data: DataPoint[], x: number): DataPoint | null {
// Sort the data by Spalte1
data.sort((a, b) => a.Spalte1 - b.Spalte1);
// Ensure x is within range
if (x < data[0].Spalte1 || x > data[data.length - 1].Spalte1) {
console.error("Target value is out of interpolation range.");
return null;
}
// Find the two points to interpolate between
let lower: DataPoint | null = null;
let upper: DataPoint | null = null;
for (let i = 0; i < data.length - 1; i++) {
if (data[i].Spalte1 <= x && data[i + 1].Spalte1 >= x) {
lower = data[i];
upper = data[i + 1];
break;
}
}
if (!lower || !upper) {
console.error("Could not find interpolation bounds.");
return null;
}
// Linear interpolation function
const interpolateValue = (x1: number, y1: number, x2: number, y2: number, x: number) => {
return y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);
};
// Perform interpolation for all columns
return {
Spalte1: x,
Spalte2: interpolateValue(lower.Spalte1, lower.Spalte2, upper.Spalte1, upper.Spalte2, x),
Spalte3: interpolateValue(lower.Spalte1, lower.Spalte3, upper.Spalte1, upper.Spalte3, x),
Spalte4: interpolateValue(lower.Spalte1, lower.Spalte4, upper.Spalte1, upper.Spalte4, x),
Spalte5: interpolateValue(lower.Spalte1, lower.Spalte5, upper.Spalte1, upper.Spalte5, x),
Spalte6: interpolateValue(lower.Spalte1, lower.Spalte6, upper.Spalte1, upper.Spalte6, x),
Spalte7: interpolateValue(lower.Spalte1, lower.Spalte7, upper.Spalte1, upper.Spalte7, x),
Spalte8: interpolateValue(lower.Spalte1, lower.Spalte8, upper.Spalte1, upper.Spalte8, x),
};
}
// Example usage with the complete dataset
const dataset: DataPoint[] = [
{ Spalte1: 100, Spalte2: 130, Spalte3: 121, Spalte4: 251, Spalte5: 3.36, Spalte6: 1296, Spalte7: 2.04, Spalte8: 1391 },
{ Spalte1: 150, Spalte2: 174, Spalte3: 137, Spalte4: 295, Spalte5: 4.51, Spalte6: 1740, Spalte7: 2.73, Spalte8: 1866 },
{ Spalte1: 200, Spalte2: 219, Spalte3: 153, Spalte4: 372, Spalte5: 5.67, Spalte6: 2186, Spalte7: 3.43, Spalte8: 2345 },
{ Spalte1: 300, Spalte2: 308, Spalte3: 182, Spalte4: 489, Spalte5: 7.98, Spalte6: 3075, Spalte7: 4.83, Spalte8: 3299 },
{ Spalte1: 400, Spalte2: 396, Spalte3: 207, Spalte4: 604, Spalte5: 10.27, Spalte6: 3961, Spalte7: 6.22, Spalte8: 4249 },
{ Spalte1: 500, Spalte2: 486, Spalte3: 231, Spalte4: 717, Spalte5: 12.59, Spalte6: 4853, Spalte7: 7.62, Spalte8: 5205 },
{ Spalte1: 600, Spalte2: 575, Spalte3: 253, Spalte4: 828, Spalte5: 14.89, Spalte6: 5740, Spalte7: 9.01, Spalte8: 6157 },
{ Spalte1: 700, Spalte2: 664, Spalte3: 274, Spalte4: 938, Spalte5: 17.2, Spalte6: 6629, Spalte7: 10.41, Spalte8: 7111 },
{ Spalte1: 800, Spalte2: 752, Spalte3: 294, Spalte4: 1046, Spalte5: 19.49, Spalte6: 7512, Spalte7: 11.79, Spalte8: 8057 },
{ Spalte1: 900, Spalte2: 841, Spalte3: 313, Spalte4: 1154, Spalte5: 21.79, Spalte6: 8400, Spalte7: 13.19, Spalte8: 9010 },
{ Spalte1: 1000, Spalte2: 930, Spalte3: 331, Spalte4: 1261, Spalte5: 24.11, Spalte6: 9293, Spalte7: 14.59, Spalte8: 9969 },
{ Spalte1: 2000, Spalte2: 1819, Spalte3: 484, Spalte4: 2303, Spalte5: 47.14, Spalte6: 18172, Spalte7: 28.53, Spalte8: 19348 },
{ Spalte1: 3000, Spalte2: 2703, Spalte3: 606, Spalte4: 3309, Spalte5: 70.04, Spalte6: 27001, Spalte7: 42.39, Spalte8: 28798 },
{ Spalte1: 4000, Spalte2: 3592, Spalte3: 714, Spalte4: 4306, Spalte5: 93.08, Spalte6: 35881, Spalte7: 56.33, Spalte8: 38298 },
{ Spalte1: 5000, Spalte2: 4486, Spalte3: 812, Spalte4: 5298, Spalte5: 116.25, Spalte6: 44815, Spalte7: 70.35, Spalte8: 47835 },
];
const x = 235; // Example Spalte1 value to interpolate
const interpolatedResult = interpolateForX(dataset, x);
console.log(interpolatedResult);

View File

@@ -0,0 +1,113 @@
import bilanzInnentemperaturEinfamilienhaus from "./tabellen/18599-12-T8-bilanz-innentemperatur-einfamilienhaus.csv";
import bilanzInnentemperaturMehrfamilienhaus from "./tabellen/18599-12-T10-bilanz-innentemperatur-wohngebaeude-mehrfamilienhaus.csv";
import mittlereMonatlicheAuslastungEinfamilienhaus from "./tabellen/18599-12-T9-mittlere-monatliche-aussentemperaturabhaengige-belastung-wohngebauede-einfamilienhaus.csv";
import mittlereMonatlicheAuslastungMehrfamilienhaus from "./tabellen/18599-12-T9-mittlere-monatliche-aussentemperaturabhaengige-belastung-wohngebauede-mehrfamilienhaus.csv";
import { BedarfsausweisWohnenClient } from "#components/Ausweis/types.js";
type BilanzInnenTemperatur = {
monat: string;
ohne_teilbeheizung: number;
"5": number;
"10": number;
"25": number;
"50": number;
"75": number;
"100": number;
"125": number;
"150": number;
zeitkonstante: number;
};
function berechnungWaermetransferkoeffizienten() {}
function berechnungHuellflaeche(ausweis: BedarfsausweisWohnenClient) {
return (
(ausweis.dachfenster_flaeche ?? 0) +
(ausweis.fenster_flaeche_1 ?? 0) +
(ausweis.fenster_flaeche_2 ?? 0) +
(ausweis.fensterflaeche_nw_no ?? 0) +
(ausweis.fensterflaeche_so_sw ?? 0) +
(ausweis.haustuer_flaeche ?? 0) +
(ausweis.dachflaeche ?? 0) +
(ausweis.aussenwand_flaeche ?? 0) +
// TODO: Ist das hier nötig? Kellerdecke zum unbeheizten Keller/Erdreich?
(ausweis.fussboden_flaeche ?? 0)
);
}
function getWaermebrueckenzuschlag(ausweis: BedarfsausweisWohnenClient) {
// Ohne Nachweis allgemein
return 0.1;
// Bei Außenbauteilen mit innenliegender Dämmschicht und einbindender Massivdecke
return 0.15;
// Mit Überprüfung und Einhaltung der Gleichwertigkeit nach DIN 4108 - Beiblatt 2: Alle Anschlüsse erfüllen die Merkmale und Kriterien nach Kategorie B
return 0.03;
// Mit Überprüfung und Einhaltung der Gleichwertigkeit nach DIN 4108 - Beiblatt 2: Alle anderen Fälle als in Zeile 3 genannt
return 0.05;
}
function getSumOfWaermetransferkoeffizientTransmission(
ausweis: BedarfsausweisWohnenClient
) {
// Zur Berechnung von H_Ti aller einzelnen Gebäudeteile wird von den folgenden Wärmedurchgangskoeffizienten ausgegangen:
// Außenwand : 0.2
// Fenster : 0.95
// Haustür : 1.3
// Dach : 0.13
// Kellerdecke : 0.21
return (
((ausweis.dachfenster_flaeche ?? 0) * 0.95) +
((ausweis.fenster_flaeche_1 ?? 0) * 0.95) +
((ausweis.fenster_flaeche_2 ?? 0) * 0.95) +
((ausweis.fensterflaeche_nw_no ?? 0) * 0.95) +
((ausweis.fensterflaeche_so_sw ?? 0) * 0.95) +
((ausweis.haustuer_flaeche ?? 0) * 1.3) +
((ausweis.dachflaeche ?? 0) * 0.13) +
((ausweis.aussenwand_flaeche ?? 0) * 0.2) +
// TODO: Ist das hier nötig? Kellerdecke zum unbeheizten Keller/Erdreich?
((ausweis.fussboden_flaeche ?? 0) * 0.21)
);
}
export function berechnungNutzenergiebedarfHeizen(
ausweis: BedarfsausweisWohnenClient
) {
const mittlereAussentemperatur = [
1, 1.9, 4.7, 9.2, 14.1, 16.7, 19, 18.6, 14.3, 9.4, 4.1, 0.9,
];
const mindestAussenTemperatur = -12;
const temperaturInnenHeizungSollwert = 20;
// A
const huellflaeche = berechnungHuellflaeche(ausweis);
// DELTA_U_WB
const waermebrueckenzuschlag = getWaermebrueckenzuschlag(ausweis);
// H_T,WB
const waermebrueckenTransferKoeffizient =
waermebrueckenzuschlag * huellflaeche;
// H_T,ges
const waermeTransferKoeffizientTransmission =
getSumOfWaermetransferkoeffizientTransmission(ausweis) + waermebrueckenTransferKoeffizient;
for (let i = 0; i < 12; i++) {
const tageImMonat = new Date(0, i, 0).getDate();
const monatName = new Date(0, i, 0).toLocaleString("de-DE", {
month: "long",
});
// Gebäudeschwere wird in der Planung festgelegt. Wir verwenden eigentlich immer mittelschwer.
const bilanzInnenTemperatur = bilanzInnentemperaturEinfamilienhaus.find(
(row: BilanzInnenTemperatur) => row.monat === monatName && row.zeitkonstante == 90
);
}
// const leistungHeizungWaermesenke =
// ((waermeleistungGesamt *
// (temperaturInnenHeizung - mindestAussenTemperatur)) /
// (temperaturInnenHeizungSollwert - mindestAussenTemperatur)) *
// mittlererExternerBelastungsgrad;
}

View File

@@ -0,0 +1,28 @@
import { BedarfsausweisWohnenClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { FixedLengthArray } from "./types.js";
export function berechnungRechnerischeLauzeitHeizung(ausweis: VerbrauchsausweisWohnenClient) {
// TODO Tabelle A.12 (Berechnung Nutzenergiebedarf)
const zeitkonstanteHeizung;
const faktorWochenendAbschaltung = 0.042;
const zeitkonstanteRechnerischeLaufzeitEinfamilienhaus: FixedLengthArray<number, 12> = [17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17];
const zeitkonstanteRechnerischeLaufzeitMehrfamilienhaus: FixedLengthArray<number, 12> = [19.86, 18.58, 18.69, 17.25, 17, 17, 17, 17, 17, 17.16, 18.88, 19.9];
let rechnerischeLaufzeiten = new Array(12).fill(0) as unknown as FixedLengthArray<number, 12>
if (ausweis.aufnahme.gebaeudetyp === "Einfamilienhaus") {
for (let i = 0; i < 12; i++) {
rechnerischeLaufzeiten[i] = zeitkonstanteHeizung * faktorWochenendAbschaltung * zeitkonstanteRechnerischeLaufzeitEinfamilienhaus[i]
}
} else {
for (let i = 0; i < 12; i++) {
rechnerischeLaufzeiten[i] = zeitkonstanteHeizung * faktorWochenendAbschaltung * zeitkonstanteRechnerischeLaufzeitMehrfamilienhaus[i]
}
}
return {
rechnerischeLaufzeitGesamt: rechnerischeLaufzeiten.reduce((acc, curr) => acc + curr, 0),
rechnerischeLaufzeiten
}
}

View File

@@ -0,0 +1,19 @@
import { BedarfsausweisWohnenClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types.js";
import { berechnungNutzenergiebedarfTrinkwarmwasser } from "./BerechnungNutzenergiebedarfTrinkwarmwasser.js";
import { FixedLengthArray } from "./types.js";
export function berechnungWaermequellenAusAnlagentechnikTrinkwasser(ausweis: BedarfsausweisWohnenClient, gebaeude_aufnahme: GebaeudeAufnahmeClient) {
const trinkwasserWaermebedarf = berechnungNutzenergiebedarfTrinkwarmwasser(ausweis, gebaeude_aufnahme);
const result = new Array(12).fill(0) as unknown as FixedLengthArray<number, 12>
for (let i = 0; i < 12; i++) {
const tageImMonat = new Date(0, i, 0).getDate();
const monatlicheTrinkwasserWaermebedarf = trinkwasserWaermebedarf.trinkwasserWaermebedarf / 365 * tageImMonat;
}
return result;
}

View File

@@ -0,0 +1,8 @@
import type { VerbrauchsausweisWohnen } from "@ibcornelsen/database/client"
export function BerechnungWaermesenken(ausweis: VerbrauchsausweisWohnen) {
// Außentemperatur nach Monat (Januar - Dezember)
const aussenTemperatur = [1, 1.9, 4.7, 9.2, 14.1, 16.7, 19, 18.6, 14.3, 9.5, 4.1, 0.9];
const bilanzInnenTemperatur = []
}

View File

@@ -1,7 +1,6 @@
// Funktion zur Berechnung der Bilanzinnentemperatur aus Tabelle 8 EFH oder Tabelle 10 MFH
import { cubicSplineInterpolation } from "js-interpolate";
import { any } from "node_modules/cypress/types/bluebird/index.js";
// aus Eingabeformular
let WohnEinheiten = 2;
@@ -149,7 +148,7 @@ const HeizLast = [0, 5, 10, 25, 50, 75, 100, 125, 150];
// jede einzeln interpolieren und dann zwischen den Tabellen interpolieren.
// Falls wir also den Wert an Stelle Heizlast: 120, Zeitkonstante 100, Monat:
// Januar haben wollen:
export function funktionBilanzInnentemperatur(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset): number {
export function funktionBilanzInnentemperatur(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset): number {
const data = dataset[monat]
const interpolations: number[] = []
@@ -157,7 +156,7 @@ export function funktionBilanzInnentemperatur(heizlast: number, zeitkonstane: nu
for (const key in data) {
const values = data[key as unknown as keyof typeof data]
const interpolated = cubicSplineInterpolation(
const interpolated = cubicSplineInterpolation(
values.map((value, i) => ({ x: HeizLast[i], y: value })),
heizlast
)
@@ -165,7 +164,7 @@ export function funktionBilanzInnentemperatur(heizlast: number, zeitkonstane: nu
interpolations.push(interpolated)
}
const interpolated = cubicSplineInterpolation(
const interpolated = cubicSplineInterpolation(
interpolations.map((interpolation, i) => {
return {
x: Object.keys(data)[i],

View File

@@ -2,8 +2,7 @@
import { cubicSplineInterpolation } from "js-interpolate";
// aus Eingabeformular
let WohnEinheiten = 3;
let wohneinheiten = 3;
const datasetEinfamilienHausMittlereBelastung = {
Januar: {
@@ -156,7 +155,7 @@ export function funktionMonatlicherBelastungsgrad(heizlast: number, zeitkonstane
for (const key in data) {
const values = data[key as unknown as keyof typeof data]
const interpolated = cubicSplineInterpolation(
const interpolated = cubicSplineInterpolation(
values.map((value, i) => ({ x: HeizLast[i], y: value })),
heizlast
)
@@ -164,7 +163,7 @@ export function funktionMonatlicherBelastungsgrad(heizlast: number, zeitkonstane
interpolations.push(interpolated)
}
const interpolated = cubicSplineInterpolation(
const interpolated = cubicSplineInterpolation(
interpolations.map((interpolation, i) => {
return {
x: Object.keys(data)[i],
@@ -175,4 +174,4 @@ export function funktionMonatlicherBelastungsgrad(heizlast: number, zeitkonstane
)
return interpolated
}
}

View File

@@ -0,0 +1,37 @@
monat,ohne_teilbeheizung,5,10,25,50,75,100,125,150,zeitkonstante
Januar,19,41,19,37,19,33,19,24,19,16,19,12,19,10,19,09,19,08,50
Februar,19,44,19,40,19,36,19,28,19,20,19,16,19,14,19,13,19,13,50
März,19,53,19,49,19,46,19,39,19,32,19,29,19,27,19,27,19,26,50
April,19,66,19,64,19,62,19,57,19,52,19,50,19,49,19,48,19,48,50
Mai,19,82,19,80,19,79,19,76,19,74,19,73,19,72,19,72,19,72,50
Juni,19,90,19,89,19,88,19,87,19,85,19,85,19,84,19,84,19,84,50
Juli,19,97,19,97,19,96,19,96,19,96,19,95,19,95,19,95,19,95,50
August,19,96,19,95,19,95,19,94,19,94,19,93,19,93,19,93,19,93,50
September,19,82,19,81,19,80,19,77,19,75,19,74,19,73,19,73,19,73,50
Oktober,19,67,19,65,19,63,19,58,19,53,19,51,19,50,19,50,19,49,50
November,19,51,19,47,19,44,19,36,19,30,19,26,19,25,19,24,19,23,50
Dezember,19,41,19,36,19,32,19,24,19,15,19,11,19,09,19,08,19,08,50
Januar,19,50,19,45,19,41,19,33,19,24,19,20,19,18,19,17,19,17,90
Februar,19,52,19,48,19,44,19,36,19,28,19,24,19,22,19,21,19,21,90
März,19,60,19,56,19,53,19,46,19,39,19,36,19,34,19,33,19,33,90
April,19,71,19,69,19,67,19,62,19,57,19,55,19,54,19,53,19,53,90
Mai,19,84,19,83,19,82,19,79,19,77,19,75,19,75,19,74,19,74,90
Juni,19,91,19,91,19,90,19,88,19,87,19,86,19,86,19,86,19,86,90
Juli,19,97,19,97,19,97,19,96,19,96,19,96,19,96,19,96,19,96,90
August,19,96,19,96,19,96,19,95,19,94,19,94,19,94,19,94,19,94,90
September,19,85,19,84,19,82,19,80,19,77,19,76,19,76,19,75,19,75,90
Oktober,19,72,19,70,19,68,19,63,19,58,19,56,19,55,19,54,19,54,90
November,19,58,19,54,19,51,19,44,19,37,19,33,19,32,19,31,19,30,90
Dezember,19,49,19,45,19,41,19,32,19,24,19,20,19,18,19,17,19,16,90
Januar,19,57,19,53,19,49,19,40,19,32,19,28,19,26,19,25,19,24,130
Februar,19,59,19,55,19,51,19,43,19,35,19,31,19,29,19,28,19,28,130
März,19,66,19,62,19,59,19,52,19,45,19,42,19,40,19,39,19,39,130
April,19,76,19,73,19,71,19,66,19,61,19,59,19,58,19,57,19,57,130
Mai,19,87,19,85,19,84,19,81,19,79,19,78,19,77,19,77,19,76,130
Juni,19,93,19,92,19,91,19,90,19,88,19,87,19,87,19,87,19,87,130
Juli,19,98,19,98,19,97,19,97,19,96,19,96,19,96,19,96,19,96,130
August,19,97,19,97,19,96,19,96,19,95,19,95,19,95,19,94,19,94,130
September,19,87,19,86,19,85,19,82,19,80,19,78,19,78,19,77,19,77,130
Oktober,19,76,19,74,19,72,19,67,19,62,19,60,19,59,19,58,19,58,130
November,19,64,19,60,19,57,19,50,19,43,19,39,19,38,19,37,19,37,130
Dezember,19,57,19,52,19,49,19,40,19,31,19,27,19,25,19,24,19,24,130
1 monat,ohne_teilbeheizung,5,10,25,50,75,100,125,150,zeitkonstante
2 Januar,19,41,19,37,19,33,19,24,19,16,19,12,19,10,19,09,19,08,50
3 Februar,19,44,19,40,19,36,19,28,19,20,19,16,19,14,19,13,19,13,50
4 März,19,53,19,49,19,46,19,39,19,32,19,29,19,27,19,27,19,26,50
5 April,19,66,19,64,19,62,19,57,19,52,19,50,19,49,19,48,19,48,50
6 Mai,19,82,19,80,19,79,19,76,19,74,19,73,19,72,19,72,19,72,50
7 Juni,19,90,19,89,19,88,19,87,19,85,19,85,19,84,19,84,19,84,50
8 Juli,19,97,19,97,19,96,19,96,19,96,19,95,19,95,19,95,19,95,50
9 August,19,96,19,95,19,95,19,94,19,94,19,93,19,93,19,93,19,93,50
10 September,19,82,19,81,19,80,19,77,19,75,19,74,19,73,19,73,19,73,50
11 Oktober,19,67,19,65,19,63,19,58,19,53,19,51,19,50,19,50,19,49,50
12 November,19,51,19,47,19,44,19,36,19,30,19,26,19,25,19,24,19,23,50
13 Dezember,19,41,19,36,19,32,19,24,19,15,19,11,19,09,19,08,19,08,50
14 Januar,19,50,19,45,19,41,19,33,19,24,19,20,19,18,19,17,19,17,90
15 Februar,19,52,19,48,19,44,19,36,19,28,19,24,19,22,19,21,19,21,90
16 März,19,60,19,56,19,53,19,46,19,39,19,36,19,34,19,33,19,33,90
17 April,19,71,19,69,19,67,19,62,19,57,19,55,19,54,19,53,19,53,90
18 Mai,19,84,19,83,19,82,19,79,19,77,19,75,19,75,19,74,19,74,90
19 Juni,19,91,19,91,19,90,19,88,19,87,19,86,19,86,19,86,19,86,90
20 Juli,19,97,19,97,19,97,19,96,19,96,19,96,19,96,19,96,19,96,90
21 August,19,96,19,96,19,96,19,95,19,94,19,94,19,94,19,94,19,94,90
22 September,19,85,19,84,19,82,19,80,19,77,19,76,19,76,19,75,19,75,90
23 Oktober,19,72,19,70,19,68,19,63,19,58,19,56,19,55,19,54,19,54,90
24 November,19,58,19,54,19,51,19,44,19,37,19,33,19,32,19,31,19,30,90
25 Dezember,19,49,19,45,19,41,19,32,19,24,19,20,19,18,19,17,19,16,90
26 Januar,19,57,19,53,19,49,19,40,19,32,19,28,19,26,19,25,19,24,130
27 Februar,19,59,19,55,19,51,19,43,19,35,19,31,19,29,19,28,19,28,130
28 März,19,66,19,62,19,59,19,52,19,45,19,42,19,40,19,39,19,39,130
29 April,19,76,19,73,19,71,19,66,19,61,19,59,19,58,19,57,19,57,130
30 Mai,19,87,19,85,19,84,19,81,19,79,19,78,19,77,19,77,19,76,130
31 Juni,19,93,19,92,19,91,19,90,19,88,19,87,19,87,19,87,19,87,130
32 Juli,19,98,19,98,19,97,19,97,19,96,19,96,19,96,19,96,19,96,130
33 August,19,97,19,97,19,96,19,96,19,95,19,95,19,95,19,94,19,94,130
34 September,19,87,19,86,19,85,19,82,19,80,19,78,19,78,19,77,19,77,130
35 Oktober,19,76,19,74,19,72,19,67,19,62,19,60,19,59,19,58,19,58,130
36 November,19,64,19,60,19,57,19,50,19,43,19,39,19,38,19,37,19,37,130
37 Dezember,19,57,19,52,19,49,19,40,19,31,19,27,19,25,19,24,19,24,130

View File

@@ -0,0 +1,37 @@
monat,ohne_teilbeheizung,5,10,25,50,75,100,125,150,zeitkonstante
Januar,18,83,18,71,18,61,18,38,18,16,18,05,17,99,17,97,17,95,50
Februar,18,88,18,76,18,67,18,44,18,23,18,13,18,08,18,05,18,04,50
März,19,05,18,95,18,87,18,68,18,50,18,42,18,37,18,35,18,34,50
April,19,33,19,26,19,20,19,07,18,94,18,88,18,85,18,84,18,83,50
Mai,19,63,19,60,19,56,19,49,19,42,19,39,19,37,19,36,19,36,50
Juni,19,80,19,77,19,76,19,72,19,68,19,66,19,65,19,64,19,64,50
Juli,19,94,19,93,19,93,19,91,19,90,19,90,19,89,19,89,19,89,50
August,19,91,19,90,19,90,19,88,19,86,19,86,19,85,19,85,19,85,50
September,19,65,19,61,19,58,19,51,19,44,19,41,19,39,19,39,19,38,50
Oktober,19,35,19,28,19,23,19,10,18,97,18,91,18,88,18,87,18,86,50
November,19,01,18,91,18,83,18,63,18,45,18,35,18,31,18,29,18,28,50
Dezember,18,83,18,71,18,61,18,38,18,15,18,04,17,99,17,96,17,95,50
Januar,18,99,18,87,18,77,18,54,18,31,18,20,18,15,18,12,18,11,90
Februar,19,04,18,93,18,83,18,60,18,39,18,29,18,23,18,21,18,20,90
März,19,19,19,09,19,01,18,82,18,64,18,55,18,51,18,49,18,48,90
April,19,43,19,36,19,30,19,17,19,04,18,98,18,95,18,93,18,92,90
Mai,19,69,19,65,19,62,19,55,19,48,19,44,19,42,19,42,19,41,90
Juni,19,83,19,80,19,79,19,75,19,71,19,69,19,68,19,67,19,67,90
Juli,19,95,19,94,19,94,19,92,19,91,19,91,19,90,19,90,19,90,90
August,19,93,19,92,19,91,19,89,19,88,19,87,19,86,19,86,19,86,90
September,19,70,19,66,19,63,19,56,19,49,19,46,19,44,19,44,19,43,90
Oktober,19,44,19,38,19,32,19,19,19,07,19,01,18,98,18,96,18,95,90
November,19,16,19,06,18,97,18,77,18,59,18,49,18,45,18,43,18,42,90
Dezember,18,99,18,87,18,76,18,53,18,30,18,19,18,14,18,11,18,10,90
Januar,19,14,19,02,18,92,18,68,18,45,18,34,18,29,18,26,18,25,130
Februar,19,18,19,07,18,97,18,74,18,53,18,42,18,37,18,34,18,33,130
März,19,31,19,21,19,13,18,94,18,75,18,67,18,62,18,60,18,59,130
April,19,51,19,44,19,38,19,25,19,12,19,06,19,03,19,01,19,00,130
Mai,19,73,19,70,19,66,19,59,19,52,19,49,19,47,19,46,19,46,130
Juni,19,85,19,83,19,81,19,77,19,73,19,71,19,70,19,70,19,70,130
Juli,19,95,19,95,19,94,19,93,19,92,19,91,19,91,19,91,19,91,130
August,19,94,19,93,19,92,19,90,19,89,19,88,19,87,19,87,19,87,130
September,19,74,19,71,19,68,19,60,19,54,19,50,19,49,19,48,19,47,130
Oktober,19,53,19,46,19,40,19,27,19,15,19,08,19,05,19,04,19,03,130
November,19,28,19,18,19,09,18,90,18,71,18,61,18,57,18,55,18,53,130
Dezember,19,14,19,02,18,91,18,67,18,45,18,33,18,28,18,25,18,24,130
Can't render this file because it has a wrong number of fields in line 11.

View File

@@ -0,0 +1,37 @@
monat,ohne_teilbeheizung,5,10,25,50,75,100,125,150,zeitkonstante
Januar,557,554,550,543,536,533,531,530,530,50
Februar,531,527,524,517,510,507,506,505,504,50
März,448,445,443,437,431,429,427,427,426,50
April,317,314,313,308,305,303,302,301,301,50
Mai,173,172,171,169,166,165,165,165,164,50
Juni,97,96,96,94,93,92,92,92,92,50
Juli,29,29,29,29,28,28,28,28,28,50
August,41,41,41,40,39,39,39,39,39,50
September,167,166,165,163,161,160,159,159,159,50
Oktober,308,306,304,300,296,294,293,293,293,50
November,466,463,460,454,448,445,444,443,443,50
Dezember,560,557,553,546,539,536,534,533,533,50
Januar,562,559,555,548,541,538,536,535,535,90
Februar,536,532,529,522,515,512,510,510,509,90
März,453,450,447,441,436,433,431,431,430,90
April,320,318,316,311,307,306,305,304,304,90
Mai,175,173,172,170,168,167,166,166,166,90
Juni,98,97,96,95,94,93,93,93,93,90
Juli,30,29,29,29,28,28,28,28,28,90
August,41,41,41,40,40,40,39,39,39,90
September,169,168,167,164,162,161,161,161,160,90
Oktober,311,309,307,303,299,297,296,296,295,90
November,471,467,465,459,453,450,448,448,447,90
Dezember,565,562,558,551,544,540,539,538,537,90
Januar,567,563,560,553,545,542,540,539,539,130
Februar,540,537,533,526,520,516,515,514,513,130
März,457,454,451,445,439,436,435,434,434,130
April,322,320,318,314,310,308,307,307,306,130
Mai,176,175,174,172,169,168,168,168,167,130
Juni,98,98,97,96,95,94,94,94,94,130
Juli,30,30,29,29,29,29,28,28,28,130
August,42,41,41,41,40,40,40,40,40,130
September,170,169,168,166,164,163,162,162,162,130
Oktober,313,311,309,305,301,300,299,298,298,130
November,474,471,469,462,456,454,452,451,451,130
Dezember,570,566,563,555,548,545,543,542,542,130
1 monat ohne_teilbeheizung 5 10 25 50 75 100 125 150 zeitkonstante
2 Januar 557 554 550 543 536 533 531 530 530 50
3 Februar 531 527 524 517 510 507 506 505 504 50
4 März 448 445 443 437 431 429 427 427 426 50
5 April 317 314 313 308 305 303 302 301 301 50
6 Mai 173 172 171 169 166 165 165 165 164 50
7 Juni 97 96 96 94 93 92 92 92 92 50
8 Juli 29 29 29 29 28 28 28 28 28 50
9 August 41 41 41 40 39 39 39 39 39 50
10 September 167 166 165 163 161 160 159 159 159 50
11 Oktober 308 306 304 300 296 294 293 293 293 50
12 November 466 463 460 454 448 445 444 443 443 50
13 Dezember 560 557 553 546 539 536 534 533 533 50
14 Januar 562 559 555 548 541 538 536 535 535 90
15 Februar 536 532 529 522 515 512 510 510 509 90
16 März 453 450 447 441 436 433 431 431 430 90
17 April 320 318 316 311 307 306 305 304 304 90
18 Mai 175 173 172 170 168 167 166 166 166 90
19 Juni 98 97 96 95 94 93 93 93 93 90
20 Juli 30 29 29 29 28 28 28 28 28 90
21 August 41 41 41 40 40 40 39 39 39 90
22 September 169 168 167 164 162 161 161 161 160 90
23 Oktober 311 309 307 303 299 297 296 296 295 90
24 November 471 467 465 459 453 450 448 448 447 90
25 Dezember 565 562 558 551 544 540 539 538 537 90
26 Januar 567 563 560 553 545 542 540 539 539 130
27 Februar 540 537 533 526 520 516 515 514 513 130
28 März 457 454 451 445 439 436 435 434 434 130
29 April 322 320 318 314 310 308 307 307 306 130
30 Mai 176 175 174 172 169 168 168 168 167 130
31 Juni 98 98 97 96 95 94 94 94 94 130
32 Juli 30 30 29 29 29 29 28 28 28 130
33 August 42 41 41 41 40 40 40 40 40 130
34 September 170 169 168 166 164 163 162 162 162 130
35 Oktober 313 311 309 305 301 300 299 298 298 130
36 November 474 471 469 462 456 454 452 451 451 130
37 Dezember 570 566 563 555 548 545 543 542 542 130

View File

@@ -0,0 +1,37 @@
monat,ohne_teilbeheizung,5,10,25,50,75,100,125,150,zeitkonstante
Januar,575,574,573,570,567,566,566,565,565,50
Februar,548,547,546,543,541,539,539,538,538,50
März,463,462,461,459,457,456,455,455,455,50
April,327,326,326,324,323,322,321,321,321,50
Mai,179,178,178,177,176,176,176,176,175,50
Juni,100,100,99,99,99,98,98,98,98,50
Juli,30,30,30,30,30,30,30,30,30,50
August,42,42,42,42,42,42,42,42,42,50
September,173,172,172,171,170,170,170,170,170,50
Oktober,318,317,317,315,314,313,313,312,312,50
November,481,480,479,477,475,474,473,473,473,50
Dezember,578,577,576,573,570,569,569,568,568,50
Januar,578,577,575,573,570,569,568,568,568,90
Februar,551,549,548,546,543,542,541,541,541,90
März,465,464,463,461,459,458,458,457,457,90
April,329,328,327,326,324,323,323,323,323,90
Mai,179,179,179,178,177,177,176,176,176,90
Juni,100,100,100,99,99,99,99,99,99,90
Juli,30,30,30,30,30,30,30,30,30,90
August,43,42,42,42,42,42,42,42,42,90
September,173,173,173,172,171,171,170,170,170,90
Oktober,319,319,318,317,315,314,314,314,314,90
November,484,483,482,479,477,476,476,475,475,90
Dezember,581,580,578,576,573,572,571,571,571,90
Januar,580,579,578,575,572,571,571,570,570,130
Februar,553,552,550,548,545,544,543,543,543,130
März,467,466,465,463,461,460,459,459,459,130
April,330,329,328,327,325,325,324,324,324,130
Mai,180,180,179,179,178,177,177,177,177,130
Juni,101,101,100,100,99,99,99,99,99,130
Juli,31,30,30,30,30,30,30,30,30,130
August,43,43,43,42,42,42,42,42,42,130
September,174,174,173,173,172,171,171,171,171,130
Oktober,321,320,319,318,316,316,315,315,315,130
November,486,485,484,481,479,478,477,477,477,130
Dezember,583,582,581,578,575,574,574,573,573,130
1 monat ohne_teilbeheizung 5 10 25 50 75 100 125 150 zeitkonstante
2 Januar 575 574 573 570 567 566 566 565 565 50
3 Februar 548 547 546 543 541 539 539 538 538 50
4 März 463 462 461 459 457 456 455 455 455 50
5 April 327 326 326 324 323 322 321 321 321 50
6 Mai 179 178 178 177 176 176 176 176 175 50
7 Juni 100 100 99 99 99 98 98 98 98 50
8 Juli 30 30 30 30 30 30 30 30 30 50
9 August 42 42 42 42 42 42 42 42 42 50
10 September 173 172 172 171 170 170 170 170 170 50
11 Oktober 318 317 317 315 314 313 313 312 312 50
12 November 481 480 479 477 475 474 473 473 473 50
13 Dezember 578 577 576 573 570 569 569 568 568 50
14 Januar 578 577 575 573 570 569 568 568 568 90
15 Februar 551 549 548 546 543 542 541 541 541 90
16 März 465 464 463 461 459 458 458 457 457 90
17 April 329 328 327 326 324 323 323 323 323 90
18 Mai 179 179 179 178 177 177 176 176 176 90
19 Juni 100 100 100 99 99 99 99 99 99 90
20 Juli 30 30 30 30 30 30 30 30 30 90
21 August 43 42 42 42 42 42 42 42 42 90
22 September 173 173 173 172 171 171 170 170 170 90
23 Oktober 319 319 318 317 315 314 314 314 314 90
24 November 484 483 482 479 477 476 476 475 475 90
25 Dezember 581 580 578 576 573 572 571 571 571 90
26 Januar 580 579 578 575 572 571 571 570 570 130
27 Februar 553 552 550 548 545 544 543 543 543 130
28 März 467 466 465 463 461 460 459 459 459 130
29 April 330 329 328 327 325 325 324 324 324 130
30 Mai 180 180 179 179 178 177 177 177 177 130
31 Juni 101 101 100 100 99 99 99 99 99 130
32 Juli 31 30 30 30 30 30 30 30 30 130
33 August 43 43 43 42 42 42 42 42 42 130
34 September 174 174 173 173 172 171 171 171 171 130
35 Oktober 321 320 319 318 316 316 315 315 315 130
36 November 486 485 484 481 479 478 477 477 477 130
37 Dezember 583 582 581 578 575 574 574 573 573 130

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 {

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