Merge branch 'dev-moritz'

This commit is contained in:
Moritz Utcke
2025-02-11 17:33:46 +07:00
117 changed files with 2208 additions and 874 deletions

View File

@@ -1,9 +1,9 @@
.PHONY: dev database api online-energieausweis all prod bun-install-database bun-install-api .PHONY: dev database online-energieausweis all prod bun-install-database # api bun-install-api
online-energieausweis: online-energieausweis:
bun run dev --host bun run dev --host
dev: online-energieausweis api database dev: database online-energieausweis # api
database: database:
$(MAKE) -C ../database dev $(MAKE) -C ../database dev
@@ -13,19 +13,19 @@ bun-install-database:
bun link bun link
bun install bun install
bun-install-api: bun-install-database # bun-install-api: bun-install-database
cd ../api # cd ../api
bun install # bun install
bun link @ibcornelsen/database # bun link @ibcornelsen/database
api: # api:
$(MAKE) -C ../api dev # $(MAKE) -C ../api dev
all: all:
mkdir -p ~/logs mkdir -p ~/logs
bun run dev 2>&1 | tee ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log bun run dev 2>&1 | tee ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log
prod: bun-install-api bun-install-database prod: bun-install-database # bun-install-api
mkdir -p ~/logs mkdir -p ~/logs
mkdir -p ~/persistent/online-energieausweis mkdir -p ~/persistent/online-energieausweis
@@ -37,11 +37,11 @@ prod: bun-install-api bun-install-database
fi fi
# Auch die API sollte bereits laufen # Auch die API sollte bereits laufen
@if [ $$(pm2 pid api) -eq "0" ]; then \ # @if [ $$(pm2 pid api) -eq "0" ]; then \
cd ../api; \ # cd ../api; \
$(MAKE) prod; \ # $(MAKE) prod; \
cd ../online-energieausweis; \ # cd ../online-energieausweis; \
fi # fi
- rm -f ~/online-energieausweis/.env; - rm -f ~/online-energieausweis/.env;
- touch ~/online-energieausweis/.env; - touch ~/online-energieausweis/.env;

View File

@@ -8,7 +8,6 @@
"@astrojs/node": "^8.3.4", "@astrojs/node": "^8.3.4",
"@astrojs/svelte": "^2.2.0", "@astrojs/svelte": "^2.2.0",
"@astrojs/tailwind": "^3.1.3", "@astrojs/tailwind": "^3.1.3",
"@ibcornelsen/api": "link:@ibcornelsen/api",
"@ibcornelsen/database": "link:@ibcornelsen/database", "@ibcornelsen/database": "link:@ibcornelsen/database",
"@ibcornelsen/ui": "^0.0.2", "@ibcornelsen/ui": "^0.0.2",
"@mollie/api-client": "^4.1.0", "@mollie/api-client": "^4.1.0",
@@ -255,8 +254,6 @@
"@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@1.2.1", "", {}, "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="], "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@1.2.1", "", {}, "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="],
"@ibcornelsen/api": ["@ibcornelsen/api@link:@ibcornelsen/api", {}],
"@ibcornelsen/database": ["@ibcornelsen/database@link:@ibcornelsen/database", {}], "@ibcornelsen/database": ["@ibcornelsen/database@link:@ibcornelsen/database", {}],
"@ibcornelsen/ui": ["@ibcornelsen/ui@0.0.2", "", { "dependencies": { "@astrojs/svelte": "^2.1.1", "cookiejs": "^2.1.2", "knex": "^2.4.2", "moment": "^2.29.4", "svelte": "^3.54.0", "svelte-preprocess": "^5.0.1", "tailwindcss": "^3.0.24", "uuid": "^9.0.0", "zod": "^3.21.4" } }, "sha512-TF29f0uY6MqxQszEySKRI5RJa1FmHCqaY5SjcIJjbI/9MjUL3tB/u9m+o7t/SpzPRNT419/HMdXSo7uOATX2Aw=="], "@ibcornelsen/ui": ["@ibcornelsen/ui@0.0.2", "", { "dependencies": { "@astrojs/svelte": "^2.1.1", "cookiejs": "^2.1.2", "knex": "^2.4.2", "moment": "^2.29.4", "svelte": "^3.54.0", "svelte-preprocess": "^5.0.1", "tailwindcss": "^3.0.24", "uuid": "^9.0.0", "zod": "^3.21.4" } }, "sha512-TF29f0uY6MqxQszEySKRI5RJa1FmHCqaY5SjcIJjbI/9MjUL3tB/u9m+o7t/SpzPRNT419/HMdXSo7uOATX2Aw=="],

View File

@@ -14,7 +14,7 @@ export default defineConfig({
setupNodeEvents(on, config) { setupNodeEvents(on, config) {
on("file:preprocessor", vitePreprocessor({ on("file:preprocessor", vitePreprocessor({
optimizeDeps: { optimizeDeps: {
exclude: ["@ibcornelsen/api", "@ibcornelsen/database"] exclude: ["@ibcornelsen/database"]
}, },
resolve: { resolve: {
alias: { alias: {

View File

@@ -13,7 +13,7 @@ services:
- ./:/online-energieausweis - ./:/online-energieausweis
- ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui - ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui
- ./node_modules/@ibcornelsen/database:/online-energieausweis/node_modules/@ibcornelsen/database - ./node_modules/@ibcornelsen/database:/online-energieausweis/node_modules/@ibcornelsen/database
- ./node_modules/@ibcornelsen/api:/online-energieausweis/node_modules/@ibcornelsen/api # - ./node_modules/@ibcornelsen/api:/online-energieausweis/node_modules/@ibcornelsen/api
- ./node_modules/radix-svelte-icons:/online-energieausweis/node_modules/radix-svelte-icons - ./node_modules/radix-svelte-icons:/online-energieausweis/node_modules/radix-svelte-icons
- ../api/persistent:/persistent - ../api/persistent:/persistent
ibcornelsen-api: ibcornelsen-api:

View File

@@ -22,7 +22,6 @@
"@astrojs/node": "^8.3.4", "@astrojs/node": "^8.3.4",
"@astrojs/svelte": "^2.2.0", "@astrojs/svelte": "^2.2.0",
"@astrojs/tailwind": "^3.1.3", "@astrojs/tailwind": "^3.1.3",
"@ibcornelsen/api": "link:@ibcornelsen/api",
"@ibcornelsen/database": "link:@ibcornelsen/database", "@ibcornelsen/database": "link:@ibcornelsen/database",
"@ibcornelsen/ui": "^0.0.2", "@ibcornelsen/ui": "^0.0.2",
"@mollie/api-client": "^4.1.0", "@mollie/api-client": "^4.1.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -8,8 +8,8 @@ export const createCaller = createCallerFactory({
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "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/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"objekt": await import("../src/pages/api/objekt/index.ts"), "objekt": await import("../src/pages/api/objekt/index.ts"),
"rechnung": await import("../src/pages/api/rechnung/index.ts"), "rechnung": await import("../src/pages/api/rechnung/index.ts"),
"ticket": await import("../src/pages/api/ticket/index.ts"), "ticket": await import("../src/pages/api/ticket/index.ts"),
@@ -19,6 +19,7 @@ export const createCaller = createCallerFactory({
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
"verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"),
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.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]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"),
"objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"), "objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"),
}) })

View File

@@ -1,16 +1,17 @@
import { api } from "astro-typesafe-api/client" import { api } from "astro-typesafe-api/client"
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; 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( export async function ausweisSpeichern(
ausweis: VerbrauchsausweisWohnenClient, ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,
objekt: ObjektClient, objekt: ObjektClient,
aufnahme: AufnahmeClient, aufnahme: AufnahmeClient,
bilder: (UploadedGebaeudeBild & { base64?: string })[] bilder: (UploadedGebaeudeBild & { base64?: string })[],
ausweisart: Enums.Ausweisart
) { ) {
if (objekt.uid) { if (objekt.uid) {
await api.objekt._uid.PATCH.fetch({ await api.objekt._uid.PATCH.fetch({
@@ -61,8 +62,21 @@ export async function verbrauchsausweisWohnenSpeichern(
aufnahme.uid = uid 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) { if (ausweis.uid) {
await api["verbrauchsausweis-wohnen"]._uid.PATCH.fetch({ await patchRoute.fetch({
...exclude(ausweis, ["uid"]) ...exclude(ausweis, ["uid"])
}, { }, {
params: { params: {
@@ -73,7 +87,7 @@ export async function verbrauchsausweisWohnenSpeichern(
} }
}) })
} else { } else {
const { uid } = await api["verbrauchsausweis-wohnen"].PUT.fetch({ const { uid } = await putRoute.fetch({
ausweis, ausweis,
uid_aufnahme: aufnahme.uid uid_aufnahme: aufnahme.uid
}, { }, {

View File

@@ -1,13 +1,43 @@
<script lang="ts"> <script lang="ts">
import { Buffer } from "buffer"; 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 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> </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" /> <img src="/images/ausweis.webp" alt="Ausweis" />
<span class="text-black font-medium text-lg">Ansichtsausweis</span> <span class="text-black font-medium text-lg">Ansichtsausweis</span>
</a> </button>

View File

@@ -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 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"> <div class="input-standard order-3 md:order-3 xl:order-3">
<Inputlabel title="Anrede *"></Inputlabel> <Inputlabel title="Anrede *"></Inputlabel>
<select name="anrede" bind:value={user.anrede}> <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="Herr">Herr</option>
<option value="Frau">Frau</option> <option value="Frau">Frau</option>
<option value="Frau">Frau</option>
</select> </select>
</div> -->
<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>-->
<!-- Vorname * --> <!-- Vorname * -->

View File

@@ -9,14 +9,19 @@
} from "@ibcornelsen/database/client"; } from "@ibcornelsen/database/client";
import { import {
AufnahmeClient,
BedarfsausweisWohnenClient,
ObjektClient, ObjektClient,
UploadedGebaeudeBild, UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let gebaeude: ObjektClient; export let aufnahme: AufnahmeClient;
export let objekt: ObjektClient;
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];
export let ausweisart: Enums.Ausweisart;
</script> </script>
<div class="grid grid-cols-2 gap-x-6 mt-6"> <div class="grid grid-cols-2 gap-x-6 mt-6">
@@ -29,7 +34,7 @@
kategorie={Enums.BilderKategorie.Gebaeude} kategorie={Enums.BilderKategorie.Gebaeude}
max={1} max={1}
min={1} min={1}
bind:gebaeude bind:objekt
bind:images bind:images
bind:ausweis bind:ausweis
> >
@@ -56,8 +61,8 @@
</div> </div>
<div class="grid grid-cols-2 gap-4 mt-4"> <div class="grid grid-cols-2 gap-4 mt-4">
<AnsichtsausweisButton {ausweis} /> <AnsichtsausweisButton {ausweis} {aufnahme} {objekt} bilder={images} {ausweisart} />
<DatenblattButton {ausweis} /> <DatenblattButton {ausweis} {aufnahme} {objekt} bilder={images} {ausweisart} />
</div> </div>

View File

@@ -70,7 +70,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required required
bind:value={aufnahme.gebaeudetyp} bind:value={aufnahme.gebaeudetyp}
> >
<option disabled selected value={false}>Bitte auswählen</option> <option disabled selected>Bitte auswählen</option>
{#if ausweisart=="VerbrauchsausweisWohnen"} {#if ausweisart=="VerbrauchsausweisWohnen"}
<option value="Einfamilienhaus">Einfamilienhaus</option> <option value="Einfamilienhaus">Einfamilienhaus</option>

View File

@@ -3,17 +3,21 @@
import Hilfe from "#components/Ausweis/Hilfe.svelte"; import Hilfe from "#components/Ausweis/Hilfe.svelte";
import { import {
AufnahmeClient, AufnahmeClient,
BedarfsausweisWohnenClient,
BenutzerClient, BenutzerClient,
ObjektClient, ObjektClient,
UploadedGebaeudeBild, UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import { Enums } from "@ibcornelsen/database/client";
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let bilder: UploadedGebaeudeBild[]; export let bilder: UploadedGebaeudeBild[];
export let user: BenutzerClient; export let user: BenutzerClient;
export let objekt: ObjektClient; export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
export let ausweisart: Enums.Ausweisart
export let spaeterWeitermachen; export let spaeterWeitermachen;
</script> </script>
@@ -36,6 +40,7 @@
bind:user bind:user
bind:objekt bind:objekt
bind:aufnahme bind:aufnahme
{ausweisart}
></AusweisWeiter> ></AusweisWeiter>
</div> </div>
</div> </div>

View File

@@ -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>

View File

@@ -1,11 +1,11 @@
<script lang="ts"> <script lang="ts">
import ImageGrid from "../ImageGrid.svelte";; import ImageGrid from "../ImageGrid.svelte";;
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js"; import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let gebaeude: ObjektClient; export let objekt: ObjektClient;
</script> </script>
<div class="grid grid-cols-2 gap-x-6 mt-6"> <div class="grid grid-cols-2 gap-x-6 mt-6">
@@ -66,7 +66,7 @@
kategorie={Enums.BilderKategorie.Daemmung} kategorie={Enums.BilderKategorie.Daemmung}
bind:images bind:images
bind:ausweis bind:ausweis
bind:gebaeude bind:objekt
> >
TEXT FEHLT TEXT FEHLT
</ImageGrid> </ImageGrid>

View File

@@ -1,11 +1,11 @@
<script lang="ts"> <script lang="ts">
import ImageGrid from "../ImageGrid.svelte";; import ImageGrid from "../ImageGrid.svelte";;
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js"; import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let gebaeude: ObjektClient; export let objekt: ObjektClient;
</script> </script>
<div class="grid grid-cols-2 gap-x-6 mt-6"> <div class="grid grid-cols-2 gap-x-6 mt-6">
@@ -62,7 +62,7 @@
kategorie={Enums.BilderKategorie.Fenster} kategorie={Enums.BilderKategorie.Fenster}
bind:images bind:images
bind:ausweis bind:ausweis
bind:gebaeude bind:objekt
> >
TEXT FEHLT TEXT FEHLT
</ImageGrid> </ImageGrid>

View File

@@ -1,10 +1,10 @@
<script lang="ts"> <script lang="ts">
import ImageGrid from "../ImageGrid.svelte";; import ImageGrid from "../ImageGrid.svelte";;
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js"; import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let gebaeude: ObjektClient; export let gebaeude: ObjektClient;
</script> </script>
@@ -57,7 +57,7 @@
kategorie={Enums.BilderKategorie.Heizung} kategorie={Enums.BilderKategorie.Heizung}
max={4} max={4}
min={1} min={1}
bind:gebaeude bind:objekt={gebaeude}
bind:images bind:images
bind:ausweis bind:ausweis
> >

View File

@@ -9,12 +9,20 @@
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte"; 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 aufnahme: AufnahmeClient;
export let objekt: ObjektClient; 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. * We use linear interpolation to scale the value between the given boundaries.
@@ -54,13 +62,12 @@
let translation_2 = 0; let translation_2 = 0;
$: { $: {
(async () => { (async () => {
const result = await endEnergieVerbrauchVerbrauchsausweis_2016({ let result;
...ausweis, if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
aufnahme: { result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
...aufnahme, } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
objekt: objekt, result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
}, }
});
if (!result) { if (!result) {
return; return;
@@ -77,7 +84,11 @@
} }
</script> </script>
<div class="self-center relative"> <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 <ThickArrowDown
size={28} size={28}
class="fill-base-content absolute top-0 transition-left duration-1000 ease-in-out" class="fill-base-content absolute top-0 transition-left duration-1000 ease-in-out"

View File

@@ -6,19 +6,7 @@
import { BenutzerClient, RechnungClient } from "./types.js"; import { BenutzerClient, RechnungClient } from "./types.js";
export let user: BenutzerClient; export let user: BenutzerClient;
export let rechnung: Partial<RechnungClient>;
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,
};

View File

@@ -1,28 +1,30 @@
<script lang="ts"> <script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte"; import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte"; import Inputlabel from "#components/labels/InputLabel.svelte";
import FensterImage from "./FensterImage.svelte"; import FensterImage from "./FensterImage.svelte";
//import Label from "../Label.svelte"; //import Label from "../Label.svelte";
import { import {
AufnahmeClient, AufnahmeClient,
ObjektClient, ObjektClient,
UploadedGebaeudeBild, UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient, VerbrauchsausweisGewerbeClient,
} from "./types.js"; VerbrauchsausweisWohnenClient,
import { boolean } from "astro:schema"; } from "./types.js";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte" 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 aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
export let images: UploadedGebaeudeBild[]; export let images: UploadedGebaeudeBild[];
</script>
<div
</script> id="sanierungszustand"
class="bereich-box grid
grid-cols-1 gap-x-4 gap-y-2 grid-cols-1 gap-x-4 gap-y-2
sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8 sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
@@ -30,25 +32,74 @@
xl:grid-cols-2 xl:gap-x-8 xl: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
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:objekt />
<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">
<!-- <!--
Wir benötigen diese Angaben um den allgemeinen Modernisierungsstand Wir benötigen diese Angaben um den allgemeinen Modernisierungsstand
@@ -162,4 +213,5 @@
--> -->
<style lang="postcss">
</style>

View File

@@ -10,14 +10,15 @@
AufnahmeClient, AufnahmeClient,
ObjektClient, ObjektClient,
UploadedGebaeudeBild, UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import { boolean } from "astro:schema"; import { boolean } from "astro:schema";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"; import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
export let gebaeude: ObjektClient; export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
export let images: UploadedGebaeudeBild[]; export let images: UploadedGebaeudeBild[];
</script> </script>
@@ -119,7 +120,7 @@
></SanierungsOption> ></SanierungsOption>
</div> </div>
<HeizungImage bind:images bind:ausweis bind:gebaeude /> <HeizungImage bind:images bind:ausweis bind:gebaeude={objekt} />
<!-- <!--

View File

@@ -1,29 +1,30 @@
<script lang="ts"> <script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte"; import DaemmungImage from "./DaemmungImage.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import DaemmungImage from "./DaemmungImage.svelte"; //import Label from "../Label.svelte";
import {
AufnahmeClient,
BedarfsausweisWohnenClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
//import Label from "../Label.svelte"; export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis:
| VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnenClient;
export let images: UploadedGebaeudeBild[];
</script>
import { <div
AufnahmeClient, id="sanierungszustand"
ObjektClient, class="bereich-box grid
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>
grid-cols-1 gap-x-4 gap-y-2 grid-cols-1 gap-x-4 gap-y-2
sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8 sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
@@ -31,21 +32,53 @@
xl:grid-cols-2 xl:gap-x-8 xl: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
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>
</div>
<DaemmungImage bind:images bind:ausweis bind:objekt />
<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">
<!-- <!--
<div class="GRB3"> <div class="GRB3">
<div class="form-group col-md-12"> <div class="form-group col-md-12">
@@ -72,4 +105,5 @@
--> -->
<style lang="postcss">
</style>

View File

@@ -16,13 +16,13 @@
import { import {
AufnahmeClient, AufnahmeClient,
ObjektClient, ObjektClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisGewerbeClient,
} from "./types.js"; } from "./types.js";
import { addNotification } from "#components/Notifications/shared.js"; import { addNotification } from "#components/Notifications/shared.js";
export let gebaeude: ObjektClient; export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient; 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. // 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 // Allerdings müssen wir auch berücksichtigen, dass wir drei folgende Jahre brauchen, also
@@ -48,12 +48,12 @@
]; ];
const startDate = moment( const startDate = moment(
ausweis.aufnahme.erstellungsdatum || Date.now() aufnahme.erstellungsdatum || Date.now()
) )
.subtract(4, "years") .subtract(4, "years")
.subtract(6, "months"); .subtract(6, "months");
const endDate = moment( const endDate = moment(
ausweis.aufnahme.erstellungsdatum || Date.now() aufnahme.erstellungsdatum || Date.now()
).subtract(3, "years"); ).subtract(3, "years");
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) { 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> </script>
<div <div
@@ -137,14 +137,15 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
> >
{#if !ausweis.zusaetzliche_heizquelle} {#if !ausweis.zusaetzliche_heizquelle}
<input <input
id="zusaetzliche_heizquelle_1" id="zusaetzliche_heizquelle"
type="checkbox" type="checkbox"
class="checkbox" class="checkbox"
name="zusaetzliche_heizquelle_1" name="zusaetzliche_heizquelle"
data-cy="zusaetzliche_heizquelle"
bind:checked={ausweis.zusaetzliche_heizquelle} bind:checked={ausweis.zusaetzliche_heizquelle}
/> />
<label <label
for="zusaetzliche_heizquelle_1" for="zusaetzliche_heizquelle"
class="cursor-pointer">zusätzliche Heizquelle</label class="cursor-pointer">zusätzliche Heizquelle</label
> >
{/if} {/if}
@@ -236,6 +237,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select <select
class="rounded-e-none" class="rounded-e-none"
name="brennstoff_1" name="brennstoff_1"
data-cy="brennstoff_1"
bind:value={aufnahme.brennstoff_1} bind:value={aufnahme.brennstoff_1}
required required
> >
@@ -267,6 +269,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select <select
class="rounded-s-none" class="rounded-s-none"
name="einheit_1" name="einheit_1"
data-cy="einheit_1"
bind:value={ausweis.einheit_1} bind:value={ausweis.einheit_1}
disabled={!aufnahme.brennstoff_1} disabled={!aufnahme.brennstoff_1}
required required
@@ -416,6 +419,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select <select
class="rounded-e-none" class="rounded-e-none"
name="brennstoff_2" name="brennstoff_2"
data-cy="brennstoff_2"
bind:value={aufnahme.brennstoff_2} bind:value={aufnahme.brennstoff_2}
required required
> >
@@ -449,6 +453,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select <select
class="rounded-s-none" class="rounded-s-none"
name="einheit_2" name="einheit_2"
data-cy="einheit_2"
bind:value={ausweis.einheit_2} bind:value={ausweis.einheit_2}
disabled={!aufnahme.brennstoff_2} disabled={!aufnahme.brennstoff_2}
required required
@@ -655,19 +660,19 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<!-- Enthält Stromverbrauch für: --> <!-- Enthält Stromverbrauch für: -->
<SanierungsOption label="Heizung" name="stromverbrauch_enthaelt_heizung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_heizung}></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={aufnahme.stromverbrauch_enthaelt_warmwasser}></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={aufnahme.stromverbrauch_enthaelt_lueftung}></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={aufnahme.stromverbrauch_enthaelt_beleuchtung}></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={aufnahme.stromverbrauch_enthaelt_kuehlung}></SanierungsOption> <SanierungsOption label="Kühlung" name="stromverbrauch_enthaelt_kuehlung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_kuehlung}></SanierungsOption>
<div class="input-standard"> <div class="input-standard">
<Inputlabel title="Sonstige"></Inputlabel> <Inputlabel title="Sonstige"></Inputlabel>
<input <input
name="strom_3" name="stromverbrauch_enthaelt_sonstige"
type="number" type="number"
bind:value={ausweis.strom_3} bind:value={ausweis.stromverbrauch_enthaelt_sonstige}
required required
/> />

View File

@@ -3,9 +3,6 @@
import Inputlabel from "#components/labels/InputLabel.svelte"; import Inputlabel from "#components/labels/InputLabel.svelte";
import Verbrauchslabel from "#components/labels/VerbrauchsLabel.svelte"; import Verbrauchslabel from "#components/labels/VerbrauchsLabel.svelte";
import VerbrauchsHelpLabel from "#components/labels/VerbrauchsHelpLabel.svelte"; import VerbrauchsHelpLabel from "#components/labels/VerbrauchsHelpLabel.svelte";
import Label from "../Label.svelte";
import moment from "moment"; import moment from "moment";
import fuelList from "./brennstoffListe.js"; import fuelList from "./brennstoffListe.js";
import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung.js"; import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung.js";
@@ -16,7 +13,7 @@
} from "./types.js"; } from "./types.js";
import { addNotification } from "#components/Notifications/shared.js"; import { addNotification } from "#components/Notifications/shared.js";
export let gebaeude: ObjektClient; export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient;
@@ -43,14 +40,13 @@
"Dezember", "Dezember",
]; ];
const startDate = moment( const startDate = moment(aufnahme.erstellungsdatum || Date.now())
aufnahme.erstellungsdatum || Date.now()
)
.subtract(4, "years") .subtract(4, "years")
.subtract(6, "months"); .subtract(6, "months");
const endDate = moment( const endDate = moment(aufnahme.erstellungsdatum || Date.now()).subtract(
aufnahme.erstellungsdatum || Date.now() 3,
).subtract(3, "years"); "years"
);
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) { for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
availableDates.push({ availableDates.push({
@@ -85,20 +81,27 @@
$: { $: {
console.log(month, year); 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({ addNotification({
message: "Monat nicht verfügbar.", 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, dismissable: true,
type: "warning", type: "warning",
timeout: 0, timeout: 0,
uid: "monat_nicht_verfuegbar", 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> </script>
<div <div
@@ -201,10 +204,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
</select> </select>
<div class="help-label"> <div class="help-label">
<HelpLabel>Bitte geben Sie hier den <b>Startmonat der ersten Verbrauchsperiode</b> ein. Es sind nur Monate auswählbar, <HelpLabel
die im zulässigen Zeitraum (Endzeitpunkt von Jahr 3 darf nicht älter als 18 Monate sein) liegen. Wählen Sie ein >Bitte geben Sie hier den <b
aktuellerses Jahr um alle Monate zu sehen. >Startmonat der ersten Verbrauchsperiode</b
</HelpLabel> > 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>
</div> </div>
@@ -230,8 +236,12 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
</select> </select>
<div class="help-label"> <div class="help-label">
<HelpLabel>Bitte geben Sie das <b>Startjahr der ersten Verbrauchsperiode</b> ein. Weitere Zeitangaben müssen nichht <HelpLabel
gemacht werden, da alle 3 Verbrauchsjahre zusammenhängend sein sollen.</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> </div>
</div> </div>
@@ -256,16 +266,24 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<div class="help-label"> <div class="help-label">
<HelpLabel> <HelpLabel>
<b>Heizöl:</b> Flüssiger fossiler Brennstoff.<br/> <b>Heizöl:</b> Flüssiger fossiler Brennstoff.<br />
<b>Erdgas:</b> Gasförmiger 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>Flüssiggas:</b> Wie Erdgas fossiler Brennstoff - im
<b>Braunkohle:</b> Fester fossiler Brennstoff<br/> Flüssiggastank gelagert<br />
<b>Holz-Pellets:</b> Stäbchenförmige Pellets - erneuerbarer (nachwachsender) Brennstoff<br/> <b>Braunkohle:</b> Fester fossiler Brennstoff<br />
<b>Holzhackschnitzel:</b>Wie Holz-Pellets<br/> <b>Holz-Pellets:</b> Stäbchenförmige Pellets - erneuerbarer
<b>Fernwärme, Nahwärme:</b> kommunales Wärmenetz - <strong>erfragen Sie (nachwachsender) Brennstoff<br />
den Primärenergiefaktor bei Ihrem Energieversorger</strong> (meistens mit regenartivem Anteil)<br/> <b>Holzhackschnitzel:</b>Wie Holz-Pellets<br />
<b>Strommix:</b> Meist bei Wärmepumpe oder Nachtspeicher.<br/> <b>Fernwärme, Nahwärme:</b> kommunales Wärmenetz -
<b>Koks:</b> stark kohlenstoffhaltiger fossiler Brennstoff.<br/> <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> </HelpLabel>
</div> </div>
</div> </div>
@@ -288,9 +306,10 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<div class="help-label"> <div class="help-label">
<HelpLabel> <HelpLabel>
Bitte geben Sie die Einheit ein. Die Liste passt sich entsprechend des ausgeählten Brennstoffes an. Bitte geben Sie die Einheit ein. Die Liste passt sich
Erdgas wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt meistens in entsprechend des ausgeählten Brennstoffes an. Erdgas wird
Litern vor. Pellets oder Brennholz in kg. meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt
meistens in Litern vor. Pellets oder Brennholz in kg.
</HelpLabel> </HelpLabel>
</div> </div>
</div> </div>
@@ -409,8 +428,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
</div> </div>
<div class="help-label"> <div class="help-label">
<HelpLabel>Hier sind die <b>Verbräuche einer zusätzlichen Heizquelle</b> <HelpLabel
(z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel etc.) einzugeben</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>
</div> </div>
@@ -439,16 +463,24 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<div class="help-label"> <div class="help-label">
<HelpLabel> <HelpLabel>
<b>Heizöl:</b> Flüssiger fossiler Brennstoff.<br/> <b>Heizöl:</b> Flüssiger fossiler Brennstoff.<br />
<b>Erdgas:</b> Gasförmiger 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>Flüssiggas:</b> Wie Erdgas fossiler Brennstoff - im
<b>Braunkohle:</b> Fester fossiler Brennstoff<br/> Flüssiggastank gelagert<br />
<b>Holz-Pellets:</b> Stäbchenförmige Pellets - erneuerbarer (nachwachsender) Brennstoff<br/> <b>Braunkohle:</b> Fester fossiler Brennstoff<br />
<b>Holzhackschnitzel:</b>Wie Holz-Pellets<br/> <b>Holz-Pellets:</b> Stäbchenförmige Pellets -
<b>Fernwärme, Nahwärme:</b> kommunales Wärmenetz - <strong>erfragen Sie erneuerbarer (nachwachsender) Brennstoff<br />
den Primärenergiefaktor bei Ihrem Energieversorger</strong> (meistens mit regenartivem Anteil)<br/> <b>Holzhackschnitzel:</b>Wie Holz-Pellets<br />
<b>Strommix:</b> Meist bei Wärmepumpe oder Nachtspeicher.<br/> <b>Fernwärme, Nahwärme:</b> kommunales Wärmenetz -
<b>Koks:</b> stark kohlenstoffhaltiger fossiler Brennstoff.<br/> <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> </HelpLabel>
</div> </div>
</div> </div>
@@ -474,9 +506,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<div class="help-label"> <div class="help-label">
<HelpLabel> <HelpLabel>
Bitte geben Sie die Einheit ein. Die Liste passt sich entsprechend des ausgeählten Brennstoffes an. Bitte geben Sie die Einheit ein. Die Liste passt sich
Erdgas wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt meistens in entsprechend des ausgeählten Brennstoffes an. Erdgas
Litern vor. Pellets oder Brennholz in kg. wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl
liegt meistens in Litern vor. Pellets oder Brennholz in
kg.
</HelpLabel> </HelpLabel>
</div> </div>
</div> </div>

View File

@@ -51,7 +51,11 @@ export type VerbrauchsausweisWohnenClient = OmitKeys<
export type VerbrauchsausweisGewerbeClient = OmitKeys< export type VerbrauchsausweisGewerbeClient = OmitKeys<
VerbrauchsausweisGewerbe, VerbrauchsausweisGewerbe,
"id" | "aufnahme_id" | "benutzer_id" "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 * 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< export type BedarfsausweisWohnenClient = OmitKeys<
BedarfsausweisWohnen, BedarfsausweisWohnen,
"id" | "aufnahme_id" | "benutzer_id" "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 * Das ist der Typescript Type für die Gebäude Stammdaten mit allen Feldern die

View File

@@ -132,7 +132,7 @@
<!-- TODO: Metrics für den Fortschritt festlegen --> <!-- TODO: Metrics für den Fortschritt festlegen -->
<span class="text-sm font-semibold text-base-content">{progress}%</span> <span class="text-sm font-semibold text-base-content">{progress}%</span>
</div> </div>
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis)} {#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt)}
{:then calculations} {:then calculations}
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">

View File

@@ -1,13 +1,19 @@
<script lang="ts"> <script lang="ts">
import { Buffer } from "buffer"; import { Buffer } from "buffer";
import { VerbrauchsausweisWohnenClient } from "./Ausweis/types"; import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
export let ausweis: VerbrauchsausweisWohnenClient; 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> </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" /> <img src="/images/datenblatt.webp" alt="Datenblatt" />
<span class="text-black font-medium text-lg">Datenblatt</span> <span class="text-black font-medium text-lg">Datenblatt</span>
</a> </a>

View File

@@ -1,15 +1,15 @@
<script lang="ts"> <script lang="ts">
import UploadImages from "./UploadImages.svelte"; import UploadImages from "./UploadImages.svelte";
import type { BedarfsausweisWohnen, Enums, VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client"; import type { Enums } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js"; import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons"; import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons";
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];
export let max: number = 4; export let max: number = 4;
export let min: number = 1; export let min: number = 1;
export let name: string = ""; export let name: string = "";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let gebaeude: ObjektClient; export let objekt: ObjektClient;
export let kategorie: Enums.BilderKategorie export let kategorie: Enums.BilderKategorie
async function rotateImage(image: UploadedGebaeudeBild): Promise<UploadedGebaeudeBild> { async function rotateImage(image: UploadedGebaeudeBild): Promise<UploadedGebaeudeBild> {
@@ -36,7 +36,7 @@
</script> </script>
<div class="flex flex-col gap-4"> <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"> <div class="grid grid-cols-2 gap-2">
{#each images as image, i} {#each images as image, i}
{#if image.kategorie == kategorie} {#if image.kategorie == kategorie}

View File

@@ -10,7 +10,7 @@
<div> <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}> <label for={paymentType}>
<div class="grid grid-rows-[1fr_20px] justify-items-center items-center cursor-pointer"> <div class="grid grid-rows-[1fr_20px] justify-items-center items-center cursor-pointer">

View File

@@ -1,17 +1,17 @@
<script lang="ts"> <script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte"; 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 max: number = 2;
export let min: number = 1; export let min: number = 1;
export let name: string = "" export let name: string = ""
// Array of base64 encoded images read into the input. // 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 images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let gebaeude: ObjektClient; export let objekt: ObjektClient;
export let kategorie: Enums.BilderKategorie; export let kategorie: Enums.BilderKategorie;
function getAllImages(this: HTMLInputElement) { function getAllImages(this: HTMLInputElement) {
@@ -36,7 +36,7 @@
const reader = new FileReader(); const reader = new FileReader();
reader.onload = (ev) => { reader.onload = () => {
if (reader.readyState != reader.DONE) { if (reader.readyState != reader.DONE) {
return; return;
} }

View File

@@ -3,7 +3,7 @@ import { AuditType, hidden } from "./hidden.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { getKlimafaktoren } from "#lib/Klimafaktoren.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)) { if (hidden.has(AuditType.END_ENERGIE)) {
return false; return false;
} }
@@ -11,9 +11,9 @@ export async function auditEndEnergie(ausweis: VerbrauchsausweisWohnenClient, ge
if (aufnahme){ if (aufnahme){
if (aufnahme.flaeche && ausweis.verbrauch_1 && ausweis.verbrauch_2 && ausweis.verbrauch_3) { if (aufnahme.flaeche && ausweis.verbrauch_1 && ausweis.verbrauch_2 && ausweis.verbrauch_3) {
try { try {
const response = await getKlimafaktoren(ausweis.startdatum, gebaeude.plz); const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz);
// Alle Klimfaktoren konnten abgefragt werden. // 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){
if (eevva?.endEnergieVerbrauchGesamt <= 45 || eevva?.endEnergieVerbrauchGesamt >= 500) { if (eevva?.endEnergieVerbrauchGesamt <= 45 || eevva?.endEnergieVerbrauchGesamt >= 500) {
return true; return true;

View File

@@ -1,8 +1,8 @@
import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js"; import { AuditType, hidden } from "./hidden.js";
export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnenClient, gebaeude: AufnahmeClient): number[] { export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient): number[] {
if (gebaeude.leerstand && (gebaeude.leerstand > 0)) { if (aufnahme.leerstand && (aufnahme.leerstand > 0)) {
return []; return [];
} }

View File

@@ -1,24 +1,26 @@
import fuelList from "#components/Ausweis/brennstoffListe"; import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker"; import { faker } from "@faker-js/faker";
import { Enums } from "@ibcornelsen/database/client"; import { type Enums } from "@ibcornelsen/database/client";
import "cypress-file-upload" import "cypress-file-upload"
import moment from "moment";
describe("Verbrauchsausweis erstellen Schritt 1", () => { 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.", () => { it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
cy.visit("/energieausweis-erstellen/verbrauchsausweis-gewerbe"); cy.visit("/energieausweis-erstellen/verbrauchsausweis-gewerbe");
cy.wait(1000); cy.wait(1000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind. // 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']") cy.get("select[data-cy='ausstellgrund']")
.should("have.length", Object.values(Enums.Ausstellgrund).length) .select(
.eq(
faker.number.int({ faker.number.int({
min: 0, 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. // Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']") cy.get("input[name='baujahr_gebaeude']")
@@ -71,14 +73,14 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
.type(faker.number.int({ min: 50, max: 1000 }).toString()); .type(faker.number.int({ min: 50, max: 1000 }).toString());
// Keller // Keller
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({ cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", heizungsstatus.length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length, max: heizungsstatus.length,
min: 1 min: 1
})); }));
// Dachgeschoss // Dachgeschoss
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({ cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", heizungsstatus.length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length, max: heizungsstatus.length,
min: 1 min: 1
})); }));
@@ -88,9 +90,22 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]); cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]); 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 // Verbrauchszeitraum
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(faker.number.int({ min: 1, max: 12 }).toString()); cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.toString());
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(faker.number.int({ min: 2018, max: 2019 }).toString()); cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(availableDates[0].year.toString());
// Verbrauch // Verbrauch
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString()); 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; const zusaetzlicheHeizquelle = Math.random() > 0.5;
if (zusaetzlicheHeizquelle) { if (zusaetzlicheHeizquelle) {
cy.get("input[name='zusaetzliche_heizquelle']").check(); cy.get("[data-cy='zusaetzliche_heizquelle']").check();
// Brennstoff und Einheit 2 // Brennstoff und Einheit 2
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })]; const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
cy.get("select[name='brennstoff_2']").select(brennstoffKombo2[0]); cy.get("[data-cy='brennstoff_2']").select(brennstoffKombo2[0], { force: true });
cy.get("select[name='einheit_2']").select(brennstoffKombo2[1]); cy.get("[data-cy='einheit_2']").select(brennstoffKombo2[1], { force: true });
// Verbrauch // Verbrauch
cy.get("input[name='verbrauch_4']").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()); 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()); cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
} }
// Gebäudestrom // Gebäudestrom
@@ -169,7 +184,7 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
// Gebäudetyp // Gebäudetyp
cy.get("select[name='gebaeudetyp']").then(($dropdown) => { 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 // 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); 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='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='heizungsrohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='zirkulation']").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 // Heizungsanlage Bilder
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" }); cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/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" }); 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. // 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 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. // 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 email = faker.internet.email();
const passwort = faker.internet.password(); const passwort = "test1234";
const vorname = faker.person.firstName(); const vorname = faker.person.firstName();
const nachname = faker.person.lastName(); const nachname = faker.person.lastName();
@@ -272,6 +287,37 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.get("form[name='login'] button[type='submit']").click(); 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.
})
}); });
}); });

View File

@@ -266,11 +266,11 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.wait(1000) cy.wait(1000)
// Wir füllen jetzt die Kundendaten aus. // 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='vorname']").should("contain.value", vorname);
cy.get("input[name='name']").should("contain.value", nachname); cy.get("input[name='name']").should("contain.value", nachname);
cy.get("input[name='email']").should("contain.value", email); // cy.get("input[name='email']").should("contain.value", email);
cy.get("input[name='telefon']").type(faker.phone.number()); // cy.get("input[name='telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`); cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`);
cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress()); 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"); cy.get("input[name='rechnung_plz']").type("2103");
// Jetzt sollte der PLZ Container erscheinen, dort klicken wir einfach das erste Element an. // 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("div[data-test='plz-container']").children().first().click();
cy.get("input[name='rechnung_telefon']").type(faker.phone.number()); // cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_email']").type(faker.internet.email()); cy.get("input[name='rechnung_email']").should("contain.value", email);
cy.get("button[data-test='paypal']").click(); cy.get("input[data-cy='paypal']").click();
// Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab. // Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab.
cy.get("input[name='agb-akzeptieren']").check() // cy.get("input[name='agb-akzeptieren']").check()
cy.get("input[name='datenschutz-akzeptieren']").check() // cy.get("input[name='datenschutz-akzeptieren']").check()
cy.get("button[type='submit']").click(); cy.get("button[data-cy='bestellen']").click();
cy.origin('https://www.mollie.com', () => { cy.origin('https://www.mollie.com', () => {
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus // Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus

View File

@@ -5,7 +5,7 @@ import "../../svelte-dialogs.config"
import "svelte-ripple-action/ripple.css" import "svelte-ripple-action/ripple.css"
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte" import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte"
import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import { createCaller } from "#lib/caller"; import { createCaller } from "src/astro-typesafe-api-caller";
const valid = validateAccessTokenServer(Astro) const valid = validateAccessTokenServer(Astro)

View File

@@ -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,
}
}

View File

@@ -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]
}

View File

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

View File

@@ -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 { 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> { export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen, aufnahme: AufnahmeClient, objekt: ObjektClient): Promise<number> {
const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis); const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
if (!result) { if (!result) {
return 0; return 0;

View File

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

View File

@@ -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 { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import * as fs from "fs" import * as fs from "fs"
import { PDFDocument, rgb, StandardFonts, TextAlignment } from "pdf-lib"; import { PDFDocument, rgb, StandardFonts, TextAlignment } from "pdf-lib";
@@ -9,14 +9,14 @@ import { Heizungsstatus } from "@ibcornelsen/database/server";
/* -------------------------------- Pdf Tools ------------------------------- */ /* -------------------------------- 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 VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("./templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const pages = pdf.getPages() const pages = pdf.getPages()
// const template = VerbrauchsausweisWohnen2016Template as Template; // 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 height = pages[0].getHeight()
const width = pages[0].getWidth() const width = pages[0].getWidth()
@@ -30,7 +30,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
const marginX = 60; const marginX = 60;
const marginY = 150; const marginY = 150;
const benutzer: typeof ausweis.benutzer = ausweis.benutzer || { benutzer = benutzer || {
vorname: "Max", vorname: "Max",
name: "Mustermann", name: "Mustermann",
adresse: "Musterstraße 123", adresse: "Musterstraße 123",
@@ -55,7 +55,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
<text size="12">Ausweis ID: ${ausweis.uid}</text> <text size="12">Ausweis ID: ${ausweis.uid}</text>
</flex> </flex>
<text size="12" lineHeight="14" font="bold" marginTop="10">Gebäudedaten</text> <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" justify="space-between" width="${innerWidth}" marginTop="25">
<flex direction="row" gap="5" align="center"> <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="column" width="${(innerWidth) / 2 - 7.5}">
<flex direction="row" align="center" justify="space-between" 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">Gebäudetyp:</text>
<text size="12" lineHeight="14">${ausweis.aufnahme.gebaeudetyp}</text> <text size="12" lineHeight="14">${aufnahme.gebaeudetyp}</text>
</flex> </flex>
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}"> <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">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>
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}"> <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">Leerstand:</text>
<text size="12" lineHeight="14">${ausweis.aufnahme.leerstand || 0}%</text> <text size="12" lineHeight="14">${aufnahme.leerstand || 0}%</text>
</flex> </flex>
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}"> <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">Wohnungen:</text>
<text size="12" lineHeight="14">${ausweis.aufnahme.einheiten}</text> <text size="12" lineHeight="14">${aufnahme.einheiten}</text>
</flex> </flex>
</flex> </flex>
<flex direction="column" width="${(innerWidth) / 2 - 7.5}"> <flex direction="column" width="${(innerWidth) / 2 - 7.5}">
<flex direction="row" align="center" justify="space-between" 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">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>
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}"> <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">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> </flex>
</flex> </flex>
@@ -126,14 +126,14 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<text></text> <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_1} ${ausweis.einheit_1}</text>
<text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text> <text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text>
<text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text> <text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text>
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<text size="12">zusätzliche Heizquelle</text> <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_4 || ""} ${ausweis.einheit_2 || ""}</text>
<text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text> <text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text>
<text size="12">${ausweis.verbrauch_6 || ""} ${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="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<flex direction="row" gap="4" align="center"> <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> <text size="12">Zentralheizung</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Einzelöfen</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Durchlauferhitzer</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Standardkessel</text>
</flex> </flex>
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<flex direction="row" gap="4" align="center"> <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> <text size="12">Solarsystem für Warmwasser</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Wärmepumpe</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Niedertemperaturkessel</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Brennwertkessel</text>
</flex> </flex>
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<flex direction="row" gap="4" align="center"> <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> <text size="12">Warmwasserrohre gedämmt</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Heizungsrohre gedämmt</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Zirkulation</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Raumtemperaturregelung</text>
</flex> </flex>
</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="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<flex direction="row" gap="4" align="center"> <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> <text size="12">Einfachglas</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Doppelverglasung</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Isolierverglasung</text>
</flex> </flex>
</flex> </flex>
@@ -227,25 +227,25 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
<text size="12">Passivhausfenster</text> <text size="12">Passivhausfenster</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Alle Fenster dicht</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Fenster teilweise undicht</text>
</flex> </flex>
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<flex direction="row" gap="4" align="center"> <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> <text size="12">Türen teilweise undicht</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Alle Türen dicht</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Rollladenkästen gedämmt</text>
</flex> </flex>
</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="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<flex direction="row" gap="4" align="center"> <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> <text size="12">Kelleraußenwand gedämmt</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Kellerdecke gedämmt</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Außenwand gedämmt</text>
</flex> </flex>
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<flex direction="row" gap="4" align="center"> <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> <text size="12">Dachgeschoss min. 12cm gedämmt</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Dachgeschoss gedämmt</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Oberste Geschossdecke gedämmt</text>
</flex> </flex>
<flex direction="row" gap="4" align="center"> <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> <text size="12">Oberste Geschossdecke min. 12cm gedämmt</text>
</flex> </flex>
</flex> </flex>

View File

@@ -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();
} }

View File

@@ -1,9 +1,10 @@
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.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 { Enums } from "@ibcornelsen/database/server";
import * as fs from "fs" import * as fs from "fs"
import moment from "moment"; import moment from "moment";
import { PDFDocument, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib"; import { PDFDocument, PDFFont, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib";
/* -------------------------------- Pdf Tools ------------------------------- */ /* -------------------------------- Pdf Tools ------------------------------- */
@@ -14,7 +15,8 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
// const template = VerbrauchsausweisWohnen2016Template as Template; // 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() 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 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()}`) const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}`)
fillFormField("energietraeger_heizung", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`) fillFormField("energietraeger_heizung", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
@@ -72,20 +74,23 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung") toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung")
toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges") toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges")
console.log(bilder);
const gebaeudeBild = bilder.find(image => image.kategorie === "Gebaeude"); const gebaeudeBild = bilder.find(image => image.kategorie === "Gebaeude");
/* -------------------------------- Seite 2 -------------------------------- */ /* -------------------------------- Seite 2 -------------------------------- */
const co2Emissionen = fillFormField("co2emissionen", berechnungen.co2EmissionenGesamt.toString(), 8, TextAlignment.Center) const co2Emissionen = fillFormField("co2emissionen", berechnungen?.co2EmissionenGesamt.toString(), 8, TextAlignment.Center)
const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => { 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 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")) 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 // 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 endenergieverbrauchTranslationPercentage = Math.min(250, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 250
const primaerenergieverbrauchTranslationPercentage = Math.min(250, Math.max(0, berechnungen?.primaerEnergieVerbrauchGesamt)) / 250 const primaerenergieverbrauchTranslationPercentage = Math.min(250, Math.max(0, berechnungen?.primaerEnergieVerbrauchGesamt || 0)) / 250
const minTranslation = 68 const minTranslation = 68
const maxTranslation = 504 const maxTranslation = 504
@@ -182,57 +187,57 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
let yOffset = 14.6; let yOffset = 14.6;
const initialHeight = 435 const initialHeight = 435
const initialXOffset = 36; const initialXOffset = 36;
return (zeitraum_von: string, zeitraum_bis: string, energietraeger: string, primaerfaktor: string, energieverbrauch: string, anteil_warmwasser: string, anteil_heizung: string, klimafaktor: string) => { 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, { pages[2].drawText(zeitraum_von || "", {
x: initialXOffset, x: initialXOffset,
y: initialHeight - (i * yOffset), y: initialHeight - (i * yOffset),
size: 8, size: 8,
font font
}) })
pages[2].drawText(zeitraum_bis, { pages[2].drawText(zeitraum_bis || "", {
x: initialXOffset + 47, x: initialXOffset + 47,
y: initialHeight - (i * yOffset), y: initialHeight - (i * yOffset),
size: 8, size: 8,
font font
}) })
pages[2].drawText(energietraeger, { pages[2].drawText(energietraeger || "", {
x: initialXOffset + 94, x: initialXOffset + 94,
y: initialHeight - (i * yOffset), y: initialHeight - (i * yOffset),
size: 8, size: 8,
font font
}) })
pages[2].drawText(primaerfaktor, { pages[2].drawText(primaerfaktor || "", {
x: initialXOffset + 317, x: initialXOffset + 317,
y: initialHeight - (i * yOffset), y: initialHeight - (i * yOffset),
size: 8, size: 8,
font font
}) })
pages[2].drawText(energieverbrauch, { pages[2].drawText(energieverbrauch || "", {
x: initialXOffset + 351, x: initialXOffset + 351,
y: initialHeight - (i * yOffset), y: initialHeight - (i * yOffset),
size: 8, size: 8,
font font
}) })
pages[2].drawText(anteil_warmwasser, { pages[2].drawText(anteil_warmwasser || "", {
x: initialXOffset + 402, x: initialXOffset + 402,
y: initialHeight - (i * yOffset), y: initialHeight - (i * yOffset),
size: 8, size: 8,
font font
}) })
pages[2].drawText(anteil_heizung, { pages[2].drawText(anteil_heizung || "", {
x: initialXOffset + 453, x: initialXOffset + 453,
y: initialHeight - (i * yOffset), y: initialHeight - (i * yOffset),
size: 8, size: 8,
font font
}) })
pages[2].drawText(klimafaktor, { pages[2].drawText(klimafaktor || "", {
x: initialXOffset + 504, x: initialXOffset + 504,
y: initialHeight - (i * yOffset), y: initialHeight - (i * yOffset),
size: 8, size: 8,
@@ -289,6 +294,82 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
berechnungen?.klimafaktoren[0].klimafaktor.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() // pdf.getForm().flatten()
return pdf.save(); return pdf.save();

Binary file not shown.

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