Ansichtsausweis und Datenblatt

This commit is contained in:
Moritz Utcke
2025-02-07 15:38:55 +07:00
parent 829c176b50
commit 03d9b8a0a0
21 changed files with 211 additions and 139 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",

View File

@@ -5,8 +5,8 @@ export const createCaller = createCallerFactory({
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"), "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "aufnahme": await import("../src/pages/api/aufnahme/index.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"),
"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"),
@@ -17,9 +17,9 @@ export const createCaller = createCallerFactory({
"user/self": await import("../src/pages/api/user/self.ts"), "user/self": await import("../src/pages/api/user/self.ts"),
"verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"),
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.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,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 w-[30%] bg-white text-center hover:shadow-md no-underline p-6 cursor-pointer" target="_blank" href="/pdf/ansichtsausweis?base64={base64}"> <a class="border-2 rounded-lg w-[30%] bg-white text-center hover:shadow-md no-underline p-6 cursor-pointer" target="_blank" href="/pdf/ansichtsausweis?ausweis={base64Ausweis}&objekt=${base64Objekt}&aufnahme={base64Aufnahme}&bilder={base64Bilder}">
<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> </a>

View File

@@ -9,6 +9,7 @@
} from "@ibcornelsen/database/client"; } from "@ibcornelsen/database/client";
import { import {
AufnahmeClient,
BedarfsausweisWohnenClient, BedarfsausweisWohnenClient,
ObjektClient, ObjektClient,
UploadedGebaeudeBild, UploadedGebaeudeBild,
@@ -17,6 +18,7 @@
} from "./types.js"; } from "./types.js";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let aufnahme: AufnahmeClient;
export let objekt: ObjektClient; export let objekt: ObjektClient;
export let images: UploadedGebaeudeBild[] = []; export let images: UploadedGebaeudeBild[] = [];
</script> </script>
@@ -58,8 +60,8 @@
</div> </div>
<div class="flex flex-row gap-4 mt-4"> <div class="flex flex-row gap-4 mt-4">
<AnsichtsausweisButton {ausweis} /> <AnsichtsausweisButton {ausweis} {aufnahme} {objekt} bilder={images} />
<DatenblattButton {ausweis} /> <DatenblattButton {ausweis} {aufnahme} {objekt} bilder={images} />
</div> </div>

View File

@@ -54,13 +54,7 @@
let translation_2 = 0; let translation_2 = 0;
$: { $: {
(async () => { (async () => {
const result = await endEnergieVerbrauchVerbrauchsausweis_2016({ const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
...ausweis,
aufnahme: {
...aufnahme,
objekt: objekt,
},
});
if (!result) { if (!result) {
return; return;

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 w-[30%] bg-white text-center hover:shadow-md no-underline p-6 cursor-pointer" target="_blank" href="/pdf/datenblatt?base64={base64}"> <a class="border-2 rounded-lg w-[30%] bg-white text-center hover:shadow-md no-underline p-6 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

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

@@ -14,7 +14,7 @@ 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 height = pages[0].getHeight() const height = pages[0].getHeight()
@@ -48,13 +48,13 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
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 +72,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 +185,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,

View File

@@ -1000,6 +1000,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
bind:images bind:images
bind:ausweis bind:ausweis
bind:gebaeude bind:gebaeude
bind:aufnahme
/></Bereich /></Bereich
> >

View File

@@ -161,6 +161,7 @@
bind:images={bilder} bind:images={bilder}
bind:ausweis bind:ausweis
bind:objekt bind:objekt
bind:aufnahme
/></Bereich> /></Bereich>
</div> </div>

View File

@@ -290,6 +290,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen"
bind:images={bilder} bind:images={bilder}
bind:ausweis bind:ausweis
bind:objekt={objekt} bind:objekt={objekt}
bind:aufnahme
/></Bereich /></Bereich
> >
</div> </div>

View File

@@ -5,16 +5,20 @@ import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen"
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { createCaller } from "src/astro-typesafe-api-caller"; import { createCaller } from "src/astro-typesafe-api-caller";
const base64 = Astro.url.searchParams.get("base64"); const base64Ausweis = Astro.url.searchParams.get("ausweis");
const base64Aufnahme = Astro.url.searchParams.get("aufnahme");
const base64Objekt = Astro.url.searchParams.get("objekt");
const base64Bilder = Astro.url.searchParams.get("bilder");
let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null; let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null;
let aufnahme: AufnahmeClient = {} as AufnahmeClient; let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient; let objekt: ObjektClient = {} as ObjektClient;
let user: BenutzerClient = {} as BenutzerClient; let user: BenutzerClient = {} as BenutzerClient;
let images: UploadedGebaeudeBild[] = [] let bilder: UploadedGebaeudeBild[] = []
if (base64) { if (base64Ausweis && base64Aufnahme && base64Objekt && base64Bilder) {
const buffer = Buffer.from(base64, "base64"); ausweis = JSON.parse(Buffer.from(base64Ausweis, "base64").toString("utf-8")) as VerbrauchsausweisWohnenClient;
const json = buffer.toString("utf-8"); objekt = JSON.parse(Buffer.from(base64Objekt, "base64").toString("utf-8")) as ObjektClient;
ausweis = JSON.parse(json) as VerbrauchsausweisWohnenClient; aufnahme = JSON.parse(Buffer.from(base64Aufnahme, "base64").toString("utf-8")) as AufnahmeClient;
bilder = JSON.parse(Buffer.from(base64Bilder, "base64").toString("utf-8")) as UploadedGebaeudeBild[];
} else { } else {
const uidAusweis = Astro.url.searchParams.get("uid"); const uidAusweis = Astro.url.searchParams.get("uid");
@@ -76,7 +80,7 @@ if (base64) {
}); });
} }
const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, images, user); const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user);
return new Response(pdf, { return new Response(pdf, {
headers: { headers: {

View File

@@ -1,14 +1,25 @@
--- ---
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { createCaller } from "#lib/caller"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen"; import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen";
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen";
import { Enums } from "@ibcornelsen/database/client";
import { createCaller } from "src/astro-typesafe-api-caller";
const base64 = Astro.url.searchParams.get("base64"); const base64Ausweis = Astro.url.searchParams.get("ausweis");
let ausweis: VerbrauchsausweisWohnenClient | null = null; const base64Aufnahme = Astro.url.searchParams.get("aufnahme");
if (base64) { const base64Objekt = Astro.url.searchParams.get("objekt");
const buffer = Buffer.from(base64, "base64"); const base64Bilder = Astro.url.searchParams.get("bilder");
const json = buffer.toString("utf-8"); let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null;
ausweis = JSON.parse(json) as VerbrauchsausweisWohnenClient; let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
let benutzer: BenutzerClient = {} as BenutzerClient;
let bilder: UploadedGebaeudeBild[] = []
if (base64Ausweis && base64Aufnahme && base64Objekt && base64Bilder) {
ausweis = JSON.parse(Buffer.from(base64Ausweis, "base64").toString("utf-8")) as VerbrauchsausweisWohnenClient;
objekt = JSON.parse(Buffer.from(base64Objekt, "base64").toString("utf-8")) as ObjektClient;
aufnahme = JSON.parse(Buffer.from(base64Aufnahme, "base64").toString("utf-8")) as AufnahmeClient;
bilder = JSON.parse(Buffer.from(base64Bilder, "base64").toString("utf-8")) as UploadedGebaeudeBild[];
} else { } else {
const uidAusweis = Astro.url.searchParams.get("uid"); const uidAusweis = Astro.url.searchParams.get("uid");
@@ -16,14 +27,61 @@ if (base64) {
return Astro.redirect("/404"); return Astro.redirect("/404");
} }
const ausweisart = getAusweisartFromUUID(uidAusweis)
const caller = createCaller(Astro); const caller = createCaller(Astro);
ausweis = await caller.v1.verbrauchsausweisWohnen.get({ if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, {
params: {
uid: uidAusweis uid: uidAusweis
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
ausweis = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(undefined, {
params: {
uid: uidAusweis
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
}
if (!ausweis) {
return Astro.redirect("/");
}
aufnahme = await caller.aufnahme._uid.GET.fetch(undefined, {
params: {
uid: ausweis.uid_aufnahme
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
objekt = await caller.objekt._uid.GET.fetch(undefined, {
params: {
uid: ausweis.uid_objekt
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
benutzer = await caller.user.self.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
}); });
} }
const pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis); const pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, benutzer);
return new Response(pdf, { return new Response(pdf, {