Bedarfsausweis Rechnung + Datenblatt

This commit is contained in:
Moritz Utcke
2023-05-09 20:30:44 +04:00
parent e2d742e069
commit 724f3ff546
25 changed files with 934 additions and 531 deletions

View File

@@ -22,6 +22,7 @@
"astro": "^2.1.7", "astro": "^2.1.7",
"cookiejs": "^2.1.2", "cookiejs": "^2.1.2",
"express": "^4.18.2", "express": "^4.18.2",
"jimp": "^0.22.7",
"jwt-simple": "^0.5.6", "jwt-simple": "^0.5.6",
"katex": "^0.16.7", "katex": "^0.16.7",
"knex": "^2.4.2", "knex": "^2.4.2",

View File

@@ -1,7 +1,9 @@
<script lang="ts"> <script lang="ts">
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
export let ausweis: Verbrauchsausweis; export let ausweis: Verbrauchsausweis | Bedarfsausweis | VerbrauchsausweisGewerbe;
function viewAusweis() { function viewAusweis() {
const base64 = btoa(JSON.stringify(ausweis)); const base64 = btoa(JSON.stringify(ausweis));

View File

@@ -1,10 +1,15 @@
<script lang="ts"> <script lang="ts">
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis";
import AnsichtsausweisButton from "~/components/AnsichtsausweisButton.svelte"; import AnsichtsausweisButton from "~/components/AnsichtsausweisButton.svelte";
import DatenblattButton from "~/components/DatenblattButton.svelte"; import DatenblattButton from "~/components/DatenblattButton.svelte";
import HelpLabel from "~/components/HelpLabel.svelte"; import HelpLabel from "~/components/HelpLabel.svelte";
export let ausweis: Verbrauchsausweis; export let ausweis:
| Verbrauchsausweis
| VerbrauchsausweisGewerbe
| Bedarfsausweis;
import ImageGrid from "../ImageGrid.svelte"; import ImageGrid from "../ImageGrid.svelte";
@@ -12,35 +17,29 @@
</script> </script>
<div class="grid grid-cols-2 p-4 gap-4"> <div class="grid grid-cols-2 p-4 gap-4">
<div class="rounded-lg border-4 p-4 bg-white"> <div class="rounded-lg border-4 p-4 bg-white">
<div class="GRB4"> <div class="GRB4">
<div class="form-group col-md-12 nopad"> <div class="form-group col-md-12 nopad">
<HelpLabel <HelpLabel title="Gebäudebild Bildupload :">
title="Gebäudebild Bildupload :" Wenn vorhanden können Sie ein Gebäudefoto (Außenansicht)
> hochladen.
Wenn vorhanden können Sie ein
Gebäudefoto (Außenansicht)
hochladen.
</HelpLabel>
<hr class="trenner_form_100" />
</div>
<ImageGrid max={1} bind:images></ImageGrid>
</div>
</div>
<div class="rounded-lg border-4 p-4 bg-white">
<HelpLabel
title="Ansichtsausweis & Datenblatt :"
>
Hier gehts zu Ihrem Ansichtsausweis
und Datenblatt als PDF.
</HelpLabel> </HelpLabel>
<hr class="trenner_form_100" /> <hr class="trenner_form_100" />
<div class="flex flex-row gap-4">
<AnsichtsausweisButton ausweis={ausweis}></AnsichtsausweisButton>
<DatenblattButton></DatenblattButton>
</div>
</div> </div>
</div>
<ImageGrid max={1} bind:images />
</div>
</div>
<div class="rounded-lg border-4 p-4 bg-white">
<HelpLabel title="Ansichtsausweis & Datenblatt :">
Hier gehts zu Ihrem Ansichtsausweis und Datenblatt als PDF.
</HelpLabel>
<hr class="trenner_form_100" />
<div class="flex flex-row gap-4">
<AnsichtsausweisButton {ausweis} />
<DatenblattButton {ausweis} />
</div>
</div>
</div>

View File

@@ -4,6 +4,8 @@
import Label from "../Label.svelte"; import Label from "../Label.svelte";
import fuelList from "./fuelList"; import fuelList from "./fuelList";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis";
let availableYears = [ let availableYears = [
2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
@@ -23,12 +25,13 @@
"Dezember", "Dezember",
]; ];
export let ausweis: Verbrauchsausweis; export let ausweis: Verbrauchsausweis |VerbrauchsausweisGewerbe | Bedarfsausweis;
const fuelMap: Record<string, string[]> = {}; const fuelMap: Record<string, string[]> = {};
for (const fuel of fuelList) { for (const fuel of fuelList) {
fuelMap[fuel.energietraeger] = fuelMap[fuel.energietraeger] || []; // fuelMap[fuel.energietraeger] = ...
fuelMap[fuel.energietraeger].push(fuel.einheit); fuelMap[fuel[0]] = fuelMap[fuel[0]] || [];
fuelMap[fuel[0]].push(fuel[1]);
} }
let month: string = "01"; let month: string = "01";

View File

@@ -1,290 +1,49 @@
export default [
{ /**
energietraeger: "Heizöl EL", * [energietraeger, einheit, umrechnungsfaktor, primärenergiefaktor, coe]
einheit: "l", */
umrechnungsfaktor: 10.0, const brennstoffe: [
primärenergiefaktor: 1.1, string,
heizwertfaktor: 1.06, string,
coe: 0.310, number,
}, number,
{ number
energietraeger: "Erdgas H", ][] = [
einheit: "", ["Heizöl EL", "l", 10.0, 1.1, 0.31],
umrechnungsfaktor: 10.0, ["Erdgas H", "m³", 10.0, 1.1, 0.24],
primärenergiefaktor: 1.1, ["Holz-Pellets", "kg", 5.0, 0.2, 0.02],
heizwertfaktor: 1.11, ["Brennholz", "kg", 4.1, 0.2, 0.02],
coe: 0.240, ["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],
energietraeger: "Holz-Pellets", ["Strommix", "kWh", 1.0, 2.4, 0.56],
einheit: "kg", ["Fernwärme KWK FB", "kWh", 1.0, 0.7, 0.3],
umrechnungsfaktor: 5.0, ["Nahwärme KWK FB", "kWh", 1.0, 0.7, 0.3],
primärenergiefaktor: 0.2, ["Heizöl EL", "kWh", 1.0, 1.1, 0.31],
heizwertfaktor: 1.08, ["Erdgas H", "kWh", 1.0, 1.1, 0.24],
coe: 0.020, ["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],
energietraeger: "Brennholz", ["Braunkohle", "kWh", 1.0, 1.2, 0.43],
einheit: "kg", ["Holzhackschnitzel", "kWh", 1.0, 0.2, 0.02],
umrechnungsfaktor: 4.1, ["Flüssiggas", "l", 7.3, 1.1, 0.27],
primärenergiefaktor: 0.2, ["Brennholz", "m³", 2000.0, 0.2, 0.02],
heizwertfaktor: 1.08, ["Flüssiggas", "m³", 26.0, 1.1, 0.27],
coe: 0.020, ["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],
energietraeger: "Flüssiggas", ["Erdgas L", "m³", 9.0, 1.1, 0.24],
einheit: "kg", ["Koks", "kWh", 1.0, 1.1, 0.4],
umrechnungsfaktor: 13.0, ["Holzhackschnitzel", "kg", 3.8, 0.2, 0.02],
primärenergiefaktor: 1.1, ["Nahwärme HKW EB", "kWh", 1.0, 0.1, 0.06],
heizwertfaktor: 1.09, ["Nahwärme HKW FB", "kWh", 1.0, 1.3, 0.4],
coe: 0.270, ["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],
energietraeger: "Braunkohle", ["Fernwärme HKW EB", "kWh", 1.0, 0.1, 0.06],
einheit: "kg", ["Erdgas", "kWh", 1.0, 1.1, 0.24],
umrechnungsfaktor: 5.5, ["Heizöl", "kWh", 1.0, 1.1, 0.31],
primärenergiefaktor: 1.2, ["Heizöl", "l", 10.0, 1.1, 0.31],
heizwertfaktor: 1.07, ["Erdgas", "m³", 9.0, 1.1, 0.24],
coe: 0.430, ]
}, export default brennstoffe;
{
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,
},
];

View File

@@ -4,6 +4,7 @@
import Katex from "./Katex.svelte"; import Katex from "./Katex.svelte";
import moment from "moment"; import moment from "moment";
import Cross from "./Icons/Cross.svelte"; import Cross from "./Icons/Cross.svelte";
import { Dachgeschoss } from "src/lib/Ausweis/types";
interface Service { interface Service {
name: string; name: string;
@@ -134,7 +135,7 @@
</tr> </tr>
<tr> <tr>
<td>DB</td><td>:</td> <td>DB</td><td>:</td>
<td>{ausweis.dachgeschoss}</td> <td>{ausweis.dachgeschoss == Dachgeschoss.BEHEIZT ? "Ja" : "Nein"}</td>
</tr> </tr>
</table> </table>
</div> </div>

View File

@@ -11,12 +11,13 @@
import BilderZusatzsysteme from "../Ausweis/BilderZusatzsysteme.svelte"; import BilderZusatzsysteme from "../Ausweis/BilderZusatzsysteme.svelte";
import moment from "moment"; import moment from "moment";
import { BitChecker } from "src/lib/BitChecker"; import { BitChecker } from "src/lib/BitChecker";
import { Dachgeschoss } from "src/lib/Ausweis/types";
let ausweis = new Bedarfsausweis(); 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, Einfachverglasung: 5,
"Holzfenster Doppelverglasung": 2.7, "Holzfenster Doppelverglasung": 2.7,
"Kunststofffenster Doppelverglasung": 3, "Kunststofffenster Doppelverglasung": 3,
@@ -50,7 +51,7 @@
ausweis.objekt_ort = "Hamburg"; ausweis.objekt_ort = "Hamburg";
ausweis.wohnflaeche = 152; ausweis.wohnflaeche = 152;
ausweis.keller_beheizt = true; ausweis.keller_beheizt = true;
ausweis.dachgeschoss = "Unbeheizt"; ausweis.dachgeschoss = Dachgeschoss.UNBEHEIZT;
ausweis.energieverbrauch_zeitraum = moment("04.01.2018"); ausweis.energieverbrauch_zeitraum = moment("04.01.2018");
ausweis.energietraeger_1 = "Erdgas"; ausweis.energietraeger_1 = "Erdgas";
ausweis.energietraeger_einheit_heizquelle_1 = "kWh"; ausweis.energietraeger_einheit_heizquelle_1 = "kWh";
@@ -102,7 +103,7 @@
ausweis.heizung_speicherung = "elzs7055bis1994"; ausweis.heizung_speicherung = "elzs7055bis1994";
ausweis.energietraeger_2 = "Braunkohle"; ausweis.energietraeger_2 = "Braunkohle";
ausweis.anteil_zusatzheizung = 0.7; ausweis.anteil_zusatzheizung = 0.7;
ausweis = ausweis ausweis = ausweis;
} }
</script> </script>
@@ -140,7 +141,6 @@
und Gebäudeteil</Label und Gebäudeteil</Label
> >
<div class="GRB"> <div class="GRB">
<!-- Strasse -->
<div> <div>
<HelpLabel title="Straße, Hausnummer *" <HelpLabel title="Straße, Hausnummer *"
>Bitte geben Sie hier die Straße und Hausnummer des Gebäudes >Bitte geben Sie hier die Straße und Hausnummer des Gebäudes
@@ -156,13 +156,13 @@
/> />
</div> </div>
</div> </div>
<!-- PLZ -->
<ZipSearch <ZipSearch
bind:zip={ausweis.objekt_plz} bind:zip={ausweis.objekt_plz}
bind:city={ausweis.objekt_ort} bind:city={ausweis.objekt_ort}
name="zip" name="zip"
/> />
<!-- Objekt Ort -->
<div> <div>
<HelpLabel title="Ort *" <HelpLabel title="Ort *"
>Ort des Gebäudes wird automatisch ermittelt.</HelpLabel >Ort des Gebäudes wird automatisch ermittelt.</HelpLabel
@@ -176,7 +176,6 @@
</div> </div>
</div> </div>
<!-- Wohnfläche -->
<div> <div>
<HelpLabel title="Wohnfläche m² *" <HelpLabel title="Wohnfläche m² *"
>Bitte geben Sie hier die beheizte Wohnfläche in m² ein. >Bitte geben Sie hier die beheizte Wohnfläche in m² ein.
@@ -193,7 +192,7 @@
/> />
</div> </div>
</div> </div>
<!-- Gebäudetyp -->
<div> <div>
<HelpLabel title="Gebäudetyp *" <HelpLabel title="Gebäudetyp *"
>Bitte wählen Sie hier den Gebäudetyp aus. >Bitte wählen Sie hier den Gebäudetyp aus.
@@ -234,7 +233,7 @@
</select> </select>
</div> </div>
</div> </div>
<!-- Gebäudeteil -->
<div> <div>
<HelpLabel title="Gebäudeteil *" <HelpLabel title="Gebäudeteil *"
>Bitte geben Sie hier den Gebäudeteil ein. In den meisten >Bitte geben Sie hier den Gebäudeteil ein. In den meisten
@@ -275,7 +274,6 @@
> >
<div class="grid grid-cols-4 gap-4"> <div class="grid grid-cols-4 gap-4">
<!-- Anzahl Vollgeschosse -->
<div> <div>
<HelpLabel title="Anzahl Vollgeschosse *" <HelpLabel title="Anzahl Vollgeschosse *"
>Bitte geben Sie hier die Anzahl der Vollgeschosse >Bitte geben Sie hier die Anzahl der Vollgeschosse
@@ -289,7 +287,7 @@
required required
/> />
</div> </div>
<!-- Geschosshöhe -->
<div> <div>
<HelpLabel title="Geschosshöhe *" <HelpLabel title="Geschosshöhe *"
>Bitte geben Sie hier die Geschosshöhe (lichte >Bitte geben Sie hier die Geschosshöhe (lichte
@@ -309,7 +307,7 @@
{/each} {/each}
</select> </select>
</div> </div>
<!-- Warmwasser Antel -->
<div> <div>
<HelpLabel title="Gaubenanzahl" <HelpLabel title="Gaubenanzahl"
>Wenn Ihr Gebäude Dachgauben besitzt geben Sie hier >Wenn Ihr Gebäude Dachgauben besitzt geben Sie hier
@@ -321,7 +319,7 @@
type="number" type="number"
/> />
</div> </div>
<!-- Warmwasser Antel -->
<div> <div>
<HelpLabel title="Breite aller Gauben in m" <HelpLabel title="Breite aller Gauben in m"
>Bitte geben Sie hier die Gesamtbreite aller Gauben >Bitte geben Sie hier die Gesamtbreite aller Gauben
@@ -449,12 +447,12 @@
</div> </div>
<div class="grid grid-cols-2 gap-4"> <div class="grid grid-cols-2 gap-4">
<!-- Verbrauch 1 Monat -->
<div> <div>
<Label>Dachfläche in m²</Label> <Label>Dachfläche in m²</Label>
<input <input
name="dachflaeche" name="dachflaeche"
bind:value={ausweis.dachflaeche} bind:value={ausweis.dachflaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number" type="number"
/> />
</div> </div>
@@ -463,18 +461,19 @@
<input <input
name="dach_u_wert" name="dach_u_wert"
bind:value={ausweis.dach_u_wert} bind:value={ausweis.dach_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number" type="number"
/> />
</div> </div>
<!-- Verbrauch1-row-close -->
</div> </div>
<!-- Verbrauch1-close -->
<div class="grid grid-cols-2 gap-4"> <div class="grid grid-cols-2 gap-4">
<div> <div>
<Label>Geschoßdecke in m²</Label> <Label>Geschoßdecke in m²</Label>
<input <input
name="deckenflaeche" name="deckenflaeche"
bind:value={ausweis.deckenflaeche} bind:value={ausweis.deckenflaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number" type="number"
/> />
</div> </div>
@@ -483,18 +482,19 @@
<input <input
name="decke_u_wert" name="decke_u_wert"
bind:value={ausweis.decke_u_wert} bind:value={ausweis.decke_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number" type="number"
/> />
</div> </div>
<!-- Verbrauch2-row-close -->
</div> </div>
<!-- Verbrauch2-container-close -->
<div class="grid grid-cols-2 gap-4"> <div class="grid grid-cols-2 gap-4">
<div> <div>
<Label>Außenwand in m²</Label> <Label>Außenwand in m²</Label>
<input <input
name="aussenwand_flaeche" name="aussenwand_flaeche"
bind:value={ausweis.aussenwand_flaeche} bind:value={ausweis.aussenwand_flaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number" type="number"
/> />
</div> </div>
@@ -503,6 +503,7 @@
<input <input
name="aussenwand_u_wert" name="aussenwand_u_wert"
bind:value={ausweis.aussenwand_u_wert} bind:value={ausweis.aussenwand_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number" type="number"
/> />
</div> </div>
@@ -514,6 +515,7 @@
<input <input
name="fussboden_flaeche" name="fussboden_flaeche"
bind:value={ausweis.fussboden_flaeche} bind:value={ausweis.fussboden_flaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number" type="number"
/> />
</div> </div>
@@ -522,6 +524,7 @@
<input <input
name="fussboden_u_wert" name="fussboden_u_wert"
bind:value={ausweis.fussboden_u_wert} bind:value={ausweis.fussboden_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number" type="number"
/> />
</div> </div>
@@ -536,6 +539,7 @@
name="volumen" name="volumen"
type="number" type="number"
bind:value={ausweis.volumen} bind:value={ausweis.volumen}
readonly={!ausweis.tabellenwerte_aendern}
/> />
</div> </div>
@@ -568,7 +572,6 @@
und Boden</Label und Boden</Label
> >
<div class="box grid grid-cols-4 gap-4"> <div class="box grid grid-cols-4 gap-4">
<!-- Fensterfläche -->
<div> <div>
<HelpLabel title="Fensterfläche 1 in m² *" <HelpLabel title="Fensterfläche 1 in m² *"
>Bitte geben Sie hier die Fläche der Fenster ein.</HelpLabel >Bitte geben Sie hier die Fläche der Fenster ein.</HelpLabel
@@ -581,19 +584,19 @@
placeholder="0" placeholder="0"
/> />
</div> </div>
<!-- Fensterart -->
<div> <div>
<HelpLabel title="Art der Fenster *" <HelpLabel title="Art der Fenster *"
>Bitte geben Sie hier die Art der Fenster ein.</HelpLabel >Bitte geben Sie hier die Art der Fenster ein.</HelpLabel
> >
<select name="fenster_art_1" bind:value={ausweis.fenster_art_1}> <select name="fenster_art_1" bind:value={ausweis.fenster_art_1}>
<option>bitte auswählen</option> <option>bitte auswählen</option>
{#each Object.entries(windowTypes) as [name, value]} {#each Object.entries(fensterArten) as [name, value]}
<option {value}>{name}</option> <option {value}>{name}</option>
{/each} {/each}
</select> </select>
</div> </div>
<!-- Fensterfläche -->
<div> <div>
<HelpLabel title="Fensterfläche 2 in m² *" <HelpLabel title="Fensterfläche 2 in m² *"
>Wenn vorhanden geben Sie hier die Fläche der Fenster ein >Wenn vorhanden geben Sie hier die Fläche der Fenster ein
@@ -605,7 +608,7 @@
bind:value={ausweis.fenster_flaeche_2} bind:value={ausweis.fenster_flaeche_2}
/> />
</div> </div>
<!-- Fensterart -->
<div> <div>
<HelpLabel title="Art der Fenster *" <HelpLabel title="Art der Fenster *"
>Bitte geben Sie hier die Art der Fenster ein.</HelpLabel >Bitte geben Sie hier die Art der Fenster ein.</HelpLabel
@@ -616,12 +619,12 @@
required required
> >
<option>bitte auswählen</option> <option>bitte auswählen</option>
{#each Object.entries(windowTypes) as [name, value]} {#each Object.entries(fensterArten) as [name, value]}
<option {value}>{name}</option> <option {value}>{name}</option>
{/each} {/each}
</select> </select>
</div> </div>
<!-- Fensterfläche -->
<div> <div>
<HelpLabel title="Dachfenster in m² *" <HelpLabel title="Dachfenster in m² *"
>Bitte geben Sie hier die Fläche der Dachfenster ein.</HelpLabel >Bitte geben Sie hier die Fläche der Dachfenster ein.</HelpLabel
@@ -632,7 +635,7 @@
bind:value={ausweis.dachfenster_flaeche} bind:value={ausweis.dachfenster_flaeche}
/> />
</div> </div>
<!-- Fensterart -->
<div> <div>
<HelpLabel title="Art der Dachfenster *" <HelpLabel title="Art der Dachfenster *"
>Bitte geben Sie hier die Art der Fenster ein.</HelpLabel >Bitte geben Sie hier die Art der Fenster ein.</HelpLabel
@@ -642,12 +645,12 @@
bind:value={ausweis.dachfenster_art} bind:value={ausweis.dachfenster_art}
> >
<option>bitte auswählen</option> <option>bitte auswählen</option>
{#each Object.entries(windowTypes) as [name, value]} {#each Object.entries(fensterArten) as [name, value]}
<option {value}>{name}</option> <option {value}>{name}</option>
{/each} {/each}
</select> </select>
</div> </div>
<!-- Fensterfläche -->
<div> <div>
<HelpLabel title="Haustür in m² *" <HelpLabel title="Haustür in m² *"
>Bitte geben Sie hier die Fläche der Haustür ein.</HelpLabel >Bitte geben Sie hier die Fläche der Haustür ein.</HelpLabel
@@ -658,7 +661,7 @@
bind:value={ausweis.haustuer_flaeche} bind:value={ausweis.haustuer_flaeche}
/> />
</div> </div>
<!-- Fensterart -->
<div> <div>
<HelpLabel title="Art der Tür *" <HelpLabel title="Art der Tür *"
>Bitte geben Sie hier die Art der Haustür ein.</HelpLabel >Bitte geben Sie hier die Art der Haustür ein.</HelpLabel
@@ -690,7 +693,6 @@
<hr /> <hr />
<div class="box grid grid-cols-4 gap-4"> <div class="box grid grid-cols-4 gap-4">
<!-- Bauart Geschossdecke -->
<div> <div>
<HelpLabel title="Bauart Dachfläche *" <HelpLabel title="Bauart Dachfläche *"
>Bitte geben Sie hier die Bauart der Dachfläche ein.</HelpLabel >Bitte geben Sie hier die Bauart der Dachfläche ein.</HelpLabel
@@ -709,7 +711,7 @@
> >
</select> </select>
</div> </div>
<!-- nachträgliche Dämmung -->
<div> <div>
<HelpLabel title="nachträgliche Dämmung" <HelpLabel title="nachträgliche Dämmung"
>Bitte geben Sie hier die nachträgliche Dämmung ein.</HelpLabel >Bitte geben Sie hier die nachträgliche Dämmung ein.</HelpLabel
@@ -720,12 +722,12 @@
required required
> >
<option>bitte auswählen</option> <option>bitte auswählen</option>
{#each insulationWidths as width} {#each daemmungsBreiten as breite}
<option value={width}>{width * 100} cm</option> <option value={breite}>{breite * 100} cm</option>
{/each} {/each}
</select> </select>
</div> </div>
<!-- Bauart Geschossdecke -->
<div> <div>
<HelpLabel title="Bauart Geschossdecke *" <HelpLabel title="Bauart Geschossdecke *"
>Bitte geben Sie hier die Bauart der Geschossdecke ein.</HelpLabel >Bitte geben Sie hier die Bauart der Geschossdecke ein.</HelpLabel
@@ -744,7 +746,7 @@
> >
</select> </select>
</div> </div>
<!-- nachträgliche Dämmung -->
<div> <div>
<HelpLabel title="nachträgliche Dämmung" <HelpLabel title="nachträgliche Dämmung"
>Bitte geben Sie hier die nachträgliche Dämmung ein.</HelpLabel >Bitte geben Sie hier die nachträgliche Dämmung ein.</HelpLabel
@@ -755,12 +757,12 @@
required required
> >
<option>bitte auswählen</option> <option>bitte auswählen</option>
{#each insulationWidths as width} {#each daemmungsBreiten as breite}
<option value={width}>{width * 100} cm</option> <option value={breite}>{breite * 100} cm</option>
{/each} {/each}
</select> </select>
</div> </div>
<!-- Bauart Geschossdecke -->
<div> <div>
<HelpLabel title="Bauart Außenwand *" <HelpLabel title="Bauart Außenwand *"
>Bitte geben Sie hier die Bauart der Außenwand ein.</HelpLabel >Bitte geben Sie hier die Bauart der Außenwand ein.</HelpLabel
@@ -779,7 +781,7 @@
> >
</select> </select>
</div> </div>
<!-- nachträgliche Dämmung -->
<div> <div>
<HelpLabel title="nachträgliche Dämmung" <HelpLabel title="nachträgliche Dämmung"
>Bitte geben Sie hier die nachträgliche Dämmung ein.</HelpLabel >Bitte geben Sie hier die nachträgliche Dämmung ein.</HelpLabel
@@ -790,12 +792,12 @@
required required
> >
<option>bitte auswählen</option> <option>bitte auswählen</option>
{#each insulationWidths as width} {#each daemmungsBreiten as breite}
<option value={width}>{width * 100} cm</option> <option value={breite}>{breite * 100} cm</option>
{/each} {/each}
</select> </select>
</div> </div>
<!-- Bauart Geschossdecke -->
<div> <div>
<HelpLabel title="Bauart Fußboden *" <HelpLabel title="Bauart Fußboden *"
>Bitte geben Sie hier die Bauart des Fußbodens ein.</HelpLabel >Bitte geben Sie hier die Bauart des Fußbodens ein.</HelpLabel
@@ -814,7 +816,7 @@
> >
</select> </select>
</div> </div>
<!-- nachträgliche Dämmung -->
<div> <div>
<HelpLabel title="nachträgliche Dämmung" <HelpLabel title="nachträgliche Dämmung"
>Bitte geben Sie hier die nachträgliche Dämmung ein.</HelpLabel >Bitte geben Sie hier die nachträgliche Dämmung ein.</HelpLabel
@@ -825,8 +827,8 @@
required required
> >
<option>bitte auswählen</option> <option>bitte auswählen</option>
{#each insulationWidths as width} {#each daemmungsBreiten as breite}
<option value={width}>{width * 100} cm</option> <option value={breite}>{breite * 100} cm</option>
{/each} {/each}
</select> </select>
</div> </div>
@@ -836,7 +838,6 @@
<Label>E - Angabe zu Keller, Dachgeschoss, Lüftung und Kühlung</Label> <Label>E - Angabe zu Keller, Dachgeschoss, Lüftung und Kühlung</Label>
<div class="box"> <div class="box">
<div class="grid grid-cols-4 gap-4 w-full"> <div class="grid grid-cols-4 gap-4 w-full">
<!-- Keller -->
<div> <div>
<label class="control-label" for="keller_beheizt" <label class="control-label" for="keller_beheizt"
>Keller * >Keller *
@@ -854,7 +855,7 @@
</select> </select>
</div> </div>
</div> </div>
<!-- Dachgeschoss -->
<div> <div>
<label class="control-label" for="dachgeschoss" <label class="control-label" for="dachgeschoss"
>Dachgeschoss * >Dachgeschoss *
@@ -866,13 +867,13 @@
required required
> >
<option> Bitte auswählen</option> <option> Bitte auswählen</option>
<option value={false}> nicht vorhanden</option> <option value={Dachgeschoss.NICHT_VORHANDEN}> nicht vorhanden</option>
<option value={false}> unbeheizt</option> <option value={Dachgeschoss.UNBEHEIZT}> unbeheizt</option>
<option value={true}> beheizt</option> <option value={Dachgeschoss.BEHEIZT}> beheizt</option>
</select> </select>
</div> </div>
</div> </div>
<!-- Lüftung -->
<div> <div>
<HelpLabel title="Lüftung erfolgt durch:" <HelpLabel title="Lüftung erfolgt durch:"
>Bitte geben Sie hier ein ob über die Fenster natürlich >Bitte geben Sie hier ein ob über die Fenster natürlich
@@ -904,7 +905,7 @@
</select> </select>
</div> </div>
</div> </div>
<!-- Lüftung -->
<div> <div>
<HelpLabel title="Anlage zur Kühlung" <HelpLabel title="Anlage zur Kühlung"
>Bitte geben Sie an ob das Gebäude im Sommer zusätzlich >Bitte geben Sie an ob das Gebäude im Sommer zusätzlich
@@ -924,7 +925,6 @@
</div> </div>
</div> </div>
<!-- Alternative Energieversorgungssyteme -->
<div> <div>
<HelpLabel <HelpLabel
title="Alternative Energieversorgungssyteme werden genutzt für" title="Alternative Energieversorgungssyteme werden genutzt für"
@@ -972,7 +972,6 @@
<hr /> <hr />
<Label>F - Eingabe der Heizungsanlage</Label> <Label>F - Eingabe der Heizungsanlage</Label>
<div class="box grid grid-cols-4 gap-4"> <div class="box grid grid-cols-4 gap-4">
<!-- Brennstoff -->
<div> <div>
<HelpLabel title="Energieträger *" <HelpLabel title="Energieträger *"
>Bitte geben Sie hier den Energieträger der Heizung ein.</HelpLabel >Bitte geben Sie hier den Energieträger der Heizung ein.</HelpLabel
@@ -985,7 +984,7 @@
<option>Bitte auswählen</option> <option>Bitte auswählen</option>
</select> </select>
</div> </div>
<!-- Verteilung Warmwasser -->
<div> <div>
<HelpLabel title="Verteilung Warmwasser *" <HelpLabel title="Verteilung Warmwasser *"
>Bitte geben Sie hier die Warmwasserverteilung ein.</HelpLabel >Bitte geben Sie hier die Warmwasserverteilung ein.</HelpLabel
@@ -1029,7 +1028,7 @@
> >
</select> </select>
</div> </div>
<!-- Speicherung Warmwasser -->
<div> <div>
<HelpLabel title="Speicherung Warmwasser" <HelpLabel title="Speicherung Warmwasser"
>Bitte geben Sie hier wenn vorhanden die Art des >Bitte geben Sie hier wenn vorhanden die Art des
@@ -1050,7 +1049,7 @@
<option value="elks">Elektro-Kleinspeicher</option> <option value="elks">Elektro-Kleinspeicher</option>
</select> </select>
</div> </div>
<!-- Erzeugung Warmwasser -->
<div> <div>
<HelpLabel title="Erzeugung Warmwasser *" <HelpLabel title="Erzeugung Warmwasser *"
>Bitte geben Sie hier die Wärmeerzeugung für Warmwasser ein.</HelpLabel >Bitte geben Sie hier die Wärmeerzeugung für Warmwasser ein.</HelpLabel
@@ -1066,7 +1065,7 @@
{/each} {/each}
</select> </select>
</div> </div>
<!-- Übergabe Heizung -->
<div> <div>
<HelpLabel title="Übergabe Heizung *" <HelpLabel title="Übergabe Heizung *"
>Bitte geben Sie hier ein ob es sich um Zentralheizung >Bitte geben Sie hier ein ob es sich um Zentralheizung
@@ -1081,7 +1080,7 @@
<option value={false}>Einzelfeuerstätte</option> <option value={false}>Einzelfeuerstätte</option>
</select> </select>
</div> </div>
<!-- Verteilung Heizung -->
<div> <div>
<HelpLabel title="Verteilung Heizung *" <HelpLabel title="Verteilung Heizung *"
>Bitte geben Sie hier die Verteilung der Heizung ein.</HelpLabel >Bitte geben Sie hier die Verteilung der Heizung ein.</HelpLabel
@@ -1129,7 +1128,7 @@
<option value="dezensys">dezentrales System</option> <option value="dezensys">dezentrales System</option>
</select> </select>
</div> </div>
<!-- Speicherung Heizung -->
<div> <div>
<HelpLabel title="Speicherung Heizung" <HelpLabel title="Speicherung Heizung"
>Bitte geben Sie hier - wenn vorhanden - den Speicher der >Bitte geben Sie hier - wenn vorhanden - den Speicher der
@@ -1160,7 +1159,7 @@
> >
</select> </select>
</div> </div>
<!-- Fensterart -->
<div> <div>
<HelpLabel title="Wärmeerzeugung Heizung *" <HelpLabel title="Wärmeerzeugung Heizung *"
>Bitte geben Sie hier den Wärmerzeuger der Heizung ein.</HelpLabel >Bitte geben Sie hier den Wärmerzeuger der Heizung ein.</HelpLabel
@@ -1249,7 +1248,6 @@
<hr /> <hr />
<div class="box grid grid-cols-4 gap-4"> <div class="box grid grid-cols-4 gap-4">
<!-- Energieträger Zusatzheizung -->
<div> <div>
<HelpLabel title="Energieträger Zusatzheizung" <HelpLabel title="Energieträger Zusatzheizung"
>Bitte geben Sie hier - wenn vorhanden - die Zusatzheizung >Bitte geben Sie hier - wenn vorhanden - die Zusatzheizung
@@ -1263,7 +1261,7 @@
<option>Bitte auswählen</option> <option>Bitte auswählen</option>
</select> </select>
</div> </div>
<!-- Energieträger Zusatzheizung -->
<div> <div>
<HelpLabel title="Anteil am Gesamtheizbedarf des Hauses" <HelpLabel title="Anteil am Gesamtheizbedarf des Hauses"
>Bitte geben Sie hier den prozentualen Anteil der >Bitte geben Sie hier den prozentualen Anteil der

View File

@@ -1,4 +1,18 @@
<a class="border-2 rounded-lg w-[30%] bg-white text-center hover:shadow-md no-underline p-6" href="/pdf/datenblatt"> <script lang="ts">
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
export let ausweis: Verbrauchsausweis | Bedarfsausweis | VerbrauchsausweisGewerbe;
function viewDatenblatt() {
const base64 = btoa(JSON.stringify(ausweis));
window.open(`/pdf/datenblatt?base64=${base64}`, "_blank");
}
</script>
<button class="border-2 rounded-lg w-[30%] bg-white text-center hover:shadow-md no-underline p-6" on:click={viewDatenblatt}>
<img src="/images/datenblatt.webp" alt="Datenblatt" /> <img src="/images/datenblatt.webp" alt="Datenblatt" />
<span class="text-black font-medium text-lg">Datenblatt</span> <span class="text-black font-medium text-lg">Datenblatt</span>
</a> </button>

View File

@@ -0,0 +1,9 @@
<script>
import moment from "moment";
</script>
<div class="flex flex-row items-end justify-between px-12 py-8 border-t-8 border-t-primary">
<h2>Copyright © {moment().format("YYYY")} • IB Cornelsen</h2>
<h2>info@online-energieausweis.org</h2>
</div>

View File

@@ -0,0 +1,8 @@
<div class="flex flex-row items-end justify-between px-12 py-8 border-b-8 border-b-primary">
<img src="/images/header/logo-big.png" width="250px" height="auto" alt="">
<div class="flex flex-col">
<p>fon 040 · 209339850</p>
<p>fax 040 · 209339859</p>
<p>online-energieausweis.org</p>
</div>
</div>

View File

@@ -58,6 +58,13 @@
const dataURL = canvas.toDataURL("image/jpeg", 0.75); const dataURL = canvas.toDataURL("image/jpeg", 0.75);
images.push({ ...file, data: dataURL as string } as (File & { data: string })); 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; images = images;
if (i == (Math.min(files.length, max) - 1)) { if (i == (Math.min(files.length, max) - 1)) {

View File

@@ -44,6 +44,8 @@
ausweis.objekt_plz = "21039"; ausweis.objekt_plz = "21039";
ausweis.objekt_ort = "Hamburg"; ausweis.objekt_ort = "Hamburg";
ausweis.objekt_strasse = "Curslacker Deich 170"; ausweis.objekt_strasse = "Curslacker Deich 170";
ausweis.objekt_gebaeudeteil = "Gesamtgebäude"
ausweis.upload();
} }
</script> </script>

View File

@@ -1,5 +1,6 @@
import { Moment } from "moment"; import { Moment } from "moment";
import { BitChecker } from "../BitChecker"; import { BitChecker } from "../BitChecker";
import { Dachgeschoss } from "./types";
export enum AusweisType { export enum AusweisType {
VERBRAUCHSAUSWEIS, VERBRAUCHSAUSWEIS,
@@ -56,7 +57,7 @@ export interface Ausweis {
wohnflaeche: number; wohnflaeche: number;
keller_beheizt: boolean; keller_beheizt: boolean;
dachgeschoss: string; dachgeschoss: Dachgeschoss;
zusaetzliche_heizquelle: boolean; zusaetzliche_heizquelle: boolean;
warmwasser_enthalten: boolean; warmwasser_enthalten: boolean;
lueftungskonzept: Lueftungskonzept; lueftungskonzept: Lueftungskonzept;
@@ -96,13 +97,13 @@ export interface Ausweis {
volumen: number; volumen: number;
dicht: boolean; dicht: boolean;
fenster_flaeche_1: number; fenster_flaeche_1: number;
fenster_art_1: string; fenster_art_1: number;
fenster_flaeche_2: number; fenster_flaeche_2: number;
fenster_art_2: string; fenster_art_2: number;
dachfenster_flaeche: number; dachfenster_flaeche: number;
dachfenster_art: string; dachfenster_art: number;
haustuer_flaeche: number; haustuer_flaeche: number;
haustuer_art: string; haustuer_art: number;
dach_bauart: string; dach_bauart: string;
dach_daemmung: number; dach_daemmung: number;
decke_bauart: string; decke_bauart: string;

View File

@@ -3,28 +3,10 @@ import { getHeizwertfaktorClient } from "../server/Heizwertfaktor";
import moment from "moment"; import moment from "moment";
import { BitChecker } from "../BitChecker"; import { BitChecker } from "../BitChecker";
import { getHeizungswerte } from "../Heizungswerte"; import { getHeizungswerte } from "../Heizungswerte";
import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types";
import { Ausweis } from "./Ausweis";
export enum AusweisType { export class Bedarfsausweis implements Ausweis {
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 {
public ausweisart: Ausweisart = "VA"; public ausweisart: Ausweisart = "VA";
public id: number = 0; public id: number = 0;
public user_id: number = 0; public user_id: number = 0;
@@ -63,7 +45,7 @@ export class Bedarfsausweis {
public wohnflaeche: number = 0; public wohnflaeche: number = 0;
public keller_beheizt: boolean = false; public keller_beheizt: boolean = false;
public dachgeschoss: string = ""; public dachgeschoss: Dachgeschoss = Dachgeschoss.UNBEHEIZT;
public zusaetzliche_heizquelle: boolean = false; public zusaetzliche_heizquelle: boolean = false;
public warmwasser_enthalten: boolean = false; public warmwasser_enthalten: boolean = false;
public lueftungskonzept: Lueftungskonzept = "Fensterlüftung"; public lueftungskonzept: Lueftungskonzept = "Fensterlüftung";
@@ -182,16 +164,16 @@ export class Bedarfsausweis {
} }
public get end_energie_verbrauch(): number { public get end_energie_verbrauch(): number {
let Uawd = 1 / (1 / this.dach_daemmung / 0.04); let dach_u_wert = 1 / (1 / this.dach_daemmung / 0.04);
let Uawa = 1 / (1 / this.aussenwand_daemmung / 0.04); let aussenwand_u_wert = 1 / (1 / this.aussenwand_daemmung / 0.04);
let Uawb = 1 / (1 / this.boden_daemmung / 0.04); let fussboden_u_wert = 1 / (1 / this.boden_daemmung / 0.04);
let Uawogd =1 / (1 / this.decke_daemmung / 0.04); let decke_u_wert = 1 / (1 / this.decke_daemmung / 0.04);
if (!this.tabellenwerte_aendern) { if (!this.tabellenwerte_aendern) {
this.dach_u_wert = Math.round(Uawd); this.dach_u_wert = Math.round(dach_u_wert);
this.decke_u_wert = Math.round(Uawogd); this.decke_u_wert = Math.round(decke_u_wert);
this.aussenwand_u_wert = Math.round(Uawa); this.aussenwand_u_wert = Math.round(aussenwand_u_wert);
this.fussboden_u_wert = Math.round(Uawb); this.fussboden_u_wert = Math.round(fussboden_u_wert);
} }
if (this.dachgeschoss) { if (this.dachgeschoss) {
@@ -210,26 +192,26 @@ export class Bedarfsausweis {
} }
if (this.keller_beheizt) { if (this.keller_beheizt) {
var keller_beheiztf = 1; var keller_beheizt = 1;
} else { } 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; 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 ( if (
this.objekt_typ === "Doppelhaushälfte" || this.objekt_typ === "Doppelhaushälfte" ||
this.objekt_typ === "Reihenendhaus" this.objekt_typ === "Reihenendhaus"
) { ) {
var Fawa = 0.7; aussenwand_anteil = 0.7;
} else if (this.objekt_typ === "Reihenmittelhaus") { } else if (this.objekt_typ === "Reihenmittelhaus") {
var Fawa = 0.4; aussenwand_anteil = 0.4;
} }
// Außenwand // Außenwand
var awa1 = var aussenwand_flaeche =
((2 * this.masse_a + ((2 * this.masse_a +
2 * this.masse_b + 2 * this.masse_b +
2 * this.masse_d + 2 * this.masse_d +
@@ -244,18 +226,18 @@ export class Bedarfsausweis {
2 * this.masse_e + 2 * this.masse_e +
2 * this.masse_f) * 2 * this.masse_f) *
2.2 * 2.2 *
keller_beheiztf) * keller_beheizt) *
Fawa - aussenwand_anteil -
this.fenster_flaeche_1 - this.fenster_flaeche_1 -
this.fenster_flaeche_2 - this.fenster_flaeche_2 -
this.haustuer_flaeche + this.haustuer_flaeche +
gaubenfl; gaubenflaeche;
if (!this.tabellenwerte_aendern) { 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_a * this.masse_b +
this.masse_c * this.masse_d + this.masse_c * this.masse_d +
(+this.masse_f + +this.masse_c) * this.masse_e) * (+this.masse_f + +this.masse_c) * this.masse_e) *
@@ -263,38 +245,38 @@ export class Bedarfsausweis {
this.dachfenster_flaeche) * this.dachfenster_flaeche) *
dachgeschossf2; dachgeschossf2;
if (!this.tabellenwerte_aendern) { if (!this.tabellenwerte_aendern) {
this.dachflaeche = awd1; this.dachflaeche = Math.round(dachflaeche);
} }
var awogd1 = var deckenflaeche =
(this.masse_a * this.masse_b + (this.masse_a * this.masse_b +
this.masse_c * this.masse_d + this.masse_c * this.masse_d +
(+this.masse_f + +this.masse_c) * this.masse_e - (+this.masse_f + +this.masse_c) * this.masse_e -
this.dachfenster_flaeche) * this.dachfenster_flaeche) *
IOGdeckef; IOGdeckef;
if (!this.tabellenwerte_aendern) { 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_a * this.masse_b +
this.masse_c * this.masse_d + this.masse_c * this.masse_d +
(+this.masse_f + +this.masse_c) * this.masse_e; (+this.masse_f + +this.masse_c) * this.masse_e;
if (!this.tabellenwerte_aendern) { if (!this.tabellenwerte_aendern) {
this.fussboden_flaeche = awb1; this.fussboden_flaeche = Math.round(fussboden_flaeche);
} }
var behgv = var volumen =
awb1 * this.geschosshoehe * this.anzahl_vollgeschosse + fussboden_flaeche * this.geschosshoehe * this.anzahl_vollgeschosse +
awb1 * 2.2 * keller_beheiztf + fussboden_flaeche * 2.2 * keller_beheizt +
awb1 * this.geschosshoehe * dachgeschossf + fussboden_flaeche * this.geschosshoehe * dachgeschossf +
gaubenvol; gaubenvolumen;
if (!this.tabellenwerte_aendern) { if (!this.tabellenwerte_aendern) {
this.volumen = behgv; this.volumen = Math.round(volumen);
} }
if (this.dicht) { if (this.dicht) {
var Hv = 0.163 * behgv; var Hv = 0.163 * volumen;
} else { } else {
var Hv = 0.19 * behgv; var Hv = 0.19 * volumen;
} }
var AHF = var AHF =
@@ -364,21 +346,21 @@ export class Bedarfsausweis {
} }
} }
let hilfsenergiel = 0; let hilfsenergie_lueftung = 0;
let wgewinnel = 0; let waerme_gewinnung_lueftung = 0;
if (this.lueftungskonzept == "Lüftungsanlage mit Wärmerückgewinnung") { if (this.lueftungskonzept == "Lüftungsanlage mit Wärmerückgewinnung") {
hilfsenergiel = 0; hilfsenergie_lueftung = 0;
wgewinnel = 13.5; waerme_gewinnung_lueftung = 13.5;
} }
if (this.lueftungskonzept == "Lüftungsanlage ohne Wärmerückgewinnung") { if (this.lueftungskonzept == "Lüftungsanlage ohne Wärmerückgewinnung") {
if (this.baujahr_gebaeude < 1996) { if (this.baujahr_gebaeude < 1996) {
hilfsenergiel = 4; hilfsenergie_lueftung = 4;
wgewinnel = 3.5; waerme_gewinnung_lueftung = 3.5;
} }
if (this.baujahr_gebaeude > 1996) { if (this.baujahr_gebaeude > 1996) {
hilfsenergiel = 2.6; hilfsenergie_lueftung = 2.6;
wgewinnel = 3.2; waerme_gewinnung_lueftung = 3.2;
} }
} }
@@ -414,12 +396,12 @@ export class Bedarfsausweis {
this.waerme_erzeugung_heizung this.waerme_erzeugung_heizung
); );
var endenergieh = var end_energie_heizung =
(Qh + heizung_zentralwv + verteilunghwv + spheizungwv) * (Qh + heizung_zentralwv + verteilunghwv + spheizungwv) *
werzeugungheaz - werzeugungheaz -
wgewinnel; waerme_gewinnung_lueftung;
var endenergiew = var end_energie_warmwasser =
(12 + (12 +
verteilungwwwv - verteilungwwwv -
verteilungwwhg + verteilungwwhg +
@@ -435,19 +417,19 @@ export class Bedarfsausweis {
warmwasser_speicherunghb + warmwasser_speicherunghb +
werzeugungwwhb + werzeugungwwhb +
Solarsystem_WWhb + Solarsystem_WWhb +
hilfsenergiel; hilfsenergie_lueftung;
var endenergiegesamt = endenergieh + endenergiew + hilfsenergie; var endenergiegesamt = end_energie_heizung + end_energie_warmwasser + hilfsenergie;
var primheizung = var primheizung =
endenergieh * end_energie_heizung *
(1 - this.anteil_zusatzheizung) * (1 - this.anteil_zusatzheizung) *
BRSPrimärenergiefaktor + BRSPrimärenergiefaktor +
endenergieh * this.anteil_zusatzheizung * BRSPrimärenergiefaktor1; end_energie_heizung * this.anteil_zusatzheizung * BRSPrimärenergiefaktor1;
var primaerenergiebedarf = var primaerenergiebedarf =
primheizung + primheizung +
(endenergiew - Solarsystem_WWbw) * BRSPrimärenergiefaktor + (end_energie_warmwasser - Solarsystem_WWbw) * BRSPrimärenergiefaktor +
hilfsenergie * 1.8; hilfsenergie * 1.8;
return endenergiegesamt; return endenergiegesamt;

View File

@@ -2,28 +2,12 @@ import { Moment } from "moment";
import { getKlimafaktorenClient } from "../Klimafaktoren"; import { getKlimafaktorenClient } from "../Klimafaktoren";
import { getHeizwertfaktorClient } from "../server/Heizwertfaktor"; import { getHeizwertfaktorClient } from "../server/Heizwertfaktor";
import moment from "moment"; import moment from "moment";
import fuelList from "~/components/Ausweis/fuelList";
import { BitChecker } from "../BitChecker"; import { BitChecker } from "../BitChecker";
import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types";
export enum AusweisType { import { Ausweis } from "./Ausweis";
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 Verbrauchsausweis implements Ausweis {
export class Verbrauchsausweis {
public ausweisart: Ausweisart = "VA"; public ausweisart: Ausweisart = "VA";
public id: number = 0; public id: number = 0;
public user_id: number = 0; public user_id: number = 0;
@@ -62,7 +46,7 @@ export class Verbrauchsausweis {
public wohnflaeche: number = 0; public wohnflaeche: number = 0;
public keller_beheizt: boolean = false; public keller_beheizt: boolean = false;
public dachgeschoss: string = ""; public dachgeschoss: Dachgeschoss = Dachgeschoss.NICHT_VORHANDEN;
public zusaetzliche_heizquelle: boolean = false; public zusaetzliche_heizquelle: boolean = false;
public warmwasser_enthalten: boolean = false; public warmwasser_enthalten: boolean = false;
public lueftungskonzept: Lueftungskonzept = "Fensterlüftung"; public lueftungskonzept: Lueftungskonzept = "Fensterlüftung";
@@ -70,10 +54,10 @@ export class Verbrauchsausweis {
public leerstand: number = 0; public leerstand: number = 0;
public images: string[] = []; public images: string[] = [];
public versorgungssysteme: boolean[] = BitChecker(0); public versorgungssysteme: ReturnType<typeof BitChecker> = BitChecker(0);
public fenster_dach: boolean[] = BitChecker(0); public fenster_dach: ReturnType<typeof BitChecker> = BitChecker(0);
public energiequelle_2_nutzung: boolean[] = BitChecker(0); public energiequelle_2_nutzung: ReturnType<typeof BitChecker> = BitChecker(0);
public daemmung: boolean[] = BitChecker(0); public daemmung: ReturnType<typeof BitChecker> = BitChecker(0);
public get energetische_nutzfläche(): number { public get energetische_nutzfläche(): number {
return this.wohnflaeche * (this.keller_beheizt ? 1.35 : 1.2); return this.wohnflaeche * (this.keller_beheizt ? 1.35 : 1.2);
}; };
@@ -105,13 +89,13 @@ export class Verbrauchsausweis {
public volumen: number = 0; public volumen: number = 0;
public dicht: boolean = false; public dicht: boolean = false;
public fenster_flaeche_1: number = 0; 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_flaeche_2: number = 0;
public fenster_art_2: string = ""; public fenster_art_2: number = 0;
public dachfenster_flaeche: number = 0; public dachfenster_flaeche: number = 0;
public dachfenster_art: string = ""; public dachfenster_art: number = 0;
public haustuer_flaeche: number = 0; public haustuer_flaeche: number = 0;
public haustuer_art: string = ""; public haustuer_art: number = 0;
public dach_bauart: string = ""; public dach_bauart: string = "";
public dach_daemmung: number = 0; public dach_daemmung: number = 0;
public decke_bauart: string = ""; public decke_bauart: string = "";
@@ -149,6 +133,82 @@ export class Verbrauchsausweis {
public constructor() {} 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 { public static fromBase64(base64: string): Verbrauchsausweis | null {
try { try {
const text = Buffer.from(base64, "base64"); const text = Buffer.from(base64, "base64");

View File

@@ -3,26 +3,11 @@ import { getKlimafaktorenClient } from "../Klimafaktoren";
import { getHeizwertfaktorClient } from "../server/Heizwertfaktor"; import { getHeizwertfaktorClient } from "../server/Heizwertfaktor";
import moment from "moment"; import moment from "moment";
import { BitChecker } from "../BitChecker"; import { BitChecker } from "../BitChecker";
import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types";
export enum AusweisType { import { Ausweis } from "./Ausweis";
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 VerbrauchsausweisGewerbe implements Ausweis {
export class VerbrauchsausweisGewerbe {
public ausweisart: Ausweisart = "VA"; public ausweisart: Ausweisart = "VA";
public id: number = 0; public id: number = 0;
public user_id: number = 0; public user_id: number = 0;
@@ -61,7 +46,7 @@ export class VerbrauchsausweisGewerbe {
public wohnflaeche: number = 0; public wohnflaeche: number = 0;
public keller_beheizt: boolean = false; public keller_beheizt: boolean = false;
public dachgeschoss: string = ""; public dachgeschoss: number = Dachgeschoss.UNBEHEIZT;
public zusaetzliche_heizquelle: boolean = false; public zusaetzliche_heizquelle: boolean = false;
public warmwasser_enthalten: boolean = false; public warmwasser_enthalten: boolean = false;
public lueftungskonzept: Lueftungskonzept = "Fensterlüftung"; public lueftungskonzept: Lueftungskonzept = "Fensterlüftung";
@@ -104,13 +89,13 @@ export class VerbrauchsausweisGewerbe {
public volumen: number = 0; public volumen: number = 0;
public dicht: boolean = false; public dicht: boolean = false;
public fenster_flaeche_1: number = 0; 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_flaeche_2: number = 0;
public fenster_art_2: string = ""; public fenster_art_2: number = 0;
public dachfenster_flaeche: number = 0; public dachfenster_flaeche: number = 0;
public dachfenster_art: string = ""; public dachfenster_art: number = 0;
public haustuer_flaeche: number = 0; public haustuer_flaeche: number = 0;
public haustuer_art: string = ""; public haustuer_art: number = 0;
public dach_bauart: string = ""; public dach_bauart: string = "";
public dach_daemmung: number = 0; public dach_daemmung: number = 0;
public decke_bauart: string = ""; public decke_bauart: string = "";

25
src/lib/Ausweis/types.ts Normal file
View File

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

View File

@@ -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) => { const target: boolean[] = new Array(length).fill(false).map((x, i) => {
return (initial & (1 << i)) !== 0 ? true : false 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) { set(target, property, value) {
return Reflect.set(target, property, value); return Reflect.set(target, property, value);
} }
}) }) as (boolean[] & { value: number })
} }

View File

@@ -710,12 +710,12 @@ export function getHeizungswerte(
let result = fuelList.find( let result = fuelList.find(
(value) => (value) =>
value.energietraeger == energietraeger && value.einheit == "kWh" value[0] == energietraeger && value[1] == "kWh"
); );
let coe = 0; let coe = 0;
if (result) { if (result) {
coe = result.coe coe = result[4]
} }
return [ return [

View File

@@ -8,8 +8,14 @@ export const getHeizwertfaktorClient = function(energietraeger: string, einheit:
primärenergiefaktor: number primärenergiefaktor: number
} { } {
for (const fuel of fuelList) { for (const fuel of fuelList) {
if (fuel.energietraeger == energietraeger && fuel.einheit == einheit) { if (fuel[0] == energietraeger && fuel[1] == einheit) {
return fuel; return {
coe: fuel[4],
energietraeger: fuel[0],
einheit: fuel[1],
umrechnungsfaktor: fuel[2],
primärenergiefaktor: fuel[3]
};
} }
} }

View File

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

View File

@@ -1,16 +1,122 @@
import type { APIRoute } from "astro"; 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. * Erstellt einen Verbrauchsausweis anhand der gegebenen Daten und trägt ihn in die Datenbank ein.
* @param param0 * @param param0
* @returns * @returns
*/ */
export const post: APIRoute = async ({ request }) => { export const post: APIRoute = async ({ request }) => {
const body = await request.json(); const body = await request.json();
const validation = AusweisUploadChecker.safeParse(body);
if (!validation.success) {
return error(validation.error.issues);
}
return success({}); 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
});
};

44
src/pages/api/image.ts Normal file
View File

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

View File

@@ -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")
}
---
<PDFLayout title="Datenblatt">
<div class="flex flex-col gap-20">
<div class="flex flex-col gap-4">
<DatenblattHeader></DatenblattHeader>
<div class="px-12 py-20 flex flex-col gap-2">
<div class="flex flex-row justify-between items-center">
<h2>Datenblatt Energieausweis</h2>
<h2>Ausweis ID: </h2>
</div>
<h3>Gebäudedaten:</h3>
<p>Adresse: {ausweis.objekt_strasse}, {ausweis.objekt_plz} {ausweis.objekt_ort}</p>
<div class="flex justify-between">
<Checkbox checked={ausweis.ausstellgrund == "Neubau"}>Neubau</Checkbox>
<Checkbox checked={ausweis.ausstellgrund == "Vermietung" || ausweis.ausstellgrund == "Verkauf"}>Vermietung/Verkauf</Checkbox>
<Checkbox checked={ausweis.ausstellgrund == "Modernisierung"}>Modernisierung</Checkbox>
<Checkbox checked={ausweis.ausstellgrund == "Sonstiges"}>Sonstiges</Checkbox>
</div>
<div class="flex justify-between gap-4">
<table>
<tbody><tr>
<td>Baujahr Gebäude:</td>
<td>{ausweis.baujahr_gebaeude}</td>
</tr>
<tr>
<td>Baujahr Heizung:</td>
<td>{ausweis.baujahr_anlage}</td>
</tr>
<tr>
<td>Wohnfläche:</td>
<td>{ausweis.wohnflaeche}</td>
</tr>
<tr>
<td>Lüftungskonzept:</td>
<td>{ausweis.lueftungskonzept}</td>
</tr>
<tr>
<td>Gebäudetyp:</td>
<td>{ausweis.objekt_typ}</td>
</tr></tbody>
</table>
<table>
<tbody><tr>
<td>Dachgeschoss:</td>
<td>{ausweis.dachgeschoss == Dachgeschoss.BEHEIZT ? "Beheizt" : (ausweis.dachgeschoss == Dachgeschoss.UNBEHEIZT ? "Unbeheizt" : "Nicht Vorhanden")}</td>
</tr>
<tr>
<td>Beheizter Keller:</td>
<td>{ausweis.keller_beheizt ? "Ja" : "Nein"}</td>
</tr>
<tr>
<td>Wohnungen:</td>
<td>{ausweis.anzahl_einheiten}</td>
</tr>
<tr>
<td>Anlage zur Kühlung:</td>
<td>{ausweis.wird_gekuehlt ? "Ja" : "Nein"}</td>
</tr>
<tr>
<td>Leerstand:</td>
<td>{ausweis.leerstand}%</td>
</tr></tbody>
</table>
</div>
<div class="flex flex-row gap-8">
<div class="flex flex-col">
<h2>Heizverbrauch</h2>
<div class="flex flex-row justify-between gap-4">
<p>Von: {moment(ausweis.energieverbrauch_zeitraum).format("MM.YYYY")}</p>
<p>Bis: {moment(ausweis.energieverbrauch_zeitraum).add("1", "year").format("MM.YYYY")}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>Von: {moment(ausweis.energieverbrauch_zeitraum).add("1", "year").format("MM.YYYY")}</p>
<p>Bis: {moment(ausweis.energieverbrauch_zeitraum).add("2", "years").format("MM.YYYY")}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>Von: {moment(ausweis.energieverbrauch_zeitraum).add("2", "years").format("MM.YYYY")}</p>
<p>Bis: {moment(ausweis.energieverbrauch_zeitraum).add("3", "years").format("MM.YYYY")}</p>
</div>
</div>
<div class="flex flex-col">
<h2>{ausweis.energietraeger_1}</h2>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.energieverbrauch_1_heizquelle_1}</p>
<p>{ausweis.energietraeger_einheit_heizquelle_1}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.energieverbrauch_2_heizquelle_1}</p>
<p>{ausweis.energietraeger_einheit_heizquelle_1}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.energieverbrauch_3_heizquelle_1}</p>
<p>{ausweis.energietraeger_einheit_heizquelle_1}</p>
</div>
</div>
</div>
<div class="flex flex-row gap-8">
<div class="flex flex-col">
<h2>Heizverbrauch (Heizwert)</h2>
<div class="flex flex-row justify-between gap-4">
<p>Von: {moment(ausweis.energieverbrauch_zeitraum).format("MM.YYYY")}</p>
<p>Bis: {moment(ausweis.energieverbrauch_zeitraum).add("1", "year").format("MM.YYYY")}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>Von: {moment(ausweis.energieverbrauch_zeitraum).add("1", "year").format("MM.YYYY")}</p>
<p>Bis: {moment(ausweis.energieverbrauch_zeitraum).add("2", "years").format("MM.YYYY")}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>Von: {moment(ausweis.energieverbrauch_zeitraum).add("2", "years").format("MM.YYYY")}</p>
<p>Bis: {moment(ausweis.energieverbrauch_zeitraum).add("3", "years").format("MM.YYYY")}</p>
</div>
</div>
<div class="flex flex-col">
<h2>{ausweis.energietraeger_1}</h2>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.energieverbrauch_1_heizquelle_1}</p>
<p>{ausweis.energietraeger_einheit_heizquelle_1}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.energieverbrauch_2_heizquelle_1}</p>
<p>{ausweis.energietraeger_einheit_heizquelle_1}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.energieverbrauch_3_heizquelle_1}</p>
<p>{ausweis.energietraeger_einheit_heizquelle_1}</p>
</div>
</div>
</div>
<p>Warmwasser enthalten: {ausweis.warmwasser_enthalten ? "Ja" : "Nein"}</p>
</div>
<DatenblattFooter></DatenblattFooter>
</div>
<div class="flex flex-col gap-4">
<DatenblattHeader></DatenblattHeader>
<div class="px-12 py-20 flex flex-col gap-2">
<h2>Modernisierungsstand</h2>
<h3>Heizungsanlage</h3>
<div class="grid grid-cols-3">
<Checkbox checked={ausweis.versorgungssysteme[0]}>Zentral/Etage</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[1]}>Einzelöfen</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[2]}>Durchlauferhitzer</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[3]}>Standardkessel</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[4]}>Solarsystem für Warmwasser</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[5]}>Wärmepumpe</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[6]}>Niedertemperaturkessel</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[7]}>Brennwertkessel/Therme</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[8]}>Warmwasserrohre gedämmt</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[9]}>Heizungsrohre gedämmt</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[10]}>Zirkulation</Checkbox>
<Checkbox checked={ausweis.versorgungssysteme[11]}>Raumtemperraturregler</Checkbox>
</div>
<h3>Fenster/Dachfenster/Türen</h3>
<div class="grid grid-cols-3">
<Checkbox checked={ausweis.fenster_dach[0]}>Einfachglas</Checkbox>
<Checkbox checked={ausweis.fenster_dach[1]}>Doppelverglasung</Checkbox>
<Checkbox checked={ausweis.fenster_dach[2]}>Isolierverglasung</Checkbox>
<Checkbox checked={ausweis.fenster_dach[3]}>Dreifachverglasung</Checkbox>
<Checkbox checked={ausweis.fenster_dach[4]}>Alle Fenster dicht</Checkbox>
<Checkbox checked={ausweis.fenster_dach[5]}>Fenster teilweise undicht</Checkbox>
<Checkbox checked={ausweis.fenster_dach[6]}>Alle Türen dicht</Checkbox>
<Checkbox checked={ausweis.fenster_dach[7]}>Türen teilweise undicht</Checkbox>
<Checkbox checked={ausweis.fenster_dach[8]}>Rolladenkästen gedämmt</Checkbox>
</div>
<h3>Wärmedämmung</h3>
<div class="grid grid-cols-2">
<Checkbox checked={ausweis.daemmung[0]}>Außenwand gedämmt</Checkbox>
<Checkbox checked={ausweis.daemmung[1]}>Kelleraußenwand gedämmt</Checkbox>
<Checkbox checked={ausweis.daemmung[2]}>Kellerdecke gedämmt</Checkbox>
<Checkbox checked={ausweis.daemmung[3]}>Dachgeschoss gedämmt</Checkbox>
<Checkbox checked={ausweis.daemmung[4]}>Oberste Geschossdecke gedämmt</Checkbox>
<Checkbox checked={ausweis.daemmung[5]}>Oberste Geschossdecke min. 12cm gedämmt</Checkbox>
</div>
<Checkbox checked={true}>Die Angaben sind richtig und entsprechen dem aktuellen Stand.</Checkbox>
<Checkbox checked={true}>Ich habe die AGB gelesen und akzeptiert.</Checkbox>
<p>Die Angaben auf diesem Datenblatt wurden uns übermittelt und werden zur Berechnung und
Ausstellung des Ausweises herangezogen.</p>
</div>
<DatenblattFooter></DatenblattFooter>
</div>
</div>
</PDFLayout>
<style is:global>
table {
@apply w-full h-full;
}
td > table td {
@apply px-0 py-0 border-t-0 border-b-0;
}
td:has(table) {
@apply p-0;
}
td > table td:first-child {
@apply border-l-0;
}
td > table td:last-child {
@apply border-r-0;
}
td {
@apply border border-black px-1 text-xs py-0.5;
}
td:not(:first-child) {
@apply bg-white;
}
h2 {
@apply font-bold text-sm;
}
p,
label {
@apply text-xs;
}
.box {
@apply border-4 border-pdf-yellow-bright bg-pdf-yellow-light rounded-lg;
}
.box > * {
@apply px-1 py-0.5;
}
</style>