From 2c2c69f2d35fb2e42d3f1e3b31e2a384e00635ba Mon Sep 17 00:00:00 2001 From: Moritz Utcke <62291876+Letsmoe@users.noreply.github.com> Date: Mon, 8 May 2023 16:35:36 +0400 Subject: [PATCH] Bildupload - UI - Globaler Ausweis --- docker-compose.yml | 1 + .../Ausweis/AusweisPreviewContainer.svelte | 39 ++- src/components/Ausweis/DaemmungImage.svelte | 23 +- src/components/Ausweis/FensterImage.svelte | 23 +- src/components/Ausweis/HeizungImage.svelte | 22 +- src/components/Ausweis/Hilfe.svelte | 2 +- .../Ausweis/PerformanceScore.svelte | 19 +- src/components/Ausweis/Verbrauch.svelte | 108 +++------ src/components/UploadImages.svelte | 58 +++++ .../VerbrauchsausweisContent.svelte | 94 +++++--- .../energyPerformanceCalculation.ts | 40 --- src/layouts/AusweisLayout.astro | 2 +- src/lib/Ausweis/Verbrauchsausweis.ts | 228 ++++++++---------- src/lib/BitChecker.ts | 18 ++ src/lib/Klimafaktoren.ts | 14 +- src/lib/server/Heizwertfaktor.ts | 26 +- src/pages/api/ausweis/verbrauchsausweis.ts | 16 ++ .../{climate_factor => klimafaktor}/index.ts | 15 +- src/pages/index.astro | 2 +- src/pages/welcher-energieausweis.mdx | 43 ++-- tailwind.config.cjs | 2 +- 21 files changed, 452 insertions(+), 343 deletions(-) create mode 100644 src/components/UploadImages.svelte delete mode 100644 src/components/Verbrauchsausweis/energyPerformanceCalculation.ts create mode 100644 src/lib/BitChecker.ts create mode 100644 src/pages/api/ausweis/verbrauchsausweis.ts rename src/pages/api/{climate_factor => klimafaktor}/index.ts (80%) diff --git a/docker-compose.yml b/docker-compose.yml index cacf2010..14e020a0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,6 +15,7 @@ services: - 3000:3000 volumes: - ./:/online-energieausweis + - ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui networks: - postgres db: diff --git a/src/components/Ausweis/AusweisPreviewContainer.svelte b/src/components/Ausweis/AusweisPreviewContainer.svelte index 77ed2293..22c757df 100644 --- a/src/components/Ausweis/AusweisPreviewContainer.svelte +++ b/src/components/Ausweis/AusweisPreviewContainer.svelte @@ -5,6 +5,10 @@ import HelpLabel from "~/components/HelpLabel.svelte"; export let ausweis: Verbrauchsausweis; + + import UploadImages from "../UploadImages.svelte"; + + let images: (File & { data: string })[] = [];
@@ -21,27 +25,20 @@
-
-
- -
- -
- - +
+ +
+ {#each images as image, i} +
+ {image.name} + +
+ {/each}
diff --git a/src/components/Ausweis/DaemmungImage.svelte b/src/components/Ausweis/DaemmungImage.svelte index 70fd3020..c8b476f8 100644 --- a/src/components/Ausweis/DaemmungImage.svelte +++ b/src/components/Ausweis/DaemmungImage.svelte @@ -1,3 +1,9 @@ + +
@@ -48,6 +54,21 @@ Energieausweis!
Bitte laden Sie hier mind. 2 Bilder hoch:

-
+
+ +
+ {#each images as image, i} +
+ {image.name} + +
+ {/each} +
+
diff --git a/src/components/Ausweis/FensterImage.svelte b/src/components/Ausweis/FensterImage.svelte index 7d7cb7ff..8b300964 100644 --- a/src/components/Ausweis/FensterImage.svelte +++ b/src/components/Ausweis/FensterImage.svelte @@ -1,3 +1,9 @@ + +
@@ -45,6 +51,21 @@ Energieausweis!
Bitte laden Sie hier mind. 1 Bild hoch:

-
+
+ +
+ {#each images as image, i} +
+ {image.name} + +
+ {/each} +
+
diff --git a/src/components/Ausweis/HeizungImage.svelte b/src/components/Ausweis/HeizungImage.svelte index 40bb67fd..5e2658e3 100644 --- a/src/components/Ausweis/HeizungImage.svelte +++ b/src/components/Ausweis/HeizungImage.svelte @@ -1,3 +1,8 @@ +
@@ -52,6 +57,21 @@ Energieausweis!
Bitte laden Sie hier mind. 1 Bild hoch:

-
+
+ +
+ {#each images as image, i} +
+ {image.name} + +
+ {/each} +
+
diff --git a/src/components/Ausweis/Hilfe.svelte b/src/components/Ausweis/Hilfe.svelte index 3bcdc54d..364a22cf 100644 --- a/src/components/Ausweis/Hilfe.svelte +++ b/src/components/Ausweis/Hilfe.svelte @@ -3,7 +3,7 @@
- diff --git a/src/components/Ausweis/PerformanceScore.svelte b/src/components/Ausweis/PerformanceScore.svelte index 799d8fba..4c757986 100644 --- a/src/components/Ausweis/PerformanceScore.svelte +++ b/src/components/Ausweis/PerformanceScore.svelte @@ -1,6 +1,7 @@
diff --git a/src/components/Ausweis/Verbrauch.svelte b/src/components/Ausweis/Verbrauch.svelte index e4658b64..ba3279fd 100644 --- a/src/components/Ausweis/Verbrauch.svelte +++ b/src/components/Ausweis/Verbrauch.svelte @@ -1,8 +1,9 @@
-
+
Wenn eine zusätzliche Heizquelle vorhanden geben Sie hier drei @@ -81,7 +53,7 @@
@@ -113,7 +85,7 @@ Koks: Stark kohlenstoffhaltiger Brennstoff.

- {#each Object.keys(fuelMap) as fuel} @@ -132,10 +104,10 @@ @@ -147,11 +119,14 @@
@@ -161,15 +136,14 @@
@@ -183,7 +157,6 @@ name="energieverbrauch_zeitraum_monat" class="rounded-tr-none rounded-br-none w-full m-0" bind:value={month} - on:change={fetchClimateFactors} required > @@ -196,7 +169,6 @@ name="energieverbrauch_zeitraum_jahr" class="rounded-tl-none rounded-bl-none w-full m-0" bind:value={year} - on:change={fetchClimateFactors} required > @@ -209,7 +181,7 @@ von von bis bis bis
@@ -273,7 +245,7 @@
@@ -282,7 +254,7 @@
@@ -293,8 +265,8 @@
@@ -302,8 +274,8 @@
@@ -311,8 +283,8 @@
diff --git a/src/components/UploadImages.svelte b/src/components/UploadImages.svelte new file mode 100644 index 00000000..7bc12cb8 --- /dev/null +++ b/src/components/UploadImages.svelte @@ -0,0 +1,58 @@ + + +{#if max > 1} + +{:else} + +{/if} diff --git a/src/components/Verbrauchsausweis/VerbrauchsausweisContent.svelte b/src/components/Verbrauchsausweis/VerbrauchsausweisContent.svelte index 6d7dbb5c..c10c6847 100644 --- a/src/components/Verbrauchsausweis/VerbrauchsausweisContent.svelte +++ b/src/components/Verbrauchsausweis/VerbrauchsausweisContent.svelte @@ -10,33 +10,14 @@ import FensterImage from "~/components/Ausweis/FensterImage.svelte"; import DaemmungImage from "~/components/Ausweis/DaemmungImage.svelte"; import AusweisPreviewContainer from "~/components/Ausweis/AusweisPreviewContainer.svelte"; - import { calculateEnergyPerformanceScore } from "./energyPerformanceCalculation"; import ZipSearch from "../ZIPSearch.svelte"; import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; + import moment from "moment"; - const ausweis = new Verbrauchsausweis(); + let ausweis = new Verbrauchsausweis(); - let conversionFactor: number = 0; - let calorificValueFactor: number = 0; - - let energyConsumption = [0, 0, 0]; - let additionalEnergyConsumption = [0, 0, 0]; - let climateFactors = [0, 0, 0]; - - let area = 0; - let energyPerformance = 0; - - $: { - energyPerformance = calculateEnergyPerformanceScore( - energyConsumption, - additionalEnergyConsumption, - ausweis.anteil_warmwasser_1, - climateFactors, - area * (ausweis.keller_beheizt ? 1.35 : 1.2), - conversionFactor, - calorificValueFactor - ); - } + console.log(ausweis); + let needsRequirementCertificate: boolean = false; @@ -56,11 +37,19 @@ ausweis.objekt_saniert = true; ausweis.anzahl_einheiten = 1; ausweis.ausstellgrund = "Vermietung"; - energyConsumption = [15000, 14000, 16000]; - area = 152; + ausweis.energieverbrauch_1_heizquelle_1 = 15000; + ausweis.energieverbrauch_2_heizquelle_1 = 14000; + ausweis.energieverbrauch_3_heizquelle_1 = 16000; + ausweis.wohnflaeche = 152; ausweis.keller_beheizt = true; + ausweis.energietraeger_1 = "Erdgas H" + ausweis.energietraeger_einheit_heizquelle_1 = "kWh" ausweis.warmwasser_enthalten = true; ausweis.anteil_warmwasser_1 = 18; + ausweis.energieverbrauch_zeitraum = moment("12.01.2019"); + ausweis.objekt_plz = "21039"; + ausweis.objekt_ort = "Hamburg"; + ausweis.objekt_strasse = "Curslacker Deich 170"; } @@ -71,8 +60,7 @@ @@ -84,7 +72,7 @@ Später Weitermachen
-
@@ -151,6 +139,7 @@ required data-msg-minlength="min. 5 Zeichen" data-msg-maxlength="max. 40 Zeichen" + bind:value={ausweis.objekt_strasse} /> @@ -196,7 +185,7 @@ autocomplete="off" data-rule-minlength="2" data-msg-minlength="min. 2 Zeichen" - bind:value={area} + bind:value={ausweis.wohnflaeche} /> @@ -240,12 +229,7 @@
@@ -283,7 +267,7 @@ @@ -319,6 +304,7 @@ >Heizung @@ -326,6 +312,7 @@ >Warmwasser @@ -333,6 +320,7 @@ >Lüftung @@ -340,6 +328,7 @@ >Kühlung @@ -509,6 +498,7 @@ >Zentral/Etage @@ -518,6 +508,7 @@ >Einzelöfen @@ -527,6 +518,7 @@ >Durchlauferhitzer @@ -536,6 +528,7 @@ >Standardkessel @@ -545,6 +538,7 @@ >Solarsystem für Warmwasser @@ -554,6 +548,7 @@ >Wärmepumpe @@ -563,6 +558,7 @@ >Niedertemperaturkessel @@ -572,6 +568,7 @@ >Brennwertkessel @@ -581,6 +578,7 @@ >Warmwasserrohre gedämmt @@ -590,6 +588,7 @@ >Heizungsrohre gedämmt @@ -599,6 +598,7 @@ >Zirkulation @@ -608,6 +608,7 @@ >Raumtemperaturregler @@ -637,6 +638,7 @@ >Einfachglas @@ -646,6 +648,7 @@ >Doppelverglasung @@ -655,6 +658,7 @@ >Isolierverglasung @@ -664,6 +668,7 @@ >Dreifachverglasung @@ -673,6 +678,7 @@ >Alle Fenster dicht @@ -682,6 +688,7 @@ >Fenster teilweise undicht @@ -691,6 +698,7 @@ >Alle Türen dicht @@ -700,6 +708,7 @@ >Türen teilweise undicht @@ -709,6 +718,7 @@ >Rollladenkästen gedämmt, luftdicht @@ -743,6 +753,7 @@ >Außenwand gedämmt @@ -752,6 +763,7 @@ >Kelleraußenwand gedämmt @@ -761,6 +773,7 @@ >Kellerdecke gedämmt @@ -770,6 +783,7 @@ >Dachgeschoss gedämmt @@ -779,6 +793,7 @@ >Oberste Geschossdecke gedämmt @@ -788,6 +803,7 @@ >Oberste Geschossdecke min. 12cm gedämmt @@ -810,7 +826,7 @@
- +
diff --git a/src/components/Verbrauchsausweis/energyPerformanceCalculation.ts b/src/components/Verbrauchsausweis/energyPerformanceCalculation.ts deleted file mode 100644 index f92a0226..00000000 --- a/src/components/Verbrauchsausweis/energyPerformanceCalculation.ts +++ /dev/null @@ -1,40 +0,0 @@ - -/** - * - * @param energyConsumption Ein Array aus allen Verbräuchen der drei Verbrauchsjahre für die primäre Energiequelle - * @param additionalEnergyConsumption Ein Array aus allen Verbräuchen der drei Verbrauchsjahre für die sekundäre Energiequelle - * @param waterHeatingPortion Der Anteil den Warmwasser am Energieverbrauch ausgemacht hat - * @param climateFactors Ein Array aus drei Klimafaktoren für die Verbrauchsjahre - * @param area Die Nutzfläche des Gebäudes - * @param conversionFactor Der Umrechnungsfaktor des Energieträgers - * @param calorificValueFactor Der Heizwertfaktor des Energieträgers - * @returns Den Performance Wert den das Gebäude erzielt hat. - */ -export function calculateEnergyPerformanceScore( - energyConsumption: number[], - additionalEnergyConsumption: number[], - waterHeatingPortion: number, - climateFactors: number[], - area: number, - conversionFactor: number, - calorificValueFactor: number -): number { - // Alle Werte müssen in kWh umgerechnet werden. - let energyConsumptionKWh = energyConsumption.map((x) => convertEnergyConsumptionToKWh(x, conversionFactor, calorificValueFactor)) - let additionalEnergyConsumptionKWh = additionalEnergyConsumption.map((x) => convertEnergyConsumptionToKWh(x, conversionFactor, calorificValueFactor)) - let heatingPortion = 1 - (waterHeatingPortion / 100); - - - return (heatingPortion * (energyConsumptionKWh[0] + additionalEnergyConsumptionKWh[0]) * climateFactors[0] + - (waterHeatingPortion / 100) * (energyConsumptionKWh[0] + additionalEnergyConsumptionKWh[0]) + - heatingPortion * (energyConsumptionKWh[1] + additionalEnergyConsumptionKWh[1]) * climateFactors[1] + - (waterHeatingPortion / 100) * (energyConsumptionKWh[1] + additionalEnergyConsumptionKWh[1]) + - heatingPortion * (energyConsumptionKWh[2] + additionalEnergyConsumptionKWh[2]) * climateFactors[2] + - (waterHeatingPortion / 100) * (energyConsumptionKWh[2] + additionalEnergyConsumptionKWh[2])) / - 3 / - (area || 1); -} - -function convertEnergyConsumptionToKWh(consumption: number, conversionFactor: number, calorificValueFactor: number): number { - return (consumption * conversionFactor) / calorificValueFactor; -} diff --git a/src/layouts/AusweisLayout.astro b/src/layouts/AusweisLayout.astro index eafd525c..f105afc6 100644 --- a/src/layouts/AusweisLayout.astro +++ b/src/layouts/AusweisLayout.astro @@ -101,7 +101,7 @@ const schema = JSON.stringify({ min-height: 100vh; } - button, .button, button[type="button"] { + .button { @apply px-8 py-2 bg-secondary rounded-lg text-white font-medium hover:shadow-lg transition-all hover:underline active:bg-blue-900 text-center; color: #fff !important; } diff --git a/src/lib/Ausweis/Verbrauchsausweis.ts b/src/lib/Ausweis/Verbrauchsausweis.ts index d4cccf28..78b08258 100644 --- a/src/lib/Ausweis/Verbrauchsausweis.ts +++ b/src/lib/Ausweis/Verbrauchsausweis.ts @@ -1,5 +1,9 @@ +import { Moment } from "moment"; import { getKlimafaktorenClient } from "../Klimafaktoren"; import { getHeizwertfaktorClient } from "../server/Heizwertfaktor"; +import moment from "moment"; +import fuelList from "~/components/Ausweis/fuelList"; +import { BitChecker } from "../BitChecker"; export enum AusweisType { VERBRAUCHSAUSWEIS, @@ -15,40 +19,13 @@ export enum Lueftungskonzept { } export type Ausweisart = "VA" | "BA" | "VANW"; -export type Ausstellgrund = "Vermietung" | "Neubau" | "Verkauf" | "Modernisierung" | "Sonstiges"; +export type Ausstellgrund = + | "Vermietung" + | "Neubau" + | "Verkauf" + | "Modernisierung" + | "Sonstiges"; -class BitChecker { - public value: number; - - constructor(number: number) { - this.value = number; - } - - public isSet(bitIndex: number): boolean { - const bitMask = 1 << bitIndex; - return (this.value & bitMask) !== 0; - } - - public set(index: number): number { - if (!this.isSet(index)) { - this.value += 2 ** index; - } - - return this.value; - } - - public off(index: number) { - if (this.isSet(index)) { - this.value -= 2 ** index; - } - - return this.value; - } - - public valueOf(): number { - return this.value; - } -} export class Verbrauchsausweis { @@ -70,7 +47,7 @@ export class Verbrauchsausweis { public erstellungsdatum: Date = new Date(); public ausstellgrund: Ausstellgrund = "Vermietung"; - public energieverbrauch_zeitraum: Date = new Date(); + public energieverbrauch_zeitraum: Moment = moment(); public energieverbrauch_1_heizquelle_1: number = 0; public energieverbrauch_2_heizquelle_1: number = 0; public energieverbrauch_3_heizquelle_1: number = 0; @@ -98,11 +75,13 @@ export class Verbrauchsausweis { public leerstand: number = 0; public images: string[] = []; - public versorgungssysteme: number = 0; - public fenster_dach: number = 0; - public energiequelle_2_nutzung: BitChecker = new BitChecker(0); - public daemmung: number = 0; - public energetische_nutzfläche: number = 0; + public versorgungssysteme: boolean[] = BitChecker(0); + public fenster_dach: boolean[] = BitChecker(0); + public energiequelle_2_nutzung: boolean[] = BitChecker(0); + public daemmung: boolean[] = BitChecker(0); + public get energetische_nutzfläche(): number { + return this.wohnflaeche * (this.keller_beheizt ? 1.35 : 1.2); + }; /** * Bedarfsausweis spezifische Eigenschaften @@ -181,109 +160,98 @@ export class Verbrauchsausweis { const json = JSON.parse(text.toString()); return json; - - } catch(e) { + } catch (e) { return null; } } - public async endEnergieVerbrauch(): Promise { - const date = this.energieverbrauch_zeitraum - const klimafaktoren = await getKlimafaktorenClient( - date, - this.objekt_plz - ); + public get primaer_energie_verbrauch(): Promise { + return (async () => { + const Endenergieverbrauch = await this.end_energie_verbrauch; - // Endenergieverbrauch - // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. - let [umrechnungsfaktor, primaerfaktor, heizwertfaktor, coe] = [ - 1, 1, 1, 1, - ]; - let [umrechnungsfaktor_1, primaerfaktor_1, heizwertfaktor_1, coe_1] = [ - 1, 1, 1, 1, - ]; - if (this.energietraeger_1 && this.energietraeger_einheit_heizquelle_1) { - [umrechnungsfaktor, primaerfaktor, heizwertfaktor, coe] = - await getHeizwertfaktorClient( - this.energietraeger_1, - this.energietraeger_einheit_heizquelle_1 - ); - } + const brennstoff_1 = getHeizwertfaktorClient(this.energietraeger_1, this.energietraeger_einheit_heizquelle_1); - if (this.energietraeger_2 && this.energietraeger_einheit_heizquelle_2) { - [umrechnungsfaktor_1, primaerfaktor_1, heizwertfaktor_1, coe_1] = - await getHeizwertfaktorClient( - this.energietraeger_2, - this.energietraeger_einheit_heizquelle_2 - ); - } + return Endenergieverbrauch * brennstoff_1.primärenergiefaktor; + })(); + } - let verbrauch_1_kwh = - (this.energieverbrauch_1_heizquelle_1 * umrechnungsfaktor) / - heizwertfaktor; - let verbrauch_2_kwh = - (this.energieverbrauch_2_heizquelle_1 * umrechnungsfaktor) / - heizwertfaktor; - let verbrauch_3_kwh = - (this.energieverbrauch_3_heizquelle_1 * umrechnungsfaktor) / - heizwertfaktor; - let verbrauch_4_kwh = - (this.energieverbrauch_1_heizquelle_2 * umrechnungsfaktor_1) / - heizwertfaktor_1; - let verbrauch_5_kwh = - (this.energieverbrauch_2_heizquelle_2 * umrechnungsfaktor_1) / - heizwertfaktor_1; - let verbrauch_6_kwh = - (this.energieverbrauch_3_heizquelle_2 * umrechnungsfaktor_1) / - heizwertfaktor_1; + public get end_energie_verbrauch(): Promise { + return (async () => { + const date = this.energieverbrauch_zeitraum; + const klimafaktoren = await getKlimafaktorenClient( + date, + this.objekt_plz + ); - let warmwasserZuschlag = 0; - let leerstandsZuschlag = 0; - let kuehlungsZuschlag = 0; - if (this.anteil_warmwasser_1 == 0) { - warmwasserZuschlag = 20 * this.energetische_nutzfläche * 3; - } + // Endenergieverbrauch + // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. + let brennstoff_1 = getHeizwertfaktorClient(this.energietraeger_1, this.energietraeger_einheit_heizquelle_1); + let brennstoff_2 = getHeizwertfaktorClient(this.energietraeger_2, this.energietraeger_einheit_heizquelle_2); - if (this.leerstand > 0) { - let durchschnittsKlimafaktor = - klimafaktoren.reduce((a, b) => a + b, 0) / 3; + let verbrauch_1_kwh = + (this.energieverbrauch_1_heizquelle_1 * brennstoff_1.umrechnungsfaktor) + let verbrauch_2_kwh = + (this.energieverbrauch_2_heizquelle_1 * brennstoff_1.umrechnungsfaktor) + let verbrauch_3_kwh = + (this.energieverbrauch_3_heizquelle_1 * brennstoff_1.umrechnungsfaktor) + let verbrauch_4_kwh = + (this.energieverbrauch_1_heizquelle_2 * brennstoff_2.umrechnungsfaktor) + let verbrauch_5_kwh = + (this.energieverbrauch_2_heizquelle_2 * brennstoff_2.umrechnungsfaktor) + let verbrauch_6_kwh = + (this.energieverbrauch_3_heizquelle_2 * brennstoff_2.umrechnungsfaktor) - leerstandsZuschlag = - ((verbrauch_1_kwh + - verbrauch_2_kwh + - verbrauch_3_kwh + - verbrauch_4_kwh + - verbrauch_5_kwh + - verbrauch_6_kwh) * - (this.leerstand / 100)) / - durchschnittsKlimafaktor; - } + let warmwasserZuschlag = 0; + let leerstandsZuschlag = 0; + let kuehlungsZuschlag = 0; + if (this.anteil_warmwasser_1 == 0) { + warmwasserZuschlag = 20 * this.energetische_nutzfläche * 3; + } - if (this.energiequelle_2_nutzung.isSet(3)) { - kuehlungsZuschlag = 6 * this.energetische_nutzfläche * 3; - } + if (this.leerstand > 0) { + let durchschnittsKlimafaktor = + klimafaktoren.reduce((a, b) => a + b, 0) / 3; - let anteil_heizung = 1 - this.anteil_warmwasser_1 / 100; - let anteil_warmwasser = this.anteil_warmwasser_1 / 100; - let Energieverbrauchskennwert = - (anteil_heizung * - (verbrauch_1_kwh + verbrauch_4_kwh) * - klimafaktoren[0] + - anteil_warmwasser * (verbrauch_1_kwh + verbrauch_4_kwh) + - anteil_heizung * - (verbrauch_2_kwh + verbrauch_5_kwh) * - klimafaktoren[1] + - anteil_warmwasser * (verbrauch_2_kwh + verbrauch_5_kwh) + - anteil_heizung * - (verbrauch_3_kwh + verbrauch_6_kwh) * - klimafaktoren[2] + - anteil_warmwasser * (verbrauch_3_kwh + verbrauch_6_kwh) + - warmwasserZuschlag + - leerstandsZuschlag + - kuehlungsZuschlag) / - 3 / - this.energetische_nutzfläche; + leerstandsZuschlag = + ((verbrauch_1_kwh + + verbrauch_2_kwh + + verbrauch_3_kwh + + verbrauch_4_kwh + + verbrauch_5_kwh + + verbrauch_6_kwh) * + (this.leerstand / 100)) / + durchschnittsKlimafaktor; + } - return Energieverbrauchskennwert; + if (this.energiequelle_2_nutzung[3]) { + kuehlungsZuschlag = 6 * this.energetische_nutzfläche * 3; + } + + + let anteil_heizung = 1 - this.anteil_warmwasser_1 / 100; + let anteil_warmwasser = this.anteil_warmwasser_1 / 100; + + let Energieverbrauchskennwert = + (anteil_heizung * + (verbrauch_1_kwh + verbrauch_4_kwh) * + klimafaktoren[0] + + anteil_warmwasser * (verbrauch_1_kwh + verbrauch_4_kwh) + + anteil_heizung * + (verbrauch_2_kwh + verbrauch_5_kwh) * + klimafaktoren[1] + + anteil_warmwasser * (verbrauch_2_kwh + verbrauch_5_kwh) + + anteil_heizung * + (verbrauch_3_kwh + verbrauch_6_kwh) * + klimafaktoren[2] + + anteil_warmwasser * (verbrauch_3_kwh + verbrauch_6_kwh) + + warmwasserZuschlag + + leerstandsZuschlag + + kuehlungsZuschlag) / + 3 / + this.energetische_nutzfläche; + + + return Energieverbrauchskennwert; + })(); } } diff --git a/src/lib/BitChecker.ts b/src/lib/BitChecker.ts new file mode 100644 index 00000000..e51d8d05 --- /dev/null +++ b/src/lib/BitChecker.ts @@ -0,0 +1,18 @@ +export function BitChecker(initial: number = 0, length: number = 32): boolean[] { + const target: boolean[] = new Array(length).fill(false).map((x, i) => { + return (initial & (1 << i)) !== 0 ? true : false + }); + return new Proxy(target, { + get(target, property) { + if (property == "value") { + return target.reduce((a, b, i) => a + (b ? 2 ** i : 0), 0); + } + + return Reflect.get(target, property); + }, + + set(target, property, value) { + return Reflect.set(target, property, value); + } + }) +} \ No newline at end of file diff --git a/src/lib/Klimafaktoren.ts b/src/lib/Klimafaktoren.ts index 603556f1..76aaf3f6 100644 --- a/src/lib/Klimafaktoren.ts +++ b/src/lib/Klimafaktoren.ts @@ -1,11 +1,19 @@ import moment from "moment"; import { memoize } from "./Memoization"; -export const getKlimafaktorenClient = memoize>(async (date: Date, zip: string) => { - const response = await fetch(`/api/klimafaktoren?date=${moment(date).format("YYYY-MM-DD")}&zip=${zip}`); +export const getKlimafaktorenClient = memoize>(async (date: Date, zip: string) => { + if (!zip || !date) { + return [0, 0, 0]; + } + + const response = await fetch(`/api/klimafaktor?date=${moment(date).format("YYYY-MM-DD")}&accuracy=years&zip=${zip}`); const json = await response.json(); - return json; + if (!json.success) { + return [0, 0, 0]; + } + + return Object.values(json.data) as [number, number, number]; }); export const getKlimafaktorenServer = memoize(async (date: Date, zip: string) => { diff --git a/src/lib/server/Heizwertfaktor.ts b/src/lib/server/Heizwertfaktor.ts index 4e2656bc..e648c20f 100644 --- a/src/lib/server/Heizwertfaktor.ts +++ b/src/lib/server/Heizwertfaktor.ts @@ -1,5 +1,23 @@ -import { memoize } from "../Memoization"; +import fuelList from "~/components/Ausweis/fuelList"; -export const getHeizwertfaktorClient = memoize>(async function() { - return [1,1,1,1]; -}) \ No newline at end of file +export const getHeizwertfaktorClient = function(energietraeger: string, einheit: string): { + coe: number, + energietraeger: string, + einheit: string, + umrechnungsfaktor: number, + primärenergiefaktor: number +} { + for (const fuel of fuelList) { + if (fuel.energietraeger == energietraeger && fuel.einheit == einheit) { + return fuel; + } + } + + return { + coe: 0, + energietraeger: "", + einheit: "", + umrechnungsfaktor: 0, + primärenergiefaktor: 0 + }; +} \ No newline at end of file diff --git a/src/pages/api/ausweis/verbrauchsausweis.ts b/src/pages/api/ausweis/verbrauchsausweis.ts new file mode 100644 index 00000000..91044f55 --- /dev/null +++ b/src/pages/api/ausweis/verbrauchsausweis.ts @@ -0,0 +1,16 @@ +import type { APIRoute } from "astro"; +import { success } from "src/lib/APIResponse"; + +/** + * Erstellt einen Verbrauchsausweis anhand der gegebenen Daten und trägt ihn in die Datenbank ein. + * @param param0 + * @returns + */ +export const post: APIRoute = async ({ request }) => { + const body = await request.json(); + + + + + return success({}); +} \ No newline at end of file diff --git a/src/pages/api/climate_factor/index.ts b/src/pages/api/klimafaktor/index.ts similarity index 80% rename from src/pages/api/climate_factor/index.ts rename to src/pages/api/klimafaktor/index.ts index 70bd64e4..93b4f9e6 100644 --- a/src/pages/api/climate_factor/index.ts +++ b/src/pages/api/klimafaktor/index.ts @@ -4,10 +4,15 @@ import { ActionFailedError, InvalidDataError, MissingPropertyError, error, succe import { getClimateFactor } from "src/lib/Klimafaktoren/getClimateFactor"; export const get: APIRoute = async function({ request }) { - const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1])) + let body; + try { + body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1])) + } catch(e) { + return error(["Failed to parse URL"]); + } - if (!body.start || !body.end) { - return MissingPropertyError(["start", "end"]); + if (!body.date) { + return MissingPropertyError(["date"]); } let accuracy = body.accuracy || "months"; @@ -20,8 +25,8 @@ export const get: APIRoute = async function({ request }) { return error(["Invalid ZIP Code, must be 4 or 5 characters long."]) } - let start = moment(body.start); - let end = moment(body.end); + let start = moment(body.date); + let end = moment(body.date).add("2", "years"); if (!start.isValid()) { return error(["Invalid start date given."]); diff --git a/src/pages/index.astro b/src/pages/index.astro index b7f08060..b76e3fff 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,5 +1,5 @@ --- -import BoxWithHeading from '../components/BoxWithHeading.astro'; +import {BoxWithHeading} from '@ibcornelsen/ui'; import Widget from '../components/Widget.svelte'; import Layout from '../layouts/Layout.astro'; --- diff --git a/src/pages/welcher-energieausweis.mdx b/src/pages/welcher-energieausweis.mdx index 5e4713e1..e507e69f 100644 --- a/src/pages/welcher-energieausweis.mdx +++ b/src/pages/welcher-energieausweis.mdx @@ -3,7 +3,7 @@ layout: ../layouts/Layout.astro title: Welcher Energieausweis? --- -import BoxWithHeading from "~/components/BoxWithHeading.astro"; +import { BoxWithHeading } from "@ibcornelsen/ui"; import Widget from "~/components/Widget.svelte"; # Welcher Energieausweis ist der richtige? @@ -54,14 +54,14 @@ eingehalten werden müssen. --- -- Grundriss- und Ansichtspläne sowie Baubeschreibung. -- Die wärmeübertragenden Umfassngsflächen wie Dach, Außenwand, Fenster, - Kellerdecke bzw. Boden werden aus den Plänen ermittelt. -- Auch das Gebäudevolumen zur Ermittlung der energetischen Gebäudenutzfläche und die - verschiedenen Nutzungszonen werden aus den Plänen erhoben. -- Die verwendete Heizungsanlage mit den Wärmeübergabekomponenten (Heizkörper, - Fußbodenheizung, etc) sowie Energieträger und Kessel werden aus der Baubeschreibung oder - aus den Angaben des Bauherren herangezogen. + - Grundriss- und Ansichtspläne sowie Baubeschreibung. - Die + wärmeübertragenden Umfassngsflächen wie Dach, Außenwand, Fenster, + Kellerdecke bzw. Boden werden aus den Plänen ermittelt. - Auch das + Gebäudevolumen zur Ermittlung der energetischen Gebäudenutzfläche und die + verschiedenen Nutzungszonen werden aus den Plänen erhoben. - Die verwendete + Heizungsanlage mit den Wärmeübergabekomponenten (Heizkörper, + Fußbodenheizung, etc) sowie Energieträger und Kessel werden aus der + Baubeschreibung oder aus den Angaben des Bauherren herangezogen. Sollten Sie den Bedarfsausweis nur für Vermietung und Verkauf benötigen, dann @@ -105,20 +105,19 @@ Anforderungen für Nichtwohngebäude eingehalten werden müssen. --- -- Grundriss- und Ansichtspläne sowie Baubeschreibung. -- Die wärmeübertragenden Umfassngsflächen wie Dach, Außenwand, Fenster, - Kellerdecke bzw. Boden werden aus den Plänen ermittelt. -- Auch das Gebäudevolumen zur Ermittlung der energetischen Gebäudenutzfläche und - die verschiedenen Nutzungszonen werden aus den Plänen erhoben. -- Die verwendete Heizungsanlage mit den Wärmeübergabekomponenten (Heizkörper, - Fußbodenheizung, etc) sowie Energieträger und Kessel werden aus der - Baubeschreibung oder aus den Angaben des Bauherren herangezogen. -- Anlagentechnik zu Kühlung und Lüftung der entsprechenden Nutzungszonen müssen - definiert sein. -- Die verwendete Beleuchtung der verschiedenen Nutzungszonen wird ebenfalls -herangezogen + - Grundriss- und Ansichtspläne sowie Baubeschreibung. - Die + wärmeübertragenden Umfassngsflächen wie Dach, Außenwand, Fenster, + Kellerdecke bzw. Boden werden aus den Plänen ermittelt. - Auch das + Gebäudevolumen zur Ermittlung der energetischen Gebäudenutzfläche und die + verschiedenen Nutzungszonen werden aus den Plänen erhoben. - Die verwendete + Heizungsanlage mit den Wärmeübergabekomponenten (Heizkörper, + Fußbodenheizung, etc) sowie Energieträger und Kessel werden aus der + Baubeschreibung oder aus den Angaben des Bauherren herangezogen. - + Anlagentechnik zu Kühlung und Lüftung der entsprechenden Nutzungszonen + müssen definiert sein. - Die verwendete Beleuchtung der verschiedenen + Nutzungszonen wird ebenfalls herangezogen Sollten Sie den Bedarfsausweis nur für Vermietung und Verkauf benötigen, dann können Sie den Ausweis bei uns auch online erstellen lassen. Die Eingabedaten -werden dann nach einem vereinfachten Verfahren erhoben. \ No newline at end of file +werden dann nach einem vereinfachten Verfahren erhoben. diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 88ab672e..346c2b84 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -1,6 +1,6 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], + content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}","./node_modules/@ibcornelsen/ui/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], theme: { extend: { colors: {