Ausweis Verbrauchsausweis Gewerbe + Skala + Berechnung
This commit is contained in:
BIN
public/images/formular/skala-verbrauchsausweis-gewerbe.png
Normal file
BIN
public/images/formular/skala-verbrauchsausweis-gewerbe.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@@ -8,8 +8,8 @@ export const createCaller = createCallerFactory({
|
||||
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||
"auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
|
||||
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
||||
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.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"),
|
||||
"rechnung": await import("../src/pages/api/rechnung/index.ts"),
|
||||
"ticket": await import("../src/pages/api/ticket/index.ts"),
|
||||
@@ -17,9 +17,9 @@ export const createCaller = createCallerFactory({
|
||||
"user/self": await import("../src/pages/api/user/self.ts"),
|
||||
"verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"),
|
||||
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
|
||||
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
|
||||
"verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"),
|
||||
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
|
||||
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
|
||||
"objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"),
|
||||
"objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"),
|
||||
})
|
||||
@@ -1,11 +1,13 @@
|
||||
<script lang="ts">
|
||||
import { Buffer } from "buffer";
|
||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let bilder: UploadedGebaeudeBild[];
|
||||
export let ausweisart: Enums.Ausweisart
|
||||
|
||||
function openWindowWithPost(url: string, data: Record<string, any>) {
|
||||
var form = document.createElement("form");
|
||||
@@ -32,7 +34,8 @@
|
||||
ausweis: JSON.stringify(ausweis),
|
||||
aufnahme: JSON.stringify(aufnahme),
|
||||
objekt: JSON.stringify(objekt),
|
||||
bilder: JSON.stringify(bilder)
|
||||
bilder: JSON.stringify(bilder),
|
||||
ausweisart
|
||||
})
|
||||
}}>
|
||||
<img src="/images/ausweis.webp" alt="Ausweis" />
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let images: UploadedGebaeudeBild[] = [];
|
||||
export let ausweisart: Enums.Ausweisart;
|
||||
</script>
|
||||
|
||||
<div class="grid grid-cols-2 gap-x-6 mt-6">
|
||||
@@ -60,8 +61,8 @@
|
||||
</div>
|
||||
|
||||
<div class="flex flex-row gap-4 mt-4">
|
||||
<AnsichtsausweisButton {ausweis} {aufnahme} {objekt} bilder={images} />
|
||||
<DatenblattButton {ausweis} {aufnahme} {objekt} bilder={images} />
|
||||
<AnsichtsausweisButton {ausweis} {aufnahme} {objekt} bilder={images} {ausweisart} />
|
||||
<DatenblattButton {ausweis} {aufnahme} {objekt} bilder={images} {ausweisart} />
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -9,12 +9,20 @@
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
export let objekt: ObjektClient;
|
||||
export let ausweisart: Enums.Ausweisart;
|
||||
|
||||
let maxPerformance = 250;
|
||||
let maxPerformance = {
|
||||
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000,
|
||||
[Enums.Ausweisart.VerbrauchsausweisWohnen]: 250,
|
||||
[Enums.Ausweisart.BedarfsausweisWohnen]: 250,
|
||||
[Enums.Ausweisart.BedarfsausweisGewerbe]: 250
|
||||
}[ausweisart];
|
||||
|
||||
/**
|
||||
* We use linear interpolation to scale the value between the given boundaries.
|
||||
@@ -54,7 +62,12 @@
|
||||
let translation_2 = 0;
|
||||
$: {
|
||||
(async () => {
|
||||
const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
let result;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
return;
|
||||
@@ -71,7 +84,11 @@
|
||||
}
|
||||
</script>
|
||||
<div class="self-center relative">
|
||||
<img id="skalaImage" class="w-full" src="/images/formular/SKALA-910.png" alt="Energieeffizienz Skala" />
|
||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||
<img id="skalaImage" class="w-full" src="/images/formular/skala-verbrauchsausweis-wohnen.png" alt="Energieeffizienz Skala" />
|
||||
{:else if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
||||
<img id="skalaImage" class="w-full" src="/images/formular/skala-verbrauchsausweis-gewerbe.png" alt="Energieeffizienz Skala" />
|
||||
{/if}
|
||||
<ThickArrowDown
|
||||
size={28}
|
||||
class="fill-base-content absolute top-0 transition-left duration-1000 ease-in-out"
|
||||
|
||||
@@ -0,0 +1,281 @@
|
||||
import { AufnahmeClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
|
||||
import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
|
||||
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js";
|
||||
import moment from "moment";
|
||||
import bauwerkskatalog from "./bauwerkskatalog.json" assert { type: "json" }
|
||||
|
||||
function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient) {
|
||||
let tekWerte = new Array(8).fill(0);
|
||||
|
||||
if (aufnahme.gebaeudetyp && aufnahme.gebaeudetyp in bauwerkskatalog){
|
||||
tekWerte = bauwerkskatalog[aufnahme.gebaeudetyp as keyof typeof bauwerkskatalog];
|
||||
}
|
||||
|
||||
if (!tekWerte) {
|
||||
return [0,0];
|
||||
}
|
||||
|
||||
let faktorWarmwasser = 1;
|
||||
if (ausweis.stromverbrauch_enthaelt_warmwasser) {
|
||||
faktorWarmwasser = 0.9;
|
||||
}
|
||||
|
||||
let faktorHeizung = 0;
|
||||
if (aufnahme.nutzflaeche && aufnahme.nutzflaeche <= 500) {
|
||||
faktorHeizung = 1.46;
|
||||
} else if (aufnahme.nutzflaeche && aufnahme.nutzflaeche > 500 && aufnahme.nutzflaeche <= 50000) {
|
||||
faktorHeizung = 4.53 * (aufnahme.nutzflaeche ** -0.215) + 0.27;
|
||||
} else {
|
||||
faktorHeizung = 0.71;
|
||||
}
|
||||
|
||||
let tekHeizung = tekWerte[0] * faktorHeizung;
|
||||
let tekWarmwasser = tekWerte[1] * faktorWarmwasser;
|
||||
let tekLueftung = ausweis.stromverbrauch_enthaelt_lueftung ? tekWerte[2] : 0;
|
||||
|
||||
let tekEingebauteBeleuchtung = ausweis.stromverbrauch_enthaelt_beleuchtung ? tekWerte[3] : 0;
|
||||
let tekKaelte = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[4] : 0;
|
||||
|
||||
let tekHilfsenergieKuehlung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[5] : 0;
|
||||
let tekBeEntfeuchtung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[6] : 0;
|
||||
|
||||
// TODO: let tekAufzug = ausweis.nwaufzug ? 2 : 0;
|
||||
let tekAufzug = 0;
|
||||
|
||||
let tekSonstiges = (ausweis.stromverbrauch_enthaelt_sonstige != null && ausweis.stromverbrauch_enthaelt_sonstige.length > 0) ? tekWerte[7] : 0;
|
||||
|
||||
let vergleichsWertWaerme = tekHeizung + tekKaelte + tekBeEntfeuchtung;
|
||||
let vergleichsWertStrom = tekWarmwasser + tekLueftung + tekEingebauteBeleuchtung + tekHilfsenergieKuehlung + tekAufzug + tekSonstiges;
|
||||
|
||||
return [vergleichsWertWaerme, vergleichsWertStrom];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt einen array bestehend aus
|
||||
* [0]: Endenergieverbrauch
|
||||
* [1]: Primärenergiebedarf
|
||||
* zurück.
|
||||
*
|
||||
* @param Ausweis ausweis Ein Ausweis dessen Energiebedarf berechnet werden soll
|
||||
* @return VerbrauchsausweisGewerbeCalculationResult
|
||||
*/
|
||||
export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient) {
|
||||
if (!aufnahme || !objekt || !ausweis) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const nutzflaeche = aufnahme.nutzflaeche || 0;
|
||||
|
||||
let startdatum = moment(ausweis.startdatum);
|
||||
|
||||
let klimafaktoren: Awaited<ReturnType<typeof getKlimafaktoren>> = [{
|
||||
month: startdatum.month(),
|
||||
year: startdatum.year(),
|
||||
klimafaktor: 1
|
||||
},
|
||||
{
|
||||
month: startdatum.month(),
|
||||
year: startdatum.year() + 1,
|
||||
klimafaktor: 1
|
||||
},
|
||||
{
|
||||
month: startdatum.month(),
|
||||
year: startdatum.year() + 2,
|
||||
klimafaktor: 1
|
||||
}];
|
||||
|
||||
try {
|
||||
const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz)
|
||||
|
||||
if (response) {
|
||||
klimafaktoren = response
|
||||
}
|
||||
} catch (e) {
|
||||
// TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück.
|
||||
// Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung.
|
||||
// return null
|
||||
}
|
||||
|
||||
// Endenergieverbrauch
|
||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
||||
let umrechnungsfaktor = 1, primaerfaktor = 1, coe = 1;
|
||||
let umrechnungsfaktor_1 = 1, primaerfaktor_1 = 1, coe_1 = 1;
|
||||
if (ausweis.brennstoff_1 && ausweis.einheit_1) {
|
||||
let result = getHeizwertfaktor(ausweis.brennstoff_1, ausweis.einheit_1);
|
||||
umrechnungsfaktor = result.umrechnungsfaktor
|
||||
primaerfaktor = result.primaerenergiefaktor
|
||||
coe = result.coe
|
||||
}
|
||||
|
||||
if (ausweis.brennstoff_2 && ausweis.einheit_2) {
|
||||
let result = getHeizwertfaktor(ausweis.brennstoff_2, ausweis.einheit_2);
|
||||
umrechnungsfaktor_1 = result.umrechnungsfaktor
|
||||
primaerfaktor_1 = result.primaerenergiefaktor
|
||||
coe_1 = result.coe
|
||||
}
|
||||
|
||||
let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * umrechnungsfaktor;
|
||||
let energieVerbrauchGesamt_2 = ((ausweis.verbrauch_4 || 0) + (ausweis.verbrauch_5 || 0) + (ausweis.verbrauch_6 || 0)) * umrechnungsfaktor_1;
|
||||
|
||||
let energieVerbrauchWarmwasser_1 = 0;
|
||||
let energieVerbrauchWarmwasser_2 = 0;
|
||||
|
||||
if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0) {
|
||||
|
||||
// Wenn Warmwasser enthalten und Anteil bekannt
|
||||
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100);
|
||||
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
||||
|
||||
} else if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 == 0){
|
||||
if (aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre)" || aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung" || aufnahme.gebaeudetyp == "Schwimmhallen") {
|
||||
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5;
|
||||
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
||||
|
||||
} else {
|
||||
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.05;
|
||||
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
||||
|
||||
}
|
||||
} else
|
||||
{
|
||||
energieVerbrauchWarmwasser_1 = 0;
|
||||
energieVerbrauchWarmwasser_2 = 0;
|
||||
}
|
||||
|
||||
let kuehlungsZuschlag_1: number;
|
||||
let kuehlungsZuschlag_2: number;
|
||||
if (ausweis.wird_gekuehlt) {
|
||||
kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100);
|
||||
kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100);
|
||||
} else {
|
||||
kuehlungsZuschlag_1 = kuehlungsZuschlag_2 = 0;
|
||||
}
|
||||
|
||||
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
|
||||
let leerstand = (aufnahme.leerstand || 0) / 100;
|
||||
|
||||
let energieVerbrauchHeizung_1 = energieVerbrauchGesamt_1 - energieVerbrauchWarmwasser_1 - kuehlungsZuschlag_1;
|
||||
let energieVerbrauchHeizung_2 = energieVerbrauchGesamt_2 - energieVerbrauchWarmwasser_2 - kuehlungsZuschlag_2;
|
||||
|
||||
let durchschnittsKlimafaktor = klimafaktoren.reduce((acc, c) => acc + c.klimafaktor, 0) / klimafaktoren.length;
|
||||
|
||||
let energieVerbrauchHeizungBereinigt_1 = energieVerbrauchHeizung_1 * durchschnittsKlimafaktor;
|
||||
let energieVerbrauchHeizungBereinigt_2 = energieVerbrauchHeizung_2 * durchschnittsKlimafaktor;
|
||||
|
||||
let durchschnittsEnergieVerbrauchHeizungBereingt = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2) / (3 * nutzflaeche);
|
||||
|
||||
let faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = -0.0028 * durchschnittsEnergieVerbrauchHeizungBereingt + 0.9147;
|
||||
|
||||
if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt <= 0.25) {
|
||||
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 0.25;
|
||||
} else if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt >= 1.0) {
|
||||
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 1.0;
|
||||
}
|
||||
|
||||
let leerstandsZuschlagHeizung = faktorDurchschnittsEnergieVerbrauchHeizungBereinigt * leerstand * (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2);
|
||||
let leerstandsZuschlagWarmwasser = leerstand * (energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2);
|
||||
let leerstandsZuschlagKuehlung = leerstand * (kuehlungsZuschlag_1 + kuehlungsZuschlag_2);
|
||||
|
||||
|
||||
let endEnergieVerbrauch_1 = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchWarmwasser_1 + kuehlungsZuschlag_1) / (3 * nutzflaeche);
|
||||
let endEnergieVerbrauch_2 = (energieVerbrauchHeizungBereinigt_2 + energieVerbrauchWarmwasser_2 + kuehlungsZuschlag_2) / (3 * nutzflaeche);
|
||||
|
||||
let energieVerbrauchStrom = ausweis.strom_1 + ausweis.strom_2 + ausweis.strom_3;
|
||||
let leerstandsZuschlagStrom = leerstand * energieVerbrauchStrom;
|
||||
|
||||
let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom) / (3 * nutzflaeche);
|
||||
let primaerEnergieVerbrauchStrom = endEnergieVerbrauchStrom * 1.8;
|
||||
|
||||
let co2EmissionenStrom = endEnergieVerbrauchStrom * 0.560;
|
||||
|
||||
let endEnergieVerbrauchLeerstandsZuschlag = (leerstandsZuschlagHeizung + leerstandsZuschlagWarmwasser + leerstandsZuschlagKuehlung) / (3 * nutzflaeche);
|
||||
let endEnergieVerbrauchKuehlungsZuschlag_1 = kuehlungsZuschlag_1 / (3 * nutzflaeche);
|
||||
let endEnergieVerbrauchKuehlungsZuschlag_2 = kuehlungsZuschlag_2 / (3 * nutzflaeche);
|
||||
|
||||
let primaerEnergieVerbrauch_1 = endEnergieVerbrauch_1 * primaerfaktor;
|
||||
let primaerEnergieVerbrauch_2 = endEnergieVerbrauch_2 * primaerfaktor_1;
|
||||
|
||||
let primaerEnergieVerbrauchLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * primaerfaktor;
|
||||
let primaerEnergieVerbrauchKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * primaerfaktor;
|
||||
let primaerEnergieVerbrauchKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * primaerfaktor_1;
|
||||
|
||||
let co2Emissionen_1 = endEnergieVerbrauch_1 * coe;
|
||||
let co2Emissionen_2 = endEnergieVerbrauch_2 * coe_1;
|
||||
|
||||
let co2EmissionenLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * coe;
|
||||
let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * coe;
|
||||
let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * coe_1;
|
||||
|
||||
let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag;
|
||||
let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom;
|
||||
let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom;
|
||||
|
||||
let [vergleichsWertWaerme, vergleichsWertStrom] = vergleichsWertNichtWohngebaeude(ausweis, aufnahme);
|
||||
|
||||
// Return all the steps that this function includes for debugging as a json object
|
||||
return {
|
||||
umrechnungsfaktor : umrechnungsfaktor,
|
||||
primaerfaktor : primaerfaktor,
|
||||
coe : coe,
|
||||
umrechnungsfaktor_1 : umrechnungsfaktor_1,
|
||||
primaerfaktor_1 : primaerfaktor_1,
|
||||
coe_1 : coe_1,
|
||||
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
|
||||
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
|
||||
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor,2),
|
||||
Klimafaktor_1 : klimafaktoren[0],
|
||||
Klimafaktor_2 : klimafaktoren[1],
|
||||
Klimafaktor_3 : klimafaktoren[2],
|
||||
anteil_heizung_1: 1 - ((ausweis.anteil_warmwasser_1 || 0) / 100),
|
||||
anteil_heizung_2: 1 - ((ausweis.anteil_warmwasser_2 || 0) / 100),
|
||||
verbrauch_1_kwh: ausweis.verbrauch_1 * umrechnungsfaktor,
|
||||
verbrauch_2_kwh: ausweis.verbrauch_2 * umrechnungsfaktor,
|
||||
verbrauch_3_kwh: ausweis.verbrauch_3 * umrechnungsfaktor,
|
||||
verbrauch_4_kwh: ausweis.verbrauch_4 * umrechnungsfaktor_1,
|
||||
verbrauch_5_kwh: ausweis.verbrauch_5 * umrechnungsfaktor_1,
|
||||
verbrauch_6_kwh: ausweis.verbrauch_6 * umrechnungsfaktor_1,
|
||||
klimafaktoren : klimafaktoren,
|
||||
nutzflaeche : Math.round(nutzflaeche),
|
||||
leerstand : leerstand,
|
||||
leerstandsZuschlagHeizung: Math.round(leerstandsZuschlagHeizung),
|
||||
leerstandsZuschlagWarmwasser: Math.round(leerstandsZuschlagWarmwasser),
|
||||
leerstandsZuschlagKuehlung: Math.round(leerstandsZuschlagKuehlung),
|
||||
endEnergieVerbrauchLeerstandsZuschlag: Math.round(endEnergieVerbrauchLeerstandsZuschlag),
|
||||
endEnergieVerbrauchKuehlungsZuschlag_1: Math.round(endEnergieVerbrauchKuehlungsZuschlag_1),
|
||||
endEnergieVerbrauchKuehlungsZuschlag_2: Math.round(endEnergieVerbrauchKuehlungsZuschlag_2),
|
||||
coeeffkg : co2EmissionenGesamt,
|
||||
energieVerbrauchGesamt_1: Math.round(energieVerbrauchGesamt_1),
|
||||
energieVerbrauchGesamt_2: Math.round(energieVerbrauchGesamt_2),
|
||||
energieVerbrauchWarmwasser_1: Math.round(energieVerbrauchWarmwasser_1),
|
||||
energieVerbrauchWarmwasser_2: Math.round(energieVerbrauchWarmwasser_2),
|
||||
energieVerbrauchHeizung_1: energieVerbrauchHeizung_1,
|
||||
energieVerbrauchHeizung_2: energieVerbrauchHeizung_2,
|
||||
anteil_warmwasser_1: ausweis.anteil_warmwasser_1 / 100,
|
||||
anteil_warmwasser_2: ausweis.anteil_warmwasser_2 / 100,
|
||||
energieVerbrauchHeizungBereinigt_1: Math.round(energieVerbrauchHeizungBereinigt_1),
|
||||
energieVerbrauchHeizungBereinigt_2: Math.round(energieVerbrauchHeizungBereinigt_2),
|
||||
durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(durchschnittsEnergieVerbrauchHeizungBereingt),
|
||||
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(faktorDurchschnittsEnergieVerbrauchHeizungBereinigt,3),
|
||||
endEnergieVerbrauch_1: Math.round(endEnergieVerbrauch_1),
|
||||
endEnergieVerbrauch_2: Math.round(endEnergieVerbrauch_2),
|
||||
energieVerbrauchStrom: energieVerbrauchStrom,
|
||||
leerstandsZuschlagStrom: leerstandsZuschlagStrom,
|
||||
endEnergieVerbrauchStrom: Math.round(endEnergieVerbrauchStrom),
|
||||
primaerEnergieVerbrauchStrom: Math.round(primaerEnergieVerbrauchStrom),
|
||||
primaerEnergieVerbrauch_1: Math.round(primaerEnergieVerbrauch_1),
|
||||
primaerEnergieVerbrauch_2: Math.round(primaerEnergieVerbrauch_2),
|
||||
primaerEnergieVerbrauchLeerstandsZuschlag: Math.round(primaerEnergieVerbrauchLeerstandsZuschlag),
|
||||
primaerEnergieVerbrauchKuehlungsZuschlag_1: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_1),
|
||||
primaerEnergieVerbrauchKuehlungsZuschlag_2: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_2),
|
||||
co2Emissionen_1: co2Emissionen_1,
|
||||
co2Emissionen_2: co2Emissionen_2,
|
||||
co2EmissionenLeerstandsZuschlag: co2EmissionenLeerstandsZuschlag,
|
||||
co2EmissionenKuehlungsZuschlag_1: co2EmissionenKuehlungsZuschlag_1,
|
||||
co2EmissionenKuehlungsZuschlag_2: co2EmissionenKuehlungsZuschlag_2,
|
||||
co2EmissionenGesamt: Math.round(co2EmissionenGesamt),
|
||||
endEnergieVerbrauchGesamt: Math.round(endEnergieVerbrauchGesamt),
|
||||
primaerEnergieVerbrauchGesamt: Math.round(primaerEnergieVerbrauchGesamt),
|
||||
vergleichsWertWaerme: vergleichsWertWaerme,
|
||||
vergleichsWertStrom: vergleichsWertStrom,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Verwaltungsgebäude (allgemein)": [48.5, 6.9, 3.2, 10.7, 2.6, 3.1, 0.1, 2.8],
|
||||
"Parlaments- und Gerichtsgebäude": [49.9, 6.8, 3, 9.5, 1.2, 0.9, 1.7, 0.6],
|
||||
"Ministerien u. Ämter u. Behörden": [48.3, 7.4, 3.7, 10.8, 1.5, 1.2, 1, 0.7],
|
||||
"Polizeidienstgebäude": [52.4, 7.4, 2.5, 10.4, 0.5, 0.4, 0, 0.7],
|
||||
"Gebäude für öffentliche Bereitschaftsdienste": [51.6, 10.2, 3, 7.8, 0.3, 0.2, 0, 4],
|
||||
"Feuerwehrdienstgebäude": [50.8, 7.1, 3.2, 6.7, 0.3, 0.2, 0, 3.7],
|
||||
"Bürogebäude": [49, 8.1, 4.7, 12.9, 2.9, 2.2, 0, 2.8],
|
||||
"Bürogebäude - überwiegend Großraumbüros": [47.4, 12.8, 7.3, 16.6, 6, 4.3, 0, 0.9],
|
||||
"Bankgebäude": [48, 6.4, 1.6, 10.7, 1.5, 1.1, 0, 0.6],
|
||||
"Hochschule und Forschung (allgemein)": [66.5, 6.7, 13.3, 11, 3.4, 2.2, 3.8, 1.2],
|
||||
"Gebäude für Lehre": [57.2, 5.6, 8.7, 8.5, 2.5, 1.5, 0.4, 1.1],
|
||||
"Institute für Lehre und Forschung": [65, 7.6, 13.8, 11.7, 3.5, 2.4, 14.7, 2.1],
|
||||
"Gebäude für Forschung ohne Lehre": [87.8, 7.4, 14.9, 14.8, 3.5, 2.4, 0, 1.2],
|
||||
"Laborgebäude": [82.8, 8, 20.3, 13.5, 4.2, 2.9, 1.7, 1.3],
|
||||
"Gesundheitswesen (allgemein)": [55.7, 15.3, 4.9, 17.4, 1.6, 1.3, 0, 1.1],
|
||||
"Krankenhäuser (ohne Forschung und Lehre)": [64.1, 40.8, 10.4, 15.8, 1.7, 1.6, 0, 1.2],
|
||||
"Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung": [61.7, 33.6, 9.2, 15.9, 1.7, 1.6, 0, 0.9],
|
||||
"Medizinische Einrichtungen für nicht stationäre Versorgung": [51.2, 8.6, 2.2, 18.3, 1.4, 1, 0, 1.3],
|
||||
"Gebäude für Reha": [null, 59.4, 22.1, 6, 14.6, 0.9, 0.7, 0, 3.5],
|
||||
"Bildungseinrichtungen (allgemein)": [49.7, 19.5, 4.1, 5.5, 0.2, 0.2, 0, 0.6],
|
||||
"Schulen": [49.3, 22.4, 3.9, 5.5, 0.3, 0.2, 0, 0.6],
|
||||
"Kinderbetreuungseinrichtungen": [50.4, 17.3, 4.2, 5.5, 0.1, 0.1, 0, 0.6],
|
||||
"Kultureinrichtungen (allgemein)": [55.9, 7.5, 6.7, 9, 1.6, 1.2, 0.1, 0.3],
|
||||
"Bibliotheken/Archive": [49, 5, 2.1, 14.3, 0.5, 0.4, 0, 0.3],
|
||||
"Ausstellungsgebäude": [57.6, 7.7, 6.3, 7.8, 1.7, 1.3, 0.3, 0.2],
|
||||
"Veranstaltungsgebäude": [58.4, 9.1, 7, 8.9, 1.3, 0.9, 0.1, 0.3],
|
||||
"Gemeinschafts-/Gemeindehäuser": [63.6, 10, 5.6, 10.8, 0.8, 0.6, 0.1, 6],
|
||||
"Opern/Theater": [58.8, 7.6, 9.1, 8.6, 2, 1.3, 0, 0.9],
|
||||
"Sporteinrichtungen (allgemein)": [65.5, 27.3, 6.4, 14.5, 0.6, 0.6, 0, 1.9],
|
||||
"Sporthallen": [68.6, 22, 4.6, 14.3, 0.2, 0.2, 0, 0.1],
|
||||
"Fitnessstudios": [60.6, 62.2, 11.9, 24.5, 4, 4.2, 0, 8.9],
|
||||
"Schwimmhallen": [63.8, 24.7, 8.3, 13.4, 1.1, 1.1, 30, 7.3],
|
||||
"Gebäude für Sportaußenanlagen": [75.2, 22.5, 5.7, 10.2, 0, 0, 0, 5.5],
|
||||
"Verpflegungseinrichtungen (allgemein)": [75.9, 77.7, 16.6, 18.1, 3.5, 3, 0, 24.8],
|
||||
"Beherbergungsstätten (allgemein)": [52.1, 86, 9.1, 9.1, 3.3, 2.7, 0, 7],
|
||||
"Hotels/Pensionen": [51.2, 89.1, 9.1, 8.6, 3.5, 2.9, 0, 6.8],
|
||||
"Jugendherbergen u. Ferienhäuser": [63.4, 50.9, 1.9, 12.6, 0, 0, 0, 8.8],
|
||||
"Gaststätten": [77.8, 79, 13.7, 19.7, 3.8, 3.3, 0, 25.2],
|
||||
"Mensen u. Kantinen": [67, 67.3, 21, 11.4, 0.7, 0.5, 0, 22.7],
|
||||
"Gewerbliche und industrielle Gebäude (allgemein)": [38.7, 12.6, 2.1, 9.6, 0.8, 0.5, 0, 12.2],
|
||||
"Gewerbliche und industrielle Gebäude - schwere Arbeit": [null, 37.8, 20, 3.1, 11.8, 1, 0.6, 0, 22.6],
|
||||
"Gewerbliche und industrielle Gebäude - Mischung aus leichter u. schwerer Arbeit": [36, 24.2, 3.8, 13, 2.1, 1.2, 0, 24.9],
|
||||
"Gewerbliche und industrielle Gebäude - leichte Arbeit": [null, 38.1, 19.8, 3.3, 15.2, 1.9, 1.1, 0, 22.3],
|
||||
"Gebäude für Lagerung": [38.1, 19.3, 3.3, 13.2, 1.7, 1, 0, 21.6],
|
||||
"Verkaufsstätten (allgemein)": [47.9, 7.6, 5.6, 16.3, 2.6, 2, 0, 6.9],
|
||||
"Kaufhäuser": [45.9, 6.4, 6, 16.6, 1.1, 0.9, 0, 2.7],
|
||||
"Kaufhauszentren/Einkaufszentren": [47.3, 11.1, 7.4, 16.6, 4.6, 3.5, 0.1, 5.5],
|
||||
"Märkte": [48.7, 6.2, 7.3, 17.3, 2.8, 2.1, 0, 10.5],
|
||||
"Märkte mit sehr hohem Anteil von Kühlung für Lebensmittel": [48.7, 6.2, 7.3, 17.3, 2.8, 2.1, 0, 72.5],
|
||||
"Läden": [46.8, 6.4, 1.9, 15.8, 0.9, 0.7, 0, 2.1],
|
||||
"Läden mit sehr hohem Anteil von Kühlung für Lebensmittel": [46.8, 6.4, 1.9, 15.8, 0.9, 0.7, 0, 54.1],
|
||||
"Fernmeldetechnik": [38.4, 4, 3.4, 16, 0, 0, 0, 53.7]
|
||||
}
|
||||
@@ -1,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();
|
||||
}
|
||||
BIN
src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf
Normal file
BIN
src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf
Normal file
Binary file not shown.
@@ -1001,6 +1001,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc
|
||||
bind:ausweis
|
||||
bind:gebaeude
|
||||
bind:aufnahme
|
||||
{ausweisart}
|
||||
/></Bereich
|
||||
>
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
import { BenutzerClient } from "#components/Ausweis/types.js";
|
||||
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import moment from "moment";
|
||||
|
||||
export let ausweis: VerbrauchsausweisGewerbeClient;
|
||||
export let user: BenutzerClient = {} as BenutzerClient;
|
||||
@@ -28,7 +29,38 @@
|
||||
export let bilder: UploadedGebaeudeBild[] = [];
|
||||
export let ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe;
|
||||
|
||||
function automatischAusfüllen() {}
|
||||
function automatischAusfüllen() {
|
||||
aufnahme.baujahr_gebaeude = [1952];
|
||||
aufnahme.baujahr_heizung = [1952];
|
||||
aufnahme.saniert = true;
|
||||
aufnahme.einheiten = 1;
|
||||
aufnahme.gebaeudetyp = "Polizeidienstgebäude";
|
||||
aufnahme.keller =
|
||||
Enums.Heizungsstatus.NICHT_VORHANDEN;
|
||||
aufnahme.dachgeschoss =
|
||||
Enums.Heizungsstatus.NICHT_VORHANDEN;
|
||||
aufnahme.lueftung = "Fensterlueftung";
|
||||
aufnahme.kuehlung = "1";
|
||||
ausweis.ausstellgrund = "Vermietung";
|
||||
ausweis.verbrauch_1 = 15000;
|
||||
ausweis.verbrauch_2 = 14000;
|
||||
ausweis.verbrauch_3 = 16000;
|
||||
aufnahme.flaeche = 152;
|
||||
aufnahme.nutzflaeche = 172;
|
||||
ausweis.keller_beheizt = true;
|
||||
|
||||
aufnahme.brennstoff_1 = "Erdgas H";
|
||||
ausweis.einheit_1 = "kWh";
|
||||
ausweis.anteil_warmwasser_1 = 18;
|
||||
ausweis.startdatum = moment("01.01.2021").toDate();
|
||||
objekt.plz = "21039";
|
||||
objekt.ort = "Hamburg";
|
||||
objekt.adresse = "Curslacker Deich 170";
|
||||
aufnahme.gebaeudeteil = "Gesamtgebäude";
|
||||
|
||||
objekt = objekt;
|
||||
ausweis = ausweis;
|
||||
}
|
||||
|
||||
async function spaeterWeitermachen() {
|
||||
}
|
||||
@@ -45,6 +77,7 @@
|
||||
bind:ausweis
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:objekt={objekt}
|
||||
{ausweisart}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -162,6 +195,7 @@
|
||||
bind:ausweis
|
||||
bind:objekt
|
||||
bind:aufnahme
|
||||
{ausweisart}
|
||||
/></Bereich>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -185,6 +185,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen"
|
||||
bind:ausweis
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:objekt={objekt}
|
||||
{ausweisart}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -291,6 +292,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen"
|
||||
bind:ausweis
|
||||
bind:objekt={objekt}
|
||||
bind:aufnahme
|
||||
{ausweisart}
|
||||
/></Bereich
|
||||
>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
|
||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { APIRoute } from "astro";
|
||||
@@ -71,7 +72,12 @@ export const GET: APIRoute = async (Astro) => {
|
||||
}
|
||||
});
|
||||
|
||||
const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user);
|
||||
let pdf: Uint8Array<ArrayBufferLike> | null = null;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
pdf = await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user);
|
||||
}
|
||||
|
||||
return new Response(pdf, {
|
||||
headers: {
|
||||
@@ -90,6 +96,7 @@ export const POST: APIRoute = async (Astro) => {
|
||||
const aufnahme = JSON.parse(params.get("aufnahme"));
|
||||
const objekt = JSON.parse(params.get("objekt"));
|
||||
const bilder = JSON.parse(params.get("bilder"));
|
||||
const ausweisart: Enums.Ausweisart = params.get("ausweisart")
|
||||
|
||||
let user: BenutzerClient = {};
|
||||
|
||||
@@ -103,7 +110,12 @@ export const POST: APIRoute = async (Astro) => {
|
||||
|
||||
}
|
||||
|
||||
const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user);
|
||||
let pdf: Uint8Array<ArrayBufferLike> | null = null;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
pdf = await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user);
|
||||
}
|
||||
|
||||
return new Response(pdf, {
|
||||
headers: {
|
||||
|
||||
Reference in New Issue
Block a user