diff --git a/package.json b/package.json index 4e457027..2ea104ba 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "astro": "^2.1.7", "cookiejs": "^2.1.2", "express": "^4.18.2", + "jimp": "^0.22.7", "jwt-simple": "^0.5.6", "katex": "^0.16.7", "knex": "^2.4.2", diff --git a/src/components/AnsichtsausweisButton.svelte b/src/components/AnsichtsausweisButton.svelte index 2d215e09..6897d58a 100644 --- a/src/components/AnsichtsausweisButton.svelte +++ b/src/components/AnsichtsausweisButton.svelte @@ -1,7 +1,9 @@
-
-
-
- - Wenn vorhanden können Sie ein - Gebäudefoto (Außenansicht) - hochladen. - -
-
- - -
-
- -
- - Hier gehts zu Ihrem Ansichtsausweis - und Datenblatt als PDF. +
+
+
+ + Wenn vorhanden können Sie ein Gebäudefoto (Außenansicht) + hochladen.
- -
- - -
-
\ No newline at end of file + + +
+
+ +
+ + Hier gehts zu Ihrem Ansichtsausweis und Datenblatt als PDF. + +
+ +
+ + +
+
+
diff --git a/src/components/Ausweis/Verbrauch.svelte b/src/components/Ausweis/Verbrauch.svelte index ba3279fd..743e2f4d 100644 --- a/src/components/Ausweis/Verbrauch.svelte +++ b/src/components/Ausweis/Verbrauch.svelte @@ -4,6 +4,8 @@ import Label from "../Label.svelte"; import fuelList from "./fuelList"; import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; + import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe"; + import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis"; let availableYears = [ 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, @@ -23,12 +25,13 @@ "Dezember", ]; - export let ausweis: Verbrauchsausweis; + export let ausweis: Verbrauchsausweis |VerbrauchsausweisGewerbe | Bedarfsausweis; const fuelMap: Record = {}; for (const fuel of fuelList) { - fuelMap[fuel.energietraeger] = fuelMap[fuel.energietraeger] || []; - fuelMap[fuel.energietraeger].push(fuel.einheit); + // fuelMap[fuel.energietraeger] = ... + fuelMap[fuel[0]] = fuelMap[fuel[0]] || []; + fuelMap[fuel[0]].push(fuel[1]); } let month: string = "01"; diff --git a/src/components/Ausweis/fuelList.ts b/src/components/Ausweis/fuelList.ts index d4bc9978..f5c0435d 100644 --- a/src/components/Ausweis/fuelList.ts +++ b/src/components/Ausweis/fuelList.ts @@ -1,290 +1,49 @@ -export default [ - { - energietraeger: "Heizöl EL", - einheit: "l", - umrechnungsfaktor: 10.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.06, - coe: 0.310, - }, - { - energietraeger: "Erdgas H", - einheit: "m³", - umrechnungsfaktor: 10.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.11, - coe: 0.240, - }, - { - energietraeger: "Holz-Pellets", - einheit: "kg", - umrechnungsfaktor: 5.0, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Brennholz", - einheit: "kg", - umrechnungsfaktor: 4.1, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Flüssiggas", - einheit: "kg", - umrechnungsfaktor: 13.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.09, - coe: 0.270, - }, - { - energietraeger: "Braunkohle", - einheit: "kg", - umrechnungsfaktor: 5.5, - primärenergiefaktor: 1.2, - heizwertfaktor: 1.07, - coe: 0.430, - }, - { - energietraeger: "Holzhackschnitzel", - einheit: "SRm", - umrechnungsfaktor: 650.0, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Strommix", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 2.4, - heizwertfaktor: 1.00, - coe: 0.560, - }, - { - energietraeger: "Fernwärme KWK FB", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.7, - heizwertfaktor: 1.00, - coe: 0.300, - }, - { - energietraeger: "Nahwärme KWK FB", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.7, - heizwertfaktor: 1.00, - coe: 0.300, - }, - { - energietraeger: "Heizöl EL", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.06, - coe: 0.310, - }, - { - energietraeger: "Erdgas H", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.11, - coe: 0.240, - }, - { - energietraeger: "Holz-Pellets", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Brennholz", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Flüssiggas", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.09, - coe: 0.270, - }, - { - energietraeger: "Braunkohle", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.2, - heizwertfaktor: 1.07, - coe: 0.430, - }, - { - energietraeger: "Holzhackschnitzel", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Flüssiggas", - einheit: "l", - umrechnungsfaktor: 7.3, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.09, - coe: 0.270, - }, - { - energietraeger: "Brennholz", - einheit: "m³", - umrechnungsfaktor: 2000.0, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Flüssiggas", - einheit: "m³", - umrechnungsfaktor: 26.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.09, - coe: 0.270, - }, - { - energietraeger: "Erdgas L", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.11, - coe: 0.240, - }, - { - energietraeger: "Brennholz", - einheit: "SRm", - umrechnungsfaktor: 800.0, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Koks", - einheit: "kg", - umrechnungsfaktor: 8.3, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.02, - coe: 0.400, - }, - { - energietraeger: "Erdgas L", - einheit: "m³", - umrechnungsfaktor: 9.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.11, - coe: 0.240, - }, - { - energietraeger: "Koks", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.02, - coe: 0.400, - }, - { - energietraeger: "Holzhackschnitzel", - einheit: "kg", - umrechnungsfaktor: 3.8, - primärenergiefaktor: 0.2, - heizwertfaktor: 1.08, - coe: 0.020, - }, - { - energietraeger: "Nahwärme HKW EB", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.1, - heizwertfaktor: 1.00, - coe: 0.060, - }, - { - energietraeger: "Nahwärme HKW FB", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.3, - heizwertfaktor: 1.00, - coe: 0.400, - }, - { - energietraeger: "Nahwärme KWK EB", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.0, - heizwertfaktor: 1.00, - coe: 0.040, - }, - { - energietraeger: "Fernwärme KWK EB", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.0, - heizwertfaktor: 1.00, - coe: 0.040, - }, - { - energietraeger: "Fernwärme HKW FB", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.3, - heizwertfaktor: 1.00, - coe: 0.400, - }, - { - energietraeger: "Fernwärme HKW EB", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 0.1, - heizwertfaktor: 1.00, - coe: 0.060, - }, - { - energietraeger: "Erdgas", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.11, - coe: 0.240, - }, - { - energietraeger: "Heizöl", - einheit: "kWh", - umrechnungsfaktor: 1.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.06, - coe: 0.310, - }, - { - energietraeger: "Heizöl", - einheit: "l", - umrechnungsfaktor: 10.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.06, - coe: 0.310, - }, - { - energietraeger: "Erdgas", - einheit: "m³", - umrechnungsfaktor: 9.0, - primärenergiefaktor: 1.1, - heizwertfaktor: 1.11, - coe: 0.240, - }, -]; + +/** + * [energietraeger, einheit, umrechnungsfaktor, primärenergiefaktor, coe] + */ +const brennstoffe: [ + string, + string, + number, + number, + number +][] = [ + ["Heizöl EL", "l", 10.0, 1.1, 0.31], + ["Erdgas H", "m³", 10.0, 1.1, 0.24], + ["Holz-Pellets", "kg", 5.0, 0.2, 0.02], + ["Brennholz", "kg", 4.1, 0.2, 0.02], + ["Flüssiggas", "kg", 13.0, 1.1, 0.27], + ["Braunkohle", "kg", 5.5, 1.2, 0.43], + ["Holzhackschnitzel", "SRm", 650.0, 0.2, 0.02], + ["Strommix", "kWh", 1.0, 2.4, 0.56], + ["Fernwärme KWK FB", "kWh", 1.0, 0.7, 0.3], + ["Nahwärme KWK FB", "kWh", 1.0, 0.7, 0.3], + ["Heizöl EL", "kWh", 1.0, 1.1, 0.31], + ["Erdgas H", "kWh", 1.0, 1.1, 0.24], + ["Holz-Pellets", "kWh", 1.0, 0.2, 0.02], + ["Brennholz", "kWh", 1.0, 0.2, 0.02], + ["Flüssiggas", "kWh", 1.0, 1.1, 0.27], + ["Braunkohle", "kWh", 1.0, 1.2, 0.43], + ["Holzhackschnitzel", "kWh", 1.0, 0.2, 0.02], + ["Flüssiggas", "l", 7.3, 1.1, 0.27], + ["Brennholz", "m³", 2000.0, 0.2, 0.02], + ["Flüssiggas", "m³", 26.0, 1.1, 0.27], + ["Erdgas L", "kWh", 1.0, 1.1, 0.24], + ["Brennholz", "SRm", 800.0, 0.2, 0.02], + ["Koks", "kg", 8.3, 1.1, 0.4], + ["Erdgas L", "m³", 9.0, 1.1, 0.24], + ["Koks", "kWh", 1.0, 1.1, 0.4], + ["Holzhackschnitzel", "kg", 3.8, 0.2, 0.02], + ["Nahwärme HKW EB", "kWh", 1.0, 0.1, 0.06], + ["Nahwärme HKW FB", "kWh", 1.0, 1.3, 0.4], + ["Nahwärme KWK EB", "kWh", 1.0, 0.0, 0.04], + ["Fernwärme KWK EB", "kWh", 1.0, 0.0, 0.04], + ["Fernwärme HKW FB", "kWh", 1.0, 1.3, 0.4], + ["Fernwärme HKW EB", "kWh", 1.0, 0.1, 0.06], + ["Erdgas", "kWh", 1.0, 1.1, 0.24], + ["Heizöl", "kWh", 1.0, 1.1, 0.31], + ["Heizöl", "l", 10.0, 1.1, 0.31], + ["Erdgas", "m³", 9.0, 1.1, 0.24], +] +export default brennstoffe; diff --git a/src/components/AusweisCard.svelte b/src/components/AusweisCard.svelte index 517c5c03..32fb17b8 100644 --- a/src/components/AusweisCard.svelte +++ b/src/components/AusweisCard.svelte @@ -4,6 +4,7 @@ import Katex from "./Katex.svelte"; import moment from "moment"; import Cross from "./Icons/Cross.svelte"; + import { Dachgeschoss } from "src/lib/Ausweis/types"; interface Service { name: string; @@ -134,7 +135,7 @@ DB: - {ausweis.dachgeschoss} + {ausweis.dachgeschoss == Dachgeschoss.BEHEIZT ? "Ja" : "Nein"} diff --git a/src/components/Bedarfsausweis/BedarfsausweisContent.svelte b/src/components/Bedarfsausweis/BedarfsausweisContent.svelte index ab4c79c3..2d8c4c1e 100644 --- a/src/components/Bedarfsausweis/BedarfsausweisContent.svelte +++ b/src/components/Bedarfsausweis/BedarfsausweisContent.svelte @@ -11,12 +11,13 @@ import BilderZusatzsysteme from "../Ausweis/BilderZusatzsysteme.svelte"; import moment from "moment"; import { BitChecker } from "src/lib/BitChecker"; + import { Dachgeschoss } from "src/lib/Ausweis/types"; let ausweis = new Bedarfsausweis(); - let insulationWidths = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4]; + let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4]; - let windowTypes = { + let fensterArten = { Einfachverglasung: 5, "Holzfenster Doppelverglasung": 2.7, "Kunststofffenster Doppelverglasung": 3, @@ -50,7 +51,7 @@ ausweis.objekt_ort = "Hamburg"; ausweis.wohnflaeche = 152; ausweis.keller_beheizt = true; - ausweis.dachgeschoss = "Unbeheizt"; + ausweis.dachgeschoss = Dachgeschoss.UNBEHEIZT; ausweis.energieverbrauch_zeitraum = moment("04.01.2018"); ausweis.energietraeger_1 = "Erdgas"; ausweis.energietraeger_einheit_heizquelle_1 = "kWh"; @@ -102,7 +103,7 @@ ausweis.heizung_speicherung = "elzs7055bis1994"; ausweis.energietraeger_2 = "Braunkohle"; ausweis.anteil_zusatzheizung = 0.7; - ausweis = ausweis + ausweis = ausweis; } @@ -140,7 +141,6 @@ und Gebäudeteil
-
Bitte geben Sie hier die Straße und Hausnummer des Gebäudes @@ -156,13 +156,13 @@ />
- + - +
Ort des Gebäudes wird automatisch ermittelt.
-
Bitte geben Sie hier die beheizte Wohnfläche in m² ein. @@ -193,7 +192,7 @@ />
- +
Bitte wählen Sie hier den Gebäudetyp aus. @@ -234,7 +233,7 @@
- +
Bitte geben Sie hier den Gebäudeteil ein. In den meisten @@ -275,7 +274,6 @@ >
-
Bitte geben Sie hier die Anzahl der Vollgeschosse @@ -289,7 +287,7 @@ required />
- +
Bitte geben Sie hier die Geschosshöhe (lichte @@ -309,7 +307,7 @@ {/each}
- +
Wenn Ihr Gebäude Dachgauben besitzt geben Sie hier @@ -321,7 +319,7 @@ type="number" />
- +
Bitte geben Sie hier die Gesamtbreite aller Gauben @@ -449,12 +447,12 @@
-
@@ -463,18 +461,19 @@
-
- +
@@ -483,18 +482,19 @@
-
- +
@@ -503,6 +503,7 @@
@@ -514,6 +515,7 @@ @@ -522,6 +524,7 @@ @@ -536,6 +539,7 @@ name="volumen" type="number" bind:value={ausweis.volumen} + readonly={!ausweis.tabellenwerte_aendern} /> @@ -568,7 +572,6 @@ und Boden
-
Bitte geben Sie hier die Fläche der Fenster ein.
- +
Bitte geben Sie hier die Art der Fenster ein.
- +
Wenn vorhanden geben Sie hier die Fläche der Fenster ein @@ -605,7 +608,7 @@ bind:value={ausweis.fenster_flaeche_2} />
- +
Bitte geben Sie hier die Art der Fenster ein. - {#each Object.entries(windowTypes) as [name, value]} + {#each Object.entries(fensterArten) as [name, value]} {/each}
- +
Bitte geben Sie hier die Fläche der Dachfenster ein.
- +
Bitte geben Sie hier die Art der Fenster ein. - {#each Object.entries(windowTypes) as [name, value]} + {#each Object.entries(fensterArten) as [name, value]} {/each}
- +
Bitte geben Sie hier die Fläche der Haustür ein.
- +
Bitte geben Sie hier die Art der Haustür ein.
-
Bitte geben Sie hier die Bauart der Dachfläche ein.
- +
Bitte geben Sie hier die nachträgliche Dämmung ein. - {#each insulationWidths as width} - + {#each daemmungsBreiten as breite} + {/each}
- +
Bitte geben Sie hier die Bauart der Geschossdecke ein.
- +
Bitte geben Sie hier die nachträgliche Dämmung ein. - {#each insulationWidths as width} - + {#each daemmungsBreiten as breite} + {/each}
- +
Bitte geben Sie hier die Bauart der Außenwand ein.
- +
Bitte geben Sie hier die nachträgliche Dämmung ein. - {#each insulationWidths as width} - + {#each daemmungsBreiten as breite} + {/each}
- +
Bitte geben Sie hier die Bauart des Fußbodens ein.
- +
Bitte geben Sie hier die nachträgliche Dämmung ein. - {#each insulationWidths as width} - + {#each daemmungsBreiten as breite} + {/each}
@@ -836,7 +838,6 @@
-
- +
- +
Bitte geben Sie hier ein ob über die Fenster natürlich @@ -904,7 +905,7 @@
- +
Bitte geben Sie an ob das Gebäude im Sommer zusätzlich @@ -924,7 +925,6 @@
-
-
Bitte geben Sie hier den Energieträger der Heizung ein.Bitte auswählen
- +
Bitte geben Sie hier die Warmwasserverteilung ein.
- +
Bitte geben Sie hier wenn vorhanden die Art des @@ -1050,7 +1049,7 @@
- +
Bitte geben Sie hier die Wärmeerzeugung für Warmwasser ein.
- +
Bitte geben Sie hier ein ob es sich um Zentralheizung @@ -1081,7 +1080,7 @@
- +
Bitte geben Sie hier die Verteilung der Heizung ein.dezentrales System
- +
Bitte geben Sie hier - wenn vorhanden - den Speicher der @@ -1160,7 +1159,7 @@ >
- +
Bitte geben Sie hier den Wärmerzeuger der Heizung ein.
-
Bitte geben Sie hier - wenn vorhanden - die Zusatzheizung @@ -1263,7 +1261,7 @@
- +
Bitte geben Sie hier den prozentualen Anteil der diff --git a/src/components/DatenblattButton.svelte b/src/components/DatenblattButton.svelte index 510ee4a7..361565d4 100644 --- a/src/components/DatenblattButton.svelte +++ b/src/components/DatenblattButton.svelte @@ -1,4 +1,18 @@ - + + + \ No newline at end of file diff --git a/src/components/DatenblattFooter.svelte b/src/components/DatenblattFooter.svelte new file mode 100644 index 00000000..2399d901 --- /dev/null +++ b/src/components/DatenblattFooter.svelte @@ -0,0 +1,9 @@ + +
+

Copyright © {moment().format("YYYY")} • IB Cornelsen

+

info@online-energieausweis.org

+
\ No newline at end of file diff --git a/src/components/DatenblattHeader.svelte b/src/components/DatenblattHeader.svelte new file mode 100644 index 00000000..c19b6ffc --- /dev/null +++ b/src/components/DatenblattHeader.svelte @@ -0,0 +1,8 @@ +
+ +
+

fon 040 · 209339850

+

fax 040 · 209339859

+

online-energieausweis.org

+
+
\ No newline at end of file diff --git a/src/components/UploadImages.svelte b/src/components/UploadImages.svelte index 1a6ba52d..1aec5879 100644 --- a/src/components/UploadImages.svelte +++ b/src/components/UploadImages.svelte @@ -58,6 +58,13 @@ const dataURL = canvas.toDataURL("image/jpeg", 0.75); images.push({ ...file, data: dataURL as string } as (File & { data: string })); + fetch("/api/image", { + method: "PUT", + body: JSON.stringify({ + data: dataURL, + name: file.name + }) + }) images = images; if (i == (Math.min(files.length, max) - 1)) { diff --git a/src/components/Verbrauchsausweis/VerbrauchsausweisContent.svelte b/src/components/Verbrauchsausweis/VerbrauchsausweisContent.svelte index 06514f01..ffea9424 100644 --- a/src/components/Verbrauchsausweis/VerbrauchsausweisContent.svelte +++ b/src/components/Verbrauchsausweis/VerbrauchsausweisContent.svelte @@ -44,6 +44,8 @@ ausweis.objekt_plz = "21039"; ausweis.objekt_ort = "Hamburg"; ausweis.objekt_strasse = "Curslacker Deich 170"; + ausweis.objekt_gebaeudeteil = "Gesamtgebäude" + ausweis.upload(); } diff --git a/src/lib/Ausweis/Ausweis.ts b/src/lib/Ausweis/Ausweis.ts index b78ff2d2..2af7367d 100644 --- a/src/lib/Ausweis/Ausweis.ts +++ b/src/lib/Ausweis/Ausweis.ts @@ -1,5 +1,6 @@ import { Moment } from "moment"; import { BitChecker } from "../BitChecker"; +import { Dachgeschoss } from "./types"; export enum AusweisType { VERBRAUCHSAUSWEIS, @@ -56,7 +57,7 @@ export interface Ausweis { wohnflaeche: number; keller_beheizt: boolean; - dachgeschoss: string; + dachgeschoss: Dachgeschoss; zusaetzliche_heizquelle: boolean; warmwasser_enthalten: boolean; lueftungskonzept: Lueftungskonzept; @@ -96,13 +97,13 @@ export interface Ausweis { volumen: number; dicht: boolean; fenster_flaeche_1: number; - fenster_art_1: string; + fenster_art_1: number; fenster_flaeche_2: number; - fenster_art_2: string; + fenster_art_2: number; dachfenster_flaeche: number; - dachfenster_art: string; + dachfenster_art: number; haustuer_flaeche: number; - haustuer_art: string; + haustuer_art: number; dach_bauart: string; dach_daemmung: number; decke_bauart: string; diff --git a/src/lib/Ausweis/Bedarfsausweis.ts b/src/lib/Ausweis/Bedarfsausweis.ts index 63f691d1..e2281742 100644 --- a/src/lib/Ausweis/Bedarfsausweis.ts +++ b/src/lib/Ausweis/Bedarfsausweis.ts @@ -3,28 +3,10 @@ import { getHeizwertfaktorClient } from "../server/Heizwertfaktor"; import moment from "moment"; import { BitChecker } from "../BitChecker"; import { getHeizungswerte } from "../Heizungswerte"; +import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types"; +import { Ausweis } from "./Ausweis"; -export enum AusweisType { - VERBRAUCHSAUSWEIS, - VERBRAUCHSAUSWEIS_NICHT_WOHNGEBAEUDE, - BEDARFSAUSWEIS, -} - -export type Lueftungskonzept = - | "Fensterlüftung" - | "Schachtlüftung" - | "Lüftungsanlage ohne Wärmerückgewinnung" - | "Lüftungsanlage mit Wärmerückgewinnung"; - -export type Ausweisart = "VA" | "BA" | "VANW"; -export type Ausstellgrund = - | "Vermietung" - | "Neubau" - | "Verkauf" - | "Modernisierung" - | "Sonstiges"; - -export class Bedarfsausweis { +export class Bedarfsausweis implements Ausweis { public ausweisart: Ausweisart = "VA"; public id: number = 0; public user_id: number = 0; @@ -63,7 +45,7 @@ export class Bedarfsausweis { public wohnflaeche: number = 0; public keller_beheizt: boolean = false; - public dachgeschoss: string = ""; + public dachgeschoss: Dachgeschoss = Dachgeschoss.UNBEHEIZT; public zusaetzliche_heizquelle: boolean = false; public warmwasser_enthalten: boolean = false; public lueftungskonzept: Lueftungskonzept = "Fensterlüftung"; @@ -182,16 +164,16 @@ export class Bedarfsausweis { } public get end_energie_verbrauch(): number { - let Uawd = 1 / (1 / this.dach_daemmung / 0.04); - let Uawa = 1 / (1 / this.aussenwand_daemmung / 0.04); - let Uawb = 1 / (1 / this.boden_daemmung / 0.04); - let Uawogd =1 / (1 / this.decke_daemmung / 0.04); + let dach_u_wert = 1 / (1 / this.dach_daemmung / 0.04); + let aussenwand_u_wert = 1 / (1 / this.aussenwand_daemmung / 0.04); + let fussboden_u_wert = 1 / (1 / this.boden_daemmung / 0.04); + let decke_u_wert = 1 / (1 / this.decke_daemmung / 0.04); if (!this.tabellenwerte_aendern) { - this.dach_u_wert = Math.round(Uawd); - this.decke_u_wert = Math.round(Uawogd); - this.aussenwand_u_wert = Math.round(Uawa); - this.fussboden_u_wert = Math.round(Uawb); + this.dach_u_wert = Math.round(dach_u_wert); + this.decke_u_wert = Math.round(decke_u_wert); + this.aussenwand_u_wert = Math.round(aussenwand_u_wert); + this.fussboden_u_wert = Math.round(fussboden_u_wert); } if (this.dachgeschoss) { @@ -210,26 +192,26 @@ export class Bedarfsausweis { } if (this.keller_beheizt) { - var keller_beheiztf = 1; + var keller_beheizt = 1; } else { - var keller_beheiztf = 0; + var keller_beheizt = 0; } - var gaubenfl = + var gaubenflaeche = this.breite_gauben * 2 * 0.3 + this.anzahl_gauben * 2 * 1.5; - var gaubenvol = this.breite_gauben * 1.5; + var gaubenvolumen = this.breite_gauben * 1.5; - var Fawa = 1; + let aussenwand_anteil = 1; if ( this.objekt_typ === "Doppelhaushälfte" || this.objekt_typ === "Reihenendhaus" ) { - var Fawa = 0.7; + aussenwand_anteil = 0.7; } else if (this.objekt_typ === "Reihenmittelhaus") { - var Fawa = 0.4; + aussenwand_anteil = 0.4; } // Außenwand - var awa1 = + var aussenwand_flaeche = ((2 * this.masse_a + 2 * this.masse_b + 2 * this.masse_d + @@ -244,18 +226,18 @@ export class Bedarfsausweis { 2 * this.masse_e + 2 * this.masse_f) * 2.2 * - keller_beheiztf) * - Fawa - + keller_beheizt) * + aussenwand_anteil - this.fenster_flaeche_1 - this.fenster_flaeche_2 - this.haustuer_flaeche + - gaubenfl; + gaubenflaeche; if (!this.tabellenwerte_aendern) { - this.aussenwand_flaeche = awa1; + this.aussenwand_flaeche = Math.round(aussenwand_flaeche); } - var awd1 = + var dachflaeche = ((this.masse_a * this.masse_b + this.masse_c * this.masse_d + (+this.masse_f + +this.masse_c) * this.masse_e) * @@ -263,38 +245,38 @@ export class Bedarfsausweis { this.dachfenster_flaeche) * dachgeschossf2; if (!this.tabellenwerte_aendern) { - this.dachflaeche = awd1; + this.dachflaeche = Math.round(dachflaeche); } - var awogd1 = + var deckenflaeche = (this.masse_a * this.masse_b + this.masse_c * this.masse_d + (+this.masse_f + +this.masse_c) * this.masse_e - this.dachfenster_flaeche) * IOGdeckef; if (!this.tabellenwerte_aendern) { - this.deckenflaeche = awogd1; + this.deckenflaeche = Math.round(deckenflaeche); } - var awb1 = + var fussboden_flaeche = this.masse_a * this.masse_b + this.masse_c * this.masse_d + (+this.masse_f + +this.masse_c) * this.masse_e; if (!this.tabellenwerte_aendern) { - this.fussboden_flaeche = awb1; + this.fussboden_flaeche = Math.round(fussboden_flaeche); } - var behgv = - awb1 * this.geschosshoehe * this.anzahl_vollgeschosse + - awb1 * 2.2 * keller_beheiztf + - awb1 * this.geschosshoehe * dachgeschossf + - gaubenvol; + var volumen = + fussboden_flaeche * this.geschosshoehe * this.anzahl_vollgeschosse + + fussboden_flaeche * 2.2 * keller_beheizt + + fussboden_flaeche * this.geschosshoehe * dachgeschossf + + gaubenvolumen; if (!this.tabellenwerte_aendern) { - this.volumen = behgv; + this.volumen = Math.round(volumen); } if (this.dicht) { - var Hv = 0.163 * behgv; + var Hv = 0.163 * volumen; } else { - var Hv = 0.19 * behgv; + var Hv = 0.19 * volumen; } var AHF = @@ -364,21 +346,21 @@ export class Bedarfsausweis { } } - let hilfsenergiel = 0; - let wgewinnel = 0; + let hilfsenergie_lueftung = 0; + let waerme_gewinnung_lueftung = 0; if (this.lueftungskonzept == "Lüftungsanlage mit Wärmerückgewinnung") { - hilfsenergiel = 0; - wgewinnel = 13.5; + hilfsenergie_lueftung = 0; + waerme_gewinnung_lueftung = 13.5; } if (this.lueftungskonzept == "Lüftungsanlage ohne Wärmerückgewinnung") { if (this.baujahr_gebaeude < 1996) { - hilfsenergiel = 4; - wgewinnel = 3.5; + hilfsenergie_lueftung = 4; + waerme_gewinnung_lueftung = 3.5; } if (this.baujahr_gebaeude > 1996) { - hilfsenergiel = 2.6; - wgewinnel = 3.2; + hilfsenergie_lueftung = 2.6; + waerme_gewinnung_lueftung = 3.2; } } @@ -414,12 +396,12 @@ export class Bedarfsausweis { this.waerme_erzeugung_heizung ); - var endenergieh = + var end_energie_heizung = (Qh + heizung_zentralwv + verteilunghwv + spheizungwv) * werzeugungheaz - - wgewinnel; + waerme_gewinnung_lueftung; - var endenergiew = + var end_energie_warmwasser = (12 + verteilungwwwv - verteilungwwhg + @@ -435,19 +417,19 @@ export class Bedarfsausweis { warmwasser_speicherunghb + werzeugungwwhb + Solarsystem_WWhb + - hilfsenergiel; + hilfsenergie_lueftung; - var endenergiegesamt = endenergieh + endenergiew + hilfsenergie; + var endenergiegesamt = end_energie_heizung + end_energie_warmwasser + hilfsenergie; var primheizung = - endenergieh * + end_energie_heizung * (1 - this.anteil_zusatzheizung) * BRSPrimärenergiefaktor + - endenergieh * this.anteil_zusatzheizung * BRSPrimärenergiefaktor1; + end_energie_heizung * this.anteil_zusatzheizung * BRSPrimärenergiefaktor1; var primaerenergiebedarf = primheizung + - (endenergiew - Solarsystem_WWbw) * BRSPrimärenergiefaktor + + (end_energie_warmwasser - Solarsystem_WWbw) * BRSPrimärenergiefaktor + hilfsenergie * 1.8; return endenergiegesamt; diff --git a/src/lib/Ausweis/Verbrauchsausweis.ts b/src/lib/Ausweis/Verbrauchsausweis.ts index 983f6d03..efa2ff03 100644 --- a/src/lib/Ausweis/Verbrauchsausweis.ts +++ b/src/lib/Ausweis/Verbrauchsausweis.ts @@ -2,28 +2,12 @@ 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, - VERBRAUCHSAUSWEIS_NICHT_WOHNGEBAEUDE, - BEDARFSAUSWEIS, -} - -export type Lueftungskonzept = "Fensterlüftung" | "Schachtlüftung" | "Lüftungsanlage ohne Wärmerückgewinnung" | "Lüftungsanlage mit Wärmerückgewinnung" - -export type Ausweisart = "VA" | "BA" | "VANW"; -export type Ausstellgrund = - | "Vermietung" - | "Neubau" - | "Verkauf" - | "Modernisierung" - | "Sonstiges"; +import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types"; +import { Ausweis } from "./Ausweis"; - -export class Verbrauchsausweis { +export class Verbrauchsausweis implements Ausweis { public ausweisart: Ausweisart = "VA"; public id: number = 0; public user_id: number = 0; @@ -62,7 +46,7 @@ export class Verbrauchsausweis { public wohnflaeche: number = 0; public keller_beheizt: boolean = false; - public dachgeschoss: string = ""; + public dachgeschoss: Dachgeschoss = Dachgeschoss.NICHT_VORHANDEN; public zusaetzliche_heizquelle: boolean = false; public warmwasser_enthalten: boolean = false; public lueftungskonzept: Lueftungskonzept = "Fensterlüftung"; @@ -70,10 +54,10 @@ export class Verbrauchsausweis { public leerstand: number = 0; public images: string[] = []; - public versorgungssysteme: boolean[] = BitChecker(0); - public fenster_dach: boolean[] = BitChecker(0); - public energiequelle_2_nutzung: boolean[] = BitChecker(0); - public daemmung: boolean[] = BitChecker(0); + public versorgungssysteme: ReturnType = BitChecker(0); + public fenster_dach: ReturnType = BitChecker(0); + public energiequelle_2_nutzung: ReturnType = BitChecker(0); + public daemmung: ReturnType = BitChecker(0); public get energetische_nutzfläche(): number { return this.wohnflaeche * (this.keller_beheizt ? 1.35 : 1.2); }; @@ -105,13 +89,13 @@ export class Verbrauchsausweis { public volumen: number = 0; public dicht: boolean = false; public fenster_flaeche_1: number = 0; - public fenster_art_1: string = ""; + public fenster_art_1: number = 0; public fenster_flaeche_2: number = 0; - public fenster_art_2: string = ""; + public fenster_art_2: number = 0; public dachfenster_flaeche: number = 0; - public dachfenster_art: string = ""; + public dachfenster_art: number = 0; public haustuer_flaeche: number = 0; - public haustuer_art: string = ""; + public haustuer_art: number = 0; public dach_bauart: string = ""; public dach_daemmung: number = 0; public decke_bauart: string = ""; @@ -149,6 +133,82 @@ export class Verbrauchsausweis { public constructor() {} + public async upload() { + const body = this.getUploadBody(); + const response = await fetch("/api/ausweis/verbrauchsausweis", { + method: "PUT", + body: JSON.stringify(body) + }) + + return response; + } + + public async save() { + const body = this.getUploadBody(); + const response = await fetch("/api/ausweis/verbrauchsausweis", { + method: "POST", + body: JSON.stringify(body) + }) + + return response; + } + + private getUploadBody() { + return { + ausweisart: "VA", + + objekt_typ: this.objekt_typ, + objekt_plz: this.objekt_plz, + objekt_ort: this.objekt_ort, + objekt_strasse: this.objekt_strasse, + objekt_gebaeudeteil: this.objekt_gebaeudeteil, + objekt_saniert: this.objekt_saniert, + baujahr_gebaeude: this.baujahr_gebaeude, + baujahr_anlage: this.baujahr_anlage, + anzahl_einheiten: this.anzahl_einheiten, + + ausstellgrund: this.ausstellgrund, + + energieverbrauch_zeitraum: this.energieverbrauch_zeitraum.toDate(), + energieverbrauch_1_heizquelle_1: this.energieverbrauch_1_heizquelle_1, + energieverbrauch_2_heizquelle_1: this.energieverbrauch_2_heizquelle_1, + energieverbrauch_3_heizquelle_1: this.energieverbrauch_3_heizquelle_1, + energieverbrauch_1_heizquelle_2: this.energieverbrauch_1_heizquelle_2, + energieverbrauch_2_heizquelle_2: this.energieverbrauch_2_heizquelle_2, + energieverbrauch_3_heizquelle_2: this.energieverbrauch_3_heizquelle_2, + + energietraeger_einheit_heizquelle_1: this.energietraeger_einheit_heizquelle_1, + energietraeger_einheit_heizquelle_2: this.energietraeger_einheit_heizquelle_2, + energietraeger_1: this.energietraeger_1, + energietraeger_2: this.energietraeger_2, + + anteil_warmwasser_1: this.anteil_warmwasser_1, + anteil_warmwasser_2: this.anteil_warmwasser_2, + + wohnflaeche: this.wohnflaeche, + + keller_beheizt: this.keller_beheizt, + dachgeschoss: this.dachgeschoss, + zusaetzliche_heizquelle: this.zusaetzliche_heizquelle, + warmwasser_enthalten: this.warmwasser_enthalten, + lueftungskonzept: this.lueftungskonzept, + wird_gekuehlt: this.wird_gekuehlt, + leerstand: this.leerstand, + images: this.images, + + versorgungssysteme: this.versorgungssysteme.value, + fenster_dach: this.versorgungssysteme.value, + energiequelle_2_nutzung: this.versorgungssysteme.value, + daemmung: this.versorgungssysteme.value, + + anrede: this.anrede, + name: this.name, + vorname: this.vorname, + email: this.email, + telefonnummer: this.telefonnummer, + } + } + public static fromBase64(base64: string): Verbrauchsausweis | null { try { const text = Buffer.from(base64, "base64"); diff --git a/src/lib/Ausweis/VerbrauchsausweisGewerbe.ts b/src/lib/Ausweis/VerbrauchsausweisGewerbe.ts index 972a0312..002a27eb 100644 --- a/src/lib/Ausweis/VerbrauchsausweisGewerbe.ts +++ b/src/lib/Ausweis/VerbrauchsausweisGewerbe.ts @@ -3,26 +3,11 @@ import { getKlimafaktorenClient } from "../Klimafaktoren"; import { getHeizwertfaktorClient } from "../server/Heizwertfaktor"; import moment from "moment"; import { BitChecker } from "../BitChecker"; - -export enum AusweisType { - VERBRAUCHSAUSWEIS, - VERBRAUCHSAUSWEIS_NICHT_WOHNGEBAEUDE, - BEDARFSAUSWEIS, -} - -export type Lueftungskonzept = "Fensterlüftung" | "Schachtlüftung" | "Lüftungsanlage ohne Wärmerückgewinnung" | "Lüftungsanlage mit Wärmerückgewinnung" - -export type Ausweisart = "VA" | "BA" | "VANW"; -export type Ausstellgrund = - | "Vermietung" - | "Neubau" - | "Verkauf" - | "Modernisierung" - | "Sonstiges"; +import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types"; +import { Ausweis } from "./Ausweis"; - -export class VerbrauchsausweisGewerbe { +export class VerbrauchsausweisGewerbe implements Ausweis { public ausweisart: Ausweisart = "VA"; public id: number = 0; public user_id: number = 0; @@ -61,7 +46,7 @@ export class VerbrauchsausweisGewerbe { public wohnflaeche: number = 0; public keller_beheizt: boolean = false; - public dachgeschoss: string = ""; + public dachgeschoss: number = Dachgeschoss.UNBEHEIZT; public zusaetzliche_heizquelle: boolean = false; public warmwasser_enthalten: boolean = false; public lueftungskonzept: Lueftungskonzept = "Fensterlüftung"; @@ -104,13 +89,13 @@ export class VerbrauchsausweisGewerbe { public volumen: number = 0; public dicht: boolean = false; public fenster_flaeche_1: number = 0; - public fenster_art_1: string = ""; + public fenster_art_1: number = 0; public fenster_flaeche_2: number = 0; - public fenster_art_2: string = ""; + public fenster_art_2: number = 0; public dachfenster_flaeche: number = 0; - public dachfenster_art: string = ""; + public dachfenster_art: number = 0; public haustuer_flaeche: number = 0; - public haustuer_art: string = ""; + public haustuer_art: number = 0; public dach_bauart: string = ""; public dach_daemmung: number = 0; public decke_bauart: string = ""; diff --git a/src/lib/Ausweis/type.ts b/src/lib/Ausweis/type.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/lib/Ausweis/types.ts b/src/lib/Ausweis/types.ts new file mode 100644 index 00000000..05b49ae6 --- /dev/null +++ b/src/lib/Ausweis/types.ts @@ -0,0 +1,25 @@ +export enum AusweisType { + VERBRAUCHSAUSWEIS, + VERBRAUCHSAUSWEIS_NICHT_WOHNGEBAEUDE, + BEDARFSAUSWEIS, +} + +export type Lueftungskonzept = + | "Fensterlüftung" + | "Schachtlüftung" + | "Lüftungsanlage ohne Wärmerückgewinnung" + | "Lüftungsanlage mit Wärmerückgewinnung"; + +export type Ausweisart = "VA" | "BA" | "VANW"; +export type Ausstellgrund = + | "Vermietung" + | "Neubau" + | "Verkauf" + | "Modernisierung" + | "Sonstiges"; + +export enum Dachgeschoss { + BEHEIZT, + UNBEHEIZT, + NICHT_VORHANDEN +} \ No newline at end of file diff --git a/src/lib/BitChecker.ts b/src/lib/BitChecker.ts index e51d8d05..df8b3cba 100644 --- a/src/lib/BitChecker.ts +++ b/src/lib/BitChecker.ts @@ -1,4 +1,4 @@ -export function BitChecker(initial: number = 0, length: number = 32): boolean[] { +export function BitChecker(initial: number = 0, length: number = 32): boolean[] & { value: number } { const target: boolean[] = new Array(length).fill(false).map((x, i) => { return (initial & (1 << i)) !== 0 ? true : false }); @@ -14,5 +14,5 @@ export function BitChecker(initial: number = 0, length: number = 32): boolean[] set(target, property, value) { return Reflect.set(target, property, value); } - }) + }) as (boolean[] & { value: number }) } \ No newline at end of file diff --git a/src/lib/Heizungswerte.ts b/src/lib/Heizungswerte.ts index 9e55d127..431a8b5c 100644 --- a/src/lib/Heizungswerte.ts +++ b/src/lib/Heizungswerte.ts @@ -710,12 +710,12 @@ export function getHeizungswerte( let result = fuelList.find( (value) => - value.energietraeger == energietraeger && value.einheit == "kWh" + value[0] == energietraeger && value[1] == "kWh" ); let coe = 0; if (result) { - coe = result.coe + coe = result[4] } return [ diff --git a/src/lib/server/Heizwertfaktor.ts b/src/lib/server/Heizwertfaktor.ts index e648c20f..db35b99a 100644 --- a/src/lib/server/Heizwertfaktor.ts +++ b/src/lib/server/Heizwertfaktor.ts @@ -8,8 +8,14 @@ export const getHeizwertfaktorClient = function(energietraeger: string, einheit: primärenergiefaktor: number } { for (const fuel of fuelList) { - if (fuel.energietraeger == energietraeger && fuel.einheit == einheit) { - return fuel; + if (fuel[0] == energietraeger && fuel[1] == einheit) { + return { + coe: fuel[4], + energietraeger: fuel[0], + einheit: fuel[1], + umrechnungsfaktor: fuel[2], + primärenergiefaktor: fuel[3] + }; } } diff --git a/src/pages/api/ausweis/bedarfsausweis.ts b/src/pages/api/ausweis/bedarfsausweis.ts new file mode 100644 index 00000000..b9d551f3 --- /dev/null +++ b/src/pages/api/ausweis/bedarfsausweis.ts @@ -0,0 +1,137 @@ +import type { APIRoute } from "astro"; +import { error, success } from "src/lib/APIResponse"; +import { z } from "zod"; + +const AusweisUploadChecker = z.object({ + typ: z.enum(["VA", "BA", "VANW"]), + + objekt: z.object({ + typ: z.string(), + plz: z.string().min(4).max(5), + ort: z.string(), + strasse: z.string(), + baujahr: z.number(), + saniert: z.boolean(), + gebaeudeteil: z.enum(["Gesamtgebäude", "Wohnen"]), + einheiten: z.number(), + }), + + heizquellen: z + .array( + z.object({ + verbrauch: z.array(z.number()).max(3).min(3), + einheit: z.string(), + brennstoff: z.string(), + anteil_warmwasser: z.number(), + }) + ) + .max(2) + .min(1), + + energieverbrauch_zeitraum: z.date(), + wohnflaeche: z.number(), + + keller_beheizt: z.boolean(), + dachgeschoss: z.number(), + zusaetzliche_heizquelle: z.boolean(), + warmwasser_enthalten: z.boolean(), + lueftungskonzept: z.enum([ + "Fensterlüftung", + "Schachtlüftung", + "Lüftungsanlage ohne Wärmerückgewinnung", + "Lüftungsanlage mit Wärmerückgewinnung", + ]), + wird_gekuehlt: z.boolean(), + leerstand: z.number(), + images: z.array(z.string()), + + versorgungssysteme: z.number(), + fenster_dach: z.number(), + energiequelle_2_nutzung: z.number(), + daemmung: z.number(), + + /** + * Bedarfsausweis spezifische Eigenschaften + */ + anzahl_vollgeschosse: z.number(), + geschosshoehe: z.number(), + anzahl_gauben: z.number(), + breite_gauben: z.number(), + masse_a: z.number(), + masse_b: z.number(), + masse_c: z.number(), + masse_d: z.number(), + masse_e: z.number(), + masse_f: z.number(), + fensterflaeche_so_sw: z.number(), + fensterflaeche_nw_no: z.number(), + aussenwandflaeche_unbeheizt: z.number(), + dachflaeche: z.number(), + dach_u_wert: z.number(), + deckenflaeche: z.number(), + decke_u_wert: z.number(), + aussenwand_flaeche: z.number(), + aussenwand_u_wert: z.number(), + fussboden_flaeche: z.number(), + fussboden_u_wert: z.number(), + volumen: z.number(), + dicht: z.boolean(), + fenster_flaeche_1: z.number(), + fenster_art_1: z.number(), + fenster_flaeche_2: z.number(), + fenster_art_2: z.number(), + dachfenster_flaeche: z.number(), + dachfenster_art: z.number(), + haustuer_flaeche: z.number(), + haustuer_art: z.number(), + dach_bauart: z.string(), + dach_daemmung: z.number(), + decke_bauart: z.string(), + decke_daemmung: z.number(), + aussenwand_bauart: z.string(), + aussenwand_daemmung: z.number(), + boden_bauart: z.string(), + boden_daemmung: z.number(), + warmwasser_verteilung: z.string(), + warmwasser_speicherung: z.string(), + warmwasser_erzeugung: z.string(), + heizung_zentral: z.boolean(), + heizung_verteilung: z.string(), + heizung_speicherung: z.string(), + waerme_erzeugung_heizung: z.string(), + anteil_zusatzheizung: z.number(), + kollektor_flaeche: z.number(), + + // VANW + + vanw_stromverbrauch_enthalten: z.number(), + vanw_stromverbrauch_sonstige: z.string(), + vanw_strom_1: z.number(), + vanw_strom_2: z.number(), + vanw_strom_3: z.number(), + + erledigt: z.boolean(), + + anrede: z.string(), + name: z.string(), + vorname: z.string(), + email: z.string(), + telefonnummer: z.string(), +}); + +/** + * 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(); + + const result = AusweisUploadChecker.safeParse(body); + + if (!result.success) { + return error(result.error.issues); + } + + return success({}); +}; diff --git a/src/pages/api/ausweis/verbrauchsausweis.ts b/src/pages/api/ausweis/verbrauchsausweis.ts index 91044f55..1e255969 100644 --- a/src/pages/api/ausweis/verbrauchsausweis.ts +++ b/src/pages/api/ausweis/verbrauchsausweis.ts @@ -1,16 +1,122 @@ import type { APIRoute } from "astro"; -import { success } from "src/lib/APIResponse"; +import { ActionFailedError, error, success } from "src/lib/APIResponse"; +import { db } from "src/lib/shared"; +import { z } from "zod"; + +const AusweisUploadChecker = z.object({ + ausweisart: z.enum(["VA", "BA", "VANW"]), + + objekt_typ: z.string(), + objekt_plz: z.string(), + objekt_ort: z.string(), + objekt_strasse: z.string(), + objekt_gebaeudeteil: z.string(), + objekt_saniert: z.boolean() , + baujahr_gebaeude: z.number(), + baujahr_anlage: z.number(), + anzahl_einheiten: z.number(), + + ausstellgrund: z.enum(["Vermietung" + ,"Neubau" + , "Verkauf" + , "Modernisierung" + , "Sonstiges"]), + + energieverbrauch_zeitraum: z.string(), + energieverbrauch_1_heizquelle_1: z.number(), + energieverbrauch_2_heizquelle_1: z.number(), + energieverbrauch_3_heizquelle_1: z.number(), + energieverbrauch_1_heizquelle_2: z.number(), + energieverbrauch_2_heizquelle_2: z.number(), + energieverbrauch_3_heizquelle_2: z.number(), + + energietraeger_einheit_heizquelle_1: z.string(), + energietraeger_einheit_heizquelle_2: z.string(), + energietraeger_1: z.string(), + energietraeger_2: z.string(), + + anteil_warmwasser_1: z.number(), + anteil_warmwasser_2: z.number(), + + wohnflaeche: z.number(), + + keller_beheizt: z.boolean(), + dachgeschoss: z.number(), + zusaetzliche_heizquelle: z.boolean(), + warmwasser_enthalten: z.boolean(), + lueftungskonzept: z.enum([ + "Fensterlüftung", + "Schachtlüftung", + "Lüftungsanlage ohne Wärmerückgewinnung", + "Lüftungsanlage mit Wärmerückgewinnung", + ]), + wird_gekuehlt: z.boolean(), + leerstand: z.number(), + images: z.array(z.string()), + + versorgungssysteme: z.number(), + fenster_dach: z.number(), + energiequelle_2_nutzung: z.number(), + daemmung: z.number(), + + anrede: z.string().optional(), + name: z.string().optional(), + vorname: z.string().optional(), + email: z.string().optional(), + telefonnummer: z.string().optional(), +}); /** * Erstellt einen Verbrauchsausweis anhand der gegebenen Daten und trägt ihn in die Datenbank ein. - * @param param0 - * @returns + * @param param0 + * @returns */ export const post: APIRoute = async ({ request }) => { const body = await request.json(); - + const validation = AusweisUploadChecker.safeParse(body); + if (!validation.success) { + return error(validation.error.issues); + } - return success({}); -} \ No newline at end of file + const result = await db("ausweise").insert(body).returning(["uid", "id"]); + if (!result) { + return ActionFailedError(); + } + + const { uid, id } = result[0]; + + if (!uid || !id) { + return ActionFailedError(); + } + + return success({ + uid, id + }); +}; + +export const put: APIRoute = async ({ request }) => { + const body = await request.json(); + + const validation = AusweisUploadChecker.safeParse(body); + + if (!validation.success) { + return error(validation.error.issues); + } + + const result = await db("ausweise").insert(body).returning(["uid", "id"]); + if (!result) { + return ActionFailedError(); + } + + const { uid, id } = result[0]; + + if (!uid || !id) { + return ActionFailedError(); + } + + return success({ + uid, id + }); +}; diff --git a/src/pages/api/image.ts b/src/pages/api/image.ts new file mode 100644 index 00000000..3539c0cc --- /dev/null +++ b/src/pages/api/image.ts @@ -0,0 +1,44 @@ +import type { APIRoute } from "astro"; +import { ActionFailedError, error, success } from "src/lib/APIResponse"; +import * as jimp from "jimp"; +import { v4 as uuid } from "uuid"; +import { z } from "zod"; +import * as path from "path"; + +const ImageUploadChecker = z.object({ + data: z.string(), + name: z.string() +}); + +/** + * Speichert ein Bild auf unserem Server ab und gibt die UID des Bildes zurück + * @param param0 + * @returns + */ +export const put: APIRoute = async ({ request }) => { + const body = await request.json(); + + const result = ImageUploadChecker.safeParse(body); + + if (!result.success) { + return error(result.error.issues); + } + + const image = Buffer.from(body.data, "base64url"); + + let jimpResult; + try { + jimpResult = await jimp.read(image); + } catch(e) { + return ActionFailedError(); + } + + const uid = uuid(); + const location = path.join(uid); + + jimpResult.quality(0.75).write(location); + + return success({ + uid + }); +}; diff --git a/src/pages/pdf/datenblatt.astro b/src/pages/pdf/datenblatt.astro new file mode 100644 index 00000000..5d5aa76f --- /dev/null +++ b/src/pages/pdf/datenblatt.astro @@ -0,0 +1,254 @@ +--- +import moment from "moment"; +import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; +import { Dachgeschoss } from "src/lib/Ausweis/types"; +import Checkbox from "~/components/Checkbox.svelte"; +import DatenblattFooter from "~/components/DatenblattFooter.svelte"; +import DatenblattHeader from "~/components/DatenblattHeader.svelte"; +import PDFHeader from "~/components/PDF/PDFHeader.svelte"; +import PDFSectionHeader from "~/components/PDF/PDFSectionHeader.svelte"; +import PDFLayout from "~/layouts/PDFLayout.astro"; + +const base64 = Astro.url.searchParams.get("base64"); + +if (!base64) { + return Astro.redirect("/404") +} + +const ausweis = Verbrauchsausweis.fromBase64(base64); + +if (!ausweis) { + return Astro.redirect("/404") +} + +--- + + +
+
+ +
+
+

Datenblatt Energieausweis

+

Ausweis ID:

+
+

Gebäudedaten:

+

Adresse: {ausweis.objekt_strasse}, {ausweis.objekt_plz} {ausweis.objekt_ort}

+
+ Neubau + Vermietung/Verkauf + Modernisierung + Sonstiges +
+
+ + + + + + + + + + + + + + + + + + + + + +
Baujahr Gebäude:{ausweis.baujahr_gebaeude}
Baujahr Heizung:{ausweis.baujahr_anlage}
Wohnfläche:{ausweis.wohnflaeche}
Lüftungskonzept:{ausweis.lueftungskonzept}
Gebäudetyp:{ausweis.objekt_typ}
+ + + + + + + + + + + + + + + + + + + + + + +
Dachgeschoss:{ausweis.dachgeschoss == Dachgeschoss.BEHEIZT ? "Beheizt" : (ausweis.dachgeschoss == Dachgeschoss.UNBEHEIZT ? "Unbeheizt" : "Nicht Vorhanden")}
Beheizter Keller:{ausweis.keller_beheizt ? "Ja" : "Nein"}
Wohnungen:{ausweis.anzahl_einheiten}
Anlage zur Kühlung:{ausweis.wird_gekuehlt ? "Ja" : "Nein"}
Leerstand:{ausweis.leerstand}%
+
+
+
+

Heizverbrauch

+
+

Von: {moment(ausweis.energieverbrauch_zeitraum).format("MM.YYYY")}

+

Bis: {moment(ausweis.energieverbrauch_zeitraum).add("1", "year").format("MM.YYYY")}

+
+
+

Von: {moment(ausweis.energieverbrauch_zeitraum).add("1", "year").format("MM.YYYY")}

+

Bis: {moment(ausweis.energieverbrauch_zeitraum).add("2", "years").format("MM.YYYY")}

+
+
+

Von: {moment(ausweis.energieverbrauch_zeitraum).add("2", "years").format("MM.YYYY")}

+

Bis: {moment(ausweis.energieverbrauch_zeitraum).add("3", "years").format("MM.YYYY")}

+
+
+
+

{ausweis.energietraeger_1}

+
+

{ausweis.energieverbrauch_1_heizquelle_1}

+

{ausweis.energietraeger_einheit_heizquelle_1}

+
+
+

{ausweis.energieverbrauch_2_heizquelle_1}

+

{ausweis.energietraeger_einheit_heizquelle_1}

+
+
+

{ausweis.energieverbrauch_3_heizquelle_1}

+

{ausweis.energietraeger_einheit_heizquelle_1}

+
+
+
+
+
+

Heizverbrauch (Heizwert)

+
+

Von: {moment(ausweis.energieverbrauch_zeitraum).format("MM.YYYY")}

+

Bis: {moment(ausweis.energieverbrauch_zeitraum).add("1", "year").format("MM.YYYY")}

+
+
+

Von: {moment(ausweis.energieverbrauch_zeitraum).add("1", "year").format("MM.YYYY")}

+

Bis: {moment(ausweis.energieverbrauch_zeitraum).add("2", "years").format("MM.YYYY")}

+
+
+

Von: {moment(ausweis.energieverbrauch_zeitraum).add("2", "years").format("MM.YYYY")}

+

Bis: {moment(ausweis.energieverbrauch_zeitraum).add("3", "years").format("MM.YYYY")}

+
+
+
+

{ausweis.energietraeger_1}

+
+

{ausweis.energieverbrauch_1_heizquelle_1}

+

{ausweis.energietraeger_einheit_heizquelle_1}

+
+
+

{ausweis.energieverbrauch_2_heizquelle_1}

+

{ausweis.energietraeger_einheit_heizquelle_1}

+
+
+

{ausweis.energieverbrauch_3_heizquelle_1}

+

{ausweis.energietraeger_einheit_heizquelle_1}

+
+
+
+

Warmwasser enthalten: {ausweis.warmwasser_enthalten ? "Ja" : "Nein"}

+
+ + +
+
+ +
+

Modernisierungsstand

+

Heizungsanlage

+
+ Zentral/Etage + Einzelöfen + Durchlauferhitzer + Standardkessel + Solarsystem für Warmwasser + Wärmepumpe + Niedertemperaturkessel + Brennwertkessel/Therme + Warmwasserrohre gedämmt + Heizungsrohre gedämmt + Zirkulation + Raumtemperraturregler +
+

Fenster/Dachfenster/Türen

+
+ Einfachglas + Doppelverglasung + Isolierverglasung + Dreifachverglasung + Alle Fenster dicht + Fenster teilweise undicht + Alle Türen dicht + Türen teilweise undicht + Rolladenkästen gedämmt +
+

Wärmedämmung

+
+ Außenwand gedämmt + Kelleraußenwand gedämmt + Kellerdecke gedämmt + Dachgeschoss gedämmt + Oberste Geschossdecke gedämmt + Oberste Geschossdecke min. 12cm gedämmt +
+ Die Angaben sind richtig und entsprechen dem aktuellen Stand. + Ich habe die AGB gelesen und akzeptiert. +

Die Angaben auf diesem Datenblatt wurden uns übermittelt und werden zur Berechnung und + Ausstellung des Ausweises herangezogen.

+
+ +
+
+
+ +