Merge remote-tracking branch 'origin/UMBE' into UMBE
This commit is contained in:
@@ -8,6 +8,7 @@ export const createCaller = createCallerFactory({
|
||||
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||
"auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
|
||||
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
||||
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].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"),
|
||||
@@ -19,6 +20,7 @@ export const createCaller = createCallerFactory({
|
||||
"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"),
|
||||
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
|
||||
"objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"),
|
||||
"objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"),
|
||||
})
|
||||
@@ -1,16 +1,17 @@
|
||||
|
||||
import { api } from "astro-typesafe-api/client"
|
||||
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
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 { AufnahmeClient, BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
export async function verbrauchsausweisWohnenSpeichern(
|
||||
ausweis: VerbrauchsausweisWohnenClient,
|
||||
export async function ausweisSpeichern(
|
||||
ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,
|
||||
objekt: ObjektClient,
|
||||
aufnahme: AufnahmeClient,
|
||||
bilder: (UploadedGebaeudeBild & { base64?: string })[]
|
||||
bilder: (UploadedGebaeudeBild & { base64?: string })[],
|
||||
ausweisart: Enums.Ausweisart
|
||||
) {
|
||||
if (objekt.uid) {
|
||||
await api.objekt._uid.PATCH.fetch({
|
||||
@@ -61,8 +62,21 @@ export async function verbrauchsausweisWohnenSpeichern(
|
||||
aufnahme.uid = uid
|
||||
}
|
||||
|
||||
let patchRoute: any;
|
||||
let putRoute: any;
|
||||
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
patchRoute = api["verbrauchsausweis-wohnen"]._uid.PATCH
|
||||
putRoute = api["verbrauchsausweis-wohnen"].PUT
|
||||
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
patchRoute = api["verbrauchsausweis-gewerbe"]._uid.PATCH
|
||||
putRoute = api["verbrauchsausweis-gewerbe"].PUT
|
||||
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
patchRoute = api["bedarfsausweis-wohnen"]._uid.PATCH
|
||||
putRoute = api["bedarfsausweis-wohnen"].PUT
|
||||
}
|
||||
|
||||
if (ausweis.uid) {
|
||||
await api["verbrauchsausweis-wohnen"]._uid.PATCH.fetch({
|
||||
await patchRoute.fetch({
|
||||
...exclude(ausweis, ["uid"])
|
||||
}, {
|
||||
params: {
|
||||
@@ -73,7 +87,7 @@ export async function verbrauchsausweisWohnenSpeichern(
|
||||
}
|
||||
})
|
||||
} else {
|
||||
const { uid } = await api["verbrauchsausweis-wohnen"].PUT.fetch({
|
||||
const { uid } = await putRoute.fetch({
|
||||
ausweis,
|
||||
uid_aufnahme: aufnahme.uid
|
||||
}, {
|
||||
@@ -1,13 +1,43 @@
|
||||
<script lang="ts">
|
||||
import { Buffer } from "buffer";
|
||||
import { VerbrauchsausweisWohnenClient } from "./Ausweis/types";
|
||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let bilder: UploadedGebaeudeBild[];
|
||||
export let ausweisart: Enums.Ausweisart
|
||||
|
||||
$: base64 = Buffer.from(JSON.stringify(ausweis), "utf-8").toString("base64")
|
||||
function openWindowWithPost(url: string, data: Record<string, any>) {
|
||||
var form = document.createElement("form");
|
||||
form.target = "_blank";
|
||||
form.method = "POST";
|
||||
form.action = url;
|
||||
form.style.display = "none";
|
||||
|
||||
for (var key in data) {
|
||||
var input = document.createElement("input");
|
||||
input.type = "hidden";
|
||||
input.name = key;
|
||||
input.value = data[key];
|
||||
form.appendChild(input);
|
||||
}
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
document.body.removeChild(form);
|
||||
}
|
||||
</script>
|
||||
|
||||
<a class="border-2 rounded-lg bg-white text-center hover:shadow-md no-underline p-3 cursor-pointer" target="_blank" href="/pdf/ansichtsausweis?base64={base64}">
|
||||
<button class="border-2 rounded-lg bg-white text-center hover:shadow-md no-underline p-3 cursor-pointer" on:click={() => {
|
||||
openWindowWithPost("/pdf/ansichtsausweis", {
|
||||
ausweis: JSON.stringify(ausweis),
|
||||
aufnahme: JSON.stringify(aufnahme),
|
||||
objekt: JSON.stringify(objekt),
|
||||
bilder: JSON.stringify(bilder),
|
||||
ausweisart
|
||||
})
|
||||
}}>
|
||||
<img src="/images/ausweis.webp" alt="Ausweis" />
|
||||
<span class="text-black font-medium text-lg">Ansichtsausweis</span>
|
||||
</a>
|
||||
</button>
|
||||
|
||||
@@ -14,27 +14,17 @@ sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
|
||||
xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
">
|
||||
|
||||
<!-- Anrede *
|
||||
|
||||
<!-- Anrede * -->
|
||||
<!--
|
||||
<div class="input-standard order-3 md:order-3 xl:order-3">
|
||||
<Inputlabel title="Anrede *"></Inputlabel>
|
||||
|
||||
<select name="anrede" bind:value={user.anrede}>
|
||||
<option>bitte auswählen</option>
|
||||
<option disabled selected>bitte auswählen</option>
|
||||
<option value="Herr">Herr</option>
|
||||
<option value="Frau">Frau</option>
|
||||
<option value="Frau">Frau</option>
|
||||
</select>
|
||||
|
||||
<div class="help-label">
|
||||
<HelpLabel>
|
||||
Bitte geben Sie hier die beheizte Wohnfläche in m² ein.
|
||||
Dabei handelt es sich um die Wohnfläche abzüglich
|
||||
vorhandener Flächen die sich außerhalb des Gebäudes
|
||||
befinden. (Balkone, Terassen,etc.).
|
||||
</HelpLabel>
|
||||
</div>
|
||||
</div>-->
|
||||
</div> -->
|
||||
|
||||
|
||||
<!-- Vorname * -->
|
||||
|
||||
@@ -9,14 +9,19 @@
|
||||
} from "@ibcornelsen/database/client";
|
||||
|
||||
import {
|
||||
AufnahmeClient,
|
||||
BedarfsausweisWohnenClient,
|
||||
ObjektClient,
|
||||
UploadedGebaeudeBild,
|
||||
VerbrauchsausweisGewerbeClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let gebaeude: ObjektClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let images: UploadedGebaeudeBild[] = [];
|
||||
export let ausweisart: Enums.Ausweisart;
|
||||
</script>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-x-6 mt-6">
|
||||
@@ -29,7 +34,7 @@
|
||||
kategorie={Enums.BilderKategorie.Gebaeude}
|
||||
max={1}
|
||||
min={1}
|
||||
bind:gebaeude
|
||||
bind:objekt
|
||||
bind:images
|
||||
bind:ausweis
|
||||
>
|
||||
@@ -56,8 +61,8 @@
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-2 gap-4 mt-4">
|
||||
<AnsichtsausweisButton {ausweis} />
|
||||
<DatenblattButton {ausweis} />
|
||||
<AnsichtsausweisButton {ausweis} {aufnahme} {objekt} bilder={images} {ausweisart} />
|
||||
<DatenblattButton {ausweis} {aufnahme} {objekt} bilder={images} {ausweisart} />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -70,7 +70,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
required
|
||||
bind:value={aufnahme.gebaeudetyp}
|
||||
>
|
||||
<option disabled selected value={false}>Bitte auswählen</option>
|
||||
<option disabled selected>Bitte auswählen</option>
|
||||
|
||||
{#if ausweisart=="VerbrauchsausweisWohnen"}
|
||||
<option value="Einfamilienhaus">Einfamilienhaus</option>
|
||||
|
||||
@@ -1,21 +1,60 @@
|
||||
<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";
|
||||
import { ausweisSpeichern } from "#client/lib/ausweisSpeichern.js";
|
||||
import { validateAccessTokenClient } from "#client/lib/validateAccessToken.js";
|
||||
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import Overlay from "#components/Overlay.svelte";
|
||||
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let bilder: UploadedGebaeudeBild[];
|
||||
export let user: BenutzerClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let ausweisart: Enums.Ausweisart
|
||||
|
||||
export let spaeterWeitermachen;
|
||||
async function ausweisAbschicken() {
|
||||
if (!await validateAccessTokenClient()) {
|
||||
loginOverlayHidden = false;
|
||||
return
|
||||
}
|
||||
|
||||
loginOverlayHidden = true
|
||||
|
||||
const result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart);
|
||||
|
||||
if (result !== null) {
|
||||
window.history.pushState(
|
||||
{},
|
||||
"",
|
||||
`${location.pathname}?uid=${ausweis.uid}`
|
||||
);
|
||||
window.location.href = `/kundendaten?uid=${ausweis.uid}`;
|
||||
}
|
||||
}
|
||||
|
||||
async function spaeterWeitermachen() {
|
||||
if (!await validateAccessTokenClient()) {
|
||||
loginOverlayHidden = false;
|
||||
return
|
||||
}
|
||||
|
||||
loginOverlayHidden = true
|
||||
|
||||
const result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart);
|
||||
|
||||
if (result !== null) {
|
||||
window.history.pushState(
|
||||
{},
|
||||
"",
|
||||
`${location.pathname}?uid=${ausweis.uid}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let loginOverlayHidden = true;
|
||||
</script>
|
||||
|
||||
<div
|
||||
@@ -29,13 +68,13 @@
|
||||
>Später Weitermachen
|
||||
</button>
|
||||
|
||||
<div class="">
|
||||
<AusweisWeiter
|
||||
bind:ausweis
|
||||
bind:bilder
|
||||
bind:user
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
></AusweisWeiter>
|
||||
<div>
|
||||
<Overlay bind:hidden={loginOverlayHidden}>
|
||||
<div class="bg-white w-full max-w-screen-sm py-8">
|
||||
<EmbeddedAuthFlowModule onLogin={ausweisAbschicken}></EmbeddedAuthFlowModule>
|
||||
</div>
|
||||
</Overlay>
|
||||
|
||||
<button on:click={ausweisAbschicken} type="button" class="button" data-cy="weiter">Weiter</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
<script lang="ts">
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="w-full grid grid-cols-[min-content_1fr_min-content_min-content] grid-rows-[min_content_1fr] gap-x-2 self-start justify-self-end mt-8"
|
||||
>
|
||||
<button class="button justify-self-start">Zurück</button>
|
||||
|
||||
<div></div>
|
||||
|
||||
<button class="button">Speichern</button>
|
||||
|
||||
<button class="button">kostenpflichtig bestellen</button>
|
||||
</div>
|
||||
@@ -1,11 +1,11 @@
|
||||
<script lang="ts">
|
||||
import ImageGrid from "../ImageGrid.svelte";;
|
||||
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
|
||||
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
|
||||
|
||||
export let images: UploadedGebaeudeBild[] = [];
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||
export let gebaeude: ObjektClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let objekt: ObjektClient;
|
||||
</script>
|
||||
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6">
|
||||
@@ -60,7 +60,7 @@
|
||||
kategorie={Enums.BilderKategorie.Daemmung}
|
||||
bind:images
|
||||
bind:ausweis
|
||||
bind:gebaeude
|
||||
bind:objekt
|
||||
>
|
||||
TEXT FEHLT
|
||||
</ImageGrid>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<script lang="ts">
|
||||
import ImageGrid from "../ImageGrid.svelte";;
|
||||
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
|
||||
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
|
||||
|
||||
export let images: UploadedGebaeudeBild[] = [];
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||
export let gebaeude: ObjektClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let objekt: ObjektClient;
|
||||
</script>
|
||||
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6">
|
||||
@@ -56,7 +56,7 @@
|
||||
kategorie={Enums.BilderKategorie.Fenster}
|
||||
bind:images
|
||||
bind:ausweis
|
||||
bind:gebaeude
|
||||
bind:objekt
|
||||
>
|
||||
TEXT FEHLT
|
||||
</ImageGrid>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<script lang="ts">
|
||||
import ImageGrid from "../ImageGrid.svelte";;
|
||||
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
|
||||
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
|
||||
|
||||
export let images: UploadedGebaeudeBild[] = [];
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let gebaeude: ObjektClient;
|
||||
</script>
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
kategorie={Enums.BilderKategorie.Heizung}
|
||||
max={4}
|
||||
min={1}
|
||||
bind:gebaeude
|
||||
bind:objekt={gebaeude}
|
||||
bind:images
|
||||
bind:ausweis
|
||||
>
|
||||
|
||||
@@ -9,12 +9,20 @@
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let ausweisart: Enums.Ausweisart;
|
||||
|
||||
let maxPerformance = 250;
|
||||
let maxPerformance = {
|
||||
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000,
|
||||
[Enums.Ausweisart.VerbrauchsausweisWohnen]: 250,
|
||||
[Enums.Ausweisart.BedarfsausweisWohnen]: 250,
|
||||
[Enums.Ausweisart.BedarfsausweisGewerbe]: 250
|
||||
}[ausweisart];
|
||||
|
||||
/**
|
||||
* We use linear interpolation to scale the value between the given boundaries.
|
||||
@@ -54,13 +62,12 @@
|
||||
let translation_2 = 0;
|
||||
$: {
|
||||
(async () => {
|
||||
const result = await endEnergieVerbrauchVerbrauchsausweis_2016({
|
||||
...ausweis,
|
||||
aufnahme: {
|
||||
...aufnahme,
|
||||
objekt: objekt,
|
||||
},
|
||||
});
|
||||
let result;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
return;
|
||||
@@ -77,7 +84,11 @@
|
||||
}
|
||||
</script>
|
||||
<div class="self-center relative">
|
||||
<img id="skalaImage" class="w-full" src="/images/formular/SKALA-910.png" alt="Energieeffizienz Skala" />
|
||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
|
||||
<img id="skalaImage" class="w-full" src="/images/formular/skala-verbrauchsausweis-wohnen.png" alt="Energieeffizienz Skala" />
|
||||
{:else if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
||||
<img id="skalaImage" class="w-full" src="/images/formular/skala-verbrauchsausweis-gewerbe.png" alt="Energieeffizienz Skala" />
|
||||
{/if}
|
||||
<ThickArrowDown
|
||||
size={28}
|
||||
class="fill-base-content absolute top-0 transition-left duration-1000 ease-in-out"
|
||||
|
||||
@@ -6,19 +6,7 @@
|
||||
import { BenutzerClient, RechnungClient } from "./types.js";
|
||||
|
||||
export let user: BenutzerClient;
|
||||
|
||||
let rechnung: RechnungClient = {
|
||||
email: user.email,
|
||||
empfaenger: user.vorname + " " + user.name,
|
||||
strasse: user.adresse,
|
||||
plz: user.plz,
|
||||
ort: user.ort,
|
||||
versand_empfaenger: user.vorname + " " + user.name,
|
||||
versand_strasse: user.adresse,
|
||||
versand_plz: user.plz,
|
||||
versand_ort: user.ort,
|
||||
telefon: user.telefon,
|
||||
};
|
||||
export let rechnung: Partial<RechnungClient>;
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,55 +1,106 @@
|
||||
<script lang="ts">
|
||||
import HelpLabel from "#components/labels/HelpLabel.svelte";
|
||||
import Inputlabel from "#components/labels/InputLabel.svelte";
|
||||
|
||||
import FensterImage from "./FensterImage.svelte";
|
||||
|
||||
//import Label from "../Label.svelte";
|
||||
|
||||
import {
|
||||
AufnahmeClient,
|
||||
ObjektClient,
|
||||
UploadedGebaeudeBild,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import { boolean } from "astro:schema";
|
||||
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"
|
||||
|
||||
export let gebaeude: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient
|
||||
export let images: UploadedGebaeudeBild[];
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<div id="sanierungszustand" class="bereich-box grid
|
||||
import HelpLabel from "#components/labels/HelpLabel.svelte";
|
||||
import Inputlabel from "#components/labels/InputLabel.svelte";
|
||||
|
||||
import FensterImage from "./FensterImage.svelte";
|
||||
|
||||
//import Label from "../Label.svelte";
|
||||
|
||||
import {
|
||||
AufnahmeClient,
|
||||
ObjektClient,
|
||||
UploadedGebaeudeBild,
|
||||
VerbrauchsausweisGewerbeClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import { boolean } from "astro:schema";
|
||||
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
|
||||
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
|
||||
export let images: UploadedGebaeudeBild[];
|
||||
</script>
|
||||
|
||||
<div
|
||||
id="sanierungszustand"
|
||||
class="bereich-box grid
|
||||
grid-cols-1 gap-x-4 gap-y-2
|
||||
|
||||
sm:grid-cols-1 sm:gap-x-6 sm:gap-y-1
|
||||
md:grid-cols-2 md:gap-x-6 md:gap-y-8
|
||||
|
||||
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
|
||||
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
|
||||
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
|
||||
">
|
||||
|
||||
<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>
|
||||
|
||||
<FensterImage bind:images bind:ausweis bind:gebaeude />
|
||||
|
||||
<style lang="postcss">
|
||||
|
||||
</style>
|
||||
"
|
||||
>
|
||||
<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>
|
||||
|
||||
<FensterImage bind:images bind:ausweis bind:objekt />
|
||||
|
||||
<!--
|
||||
Wir benötigen diese Angaben um den allgemeinen Modernisierungsstand
|
||||
einschätzen zu können. Bitte setzen Sie den Haken wenn zutreffend.
|
||||
@@ -161,5 +212,6 @@
|
||||
<AusweisPreviewContainer bind:images bind:ausweis bind:gebaeude />
|
||||
|
||||
-->
|
||||
-->
|
||||
|
||||
|
||||
<style lang="postcss">
|
||||
</style>
|
||||
|
||||
@@ -10,14 +10,15 @@
|
||||
AufnahmeClient,
|
||||
ObjektClient,
|
||||
UploadedGebaeudeBild,
|
||||
VerbrauchsausweisGewerbeClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import { boolean } from "astro:schema";
|
||||
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
|
||||
|
||||
export let gebaeude: ObjektClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
|
||||
export let images: UploadedGebaeudeBild[];
|
||||
</script>
|
||||
|
||||
@@ -119,7 +120,7 @@
|
||||
></SanierungsOption>
|
||||
</div>
|
||||
|
||||
<HeizungImage bind:images bind:ausweis bind:gebaeude />
|
||||
<HeizungImage bind:images bind:ausweis bind:gebaeude={objekt} />
|
||||
|
||||
<style lang="postcss">
|
||||
</style>
|
||||
|
||||
@@ -1,51 +1,83 @@
|
||||
<script lang="ts">
|
||||
import HelpLabel from "#components/labels/HelpLabel.svelte";
|
||||
import Inputlabel from "#components/labels/InputLabel.svelte";
|
||||
|
||||
import DaemmungImage from "./DaemmungImage.svelte";
|
||||
import DaemmungImage from "./DaemmungImage.svelte";
|
||||
//import Label from "../Label.svelte";
|
||||
|
||||
|
||||
//import Label from "../Label.svelte";
|
||||
|
||||
import {
|
||||
AufnahmeClient,
|
||||
ObjektClient,
|
||||
UploadedGebaeudeBild,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import { boolean } from "astro:schema";
|
||||
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"
|
||||
|
||||
export let gebaeude: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient
|
||||
export let images: UploadedGebaeudeBild[];
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<div id="sanierungszustand" class="bereich-box grid
|
||||
grid-cols-1 gap-x-4 gap-y-1
|
||||
import {
|
||||
AufnahmeClient,
|
||||
BedarfsausweisWohnenClient,
|
||||
ObjektClient,
|
||||
UploadedGebaeudeBild,
|
||||
VerbrauchsausweisGewerbeClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
|
||||
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let ausweis:
|
||||
| VerbrauchsausweisWohnenClient
|
||||
| VerbrauchsausweisGewerbeClient
|
||||
| BedarfsausweisWohnenClient;
|
||||
export let images: UploadedGebaeudeBild[];
|
||||
</script>
|
||||
|
||||
<div
|
||||
id="sanierungszustand"
|
||||
class="bereich-box grid
|
||||
grid-cols-1 gap-x-4 gap-y-2
|
||||
|
||||
sm:grid-cols-1 sm:gap-x-6 sm:gap-y-1
|
||||
md:grid-cols-2 md:gap-x-6 md:gap-y-8
|
||||
|
||||
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
|
||||
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
|
||||
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={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>
|
||||
|
||||
"
|
||||
>
|
||||
<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>
|
||||
|
||||
|
||||
<DaemmungImage bind:images bind:ausweis bind:gebaeude />
|
||||
|
||||
<style lang="postcss">
|
||||
<DaemmungImage bind:images bind:ausweis bind:objekt />
|
||||
<!--
|
||||
<div class="GRB3">
|
||||
<div class="form-group col-md-12">
|
||||
@@ -71,5 +103,6 @@
|
||||
<AusweisPreviewContainer bind:images bind:ausweis bind:gebaeude />
|
||||
|
||||
-->
|
||||
-->
|
||||
|
||||
|
||||
<style lang="postcss">
|
||||
</style>
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
import {
|
||||
AufnahmeClient,
|
||||
ObjektClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
VerbrauchsausweisGewerbeClient,
|
||||
} from "./types.js";
|
||||
import { addNotification } from "#components/Notifications/shared.js";
|
||||
|
||||
export let gebaeude: ObjektClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let ausweis: VerbrauchsausweisGewerbeClient;
|
||||
|
||||
// Wir dürfen bis zu 4.5 Jahre alte Klimafaktoren benutzen, also nehmen wir alle Monate seitdem und generieren daraus die Auswahl.
|
||||
// Allerdings müssen wir auch berücksichtigen, dass wir drei folgende Jahre brauchen, also
|
||||
@@ -48,12 +48,12 @@
|
||||
];
|
||||
|
||||
const startDate = moment(
|
||||
ausweis.aufnahme.erstellungsdatum || Date.now()
|
||||
aufnahme.erstellungsdatum || Date.now()
|
||||
)
|
||||
.subtract(4, "years")
|
||||
.subtract(6, "months");
|
||||
const endDate = moment(
|
||||
ausweis.aufnahme.erstellungsdatum || Date.now()
|
||||
aufnahme.erstellungsdatum || Date.now()
|
||||
).subtract(3, "years");
|
||||
|
||||
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
|
||||
@@ -102,7 +102,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
$: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude);
|
||||
$: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
|
||||
</script>
|
||||
|
||||
<div
|
||||
@@ -137,14 +137,15 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
>
|
||||
{#if !ausweis.zusaetzliche_heizquelle}
|
||||
<input
|
||||
id="zusaetzliche_heizquelle_1"
|
||||
id="zusaetzliche_heizquelle"
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
name="zusaetzliche_heizquelle_1"
|
||||
name="zusaetzliche_heizquelle"
|
||||
data-cy="zusaetzliche_heizquelle"
|
||||
bind:checked={ausweis.zusaetzliche_heizquelle}
|
||||
/>
|
||||
<label
|
||||
for="zusaetzliche_heizquelle_1"
|
||||
for="zusaetzliche_heizquelle"
|
||||
class="cursor-pointer">zusätzliche Heizquelle</label
|
||||
>
|
||||
{/if}
|
||||
@@ -236,6 +237,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
<select
|
||||
class="rounded-e-none"
|
||||
name="brennstoff_1"
|
||||
data-cy="brennstoff_1"
|
||||
bind:value={aufnahme.brennstoff_1}
|
||||
required
|
||||
>
|
||||
@@ -267,6 +269,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
<select
|
||||
class="rounded-s-none"
|
||||
name="einheit_1"
|
||||
data-cy="einheit_1"
|
||||
bind:value={ausweis.einheit_1}
|
||||
disabled={!aufnahme.brennstoff_1}
|
||||
required
|
||||
@@ -416,6 +419,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
<select
|
||||
class="rounded-e-none"
|
||||
name="brennstoff_2"
|
||||
data-cy="brennstoff_2"
|
||||
bind:value={aufnahme.brennstoff_2}
|
||||
required
|
||||
>
|
||||
@@ -449,6 +453,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
<select
|
||||
class="rounded-s-none"
|
||||
name="einheit_2"
|
||||
data-cy="einheit_2"
|
||||
bind:value={ausweis.einheit_2}
|
||||
disabled={!aufnahme.brennstoff_2}
|
||||
required
|
||||
@@ -655,19 +660,19 @@ 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={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>
|
||||
<SanierungsOption label="Heizung" name="stromverbrauch_enthaelt_heizung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_heizung}></SanierungsOption>
|
||||
<SanierungsOption label="Warmwasser " name="stromverbrauch_enthaelt_warmwasser" help="" bind:checked={ausweis.stromverbrauch_enthaelt_warmwasser}></SanierungsOption>
|
||||
<SanierungsOption label="Lüftung " name="stromverbrauch_enthaelt_lueftung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_lueftung}></SanierungsOption>
|
||||
<SanierungsOption label="Beleuchtung" name="stromverbrauch_enthaelt_beleuchtung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_beleuchtung}></SanierungsOption>
|
||||
<SanierungsOption label="Kühlung" name="stromverbrauch_enthaelt_kuehlung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_kuehlung}></SanierungsOption>
|
||||
|
||||
<div class="input-standard">
|
||||
<Inputlabel title="Sonstige"></Inputlabel>
|
||||
|
||||
<input
|
||||
name="strom_3"
|
||||
name="stromverbrauch_enthaelt_sonstige"
|
||||
type="number"
|
||||
bind:value={ausweis.strom_3}
|
||||
bind:value={ausweis.stromverbrauch_enthaelt_sonstige}
|
||||
required
|
||||
/>
|
||||
|
||||
|
||||
@@ -3,9 +3,6 @@
|
||||
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";
|
||||
|
||||
import moment from "moment";
|
||||
import fuelList from "./brennstoffListe.js";
|
||||
import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung.js";
|
||||
@@ -16,7 +13,7 @@
|
||||
} from "./types.js";
|
||||
import { addNotification } from "#components/Notifications/shared.js";
|
||||
|
||||
export let gebaeude: ObjektClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
|
||||
@@ -43,14 +40,13 @@
|
||||
"Dezember",
|
||||
];
|
||||
|
||||
const startDate = moment(
|
||||
aufnahme.erstellungsdatum || Date.now()
|
||||
)
|
||||
const startDate = moment(aufnahme.erstellungsdatum || Date.now())
|
||||
.subtract(4, "years")
|
||||
.subtract(6, "months");
|
||||
const endDate = moment(
|
||||
aufnahme.erstellungsdatum || Date.now()
|
||||
).subtract(3, "years");
|
||||
const endDate = moment(aufnahme.erstellungsdatum || Date.now()).subtract(
|
||||
3,
|
||||
"years"
|
||||
);
|
||||
|
||||
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
|
||||
availableDates.push({
|
||||
@@ -84,21 +80,28 @@
|
||||
|
||||
$: {
|
||||
console.log(month, year);
|
||||
|
||||
if ((availableDates.filter(date => date.month === month && date.year === year).length === 0) && typeof month === "number" && typeof year === "number") {
|
||||
|
||||
if (
|
||||
availableDates.filter(
|
||||
(date) => date.month === month && date.year === year
|
||||
).length === 0 &&
|
||||
typeof month === "number" &&
|
||||
typeof year === "number"
|
||||
) {
|
||||
addNotification({
|
||||
message: "Monat nicht verfügbar.",
|
||||
subtext: "Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.",
|
||||
subtext:
|
||||
"Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.",
|
||||
dismissable: true,
|
||||
type: "warning",
|
||||
timeout: 0,
|
||||
uid: "monat_nicht_verfuegbar",
|
||||
selector: "select[name='energieverbrauch_zeitraum_monat']"
|
||||
})
|
||||
selector: "select[name='energieverbrauch_zeitraum_monat']",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude);
|
||||
$: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
|
||||
</script>
|
||||
|
||||
<div
|
||||
@@ -201,10 +204,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
</select>
|
||||
|
||||
<div class="help-label">
|
||||
<HelpLabel>Bitte geben Sie hier den <b>Startmonat der ersten Verbrauchsperiode</b> ein. Es sind nur Monate auswählbar,
|
||||
die im zulässigen Zeitraum (Endzeitpunkt von Jahr 3 darf nicht älter als 18 Monate sein) liegen. Wählen Sie ein
|
||||
aktuellerses Jahr um alle Monate zu sehen.
|
||||
</HelpLabel>
|
||||
<HelpLabel
|
||||
>Bitte geben Sie hier den <b
|
||||
>Startmonat der ersten Verbrauchsperiode</b
|
||||
> ein. Es sind nur Monate auswählbar, die im zulässigen Zeitraum
|
||||
(Endzeitpunkt von Jahr 3 darf nicht älter als 18 Monate sein)
|
||||
liegen. Wählen Sie ein aktuellerses Jahr um alle Monate zu sehen.
|
||||
</HelpLabel>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -230,8 +236,12 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
</select>
|
||||
|
||||
<div class="help-label">
|
||||
<HelpLabel>Bitte geben Sie das <b>Startjahr der ersten Verbrauchsperiode</b> ein. Weitere Zeitangaben müssen nichht
|
||||
gemacht werden, da alle 3 Verbrauchsjahre zusammenhängend sein sollen.</HelpLabel>
|
||||
<HelpLabel
|
||||
>Bitte geben Sie das <b
|
||||
>Startjahr der ersten Verbrauchsperiode</b
|
||||
> ein. Weitere Zeitangaben müssen nichht gemacht werden, da alle
|
||||
3 Verbrauchsjahre zusammenhängend sein sollen.</HelpLabel
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -256,16 +266,24 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
|
||||
<div class="help-label">
|
||||
<HelpLabel>
|
||||
<b>Heizöl:</b> Flüssiger fossiler Brennstoff.<br/>
|
||||
<b>Erdgas:</b> Gasförmiger fossiler Brennstoff.<br/>
|
||||
<b>Flüssiggas:</b> Wie Erdgas fossiler Brennstoff - im Flüssiggastank gelagert<br/>
|
||||
<b>Braunkohle:</b> Fester fossiler Brennstoff<br/>
|
||||
<b>Holz-Pellets:</b> Stäbchenförmige Pellets - erneuerbarer (nachwachsender) Brennstoff<br/>
|
||||
<b>Holzhackschnitzel:</b>Wie Holz-Pellets<br/>
|
||||
<b>Fernwärme, Nahwärme:</b> kommunales Wärmenetz - <strong>erfragen Sie
|
||||
den Primärenergiefaktor bei Ihrem Energieversorger</strong> (meistens mit regenartivem Anteil)<br/>
|
||||
<b>Strommix:</b> Meist bei Wärmepumpe oder Nachtspeicher.<br/>
|
||||
<b>Koks:</b> stark kohlenstoffhaltiger fossiler Brennstoff.<br/>
|
||||
<b>Heizöl:</b> Flüssiger fossiler Brennstoff.<br />
|
||||
<b>Erdgas:</b> Gasförmiger fossiler Brennstoff.<br />
|
||||
<b>Flüssiggas:</b> Wie Erdgas fossiler Brennstoff - im
|
||||
Flüssiggastank gelagert<br />
|
||||
<b>Braunkohle:</b> Fester fossiler Brennstoff<br />
|
||||
<b>Holz-Pellets:</b> Stäbchenförmige Pellets - erneuerbarer
|
||||
(nachwachsender) Brennstoff<br />
|
||||
<b>Holzhackschnitzel:</b>Wie Holz-Pellets<br />
|
||||
<b>Fernwärme, Nahwärme:</b> kommunales Wärmenetz -
|
||||
<strong
|
||||
>erfragen Sie den Primärenergiefaktor bei Ihrem
|
||||
Energieversorger</strong
|
||||
>
|
||||
(meistens mit regenartivem Anteil)<br />
|
||||
<b>Strommix:</b> Meist bei Wärmepumpe oder Nachtspeicher.<br
|
||||
/>
|
||||
<b>Koks:</b> stark kohlenstoffhaltiger fossiler Brennstoff.<br
|
||||
/>
|
||||
</HelpLabel>
|
||||
</div>
|
||||
</div>
|
||||
@@ -288,9 +306,10 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
|
||||
<div class="help-label">
|
||||
<HelpLabel>
|
||||
Bitte geben Sie die Einheit ein. Die Liste passt sich entsprechend des ausgeählten Brennstoffes an.
|
||||
Erdgas wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt meistens in
|
||||
Litern vor. Pellets oder Brennholz in kg.
|
||||
Bitte geben Sie die Einheit ein. Die Liste passt sich
|
||||
entsprechend des ausgeählten Brennstoffes an. Erdgas wird
|
||||
meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt
|
||||
meistens in Litern vor. Pellets oder Brennholz in kg.
|
||||
</HelpLabel>
|
||||
</div>
|
||||
</div>
|
||||
@@ -409,8 +428,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
</div>
|
||||
|
||||
<div class="help-label">
|
||||
<HelpLabel>Hier sind die <b>Verbräuche einer zusätzlichen Heizquelle</b>
|
||||
(z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel etc.) einzugeben</HelpLabel>
|
||||
<HelpLabel
|
||||
>Hier sind die <b
|
||||
>Verbräuche einer zusätzlichen Heizquelle</b
|
||||
>
|
||||
(z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel
|
||||
etc.) einzugeben</HelpLabel
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -439,16 +463,24 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
|
||||
<div class="help-label">
|
||||
<HelpLabel>
|
||||
<b>Heizöl:</b> Flüssiger fossiler Brennstoff.<br/>
|
||||
<b>Erdgas:</b> Gasförmiger fossiler Brennstoff.<br/>
|
||||
<b>Flüssiggas:</b> Wie Erdgas fossiler Brennstoff - im Flüssiggastank gelagert<br/>
|
||||
<b>Braunkohle:</b> Fester fossiler Brennstoff<br/>
|
||||
<b>Holz-Pellets:</b> Stäbchenförmige Pellets - erneuerbarer (nachwachsender) Brennstoff<br/>
|
||||
<b>Holzhackschnitzel:</b>Wie Holz-Pellets<br/>
|
||||
<b>Fernwärme, Nahwärme:</b> kommunales Wärmenetz - <strong>erfragen Sie
|
||||
den Primärenergiefaktor bei Ihrem Energieversorger</strong> (meistens mit regenartivem Anteil)<br/>
|
||||
<b>Strommix:</b> Meist bei Wärmepumpe oder Nachtspeicher.<br/>
|
||||
<b>Koks:</b> stark kohlenstoffhaltiger fossiler Brennstoff.<br/>
|
||||
<b>Heizöl:</b> Flüssiger fossiler Brennstoff.<br />
|
||||
<b>Erdgas:</b> Gasförmiger fossiler Brennstoff.<br />
|
||||
<b>Flüssiggas:</b> Wie Erdgas fossiler Brennstoff - im
|
||||
Flüssiggastank gelagert<br />
|
||||
<b>Braunkohle:</b> Fester fossiler Brennstoff<br />
|
||||
<b>Holz-Pellets:</b> Stäbchenförmige Pellets -
|
||||
erneuerbarer (nachwachsender) Brennstoff<br />
|
||||
<b>Holzhackschnitzel:</b>Wie Holz-Pellets<br />
|
||||
<b>Fernwärme, Nahwärme:</b> kommunales Wärmenetz -
|
||||
<strong
|
||||
>erfragen Sie den Primärenergiefaktor bei Ihrem
|
||||
Energieversorger</strong
|
||||
>
|
||||
(meistens mit regenartivem Anteil)<br />
|
||||
<b>Strommix:</b> Meist bei Wärmepumpe oder
|
||||
Nachtspeicher.<br />
|
||||
<b>Koks:</b> stark kohlenstoffhaltiger fossiler
|
||||
Brennstoff.<br />
|
||||
</HelpLabel>
|
||||
</div>
|
||||
</div>
|
||||
@@ -474,9 +506,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
||||
|
||||
<div class="help-label">
|
||||
<HelpLabel>
|
||||
Bitte geben Sie die Einheit ein. Die Liste passt sich entsprechend des ausgeählten Brennstoffes an.
|
||||
Erdgas wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt meistens in
|
||||
Litern vor. Pellets oder Brennholz in kg.
|
||||
Bitte geben Sie die Einheit ein. Die Liste passt sich
|
||||
entsprechend des ausgeählten Brennstoffes an. Erdgas
|
||||
wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl
|
||||
liegt meistens in Litern vor. Pellets oder Brennholz in
|
||||
kg.
|
||||
</HelpLabel>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -51,7 +51,11 @@ export type VerbrauchsausweisWohnenClient = OmitKeys<
|
||||
export type VerbrauchsausweisGewerbeClient = OmitKeys<
|
||||
VerbrauchsausweisGewerbe,
|
||||
"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
|
||||
@@ -66,7 +70,11 @@ export type VerbrauchsausweisGewerbeClient = OmitKeys<
|
||||
export type BedarfsausweisWohnenClient = OmitKeys<
|
||||
BedarfsausweisWohnen,
|
||||
"id" | "aufnahme_id" | "benutzer_id"
|
||||
>;
|
||||
> & {
|
||||
uid_objekt: string,
|
||||
uid_aufnahme: string,
|
||||
uid_benutzer?: string
|
||||
};
|
||||
|
||||
/**
|
||||
* Das ist der Typescript Type für die Gebäude Stammdaten mit allen Feldern die
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
<!-- TODO: Metrics für den Fortschritt festlegen -->
|
||||
<span class="text-sm font-semibold text-base-content">{progress}%</span>
|
||||
</div>
|
||||
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis)}
|
||||
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt)}
|
||||
|
||||
{:then calculations}
|
||||
<div class="flex flex-col gap-2">
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<script lang="ts">
|
||||
import { ripple } from "svelte-ripple-action";
|
||||
import type { RippleOptions } from "svelte-ripple-action/dist/constants";
|
||||
import type { RippleOptions } from "svelte-ripple-action/dist/constants.js";
|
||||
import { Home, Reader, EnvelopeClosed, Cube, Bell, Gear, LockClosed, HamburgerMenu } from "radix-svelte-icons"
|
||||
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
|
||||
import DashboardNotification from "./DashboardNotification.svelte";
|
||||
import { notifications } from "#components/NotificationProvider/shared";
|
||||
import { notifications } from "#components/NotificationProvider/shared.js";
|
||||
import ThemeController from "#components/ThemeController.svelte";
|
||||
import { BenutzerClient } from "#components/Ausweis/types";
|
||||
import { BenutzerClient } from "#components/Ausweis/types.js";
|
||||
import Cross1 from "radix-svelte-icons/src/lib/icons/Cross1.svelte";
|
||||
|
||||
export let lightTheme: boolean;
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
<script lang="ts">
|
||||
import { Buffer } from "buffer";
|
||||
import { VerbrauchsausweisWohnenClient } from "./Ausweis/types";
|
||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let bilder: UploadedGebaeudeBild[];
|
||||
|
||||
$: base64 = Buffer.from(JSON.stringify(ausweis), "utf-8").toString("base64");
|
||||
$: base64Ausweis = Buffer.from(JSON.stringify(ausweis), "utf-8").toString("base64")
|
||||
$: base64Aufnahme = Buffer.from(JSON.stringify(aufnahme), "utf-8").toString("base64")
|
||||
$: base64Objekt = Buffer.from(JSON.stringify(objekt), "utf-8").toString("base64")
|
||||
$: base64Bilder = Buffer.from(JSON.stringify(bilder), "utf-8").toString("base64")
|
||||
</script>
|
||||
|
||||
<a class="border-2 rounded-lg bg-white text-center hover:shadow-md no-underline p-3 cursor-pointer" target="_blank" href="/pdf/datenblatt?base64={base64}">
|
||||
<a class="border-2 rounded-lg bg-white text-center hover:shadow-md no-underline p-3 cursor-pointer" target="_blank" href="/pdf/datenblatt?ausweis={base64Ausweis}&objekt=${base64Objekt}&aufnahme={base64Aufnahme}&bilder={base64Bilder}">
|
||||
<img src="/images/datenblatt.webp" alt="Datenblatt" />
|
||||
<span class="text-black font-medium text-lg">Datenblatt</span>
|
||||
</a>
|
||||
@@ -1,15 +1,15 @@
|
||||
<script lang="ts">
|
||||
import UploadImages from "./UploadImages.svelte";
|
||||
import type { BedarfsausweisWohnen, Enums, VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
|
||||
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||
import type { Enums } from "@ibcornelsen/database/client";
|
||||
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||
import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons";
|
||||
|
||||
export let images: UploadedGebaeudeBild[] = [];
|
||||
export let max: number = 4;
|
||||
export let min: number = 1;
|
||||
export let name: string = "";
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||
export let gebaeude: ObjektClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let kategorie: Enums.BilderKategorie
|
||||
|
||||
async function rotateImage(image: UploadedGebaeudeBild): Promise<UploadedGebaeudeBild> {
|
||||
@@ -36,7 +36,7 @@
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col gap-4">
|
||||
<UploadImages {name} {kategorie} {max} {min} bind:upload bind:gebaeude bind:images bind:ausweis><slot /></UploadImages>
|
||||
<UploadImages {name} {kategorie} {max} {min} bind:upload bind:objekt bind:images bind:ausweis><slot /></UploadImages>
|
||||
<div class="grid grid-cols-2 gap-2">
|
||||
{#each images as image, i}
|
||||
{#if image.kategorie == kategorie}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
<div>
|
||||
|
||||
<input type="radio" data-test={paymentType} id={paymentType} name="paymentType" on:change={() => selectedPaymentType = paymentType} />
|
||||
<input type="radio" data-cy={paymentType} id={paymentType} name="paymentType" on:change={() => selectedPaymentType = paymentType} />
|
||||
|
||||
<label for={paymentType}>
|
||||
<div class="grid grid-rows-[1fr_20px] justify-items-center items-center cursor-pointer">
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await api.postleitzahlen.GET.fetch({ plz: zip });
|
||||
const result = await api.postleitzahlen.GET.fetch({ plz: zip, limit: 10 });
|
||||
|
||||
if (result.length > 0) {
|
||||
zipCodes = result;
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
</script>
|
||||
|
||||
<div class="" use:clickOutside={() => {
|
||||
<div use:clickOutside={() => {
|
||||
hideZipDropdown = true;
|
||||
}}>
|
||||
|
||||
@@ -65,13 +65,19 @@
|
||||
maxlength="5"
|
||||
/>
|
||||
|
||||
<div data-test="plz-container" class="absolute top-[calc(100%+4px)] left-0 w-full bg-white py-2 shadow-md rounded-lg z-50" hidden={hideZipDropdown}>
|
||||
<div data-test="plz-container" class="absolute top-[calc(100%+4px)] flex flex-col left-0 bg-white py-1 shadow-md rounded-lg z-10" class: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={() => {
|
||||
<button class="hover:bg-gray-100 cursor-pointer px-2 py-1 text-nowrap" tabindex="-1" on:click={() => {
|
||||
zip = zipCode.plz;
|
||||
city = zipCode.stadt;
|
||||
hideZipDropdown = true;
|
||||
}}>{zipCode.plz}, {zipCode.stadt}</div>
|
||||
}}>{zipCode.plz}, {zipCode.stadt}</button>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
button:not(:last-of-type) {
|
||||
@apply border-b border-b-gray-200;
|
||||
}
|
||||
</style>
|
||||
@@ -1,5 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { A14BerechnungAufwandszahlenMittlereBelastung } from "#lib/Berechnungen/BedarfsausweisWohnen/A14BerechnungAufwandszahlenMittlereBelastung.js";
|
||||
import { funktionNennleistungWaermeerzeugerWarmwasserA14 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionNennleistungWaermeerzeugerWarmwasserA14.js";
|
||||
import { SystemModule } from "@faker-js/faker";
|
||||
|
||||
$: result = A14BerechnungAufwandszahlenMittlereBelastung();
|
||||
|
||||
@@ -28,7 +30,7 @@ $: result = A14BerechnungAufwandszahlenMittlereBelastung();
|
||||
<th colspan="1" class="border border-gray-300 px-4 py-2 text-center">Q<sub>h,b</sub> [kWh/a]<br>aus Tabelle A.12:</th>
|
||||
<th colspan="1" class="border border-gray-300 px-4 py-2 text-center bg-yellow-100">{Math.round(result.gesamtNutzenergieHeizung)}</th>
|
||||
<th colspan="1" class="border border-gray-300 px-4 py-2 text-center">t<sub>h,m</sub> [h/a]<br>aus Tabelle A.12:</th>
|
||||
<th colspan="1" class="border border-gray-300 px-4 py-2 text-center bg-yellow-100">{Math.round(result.heizstundenGesamt)}</th>
|
||||
<th colspan="1" class="border border-gray-300 px-4 py-2 text-center bg-yellow-100">{Math.round(result.gesamtHeizstunden)}</th>
|
||||
<th colspan="1" class="border border-gray-300 px-4 py-2 text-center">Φ<sub>h,max</sub> [W]<br>aus Tabelle A.6:</th>
|
||||
<th colspan="1" class="border border-gray-300 px-4 py-2 text-center bg-yellow-100">{Math.round(result.maximaleHeizlast)}</th>
|
||||
</tr>
|
||||
@@ -41,7 +43,7 @@ $: result = A14BerechnungAufwandszahlenMittlereBelastung();
|
||||
<th colspan="2" class="border border-gray-300 px-4 py-2 text-center">Übergabe</th>
|
||||
<th colspan="2" class="border border-gray-300 px-4 py-2 text-center">Verteilung</th>
|
||||
<th colspan="2" class="border border-gray-300 px-4 py-2 text-center">Speicherung</th>
|
||||
<th colspan="2" class="border border-gray-300 px-4 py-2 text-center">Erzeugung</th>
|
||||
<th colspan="2" class="border border-gray-300 px-4 py-2 text-center">Erzeugung {Math.round(result.NennleistungWaermeerzeuger*100)/100}</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="border border-gray-300 px-4 py-2"></th>
|
||||
@@ -58,17 +60,24 @@ $: result = A14BerechnungAufwandszahlenMittlereBelastung();
|
||||
</thead>
|
||||
<tbody>
|
||||
{#each result.ErgebnisseAufwandsZahlenBelastungHeizung as system, index}
|
||||
<tr class="text-center">
|
||||
<td colspan="2" class="text-left border border-gray-300 px-4 py-2">flächenbezogene Heizlast [W/m²]</td>
|
||||
<td colspan="2" class="border-2 border-gray-600 px-4 py-2">{Math.round(system.flaechenbezogeneLeistungUebergabeHeizung*100)/100}</td>
|
||||
<td colspan="2" class="border-2 border-gray-600 px-4 py-2">{Math.round(system.flaechenbezogeneLeistungVerteilungHeizung*100)/100}</td>
|
||||
<td colspan="2" class="border-2 border-gray-600 px-4 py-2">{Math.round(system.flaechenbezogeneLeistungSpeicherungHeizung*100)/100}</td>
|
||||
<td colspan="2" class="border-2 border-gray-600 px-4 py-2"></td>
|
||||
</tr>
|
||||
<tr class="text-center">
|
||||
<td class="border border-gray-300 px-4 py-2">{system.Bezeichnung}</td>
|
||||
<td class="border border-gray-300 px-4 py-2 bg-yellow-100">{Math.round(system.VersorgteFlaeche*100)/100}</td>
|
||||
<td class="border-2 border-gray-600 px-4 py-2">{Math.round(system.mittlereBelastungUebergabeHeizung*1000)/1000}</td>
|
||||
<td class="border border-gray-300 px-4 py-2 bg-blue-100">{Math.round(system.AufwandsZahlUebergabeHeizung*1000)/1000}</td>
|
||||
<td class="border-2 border-gray-600 px-4 py-2">{Math.round(system.mittlereBelastungVerteilungHeizung*1000)/1000}</td>
|
||||
<td class="border border-gray-300 px-4 py-2 bg-blue-100"></td>
|
||||
<td class="border-2 border-gray-600 px-4 py-2"></td>
|
||||
<td class="border border-gray-300 px-4 py-2 bg-blue-100"></td>
|
||||
<td class="border-2 border-gray-600 px-4 py-2"></td>
|
||||
<td class="border border-gray-300 px-4 py-2 bg-blue-100"></td>
|
||||
<td class="border border-gray-300 px-4 py-2 bg-blue-100">{Math.round(system.AufwandsZahlVerteilungHeizung*1000)/1000}</td>
|
||||
<td class="border-2 border-gray-600 px-4 py-2">{Math.round(system.mittlereBelastungSpeicherungHeizung*1000)/1000}</td>
|
||||
<td class="border border-gray-300 px-4 py-2 bg-blue-100">{Math.round(system.AufwandsZahlSpeicherungHeizung*1000)/1000}</td>
|
||||
<td class="border-2 border-gray-600 px-4 py-2">{Math.round(system.mittlereBelastungErzaegungHeizung*1000)/1000}</td>
|
||||
<td class="border border-gray-300 px-4 py-2 bg-blue-100">{Math.round(system.AufwandsZahlErzeugungHeizung*1000)/1000}</td>
|
||||
</tr>
|
||||
{/each}
|
||||
<tr>
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
<script lang="ts">
|
||||
import HelpLabel from "#components/labels/HelpLabel.svelte";
|
||||
import type { BedarfsausweisWohnen, Enums, VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
|
||||
import type { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
export let max: number = 2;
|
||||
export let min: number = 1;
|
||||
export let name: string = ""
|
||||
|
||||
// Array of base64 encoded images read into the input.
|
||||
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||
|
||||
export let images: UploadedGebaeudeBild[] = [];
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||
export let gebaeude: ObjektClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let kategorie: Enums.BilderKategorie;
|
||||
|
||||
function getAllImages(this: HTMLInputElement) {
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
const reader = new FileReader();
|
||||
|
||||
reader.onload = (ev) => {
|
||||
reader.onload = () => {
|
||||
if (reader.readyState != reader.DONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ 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: ObjektClient, aufnahme: AufnahmeClient): Promise<boolean> {
|
||||
export async function auditEndEnergie(ausweis: VerbrauchsausweisWohnenClient, objekt: ObjektClient, aufnahme: AufnahmeClient): Promise<boolean> {
|
||||
if (hidden.has(AuditType.END_ENERGIE)) {
|
||||
return false;
|
||||
}
|
||||
@@ -11,9 +11,9 @@ export async function auditEndEnergie(ausweis: VerbrauchsausweisWohnenClient, ge
|
||||
if (aufnahme){
|
||||
if (aufnahme.flaeche && ausweis.verbrauch_1 && ausweis.verbrauch_2 && ausweis.verbrauch_3) {
|
||||
try {
|
||||
const response = await getKlimafaktoren(ausweis.startdatum, gebaeude.plz);
|
||||
const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz);
|
||||
// Alle Klimfaktoren konnten abgefragt werden.
|
||||
const eevva = await endEnergieVerbrauchVerbrauchsausweis_2016({...ausweis, aufnahme: {...aufnahme, objekt: gebaeude}});
|
||||
const eevva = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
if (eevva){
|
||||
if (eevva?.endEnergieVerbrauchGesamt <= 45 || eevva?.endEnergieVerbrauchGesamt >= 500) {
|
||||
return true;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { AuditType, hidden } from "./hidden.js";
|
||||
|
||||
export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnenClient, gebaeude: AufnahmeClient): number[] {
|
||||
if (gebaeude.leerstand && (gebaeude.leerstand > 0)) {
|
||||
export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient): number[] {
|
||||
if (aufnahme.leerstand && (aufnahme.leerstand > 0)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
||||
76
src/components/design/header/AusweisHeaderImmowelt.astro
Normal file
76
src/components/design/header/AusweisHeaderImmowelt.astro
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
import HeaderLogin from "#components/design/header/HeaderLogin.svelte";
|
||||
---
|
||||
|
||||
<header id="header">
|
||||
|
||||
<div id="header-grid" class="grid relative bg-white items-center gap-x-4 pt-4 px-0
|
||||
|
||||
grid-cols-1
|
||||
sm:grid-cols-1
|
||||
md:grid-cols-1
|
||||
|
||||
lg:grid-cols-[1fr_minmax(450px,450px)] lg:gap-x-3 lg:px-4 lg:py-4
|
||||
xl:grid-cols-[1fr_minmax(450px,450px)] xl:gap-x-4 xl:px-6 xl:py-4
|
||||
2xl:grid-cols-[1fr_minmax(450px,450px)] 2xl:gap-x-5 2xl:px-6 2xl:py-4">
|
||||
|
||||
<div class="justify-self-center xs:justify-self-start">
|
||||
|
||||
<div class="grid grid-cols-1 px-2 gap-2 gap-y-1
|
||||
xs:grid-cols-[max-content,1fr] xs:gap-x-2 xs:px-4
|
||||
md:gap-y-4
|
||||
lg:px-0 lg:gap-x-4">
|
||||
|
||||
<div class="ml-4 mb-2 mt-2 mr-4">
|
||||
<a href="/">
|
||||
<img id="header-logo" class="w-109
|
||||
xs:max-w-[109px]
|
||||
sm:max-w-[109px]
|
||||
md:max-w-[109px] md:ml-6
|
||||
lg:max-w-[109px] lg:ml-0
|
||||
xl:max-w-[109px] xl:ml-0
|
||||
"
|
||||
src="/images/header/logo_immowelt.svg" alt="Immowelt-Logo"/>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="text-center md:justify-self-start xs:mt-[20px] md:mt-[18px]">
|
||||
<div id="header-text-2" class="text-color:#303038ff justify-self-center
|
||||
xs:[font-size:_clamp(15px,4vw,28px)] xs:justify-self-start xs:leading-[20px]
|
||||
lg:[font-size:_clamp(15px,3vw,20px)]
|
||||
lg:leading-[2rem]
|
||||
xl:[font-size:_clamp(15px,3vw,24px)]
|
||||
xl:leading-[0.5rem]">
|
||||
Hier komfortabel und einfach online den <b>Verbrauchsausweis Wohnen</b> bestellen
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="w-full justify-self-center">
|
||||
<HeaderLogin client:load />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-start-1 col-span-3">
|
||||
<div id="header-line" class="px-2 flex flex-row w-full justify-end items-center bg-gray-200 h-[30px]
|
||||
lg:h-[30px] xl:h-[30px]"></div>
|
||||
</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>
|
||||
86
src/components/design/header/AusweisHeaderImmowelt2.astro
Normal file
86
src/components/design/header/AusweisHeaderImmowelt2.astro
Normal file
@@ -0,0 +1,86 @@
|
||||
---
|
||||
import HeaderLogin from "#components/design/header/HeaderLogin.svelte";
|
||||
---
|
||||
|
||||
<header id="header">
|
||||
|
||||
<div id="header-grid" class="grid relative bg-white items-center gap-x-4 pt-4 px-0
|
||||
|
||||
grid-cols-1
|
||||
sm:grid-cols-1
|
||||
md:grid-cols-1
|
||||
|
||||
lg:grid-cols-[1fr_minmax(450px,450px)] lg:gap-x-3 lg:px-4 lg:py-4
|
||||
xl:grid-cols-[1fr_minmax(450px,450px)] xl:gap-x-4 xl:px-6 xl:py-4
|
||||
2xl:grid-cols-[1fr_minmax(450px,450px)] 2xl:gap-x-5 2xl:px-6 2xl:py-4"
|
||||
|
||||
<div class="justify-self-center xs:justify-self-start">
|
||||
|
||||
<div class="grid grid-cols-1 px-2 gap-2 gap-y-1
|
||||
xs:grid-cols-[max-content,1fr] xs:gap-x-2 xs:px-4
|
||||
md:gap-y-4
|
||||
lg:px-0 lg:gap-x-4">
|
||||
|
||||
<div class="self-center justify-self-center ml-4 mb-2 background-image" >
|
||||
<a href="/">
|
||||
<img id="header-logo" class="w-full
|
||||
xs:max-w-[150px]
|
||||
sm:max-w-[150px]
|
||||
md:max-w-[150px] md:ml-6
|
||||
lg:max-w-[150px] lg:ml-0
|
||||
xl:max-w-[150px] xl:ml-0
|
||||
"
|
||||
src="/images/header/logo_immowelt.svg" alt="Immowelt-Logo"/>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="self-center justify-self-center md:justify-self-start xs:mt-[20px] md:mt-[18px]">
|
||||
|
||||
<div id="header-text-1"class="text-secondary justify-self-center
|
||||
xs:[font-size:_clamp(15px,5vw,36px)] xs:justify-self-start xs:leading-[36px]
|
||||
|
||||
lg:[font-size:_clamp(15px,3vw,26px)]
|
||||
lg:leading-[2rem]
|
||||
xl:[font-size:_clamp(15px,3vw,36px)]
|
||||
xl:leading-[4.5rem] pt-[0px]">
|
||||
</div>
|
||||
|
||||
<div id="header-text-2"class="text-primary justify-self-center
|
||||
xs:[font-size:_clamp(15px,4vw,28px)] xs:justify-self-start xs:leading-[20px]
|
||||
|
||||
lg:[font-size:_clamp(15px,3vw,20px)]
|
||||
lg:leading-[2rem]
|
||||
xl:[font-size:_clamp(15px,3vw,24px)]
|
||||
xl:leading-[0.5rem]">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="w-full justify-self-center">
|
||||
<HeaderLogin client:load />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-start-1 col-span-3">
|
||||
<div id="header-line" class="px-2 flex flex-row w-full justify-end items-center bg-immowelt-gelb
|
||||
lg:h-[8px] xl:h-[8px]"></div>
|
||||
</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>
|
||||
@@ -1,24 +1,26 @@
|
||||
import fuelList from "#components/Ausweis/brennstoffListe";
|
||||
import fuelList from "#components/Ausweis/brennstoffListe.js";
|
||||
import { faker } from "@faker-js/faker";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { type Enums } from "@ibcornelsen/database/client";
|
||||
import "cypress-file-upload"
|
||||
import moment from "moment";
|
||||
|
||||
describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
const ausstellgrund = (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]);
|
||||
const heizungsstatus = (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]);
|
||||
|
||||
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(
|
||||
cy.get("select[data-cy='ausstellgrund']")
|
||||
.select(
|
||||
faker.number.int({
|
||||
min: 0,
|
||||
max: Object.values(Enums.Ausstellgrund).length - 1,
|
||||
max: (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]).length - 1,
|
||||
})
|
||||
)
|
||||
.check();
|
||||
|
||||
// Jetzt Füllen wir das Baujahr vom Gebäude aus.
|
||||
cy.get("input[name='baujahr_gebaeude']")
|
||||
@@ -71,14 +73,14 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
.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,
|
||||
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", heizungsstatus.length).parent().select(faker.number.int({
|
||||
max: 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,
|
||||
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", heizungsstatus.length).parent().select(faker.number.int({
|
||||
max: heizungsstatus.length,
|
||||
min: 1
|
||||
}));
|
||||
|
||||
@@ -88,9 +90,22 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
|
||||
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
|
||||
|
||||
let availableDates = [];
|
||||
const startDate = moment()
|
||||
.subtract(4, "years")
|
||||
.subtract(6, "months");
|
||||
const endDate = moment().subtract(3, "years");
|
||||
|
||||
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
|
||||
availableDates.push({
|
||||
year: m.year(),
|
||||
month: m.month(),
|
||||
});
|
||||
}
|
||||
|
||||
// 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());
|
||||
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.toString());
|
||||
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(availableDates[0].year.toString());
|
||||
|
||||
// Verbrauch
|
||||
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
@@ -101,18 +116,18 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
const zusaetzlicheHeizquelle = Math.random() > 0.5;
|
||||
|
||||
if (zusaetzlicheHeizquelle) {
|
||||
cy.get("input[name='zusaetzliche_heizquelle']").check();
|
||||
cy.get("[data-cy='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]);
|
||||
cy.get("[data-cy='brennstoff_2']").select(brennstoffKombo2[0], { force: true });
|
||||
cy.get("[data-cy='einheit_2']").select(brennstoffKombo2[1], { force: true });
|
||||
|
||||
// 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());
|
||||
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
|
||||
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
|
||||
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
|
||||
}
|
||||
|
||||
// Gebäudestrom
|
||||
@@ -169,7 +184,7 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
|
||||
// Gebäudetyp
|
||||
cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
const options = $dropdown.find('option:not([disabled])');
|
||||
// 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);
|
||||
});
|
||||
@@ -210,7 +225,7 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
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();
|
||||
// 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" });
|
||||
@@ -247,14 +262,14 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
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 });
|
||||
cy.get("form[name='ausweis'] button[data-cy='weiter']").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();
|
||||
cy.get("[data-cy='registrieren']").click();
|
||||
|
||||
const email = faker.internet.email();
|
||||
const passwort = faker.internet.password();
|
||||
const passwort = "test1234";
|
||||
const vorname = faker.person.firstName();
|
||||
const nachname = faker.person.lastName();
|
||||
|
||||
@@ -272,6 +287,37 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
|
||||
cy.get("form[name='login'] button[type='submit']").click();
|
||||
|
||||
// Der Ausweis sollte jetzt schon erstellt worden sein.
|
||||
// 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']").should("contain.value", email);
|
||||
cy.get("input[data-cy='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[data-cy='bestellen']").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.
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
@@ -266,11 +266,11 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
cy.wait(1000)
|
||||
|
||||
// Wir füllen jetzt die Kundendaten aus.
|
||||
cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
|
||||
// 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='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());
|
||||
@@ -278,14 +278,14 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
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();
|
||||
// cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
|
||||
cy.get("input[name='rechnung_email']").should("contain.value", email);
|
||||
cy.get("input[data-cy='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.get("input[name='agb-akzeptieren']").check()
|
||||
// cy.get("input[name='datenschutz-akzeptieren']").check()
|
||||
cy.get("button[data-cy='bestellen']").click();
|
||||
|
||||
cy.origin('https://www.mollie.com', () => {
|
||||
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus
|
||||
|
||||
156
src/layouts/AusweisLayoutDatenImmowelt.astro
Normal file
156
src/layouts/AusweisLayoutDatenImmowelt.astro
Normal file
@@ -0,0 +1,156 @@
|
||||
---
|
||||
import "../style/global.css";
|
||||
import "../style/formular.css";
|
||||
import "../../svelte-dialogs.config"
|
||||
import Header from "#components/design/header/AusweisHeaderImmowelt.astro";
|
||||
import Footer from "#components/design/footer/Footer.astro";
|
||||
import { NotificationWrapper } from "@ibcornelsen/ui";
|
||||
|
||||
export interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
---
|
||||
<script>
|
||||
window.addEventListener("scroll", (event) => {
|
||||
let scroll = window.scrollY;
|
||||
|
||||
|
||||
|
||||
console.log(scroll);
|
||||
if(scroll>=400){
|
||||
|
||||
document.getElementById('skala')?.classList.add('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
|
||||
document.getElementById('skala')?.classList.remove('w-full');
|
||||
|
||||
|
||||
document.getElementById('skala').style.borderBottom = "3px solid #e6e6e6";
|
||||
|
||||
|
||||
document.getElementById('performance-box').style.maxWidth = "688.5px";
|
||||
document.getElementById('progress-box').style.maxWidth = "688.5px";
|
||||
|
||||
document.getElementById('formInput-1')?.classList.add('2xl:mt-[370px]');
|
||||
|
||||
|
||||
|
||||
|
||||
}else{
|
||||
|
||||
document.getElementById('skala')?.classList.remove('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
|
||||
document.getElementById('skala')?.classList.add('w-full');
|
||||
|
||||
document.getElementById('skala').style.borderBottom = "none";
|
||||
|
||||
document.getElementById('formInput-1')?.classList.remove('2xl:mt-[370px]');
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<!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."
|
||||
/>
|
||||
<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="w-full p-0 grid
|
||||
xs:grid-cols-[minmax(1fr)] xs:gap-1 xs:p-0
|
||||
sm:grid-cols-[minmax(1fr)] sm:gap-1 sm:p-0
|
||||
md:grid-cols-[minmax(1fr)] md:gap-2 md:p-0
|
||||
lg:grid-cols-[minmax(1fr)] lg:gap-3 lg:p-4
|
||||
xl:grid-cols-[minmax(1fr)] xl:gap-4 xl:p-6
|
||||
2xl:grid-cols-[minmax(1fr)] 2xl:gap-5 2xl:p-6
|
||||
">
|
||||
|
||||
|
||||
<article class="box rounded-tl-none p-2 lg:p-12">
|
||||
<slot />
|
||||
</article>
|
||||
|
||||
</main>
|
||||
|
||||
<Footer />
|
||||
<NotificationWrapper client:load />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<style is:global lang="postcss">
|
||||
body {
|
||||
min-height: 100vh;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
article {
|
||||
p, h1, h2, h3, h4, h5, h6 {
|
||||
@apply text-base-content;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.headline {
|
||||
@apply text-lg;
|
||||
}
|
||||
|
||||
.radio-inline {
|
||||
@apply flex flex-row gap-2;
|
||||
}
|
||||
|
||||
.checkbox-inline {
|
||||
@apply flex flex-row gap-2;
|
||||
}
|
||||
|
||||
</style>
|
||||
156
src/layouts/AusweisLayoutDatenImmowelt2.astro
Normal file
156
src/layouts/AusweisLayoutDatenImmowelt2.astro
Normal file
@@ -0,0 +1,156 @@
|
||||
---
|
||||
import "../style/global.css";
|
||||
import "../style/formular.css";
|
||||
import "../../svelte-dialogs.config"
|
||||
import Header from "#components/design/header/AusweisHeaderImmowelt2.astro";
|
||||
import Footer from "#components/design/footer/Footer.astro";
|
||||
import { NotificationWrapper } from "@ibcornelsen/ui";
|
||||
|
||||
export interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
---
|
||||
<script>
|
||||
window.addEventListener("scroll", (event) => {
|
||||
let scroll = window.scrollY;
|
||||
|
||||
|
||||
|
||||
console.log(scroll);
|
||||
if(scroll>=400){
|
||||
|
||||
document.getElementById('skala')?.classList.add('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
|
||||
document.getElementById('skala')?.classList.remove('w-full');
|
||||
|
||||
|
||||
document.getElementById('skala').style.borderBottom = "3px solid #e6e6e6";
|
||||
|
||||
|
||||
document.getElementById('performance-box').style.maxWidth = "688.5px";
|
||||
document.getElementById('progress-box').style.maxWidth = "688.5px";
|
||||
|
||||
document.getElementById('formInput-1')?.classList.add('2xl:mt-[370px]');
|
||||
|
||||
|
||||
|
||||
|
||||
}else{
|
||||
|
||||
document.getElementById('skala')?.classList.remove('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
|
||||
document.getElementById('skala')?.classList.add('w-full');
|
||||
|
||||
document.getElementById('skala').style.borderBottom = "none";
|
||||
|
||||
document.getElementById('formInput-1')?.classList.remove('2xl:mt-[370px]');
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<!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."
|
||||
/>
|
||||
<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="w-full p-0 grid
|
||||
xs:grid-cols-[minmax(1fr)] xs:gap-1 xs:p-0
|
||||
sm:grid-cols-[minmax(1fr)] sm:gap-1 sm:p-0
|
||||
md:grid-cols-[minmax(1fr)] md:gap-2 md:p-0
|
||||
lg:grid-cols-[minmax(1fr)] lg:gap-3 lg:p-4
|
||||
xl:grid-cols-[minmax(1fr)] xl:gap-4 xl:p-6
|
||||
2xl:grid-cols-[minmax(1fr)] 2xl:gap-5 2xl:p-6
|
||||
">
|
||||
|
||||
|
||||
<article class="box rounded-tl-none p-2 lg:p-12">
|
||||
<slot />
|
||||
</article>
|
||||
|
||||
</main>
|
||||
|
||||
<Footer />
|
||||
<NotificationWrapper client:load />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<style is:global lang="postcss">
|
||||
body {
|
||||
min-height: 100vh;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
article {
|
||||
p, h1, h2, h3, h4, h5, h6 {
|
||||
@apply text-base-content;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.headline {
|
||||
@apply text-lg;
|
||||
}
|
||||
|
||||
.radio-inline {
|
||||
@apply flex flex-row gap-2;
|
||||
}
|
||||
|
||||
.checkbox-inline {
|
||||
@apply flex flex-row gap-2;
|
||||
}
|
||||
|
||||
</style>
|
||||
@@ -5,7 +5,9 @@ import "../../svelte-dialogs.config"
|
||||
import "svelte-ripple-action/ripple.css"
|
||||
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte"
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
import { createCaller } from "#lib/caller";
|
||||
import { createCaller } from "src/astro-typesafe-api-caller";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { BenutzerClient } from "#components/Ausweis/types";
|
||||
|
||||
const valid = validateAccessTokenServer(Astro)
|
||||
|
||||
@@ -16,7 +18,11 @@ if (!valid) {
|
||||
|
||||
const caller = createCaller(Astro)
|
||||
|
||||
const benutzer = await caller.v1.benutzer.self()
|
||||
const benutzer = (await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
})) || {} as BenutzerClient;
|
||||
|
||||
export interface Props {
|
||||
title: string;
|
||||
@@ -101,7 +107,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen grid md:grid-cols-[300px_1fr]">
|
||||
<DashboardSidebar lightTheme={lightTheme} benutzer={benutzer} client:load></DashboardSidebar>
|
||||
<DashboardSidebar lightTheme={lightTheme} {benutzer} client:load></DashboardSidebar>
|
||||
<main class="p-4 md:p-8 overflow-auto h-screen bg-base-100 pt-20 md:!pt-24">
|
||||
<slot />
|
||||
</main>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { funktionAusnutzungsgrad } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionAusnutzungsgrad.js";
|
||||
import { funktionWaermesenken } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionWaermesenken.js";
|
||||
import { funktionAusnutzungsgradT18 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionAusnutzungsgradT18.js";
|
||||
import { funktionWaermesenkenA8A12 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionWaermesenkenA8A12.js";
|
||||
import { A11BerechnungWaermequellenZusammenstellung } from "#lib/Berechnungen/BedarfsausweisWohnen/A11BerechnungWaermequellenZusammenstellung.js";
|
||||
|
||||
export function A12BerechnungNutzenergiebedarfHeizung() {
|
||||
|
||||
const result = funktionWaermesenken();
|
||||
const result = funktionWaermesenkenA8A12();
|
||||
const belastungsgrade = result.belastungsgrade;
|
||||
const bilanzInnenTemperaturen = result.bilanzInnenTemperaturen;
|
||||
const waermeSenken = result.waermeSenken;
|
||||
@@ -107,18 +107,18 @@ let monatlicheBelastungDezember = 0;
|
||||
waermequellensenkenverhaeltnisNovember = waermeQuellen.November / waermeSenken.November;
|
||||
waermequellensenkenverhaeltnisDezember = waermeQuellen.Dezember / waermeSenken.Dezember;
|
||||
|
||||
ausnutzungsgradJanuar = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisJanuar, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradFebruar = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisFebruar, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradMärz = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisMärz, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradApril = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisApril, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradMai = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisMai, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradJuni = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisJuni, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradJuli = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisJuli, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradAugust = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisAugust, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradSeptember = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisSeptember, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradOktober = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisOktober, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradNovember = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisNovember, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradDezember = funktionAusnutzungsgrad(waermequellensenkenverhaeltnisDezember, ZeitKonstante, "alleMonate");
|
||||
ausnutzungsgradJanuar = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisJanuar);
|
||||
ausnutzungsgradFebruar = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisFebruar);
|
||||
ausnutzungsgradMärz = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisMärz);
|
||||
ausnutzungsgradApril = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisApril);
|
||||
ausnutzungsgradMai = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisMai);
|
||||
ausnutzungsgradJuni = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisJuni);
|
||||
ausnutzungsgradJuli = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisJuli);
|
||||
ausnutzungsgradAugust = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisAugust);
|
||||
ausnutzungsgradSeptember = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisSeptember);
|
||||
ausnutzungsgradOktober = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisOktober);
|
||||
ausnutzungsgradNovember = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisNovember);
|
||||
ausnutzungsgradDezember = funktionAusnutzungsgradT18(ZeitKonstante, waermequellensenkenverhaeltnisDezember);
|
||||
|
||||
faktorBelastungJanuar = Math.max(1 - (waermequellensenkenverhaeltnisJanuar * ausnutzungsgradJanuar), 0);
|
||||
faktorBelastungFebruar = Math.max(1 - (waermequellensenkenverhaeltnisFebruar * ausnutzungsgradFebruar), 0);
|
||||
|
||||
@@ -1,101 +1,162 @@
|
||||
import { A6BerechnungWaermeTransferMaxStroemeLueftungGesamt } from "#lib/Berechnungen/BedarfsausweisWohnen/A6BerechnungWaermeTransferMaxStroemeLueftungGesamt.js";
|
||||
import { A9BerechnungNutzenergiebedarfTrinkwarmwasser } from "#lib/Berechnungen/BedarfsausweisWohnen/A9BerechnungNutzenergiebedarfTrinkwarmwasser.js";
|
||||
import { A12BerechnungNutzenergiebedarfHeizung } from "#lib/Berechnungen/BedarfsausweisWohnen/A12BerechnungNutzenergiebedarfHeizung.js";
|
||||
import { A13BerechnungRechnerischeLaufzeitHeizung } from "#lib/Berechnungen/BedarfsausweisWohnen/A13BerechnungRechnerischeLaufzeitHeizung.js";
|
||||
import { funktionKorrekturfaktorMittlereBelastungT32 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionKorrekturfaktorMittlereBelastungT32.js";
|
||||
import { funktionNennleistungWaermeerzeugerWarmwasserA14 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionNennleistungWaermeerzeugerWarmwasserA14.js";
|
||||
import { funktionAufwandszahlErzeugungHeizungT77 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionAufwandszahlErzeugungHeizungT77.js";
|
||||
|
||||
|
||||
export function A14BerechnungAufwandszahlenMittlereBelastung() {
|
||||
|
||||
const result = A12BerechnungNutzenergiebedarfHeizung();
|
||||
const heizstunden = {
|
||||
Januar: result.heizstundenJanuar,
|
||||
Februar: result.heizstundenFebruar,
|
||||
Maerz: result.heizstundenMärz,
|
||||
April: result.heizstundenApril,
|
||||
Mai: result.heizstundenMai,
|
||||
Juni: result.heizstundenJuni,
|
||||
Juli: result.heizstundenJuli,
|
||||
August: result.heizstundenAugust,
|
||||
September: result.heizstundenSeptember,
|
||||
Oktober: result.heizstundenOktober,
|
||||
November: result.heizstundenNovember,
|
||||
Dezember: result.heizstundenDezember
|
||||
};
|
||||
const heizstundenGesamt = Object.values(heizstunden).reduce((acc, value) => acc + value, 0);
|
||||
const gesamtHeizstunden = result.gesamtHeizstunden;
|
||||
const gesamtNutzenergieHeizung = result.gesamtNutzenergieHeizung;
|
||||
|
||||
const resultMaximaleHeizlast = A6BerechnungWaermeTransferMaxStroemeLueftungGesamt();
|
||||
const maximaleHeizlast = resultMaximaleHeizlast.maximaleHeizlast;
|
||||
|
||||
// Planungswerte aus Eingabe
|
||||
const resultRechnerischeLaufzeitHeizung = A13BerechnungRechnerischeLaufzeitHeizung();
|
||||
const rechnerischeLaufzeitGesamt = resultRechnerischeLaufzeitHeizung.rechnerischeLaufzeitGesamt;
|
||||
|
||||
const resultNutzenergiebedarfTrinkwarmwasser = A9BerechnungNutzenergiebedarfTrinkwarmwasser();
|
||||
const flaechenBezogenerWaermebedarf = resultNutzenergiebedarfTrinkwarmwasser.flaechenBezogenerWaermebedarf;
|
||||
|
||||
// Planungswerte aus Eingabe, Tabellen 20, 21, 22, C12, 30, 31, 41, 49, 50, 51, 52, 53
|
||||
|
||||
let NettoGrundflaeche = 154.2;
|
||||
let anlass = "Neubau";
|
||||
let ZuschlagsFaktorErzeugung = 0;
|
||||
|
||||
const PlanungswerteUebergabeVerteilungHeizung = [
|
||||
{
|
||||
Bezeichnung: "Übergabe Verteilung 1 - Heizung",
|
||||
VersorgteFlaeche: 0.5,
|
||||
Anlage: "Erzeuger 1 - zentral",
|
||||
VersorgteFlaeche: 0.7,
|
||||
UebergabeSystem: "Heizkörper",
|
||||
rohrsystem: "Zwei-Rohr-System",
|
||||
rohrnetztyp: "I (Etagenringtyp)",
|
||||
anzahlHeizflaechen: "bis 10",
|
||||
hydraulischerAbgleich: "Abgleich statisch je Heizkörper/Heizfläche und Gruppenabgleich statisch (z.B. mit Strangregulierventil)",
|
||||
raumtemperaturRegelung: "P-Regler",
|
||||
ueberTemperatur: "30 K (55°C/45°C)",
|
||||
ueberTemperatur: "55°C/45°C",
|
||||
waermeverlustAußenbauteile: "Radiatorposition Außenwand",
|
||||
intermittierenderBetrieb: "-",
|
||||
einzelraumregelSysteme: "-",
|
||||
verteilung: "Verteilleitungen im beheizten Bereich",
|
||||
PufferSpeicherHeizung: 0,
|
||||
ehs0: 1,
|
||||
ehce0: 1.042,
|
||||
Δehce1: 0.015,
|
||||
Δehce2: 0.009,
|
||||
Δehce3: 0,
|
||||
Δehce5: 0,
|
||||
Δehcehydr: 0.018,
|
||||
fhydr: 1.02
|
||||
fhydr: 1.02,
|
||||
ehd0: 1.049
|
||||
|
||||
},
|
||||
{
|
||||
Bezeichnung: "Übergabe Verteilung 2 - Heizung",
|
||||
VersorgteFlaeche: 0.5,
|
||||
UebergabeSystem: "Heizkörper",
|
||||
rohrsystem: "Zwei-Rohr-System",
|
||||
rohrnetztyp: "I (Etagenringtyp)",
|
||||
anzahlHeizflaechen: "bis 10",
|
||||
hydraulischerAbgleich: "Abgleich statisch je Heizkörper/Heizfläche und Gruppenabgleich statisch (z.B. mit Strangregulierventil)",
|
||||
raumtemperaturRegelung: "P-Regler",
|
||||
ueberTemperatur: "30 K (55°C/45°C)",
|
||||
waermeverlustAußenbauteile: "Radiatorposition Außenwand",
|
||||
Anlage: "Erzeuger 1 - zentral",
|
||||
VersorgteFlaeche: 0.2,
|
||||
UebergabeSystem: "Fußbodenheizung Nasssystem",
|
||||
rohrnetztyp: "IIb (Etagenverteilertyp Fußbodenheizung)",
|
||||
raumtemperaturRegelung: "ungeregelt, mit zentraler Vorlauftemperaturregelung",
|
||||
ueberTemperatur: "35°C/28°C",
|
||||
waermeverlustAngrenzendeBauteile: "integrierte Heizfläche mit Mindestdämmung nach DIN EN 1264 (alle Teile)",
|
||||
intermittierenderBetrieb: "-",
|
||||
einzelraumregelSysteme: "-",
|
||||
verteilung: "Verteilleitungen im beheizten Bereich",
|
||||
PufferSpeicherHeizung: 0,
|
||||
ehs0: 1,
|
||||
ehce0: 1.149,
|
||||
Δehce1: 0.021,
|
||||
Δehce2: 0.015,
|
||||
Δehce3: 0,
|
||||
Δehce5: 0,
|
||||
Δehcehydr: 0,
|
||||
fhydr: 1,
|
||||
ehd0: 1.004
|
||||
|
||||
},
|
||||
{
|
||||
Anlage: "Erzeuger 2 - dezentral",
|
||||
VersorgteFlaeche: 0.1,
|
||||
Heizungsart: "Elektro-Direktheizung, PI-Regler (mit Optimierung)",
|
||||
Bereich: "Außenwandbereich",
|
||||
intermittierenderBetrieb: "Nein",
|
||||
ehs0: 1,
|
||||
ehce0: 1.042,
|
||||
Δehce1: 0.015,
|
||||
Δehce2: 0.009,
|
||||
Δehce3: 0,
|
||||
Δehce5: 0,
|
||||
Δehcehydr: 0.018,
|
||||
fhydr: 1.02
|
||||
Δehce1: 0,
|
||||
Δehce2: 0,
|
||||
Δehce3: 0,
|
||||
Δehce5: 0,
|
||||
Δehcehydr: 0,
|
||||
fhydr: 1,
|
||||
ehd0: 1
|
||||
|
||||
}
|
||||
];
|
||||
|
||||
const ErgebnisseAufwandsZahlenBelastungHeizung = PlanungswerteUebergabeVerteilungHeizung.map(system => {
|
||||
const mittlereBelastungUebergabeHeizung = (gesamtNutzenergieHeizung / (heizstundenGesamt * maximaleHeizlast)) * 1000 * system.VersorgteFlaeche;
|
||||
const resultfunktionNennleistungWaermeerzeugerWarmwasserA14 = funktionNennleistungWaermeerzeugerWarmwasserA14(NettoGrundflaeche, flaechenBezogenerWaermebedarf);
|
||||
const NennleistungWaermeerzeugerWarmwasser = resultfunktionNennleistungWaermeerzeugerWarmwasserA14;
|
||||
|
||||
|
||||
if (anlass === "Neubau") {
|
||||
ZuschlagsFaktorErzeugung = 1.1;
|
||||
}
|
||||
else {
|
||||
ZuschlagsFaktorErzeugung = 1.5;
|
||||
}
|
||||
|
||||
const NennleistungWaermeerzeugerHeizung = resultMaximaleHeizlast.maximaleHeizlast / 1000;
|
||||
const NennleistungWaermeerzeuger = ZuschlagsFaktorErzeugung * Math.max(NennleistungWaermeerzeugerWarmwasser, NennleistungWaermeerzeugerHeizung);
|
||||
|
||||
const ErgebnisseAufwandsZahlenBelastungHeizung = PlanungswerteUebergabeVerteilungHeizung.map((system: any) => {
|
||||
const mittlereBelastungUebergabeHeizung = (gesamtNutzenergieHeizung / (gesamtHeizstunden * maximaleHeizlast)) * 1000 * system.VersorgteFlaeche;
|
||||
const AufwandsZahlUebergabeHeizung = system.ehce0 + system.Δehce1 + system.Δehce2 + system.Δehce3 + system.Δehce5 + system.Δehcehydr;
|
||||
const mittlereBelastungVerteilungHeizung = mittlereBelastungUebergabeHeizung * AufwandsZahlUebergabeHeizung * system.fhydr;
|
||||
|
||||
const flaechenbezogeneLeistungUebergabeHeizung = (maximaleHeizlast / NettoGrundflaeche) * AufwandsZahlUebergabeHeizung;
|
||||
|
||||
const KorrekturfaktorMittlereBelastung = funktionKorrekturfaktorMittlereBelastungT32(system.verteilung, system.rohrnetztyp, system.ueberTemperatur, mittlereBelastungVerteilungHeizung) || 0;
|
||||
const AufwandsZahlVerteilungHeizungKorrektur = system.ehd0 * KorrekturfaktorMittlereBelastung;
|
||||
const AufwandsZahlVerteilungHeizungKorrekturZwei = 1 + (AufwandsZahlVerteilungHeizungKorrektur - 1) * (50/flaechenbezogeneLeistungUebergabeHeizung);
|
||||
const AufwandsZahlVerteilungHeizung = (AufwandsZahlVerteilungHeizungKorrekturZwei - 1) * (8760/rechnerischeLaufzeitGesamt) + 1;
|
||||
const flaechenbezogeneLeistungVerteilungHeizung = flaechenbezogeneLeistungUebergabeHeizung * AufwandsZahlVerteilungHeizung;
|
||||
|
||||
const mittlereBelastungSpeicherungHeizung = mittlereBelastungVerteilungHeizung * AufwandsZahlVerteilungHeizung;
|
||||
const AufwandsZahlSpeicherungHeizung = system.ehs0;
|
||||
const flaechenbezogeneLeistungSpeicherungHeizung = flaechenbezogeneLeistungVerteilungHeizung * AufwandsZahlSpeicherungHeizung;
|
||||
|
||||
const mittlereBelastungErzaegungHeizung = mittlereBelastungSpeicherungHeizung * AufwandsZahlSpeicherungHeizung;
|
||||
|
||||
const AufwandsZahlErzeugungHeizung = funktionAufwandszahlErzeugungHeizungT77(NennleistungWaermeerzeuger, mittlereBelastungErzaegungHeizung);
|
||||
|
||||
return {
|
||||
Bezeichnung: system.Bezeichnung,
|
||||
Bezeichnung: system.Anlage + " - " + system.VersorgteFlaeche * 100 + " % versorgte Fläche - " + (system.UebergabeSystem ? system.UebergabeSystem : system.Heizungsart),
|
||||
mittlereBelastungUebergabeHeizung: mittlereBelastungUebergabeHeizung,
|
||||
VersorgteFlaeche: system.VersorgteFlaeche,
|
||||
AufwandsZahlUebergabeHeizung: AufwandsZahlUebergabeHeizung,
|
||||
mittlereBelastungVerteilungHeizung: mittlereBelastungVerteilungHeizung
|
||||
|
||||
|
||||
|
||||
mittlereBelastungVerteilungHeizung: mittlereBelastungVerteilungHeizung,
|
||||
flaechenbezogeneLeistungUebergabeHeizung: flaechenbezogeneLeistungUebergabeHeizung,
|
||||
AufwandsZahlVerteilungHeizung: AufwandsZahlVerteilungHeizung,
|
||||
flaechenbezogeneLeistungVerteilungHeizung: flaechenbezogeneLeistungVerteilungHeizung,
|
||||
mittlereBelastungSpeicherungHeizung: mittlereBelastungSpeicherungHeizung,
|
||||
AufwandsZahlSpeicherungHeizung: AufwandsZahlSpeicherungHeizung,
|
||||
flaechenbezogeneLeistungSpeicherungHeizung: flaechenbezogeneLeistungSpeicherungHeizung,
|
||||
mittlereBelastungErzaegungHeizung: mittlereBelastungErzaegungHeizung,
|
||||
AufwandsZahlErzeugungHeizung: AufwandsZahlErzeugungHeizung
|
||||
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
return {
|
||||
|
||||
heizstundenGesamt,
|
||||
gesamtHeizstunden,
|
||||
maximaleHeizlast,
|
||||
gesamtNutzenergieHeizung,
|
||||
ErgebnisseAufwandsZahlenBelastungHeizung
|
||||
ErgebnisseAufwandsZahlenBelastungHeizung,
|
||||
NennleistungWaermeerzeuger
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import FensterImage from "#components/Ausweis/FensterImage.svelte";
|
||||
import { funktionSolareBestrahlungsEnergie } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionSolareBestrahlungsEnergie.js";
|
||||
import { funktionSolareBestrahlungsEnergieT17 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionSolareBestrahlungsEnergieT17.js";
|
||||
|
||||
export function A7A2BerechnungWaermequellenSolareEinstrahlung() {
|
||||
|
||||
@@ -85,7 +85,7 @@ export function A7A2BerechnungWaermequellenSolareEinstrahlung() {
|
||||
// Berechnung der solaren Wärmequellen pro Fenster und Monat
|
||||
|
||||
PlanungswerteBauteil.forEach(item => {
|
||||
const MonatsWerte = funktionSolareBestrahlungsEnergie(item.Neigung, item.Orientierung);
|
||||
const MonatsWerte = funktionSolareBestrahlungsEnergieT17(item.Neigung, item.Orientierung);
|
||||
if (MonatsWerte) {
|
||||
const SolareWaermequelleJanuar = MonatsWerte.jan * item.Flaeche * item.RahmenAnteil * item.GesamtEnergieDurchlassGrad * item.StrahlungsEinfluss * item.Verschattung;
|
||||
const MonatsWerteJanuar = MonatsWerte.jan;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { funktionWaermesenken } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionWaermesenken.js";
|
||||
import { funktionWaermesenkenA8A12 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionWaermesenkenA8A12.js";
|
||||
import { A7A2BerechnungWaermequellenSolareEinstrahlung } from "#lib/Berechnungen/BedarfsausweisWohnen/A7A2BerechnungWaermequellenSolareEinstrahlung.js";
|
||||
import { funktionInterneWaermequellen } from "./funktionInterneWaermequellen.js";
|
||||
import { funktionInterneWaermequellenA8 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionInterneWaermequellenA8.js";
|
||||
|
||||
export function A8BerechnungWaermequellenAusAnlagentechnikHeizung() {
|
||||
|
||||
const result = funktionWaermesenken();
|
||||
const result = funktionWaermesenkenA8A12();
|
||||
const waermeSenken = result.waermeSenken;
|
||||
const belastungsgrade = result.belastungsgrade;
|
||||
|
||||
@@ -22,7 +22,7 @@ const einstrahlung = A7A2BerechnungWaermequellenSolareEinstrahlung();
|
||||
const summeErgebnisseNovember = einstrahlung.summeErgebnisseNovember;
|
||||
const summeErgebnisseDezember = einstrahlung.summeErgebnisseDezember;
|
||||
|
||||
const resultInterneWaermeQuellen = funktionInterneWaermequellen();
|
||||
const resultInterneWaermeQuellen = funktionInterneWaermequellenA8();
|
||||
const interneWaermeQuellenProMonat = resultInterneWaermeQuellen.interneWaermeQuellenProMonat;
|
||||
|
||||
let TageMonat = {
|
||||
|
||||
@@ -1,16 +1,10 @@
|
||||
import { BedarfsausweisWohnenClient, AufnahmeClient } from "#components/Ausweis/types.js";
|
||||
import { linearInterpolation } from "js-interpolate"
|
||||
|
||||
|
||||
/**
|
||||
* Implementierung Tabelle E.7 — Tabelle A.9 - Trinkwassererwärmung - Berechnung des Wärmebedarfs zur Trinkwassererwärmung
|
||||
*
|
||||
* @see 18599-Tabellenverfahren-Wohngebaeude.pdf
|
||||
* @export
|
||||
* @param {BedarfsausweisWohnenClient} ausweis
|
||||
* @param {AufnahmeClient} gebaeude_aufnahme
|
||||
*/
|
||||
export function A9BerechnungNutzenergiebedarfTrinkwarmwasser(ausweis: BedarfsausweisWohnenClient, gebaeude_aufnahme: AufnahmeClient) {
|
||||
export function A9BerechnungNutzenergiebedarfTrinkwarmwasser() {
|
||||
// A_NGF aus Eingabe
|
||||
const bezugsflaeche = 154.2;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionAufwandszahlErzeugungHeizungFernwaermeT102(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [5], DatenSpalte: [1.008, 1.009, 1.009, 1.009, 1.009, 1.009, 1.010, 1.010, 1.010, 1.010] },
|
||||
{ SuchSpalte: [10], DatenSpalte: [1.005, 1.005, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006, 1.006] },
|
||||
{ SuchSpalte: [20], DatenSpalte: [1.003, 1.003, 1.004, 1.004, 1.004, 1.004, 1.004, 1.004, 1.004, 1.004] },
|
||||
{ SuchSpalte: [30], DatenSpalte: [1.003, 1.003, 1.003, 1.003, 1.003, 1.003, 1.003, 1.003, 1.003, 1.003] },
|
||||
{ SuchSpalte: [40], DatenSpalte: [1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.003, 1.003] },
|
||||
{ SuchSpalte: [50], DatenSpalte: [1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002] },
|
||||
{ SuchSpalte: [60], DatenSpalte: [1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002] },
|
||||
{ SuchSpalte: [70], DatenSpalte: [1.001, 1.001, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002, 1.002] },
|
||||
{ SuchSpalte: [80], DatenSpalte: [1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.002, 1.002, 1.002, 1.002] },
|
||||
{ SuchSpalte: [90], DatenSpalte: [1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001] },
|
||||
{ SuchSpalte: [100], DatenSpalte: [1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001] },
|
||||
{ SuchSpalte: [200], DatenSpalte: [1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001] },
|
||||
{ SuchSpalte: [300], DatenSpalte: [1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001] },
|
||||
{ SuchSpalte: [400], DatenSpalte: [1.000, 1.000, 1.000, 1.000, 1.001, 1.001, 1.001, 1.001, 1.001, 1.001] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] } ];
|
||||
|
||||
|
||||
const AufwandszahlErzeugungHeizungFernwaerme = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return AufwandszahlErzeugungHeizungFernwaerme;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionAufwandszahlErzeugungHeizungT77(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [5], DatenSpalte: [1.013, 1.019, 1.024, 1.042, 1.061, 1.079, 1.098, 1.117, 1.135, 1.154] },
|
||||
{ SuchSpalte: [10], DatenSpalte: [1.011, 1.017, 1.023, 1.041, 1.059, 1.077, 1.096, 1.114, 1.132, 1.150] },
|
||||
{ SuchSpalte: [20], DatenSpalte: [1.010, 1.016, 1.022, 1.040, 1.057, 1.075, 1.093, 1.111, 1.129, 1.147] },
|
||||
{ SuchSpalte: [30], DatenSpalte: [1.009, 1.016, 1.021, 1.039, 1.056, 1.074, 1.092, 1.109, 1.127, 1.145] },
|
||||
{ SuchSpalte: [40], DatenSpalte: [1.009, 1.015, 1.021, 1.038, 1.056, 1.073, 1.091, 1.108, 1.126, 1.143] },
|
||||
{ SuchSpalte: [50], DatenSpalte: [1.009, 1.015, 1.020, 1.038, 1.055, 1.073, 1.090, 1.107, 1.125, 1.142] },
|
||||
{ SuchSpalte: [60], DatenSpalte: [1.008, 1.015, 1.020, 1.037, 1.055, 1.072, 1.089, 1.107, 1.124, 1.141] },
|
||||
{ SuchSpalte: [70], DatenSpalte: [1.008, 1.014, 1.020, 1.037, 1.054, 1.072, 1.089, 1.106, 1.123, 1.140] },
|
||||
{ SuchSpalte: [80], DatenSpalte: [1.008, 1.014, 1.020, 1.037, 1.054, 1.071, 1.088, 1.105, 1.122, 1.140] },
|
||||
{ SuchSpalte: [90], DatenSpalte: [1.008, 1.014, 1.020, 1.037, 1.054, 1.071, 1.088, 1.105, 1.122, 1.139] },
|
||||
{ SuchSpalte: [100], DatenSpalte: [1.008, 1.014, 1.019, 1.036, 1.053, 1.070, 1.087, 1.104, 1.121, 1.138] },
|
||||
{ SuchSpalte: [120], DatenSpalte: [1.008, 1.014, 1.019, 1.036, 1.053, 1.070, 1.087, 1.104, 1.121, 1.138] },
|
||||
{ SuchSpalte: [140], DatenSpalte: [1.008, 1.014, 1.019, 1.036, 1.053, 1.069, 1.086, 1.103, 1.120, 1.137] },
|
||||
{ SuchSpalte: [160], DatenSpalte: [1.007, 1.013, 1.019, 1.036, 1.052, 1.069, 1.086, 1.103, 1.119, 1.136] },
|
||||
{ SuchSpalte: [180], DatenSpalte: [1.007, 1.013, 1.019, 1.035, 1.052, 1.069, 1.085, 1.102, 1.119, 1.135] },
|
||||
{ SuchSpalte: [200], DatenSpalte: [1.007, 1.013, 1.019, 1.035, 1.052, 1.068, 1.085, 1.102, 1.118, 1.135] },
|
||||
{ SuchSpalte: [250], DatenSpalte: [1.007, 1.013, 1.018, 1.035, 1.051, 1.068, 1.084, 1.101, 1.117, 1.134] },
|
||||
{ SuchSpalte: [300], DatenSpalte: [1.007, 1.013, 1.018, 1.034, 1.051, 1.067, 1.084, 1.100, 1.117, 1.133] },
|
||||
{ SuchSpalte: [350], DatenSpalte: [1.007, 1.012, 1.018, 1.034, 1.050, 1.067, 1.083, 1.099, 1.116, 1.132] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] } ];
|
||||
|
||||
|
||||
const AufwandsZahlErzeugungHeizung = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return AufwandsZahlErzeugungHeizung;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionAufwandszahlErzeugungHeizungUmlaufWasserheizerT82(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [11], DatenSpalte: [1.038,1.069,1.098,1.122,1.145,1.169,1.192,1.216,1.240,1.263] },
|
||||
{ SuchSpalte: [18], DatenSpalte: [1.037,1.068,1.096,1.120,1.143,1.166,1.189,1.212,1.236,1.259] },
|
||||
{ SuchSpalte: [24], DatenSpalte: [1.037,1.067,1.096,1.118,1.141,1.164,1.187,1.210,1.233,1.256] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] } ];
|
||||
|
||||
|
||||
const AufwandszahlErzeugungHeizungUmlaufWasserheizer = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return AufwandszahlErzeugungHeizungUmlaufWasserheizer;
|
||||
|
||||
}
|
||||
@@ -1,156 +0,0 @@
|
||||
// Funktion zur Berechnung des Ausnutzungsgrades aus Tabelle 18
|
||||
|
||||
import { cubicSplineInterpolation, nevillePolynomialInterpolation } from "js-interpolate";
|
||||
|
||||
const dataset = {
|
||||
alleMonate: {
|
||||
30: [
|
||||
0.999, 0.992, 0.978, 0.956, 0.927, 0.893, 0.856, 0.818, 0.78, 0.742,
|
||||
0.706, 0.671, 0.638, 0.608, 0.579, 0.553, 0.528, 0.505, 0.483,
|
||||
0.463, 0.445, 0.428, 0.411, 0.396, 0.382, 0.369, 0.357, 0.345,
|
||||
0.334, 0.324, 0.314, 0.305, 0.296, 0.288, 0.28, 0.273, 0.266, 0.259,
|
||||
0.253, 0.246, 0.22, 0.198, 0.181, 0.166, 0.153, 0.142, 0.133, 0.125,
|
||||
0.117, 0.111, 0.105, 0.1,
|
||||
],
|
||||
40: [
|
||||
1.0, 0.997, 0.99, 0.975, 0.954, 0.926, 0.892, 0.855, 0.817, 0.778,
|
||||
0.739, 0.702, 0.667, 0.634, 0.603, 0.574, 0.547, 0.522, 0.498,
|
||||
0.477, 0.457, 0.438, 0.421, 0.405, 0.39, 0.376, 0.363, 0.351, 0.339,
|
||||
0.329, 0.318, 0.309, 0.3, 0.291, 0.283, 0.276, 0.268, 0.261, 0.255,
|
||||
0.249, 0.221, 0.199, 0.181, 0.166, 0.154, 0.143, 0.133, 0.125,
|
||||
0.118, 0.111, 0.105, 0.1,
|
||||
],
|
||||
50: [
|
||||
1.0, 0.999, 0.995, 0.986, 0.97, 0.948, 0.918, 0.883, 0.845, 0.805,
|
||||
0.765, 0.726, 0.688, 0.652, 0.619, 0.588, 0.559, 0.533, 0.508,
|
||||
0.485, 0.464, 0.445, 0.427, 0.41, 0.394, 0.38, 0.366, 0.354, 0.342,
|
||||
0.331, 0.321, 0.311, 0.301, 0.293, 0.285, 0.277, 0.269, 0.262,
|
||||
0.256, 0.249, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125,
|
||||
0.118, 0.111, 0.105, 0.1,
|
||||
],
|
||||
60: [
|
||||
1.0, 1.0, 0.998, 0.992, 0.981, 0.963, 0.937, 0.904, 0.867, 0.826,
|
||||
0.785, 0.743, 0.704, 0.666, 0.631, 0.598, 0.568, 0.54, 0.514, 0.491,
|
||||
0.469, 0.449, 0.43, 0.413, 0.397, 0.382, 0.368, 0.355, 0.343, 0.332,
|
||||
0.322, 0.312, 0.302, 0.293, 0.285, 0.277, 0.27, 0.263, 0.256, 0.25,
|
||||
0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111,
|
||||
0.105, 0.1,
|
||||
],
|
||||
70: [
|
||||
1.0, 1.0, 0.999, 0.996, 0.988, 0.973, 0.951, 0.921, 0.884, 0.843,
|
||||
0.8, 0.757, 0.716, 0.676, 0.639, 0.605, 0.574, 0.545, 0.518, 0.494,
|
||||
0.472, 0.451, 0.432, 0.414, 0.398, 0.383, 0.369, 0.356, 0.344,
|
||||
0.333, 0.322, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256,
|
||||
0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118,
|
||||
0.111, 0.105, 0.1,
|
||||
],
|
||||
80: [
|
||||
1.0, 1.0, 0.999, 0.998, 0.992, 0.981, 0.962, 0.934, 0.898, 0.857,
|
||||
0.813, 0.769, 0.725, 0.684, 0.646, 0.61, 0.578, 0.548, 0.521, 0.496,
|
||||
0.473, 0.452, 0.433, 0.415, 0.399, 0.384, 0.37, 0.357, 0.344, 0.333,
|
||||
0.322, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25,
|
||||
0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111,
|
||||
0.105, 0.1,
|
||||
],
|
||||
90: [
|
||||
1.0, 1.0, 1.0, 0.999, 0.995, 0.986, 0.97, 0.944, 0.91, 0.869, 0.824,
|
||||
0.778, 0.733, 0.69, 0.651, 0.614, 0.581, 0.55, 0.523, 0.497, 0.474,
|
||||
0.453, 0.434, 0.416, 0.4, 0.384, 0.37, 0.357, 0.345, 0.333, 0.322,
|
||||
0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222,
|
||||
0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105,
|
||||
0.1,
|
||||
],
|
||||
100: [
|
||||
1.0, 1.0, 1.0, 0.999, 0.997, 0.99, 0.976, 0.953, 0.92, 0.879, 0.833,
|
||||
0.786, 0.739, 0.695, 0.654, 0.617, 0.583, 0.552, 0.524, 0.498,
|
||||
0.475, 0.454, 0.434, 0.416, 0.4, 0.384, 0.37, 0.357, 0.345, 0.333,
|
||||
0.323, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25,
|
||||
0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111,
|
||||
0.105, 0.1,
|
||||
],
|
||||
110: [
|
||||
1.0, 1.0, 1.0, 0.999, 0.998, 0.993, 0.981, 0.96, 0.928, 0.887,
|
||||
0.841, 0.792, 0.744, 0.699, 0.657, 0.619, 0.584, 0.553, 0.525,
|
||||
0.499, 0.475, 0.454, 0.435, 0.417, 0.4, 0.384, 0.37, 0.357, 0.345,
|
||||
0.333, 0.323, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256,
|
||||
0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118,
|
||||
0.111, 0.105, 0.1,
|
||||
],
|
||||
120: [
|
||||
1.0, 1.0, 1.0, 1.0, 0.999, 0.995, 0.985, 0.966, 0.935, 0.895, 0.847,
|
||||
0.798, 0.748, 0.702, 0.659, 0.621, 0.586, 0.554, 0.525, 0.5, 0.476,
|
||||
0.454, 0.435, 0.417, 0.4, 0.385, 0.37, 0.357, 0.345, 0.333, 0.323,
|
||||
0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222,
|
||||
0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105,
|
||||
0.1,
|
||||
],
|
||||
130: [
|
||||
1.0, 1.0, 1.0, 1.0, 0.999, 0.996, 0.988, 0.971, 0.942, 0.901, 0.853,
|
||||
0.802, 0.752, 0.704, 0.661, 0.622, 0.587, 0.554, 0.526, 0.5, 0.476,
|
||||
0.454, 0.435, 0.417, 0.4, 0.385, 0.37, 0.357, 0.345, 0.333, 0.323,
|
||||
0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222,
|
||||
0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105,
|
||||
0.1,
|
||||
],
|
||||
140: [
|
||||
1.0, 1.0, 1.0, 1.0, 0.999, 0.997, 0.991, 0.975, 0.947, 0.907, 0.858,
|
||||
0.806, 0.755, 0.706, 0.662, 0.623, 0.587, 0.555, 0.526, 0.5, 0.476,
|
||||
0.454, 0.435, 0.417, 0.4, 0.385, 0.37, 0.357, 0.345, 0.333, 0.323,
|
||||
0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222,
|
||||
0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105,
|
||||
0.1,
|
||||
],
|
||||
150: [
|
||||
1.0, 1.0, 1.0, 1.0, 0.999, 0.998, 0.992, 0.979, 0.952, 0.912, 0.863,
|
||||
0.809, 0.757, 0.708, 0.663, 0.623, 0.588, 0.555, 0.526, 0.5, 0.476,
|
||||
0.454, 0.435, 0.417, 0.4, 0.385, 0.37, 0.357, 0.345, 0.333, 0.323,
|
||||
0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222,
|
||||
0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105,
|
||||
0.1,
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
const waermeQuellenSenkenVerhaeltnis = [
|
||||
0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5,
|
||||
1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1,
|
||||
3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8,
|
||||
8.5, 9, 9.5, 10,
|
||||
];
|
||||
|
||||
export function funktionAusnutzungsgrad(
|
||||
waermequellensenkenverhaeltnis: number,
|
||||
zeitkonstane: number,
|
||||
monat: keyof typeof dataset
|
||||
) {
|
||||
const data = dataset[monat];
|
||||
|
||||
const interpolations: number[] = [];
|
||||
|
||||
for (const key in data) {
|
||||
const values = data[key as unknown as keyof typeof data];
|
||||
|
||||
const interpolated = cubicSplineInterpolation(
|
||||
values.map((value, i) => ({
|
||||
x: waermeQuellenSenkenVerhaeltnis[i],
|
||||
y: value,
|
||||
})),
|
||||
waermequellensenkenverhaeltnis
|
||||
);
|
||||
|
||||
|
||||
interpolations.push(interpolated);
|
||||
}
|
||||
|
||||
const interpolated = cubicSplineInterpolation(
|
||||
interpolations.map((interpolation, i) => {
|
||||
return {
|
||||
x: Object.keys(data)[i],
|
||||
y: interpolation,
|
||||
};
|
||||
}),
|
||||
zeitkonstane
|
||||
);
|
||||
|
||||
return interpolated;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionAusnutzungsgradT18(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [30], DatenSpalte: [0.999, 0.992, 0.978, 0.956, 0.927, 0.893, 0.856, 0.818, 0.78, 0.742, 0.706, 0.671, 0.638, 0.608, 0.579, 0.553, 0.528, 0.505, 0.483, 0.463, 0.445, 0.428, 0.411, 0.396, 0.382, 0.369, 0.357, 0.345, 0.334, 0.324, 0.314, 0.305, 0.296, 0.288, 0.28, 0.273, 0.266, 0.259, 0.253, 0.246, 0.22, 0.198, 0.181, 0.166, 0.153, 0.142, 0.133, 0.125, 0.117, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [40], DatenSpalte: [1.0, 0.997, 0.99, 0.975, 0.954, 0.926, 0.892, 0.855, 0.817, 0.778, 0.739, 0.702, 0.667, 0.634, 0.603, 0.574, 0.547, 0.522, 0.498, 0.477, 0.457, 0.438, 0.421, 0.405, 0.39, 0.376, 0.363, 0.351, 0.339, 0.329, 0.318, 0.309, 0.3, 0.291, 0.283, 0.276, 0.268, 0.261, 0.255, 0.249, 0.221, 0.199, 0.181, 0.166, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [50], DatenSpalte: [1.0, 0.999, 0.995, 0.986, 0.97, 0.948, 0.918, 0.883, 0.845, 0.805, 0.765, 0.726, 0.688, 0.652, 0.619, 0.588, 0.559, 0.533, 0.508, 0.485, 0.464, 0.445, 0.427, 0.41, 0.394, 0.38, 0.366, 0.354, 0.342, 0.331, 0.321, 0.311, 0.301, 0.293, 0.285, 0.277, 0.269, 0.262, 0.256, 0.249, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [60], DatenSpalte: [1.0, 1.0, 0.998, 0.992, 0.981, 0.963, 0.937, 0.904, 0.867, 0.826, 0.785, 0.743, 0.704, 0.666, 0.631, 0.598, 0.568, 0.54, 0.514, 0.491, 0.469, 0.449, 0.43, 0.413, 0.397, 0.382, 0.368, 0.355, 0.343, 0.332, 0.322, 0.312, 0.302, 0.293, 0.285, 0.277, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [70], DatenSpalte: [1.0, 1.0, 0.999, 0.996, 0.988, 0.973, 0.951, 0.921, 0.884, 0.843, 0.8, 0.757, 0.716, 0.676, 0.639, 0.605, 0.574, 0.545, 0.518, 0.494, 0.472, 0.451, 0.432, 0.414, 0.398, 0.383, 0.369, 0.356, 0.344, 0.333, 0.322, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [80], DatenSpalte: [1.0, 1.0, 0.999, 0.998, 0.992, 0.981, 0.962, 0.934, 0.898, 0.857, 0.813, 0.769, 0.725, 0.684, 0.646, 0.61, 0.578, 0.548, 0.521, 0.496, 0.473, 0.452, 0.433, 0.415, 0.399, 0.384, 0.37, 0.357, 0.344, 0.333, 0.322, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [90], DatenSpalte: [1.0, 1.0, 1.0, 0.999, 0.995, 0.986, 0.97, 0.944, 0.91, 0.869, 0.824, 0.778, 0.733, 0.69, 0.651, 0.614, 0.581, 0.55, 0.523, 0.497, 0.474, 0.453, 0.434, 0.416, 0.4, 0.384, 0.37, 0.357, 0.345, 0.333, 0.322, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [100], DatenSpalte: [1.0, 1.0, 1.0, 0.999, 0.997, 0.99, 0.976, 0.953, 0.92, 0.879, 0.833, 0.786, 0.739, 0.695, 0.654, 0.617, 0.583, 0.552, 0.524, 0.498, 0.475, 0.454, 0.434, 0.416, 0.4, 0.384, 0.37, 0.357, 0.345, 0.333, 0.323, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [110], DatenSpalte: [1.0, 1.0, 1.0, 0.999, 0.998, 0.993, 0.981, 0.96, 0.928, 0.887, 0.841, 0.792, 0.744, 0.699, 0.657, 0.619, 0.584, 0.553, 0.525, 0.499, 0.475, 0.454, 0.435, 0.417, 0.4, 0.384, 0.37, 0.357, 0.345, 0.333, 0.323, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [120], DatenSpalte: [1.0, 1.0, 1.0, 1.0, 0.999, 0.995, 0.985, 0.966, 0.935, 0.895, 0.847, 0.798, 0.748, 0.702, 0.659, 0.621, 0.586, 0.554, 0.525, 0.5, 0.476, 0.454, 0.435, 0.417, 0.4, 0.385, 0.37, 0.357, 0.345, 0.333, 0.323, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [130], DatenSpalte: [1.0, 1.0, 1.0, 1.0, 0.999, 0.996, 0.988, 0.971, 0.942, 0.901, 0.853, 0.802, 0.752, 0.704, 0.661, 0.622, 0.587, 0.554, 0.526, 0.5, 0.476, 0.454, 0.435, 0.417, 0.4, 0.385, 0.37, 0.357, 0.345, 0.333, 0.323, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [140], DatenSpalte: [1.0, 1.0, 1.0, 1.0, 0.999, 0.997, 0.991, 0.975, 0.947, 0.907, 0.858, 0.806, 0.755, 0.706, 0.662, 0.623, 0.587, 0.555, 0.526, 0.5, 0.476, 0.454, 0.435, 0.417, 0.4, 0.385, 0.37, 0.357, 0.345, 0.333, 0.323, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] },
|
||||
{ SuchSpalte: [150], DatenSpalte: [1.0, 1.0, 1.0, 1.0, 0.999, 0.998, 0.992, 0.979, 0.952, 0.912, 0.863, 0.809, 0.757, 0.708, 0.663, 0.623, 0.588, 0.555, 0.526, 0.5, 0.476, 0.454, 0.435, 0.417, 0.4, 0.385, 0.37, 0.357, 0.345, 0.333, 0.323, 0.312, 0.303, 0.294, 0.286, 0.278, 0.27, 0.263, 0.256, 0.25, 0.222, 0.2, 0.182, 0.167, 0.154, 0.143, 0.133, 0.125, 0.118, 0.111, 0.105, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] }
|
||||
];
|
||||
|
||||
const dataZeile = [{ DatenZeile: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15] }];
|
||||
|
||||
|
||||
|
||||
const Ausnutzungsgrad = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return Ausnutzungsgrad;
|
||||
|
||||
}
|
||||
@@ -148,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 funktionBilanzInnentemperaturT8T10(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset): number {
|
||||
const data = dataset[monat]
|
||||
|
||||
const interpolations: number[] = []
|
||||
@@ -0,0 +1,35 @@
|
||||
|
||||
export function funktionDoppelteInterpolation(SuchSpalte: number, DatenZeile: number, dataZeile: any, dataBox: any): number {
|
||||
|
||||
function interpolate(x: number, x0: number, y0: number, x1: number, y1: number): number {
|
||||
return y0 + ((y1 - y0) * (x - x0)) / (x1 - x0);
|
||||
}
|
||||
|
||||
function findNearestPoints(data: any[], value: number, key: string): any[] {
|
||||
let lower = data[0];
|
||||
let upper = data[data.length - 1];
|
||||
|
||||
for (let i = 0; i < data.length - 1; i++) {
|
||||
if (data[i][key][0] <= value && data[i + 1][key][0] >= value) {
|
||||
lower = data[i];
|
||||
upper = data[i + 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return [lower, upper];
|
||||
}
|
||||
|
||||
|
||||
const [lowerSuchSpalte, upperSuchSpalte] = findNearestPoints(dataBox, SuchSpalte, 'SuchSpalte');
|
||||
const lowerIndex = dataZeile[0].DatenZeile.findIndex((val: number) => val >= DatenZeile) - 1;
|
||||
const upperIndex = lowerIndex + 1;
|
||||
|
||||
const lowerDatenZeile = dataZeile[0].DatenZeile[lowerIndex];
|
||||
const upperDatenZeile = dataZeile[0].DatenZeile[upperIndex];
|
||||
|
||||
const lowerDatenSpalte = interpolate(DatenZeile, lowerDatenZeile, lowerSuchSpalte.DatenSpalte[lowerIndex], upperDatenZeile, lowerSuchSpalte.DatenSpalte[upperIndex]);
|
||||
const upperDatenSpalte = interpolate(DatenZeile, lowerDatenZeile, upperSuchSpalte.DatenSpalte[lowerIndex], upperDatenZeile, upperSuchSpalte.DatenSpalte[upperIndex]);
|
||||
|
||||
return interpolate(SuchSpalte, lowerSuchSpalte.SuchSpalte[0], lowerDatenSpalte, upperSuchSpalte.SuchSpalte[0], upperDatenSpalte);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionHilfsenergieErzeugungHeizungT83(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [5], DatenSpalte: [0.0208, 0.0267, 0.0325, 0.0418, 0.0510, 0.0603, 0.0696, 0.0789, 0.0882, 0.0974] },
|
||||
{ SuchSpalte: [10], DatenSpalte: [0.0251, 0.0352, 0.0453, 0.0582, 0.0712, 0.0841, 0.0971, 0.1100, 0.1230, 0.1359] },
|
||||
{ SuchSpalte: [20], DatenSpalte: [0.0311, 0.0471, 0.0632, 0.0812, 0.0993, 0.1173, 0.1354, 0.1534, 0.1715, 0.1895] },
|
||||
{ SuchSpalte: [30], DatenSpalte: [0.0356, 0.0562, 0.0768, 0.0987, 0.1206, 0.1425, 0.1645, 0.1864, 0.2083, 0.2303] },
|
||||
{ SuchSpalte: [40], DatenSpalte: [0.0394, 0.0637, 0.0881, 0.1133, 0.1385, 0.1637, 0.1888, 0.2140, 0.2392, 0.2644] },
|
||||
{ SuchSpalte: [50], DatenSpalte: [0.0427, 0.0704, 0.0981, 0.1261, 0.1541, 0.1822, 0.2102, 0.2382, 0.2662, 0.2943] },
|
||||
{ SuchSpalte: [60], DatenSpalte: [0.0457, 0.0764, 0.1071, 0.1376, 0.1682, 0.1988, 0.2294, 0.2600, 0.2906, 0.3212] },
|
||||
{ SuchSpalte: [70], DatenSpalte: [0.0484, 0.0819, 0.1153, 0.1482, 0.1811, 0.2141, 0.2470, 0.2800, 0.3129, 0.3458] },
|
||||
{ SuchSpalte: [80], DatenSpalte: [0.0510, 0.0869, 0.1229, 0.1580, 0.1931, 0.2283, 0.2634, 0.2985, 0.3336, 0.3687] },
|
||||
{ SuchSpalte: [90], DatenSpalte: [0.0534, 0.0917, 0.1301, 0.1672, 0.2044, 0.2415, 0.2787, 0.3158, 0.3530, 0.3902] },
|
||||
{ SuchSpalte: [100], DatenSpalte: [0.0556, 0.0962, 0.1368, 0.1759, 0.2150, 0.2541, 0.2931, 0.3322, 0.3713, 0.4104] },
|
||||
{ SuchSpalte: [120], DatenSpalte: [0.0598, 0.1045, 0.1493, 0.1920, 0.2346, 0.2773, 0.3200, 0.3626, 0.4053, 0.4479] },
|
||||
{ SuchSpalte: [140], DatenSpalte: [0.0636, 0.1122, 0.1608, 0.2067, 0.2527, 0.2986, 0.3445, 0.3905, 0.4364, 0.4823] },
|
||||
{ SuchSpalte: [160], DatenSpalte: [0.0671, 0.1193, 0.1714, 0.2204, 0.2694, 0.3184, 0.3673, 0.4163, 0.4653, 0.5143] },
|
||||
{ SuchSpalte: [180], DatenSpalte: [0.0705, 0.1259, 0.1814, 0.2332, 0.2850, 0.3369, 0.3887, 0.4405, 0.4924, 0.5442] },
|
||||
{ SuchSpalte: [200], DatenSpalte: [0.0736, 0.1322, 0.1908, 0.2453, 0.2998, 0.3543, 0.4089, 0.4634, 0.5179, 0.5724] },
|
||||
{ SuchSpalte: [250], DatenSpalte: [0.0808, 0.1466, 0.2124, 0.2731, 0.3337, 0.3944, 0.4551, 0.5158, 0.5764, 0.6371] },
|
||||
{ SuchSpalte: [300], DatenSpalte: [0.0873, 0.1595, 0.2318, 0.2980, 0.3643, 0.4305, 0.4967, 0.5629, 0.6292, 0.6954] },
|
||||
{ SuchSpalte: [350], DatenSpalte: [0.0932, 0.1714, 0.2496, 0.3209, 0.3922, 0.4635, 0.5349, 0.6062, 0.6775, 0.7488] },
|
||||
{ SuchSpalte: [400], DatenSpalte: [0.0987, 0.1824, 0.2661, 0.3422, 0.4182, 0.4942, 0.5703, 0.6463, 0.7223, 0.7984] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0] } ];
|
||||
|
||||
|
||||
const HilfsenergieErzeugungHeizung = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return HilfsenergieErzeugungHeizung;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionHilfsenergieErzeugungPelletKesselT85(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [5], DatenSpalte: [0.0070, 0.0080, 0.0090, 0.0149, 0.0207, 0.0266, 0.0324, 0.0383, 0.0441, 0.0500] },
|
||||
{ SuchSpalte: [10], DatenSpalte: [0.0107, 0.0143, 0.0180, 0.0240, 0.0300, 0.0360, 0.0420, 0.0480, 0.0540, 0.0600] },
|
||||
{ SuchSpalte: [20], DatenSpalte: [0.0180, 0.0270, 0.0360, 0.0423, 0.0486, 0.0549, 0.0611, 0.0674, 0.0737, 0.0800] },
|
||||
{ SuchSpalte: [30], DatenSpalte: [0.0253, 0.0397, 0.0540, 0.0606, 0.0671, 0.0737, 0.0803, 0.0869, 0.0934, 0.1000] },
|
||||
{ SuchSpalte: [40], DatenSpalte: [0.0327, 0.0523, 0.0720, 0.0789, 0.0857, 0.0926, 0.0994, 0.1063, 0.1131, 0.1200] },
|
||||
{ SuchSpalte: [50], DatenSpalte: [0.0400, 0.0650, 0.0900, 0.0971, 0.1043, 0.1114, 0.1186, 0.1257, 0.1329, 0.1400] },
|
||||
{ SuchSpalte: [60], DatenSpalte: [0.0473, 0.0777, 0.1080, 0.1154, 0.1229, 0.1303, 0.1377, 0.1451, 0.1526, 0.1600] },
|
||||
{ SuchSpalte: [70], DatenSpalte: [0.0547, 0.0903, 0.1260, 0.1337, 0.1414, 0.1491, 0.1569, 0.1646, 0.1723, 0.1800] },
|
||||
{ SuchSpalte: [80], DatenSpalte: [0.0620, 0.1030, 0.1440, 0.1520, 0.1600, 0.1680, 0.1760, 0.1840, 0.1920, 0.2000] },
|
||||
{ SuchSpalte: [90], DatenSpalte: [0.0693, 0.1157, 0.1620, 0.1703, 0.1786, 0.1869, 0.1951, 0.2034, 0.2117, 0.2200] },
|
||||
{ SuchSpalte: [100], DatenSpalte: [0.0767, 0.1283, 0.1800, 0.1886, 0.1971, 0.2057, 0.2143, 0.2229, 0.2314, 0.2400] },
|
||||
{ SuchSpalte: [120], DatenSpalte: [0.0913, 0.1537, 0.2160, 0.2251, 0.2343, 0.2434, 0.2526, 0.2617, 0.2709, 0.2800] },
|
||||
{ SuchSpalte: [140], DatenSpalte: [0.1060, 0.1790, 0.2520, 0.2617, 0.2714, 0.2811, 0.2909, 0.3006, 0.3103, 0.3200] },
|
||||
{ SuchSpalte: [160], DatenSpalte: [0.1207, 0.2043, 0.2880, 0.2983, 0.3086, 0.3189, 0.3291, 0.3394, 0.3497, 0.3600] },
|
||||
{ SuchSpalte: [180], DatenSpalte: [0.1353, 0.2297, 0.3240, 0.3349, 0.3457, 0.3566, 0.3674, 0.3783, 0.3891, 0.4000] },
|
||||
{ SuchSpalte: [200], DatenSpalte: [0.1500, 0.2550, 0.3600, 0.3714, 0.3829, 0.3943, 0.4057, 0.4171, 0.4286, 0.4400] },
|
||||
{ SuchSpalte: [250], DatenSpalte: [0.1867, 0.3183, 0.4500, 0.4629, 0.4757, 0.4886, 0.5014, 0.5143, 0.5271, 0.5400] },
|
||||
{ SuchSpalte: [300], DatenSpalte: [0.2233, 0.3817, 0.5400, 0.5543, 0.5686, 0.5829, 0.5971, 0.6114, 0.6257, 0.6400] },
|
||||
{ SuchSpalte: [350], DatenSpalte: [0.2600, 0.4450, 0.6300, 0.6457, 0.6614, 0.6771, 0.6929, 0.7086, 0.7243, 0.7400] },
|
||||
{ SuchSpalte: [400], DatenSpalte: [0.2967, 0.5083, 0.7200, 0.7371, 0.7543, 0.7714, 0.7886, 0.8057, 0.8229, 0.8400] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0] } ];
|
||||
|
||||
|
||||
const HilfsenergieErzeugungPelletKessel = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return HilfsenergieErzeugungPelletKessel;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionHilfsenergieErzeugungUmlaufWasserheizerT88(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [11], DatenSpalte: [0.0258, 0.0366, 0.0474, 0.0610, 0.0745, 0.0881, 0.1016, 0.1152, 0.1287, 0.1423] },
|
||||
{ SuchSpalte: [18], DatenSpalte: [0.0300, 0.0450, 0.0601, 0.0772, 0.0944, 0.1115, 0.1287, 0.1459, 0.1630, 0.1802] },
|
||||
{ SuchSpalte: [24], DatenSpalte: [0.0330, 0.0510, 0.0690, 0.0887, 0.1084, 0.1281, 0.1478, 0.1675, 0.1872, 0.2069] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0] } ];
|
||||
|
||||
|
||||
const HilfsenergieErzeugungUmlaufWasserheizer = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return HilfsenergieErzeugungUmlaufWasserheizer;
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
export function funktionInterneWaermequellen() {
|
||||
export function funktionInterneWaermequellenA8() {
|
||||
|
||||
// Beispielwerte Planung werden aus Eingabe geholt
|
||||
let NettoGrundflaeche = 154.2;
|
||||
@@ -0,0 +1,21 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionKorrekturfaktorHilfsenergieErzeugungHolzhackSchnitzelT86(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [5], DatenSpalte: [2.9, 3.1, 3.3, 2.3, 1.8, 1.5, 1.4, 1.3, 1.2, 1.1] },
|
||||
{ SuchSpalte: [10], DatenSpalte: [2.3, 2.2, 2.2, 1.8, 1.6, 1.5, 1.4, 1.3, 1.2, 1.2] },
|
||||
{ SuchSpalte: [20], DatenSpalte: [1.7, 1.7, 1.7, 1.6, 1.5, 1.4, 1.4, 1.3, 1.3, 1.3] },
|
||||
{ SuchSpalte: [40], DatenSpalte: [1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.3, 1.3, 1.3] },
|
||||
{ SuchSpalte: [95], DatenSpalte: [1.2, 1.2, 1.2, 1.3, 1.3, 1.3, 1.3, 1.4, 1.4, 1.4] },
|
||||
{ SuchSpalte: [270], DatenSpalte: [1.1, 1.1, 1.2, 1.2, 1.3, 1.3, 1.3, 1.4, 1.4, 1.5] },
|
||||
{ SuchSpalte: [400], DatenSpalte: [1, 1.1, 1.1, 1.2, 1.2, 1.3, 1.3, 1.4, 1.4, 1.5] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] } ];
|
||||
|
||||
const KorrekturfaktorHilfsenergieErzeugungHolzhackSchnitzel = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return KorrekturfaktorHilfsenergieErzeugungHolzhackSchnitzel;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionKorrekturfaktorHilfsenergieErzeugungGasSpezialHeizkesselT84(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [5], DatenSpalte: [0.808, 0.700, 0.631, 0.564, 0.521, 0.491, 0.469, 0.452, 0.439, 0.428] },
|
||||
{ SuchSpalte: [15], DatenSpalte: [0.665, 0.526, 0.450, 0.405, 0.375, 0.355, 0.340, 0.329, 0.320, 0.313] },
|
||||
{ SuchSpalte: [25], DatenSpalte: [0.525, 0.387, 0.322, 0.292, 0.273, 0.260, 0.250, 0.243, 0.237, 0.232] },
|
||||
{ SuchSpalte: [40], DatenSpalte: [0.459, 0.331, 0.274, 0.251, 0.236, 0.226, 0.219, 0.213, 0.209, 0.205] },
|
||||
{ SuchSpalte: [75], DatenSpalte: [0.388, 0.278, 0.232, 0.217, 0.207, 0.201, 0.196, 0.192, 0.189, 0.187] },
|
||||
{ SuchSpalte: [175], DatenSpalte: [0.329, 0.245, 0.212, 0.204, 0.200, 0.196, 0.194, 0.192, 0.190, 0.189] },
|
||||
{ SuchSpalte: [325], DatenSpalte: [0.519, 0.475, 0.458, 0.456, 0.455, 0.454, 0.453, 0.452, 0.452, 0.451] },
|
||||
{ SuchSpalte: [400], DatenSpalte: [0.541, 0.510, 0.498, 0.505, 0.510, 0.513, 0.515, 0.517, 0.518, 0.519] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] } ];
|
||||
|
||||
const KorrekturfaktorHilfsenergieErzeugungGasSpezialHeizkessel = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return KorrekturfaktorHilfsenergieErzeugungGasSpezialHeizkessel;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { datasetKorrekturfaktorVerteilungT32 } from "#lib/Berechnungen/BedarfsausweisWohnen/datasetKorrekturfaktorVerteilungT32.js";
|
||||
|
||||
export function funktionKorrekturfaktorMittlereBelastungT32(verteilung: string, rohrnetztyp: string, auslegungsTemp: string, ßhd: number): number | null {
|
||||
const filteredData = datasetKorrekturfaktorVerteilungT32.filter(item =>
|
||||
item.verteilung === verteilung &&
|
||||
item.rohrnetztyp === rohrnetztyp &&
|
||||
item.auslegungsTemp === auslegungsTemp
|
||||
);
|
||||
|
||||
if (filteredData.length === 0) {
|
||||
const KorrekturfaktorMittlereBelastung = 1;
|
||||
return KorrekturfaktorMittlereBelastung;
|
||||
}
|
||||
|
||||
|
||||
const sortedData = filteredData.sort((a, b) => a.ßhd - b.ßhd);
|
||||
|
||||
for (let i = 0; i < sortedData.length - 1; i++) {
|
||||
const current = sortedData[i];
|
||||
const next = sortedData[i + 1];
|
||||
|
||||
if (ßhd >= current.ßhd && ßhd <= next.ßhd) {
|
||||
const t = (ßhd - current.ßhd) / (next.ßhd - current.ßhd);
|
||||
const KorrekturfaktorMittlereBelastung = current.fßd + t * (next.fßd - current.fßd);
|
||||
|
||||
return KorrekturfaktorMittlereBelastung;
|
||||
}
|
||||
}
|
||||
|
||||
const KorrekturfaktorMittlereBelastung = 1;
|
||||
return KorrekturfaktorMittlereBelastung;
|
||||
}
|
||||
|
||||
const result = funktionKorrekturfaktorMittlereBelastungT32("Verteilleitungen im beheizten Bereich", "IV (Strahlungs- und Luftheizung)", "35°C/28°C", 0.1);
|
||||
console.log(result);
|
||||
@@ -0,0 +1,22 @@
|
||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||
|
||||
export function funktionKorrekturfaktorTemperaturDifferenzWaermePumpeT90(suchSpalte: number, datenZeile: number) {
|
||||
|
||||
const dataBox = [
|
||||
{ SuchSpalte: [3], DatenSpalte: [1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918, 0.908, 0.898, 0.887, 0.877] },
|
||||
{ SuchSpalte: [4], DatenSpalte: [1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918, 0.908, 0.898, 0.887] },
|
||||
{ SuchSpalte: [5], DatenSpalte: [1.020, 1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918, 0.908, 0.898] },
|
||||
{ SuchSpalte: [6], DatenSpalte: [1.031, 1.020, 1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918, 0.908] },
|
||||
{ SuchSpalte: [7], DatenSpalte: [1.041, 1.031, 1.020, 1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928, 0.918] },
|
||||
{ SuchSpalte: [8], DatenSpalte: [1.051, 1.041, 1.031, 1.020, 1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939, 0.928] },
|
||||
{ SuchSpalte: [9], DatenSpalte: [1.061, 1.051, 1.041, 1.031, 1.020, 1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949, 0.939] },
|
||||
{ SuchSpalte: [10], DatenSpalte: [1.072, 1.061, 1.051, 1.041, 1.031, 1.020, 1.010, 1.000, 0.990, 0.980, 0.969, 0.959, 0.949] }
|
||||
];
|
||||
|
||||
const dataZeile = [ { DatenZeile: [3,4,5,6,7,8,9,10,11,12,13,14,15] } ];
|
||||
|
||||
const KorrekturfaktorTemperaturDifferenzWaermePumpe = funktionDoppelteInterpolation(suchSpalte, datenZeile, dataZeile, dataBox);
|
||||
|
||||
return KorrekturfaktorTemperaturDifferenzWaermePumpe;
|
||||
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
import { cubicSplineInterpolation } from "js-interpolate";
|
||||
|
||||
let wohneinheiten = 3;
|
||||
let WohnEinheiten = 3;
|
||||
|
||||
const datasetEinfamilienHausMittlereBelastung = {
|
||||
Januar: {
|
||||
@@ -15,7 +15,7 @@ const datasetEinfamilienHausMittlereBelastung = {
|
||||
90: [ 0.536, 0.532, 0.529, 0.522, 0.515, 0.512, 0.51, 0.51, 0.509 ],
|
||||
130: [ 0.54, 0.537, 0.533, 0.526, 0.52, 0.516, 0.515, 0.514, 0.513 ],
|
||||
},
|
||||
"März": {
|
||||
März: {
|
||||
50: [ 0.448, 0.445, 0.443, 0.437, 0.431, 0.427, 0.427, 0.426, 0.426 ],
|
||||
90: [ 0.453, 0.45, 0.447, 0.441, 0.436, 0.433, 0.431, 0.431, 0.43 ],
|
||||
130: [ 0.457, 0.454, 0.451, 0.445, 0.439, 0.435, 0.435, 0.434, 0.434 ],
|
||||
@@ -147,7 +147,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 funktionMonatlicherBelastungsgrad(heizlast: number, zeitkonstane: number, monat: keyof typeof dataset) {
|
||||
export function funktionMonatlicherBelastungsgradT9T11 (heizlast: number, zeitkonstane: number, monat: keyof typeof dataset) {
|
||||
const data = dataset[monat]
|
||||
|
||||
const interpolations: number[] = []
|
||||
@@ -0,0 +1,74 @@
|
||||
|
||||
// Interpolationsfunktion für Nennleistung des Wärmeerzeugers
|
||||
|
||||
interface DatasetNennleistung {
|
||||
flaeche: number[];
|
||||
Nennleistung: number[];
|
||||
}
|
||||
|
||||
interface DatasetNutzwaermeBedarf {
|
||||
NutzwaermeBedarf: number[];
|
||||
}
|
||||
|
||||
const datasetNennleistung: DatasetNennleistung[] = [
|
||||
{ flaeche: [50], Nennleistung: [7.5, 7.3, 7.1, 7, 6.8, 6.6, 6.4, 6.3, 6.1, 5.9, 5.7, 5.6, 5.4, 5.2, 5, 4.8] },
|
||||
{ flaeche: [100], Nennleistung: [12.1, 11.8, 11.6, 11.3, 11, 10.8, 10.5, 10.2, 9.9, 9.6, 9.3, 9, 8.7, 8.4, 8.1, 7.8] },
|
||||
{ flaeche: [150], Nennleistung: [16.1, 15.7, 15.4, 15, 14.6, 14.3, 13.9, 13.5, 13.1, 12.8, 12.4, 12, 11.6, 11.2, 10.8, 10.3] },
|
||||
{ flaeche: [200], Nennleistung: [19.7, 19.2, 18.8, 18.4, 17.9, 17.5, 17, 16.5, 16.1, 15.6, 15.1, 14.6, 14.2, 13.7, 13.1, 12.6] },
|
||||
{ flaeche: [300], Nennleistung: [26.1, 25.6, 25, 24.4, 23.8, 23.2, 22.6, 22, 21.4, 20.7, 20.1, 19.5, 18.8, 18.1, 17.5, 16.8] },
|
||||
{ flaeche: [400], Nennleistung: [32, 31.3, 30.5, 29.8, 29.1, 28.4, 27.6, 26.9, 26.1, 25.4, 24.6, 23.8, 23, 22.2, 21.4, 20.5] },
|
||||
{ flaeche: [500], Nennleistung: [37.4, 36.5, 35.7, 34.9, 34, 33.2, 32.3, 31.4, 30.5, 29.6, 28.7, 27.8, 26.9, 25.9, 25, 24] },
|
||||
{ flaeche: [600], Nennleistung: [42.4, 41.5, 40.6, 39.6, 38.7, 37.7, 36.7, 35.7, 34.7, 33.7, 32.7, 31.6, 30.5, 29.5, 28.4, 27.3] },
|
||||
{ flaeche: [700], Nennleistung: [47.3, 46.2, 45.2, 44.1, 43.1, 42, 40.9, 39.8, 38.7, 37.5, 36.4, 35.2, 34, 32.8, 31.6, 30.4] },
|
||||
{ flaeche: [800], Nennleistung: [51.9, 50.8, 49.6, 48.5, 47.3, 46.1, 44.9, 43.7, 42.4, 41.2, 39.9, 38.7, 37.4, 36, 34.7, 33.3] },
|
||||
{ flaeche: [900], Nennleistung: [56.4, 55.1, 53.9, 52.6, 51.3, 50.1, 48.7, 47.4, 46.1, 44.7, 43.4, 42, 40.6, 39.1, 37.7, 36.2] },
|
||||
{ flaeche: [1000], Nennleistung: [60.7, 59.4, 58, 56.6, 55.3, 53.9, 52.5, 51.1, 49.6, 48.2, 46.7, 45.2, 43.7, 42.1, 40.6, 39] },
|
||||
{ flaeche: [2000], Nennleistung: [98.6, 96.4, 94.2, 92, 89.8, 87.5, 85.3, 82.9, 80.6, 78.2, 75.8, 73.4, 71, 68.4, 65.9, 63.3] },
|
||||
{ flaeche: [3000], Nennleistung: [130.9, 128.1, 125.2, 122.2, 119.3, 116.3, 113.2, 110.2, 107.1, 103.9, 100.7, 97.5, 94.2, 90.9, 87.5, 84.1] },
|
||||
{ flaeche: [4000], Nennleistung: [160.2, 156.6, 153.1, 149.5, 145.9, 142.2, 138.5, 134.7, 130.9, 127.1, 123.2, 119.3, 115.3, 111.2, 107.1, 102.9] },
|
||||
{ flaeche: [5000], Nennleistung: [187.2, 183.1, 179, 174.8, 170.5, 166.2, 161.9, 157.5, 153.1, 148.6, 144, 139.4, 134.7, 130, 125.2, 120.3] }
|
||||
];
|
||||
|
||||
const datasetNutzwaermeBedarf: DatasetNutzwaermeBedarf[] = [
|
||||
{ NutzwaermeBedarf: [16, 15.5, 15, 14.5, 14, 13.5, 13, 12.5, 12, 11.5, 11, 10.5, 10, 9.5, 9, 8.5] }
|
||||
];
|
||||
|
||||
|
||||
export function funktionNennleistungWaermeerzeugerWarmwasserA14(flaeche: number, nutzwaermeBedarf: number): number {
|
||||
const findClosestDatasets = (flaeche: number) => {
|
||||
let lower = datasetNennleistung[0];
|
||||
let upper = datasetNennleistung[datasetNennleistung.length - 1];
|
||||
|
||||
for (let i = 0; i < datasetNennleistung.length - 1; i++) {
|
||||
if (datasetNennleistung[i].flaeche[0] <= flaeche && datasetNennleistung[i + 1].flaeche[0] >= flaeche) {
|
||||
lower = datasetNennleistung[i];
|
||||
upper = datasetNennleistung[i + 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { lower, upper };
|
||||
};
|
||||
|
||||
const interpolate = (x: number, x0: number, y0: number, x1: number, y1: number) => {
|
||||
return y0 + ((y1 - y0) * (x - x0)) / (x1 - x0);
|
||||
};
|
||||
|
||||
const { lower, upper } = findClosestDatasets(flaeche);
|
||||
const indexLower = datasetNutzwaermeBedarf[0].NutzwaermeBedarf.findIndex((value) => value <= nutzwaermeBedarf);
|
||||
const indexUpper = indexLower > 0 ? indexLower - 1 : indexLower;
|
||||
|
||||
const nennleistungLowerLower = lower.Nennleistung[indexLower];
|
||||
const nennleistungLowerUpper = lower.Nennleistung[indexUpper];
|
||||
const nennleistungUpperLower = upper.Nennleistung[indexLower];
|
||||
const nennleistungUpperUpper = upper.Nennleistung[indexUpper];
|
||||
|
||||
const interpolatedLower = interpolate(nutzwaermeBedarf, datasetNutzwaermeBedarf[0].NutzwaermeBedarf[indexUpper], nennleistungLowerUpper, datasetNutzwaermeBedarf[0].NutzwaermeBedarf[indexLower], nennleistungLowerLower);
|
||||
const interpolatedUpper = interpolate(nutzwaermeBedarf, datasetNutzwaermeBedarf[0].NutzwaermeBedarf[indexUpper], nennleistungUpperUpper, datasetNutzwaermeBedarf[0].NutzwaermeBedarf[indexLower], nennleistungUpperLower);
|
||||
|
||||
const NennleistungWaermeerzeugerWarmwasser = interpolate(flaeche, lower.flaeche[0], interpolatedLower, upper.flaeche[0], interpolatedUpper);
|
||||
|
||||
return NennleistungWaermeerzeugerWarmwasser;
|
||||
}
|
||||
|
||||
const result = funktionNennleistungWaermeerzeugerWarmwasserA14(154.2, 8.79);
|
||||
console.log(result);
|
||||
@@ -580,7 +580,7 @@ const dataset: DatasetEntry[] = [
|
||||
}
|
||||
];
|
||||
|
||||
export function funktionSolareBestrahlungsEnergie(neigung: number, orientierung: string): { [key: string]: number } | undefined {
|
||||
export function funktionSolareBestrahlungsEnergieT17(neigung: number, orientierung: string): { [key: string]: number } | undefined {
|
||||
const entry = dataset.find(item => item.neigung === neigung && item.orientierung.toLowerCase() === orientierung.toLowerCase());
|
||||
if (!entry) {
|
||||
return undefined;
|
||||
@@ -593,6 +593,6 @@ export function funktionSolareBestrahlungsEnergie(neigung: number, orientierung:
|
||||
|
||||
|
||||
// Beispielaufruf
|
||||
// const MonatsWerte = funktionSolareBestrahlungsEnergie(90, "West");
|
||||
// const MonatsWerte = funktionSolareBestrahlungsEnergieT17(90, "West");
|
||||
// console.log(MonatsWerte); // should return the monthly values for neigung=30 and orientierung="Süd"
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { funktionMonatlicherBelastungsgrad } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgrad.js";
|
||||
import { funktionBilanzInnentemperatur } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionBilanzInnentemperatur.js";
|
||||
import { funktionMonatlicherBelastungsgradT9T11 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionMonatlicherBelastungsgradT9T11.js";
|
||||
import { funktionBilanzInnentemperaturT8T10 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionBilanzInnentemperaturT8T10.js";
|
||||
import { A5BerechnungWaermeTransferMaxStroemeBauteile } from "#lib/Berechnungen/BedarfsausweisWohnen/A5BerechnungWaermeTransferMaxStroemeBauteile.js";
|
||||
import { A6BerechnungWaermeTransferMaxStroemeLueftungGesamt } from "#lib/Berechnungen/BedarfsausweisWohnen/A6BerechnungWaermeTransferMaxStroemeLueftungGesamt.js";
|
||||
|
||||
export function funktionWaermesenken() {
|
||||
export function funktionWaermesenkenA8A12() {
|
||||
|
||||
const resultBauteile = A5BerechnungWaermeTransferMaxStroemeBauteile();
|
||||
const minimaleAussentemperatur = resultBauteile.minimaleAussentemperatur;
|
||||
@@ -61,31 +61,31 @@ export function funktionWaermesenken() {
|
||||
};
|
||||
|
||||
|
||||
belastungsgrade.Januar = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "Januar");
|
||||
belastungsgrade.Februar = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "Februar");
|
||||
belastungsgrade.März = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "März");
|
||||
belastungsgrade.April = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "April");
|
||||
belastungsgrade.Mai = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "Mai");
|
||||
belastungsgrade.Juni = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "Juni");
|
||||
belastungsgrade.Juli = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "Juli");
|
||||
belastungsgrade.August = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "August");
|
||||
belastungsgrade.September = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "September");
|
||||
belastungsgrade.Oktober = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "Oktober");
|
||||
belastungsgrade.November = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "November");
|
||||
belastungsgrade.Dezember = funktionMonatlicherBelastungsgrad(FlaechgenbezogeneHeizlast, ZeitKonstante, "Dezember");
|
||||
belastungsgrade.Januar = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "Januar");
|
||||
belastungsgrade.Februar = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "Februar");
|
||||
belastungsgrade.März = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "März");
|
||||
belastungsgrade.April = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "April");
|
||||
belastungsgrade.Mai = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "Mai");
|
||||
belastungsgrade.Juni = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "Juni");
|
||||
belastungsgrade.Juli = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "Juli");
|
||||
belastungsgrade.August = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "August");
|
||||
belastungsgrade.September = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "September");
|
||||
belastungsgrade.Oktober = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "Oktober");
|
||||
belastungsgrade.November = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "November");
|
||||
belastungsgrade.Dezember = funktionMonatlicherBelastungsgradT9T11(FlaechgenbezogeneHeizlast, ZeitKonstante, "Dezember");
|
||||
|
||||
bilanzInnenTemperaturen.Januar = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "Januar");
|
||||
bilanzInnenTemperaturen.Februar = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "Februar");
|
||||
bilanzInnenTemperaturen.März = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "März");
|
||||
bilanzInnenTemperaturen.April = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "April");
|
||||
bilanzInnenTemperaturen.Mai = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "Mai");
|
||||
bilanzInnenTemperaturen.Juni = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "Juni");
|
||||
bilanzInnenTemperaturen.Juli = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "Juli");
|
||||
bilanzInnenTemperaturen.August = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "August");
|
||||
bilanzInnenTemperaturen.September = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "September");
|
||||
bilanzInnenTemperaturen.Oktober = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "Oktober");
|
||||
bilanzInnenTemperaturen.November = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "November");
|
||||
bilanzInnenTemperaturen.Dezember = funktionBilanzInnentemperatur(FlaechgenbezogeneHeizlast, ZeitKonstante, "Dezember");
|
||||
bilanzInnenTemperaturen.Januar = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "Januar");
|
||||
bilanzInnenTemperaturen.Februar = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "Februar");
|
||||
bilanzInnenTemperaturen.März = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "März");
|
||||
bilanzInnenTemperaturen.April = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "April");
|
||||
bilanzInnenTemperaturen.Mai = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "Mai");
|
||||
bilanzInnenTemperaturen.Juni = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "Juni");
|
||||
bilanzInnenTemperaturen.Juli = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "Juli");
|
||||
bilanzInnenTemperaturen.August = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "August");
|
||||
bilanzInnenTemperaturen.September = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "September");
|
||||
bilanzInnenTemperaturen.Oktober = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "Oktober");
|
||||
bilanzInnenTemperaturen.November = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "November");
|
||||
bilanzInnenTemperaturen.Dezember = funktionBilanzInnentemperaturT8T10(FlaechgenbezogeneHeizlast, ZeitKonstante, "Dezember");
|
||||
|
||||
waermeSenken.Januar = maximalerWaermestromGesamt * (bilanzInnenTemperaturen.Januar - minimaleAussentemperatur) / (innenTemperatur - minimaleAussentemperatur) * belastungsgrade.Januar;
|
||||
waermeSenken.Februar = maximalerWaermestromGesamt * (bilanzInnenTemperaturen.Februar - minimaleAussentemperatur) / (innenTemperatur - minimaleAussentemperatur) * belastungsgrade.Februar;
|
||||
@@ -0,0 +1,281 @@
|
||||
import { AufnahmeClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
|
||||
import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
|
||||
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js";
|
||||
import moment from "moment";
|
||||
import bauwerkskatalog from "./bauwerkskatalog.json" assert { type: "json" }
|
||||
|
||||
function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient) {
|
||||
let tekWerte = new Array(8).fill(0);
|
||||
|
||||
if (aufnahme.gebaeudetyp && aufnahme.gebaeudetyp in bauwerkskatalog){
|
||||
tekWerte = bauwerkskatalog[aufnahme.gebaeudetyp as keyof typeof bauwerkskatalog];
|
||||
}
|
||||
|
||||
if (!tekWerte) {
|
||||
return [0,0];
|
||||
}
|
||||
|
||||
let faktorWarmwasser = 1;
|
||||
if (ausweis.stromverbrauch_enthaelt_warmwasser) {
|
||||
faktorWarmwasser = 0.9;
|
||||
}
|
||||
|
||||
let faktorHeizung = 0;
|
||||
if (aufnahme.nutzflaeche && aufnahme.nutzflaeche <= 500) {
|
||||
faktorHeizung = 1.46;
|
||||
} else if (aufnahme.nutzflaeche && aufnahme.nutzflaeche > 500 && aufnahme.nutzflaeche <= 50000) {
|
||||
faktorHeizung = 4.53 * (aufnahme.nutzflaeche ** -0.215) + 0.27;
|
||||
} else {
|
||||
faktorHeizung = 0.71;
|
||||
}
|
||||
|
||||
let tekHeizung = tekWerte[0] * faktorHeizung;
|
||||
let tekWarmwasser = tekWerte[1] * faktorWarmwasser;
|
||||
let tekLueftung = ausweis.stromverbrauch_enthaelt_lueftung ? tekWerte[2] : 0;
|
||||
|
||||
let tekEingebauteBeleuchtung = ausweis.stromverbrauch_enthaelt_beleuchtung ? tekWerte[3] : 0;
|
||||
let tekKaelte = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[4] : 0;
|
||||
|
||||
let tekHilfsenergieKuehlung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[5] : 0;
|
||||
let tekBeEntfeuchtung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[6] : 0;
|
||||
|
||||
// TODO: let tekAufzug = ausweis.nwaufzug ? 2 : 0;
|
||||
let tekAufzug = 0;
|
||||
|
||||
let tekSonstiges = (ausweis.stromverbrauch_enthaelt_sonstige != null && ausweis.stromverbrauch_enthaelt_sonstige.length > 0) ? tekWerte[7] : 0;
|
||||
|
||||
let vergleichsWertWaerme = tekHeizung + tekKaelte + tekBeEntfeuchtung;
|
||||
let vergleichsWertStrom = tekWarmwasser + tekLueftung + tekEingebauteBeleuchtung + tekHilfsenergieKuehlung + tekAufzug + tekSonstiges;
|
||||
|
||||
return [vergleichsWertWaerme, vergleichsWertStrom];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt einen array bestehend aus
|
||||
* [0]: Endenergieverbrauch
|
||||
* [1]: Primärenergiebedarf
|
||||
* zurück.
|
||||
*
|
||||
* @param Ausweis ausweis Ein Ausweis dessen Energiebedarf berechnet werden soll
|
||||
* @return VerbrauchsausweisGewerbeCalculationResult
|
||||
*/
|
||||
export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient) {
|
||||
if (!aufnahme || !objekt || !ausweis) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const nutzflaeche = aufnahme.nutzflaeche || 0;
|
||||
|
||||
let startdatum = moment(ausweis.startdatum);
|
||||
|
||||
let klimafaktoren: Awaited<ReturnType<typeof getKlimafaktoren>> = [{
|
||||
month: startdatum.month(),
|
||||
year: startdatum.year(),
|
||||
klimafaktor: 1
|
||||
},
|
||||
{
|
||||
month: startdatum.month(),
|
||||
year: startdatum.year() + 1,
|
||||
klimafaktor: 1
|
||||
},
|
||||
{
|
||||
month: startdatum.month(),
|
||||
year: startdatum.year() + 2,
|
||||
klimafaktor: 1
|
||||
}];
|
||||
|
||||
try {
|
||||
const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz)
|
||||
|
||||
if (response) {
|
||||
klimafaktoren = response
|
||||
}
|
||||
} catch (e) {
|
||||
// TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück.
|
||||
// Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung.
|
||||
// return null
|
||||
}
|
||||
|
||||
// Endenergieverbrauch
|
||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
||||
let umrechnungsfaktor = 1, primaerfaktor = 1, coe = 1;
|
||||
let umrechnungsfaktor_1 = 1, primaerfaktor_1 = 1, coe_1 = 1;
|
||||
if (ausweis.brennstoff_1 && ausweis.einheit_1) {
|
||||
let result = getHeizwertfaktor(ausweis.brennstoff_1, ausweis.einheit_1);
|
||||
umrechnungsfaktor = result.umrechnungsfaktor
|
||||
primaerfaktor = result.primaerenergiefaktor
|
||||
coe = result.coe
|
||||
}
|
||||
|
||||
if (ausweis.brennstoff_2 && ausweis.einheit_2) {
|
||||
let result = getHeizwertfaktor(ausweis.brennstoff_2, ausweis.einheit_2);
|
||||
umrechnungsfaktor_1 = result.umrechnungsfaktor
|
||||
primaerfaktor_1 = result.primaerenergiefaktor
|
||||
coe_1 = result.coe
|
||||
}
|
||||
|
||||
let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * umrechnungsfaktor;
|
||||
let energieVerbrauchGesamt_2 = ((ausweis.verbrauch_4 || 0) + (ausweis.verbrauch_5 || 0) + (ausweis.verbrauch_6 || 0)) * umrechnungsfaktor_1;
|
||||
|
||||
let energieVerbrauchWarmwasser_1 = 0;
|
||||
let energieVerbrauchWarmwasser_2 = 0;
|
||||
|
||||
if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0) {
|
||||
|
||||
// Wenn Warmwasser enthalten und Anteil bekannt
|
||||
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100);
|
||||
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
||||
|
||||
} else if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 == 0){
|
||||
if (aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre)" || aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung" || aufnahme.gebaeudetyp == "Schwimmhallen") {
|
||||
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5;
|
||||
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
||||
|
||||
} else {
|
||||
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.05;
|
||||
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
||||
|
||||
}
|
||||
} else
|
||||
{
|
||||
energieVerbrauchWarmwasser_1 = 0;
|
||||
energieVerbrauchWarmwasser_2 = 0;
|
||||
}
|
||||
|
||||
let kuehlungsZuschlag_1: number;
|
||||
let kuehlungsZuschlag_2: number;
|
||||
if (ausweis.wird_gekuehlt) {
|
||||
kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100);
|
||||
kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100);
|
||||
} else {
|
||||
kuehlungsZuschlag_1 = kuehlungsZuschlag_2 = 0;
|
||||
}
|
||||
|
||||
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
|
||||
let leerstand = (aufnahme.leerstand || 0) / 100;
|
||||
|
||||
let energieVerbrauchHeizung_1 = energieVerbrauchGesamt_1 - energieVerbrauchWarmwasser_1 - kuehlungsZuschlag_1;
|
||||
let energieVerbrauchHeizung_2 = energieVerbrauchGesamt_2 - energieVerbrauchWarmwasser_2 - kuehlungsZuschlag_2;
|
||||
|
||||
let durchschnittsKlimafaktor = klimafaktoren.reduce((acc, c) => acc + c.klimafaktor, 0) / klimafaktoren.length;
|
||||
|
||||
let energieVerbrauchHeizungBereinigt_1 = energieVerbrauchHeizung_1 * durchschnittsKlimafaktor;
|
||||
let energieVerbrauchHeizungBereinigt_2 = energieVerbrauchHeizung_2 * durchschnittsKlimafaktor;
|
||||
|
||||
let durchschnittsEnergieVerbrauchHeizungBereingt = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2) / (3 * nutzflaeche);
|
||||
|
||||
let faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = -0.0028 * durchschnittsEnergieVerbrauchHeizungBereingt + 0.9147;
|
||||
|
||||
if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt <= 0.25) {
|
||||
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 0.25;
|
||||
} else if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt >= 1.0) {
|
||||
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 1.0;
|
||||
}
|
||||
|
||||
let leerstandsZuschlagHeizung = faktorDurchschnittsEnergieVerbrauchHeizungBereinigt * leerstand * (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2);
|
||||
let leerstandsZuschlagWarmwasser = leerstand * (energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2);
|
||||
let leerstandsZuschlagKuehlung = leerstand * (kuehlungsZuschlag_1 + kuehlungsZuschlag_2);
|
||||
|
||||
|
||||
let endEnergieVerbrauch_1 = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchWarmwasser_1 + kuehlungsZuschlag_1) / (3 * nutzflaeche);
|
||||
let endEnergieVerbrauch_2 = (energieVerbrauchHeizungBereinigt_2 + energieVerbrauchWarmwasser_2 + kuehlungsZuschlag_2) / (3 * nutzflaeche);
|
||||
|
||||
let energieVerbrauchStrom = ausweis.strom_1 + ausweis.strom_2 + ausweis.strom_3;
|
||||
let leerstandsZuschlagStrom = leerstand * energieVerbrauchStrom;
|
||||
|
||||
let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom) / (3 * nutzflaeche);
|
||||
let primaerEnergieVerbrauchStrom = endEnergieVerbrauchStrom * 1.8;
|
||||
|
||||
let co2EmissionenStrom = endEnergieVerbrauchStrom * 0.560;
|
||||
|
||||
let endEnergieVerbrauchLeerstandsZuschlag = (leerstandsZuschlagHeizung + leerstandsZuschlagWarmwasser + leerstandsZuschlagKuehlung) / (3 * nutzflaeche);
|
||||
let endEnergieVerbrauchKuehlungsZuschlag_1 = kuehlungsZuschlag_1 / (3 * nutzflaeche);
|
||||
let endEnergieVerbrauchKuehlungsZuschlag_2 = kuehlungsZuschlag_2 / (3 * nutzflaeche);
|
||||
|
||||
let primaerEnergieVerbrauch_1 = endEnergieVerbrauch_1 * primaerfaktor;
|
||||
let primaerEnergieVerbrauch_2 = endEnergieVerbrauch_2 * primaerfaktor_1;
|
||||
|
||||
let primaerEnergieVerbrauchLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * primaerfaktor;
|
||||
let primaerEnergieVerbrauchKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * primaerfaktor;
|
||||
let primaerEnergieVerbrauchKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * primaerfaktor_1;
|
||||
|
||||
let co2Emissionen_1 = endEnergieVerbrauch_1 * coe;
|
||||
let co2Emissionen_2 = endEnergieVerbrauch_2 * coe_1;
|
||||
|
||||
let co2EmissionenLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * coe;
|
||||
let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * coe;
|
||||
let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * coe_1;
|
||||
|
||||
let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag;
|
||||
let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom;
|
||||
let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom;
|
||||
|
||||
let [vergleichsWertWaerme, vergleichsWertStrom] = vergleichsWertNichtWohngebaeude(ausweis, aufnahme);
|
||||
|
||||
// Return all the steps that this function includes for debugging as a json object
|
||||
return {
|
||||
umrechnungsfaktor : umrechnungsfaktor,
|
||||
primaerfaktor : primaerfaktor,
|
||||
coe : coe,
|
||||
umrechnungsfaktor_1 : umrechnungsfaktor_1,
|
||||
primaerfaktor_1 : primaerfaktor_1,
|
||||
coe_1 : coe_1,
|
||||
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
|
||||
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
|
||||
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor,2),
|
||||
Klimafaktor_1 : klimafaktoren[0],
|
||||
Klimafaktor_2 : klimafaktoren[1],
|
||||
Klimafaktor_3 : klimafaktoren[2],
|
||||
anteil_heizung_1: 1 - ((ausweis.anteil_warmwasser_1 || 0) / 100),
|
||||
anteil_heizung_2: 1 - ((ausweis.anteil_warmwasser_2 || 0) / 100),
|
||||
verbrauch_1_kwh: ausweis.verbrauch_1 * umrechnungsfaktor,
|
||||
verbrauch_2_kwh: ausweis.verbrauch_2 * umrechnungsfaktor,
|
||||
verbrauch_3_kwh: ausweis.verbrauch_3 * umrechnungsfaktor,
|
||||
verbrauch_4_kwh: ausweis.verbrauch_4 * umrechnungsfaktor_1,
|
||||
verbrauch_5_kwh: ausweis.verbrauch_5 * umrechnungsfaktor_1,
|
||||
verbrauch_6_kwh: ausweis.verbrauch_6 * umrechnungsfaktor_1,
|
||||
klimafaktoren : klimafaktoren,
|
||||
nutzflaeche : Math.round(nutzflaeche),
|
||||
leerstand : leerstand,
|
||||
leerstandsZuschlagHeizung: Math.round(leerstandsZuschlagHeizung),
|
||||
leerstandsZuschlagWarmwasser: Math.round(leerstandsZuschlagWarmwasser),
|
||||
leerstandsZuschlagKuehlung: Math.round(leerstandsZuschlagKuehlung),
|
||||
endEnergieVerbrauchLeerstandsZuschlag: Math.round(endEnergieVerbrauchLeerstandsZuschlag),
|
||||
endEnergieVerbrauchKuehlungsZuschlag_1: Math.round(endEnergieVerbrauchKuehlungsZuschlag_1),
|
||||
endEnergieVerbrauchKuehlungsZuschlag_2: Math.round(endEnergieVerbrauchKuehlungsZuschlag_2),
|
||||
coeeffkg : co2EmissionenGesamt,
|
||||
energieVerbrauchGesamt_1: Math.round(energieVerbrauchGesamt_1),
|
||||
energieVerbrauchGesamt_2: Math.round(energieVerbrauchGesamt_2),
|
||||
energieVerbrauchWarmwasser_1: Math.round(energieVerbrauchWarmwasser_1),
|
||||
energieVerbrauchWarmwasser_2: Math.round(energieVerbrauchWarmwasser_2),
|
||||
energieVerbrauchHeizung_1: energieVerbrauchHeizung_1,
|
||||
energieVerbrauchHeizung_2: energieVerbrauchHeizung_2,
|
||||
anteil_warmwasser_1: ausweis.anteil_warmwasser_1 / 100,
|
||||
anteil_warmwasser_2: ausweis.anteil_warmwasser_2 / 100,
|
||||
energieVerbrauchHeizungBereinigt_1: Math.round(energieVerbrauchHeizungBereinigt_1),
|
||||
energieVerbrauchHeizungBereinigt_2: Math.round(energieVerbrauchHeizungBereinigt_2),
|
||||
durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(durchschnittsEnergieVerbrauchHeizungBereingt),
|
||||
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(faktorDurchschnittsEnergieVerbrauchHeizungBereinigt,3),
|
||||
endEnergieVerbrauch_1: Math.round(endEnergieVerbrauch_1),
|
||||
endEnergieVerbrauch_2: Math.round(endEnergieVerbrauch_2),
|
||||
energieVerbrauchStrom: energieVerbrauchStrom,
|
||||
leerstandsZuschlagStrom: leerstandsZuschlagStrom,
|
||||
endEnergieVerbrauchStrom: Math.round(endEnergieVerbrauchStrom),
|
||||
primaerEnergieVerbrauchStrom: Math.round(primaerEnergieVerbrauchStrom),
|
||||
primaerEnergieVerbrauch_1: Math.round(primaerEnergieVerbrauch_1),
|
||||
primaerEnergieVerbrauch_2: Math.round(primaerEnergieVerbrauch_2),
|
||||
primaerEnergieVerbrauchLeerstandsZuschlag: Math.round(primaerEnergieVerbrauchLeerstandsZuschlag),
|
||||
primaerEnergieVerbrauchKuehlungsZuschlag_1: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_1),
|
||||
primaerEnergieVerbrauchKuehlungsZuschlag_2: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_2),
|
||||
co2Emissionen_1: co2Emissionen_1,
|
||||
co2Emissionen_2: co2Emissionen_2,
|
||||
co2EmissionenLeerstandsZuschlag: co2EmissionenLeerstandsZuschlag,
|
||||
co2EmissionenKuehlungsZuschlag_1: co2EmissionenKuehlungsZuschlag_1,
|
||||
co2EmissionenKuehlungsZuschlag_2: co2EmissionenKuehlungsZuschlag_2,
|
||||
co2EmissionenGesamt: Math.round(co2EmissionenGesamt),
|
||||
endEnergieVerbrauchGesamt: Math.round(endEnergieVerbrauchGesamt),
|
||||
primaerEnergieVerbrauchGesamt: Math.round(primaerEnergieVerbrauchGesamt),
|
||||
vergleichsWertWaerme: vergleichsWertWaerme,
|
||||
vergleichsWertStrom: vergleichsWertStrom,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Verwaltungsgebäude (allgemein)": [48.5, 6.9, 3.2, 10.7, 2.6, 3.1, 0.1, 2.8],
|
||||
"Parlaments- und Gerichtsgebäude": [49.9, 6.8, 3, 9.5, 1.2, 0.9, 1.7, 0.6],
|
||||
"Ministerien u. Ämter u. Behörden": [48.3, 7.4, 3.7, 10.8, 1.5, 1.2, 1, 0.7],
|
||||
"Polizeidienstgebäude": [52.4, 7.4, 2.5, 10.4, 0.5, 0.4, 0, 0.7],
|
||||
"Gebäude für öffentliche Bereitschaftsdienste": [51.6, 10.2, 3, 7.8, 0.3, 0.2, 0, 4],
|
||||
"Feuerwehrdienstgebäude": [50.8, 7.1, 3.2, 6.7, 0.3, 0.2, 0, 3.7],
|
||||
"Bürogebäude": [49, 8.1, 4.7, 12.9, 2.9, 2.2, 0, 2.8],
|
||||
"Bürogebäude - überwiegend Großraumbüros": [47.4, 12.8, 7.3, 16.6, 6, 4.3, 0, 0.9],
|
||||
"Bankgebäude": [48, 6.4, 1.6, 10.7, 1.5, 1.1, 0, 0.6],
|
||||
"Hochschule und Forschung (allgemein)": [66.5, 6.7, 13.3, 11, 3.4, 2.2, 3.8, 1.2],
|
||||
"Gebäude für Lehre": [57.2, 5.6, 8.7, 8.5, 2.5, 1.5, 0.4, 1.1],
|
||||
"Institute für Lehre und Forschung": [65, 7.6, 13.8, 11.7, 3.5, 2.4, 14.7, 2.1],
|
||||
"Gebäude für Forschung ohne Lehre": [87.8, 7.4, 14.9, 14.8, 3.5, 2.4, 0, 1.2],
|
||||
"Laborgebäude": [82.8, 8, 20.3, 13.5, 4.2, 2.9, 1.7, 1.3],
|
||||
"Gesundheitswesen (allgemein)": [55.7, 15.3, 4.9, 17.4, 1.6, 1.3, 0, 1.1],
|
||||
"Krankenhäuser (ohne Forschung und Lehre)": [64.1, 40.8, 10.4, 15.8, 1.7, 1.6, 0, 1.2],
|
||||
"Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung": [61.7, 33.6, 9.2, 15.9, 1.7, 1.6, 0, 0.9],
|
||||
"Medizinische Einrichtungen für nicht stationäre Versorgung": [51.2, 8.6, 2.2, 18.3, 1.4, 1, 0, 1.3],
|
||||
"Gebäude für Reha": [null, 59.4, 22.1, 6, 14.6, 0.9, 0.7, 0, 3.5],
|
||||
"Bildungseinrichtungen (allgemein)": [49.7, 19.5, 4.1, 5.5, 0.2, 0.2, 0, 0.6],
|
||||
"Schulen": [49.3, 22.4, 3.9, 5.5, 0.3, 0.2, 0, 0.6],
|
||||
"Kinderbetreuungseinrichtungen": [50.4, 17.3, 4.2, 5.5, 0.1, 0.1, 0, 0.6],
|
||||
"Kultureinrichtungen (allgemein)": [55.9, 7.5, 6.7, 9, 1.6, 1.2, 0.1, 0.3],
|
||||
"Bibliotheken/Archive": [49, 5, 2.1, 14.3, 0.5, 0.4, 0, 0.3],
|
||||
"Ausstellungsgebäude": [57.6, 7.7, 6.3, 7.8, 1.7, 1.3, 0.3, 0.2],
|
||||
"Veranstaltungsgebäude": [58.4, 9.1, 7, 8.9, 1.3, 0.9, 0.1, 0.3],
|
||||
"Gemeinschafts-/Gemeindehäuser": [63.6, 10, 5.6, 10.8, 0.8, 0.6, 0.1, 6],
|
||||
"Opern/Theater": [58.8, 7.6, 9.1, 8.6, 2, 1.3, 0, 0.9],
|
||||
"Sporteinrichtungen (allgemein)": [65.5, 27.3, 6.4, 14.5, 0.6, 0.6, 0, 1.9],
|
||||
"Sporthallen": [68.6, 22, 4.6, 14.3, 0.2, 0.2, 0, 0.1],
|
||||
"Fitnessstudios": [60.6, 62.2, 11.9, 24.5, 4, 4.2, 0, 8.9],
|
||||
"Schwimmhallen": [63.8, 24.7, 8.3, 13.4, 1.1, 1.1, 30, 7.3],
|
||||
"Gebäude für Sportaußenanlagen": [75.2, 22.5, 5.7, 10.2, 0, 0, 0, 5.5],
|
||||
"Verpflegungseinrichtungen (allgemein)": [75.9, 77.7, 16.6, 18.1, 3.5, 3, 0, 24.8],
|
||||
"Beherbergungsstätten (allgemein)": [52.1, 86, 9.1, 9.1, 3.3, 2.7, 0, 7],
|
||||
"Hotels/Pensionen": [51.2, 89.1, 9.1, 8.6, 3.5, 2.9, 0, 6.8],
|
||||
"Jugendherbergen u. Ferienhäuser": [63.4, 50.9, 1.9, 12.6, 0, 0, 0, 8.8],
|
||||
"Gaststätten": [77.8, 79, 13.7, 19.7, 3.8, 3.3, 0, 25.2],
|
||||
"Mensen u. Kantinen": [67, 67.3, 21, 11.4, 0.7, 0.5, 0, 22.7],
|
||||
"Gewerbliche und industrielle Gebäude (allgemein)": [38.7, 12.6, 2.1, 9.6, 0.8, 0.5, 0, 12.2],
|
||||
"Gewerbliche und industrielle Gebäude - schwere Arbeit": [null, 37.8, 20, 3.1, 11.8, 1, 0.6, 0, 22.6],
|
||||
"Gewerbliche und industrielle Gebäude - Mischung aus leichter u. schwerer Arbeit": [36, 24.2, 3.8, 13, 2.1, 1.2, 0, 24.9],
|
||||
"Gewerbliche und industrielle Gebäude - leichte Arbeit": [null, 38.1, 19.8, 3.3, 15.2, 1.9, 1.1, 0, 22.3],
|
||||
"Gebäude für Lagerung": [38.1, 19.3, 3.3, 13.2, 1.7, 1, 0, 21.6],
|
||||
"Verkaufsstätten (allgemein)": [47.9, 7.6, 5.6, 16.3, 2.6, 2, 0, 6.9],
|
||||
"Kaufhäuser": [45.9, 6.4, 6, 16.6, 1.1, 0.9, 0, 2.7],
|
||||
"Kaufhauszentren/Einkaufszentren": [47.3, 11.1, 7.4, 16.6, 4.6, 3.5, 0.1, 5.5],
|
||||
"Märkte": [48.7, 6.2, 7.3, 17.3, 2.8, 2.1, 0, 10.5],
|
||||
"Märkte mit sehr hohem Anteil von Kühlung für Lebensmittel": [48.7, 6.2, 7.3, 17.3, 2.8, 2.1, 0, 72.5],
|
||||
"Läden": [46.8, 6.4, 1.9, 15.8, 0.9, 0.7, 0, 2.1],
|
||||
"Läden mit sehr hohem Anteil von Kühlung für Lebensmittel": [46.8, 6.4, 1.9, 15.8, 0.9, 0.7, 0, 54.1],
|
||||
"Fernmeldetechnik": [38.4, 4, 3.4, 16, 0, 0, 0, 53.7]
|
||||
}
|
||||
@@ -1,33 +1,32 @@
|
||||
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
|
||||
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import moment from "moment";
|
||||
|
||||
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016(
|
||||
ausweis: VerbrauchsausweisWohnenClient
|
||||
ausweis: VerbrauchsausweisWohnenClient,
|
||||
aufnahme: AufnahmeClient
|
||||
): number {
|
||||
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.aufnahme.keller == Enums.Heizungsstatus.BEHEIZT && (ausweis.aufnahme.einheiten || 1) <= 2) {
|
||||
if (aufnahme.keller == Enums.Heizungsstatus.BEHEIZT && (aufnahme.einheiten || 1) <= 2) {
|
||||
faktorKeller = 1.35;
|
||||
}
|
||||
|
||||
if ((ausweis.aufnahme.nutzflaeche || 0) > 0) {
|
||||
return ausweis.aufnahme.nutzflaeche || 0;
|
||||
if ((aufnahme.nutzflaeche || 0) > 0) {
|
||||
return aufnahme.nutzflaeche || 0;
|
||||
} else {
|
||||
return (ausweis.aufnahme.flaeche || 0) * faktorKeller;
|
||||
return (aufnahme.flaeche || 0) * faktorKeller;
|
||||
}
|
||||
}
|
||||
|
||||
export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
||||
ausweis: VerbrauchsausweisWohnenClient
|
||||
ausweis: VerbrauchsausweisWohnenClient,
|
||||
aufnahme: AufnahmeClient,
|
||||
objekt: ObjektClient
|
||||
) {
|
||||
if (!ausweis.aufnahme || !ausweis.aufnahme.objekt) {
|
||||
if (!aufnahme || !objekt || !ausweis) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -50,7 +49,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
||||
}];
|
||||
|
||||
try {
|
||||
const response = await getKlimafaktoren(ausweis.startdatum, ausweis.aufnahme.objekt.plz)
|
||||
const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz)
|
||||
|
||||
if (response) {
|
||||
klimafaktoren = response
|
||||
@@ -65,16 +64,16 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
||||
// Endenergieverbrauch
|
||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
||||
let brennstoff_1 = getHeizwertfaktor(
|
||||
ausweis.aufnahme.brennstoff_1 as string,
|
||||
aufnahme.brennstoff_1 as string,
|
||||
ausweis.einheit_1 as string
|
||||
);
|
||||
let brennstoff_2 = getHeizwertfaktor(
|
||||
ausweis.aufnahme.brennstoff_2 as string,
|
||||
aufnahme.brennstoff_2 as string,
|
||||
ausweis.einheit_2 as string
|
||||
);
|
||||
|
||||
const energetischeNutzflaeche =
|
||||
energetischeNutzflaecheVerbrauchsausweisWohnen_2016(ausweis);
|
||||
energetischeNutzflaecheVerbrauchsausweisWohnen_2016(ausweis, aufnahme);
|
||||
|
||||
let energieVerbrauchGesamt_1 =
|
||||
((ausweis.verbrauch_1 || 0) +
|
||||
@@ -91,10 +90,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.aufnahme.leerstand || 0) / 100;
|
||||
let leerstand = (aufnahme.leerstand || 0) / 100;
|
||||
|
||||
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
|
||||
if (ausweis.aufnahme.solarsystem_warmwasser) {
|
||||
if (aufnahme.solarsystem_warmwasser) {
|
||||
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
|
||||
energieVerbrauchWarmwasser_1 =
|
||||
energieVerbrauchGesamt_1 *
|
||||
@@ -117,7 +116,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
||||
leerstand *
|
||||
(energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2);
|
||||
} else {
|
||||
if (ausweis.aufnahme.solarsystem_warmwasser) {
|
||||
if (aufnahme.solarsystem_warmwasser) {
|
||||
// Wenn Warmwasser Anteil unbekannt und Solarsystem
|
||||
energieVerbrauchWarmwasser_1 = energetischeNutzflaeche * 12 * 3;
|
||||
energieVerbrauchWarmwasser_2 = 0;
|
||||
@@ -189,7 +188,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
||||
let primaerfaktorww = 0;
|
||||
let primaerfaktorww_1 = 0;
|
||||
|
||||
if (!ausweis.warmwasser_enthalten && ausweis.aufnahme.durchlauf_erhitzer) {
|
||||
if (!ausweis.warmwasser_enthalten && aufnahme.durchlauf_erhitzer) {
|
||||
primaerfaktorww = 1.8;
|
||||
primaerfaktorww_1 = 1.8;
|
||||
} else {
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import type { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database/client";
|
||||
import type { VerbrauchsausweisWohnen } from "@ibcornelsen/database/client";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
||||
import { AufnahmeClient, ObjektClient } from "#components/Ausweis/types.js";
|
||||
|
||||
export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen & { objekt: GebaeudeStammdaten }): Promise<number> {
|
||||
const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis);
|
||||
export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen, aufnahme: AufnahmeClient, objekt: ObjektClient): Promise<number> {
|
||||
const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
|
||||
if (!result) {
|
||||
return 0;
|
||||
|
||||
@@ -1,34 +1,36 @@
|
||||
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import moment from "moment";
|
||||
|
||||
export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient): {
|
||||
export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient): {
|
||||
title: string,
|
||||
description: string,
|
||||
anlagenteil: string
|
||||
anlagenteil: string,
|
||||
amortisationszeit: string,
|
||||
kosten: string
|
||||
}[] {
|
||||
let Warmwasserrohre_gedaemmt = ausweis.aufnahme.warmwasser_rohre_gedaemmt;
|
||||
let Heizungsrohre_gedaemmt = ausweis.aufnahme.heizungsrohre_gedaemmt;
|
||||
let Waermepumpe = ausweis.aufnahme.waermepumpe;
|
||||
let Kellerwand_gedaemmt = ausweis.aufnahme.keller_wand_gedaemmt;
|
||||
let Keller = ausweis.aufnahme.keller;
|
||||
let Kellerdecke_Kalraeume_gedaemmt = ausweis.aufnahme.keller_decke_gedaemmt;
|
||||
let Brennwertkessel = ausweis.aufnahme.brennwert_kessel;
|
||||
let baujahr_anlagesanlage = ausweis.aufnahme.baujahr_heizung[0];
|
||||
let Zentralheizung = ausweis.aufnahme.zentralheizung;
|
||||
let photovoltaik = ausweis.aufnahme.photovoltaik;
|
||||
let Brennstoff = ausweis.aufnahme.brennstoff_1;
|
||||
let Aussenwand_gedaemmt = ausweis.aufnahme.aussenwand_gedaemmt;
|
||||
let Dachgeschoss = ausweis.aufnahme.dachgeschoss;
|
||||
let Dachgeschoss_gedaemmt = ausweis.aufnahme.dachgeschoss_gedaemmt;
|
||||
let Oberste_Geschossdecke_gedaemmt = ausweis.aufnahme.oberste_geschossdecke_gedaemmt;
|
||||
let Einfachglas = ausweis.aufnahme.einfach_verglasung;
|
||||
let Doppelfenster = ausweis.aufnahme.doppel_verglasung;
|
||||
let Fenster_teilw_undicht = ausweis.aufnahme.fenster_teilweise_undicht;
|
||||
let Warmwasserrohre_gedaemmt = aufnahme.warmwasser_rohre_gedaemmt;
|
||||
let Heizungsrohre_gedaemmt = aufnahme.heizungsrohre_gedaemmt;
|
||||
let Waermepumpe = aufnahme.waermepumpe;
|
||||
let Kellerwand_gedaemmt = aufnahme.keller_wand_gedaemmt;
|
||||
let Keller = aufnahme.keller;
|
||||
let Kellerdecke_Kalraeume_gedaemmt = aufnahme.keller_decke_gedaemmt;
|
||||
let Brennwertkessel = aufnahme.brennwert_kessel;
|
||||
let baujahr_anlagesanlage = aufnahme.baujahr_heizung[0];
|
||||
let Zentralheizung = aufnahme.zentralheizung;
|
||||
let photovoltaik = aufnahme.photovoltaik;
|
||||
let Brennstoff = aufnahme.brennstoff_1;
|
||||
let Aussenwand_gedaemmt = aufnahme.aussenwand_gedaemmt;
|
||||
let Dachgeschoss = aufnahme.dachgeschoss;
|
||||
let Dachgeschoss_gedaemmt = aufnahme.dachgeschoss_gedaemmt;
|
||||
let Oberste_Geschossdecke_gedaemmt = aufnahme.oberste_geschossdecke_gedaemmt;
|
||||
let Einfachglas = aufnahme.einfach_verglasung;
|
||||
let Doppelfenster = aufnahme.doppel_verglasung;
|
||||
let Fenster_teilw_undicht = aufnahme.fenster_teilweise_undicht;
|
||||
|
||||
let empfehlungen = [];
|
||||
|
||||
if (ausweis.aufnahme.einfach_verglasung || (Doppelfenster && Fenster_teilw_undicht)) {
|
||||
if (aufnahme.einfach_verglasung || (Doppelfenster && Fenster_teilw_undicht)) {
|
||||
empfehlungen.push({
|
||||
"title" : "Erneuerung der Fenster",
|
||||
"description" : "Alte und undichte Fenster mit Wärmeschutzfenstern auswechseln.",
|
||||
@@ -38,7 +40,7 @@ export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient): {
|
||||
});
|
||||
}
|
||||
|
||||
if (ausweis.aufnahme.dachgeschoss == Enums.Heizungsstatus.UNBEHEIZT && !Oberste_Geschossdecke_gedaemmt) {
|
||||
if (aufnahme.dachgeschoss == Enums.Heizungsstatus.UNBEHEIZT && !Oberste_Geschossdecke_gedaemmt) {
|
||||
empfehlungen.push({
|
||||
"title" : "Zusätzliche Dämmung des Fußbodens des kalten Dachraumes",
|
||||
"description" : "Beim Einbringen sollten mindestens 16cm Dämmstoff verarbeitet werden. Das Einsparpotenzial ist für jeden zusätzlichen cm Dämmung sehr hoch.",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { AufnahmeClient, BenutzerClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
||||
import * as fs from "fs"
|
||||
import { PDFDocument, rgb, StandardFonts, TextAlignment } from "pdf-lib";
|
||||
@@ -9,14 +9,14 @@ import { Heizungsstatus } from "@ibcornelsen/database/server";
|
||||
|
||||
/* -------------------------------- Pdf Tools ------------------------------- */
|
||||
|
||||
export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient) {
|
||||
export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient) {
|
||||
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("./templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
|
||||
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
||||
const pages = pdf.getPages()
|
||||
|
||||
// const template = VerbrauchsausweisWohnen2016Template as Template;
|
||||
|
||||
const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis);
|
||||
const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
|
||||
const height = pages[0].getHeight()
|
||||
const width = pages[0].getWidth()
|
||||
@@ -30,7 +30,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
||||
const marginX = 60;
|
||||
const marginY = 150;
|
||||
|
||||
const benutzer: typeof ausweis.benutzer = ausweis.benutzer || {
|
||||
benutzer = benutzer || {
|
||||
vorname: "Max",
|
||||
name: "Mustermann",
|
||||
adresse: "Musterstraße 123",
|
||||
@@ -55,7 +55,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
||||
<text size="12">Ausweis ID: ${ausweis.uid}</text>
|
||||
</flex>
|
||||
<text size="12" lineHeight="14" font="bold" marginTop="10">Gebäudedaten</text>
|
||||
<text size="12" lineHeight="14">Adresse: ${ausweis.aufnahme.objekt.adresse}, ${ausweis.aufnahme.objekt.plz} ${ausweis.aufnahme.objekt.ort}</text>
|
||||
<text size="12" lineHeight="14">Adresse: ${objekt.adresse}, ${objekt.plz} ${objekt.ort}</text>
|
||||
|
||||
<flex direction="row" justify="space-between" width="${innerWidth}" marginTop="25">
|
||||
<flex direction="row" gap="5" align="center">
|
||||
@@ -80,29 +80,29 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
||||
<flex direction="column" width="${(innerWidth) / 2 - 7.5}">
|
||||
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||
<text size="12" lineHeight="14">Gebäudetyp:</text>
|
||||
<text size="12" lineHeight="14">${ausweis.aufnahme.gebaeudetyp}</text>
|
||||
<text size="12" lineHeight="14">${aufnahme.gebaeudetyp}</text>
|
||||
</flex>
|
||||
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||
<text size="12" lineHeight="14">Wohnfläche:</text>
|
||||
<text size="12" lineHeight="14">DIN Wohnfläche innen ${ausweis.aufnahme.flaeche} m²</text>
|
||||
<text size="12" lineHeight="14">DIN Wohnfläche innen ${aufnahme.flaeche} m²</text>
|
||||
</flex>
|
||||
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||
<text size="12" lineHeight="14">Leerstand:</text>
|
||||
<text size="12" lineHeight="14">${ausweis.aufnahme.leerstand || 0}%</text>
|
||||
<text size="12" lineHeight="14">${aufnahme.leerstand || 0}%</text>
|
||||
</flex>
|
||||
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||
<text size="12" lineHeight="14">Wohnungen:</text>
|
||||
<text size="12" lineHeight="14">${ausweis.aufnahme.einheiten}</text>
|
||||
<text size="12" lineHeight="14">${aufnahme.einheiten}</text>
|
||||
</flex>
|
||||
</flex>
|
||||
<flex direction="column" width="${(innerWidth) / 2 - 7.5}">
|
||||
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||
<text size="12" lineHeight="14">Dachgeschoss:</text>
|
||||
<text size="12" lineHeight="14">${translateHeizungsstatus[ausweis.aufnahme.dachgeschoss || "NICHT_VORHANDEN"]}</text>
|
||||
<text size="12" lineHeight="14">${translateHeizungsstatus[aufnahme.dachgeschoss || "NICHT_VORHANDEN"]}</text>
|
||||
</flex>
|
||||
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||
<text size="12" lineHeight="14">Keller:</text>
|
||||
<text size="12" lineHeight="14">${translateHeizungsstatus[ausweis.aufnahme.keller || "NICHT_VORHANDEN"]}</text>
|
||||
<text size="12" lineHeight="14">${translateHeizungsstatus[aufnahme.keller || "NICHT_VORHANDEN"]}</text>
|
||||
</flex>
|
||||
</flex>
|
||||
</flex>
|
||||
@@ -126,14 +126,14 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
||||
</flex>
|
||||
<flex direction="column" gap="4">
|
||||
<text></text>
|
||||
<text size="12" font="bold">${ausweis.aufnahme.brennstoff_1}</text>
|
||||
<text size="12" font="bold">${aufnahme.brennstoff_1}</text>
|
||||
<text size="12">${ausweis.verbrauch_1} ${ausweis.einheit_1}</text>
|
||||
<text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text>
|
||||
<text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text>
|
||||
</flex>
|
||||
<flex direction="column" gap="4">
|
||||
<text size="12">zusätzliche Heizquelle</text>
|
||||
<text size="12" font="bold">${ausweis.aufnahme.brennstoff_2 || ""}</text>
|
||||
<text size="12" font="bold">${aufnahme.brennstoff_2 || ""}</text>
|
||||
<text size="12">${ausweis.verbrauch_4 || ""} ${ausweis.einheit_2 || ""}</text>
|
||||
<text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text>
|
||||
<text size="12">${ausweis.verbrauch_6 || ""} ${ausweis.einheit_2 || ""}</text>
|
||||
@@ -152,55 +152,55 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
||||
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
|
||||
<flex direction="column" gap="4">
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.zentralheizung || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.zentralheizung || false}"></checkbox>
|
||||
<text size="12">Zentralheizung</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.einzelofen || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.einzelofen || false}"></checkbox>
|
||||
<text size="12">Einzelöfen</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.durchlauf_erhitzer || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.durchlauf_erhitzer || false}"></checkbox>
|
||||
<text size="12">Durchlauferhitzer</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.standard_kessel || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.standard_kessel || false}"></checkbox>
|
||||
<text size="12">Standardkessel</text>
|
||||
</flex>
|
||||
</flex>
|
||||
<flex direction="column" gap="4">
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.solarsystem_warmwasser || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.solarsystem_warmwasser || false}"></checkbox>
|
||||
<text size="12">Solarsystem für Warmwasser</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.waermepumpe || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.waermepumpe || false}"></checkbox>
|
||||
<text size="12">Wärmepumpe</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.niedertemperatur_kessel || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.niedertemperatur_kessel || false}"></checkbox>
|
||||
<text size="12">Niedertemperaturkessel</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.brennwert_kessel || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.brennwert_kessel || false}"></checkbox>
|
||||
<text size="12">Brennwertkessel</text>
|
||||
</flex>
|
||||
</flex>
|
||||
<flex direction="column" gap="4">
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.warmwasser_rohre_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.warmwasser_rohre_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Warmwasserrohre gedämmt</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.heizungsrohre_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.heizungsrohre_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Heizungsrohre gedämmt</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.zirkulation || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.zirkulation || false}"></checkbox>
|
||||
<text size="12">Zirkulation</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.raum_temperatur_regler || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.raum_temperatur_regler || false}"></checkbox>
|
||||
<text size="12">Raumtemperaturregelung</text>
|
||||
</flex>
|
||||
</flex>
|
||||
@@ -209,15 +209,15 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
||||
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
|
||||
<flex direction="column" gap="4">
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.einfach_verglasung || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.einfach_verglasung || false}"></checkbox>
|
||||
<text size="12">Einfachglas</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.doppel_verglasung || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.doppel_verglasung || false}"></checkbox>
|
||||
<text size="12">Doppelverglasung</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.isolier_verglasung || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.isolier_verglasung || false}"></checkbox>
|
||||
<text size="12">Isolierverglasung</text>
|
||||
</flex>
|
||||
</flex>
|
||||
@@ -227,25 +227,25 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
||||
<text size="12">Passivhausfenster</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.fenster_dicht || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.fenster_dicht || false}"></checkbox>
|
||||
<text size="12">Alle Fenster dicht</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.fenster_teilweise_undicht || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.fenster_teilweise_undicht || false}"></checkbox>
|
||||
<text size="12">Fenster teilweise undicht</text>
|
||||
</flex>
|
||||
</flex>
|
||||
<flex direction="column" gap="4">
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.tueren_undicht || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.tueren_undicht || false}"></checkbox>
|
||||
<text size="12">Türen teilweise undicht</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.tueren_dicht || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.tueren_dicht || false}"></checkbox>
|
||||
<text size="12">Alle Türen dicht</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.rolllaeden_kaesten_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.rolllaeden_kaesten_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Rollladenkästen gedämmt</text>
|
||||
</flex>
|
||||
</flex>
|
||||
@@ -254,33 +254,33 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
||||
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
|
||||
<flex direction="column" gap="4">
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.keller_wand_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.keller_wand_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Kelleraußenwand gedämmt</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.keller_decke_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.keller_decke_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Kellerdecke gedämmt</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.aussenwand_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.aussenwand_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Außenwand gedämmt</text>
|
||||
</flex>
|
||||
</flex>
|
||||
<flex direction="column" gap="4">
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.dachgeschoss_min_12cm_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.dachgeschoss_min_12cm_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Dachgeschoss min. 12cm gedämmt</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.dachgeschoss_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.dachgeschoss_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Dachgeschoss gedämmt</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.oberste_geschossdecke_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.oberste_geschossdecke_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Oberste Geschossdecke gedämmt</text>
|
||||
</flex>
|
||||
<flex direction="row" gap="4" align="center">
|
||||
<checkbox width="8" height="8" checked="${ausweis.aufnahme.oberste_geschossdecke_min_12cm_gedaemmt || false}"></checkbox>
|
||||
<checkbox width="8" height="8" checked="${aufnahme.oberste_geschossdecke_min_12cm_gedaemmt || false}"></checkbox>
|
||||
<text size="12">Oberste Geschossdecke min. 12cm gedämmt</text>
|
||||
</flex>
|
||||
</flex>
|
||||
|
||||
@@ -1,5 +1,375 @@
|
||||
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
|
||||
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||
import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
|
||||
import { Enums } from "@ibcornelsen/database/server";
|
||||
import * as fs from "fs"
|
||||
import moment from "moment";
|
||||
import { PDFDocument, PDFFont, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib";
|
||||
|
||||
export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) {
|
||||
|
||||
export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) {
|
||||
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("./templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64");
|
||||
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
||||
const pages = pdf.getPages()
|
||||
|
||||
// const template = VerbrauchsausweisWohnen2016Template as Template;
|
||||
|
||||
const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
|
||||
console.log(berechnungen);
|
||||
|
||||
const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt)
|
||||
|
||||
const height = pages[0].getHeight()
|
||||
|
||||
const font = await pdf.embedFont(StandardFonts.Helvetica)
|
||||
const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
|
||||
|
||||
const form = pdf.getForm()
|
||||
form.updateFieldAppearances(font)
|
||||
|
||||
const fillFormField = (name: string, value: string, fontSize: number = 8, alignment: TextAlignment = TextAlignment.Left) => {
|
||||
const field = form.getTextField(name)
|
||||
field.setFontSize(fontSize)
|
||||
field.setText(value)
|
||||
field.setAlignment(alignment)
|
||||
}
|
||||
|
||||
const toggleCheck = (name: string, checked: boolean = true) => {
|
||||
const field = form.getCheckBox(name)
|
||||
|
||||
if (checked) {
|
||||
field.check()
|
||||
} else {
|
||||
field.uncheck()
|
||||
}
|
||||
}
|
||||
|
||||
// const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "")
|
||||
|
||||
// const adresse = fillFormField("adresse", objekt.adresse)
|
||||
|
||||
|
||||
// const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "")
|
||||
|
||||
// const baujahr_gebaeude = fillFormField("baujahr_gebaeude", aufnahme.baujahr_gebaeude?.toString())
|
||||
|
||||
// const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString())
|
||||
|
||||
// const einheiten = fillFormField("einheiten", aufnahme.einheiten?.toString())
|
||||
|
||||
// const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}m²`)
|
||||
|
||||
// fillFormField("energietraeger_heizung", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
|
||||
|
||||
// if (ausweis.warmwasser_enthalten) {
|
||||
// fillFormField("energietraeger_warmwasser", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
|
||||
// }
|
||||
|
||||
// toggleCheck("fensterlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung)
|
||||
// toggleCheck("schachtlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung)
|
||||
// toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung)
|
||||
// toggleCheck("lueftungsanlage_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung)
|
||||
|
||||
// toggleCheck("anlass_neubau", ausweis.ausstellgrund == "Neubau")
|
||||
// toggleCheck("anlass_vermietung", ausweis.ausstellgrund == "Vermietung" || ausweis.ausstellgrund == "Verkauf")
|
||||
// toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung")
|
||||
// toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges")
|
||||
|
||||
|
||||
// const gebaeudeBild = bilder.find(image => image.kategorie === "Gebaeude");
|
||||
|
||||
|
||||
// /* -------------------------------- Seite 2 -------------------------------- */
|
||||
|
||||
// const co2Emissionen = fillFormField("co2emissionen", berechnungen?.co2EmissionenGesamt.toString(), 8, TextAlignment.Center)
|
||||
|
||||
const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => {
|
||||
const pfeilNachUnten = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-unten.png", import.meta.url), "base64"))
|
||||
const pfeilNachOben = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-oben.png", import.meta.url), "base64"))
|
||||
|
||||
// Wir müssen den berechneten Wert zwischen 0 und 1000 als Wert zwischen 0 und 1 festlegen
|
||||
const endenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 1000
|
||||
const primaerenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.primaerEnergieVerbrauchGesamt || 0)) / 1000
|
||||
|
||||
const minTranslation = 120
|
||||
const maxTranslation = 457
|
||||
const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage;
|
||||
const primaerenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * primaerenergieverbrauchTranslationPercentage;
|
||||
|
||||
const pfeilWidth = 20
|
||||
const margin = 5;
|
||||
|
||||
page.drawImage(pfeilNachUnten, {
|
||||
x: endenergieverbrauchTranslationX,
|
||||
y: height - 215,
|
||||
width: pfeilWidth,
|
||||
height: 30
|
||||
})
|
||||
|
||||
const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`;
|
||||
const primaerEnergieVerbrauchGesamtText = `${berechnungen?.primaerEnergieVerbrauchGesamt.toString()}kWh/(m²a)`;
|
||||
|
||||
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
||||
page.drawText("Endenergieverbrauch", {
|
||||
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10),
|
||||
y: height - 193,
|
||||
size: 10
|
||||
})
|
||||
|
||||
page.drawText(endEnergieVerbrauchGesamtText, {
|
||||
x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10),
|
||||
y: height - 207,
|
||||
size: 10,
|
||||
font: bold
|
||||
})
|
||||
} else {
|
||||
page.drawText("Endenergieverbrauch", {
|
||||
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
|
||||
y: height - 193,
|
||||
size: 10
|
||||
})
|
||||
page.drawText(endEnergieVerbrauchGesamtText, {
|
||||
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
|
||||
y: height - 207,
|
||||
size: 10,
|
||||
font: bold
|
||||
})
|
||||
}
|
||||
|
||||
page.drawImage(pfeilNachOben, {
|
||||
x: primaerenergieverbrauchTranslationX,
|
||||
y: height - 298,
|
||||
width: pfeilWidth,
|
||||
height: 30
|
||||
})
|
||||
|
||||
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
||||
page.drawText("Primärenergieverbrauch", {
|
||||
x: primaerenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10),
|
||||
y: height - 280,
|
||||
size: 10
|
||||
})
|
||||
|
||||
page.drawText(primaerEnergieVerbrauchGesamtText, {
|
||||
x: primaerenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(primaerEnergieVerbrauchGesamtText, 10),
|
||||
y: height - 294,
|
||||
size: 10,
|
||||
font: bold
|
||||
})
|
||||
} else {
|
||||
page.drawText("Primärenergieverbrauch", {
|
||||
x: primaerenergieverbrauchTranslationX + pfeilWidth + margin,
|
||||
y: height - 280,
|
||||
size: 10
|
||||
})
|
||||
page.drawText(primaerEnergieVerbrauchGesamtText, {
|
||||
x: primaerenergieverbrauchTranslationX + pfeilWidth + margin,
|
||||
y: height - 294,
|
||||
size: 10,
|
||||
font: bold
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
addEnergieverbrauchSkalaPfeile(pages[1])
|
||||
addEnergieverbrauchSkalaPfeile(pages[2])
|
||||
|
||||
// const primaerenergiebedarfIst = fillFormField("primaerenergiebedarf_ist", berechnungen?.primaerEnergieVerbrauchGesamt.toString())
|
||||
|
||||
|
||||
/* -------------------------------- Seite 3 -------------------------------- */
|
||||
|
||||
// Verbräuche
|
||||
|
||||
const addVerbrauchGenerator = () => {
|
||||
let i = 0;
|
||||
let yOffset = 14.6;
|
||||
const initialHeight = 435
|
||||
const initialXOffset = 36;
|
||||
return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_heizung?: string, klimafaktor?: string) => {
|
||||
pages[2].drawText(zeitraum_von || "", {
|
||||
x: initialXOffset,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(zeitraum_bis || "", {
|
||||
x: initialXOffset + 47,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(energietraeger || "", {
|
||||
x: initialXOffset + 94,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(primaerfaktor || "", {
|
||||
x: initialXOffset + 317,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(energieverbrauch || "", {
|
||||
x: initialXOffset + 351,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(anteil_warmwasser || "", {
|
||||
x: initialXOffset + 402,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(anteil_heizung || "", {
|
||||
x: initialXOffset + 453,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(klimafaktor || "", {
|
||||
x: initialXOffset + 504,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
const addVerbrauch = addVerbrauchGenerator();
|
||||
|
||||
addVerbrauch(
|
||||
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||
moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"),
|
||||
aufnahme.brennstoff_1,
|
||||
berechnungen?.primaerfaktor.toString(),
|
||||
Math.round(berechnungen?.verbrauch_1_kwh).toString(),
|
||||
Math.round(
|
||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_1_kwh
|
||||
).toString(),
|
||||
Math.round(
|
||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_1_kwh
|
||||
).toString(),
|
||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
||||
);
|
||||
|
||||
addVerbrauch(
|
||||
moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"),
|
||||
moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"),
|
||||
aufnahme.brennstoff_1,
|
||||
berechnungen?.primaerfaktor.toString(),
|
||||
Math.round(berechnungen?.verbrauch_2_kwh).toString(),
|
||||
Math.round(
|
||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_2_kwh
|
||||
).toString(),
|
||||
Math.round(
|
||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_2_kwh
|
||||
).toString(),
|
||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
||||
);
|
||||
|
||||
addVerbrauch(
|
||||
moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"),
|
||||
moment(ausweis.startdatum).add(3, "year").format("MM.YYYY"),
|
||||
aufnahme.brennstoff_1,
|
||||
berechnungen?.primaerfaktor.toString(),
|
||||
Math.round(berechnungen?.verbrauch_3_kwh).toString(),
|
||||
Math.round(
|
||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_3_kwh
|
||||
).toString(),
|
||||
Math.round(
|
||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_3_kwh
|
||||
).toString(),
|
||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
||||
);
|
||||
|
||||
/* -------------------------------- Seite 4 -------------------------------- */
|
||||
|
||||
const splitToSize = (text: string, size: number, font: PDFFont, fontSize: number) => {
|
||||
const lines = []
|
||||
|
||||
let currentLine = ""
|
||||
for (const char of text) {
|
||||
if (font.widthOfTextAtSize(currentLine + char, fontSize) <= size) {
|
||||
currentLine += char;
|
||||
} else {
|
||||
lines.push(currentLine)
|
||||
currentLine = char;
|
||||
}
|
||||
}
|
||||
|
||||
lines.push(currentLine)
|
||||
|
||||
return lines.join("\n")
|
||||
}
|
||||
|
||||
const addEmpfehlungenGenerator = () => {
|
||||
let i = 0;
|
||||
let yOffset = 43;
|
||||
const initialHeight = 568
|
||||
const initialXOffset = 36;
|
||||
return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => {
|
||||
pages[3].drawText((i + 1).toString(), {
|
||||
x: initialXOffset,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[3].drawText(splitToSize(bauteil || "", 70, font, 8), {
|
||||
x: initialXOffset + 25,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font,
|
||||
lineHeight: 10
|
||||
})
|
||||
|
||||
pages[3].drawText(splitToSize(beschreibung || "", 230, font, 8), {
|
||||
x: initialXOffset + 98,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font,
|
||||
lineHeight: 10
|
||||
})
|
||||
|
||||
|
||||
|
||||
pages[3].drawText(amortisationszeit || "", {
|
||||
x: initialXOffset + 403,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[3].drawText(kosten || "", {
|
||||
x: initialXOffset + 451,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
const addEmpfehlung = addEmpfehlungenGenerator()
|
||||
|
||||
for (const empfehlung of empfehlungen) {
|
||||
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
|
||||
}
|
||||
|
||||
|
||||
|
||||
// pdf.getForm().flatten()
|
||||
|
||||
return pdf.save();
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
||||
import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
|
||||
import { Enums } from "@ibcornelsen/database/server";
|
||||
import * as fs from "fs"
|
||||
import moment from "moment";
|
||||
import { PDFDocument, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib";
|
||||
import { PDFDocument, PDFFont, PDFPage, RotationTypes, StandardFonts, TextAlignment } from "pdf-lib";
|
||||
|
||||
/* -------------------------------- Pdf Tools ------------------------------- */
|
||||
|
||||
@@ -14,7 +15,8 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
|
||||
// const template = VerbrauchsausweisWohnen2016Template as Template;
|
||||
|
||||
const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis);
|
||||
const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt)
|
||||
|
||||
const height = pages[0].getHeight()
|
||||
|
||||
@@ -41,20 +43,20 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
}
|
||||
}
|
||||
|
||||
const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp)
|
||||
const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "")
|
||||
|
||||
const adresse = fillFormField("adresse", objekt.adresse)
|
||||
|
||||
|
||||
const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil)
|
||||
const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "")
|
||||
|
||||
const baujahr_gebaeude = fillFormField("baujahr_gebaeude", aufnahme.baujahr_gebaeude.toString())
|
||||
const baujahr_gebaeude = fillFormField("baujahr_gebaeude", aufnahme.baujahr_gebaeude?.toString())
|
||||
|
||||
const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung.toString())
|
||||
const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString())
|
||||
|
||||
const einheiten = fillFormField("einheiten", aufnahme.einheiten.toString())
|
||||
const einheiten = fillFormField("einheiten", aufnahme.einheiten?.toString())
|
||||
|
||||
const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche.toString()}m²`)
|
||||
const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}m²`)
|
||||
|
||||
fillFormField("energietraeger_heizung", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
|
||||
|
||||
@@ -72,20 +74,22 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung")
|
||||
toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges")
|
||||
|
||||
console.log(bilder);
|
||||
|
||||
|
||||
const gebaeudeBild = bilder.find(image => image.kategorie === "Gebaeude");
|
||||
|
||||
|
||||
/* -------------------------------- Seite 2 -------------------------------- */
|
||||
|
||||
const co2Emissionen = fillFormField("co2emissionen", berechnungen.co2EmissionenGesamt.toString(), 8, TextAlignment.Center)
|
||||
|
||||
const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => {
|
||||
const pfeilNachUnten = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-unten.png", import.meta.url), "base64"))
|
||||
const pfeilNachOben = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-oben.png", import.meta.url), "base64"))
|
||||
|
||||
// Wir müssen den berechneten Wert zwischen 0 und 250 als Wert zwischen 0 und 1 festlegen
|
||||
const endenergieverbrauchTranslationPercentage = Math.min(250, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt)) / 250
|
||||
const primaerenergieverbrauchTranslationPercentage = Math.min(250, Math.max(0, berechnungen?.primaerEnergieVerbrauchGesamt)) / 250
|
||||
const endenergieverbrauchTranslationPercentage = Math.min(250, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 250
|
||||
const primaerenergieverbrauchTranslationPercentage = Math.min(250, Math.max(0, berechnungen?.primaerEnergieVerbrauchGesamt || 0)) / 250
|
||||
|
||||
const minTranslation = 68
|
||||
const maxTranslation = 504
|
||||
@@ -167,11 +171,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
}
|
||||
}
|
||||
|
||||
addEnergieverbrauchSkalaPfeile(pages[1])
|
||||
addEnergieverbrauchSkalaPfeile(pages[2])
|
||||
|
||||
const primaerenergiebedarfIst = fillFormField("primaerenergiebedarf_ist", berechnungen?.primaerEnergieVerbrauchGesamt.toString())
|
||||
|
||||
addEnergieverbrauchSkalaPfeile(pages[2])
|
||||
|
||||
/* -------------------------------- Seite 3 -------------------------------- */
|
||||
|
||||
@@ -182,57 +182,57 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
let yOffset = 14.6;
|
||||
const initialHeight = 435
|
||||
const initialXOffset = 36;
|
||||
return (zeitraum_von: string, zeitraum_bis: string, energietraeger: string, primaerfaktor: string, energieverbrauch: string, anteil_warmwasser: string, anteil_heizung: string, klimafaktor: string) => {
|
||||
pages[2].drawText(zeitraum_von, {
|
||||
return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_heizung?: string, klimafaktor?: string) => {
|
||||
pages[2].drawText(zeitraum_von || "", {
|
||||
x: initialXOffset,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(zeitraum_bis, {
|
||||
pages[2].drawText(zeitraum_bis || "", {
|
||||
x: initialXOffset + 47,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(energietraeger, {
|
||||
pages[2].drawText(energietraeger || "", {
|
||||
x: initialXOffset + 94,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(primaerfaktor, {
|
||||
pages[2].drawText(primaerfaktor || "", {
|
||||
x: initialXOffset + 317,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(energieverbrauch, {
|
||||
pages[2].drawText(energieverbrauch || "", {
|
||||
x: initialXOffset + 351,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(anteil_warmwasser, {
|
||||
pages[2].drawText(anteil_warmwasser || "", {
|
||||
x: initialXOffset + 402,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(anteil_heizung, {
|
||||
pages[2].drawText(anteil_heizung || "", {
|
||||
x: initialXOffset + 453,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[2].drawText(klimafaktor, {
|
||||
pages[2].drawText(klimafaktor || "", {
|
||||
x: initialXOffset + 504,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
@@ -288,6 +288,98 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
).toString(),
|
||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
||||
);
|
||||
|
||||
/* -------------------------------- Seite 4 -------------------------------- */
|
||||
|
||||
const splitToSize = (text: string, size: number, font: PDFFont, fontSize: number) => {
|
||||
const lines = []
|
||||
|
||||
let currentLine = ""
|
||||
for (const char of text) {
|
||||
if (font.widthOfTextAtSize(currentLine + char, fontSize) <= size) {
|
||||
currentLine += char;
|
||||
} else {
|
||||
lines.push(currentLine)
|
||||
currentLine = char;
|
||||
}
|
||||
}
|
||||
|
||||
lines.push(currentLine)
|
||||
|
||||
return lines.join("\n")
|
||||
}
|
||||
|
||||
const addEmpfehlungenGenerator = () => {
|
||||
let i = 0;
|
||||
let yOffset = 43;
|
||||
const initialHeight = 568
|
||||
const initialXOffset = 36;
|
||||
return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => {
|
||||
pages[3].drawText((i + 1).toString(), {
|
||||
x: initialXOffset,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[3].drawText(splitToSize(bauteil || "", 70, font, 8), {
|
||||
x: initialXOffset + 25,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font,
|
||||
lineHeight: 10
|
||||
})
|
||||
|
||||
pages[3].drawText(splitToSize(beschreibung || "", 230, font, 8), {
|
||||
x: initialXOffset + 98,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font,
|
||||
lineHeight: 10
|
||||
})
|
||||
|
||||
|
||||
|
||||
pages[3].drawText(amortisationszeit || "", {
|
||||
x: initialXOffset + 403,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
|
||||
pages[3].drawText(kosten || "", {
|
||||
x: initialXOffset + 451,
|
||||
y: initialHeight - (i * yOffset),
|
||||
size: 8,
|
||||
font
|
||||
})
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
const addEmpfehlung = addEmpfehlungenGenerator()
|
||||
|
||||
for (const empfehlung of empfehlungen) {
|
||||
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
|
||||
}
|
||||
|
||||
|
||||
function addAnsichtsausweisLabel(page: PDFPage, font: PDFFont) {
|
||||
page.drawText("Ansichtsausweis", {
|
||||
x: page.getWidth() / 2 - font.heightAtSize(112) * 2.2, y: page.getHeight() - font.heightAtSize(112) / 2,
|
||||
size: 112,
|
||||
font,
|
||||
rotate: {
|
||||
type: RotationTypes.Degrees,
|
||||
angle: -60
|
||||
},
|
||||
opacity: 0.3
|
||||
})
|
||||
}
|
||||
|
||||
for (const page of pages) {
|
||||
addAnsichtsausweisLabel(page, font)
|
||||
}
|
||||
|
||||
// pdf.getForm().flatten()
|
||||
|
||||
|
||||
BIN
src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf
Normal file
BIN
src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf
Normal file
Binary file not shown.
@@ -2,11 +2,10 @@
|
||||
import PerformanceScore from "#components/Ausweis/PerformanceScore.svelte";
|
||||
import ProgressBar from "#components/Ausweis/Progressbar.svelte";
|
||||
//import Hilfe from "#components/Ausweis/Hilfe.svelte";
|
||||
import { PRICES } from "#lib/constants";
|
||||
import { PRICES } from "#lib/constants.js";
|
||||
|
||||
import Bereich from "#components/labels/Bereich.svelte";
|
||||
|
||||
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
|
||||
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
|
||||
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
|
||||
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
|
||||
@@ -29,20 +28,19 @@
|
||||
import {
|
||||
BedarfsausweisWohnenClient,
|
||||
BenutzerClient,
|
||||
ObjektClient,
|
||||
UploadedGebaeudeBild,
|
||||
AufnahmeClient
|
||||
} from "#components/Ausweis/types.js";
|
||||
|
||||
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
|
||||
|
||||
let ausweisart = Enums.Ausweisart.BedarfsausweisWohnen
|
||||
export let ausweis: BedarfsausweisWohnenClient;
|
||||
export let objekt: ObjektClient
|
||||
export let aufnahme: AufnahmeClient
|
||||
export let user: BenutzerClient = {} as BenutzerClient;
|
||||
|
||||
let aufnahme = ausweis.aufnahme || {};
|
||||
let gebaeude =
|
||||
ausweis.aufnahme?.objekt || {};
|
||||
let images: (UploadedGebaeudeBild & { base64?: string })[] =
|
||||
ausweis.aufnahme?.objekt
|
||||
?.gebaeude_bilder || [];
|
||||
export let images: UploadedGebaeudeBild[] = []
|
||||
|
||||
let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4];
|
||||
|
||||
@@ -159,13 +157,15 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<div id="skala" class="bg-white grid grid-cols-1 gap-x-8 gap-y-4 p-4
|
||||
|
||||
<div id="skala" class="bg-white grid grid-cols-1 gap-x-8 gap-y-4 p-4">
|
||||
|
||||
<div class="w-full rounded-lg border-gray/35 border-2 relative px-4">
|
||||
<PerformanceScore
|
||||
bind:ausweis
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:objekt={gebaeude}
|
||||
bind:objekt={objekt}
|
||||
{ausweisart}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -173,12 +173,10 @@
|
||||
<div id="progress-box" class="w-full box relative px-4 py-3 text-center order-1 2xl:order-2 self-stretch">
|
||||
|
||||
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
|
||||
<h2 class="text-primary text-xl">{Energieausweis} {PRICES.BedarfsausweisWohnen[0]} €</h2>
|
||||
<h2 class="text-primary text-xl">{ausweisart} {PRICES.BedarfsausweisWohnen[0]} €</h2>
|
||||
<ProgressBar progress={0} />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<form id="formInput-1" on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
|
||||
<div id="formular-box" class="formular-boxen ring-0">
|
||||
|
||||
@@ -189,10 +187,10 @@
|
||||
|
||||
<Bereich bereich="A" title="Prüfung der Ausweisart">
|
||||
<Ausweisart
|
||||
bind:objekt={gebaeude}
|
||||
bind:objekt={objekt}
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:ausweis
|
||||
{Energieausweis}
|
||||
{ausweisart}
|
||||
/>
|
||||
</Bereich>
|
||||
|
||||
@@ -200,23 +198,22 @@
|
||||
|
||||
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
|
||||
|
||||
<Bereich
|
||||
bereich="B"
|
||||
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
|
||||
><GebaeudeDaten bind:aufnahme /></Bereich
|
||||
>
|
||||
<Bereich
|
||||
bereich="B"
|
||||
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
|
||||
><GebaeudeDaten bind:aufnahme bind:objekt /></Bereich
|
||||
>
|
||||
|
||||
<hr />
|
||||
<Bereich
|
||||
bereich="B"
|
||||
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
|
||||
><GebaeudeDaten bind:gebaeude_aufnahme_allgemein /></Bereich
|
||||
><GebaeudeDaten bind:aufnahme bind:objekt /></Bereich
|
||||
>
|
||||
|
||||
<!-- C - Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen -->
|
||||
|
||||
<Bereich
|
||||
bind:ausweis
|
||||
bereich="C"
|
||||
title="Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen"
|
||||
>
|
||||
@@ -605,7 +602,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
><input
|
||||
type="checkbox"
|
||||
name="energiequelle_2_nutzung_1"
|
||||
bind:checked={ausweis.energiequelle_2_nutzung[0]}
|
||||
bind:checked={ausweis.alternative_heizung}
|
||||
value="Heizung"
|
||||
/>Heizung</label
|
||||
>
|
||||
@@ -613,7 +610,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
><input
|
||||
type="checkbox"
|
||||
name="energiequelle_2_nutzung_2"
|
||||
bind:checked={ausweis.energiequelle_2_nutzung[1]}
|
||||
bind:checked={ausweis.alternative_warmwasser}
|
||||
value="Warmwasser"
|
||||
/>Warmwasser</label
|
||||
>
|
||||
@@ -621,7 +618,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
><input
|
||||
type="checkbox"
|
||||
name="energiequelle_2_nutzung_3"
|
||||
bind:checked={ausweis.energiequelle_2_nutzung[2]}
|
||||
bind:checked={ausweis.alternative_lueftung}
|
||||
value="Lüftung"
|
||||
/>Lüftung</label
|
||||
>
|
||||
@@ -629,7 +626,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
><input
|
||||
type="checkbox"
|
||||
name="energiequelle_2_nutzung_4"
|
||||
bind:checked={ausweis.energiequelle_2_nutzung[3]}
|
||||
bind:checked={ausweis.alternative_kuehlung}
|
||||
value="Kühlung"
|
||||
/>Kühlung</label
|
||||
>
|
||||
@@ -964,13 +961,13 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
|
||||
<!-- F Angaben zur Heizungsanlage -->
|
||||
|
||||
<Bereich bereich="F" title="Angaben zur Heizunganlage"
|
||||
><SanierungszustandHeizungsanlage
|
||||
bind:images
|
||||
bind:gebaeude
|
||||
bind:gebaeude_aufnahme_allgemein
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
<Bereich bereich="F" title="Angaben zur Heizunganlage"
|
||||
><SanierungszustandHeizungsanlage
|
||||
bind:images
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
>
|
||||
|
||||
<!-- G Angaben zur Fenster, Dachfenster und Türen -->
|
||||
@@ -978,8 +975,8 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
<Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
|
||||
><SanierungszustandFensterTueren
|
||||
bind:images
|
||||
bind:gebaeude
|
||||
bind:gebaeude_aufnahme_allgemein
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
>
|
||||
@@ -988,8 +985,8 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
<Bereich bereich="H" title="Angaben zur Wärmedämmung"
|
||||
><SanierungszustandWaermedammung
|
||||
bind:images
|
||||
bind:gebaeude
|
||||
bind:gebaeude_aufnahme_allgemein
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
>
|
||||
@@ -1000,27 +997,30 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
><AusweisPreviewContainer
|
||||
bind:images
|
||||
bind:ausweis
|
||||
bind:gebaeude
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
{ausweisart}
|
||||
/></Bereich
|
||||
>
|
||||
|
||||
|
||||
<ButtonWeiterHilfe {spaeterWeitermachen}
|
||||
bind:ausweis
|
||||
bind:images
|
||||
bind:user
|
||||
bind:gebaeude
|
||||
bind:gebaeude_aufnahme_allgemein
|
||||
>
|
||||
<ButtonWeiterHilfe {spaeterWeitermachen}
|
||||
bind:ausweis
|
||||
bind:images
|
||||
bind:user
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
ausweisart={Enums.Ausweisart.BedarfsausweisWohnen}
|
||||
/>
|
||||
<BilderZusatzsysteme
|
||||
{ausweis}
|
||||
{gebaeude}
|
||||
{aufnahme}
|
||||
{images}
|
||||
/>
|
||||
<hr />
|
||||
<div class="flex flex-row justify-between">
|
||||
<button class="button">Weiter</button>
|
||||
</div>
|
||||
{ausweis}
|
||||
{objekt}
|
||||
{aufnahme}
|
||||
{images}
|
||||
/>
|
||||
<hr />
|
||||
<div class="flex flex-row justify-between">
|
||||
<button class="button">Weiter</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
<script lang="ts">
|
||||
import { BenutzerClient, ObjektClient } from "#components/Ausweis/types";
|
||||
import { BenutzerClient, ObjektClient } from "#components/Ausweis/types.js";
|
||||
|
||||
export let user: BenutzerClient;
|
||||
export let gebaeudeArray: ObjektClient[];
|
||||
export let objekte: ObjektClient[];
|
||||
|
||||
console.log(objekte);
|
||||
|
||||
</script>
|
||||
|
||||
<h1 class="text-4xl font-medium my-8">Willkommen zurück, {user.vorname}!</h1>
|
||||
@@ -12,18 +15,18 @@
|
||||
|
||||
<h1 class="text-4xl font-medium my-8">Gebäude</h1>
|
||||
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2">
|
||||
{#each gebaeudeArray as gebaeude}
|
||||
<!-- {#each objekte as objekt}
|
||||
<div class="card lg:card-side bg-base-200 card-bordered border-base-300">
|
||||
<figure class="lg:w-1/2">
|
||||
<img
|
||||
src={(gebaeude.gebaeude_bilder && `/bilder/${gebaeude.gebaeude_bilder[0]?.uid}.webp`) || "/images/placeholder.jpg"}
|
||||
src={(objekt.gebaeude_bilder && `/bilder/${objekt.gebaeude_bilder[0]?.uid}.webp`) || "/images/placeholder.jpg"}
|
||||
class="object-cover w-full h-full"
|
||||
alt="Gebäudebild"
|
||||
/>
|
||||
</figure>
|
||||
<div class="card-body lg:w-1/2 p-4">
|
||||
<h4 class="text-lg font-semibold">{gebaeude.adresse}, {gebaeude.plz} {gebaeude.ort}</h4>
|
||||
<h4 class="text-lg font-semibold">{objekt.adresse}, {objekt.plz} {objekt.ort}</h4>
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
{/each} -->
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<script lang="ts">
|
||||
import PerformanceScore from "#components/Ausweis/PerformanceScore.svelte";
|
||||
import ProgressBar from "#components/Ausweis/Progressbar.svelte";
|
||||
import Progressbar from "#components/Ausweis/Progressbar.svelte";
|
||||
import Bereich from "#components/labels/Bereich.svelte";
|
||||
import Ansprechpartner from "#components/Ausweis/Ansprechpartner.svelte";
|
||||
import Rechnungsadresse from "#components/Ausweis/Rechnungsadresse.svelte";
|
||||
@@ -12,22 +12,40 @@
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { dialogs } from "svelte-dialogs";
|
||||
import LoginDialog from "#components/LoginDialog.svelte";
|
||||
import { PRICES } from "#lib/constants.js";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME, PRICES } from "#lib/constants.js";
|
||||
import Cookies from "js-cookie";
|
||||
import {
|
||||
AufnahmeClient,
|
||||
BenutzerClient,
|
||||
getAusweisartFromUUID,
|
||||
ObjektClient,
|
||||
RechnungClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
import { validateAccessTokenClient } from "src/client/lib/validateAccessToken.js";
|
||||
import ButtonZurueckSpeichernKaufabschluss from "#components/Ausweis/ButtonZurueckSpeichernKaufabschluss.svelte";
|
||||
import { api } from "astro-typesafe-api/client";
|
||||
import A10WaermequellenAnlagentechnikTrinkwarmwasser from "#components/Tabellen/A10WaermequellenAnlagentechnikTrinkwarmwasser.svelte";
|
||||
|
||||
export let user: BenutzerClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let ausweisart: Enums.Ausweisart;
|
||||
|
||||
let services = [
|
||||
let rechnung: Partial<RechnungClient> = {
|
||||
email: user.email,
|
||||
empfaenger: user.vorname + " " + user.name,
|
||||
strasse: user.adresse,
|
||||
plz: user.plz,
|
||||
ort: user.ort,
|
||||
versand_empfaenger: user.vorname + " " + user.name,
|
||||
versand_strasse: user.adresse,
|
||||
versand_plz: user.plz,
|
||||
versand_ort: user.ort,
|
||||
telefon: user.telefon,
|
||||
}
|
||||
|
||||
let services: { name: string, id: Enums.Service, price: number, selected: boolean }[] = [
|
||||
{
|
||||
name: "Qualitätsdruck per Post (zusätzlich zur PDF Version)",
|
||||
id: Enums.Service.Qualitaetsdruck,
|
||||
@@ -54,7 +72,7 @@
|
||||
},
|
||||
];
|
||||
|
||||
export let selectedPaymentType: Bezahlmethoden =
|
||||
export let bezahlmethode: Bezahlmethoden =
|
||||
Enums.Bezahlmethoden.paypal;
|
||||
|
||||
let prices: number[] = [];
|
||||
@@ -72,6 +90,13 @@
|
||||
0
|
||||
);
|
||||
|
||||
const zurueck = {
|
||||
[Enums.Ausweisart.VerbrauchsausweisWohnen]: `/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid=${ausweis.uid}`,
|
||||
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: `/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.uid}`,
|
||||
[Enums.Ausweisart.BedarfsausweisWohnen]: `/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.uid}`,
|
||||
[Enums.Ausweisart.BedarfsausweisGewerbe]: `/energieausweis-erstellen/bedarfsausweis-gewerbe?uid=${ausweis.uid}`,
|
||||
}[ausweisart]
|
||||
|
||||
async function speichern(e: SubmitEvent) {
|
||||
e.preventDefault();
|
||||
|
||||
@@ -93,6 +118,38 @@
|
||||
|
||||
window.location.href = `/kaufabschluss?uid=${ausweis.uid}`;
|
||||
}
|
||||
|
||||
async function bestellen() {
|
||||
const ausweisart = getAusweisartFromUUID(ausweis.uid) as Enums.Ausweisart;
|
||||
|
||||
try {
|
||||
const { uid, checkout_url } = await api.rechnung.PUT.fetch({
|
||||
ausweisart,
|
||||
bezahlmethode,
|
||||
services: services.filter(service => service.selected).map(service => service.id),
|
||||
email: rechnung.email,
|
||||
empfaenger: rechnung.empfaenger,
|
||||
strasse: rechnung.strasse,
|
||||
plz: rechnung.plz,
|
||||
ort: rechnung.ort,
|
||||
versand_empfaenger: rechnung.versand_empfaenger,
|
||||
versand_strasse: rechnung.versand_strasse,
|
||||
versand_plz: rechnung.versand_plz,
|
||||
versand_ort: rechnung.versand_ort,
|
||||
telefon: rechnung.telefon,
|
||||
ausweis_uid: ausweis.uid
|
||||
}, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||
}
|
||||
})
|
||||
|
||||
window.location.href = checkout_url;
|
||||
} catch(e) {
|
||||
console.log(e);
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<div
|
||||
@@ -102,12 +159,14 @@
|
||||
2xl:grid-cols-2 2xl:gap-x-8
|
||||
"
|
||||
>
|
||||
<div
|
||||
id="performance-box"
|
||||
class="w-full box relative px-4 order-2 2xl:order-1 self-stretch grid grid-cols-1"
|
||||
>
|
||||
<PerformanceScore bind:ausweis bind:aufnahme bind:objekt />
|
||||
</div>
|
||||
<div id="performance-box" class="w-full box relative px-4 order-1 self-stretch grid grid-cols-1">
|
||||
<PerformanceScore
|
||||
bind:ausweis
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:objekt={objekt}
|
||||
{ausweisart}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div
|
||||
id="progress-box"
|
||||
@@ -117,11 +176,11 @@
|
||||
<h2 class="text-primary text-xl">
|
||||
Verbrauchsausweis Wohnen {PRICES.VerbrauchsausweisWohnen[0]} €
|
||||
</h2>
|
||||
<ProgressBar progress={0} step2={'step'}/>
|
||||
<Progressbar progress={0} step1={''} step2={'step'} step3={''}/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form id="formInput-2" on:submit={speichern}>
|
||||
<div id="formInput-2">
|
||||
<div id="formular-box" class="formular-boxen ring-0">
|
||||
<Bereich
|
||||
bereich="1"
|
||||
@@ -131,11 +190,11 @@
|
||||
>
|
||||
|
||||
<Bereich bereich="2" title="Rechnungsadresse">
|
||||
<Rechnungsadresse bind:user /></Bereich
|
||||
<Rechnungsadresse bind:user bind:rechnung /></Bereich
|
||||
>
|
||||
|
||||
<Bereich bereich="3" title="Bezahlmethode">
|
||||
<Bezahlung bind:selectedPaymentType /></Bereich
|
||||
<Bezahlung bind:selectedPaymentType={bezahlmethode} /></Bereich
|
||||
>
|
||||
|
||||
<div class="grid grid-cols-2 gap-x-6 my-6">
|
||||
@@ -193,8 +252,8 @@
|
||||
<div>:</div>
|
||||
<div class="justify-self-end">
|
||||
<img
|
||||
src="images/{selectedPaymentType}.png"
|
||||
alt={selectedPaymentType}
|
||||
src="images/{bezahlmethode}.png"
|
||||
alt={bezahlmethode}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -202,10 +261,21 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ButtonZurueckSpeichernKaufabschluss />
|
||||
<div
|
||||
class="w-full grid grid-cols-[min-content_1fr_min-content_min-content] grid-rows-[min_content_1fr] gap-x-2 self-start justify-self-end mt-8"
|
||||
>
|
||||
<a class="button justify-self-start" href={zurueck}>Zurück</a>
|
||||
|
||||
</form>
|
||||
<!--
|
||||
<div></div>
|
||||
|
||||
<button class="button">Speichern</button>
|
||||
|
||||
<button class="button" data-cy="bestellen" on:click={bestellen}>kostenpflichtig bestellen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div class="bereich-box pr-12 mt-6">
|
||||
<Pruefung
|
||||
bereich="A"
|
||||
@@ -332,7 +402,9 @@
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
<ButtonZurueckSpeichernKaufabschluss bind:ausweis bind:aufnahme bind:objekt bind:bilder bind:user /> -->
|
||||
<ButtonZurueckSpeichernKaufabschluss bind:ausweis bind:aufnahme bind:objekt bind:bilder bind:user /> -->
|
||||
|
||||
<!-- <ButtonZurueckSpeichernKaufabschluss bind:ausweis bind:aufnahme bind:objekt bind:bilder bind:user /> -->
|
||||
|
||||
|
||||
<style lang="postcss">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { loginClient } from "#lib/login";
|
||||
import { loginClient } from "#lib/login.js";
|
||||
import CrossCircled from "radix-svelte-icons/src/lib/icons/CrossCircled.svelte";
|
||||
import { fade } from "svelte/transition";
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
<span class="font-semibold">Das hat leider nicht geklappt, haben sie ihr Passwort und ihre Email Adresse richtig eingegeben?</span>
|
||||
</div>
|
||||
{/if}
|
||||
<button class="btn btn-primary" type="submit">Einloggen</button>
|
||||
<button class="button" type="submit">Einloggen</button>
|
||||
<div class="flex-row justify-between" style="margin-top: 10px">
|
||||
<a class="link link-hover" href="/auth/signup{redirect ? `?redirect=${redirect}` : ""}">Registrieren</a>
|
||||
<a class="link link-hover" href="/auth/passwort-vergessen{redirect ? `?redirect=${redirect}` : ""}"
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
<script lang="ts">
|
||||
import PerformanceScore from "#components/Ausweis/PerformanceScore.svelte";
|
||||
import ProgressBar from "#components/Ausweis/Progressbar.svelte";
|
||||
import Hilfe from "#components/Ausweis/Hilfe.svelte";
|
||||
import { PRICES } from "#lib/constants";
|
||||
import { PRICES } from "#lib/constants.js";
|
||||
|
||||
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
|
||||
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
|
||||
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
|
||||
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
|
||||
import Warmwasseranteil from "#components/Ausweis/Warmwasseranteil.svelte";
|
||||
import ThermischeKuehlung from "#components/Ausweis/ThermischeKuehlung.svelte";
|
||||
import LueftungundLeerstand from "#components/Ausweis/LueftungundLeerstand.svelte";
|
||||
@@ -17,53 +15,54 @@
|
||||
import AusweisPreviewContainer from "#components/Ausweis/AusweisPreviewContainer.svelte";
|
||||
|
||||
import Bereich from "#components/labels/Bereich.svelte";
|
||||
import HelpLabel from "#components/HelpLabel.svelte";
|
||||
import Verbrauch from "#components/Ausweis/Verbrauch.svelte";
|
||||
import StromVerbrauch from "#components/Ausweis/StromVerbrauch.svelte";
|
||||
import Label from "#components/Label.svelte";
|
||||
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
|
||||
import ZipSearch from "../../components/PlzSuche.svelte";
|
||||
import { buildingTypes } from "./BuildingTypes.js";
|
||||
import BilderZusatzsysteme from "../../components/Ausweis/BilderZusatzsysteme.svelte";
|
||||
import moment from "moment";
|
||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
|
||||
import { BenutzerClient } from "#components/Ausweis/types.js";
|
||||
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
|
||||
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import moment from "moment";
|
||||
|
||||
export let ausweis: VerbrauchsausweisGewerbeClient;
|
||||
export let user: BenutzerClient = {} as BenutzerClient;
|
||||
export let objekt: ObjektClient = {} as ObjektClient;
|
||||
export let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
export let bilder: UploadedGebaeudeBild[] = [];
|
||||
export let ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe;
|
||||
|
||||
export let Energieausweis = "Verbrauchsausweis Gewerbe";
|
||||
function automatischAusfüllen() {
|
||||
aufnahme.baujahr_gebaeude = [1952];
|
||||
aufnahme.baujahr_heizung = [1952];
|
||||
aufnahme.saniert = true;
|
||||
aufnahme.einheiten = 1;
|
||||
aufnahme.gebaeudetyp = "Polizeidienstgebäude";
|
||||
aufnahme.keller =
|
||||
Enums.Heizungsstatus.NICHT_VORHANDEN;
|
||||
aufnahme.dachgeschoss =
|
||||
Enums.Heizungsstatus.NICHT_VORHANDEN;
|
||||
aufnahme.lueftung = "Fensterlueftung";
|
||||
aufnahme.kuehlung = "1";
|
||||
ausweis.ausstellgrund = "Vermietung";
|
||||
ausweis.verbrauch_1 = 15000;
|
||||
ausweis.verbrauch_2 = 14000;
|
||||
ausweis.verbrauch_3 = 16000;
|
||||
aufnahme.flaeche = 152;
|
||||
aufnahme.nutzflaeche = 172;
|
||||
ausweis.keller_beheizt = true;
|
||||
|
||||
let aufnahme = ausweis.aufnahme || {};
|
||||
let gebaeude = ausweis.aufnahme?.objekt || {};
|
||||
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.aufnahme?.objekt?.gebaeude_bilder || [];
|
||||
aufnahme.brennstoff_1 = "Erdgas H";
|
||||
ausweis.einheit_1 = "kWh";
|
||||
ausweis.anteil_warmwasser_1 = 18;
|
||||
ausweis.startdatum = moment("01.01.2021").toDate();
|
||||
objekt.plz = "21039";
|
||||
objekt.ort = "Hamburg";
|
||||
objekt.adresse = "Curslacker Deich 170";
|
||||
aufnahme.gebaeudeteil = "Gesamtgebäude";
|
||||
|
||||
function automatischAusfüllen() {
|
||||
objekt = objekt;
|
||||
ausweis = ausweis;
|
||||
}
|
||||
|
||||
async function spaeterWeitermachen() {
|
||||
const result = await verbrauchsausweisWohnenSpeichern(
|
||||
ausweis,
|
||||
gebaeude,
|
||||
aufnahme,
|
||||
images,
|
||||
user
|
||||
);
|
||||
|
||||
if (result !== null) {
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = result.uid;
|
||||
gebaeude.uid = result.gebaeude_uid;
|
||||
aufnahme.uid = result.gebaeude_aufnahme_uid;
|
||||
window.history.pushState(
|
||||
{},
|
||||
"",
|
||||
`${location.pathname}?uid=${result.uid}`
|
||||
);
|
||||
speichernOverlayHidden = false;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -77,14 +76,15 @@
|
||||
<PerformanceScore
|
||||
bind:ausweis
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:objekt={gebaeude}
|
||||
bind:objekt={objekt}
|
||||
{ausweisart}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="progress-box" class="w-full box relative px-4 py-3 text-center order-1 2xl:order-2 self-stretch">
|
||||
|
||||
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
|
||||
<h2 class="text-primary text-xl">{Energieausweis} {PRICES.VerbrauchsausweisGewerbe[0]} €</h2>
|
||||
<h2 class="text-primary text-xl">Verbrauchsausweis Gewerbe {PRICES.VerbrauchsausweisGewerbe[0]} €</h2>
|
||||
<ProgressBar progress={0} />
|
||||
</div>
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
|
||||
<!-- TODO: Submit implementieren in externer Datei wenn Verbrauchsausweis Wohnen fertig ist -->
|
||||
|
||||
<form id="formInput-1" on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
|
||||
<form id="formInput-1" data-cy="ausweis" name="ausweis">
|
||||
<div id="formular-box" class="formular-boxen ring-0">
|
||||
|
||||
<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />
|
||||
@@ -103,10 +103,10 @@
|
||||
|
||||
<Bereich bereich="A" title="Prüfung der Ausweisart">
|
||||
<Ausweisart
|
||||
bind:gebaeude
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
ausweisart={Energieausweis}
|
||||
{ausweisart}
|
||||
/>
|
||||
</Bereich>
|
||||
|
||||
@@ -117,7 +117,8 @@
|
||||
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
|
||||
>
|
||||
<GebaeudeDaten
|
||||
bind:aufnahme />
|
||||
bind:aufnahme
|
||||
bind:objekt />
|
||||
</Bereich
|
||||
>
|
||||
|
||||
@@ -128,7 +129,7 @@
|
||||
title="Eingabe von 3 zusammenhängenden Verbrauchsjahren"
|
||||
>
|
||||
<StromVerbrauch
|
||||
bind:gebaeude
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/>
|
||||
@@ -158,8 +159,8 @@
|
||||
|
||||
<Bereich bereich="F" title="Angaben zur Heizunganlage"
|
||||
><SanierungszustandHeizungsanlage
|
||||
bind:images
|
||||
bind:gebaeude
|
||||
bind:images={bilder}
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
@@ -169,8 +170,8 @@
|
||||
|
||||
<Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
|
||||
><SanierungszustandFensterTueren
|
||||
bind:images
|
||||
bind:gebaeude
|
||||
bind:images={bilder}
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
@@ -179,8 +180,8 @@
|
||||
|
||||
<Bereich bereich="H" title="Angaben zur Wärmedämmung"
|
||||
><SanierungszustandWaermedammung
|
||||
bind:images
|
||||
bind:gebaeude
|
||||
bind:images={bilder}
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
@@ -190,19 +191,22 @@
|
||||
|
||||
<Bereich bereich="I" title="Gebäudebild und Energieausweis PDF Vorschau"
|
||||
><AusweisPreviewContainer
|
||||
bind:images
|
||||
bind:images={bilder}
|
||||
bind:ausweis
|
||||
bind:gebaeude
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
{ausweisart}
|
||||
/></Bereich>
|
||||
|
||||
</div>
|
||||
|
||||
<ButtonWeiterHilfe {spaeterWeitermachen}
|
||||
bind:ausweis
|
||||
bind:images
|
||||
bind:bilder
|
||||
bind:user
|
||||
bind:gebaeude
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
||||
>
|
||||
</ButtonWeiterHilfe>
|
||||
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
<script lang="ts">
|
||||
import { validateAccessTokenClient } from "#client/lib/validateAccessToken.js";
|
||||
import { verbrauchsausweisWohnenSpeichern } from "#client/lib/verbrauchsausweisWohnenSpeichern.js";
|
||||
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { addNotification } from "#components/Notifications/index.js";
|
||||
import Overlay from "#components/Overlay.svelte";
|
||||
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
|
||||
|
||||
import { api } from "astro-typesafe-api/client"
|
||||
|
||||
export let objekt: ObjektClient;
|
||||
export let bilder: UploadedGebaeudeBild[];
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let user: BenutzerClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
|
||||
async function ausweisSpeichern() {
|
||||
// Um einen Ausweis zu speichern müssen wir eingeloggt sein, andernfalls wird die API den call ablehnen.
|
||||
// Wir prüfen also ob wir eingeloggt sind und leiten den Nutzer ggf. auf die Login Seite weiter.
|
||||
if (!await validateAccessTokenClient()) {
|
||||
loginOverlayHidden = false;
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
|
||||
loginOverlayHidden = true;
|
||||
|
||||
// Wir speichern den Ausweis ab und leiten auf die "ausweis-gespeichert" Seite weiter.
|
||||
try {
|
||||
const response = await verbrauchsausweisWohnenSpeichern(ausweis,
|
||||
objekt,
|
||||
aufnahme,
|
||||
bilder)
|
||||
|
||||
if (response !== null) {
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = response.uid_ausweis;
|
||||
objekt.uid = response.uid_objekt;
|
||||
aufnahme.uid = response.uid_aufnahme;
|
||||
|
||||
return true
|
||||
}
|
||||
} catch (e: any) {
|
||||
console.log(e);
|
||||
|
||||
await api.ticket.PUT.fetch({
|
||||
titel: "Ausweis konnte nicht gespeichert werden",
|
||||
beschreibung: e.stack,
|
||||
email: user.email ?? "",
|
||||
metadata: JSON.stringify({
|
||||
ausweis,
|
||||
gebaeude: objekt
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
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 false
|
||||
}
|
||||
|
||||
async function ausweisAbschicken() {
|
||||
const result = await ausweisSpeichern();
|
||||
|
||||
if (result === true) {
|
||||
window.history.pushState(
|
||||
{},
|
||||
"",
|
||||
`${location.pathname}?uid=${ausweis.uid}`
|
||||
);
|
||||
window.location.href = `/kundendaten?uid=${ausweis.uid}`;
|
||||
}
|
||||
}
|
||||
|
||||
let loginOverlayHidden = true;
|
||||
</script>
|
||||
|
||||
<Overlay bind:hidden={loginOverlayHidden}>
|
||||
<div class="bg-white w-full max-w-screen-sm py-8">
|
||||
<EmbeddedAuthFlowModule onLogin={ausweisAbschicken}></EmbeddedAuthFlowModule>
|
||||
</div>
|
||||
</Overlay>
|
||||
|
||||
<button on:click={ausweisAbschicken} type="button" class="button" data-cy="weiter">Weiter</button>
|
||||
@@ -50,7 +50,6 @@
|
||||
ObjektClient,
|
||||
AufnahmeClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
|
||||
@@ -62,26 +61,27 @@
|
||||
export let bilder: UploadedGebaeudeBild[] = []
|
||||
|
||||
async function spaeterWeitermachen() {
|
||||
const result = await verbrauchsausweisWohnenSpeichern(
|
||||
ausweis,
|
||||
objekt,
|
||||
aufnahme,
|
||||
bilder
|
||||
);
|
||||
// TODO FIX
|
||||
// const result = await ausweisSpeichern(
|
||||
// ausweis,
|
||||
// objekt,
|
||||
// aufnahme,
|
||||
// bilder
|
||||
// );
|
||||
|
||||
if (result !== null) {
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = result.uid_ausweis;
|
||||
objekt.uid = result.uid_objekt;
|
||||
aufnahme.uid = result.uid_aufnahme;
|
||||
window.history.pushState(
|
||||
{},
|
||||
"",
|
||||
`${location.pathname}?uid=${result.uid_ausweis}`
|
||||
);
|
||||
speichernOverlayHidden = false;
|
||||
}
|
||||
// if (result !== null) {
|
||||
// // Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// // Sonst müsste er alles neu eingeben...
|
||||
// ausweis.uid = result.uid_ausweis;
|
||||
// objekt.uid = result.uid_objekt;
|
||||
// aufnahme.uid = result.uid_aufnahme;
|
||||
// window.history.pushState(
|
||||
// {},
|
||||
// "",
|
||||
// `${location.pathname}?uid=${result.uid_ausweis}`
|
||||
// );
|
||||
// speichernOverlayHidden = false;
|
||||
// }
|
||||
}
|
||||
|
||||
function automatischAusfüllen() {
|
||||
@@ -118,27 +118,27 @@
|
||||
}
|
||||
|
||||
async function ausweisAbschicken(e: SubmitEvent) {
|
||||
if (e && e.preventDefault) e.preventDefault();
|
||||
const result = await verbrauchsausweisWohnenSpeichern(
|
||||
ausweis,
|
||||
objekt,
|
||||
aufnahme,
|
||||
bilder
|
||||
);
|
||||
// if (e && e.preventDefault) e.preventDefault();
|
||||
// const result = await ausweisSpeichern(
|
||||
// ausweis,
|
||||
// objekt,
|
||||
// aufnahme,
|
||||
// bilder
|
||||
// );
|
||||
|
||||
if (result !== null) {
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = result.uid_ausweis;
|
||||
objekt.uid = result.uid_objekt;
|
||||
aufnahme.uid = result.uid_aufnahme;
|
||||
window.history.pushState(
|
||||
{},
|
||||
"",
|
||||
`${location.pathname}?uid=${result.uid_ausweis}`
|
||||
);
|
||||
// window.location.href = `/kundendaten?uid=${result.uid_ausweis}`;
|
||||
}
|
||||
// if (result !== null) {
|
||||
// // Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// // Sonst müsste er alles neu eingeben...
|
||||
// ausweis.uid = result.uid_ausweis;
|
||||
// objekt.uid = result.uid_objekt;
|
||||
// aufnahme.uid = result.uid_aufnahme;
|
||||
// window.history.pushState(
|
||||
// {},
|
||||
// "",
|
||||
// `${location.pathname}?uid=${result.uid_ausweis}`
|
||||
// );
|
||||
// // window.location.href = `/kundendaten?uid=${result.uid_ausweis}`;
|
||||
// }
|
||||
}
|
||||
|
||||
let waitOverlayHidden = true;
|
||||
@@ -185,6 +185,7 @@ lg:grid-cols-2 lg:gap-x-6
|
||||
bind:ausweis
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:objekt={objekt}
|
||||
{ausweisart}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -192,7 +193,7 @@ lg:grid-cols-2 lg:gap-x-6
|
||||
|
||||
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
|
||||
<h2 class="text-primary text-xl">{ausweisart} {PRICES.VerbrauchsausweisWohnen[0]} €</h2>
|
||||
<Progressbar progress={0} step1={'step'} />
|
||||
<Progressbar progress={0} step1={'step'} step2={''} step3={''}/>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -229,7 +230,7 @@ lg:grid-cols-2 lg:gap-x-6
|
||||
bereich="C"
|
||||
title="Eingabe von 3 zusammenhängenden Verbrauchsjahren"
|
||||
><Verbrauch
|
||||
bind:gebaeude={objekt}
|
||||
bind:objekt={objekt}
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
@@ -256,7 +257,7 @@ lg:grid-cols-2 lg:gap-x-6
|
||||
<Bereich bereich="F" title="Angaben zur Heizunganlage"
|
||||
><SanierungszustandHeizungsanlage
|
||||
bind:images={bilder}
|
||||
bind:gebaeude={objekt}
|
||||
bind:objekt={objekt}
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
@@ -267,7 +268,7 @@ lg:grid-cols-2 lg:gap-x-6
|
||||
<Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
|
||||
><SanierungszustandFensterTueren
|
||||
bind:images={bilder}
|
||||
bind:gebaeude={objekt}
|
||||
bind:objekt={objekt}
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
@@ -277,7 +278,7 @@ lg:grid-cols-2 lg:gap-x-6
|
||||
<Bereich bereich="H" title="Angaben zur Wärmedämmung"
|
||||
><SanierungszustandWaermedammung
|
||||
bind:images={bilder}
|
||||
bind:gebaeude={objekt}
|
||||
bind:objekt={objekt}
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:ausweis
|
||||
/></Bereich
|
||||
@@ -289,7 +290,9 @@ lg:grid-cols-2 lg:gap-x-6
|
||||
><AusweisPreviewContainer
|
||||
bind:images={bilder}
|
||||
bind:ausweis
|
||||
bind:gebaeude={objekt}
|
||||
bind:objekt={objekt}
|
||||
bind:aufnahme
|
||||
{ausweisart}
|
||||
/></Bereich
|
||||
>
|
||||
</div>
|
||||
@@ -300,6 +303,7 @@ lg:grid-cols-2 lg:gap-x-6
|
||||
bind:user
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||
>
|
||||
</ButtonWeiterHilfe>
|
||||
|
||||
|
||||
@@ -95,9 +95,9 @@ const gebaeude_aufnahme: AufnahmeClient = { flaeche: 152 }
|
||||
|
||||
<A2WaermequellenSolareEinstrahlungWintergarten></A2WaermequellenSolareEinstrahlungWintergarten>
|
||||
|
||||
<A5WaermeTransferMaxStroemeBauteile {ausweis} {gebaeude_aufnahme} client:load></A5WaermeTransferMaxStroemeBauteile>
|
||||
<A5WaermeTransferMaxStroemeBauteile {ausweis} {gebaeude_aufnahme}></A5WaermeTransferMaxStroemeBauteile>
|
||||
|
||||
<A6WaermeTransferMaxStroemeGesamt {ausweis} {gebaeude_aufnahme} client:load></A6WaermeTransferMaxStroemeGesamt>
|
||||
<A6WaermeTransferMaxStroemeGesamt {ausweis} {gebaeude_aufnahme}></A6WaermeTransferMaxStroemeGesamt>
|
||||
|
||||
<A7WaermequellenSolareEinstrahlung></A7WaermequellenSolareEinstrahlung>
|
||||
|
||||
@@ -105,7 +105,7 @@ const gebaeude_aufnahme: AufnahmeClient = { flaeche: 152 }
|
||||
|
||||
<A9NutzenergiebedarfTrinkwarmwasser {ausweis} {gebaeude_aufnahme}></A9NutzenergiebedarfTrinkwarmwasser>
|
||||
|
||||
<A10WaermequellenAnlagentechnikTrinkwarmwasser client:load></A10WaermequellenAnlagentechnikTrinkwarmwasser>
|
||||
<A10WaermequellenAnlagentechnikTrinkwarmwasser></A10WaermequellenAnlagentechnikTrinkwarmwasser>
|
||||
|
||||
<A11WaermequellenZusammenstellung></A11WaermequellenZusammenstellung>
|
||||
|
||||
|
||||
217
src/pages/api/bedarfsausweis-wohnen/[uid].ts
Normal file
217
src/pages/api/bedarfsausweis-wohnen/[uid].ts
Normal file
@@ -0,0 +1,217 @@
|
||||
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { BedarfsausweisWohnenSchema, prisma } from "@ibcornelsen/database/server";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { z } from "zod";
|
||||
|
||||
export const PATCH = defineApiRoute({
|
||||
input: BedarfsausweisWohnenSchema.omit({
|
||||
uid: true,
|
||||
id: true,
|
||||
benutzer_id: true,
|
||||
aufnahme_id: true,
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
"Authorization": z.string()
|
||||
},
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, ctx, user) {
|
||||
const objekt = await prisma.bedarfsausweisWohnen.findUnique({
|
||||
where: {
|
||||
uid: ctx.params.uid,
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
if (!objekt) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||
})
|
||||
}
|
||||
|
||||
await prisma.bedarfsausweisWohnen.update({
|
||||
where: {
|
||||
uid: ctx.params.uid
|
||||
},
|
||||
data: input
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
export const DELETE = defineApiRoute({
|
||||
meta: {
|
||||
description: "Storniert einen Ausweis"
|
||||
},
|
||||
headers: authorizationHeaders,
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, ctx, user) {
|
||||
const { uid } = ctx.params;
|
||||
|
||||
if (!UUidWithPrefix.safeParse(uid).success) {
|
||||
throw new APIError({
|
||||
code: "BAD_REQUEST",
|
||||
message: "UID konnte nicht verifiziert werden."
|
||||
})
|
||||
}
|
||||
|
||||
// Wir holen uns den Bedarfsausweis
|
||||
// Dieser MUSS mit dem Nutzer verknüpft sein.
|
||||
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
|
||||
where: {
|
||||
uid,
|
||||
},
|
||||
include: {
|
||||
aufnahme: {
|
||||
select: {
|
||||
storniert: true
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (!ausweis) {
|
||||
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Ausweis konnte nicht gefunden werden.",
|
||||
});
|
||||
}
|
||||
|
||||
// Wir dürfen den Ausweis nur stornieren, wenn er noch nicht ausgestellt wurde
|
||||
// Außerdem müssen wir schauen, ob wir Admin oder der Besitzer des Ausweises sind.
|
||||
if ((ausweis.benutzer_id !== user.id) && user.rolle !== "ADMIN") {
|
||||
// Falls der Ausweis nicht dem Nutzer gehört, werfen wir einen Fehler
|
||||
throw new APIError({
|
||||
code: "FORBIDDEN",
|
||||
message: "Ausweis gehört nicht dem Nutzer.",
|
||||
});
|
||||
}
|
||||
|
||||
// if (ausweis.erledigt) {
|
||||
// // Falls der Ausweis bereits ausgestellt wurde, werfen wir einen Fehler
|
||||
// throw new TRPCError({
|
||||
// code: "BAD_REQUEST",
|
||||
// message: "Ausweis wurde bereits ausgestellt.",
|
||||
// });
|
||||
// }
|
||||
|
||||
if (ausweis.aufnahme.storniert) {
|
||||
// Falls der Ausweis bereits storniert ist, werfen wir einen Fehler
|
||||
throw new APIError({
|
||||
code: "BAD_REQUEST",
|
||||
message: "Ausweis wurde bereits storniert.",
|
||||
});
|
||||
}
|
||||
|
||||
await prisma.aufnahme.update({
|
||||
where: {
|
||||
id: ausweis.aufnahme_id
|
||||
},
|
||||
data: {
|
||||
storniert: true
|
||||
}
|
||||
})
|
||||
|
||||
// Wir erstellen ein Event, dass der Ausweis storniert wurde
|
||||
// Dann können wir das in der Historie anzeigen
|
||||
await prisma.event.create({
|
||||
data: {
|
||||
title: "Ausweis storniert",
|
||||
description: ((user.rolle === "ADMIN") && (ausweis.benutzer_id !== user.id)) ? "Ausweis wurde von einem Administrator storniert." : "Ausweis wurde vom Besitzer storniert.",
|
||||
benutzer: {
|
||||
connect: {
|
||||
id: user.id
|
||||
}
|
||||
},
|
||||
aufnahme: {
|
||||
connect: {
|
||||
id: ausweis.aufnahme_id
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
export const GET = defineApiRoute({
|
||||
meta: {
|
||||
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
|
||||
tags: ["Gebäude"],
|
||||
headers: {
|
||||
"Authorization": {
|
||||
description: "Ein gültiger Authentifizierungstoken",
|
||||
required: true,
|
||||
allowEmptyValue: false,
|
||||
examples: {
|
||||
Bearer: {
|
||||
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
output: ZodOverlap<OptionalNullable<BedarfsausweisWohnenClient>>(BedarfsausweisWohnenSchema.merge(z.object({
|
||||
uid_aufnahme: UUidWithPrefix,
|
||||
uid_objekt: UUidWithPrefix,
|
||||
uid_benutzer: UUidWithPrefix.optional()
|
||||
})).omit({
|
||||
id: true,
|
||||
aufnahme_id: true,
|
||||
benutzer_id: true
|
||||
})),
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, context, user) {
|
||||
const { uid } = context.params;
|
||||
|
||||
if (!uid) {
|
||||
throw new APIError({
|
||||
code: "BAD_REQUEST",
|
||||
message: "Missing uid in request params"
|
||||
})
|
||||
}
|
||||
|
||||
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
|
||||
where: {
|
||||
uid,
|
||||
benutzer_id: user.id
|
||||
},
|
||||
include: {
|
||||
benutzer: {
|
||||
select: {
|
||||
uid: true
|
||||
}
|
||||
},
|
||||
aufnahme: {
|
||||
select: {
|
||||
uid: true,
|
||||
objekt: {
|
||||
select: {
|
||||
uid: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (!ausweis) {
|
||||
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Ausweis konnte nicht gefunden werden.",
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
uid_aufnahme: ausweis.aufnahme.uid,
|
||||
uid_objekt: ausweis.aufnahme.objekt.uid,
|
||||
uid_benutzer: ausweis.benutzer?.uid,
|
||||
...exclude(ausweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,146 @@
|
||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { BedarfsausweisWohnenSchema, prisma } from "@ibcornelsen/database/server";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { z } from "zod";
|
||||
|
||||
export const PUT = defineApiRoute({
|
||||
meta: {
|
||||
contentTypes: ["application/json"],
|
||||
description:
|
||||
"Erstellt einen neuen Bedarfsausweis für Wohngebäude nach dem Schema der EnEV von 2016. Als Input wird ein bestehendes Gebäude benötigt. Falls keine UID einer bestehenden Gebäudeaufnahme mitgegeben wird, wird automatisch eine erstellt.",
|
||||
tags: ["Bedarfsausweis Wohnen"],
|
||||
},
|
||||
input: z.object({
|
||||
ausweis: BedarfsausweisWohnenSchema.omit({
|
||||
id: true,
|
||||
benutzer_id: true,
|
||||
uid: true,
|
||||
aufnahme_id: true
|
||||
}),
|
||||
uid_aufnahme: UUidWithPrefix
|
||||
}),
|
||||
output: z.object({
|
||||
uid: UUidWithPrefix,
|
||||
objekt_uid: UUidWithPrefix,
|
||||
aufnahme_uid: UUidWithPrefix,
|
||||
}),
|
||||
headers: authorizationHeaders,
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, ctx, user) {
|
||||
const aufnahme = await prisma.aufnahme.findUnique({
|
||||
where: {
|
||||
uid: input.uid_aufnahme
|
||||
}
|
||||
})
|
||||
|
||||
if (!aufnahme || aufnahme.benutzer_id !== user.id) {
|
||||
throw new APIError({
|
||||
code: "FORBIDDEN",
|
||||
message: "Aufnahme konnte nicht gefunden werden oder gehört nicht zu diesem Benutzer."
|
||||
})
|
||||
}
|
||||
|
||||
const createdAusweis = await prisma.bedarfsausweisWohnen.create({
|
||||
data: {
|
||||
...input.ausweis,
|
||||
benutzer: {
|
||||
connect: {
|
||||
id: user.id,
|
||||
},
|
||||
},
|
||||
aufnahme: {
|
||||
connect: {
|
||||
uid: aufnahme.uid,
|
||||
},
|
||||
},
|
||||
},
|
||||
select: {
|
||||
uid: true,
|
||||
aufnahme: {
|
||||
select: {
|
||||
uid: true,
|
||||
objekt: {
|
||||
select: {
|
||||
uid: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
uid: createdAusweis.uid,
|
||||
objekt_uid: createdAusweis.aufnahme.objekt.uid,
|
||||
aufnahme_uid: createdAusweis.aufnahme.uid,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const GET = defineApiRoute({
|
||||
meta: {
|
||||
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
|
||||
tags: ["Gebäude"],
|
||||
headers: {
|
||||
Authorization: {
|
||||
description: "Ein gültiger Authentifizierungstoken",
|
||||
required: true,
|
||||
allowEmptyValue: false,
|
||||
examples: {
|
||||
Bearer: {
|
||||
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, context, user) {
|
||||
const { uid } = context.params;
|
||||
|
||||
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
|
||||
where: {
|
||||
uid,
|
||||
},
|
||||
include: {
|
||||
benutzer: true,
|
||||
aufnahme: {
|
||||
include: {
|
||||
objekt: {
|
||||
include: {
|
||||
gebaeude_bilder: true,
|
||||
},
|
||||
},
|
||||
rechnungen: true,
|
||||
events: {
|
||||
include: {
|
||||
benutzer: {
|
||||
select: {
|
||||
uid: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
orderBy: {
|
||||
date: "asc",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (
|
||||
!ausweis ||
|
||||
(ausweis.benutzer_id !== null && ausweis.benutzer_id !== user.id)
|
||||
) {
|
||||
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Ausweis konnte nicht gefunden werden.",
|
||||
});
|
||||
}
|
||||
|
||||
return ausweis;
|
||||
},
|
||||
});
|
||||
|
||||
@@ -59,10 +59,10 @@ export const GET = defineApiRoute({
|
||||
}
|
||||
}
|
||||
},
|
||||
output: ZodOverlap<OptionalNullable<ObjektClient>>(ObjektSchema.omit({
|
||||
output: ObjektSchema.omit({
|
||||
benutzer_id: true,
|
||||
id: true
|
||||
})),
|
||||
}),
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, ctx, user) {
|
||||
const { uid } = ctx.params;
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import { z } from "zod";
|
||||
import { Enums, RechnungSchema, prisma } from "@ibcornelsen/database/server";
|
||||
import { TRPCError } from "@trpc/server";
|
||||
import { BedarfsausweisWohnen, Enums, RechnungSchema, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen, prisma } from "@ibcornelsen/database/server";
|
||||
import { mollieClient } from "#lib/mollie.js";
|
||||
import { PaymentMethod } from "@mollie/api-client";
|
||||
import { defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import {
|
||||
authorizationHeaders,
|
||||
authorizationMiddleware,
|
||||
} from "#lib/middleware/authorization.js";
|
||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||
|
||||
export const PUT = defineApiRoute({
|
||||
meta: {
|
||||
@@ -20,11 +20,12 @@ export const PUT = defineApiRoute({
|
||||
input: z
|
||||
.object({
|
||||
ausweisart: z.nativeEnum(Enums.Ausweisart),
|
||||
uid: z.string().uuid(),
|
||||
ausweis_uid: UUidWithPrefix,
|
||||
})
|
||||
.merge(
|
||||
RechnungSchema.omit({
|
||||
benutzer_id: true,
|
||||
aufnahme_id: true,
|
||||
bezahlt_am: true,
|
||||
erstellt_am: true,
|
||||
id: true,
|
||||
@@ -37,7 +38,7 @@ export const PUT = defineApiRoute({
|
||||
),
|
||||
output: z.object({
|
||||
checkout_url: z.string(),
|
||||
uid: z.string().uuid(),
|
||||
uid: UUidWithPrefix,
|
||||
}),
|
||||
headers: authorizationHeaders,
|
||||
middleware: authorizationMiddleware,
|
||||
@@ -45,98 +46,100 @@ export const PUT = defineApiRoute({
|
||||
// Wir erstellen eine Mollie Payment Referenz und eine neue Rechnung in unserer Datenbank, daraufhin geben
|
||||
// wir eine Checkout URL zurück auf die der Nutzer weitergeleitet werden kann.
|
||||
|
||||
const { uid, ausweisart, bezahlmethode, services } = input;
|
||||
const { ausweis_uid, ausweisart, bezahlmethode, services } = input;
|
||||
|
||||
// TODO: Services Implementieren
|
||||
|
||||
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||
if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
throw new TRPCError({
|
||||
code: "BAD_REQUEST",
|
||||
message: "Bedarfsausweis Wohnen wird noch nicht unterstützt.",
|
||||
});
|
||||
ausweis = await prisma.bedarfsausweisWohnen.findUnique({
|
||||
where: {
|
||||
uid: ausweis_uid
|
||||
}
|
||||
})
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
throw new TRPCError({
|
||||
code: "BAD_REQUEST",
|
||||
message:
|
||||
"Verbrauchsausweis Gewerbe wird noch nicht unterstützt.",
|
||||
});
|
||||
ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({
|
||||
where: {
|
||||
uid: ausweis_uid
|
||||
}
|
||||
})
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
// Wir müssen überprüfen, ob dem Nutzer der Ausweis tatsächlich gehört.
|
||||
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||
ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||
where: {
|
||||
uid,
|
||||
uid: ausweis_uid,
|
||||
},
|
||||
});
|
||||
|
||||
if (!ausweis) {
|
||||
throw new TRPCError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Ausweis nicht gefunden.",
|
||||
});
|
||||
}
|
||||
|
||||
if (ausweis.benutzer_id !== user.id) {
|
||||
throw new TRPCError({
|
||||
code: "UNAUTHORIZED",
|
||||
message: "Ausweis gehört nicht dem Nutzer.",
|
||||
});
|
||||
}
|
||||
|
||||
// Wir erstellen eine neue Rechnung in unserer Datenbank.
|
||||
const rechnung = await prisma.rechnung.create({
|
||||
data: {
|
||||
benutzer_id: user.id,
|
||||
betrag: 0,
|
||||
bezahlmethode: bezahlmethode,
|
||||
status: Enums.Rechnungsstatus.open,
|
||||
aufnahme_id: ausweis.aufnahme_id,
|
||||
},
|
||||
select: {
|
||||
uid: true,
|
||||
betrag: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (!rechnung) {
|
||||
throw new TRPCError({
|
||||
code: "INTERNAL_SERVER_ERROR",
|
||||
message: "Rechnung konnte nicht erstellt werden.",
|
||||
});
|
||||
}
|
||||
|
||||
// Wir erstellen eine Mollie Payment Referenz.
|
||||
const payment = await mollieClient.payments.create({
|
||||
amount: {
|
||||
value: "45.00",
|
||||
currency: "EUR",
|
||||
},
|
||||
metadata: {
|
||||
rechnung_uid: rechnung.uid,
|
||||
},
|
||||
method: input.bezahlmethode as PaymentMethod,
|
||||
description: "Verbrauchsausweis Wohnen 2016",
|
||||
redirectUrl: "https://ibcornelsen.de/payment/success",
|
||||
webhookUrl: "http://api.ibcornelsen.de/v1/webhooks/mollie",
|
||||
});
|
||||
|
||||
const checkoutUrl = payment.getCheckoutUrl();
|
||||
|
||||
if (!checkoutUrl) {
|
||||
throw new TRPCError({
|
||||
code: "INTERNAL_SERVER_ERROR",
|
||||
message: "Checkout URL konnte nicht erstellt werden.",
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
uid: rechnung.uid,
|
||||
checkout_url: checkoutUrl,
|
||||
};
|
||||
} else {
|
||||
throw new TRPCError({
|
||||
throw new APIError({
|
||||
code: "BAD_REQUEST",
|
||||
message: "Ausweisart nicht unterstützt.",
|
||||
});
|
||||
}
|
||||
|
||||
if (!ausweis) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Ausweis nicht gefunden.",
|
||||
});
|
||||
}
|
||||
|
||||
if (ausweis.benutzer_id !== user.id) {
|
||||
throw new APIError({
|
||||
code: "UNAUTHORIZED",
|
||||
message: "Ausweis gehört nicht dem Nutzer.",
|
||||
});
|
||||
}
|
||||
|
||||
// Wir erstellen eine neue Rechnung in unserer Datenbank.
|
||||
const rechnung = await prisma.rechnung.create({
|
||||
data: {
|
||||
benutzer_id: user.id,
|
||||
betrag: 0,
|
||||
bezahlmethode: bezahlmethode,
|
||||
status: Enums.Rechnungsstatus.open,
|
||||
aufnahme_id: ausweis.aufnahme_id,
|
||||
},
|
||||
select: {
|
||||
uid: true,
|
||||
betrag: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (!rechnung) {
|
||||
throw new APIError({
|
||||
code: "INTERNAL_SERVER_ERROR",
|
||||
message: "Rechnung konnte nicht erstellt werden.",
|
||||
});
|
||||
}
|
||||
|
||||
// Wir erstellen eine Mollie Payment Referenz.
|
||||
const payment = await mollieClient.payments.create({
|
||||
amount: {
|
||||
value: "45.00",
|
||||
currency: "EUR",
|
||||
},
|
||||
metadata: {
|
||||
rechnung_uid: rechnung.uid,
|
||||
},
|
||||
method: input.bezahlmethode as PaymentMethod,
|
||||
description: "Verbrauchsausweis Wohnen 2016",
|
||||
redirectUrl: "https://ibcornelsen.de/payment/success",
|
||||
webhookUrl: `http://ibcornelsen.de/api/webhooks/mollie?uid=${rechnung.uid}`,
|
||||
});
|
||||
|
||||
const checkoutUrl = payment.getCheckoutUrl();
|
||||
|
||||
if (!checkoutUrl) {
|
||||
throw new APIError({
|
||||
code: "INTERNAL_SERVER_ERROR",
|
||||
message: "Checkout URL konnte nicht erstellt werden.",
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
uid: rechnung.uid,
|
||||
checkout_url: checkoutUrl,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -4,16 +4,12 @@ import { prisma, VerbrauchsausweisGewerbeSchema } from "@ibcornelsen/database/se
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { z } from "zod";
|
||||
|
||||
export const PATCH = defineApiRoute({
|
||||
fetch(input, context) {},
|
||||
});
|
||||
|
||||
export const PUT = defineApiRoute({
|
||||
meta: {
|
||||
contentTypes: ["application/json"],
|
||||
description:
|
||||
"Erstellt einen neuen Verbrauchsausweis für Gewerbegebäude nach dem Schema der EnEV von 2016. Als Input wird ein bestehendes Gebäude benötigt. Falls keine UID einer bestehenden Gebäudeaufnahme mitgegeben wird, wird automatisch eine erstellt.",
|
||||
tags: ["Verbrauchsausweis Wohnen"],
|
||||
tags: ["Verbrauchsausweis Gewerbe"],
|
||||
},
|
||||
input: z.object({
|
||||
ausweis: VerbrauchsausweisGewerbeSchema.omit({
|
||||
|
||||
63
src/pages/api/webhooks/mollie.ts
Normal file
63
src/pages/api/webhooks/mollie.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
* Der Webhook wird von Mollie ausgelöst, wenn sich der Status einer Transaktion ändert.
|
||||
* https://docs.mollie.com/overview/webhooks
|
||||
* @param _props { id: string }
|
||||
*/
|
||||
|
||||
import { z } from "zod";
|
||||
import { Enums, prisma } from "@ibcornelsen/database/server";
|
||||
import { mollieClient } from "#lib/mollie.js";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
|
||||
export const POST = defineApiRoute({
|
||||
input: z.object({
|
||||
id: z.string(),
|
||||
}),
|
||||
output: z.void(),
|
||||
async fetch(input, ctx) {
|
||||
const { id } = input;
|
||||
|
||||
// Wir holen uns die Transaktion von Mollie.
|
||||
const payment = await mollieClient.payments.get(id);
|
||||
const metadata = payment.metadata as { rechnung_uid: string }
|
||||
|
||||
if (!payment) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Transaktion nicht gefunden.",
|
||||
});
|
||||
}
|
||||
|
||||
if (!metadata.rechnung_uid) {
|
||||
throw new APIError({
|
||||
code: "BAD_REQUEST",
|
||||
message: "Rechnung UID nicht gefunden.",
|
||||
});
|
||||
}
|
||||
|
||||
// Wir holen uns die Rechnung aus unserer Datenbank.
|
||||
const rechnung = await prisma.rechnung.findUnique({
|
||||
where: {
|
||||
uid: metadata.rechnung_uid,
|
||||
},
|
||||
});
|
||||
|
||||
if (!rechnung) {
|
||||
throw new APIError({
|
||||
code: "NOT_FOUND",
|
||||
message: "Rechnung nicht gefunden.",
|
||||
});
|
||||
}
|
||||
|
||||
// Wir aktualisieren den Status der Rechnung.
|
||||
await prisma.rechnung.update({
|
||||
where: {
|
||||
id: rechnung.id,
|
||||
},
|
||||
data: {
|
||||
status: payment.status as Enums.Rechnungsstatus,
|
||||
transaktions_referenz: payment.id,
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
@@ -2,26 +2,73 @@
|
||||
|
||||
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
|
||||
import BedarfsausweisWohnenModule from "#modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte";
|
||||
import { BedarfsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { createCaller } from "#lib/caller";
|
||||
import { AufnahmeClient, BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { createCaller } from "src/astro-typesafe-api-caller";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
|
||||
const uid = Astro.url.searchParams.get("uid");
|
||||
let ausweis: Partial<BedarfsausweisWohnenClient> = {
|
||||
aufnahme: { objekt: {} },
|
||||
energiequelle_2_nutzung: []
|
||||
} as Partial<BedarfsausweisWohnenClient>;
|
||||
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
|
||||
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
let objekt: ObjektClient = {} as ObjektClient;
|
||||
let bilder: UploadedGebaeudeBild[] = []
|
||||
|
||||
const valid = validateAccessTokenServer(Astro);
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
if (uid) {
|
||||
ausweis = await caller.v1.bedarfsausweisWohen.get({
|
||||
uid: uid,
|
||||
});
|
||||
if (!valid) {
|
||||
return Astro.redirect(
|
||||
`/auth/login?redirect=${Astro.url.toString()}`
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if (!ausweis) {
|
||||
// Der Ausweis scheint nicht zu existieren.
|
||||
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
|
||||
try {
|
||||
ausweis = await caller["bedarfsausweis-wohnen"]._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid
|
||||
}
|
||||
});
|
||||
|
||||
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_aufnahme
|
||||
}
|
||||
})
|
||||
|
||||
objekt = await caller.objekt._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
}
|
||||
})
|
||||
|
||||
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
}
|
||||
})
|
||||
|
||||
if (!ausweis) {
|
||||
// Der Ausweis scheint nicht zu existieren.
|
||||
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/bedarfsausweis-wohnen"
|
||||
);
|
||||
}
|
||||
} catch(e) {
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/bedarfsausweis-wohnen"
|
||||
);
|
||||
@@ -31,5 +78,5 @@ if (uid) {
|
||||
|
||||
---
|
||||
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen">
|
||||
<BedarfsausweisWohnenModule client:load ausweis={ausweis}></BedarfsausweisWohnenModule>
|
||||
<BedarfsausweisWohnenModule client:load {ausweis} {objekt} {aufnahme} {bilder}></BedarfsausweisWohnenModule>
|
||||
</AusweisLayout>
|
||||
@@ -1,33 +1,83 @@
|
||||
---
|
||||
|
||||
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
|
||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types";
|
||||
import { createCaller } from "../../../astro-typesafe-api-caller.js";
|
||||
import { inferOutput } from "astro-typesafe-api/client";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte";
|
||||
import { VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { createCaller } from "#lib/caller";
|
||||
|
||||
const uid = Astro.url.searchParams.get("uid");
|
||||
let ausweis: VerbrauchsausweisGewerbeClient = {
|
||||
aufnahme: { objekt: {} },
|
||||
} as VerbrauchsausweisGewerbeClient;
|
||||
let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient;
|
||||
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
let objekt: ObjektClient = {} as ObjektClient;
|
||||
let bilder: UploadedGebaeudeBild[] = []
|
||||
|
||||
const valid = validateAccessTokenServer(Astro);
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
if (uid) {
|
||||
ausweis = await caller.v1.verbrauchsausweisGewerbe.get({
|
||||
uid: uid,
|
||||
});
|
||||
|
||||
if (!ausweis) {
|
||||
// Der Ausweis scheint nicht zu existieren.
|
||||
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
|
||||
if (!valid) {
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-wohnen"
|
||||
`/auth/login?redirect=${Astro.url.toString()}`
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
let { uid_aufnahme, uid_objekt, uid_benutzer, ...result } = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid
|
||||
}
|
||||
});
|
||||
|
||||
ausweis = result
|
||||
|
||||
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: uid_aufnahme
|
||||
}
|
||||
})
|
||||
|
||||
objekt = await caller.objekt._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: uid_objekt
|
||||
}
|
||||
})
|
||||
|
||||
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: uid_objekt
|
||||
}
|
||||
})
|
||||
|
||||
if (!ausweis) {
|
||||
// Der Ausweis scheint nicht zu existieren.
|
||||
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
|
||||
);
|
||||
}
|
||||
} catch(e) {
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
<AusweisLayout title="Verbrauchsausweis Gewerbe erstellen | IBCornelsen">
|
||||
<VerbrauchsausweisGewerbeModule client:load ausweis={ausweis}></VerbrauchsausweisGewerbeModule>
|
||||
<VerbrauchsausweisGewerbeModule client:load {ausweis} {objekt} {aufnahme} {bilder} />
|
||||
</AusweisLayout>
|
||||
80
src/pages/immowelt/index.astro
Normal file
80
src/pages/immowelt/index.astro
Normal file
@@ -0,0 +1,80 @@
|
||||
---
|
||||
import AusweisLayoutImmowelt from "#layouts/AusweisLayoutDatenImmowelt.astro";
|
||||
import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
|
||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { createCaller } from "../../astro-typesafe-api-caller.js";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
|
||||
const uid = Astro.url.searchParams.get("uid");
|
||||
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
|
||||
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
let objekt: ObjektClient = {} as ObjektClient;
|
||||
let bilder: UploadedGebaeudeBild[] = []
|
||||
|
||||
const valid = validateAccessTokenServer(Astro);
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
if (uid) {
|
||||
if (!valid) {
|
||||
return Astro.redirect(
|
||||
`/auth/login?redirect=${Astro.url.toString()}`
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid
|
||||
}
|
||||
});
|
||||
|
||||
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_aufnahme
|
||||
}
|
||||
})
|
||||
|
||||
objekt = await caller.objekt._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
}
|
||||
})
|
||||
|
||||
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
}
|
||||
})
|
||||
|
||||
if (!ausweis) {
|
||||
// Der Ausweis scheint nicht zu existieren.
|
||||
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-wohnen"
|
||||
);
|
||||
}
|
||||
} catch(e) {
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-wohnen"
|
||||
);
|
||||
}
|
||||
}
|
||||
---
|
||||
|
||||
<AusweisLayoutImmowelt title="Verbrauchsausweis erstellen">
|
||||
<VerbrauchsausweisWohnenModule client:load {ausweis} {objekt} {aufnahme} {bilder} />
|
||||
</AusweisLayoutImmowelt>
|
||||
80
src/pages/immowelt/verbrauchsausweis-erstellen/index.astro
Normal file
80
src/pages/immowelt/verbrauchsausweis-erstellen/index.astro
Normal file
@@ -0,0 +1,80 @@
|
||||
---
|
||||
import AusweisLayoutImmowelt from "#layouts/AusweisLayoutDatenImmowelt2.astro";
|
||||
import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
|
||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { createCaller } from "../../../astro-typesafe-api-caller.js";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
|
||||
const uid = Astro.url.searchParams.get("uid");
|
||||
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
|
||||
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
let objekt: ObjektClient = {} as ObjektClient;
|
||||
let bilder: UploadedGebaeudeBild[] = []
|
||||
|
||||
const valid = validateAccessTokenServer(Astro);
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
if (uid) {
|
||||
if (!valid) {
|
||||
return Astro.redirect(
|
||||
`/auth/login?redirect=${Astro.url.toString()}`
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid
|
||||
}
|
||||
});
|
||||
|
||||
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_aufnahme
|
||||
}
|
||||
})
|
||||
|
||||
objekt = await caller.objekt._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
}
|
||||
})
|
||||
|
||||
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
}
|
||||
})
|
||||
|
||||
if (!ausweis) {
|
||||
// Der Ausweis scheint nicht zu existieren.
|
||||
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-wohnen"
|
||||
);
|
||||
}
|
||||
} catch(e) {
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-wohnen"
|
||||
);
|
||||
}
|
||||
}
|
||||
---
|
||||
|
||||
<AusweisLayoutImmowelt title="Verbrauchsausweis erstellen">
|
||||
<VerbrauchsausweisWohnenModule client:load {ausweis} {objekt} {aufnahme} {bilder} />
|
||||
</AusweisLayoutImmowelt>
|
||||
@@ -6,6 +6,7 @@ import { Enums } from "@ibcornelsen/database/client";
|
||||
import { createCaller } from "../astro-typesafe-api-caller";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
import { BedarfsausweisWohnenClient, getAusweisartFromUUID, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
|
||||
// Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde.
|
||||
const uid = Astro.url.searchParams.get("uid");
|
||||
@@ -18,14 +19,39 @@ if (!uid || !valid) {
|
||||
|
||||
const caller = createCaller(Astro)
|
||||
|
||||
const ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid
|
||||
}
|
||||
})
|
||||
const ausweisart = getAusweisartFromUUID(uid);
|
||||
|
||||
let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid
|
||||
}
|
||||
})
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
ausweis = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid
|
||||
}
|
||||
})
|
||||
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
ausweis = await caller["bedarfsausweis-wohnen"]._uid.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid
|
||||
}
|
||||
})
|
||||
} else {
|
||||
return Astro.redirect("/404")
|
||||
}
|
||||
|
||||
const aufnahme = await caller.aufnahme._uid.GET.fetch(undefined, {
|
||||
headers: {
|
||||
@@ -62,6 +88,6 @@ if (!ausweis || !user) {
|
||||
---
|
||||
|
||||
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
|
||||
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} selectedPaymentType={Enums.Bezahlmethoden.paypal} client:load></KundendatenModule>
|
||||
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} {ausweisart} selectedPaymentType={Enums.Bezahlmethoden.paypal} client:load></KundendatenModule>
|
||||
</AusweisLayout>
|
||||
|
||||
|
||||
@@ -1,10 +1,39 @@
|
||||
---
|
||||
|
||||
import { prisma } from "@ibcornelsen/database/server";
|
||||
import Layout from "../../layouts/Layout.astro";
|
||||
import { createCaller } from "../../astro-typesafe-api-caller.js";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
|
||||
const { uid } = Astro.params;
|
||||
|
||||
const caller = createCaller(Astro)
|
||||
|
||||
|
||||
const user = await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
|
||||
if (!uid || !user) {
|
||||
return Astro.redirect("/")
|
||||
}
|
||||
|
||||
const rechnung = await prisma.rechnung.findUnique({
|
||||
where: {
|
||||
uid: uid,
|
||||
benutzer_id: user.id
|
||||
}
|
||||
})
|
||||
|
||||
if (!rechnung) {
|
||||
return Astro.redirect("/404")
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
<Layout title="Zahlung Erfolgreich - IBCornelsen">
|
||||
Supa! Hat geklappt ne!
|
||||
{rechnung.uid}
|
||||
</Layout>
|
||||
@@ -1,86 +0,0 @@
|
||||
---
|
||||
import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { createCaller } from "src/astro-typesafe-api-caller";
|
||||
|
||||
const base64 = Astro.url.searchParams.get("base64");
|
||||
let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null;
|
||||
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
let objekt: ObjektClient = {} as ObjektClient;
|
||||
let user: BenutzerClient = {} as BenutzerClient;
|
||||
let images: UploadedGebaeudeBild[] = []
|
||||
if (base64) {
|
||||
const buffer = Buffer.from(base64, "base64");
|
||||
const json = buffer.toString("utf-8");
|
||||
ausweis = JSON.parse(json) as VerbrauchsausweisWohnenClient;
|
||||
} else {
|
||||
const uidAusweis = Astro.url.searchParams.get("uid");
|
||||
|
||||
if (!uidAusweis) {
|
||||
return Astro.redirect("/404");
|
||||
}
|
||||
|
||||
const ausweisart = getAusweisartFromUUID(uidAusweis)
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: uidAusweis
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
ausweis = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: uidAusweis
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if (!ausweis) {
|
||||
return Astro.redirect("/");
|
||||
}
|
||||
|
||||
aufnahme = await caller.aufnahme._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: ausweis.uid_aufnahme
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
|
||||
objekt = await caller.objekt._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
|
||||
user = await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, images, user);
|
||||
|
||||
return new Response(pdf, {
|
||||
headers: {
|
||||
"Content-Type": "application/pdf",
|
||||
},
|
||||
});
|
||||
---
|
||||
125
src/pages/pdf/ansichtsausweis.ts
Normal file
125
src/pages/pdf/ansichtsausweis.ts
Normal file
@@ -0,0 +1,125 @@
|
||||
import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
|
||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { APIRoute } from "astro";
|
||||
import { createCaller } from "src/astro-typesafe-api-caller.js";
|
||||
|
||||
export const GET: APIRoute = async (Astro) => {
|
||||
const uidAusweis = Astro.url.searchParams.get("uid");
|
||||
|
||||
if (!uidAusweis) {
|
||||
return Astro.redirect("/404")
|
||||
}
|
||||
|
||||
const ausweisart = getAusweisartFromUUID(uidAusweis)
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null;
|
||||
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
let objekt: ObjektClient = {} as ObjektClient;
|
||||
let user: BenutzerClient = {} as BenutzerClient;
|
||||
let bilder: UploadedGebaeudeBild[] = []
|
||||
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: uidAusweis
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
ausweis = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: uidAusweis
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if (!ausweis) {
|
||||
return Astro.redirect("/");
|
||||
}
|
||||
|
||||
aufnahme = await caller.aufnahme._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: ausweis.uid_aufnahme
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
|
||||
objekt = await caller.objekt._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
|
||||
user = await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
|
||||
let pdf: Uint8Array<ArrayBufferLike> | null = null;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
pdf = await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user);
|
||||
}
|
||||
|
||||
return new Response(pdf, {
|
||||
headers: {
|
||||
"Content-Type": "application/pdf",
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export const POST: APIRoute = async (Astro) => {
|
||||
const body = await Astro.request.text();
|
||||
const params = new URLSearchParams(body);
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
const ausweis = JSON.parse(params.get("ausweis"));
|
||||
const aufnahme = JSON.parse(params.get("aufnahme"));
|
||||
const objekt = JSON.parse(params.get("objekt"));
|
||||
const bilder = JSON.parse(params.get("bilder"));
|
||||
const ausweisart: Enums.Ausweisart = params.get("ausweisart")
|
||||
|
||||
let user: BenutzerClient = {};
|
||||
|
||||
try {
|
||||
user = await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
|
||||
let pdf: Uint8Array<ArrayBufferLike> | null = null;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
pdf = await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user);
|
||||
}
|
||||
|
||||
return new Response(pdf, {
|
||||
headers: {
|
||||
"Content-Type": "application/pdf",
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -1,14 +1,25 @@
|
||||
---
|
||||
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { createCaller } from "#lib/caller";
|
||||
import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen";
|
||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { createCaller } from "src/astro-typesafe-api-caller";
|
||||
|
||||
const base64 = Astro.url.searchParams.get("base64");
|
||||
let ausweis: VerbrauchsausweisWohnenClient | null = null;
|
||||
if (base64) {
|
||||
const buffer = Buffer.from(base64, "base64");
|
||||
const json = buffer.toString("utf-8");
|
||||
ausweis = JSON.parse(json) as VerbrauchsausweisWohnenClient;
|
||||
const base64Ausweis = Astro.url.searchParams.get("ausweis");
|
||||
const base64Aufnahme = Astro.url.searchParams.get("aufnahme");
|
||||
const base64Objekt = Astro.url.searchParams.get("objekt");
|
||||
const base64Bilder = Astro.url.searchParams.get("bilder");
|
||||
let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null;
|
||||
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
let objekt: ObjektClient = {} as ObjektClient;
|
||||
let benutzer: BenutzerClient = {} as BenutzerClient;
|
||||
let bilder: UploadedGebaeudeBild[] = []
|
||||
if (base64Ausweis && base64Aufnahme && base64Objekt && base64Bilder) {
|
||||
ausweis = JSON.parse(Buffer.from(base64Ausweis, "base64").toString("utf-8")) as VerbrauchsausweisWohnenClient;
|
||||
objekt = JSON.parse(Buffer.from(base64Objekt, "base64").toString("utf-8")) as ObjektClient;
|
||||
aufnahme = JSON.parse(Buffer.from(base64Aufnahme, "base64").toString("utf-8")) as AufnahmeClient;
|
||||
bilder = JSON.parse(Buffer.from(base64Bilder, "base64").toString("utf-8")) as UploadedGebaeudeBild[];
|
||||
} else {
|
||||
const uidAusweis = Astro.url.searchParams.get("uid");
|
||||
|
||||
@@ -16,14 +27,61 @@ if (base64) {
|
||||
return Astro.redirect("/404");
|
||||
}
|
||||
|
||||
const ausweisart = getAusweisartFromUUID(uidAusweis)
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
ausweis = await caller.v1.verbrauchsausweisWohnen.get({
|
||||
uid: uidAusweis
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: uidAusweis
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
ausweis = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: uidAusweis
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if (!ausweis) {
|
||||
return Astro.redirect("/");
|
||||
}
|
||||
|
||||
aufnahme = await caller.aufnahme._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: ausweis.uid_aufnahme
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
|
||||
objekt = await caller.objekt._uid.GET.fetch(undefined, {
|
||||
params: {
|
||||
uid: ausweis.uid_objekt
|
||||
},
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
|
||||
benutzer = await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis);
|
||||
const pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, benutzer);
|
||||
|
||||
|
||||
return new Response(pdf, {
|
||||
|
||||
Reference in New Issue
Block a user