Verbrauchsausweis Basisfunktionalität

This commit is contained in:
Moritz Utcke
2023-04-04 11:23:36 +04:00
parent 3a1464dc44
commit f164d4c1e2
28 changed files with 1728 additions and 1310 deletions

View File

@@ -0,0 +1,823 @@
<script lang="ts">
import PerformanceScore from "~/components/Ausweis/PerformanceScore.svelte";
import ProgressBar from "~/components/Ausweis/Progressbar.svelte";
import Hilfe from "~/components/Ausweis/Hilfe.svelte";
import HelpLabel from "~/components/HelpLabel.svelte";
import Verbrauch from "~/components/Ausweis/Verbrauch.svelte";
import Label from "~/components/Label.svelte";
import Ausweisart from "~/components/Ausweis/Ausweisart.svelte";
import HeizungImage from "~/components/Ausweis/HeizungImage.svelte";
import FensterImage from "~/components/Ausweis/FensterImage.svelte";
import DaemmungImage from "~/components/Ausweis/DaemmungImage.svelte";
import AusweisPreviewContainer from "~/components/Ausweis/AusweisPreviewContainer.svelte";
import { calculateEnergyPerformanceScore } from "./energyPerformanceCalculation";
let additionalHeating: boolean = false;
let heatedWaterIncluded: boolean = false;
let heatedWaterPortion: number = 18;
let hasCellar: boolean = false;
let conversionFactor: number = 0;
let calorificValueFactor: number = 0;
let energyConsumption = [0, 0, 0];
let additionalEnergyConsumption = [0, 0, 0];
let climateFactors = [0, 0, 0];
let area = 0;
let energyPerformance = 0;
$: {
energyPerformance = calculateEnergyPerformanceScore(energyConsumption, additionalEnergyConsumption, heatedWaterPortion, climateFactors, area * (hasCellar ? 1.35 : 1.2), conversionFactor, calorificValueFactor);
console.log(energyPerformance)
}
let constructionYear: number;
let apartmentCount: number;
let certificateReason: "Vermietung" | "Neubau" | "Verkauf" | "Modernisierung" | "Sonstiges";
let sanitationStatus: boolean;
let needsRequirementCertificate: boolean = false;
$: needsRequirementCertificate = (
(constructionYear < 1978 &&
apartmentCount <= 4 &&
sanitationStatus == false &&
(certificateReason == "Vermietung" || certificateReason == "Sonstiges")) ||
certificateReason == "Neubau" ||
certificateReason == "Modernisierung" ||
certificateReason == "Verkauf"
)
</script>
<div class="flex flex-row gap-8 items-center mb-8">
<div class="flex flex-col w-full">
<h1>Verbrauchsausweis erstellen - 45€</h1>
<ProgressBar progress={0} />
</div>
<PerformanceScore performance={energyPerformance} />
</div>
<form method="post" action="/verbrauchsausweis/erstellen">
<fieldset
class="bg-[rgba(252,234,187,0.2)] border-2 p-4 rounded-lg border-[#ffcc03]"
>
<div class="flex flex-row justify-between">
<a class="button" href="/speichern">Später Weitermachen</a>
<Hilfe />
</div>
<hr />
<div class="form-group col-md-12">
<Label>A - Prüfung der Ausweisart</Label>
</div>
<Ausweisart bind:constructionYear bind:apartmentCount bind:certificateReason bind:sanitationStatus />
<div class="flex flex-col p-4" class:hidden={!needsRequirementCertificate}>
<div class="form-group col-md-9">
<HelpLabel
title="Sie benötigen einen Bedarfsausweis. Bitte führen Sie hier Ihre Eingabe für den Bedarfsausweis fort und klicken auf den Button:"
>
Der Bedarfsausweis ist die etwas umfangreichere Berechnung.
Sie benötigen z.B. Länge, Breite und Geschoßhöhe des
Gebäudes. Auch müssen genauere Angaben zur Anlagentechnik
gemacht werden.
</HelpLabel>
</div>
<div class="form-group col-md-3">
<a class="button" href="/bedarfsausweis">Bedarfsausweis erstellen</a>
</div>
</div>
<hr />
<div class="form-group col-md-12">
<Label
>B - Eingabe der Gebäudeadresse - Angaben zu Wohnfläche,
Kellerund Dachgeschoss</Label
>
</div>
<div class="col-md-12">
<div class="GRB">
<!-- Strasse -->
<div class="form-group col-md-4">
<HelpLabel title="Straße, Hausnummer *">
Bitte geben Sie hier die Straße und Hausnummer des
Gebäudes ein.
</HelpLabel>
<div>
<input
name="IGstrasse"
class="input-md strasse"
type="text"
autocomplete="off"
required
data-msg-minlength="min. 5 Zeichen"
data-msg-maxlength="max. 40 Zeichen"
/>
</div>
</div>
<!-- PLZ -->
<div class="form-group col-md-4 PLZ">
<HelpLabel title="PLZ *">
Bitte geben Sie hier die PLZ des Gebäudes ein.
</HelpLabel>
<div>
<input
name="IGplz"
class="input-md klima CHECK"
type="text"
required
autocomplete="off"
maxlength="5"
/>
<div />
</div>
</div>
<!-- IGort: readonly entfernt - Nelson -->
<div class="form-group col-md-4">
<HelpLabel title="Ort *">
Ort des Gebäudes wird automatisch ermittelt.
</HelpLabel>
<div>
<input
name="IGort"
class="input-md buchstaben"
type="text"
/>
</div>
</div>
<!-- Wohnfläche -->
<div class="form-group col-md-4">
<HelpLabel title="Wohnfläche m² *">
Bitte geben Sie hier die beheizte Wohnfläche in m² ein.
Dabei handelt es sich um die Wohnfläche abzüglich
vorhandener Flächen die sich außerhalb des Gebäudes
befinden. (Balkone, Terassen,etc.).
</HelpLabel>
<div>
<input
name="IGflaeche"
maxlength="4"
class="input-md zahlen CHECK"
required
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={area}
/>
</div>
</div>
<!-- Keller -->
<div class="form-group col-md-4">
<Label>Keller *</Label>
<div>
<select name="IGkeller" class="CHECK" required bind:value={hasCellar}>
<option>Bitte auswählen</option>
<option value={false}>nicht vorhanden</option>
<option value={false}>unbeheizt</option>
<option value={true}>beheizt</option>
</select>
</div>
</div>
<!-- Dachgeschoss -->
<div class="form-group col-md-4">
<Label>Dachgeschoss *</Label>
<div>
<select name="IGdach" class="form-control" required>
<option>Bitte auswählen</option>
<option value="dnein">nicht vorhanden</option>
<option value="dub">unbeheizt</option>
<option value="dbh">beheizt</option>
</select>
</div>
</div>
</div>
</div>
<hr />
<div class="form-group col-md-12">
<Label>C - Eingabe von 3 zusammenhängenden Verbrauchsjahren</Label>
</div>
<div class="GRB">
<Verbrauch bind:additionalHeating bind:energyConsumption bind:additionalEnergyConsumption bind:climateFactors bind:conversionFactor bind:calorificValueFactor />
</div>
<hr />
<div class="form-group col-md-12">
<Label
>D - Eingabe Warmwasseranteil und Verwendung von alternativen
Energieversorgungssystemen</Label
>
</div>
<div class="GRB">
<!-- Anteil WW enthalten -->
<div class="flex flex-col">
<div class="flex flex-row gap-6">
<label class="radio-inline"
><input
type="checkbox"
class="IGwwbool"
name="IGwwbool"
bind:checked={heatedWaterIncluded}
/>Warmwasser im Verbrauch enthalten</label
>
</div>
</div>
<!-- Warmwasser Antel -->
<div class="form-group col-md-2">
<HelpLabel title="% Anteil Warmwasser">
Wenn bekannt geben Sie den Anteil der Warmwasser-Versorgung
hier ein. Standardmäßig wird ein Anteil von 18% angenommen.
</HelpLabel>
<input
name="IGwarmwasser"
maxlength="2"
class="input-md zahlen CHECK"
type="text"
bind:value={heatedWaterPortion}
disabled={!heatedWaterIncluded}
autocomplete="off"
/>
</div>
<div class="form-group col-md-2">
<HelpLabel title="zusätzliche Heizquelle">
Wenn bekannt geben Sie den Anteil der Warmwasser-Versorgung
von der zusätzlichen Heizquelle hier ein. Standardmäßig wird
ein Anteil von 18% angenommen.
</HelpLabel>
<input
name="IGwarmwasser2"
maxlength="3"
class="input-md zahlen"
type="text"
autocomplete="off"
disabled={!additionalHeating}
/>
</div>
<!-- Alternative Energieversorgungssyteme -->
<div class="form-group col-md-5">
<HelpLabel
title="Alternative Energieversorgungssysteme genutzt für "
>
Bitte setzen Sie den Haken falls nachhaltige CO2-Effiziente
Heizungssysteme vorhanden sind. Das wäre beispielsweise bei
Pelletofen, Wärmepumpe, BHKW, Solarsystem, etc. der Fall.
</HelpLabel>
<div class="flex flex-row gap-4">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGversorgungssysteme1"
value="Heizung"
/>Heizung</label
>
<label class="checkbox-inline"
><input
type="checkbox"
name="IGversorgungssysteme2"
value="Warmwasser"
/>Warmwasser</label
>
<label class="checkbox-inline"
><input
type="checkbox"
name="IGversorgungssysteme3"
value="Lüftung"
/>Lüftung</label
>
<label class="checkbox-inline"
><input
type="checkbox"
name="IGversorgungssysteme4"
value="Kühlung"
/>Kühlung</label
>
</div>
</div>
</div>
<hr />
<div class="form-group col-md-12">
<Label
>E - Eingabe von Gebäudetyp, Gebäudeteil, Lüftung, Kühlung und
Leerstand</Label
>
</div>
<div class="GRB">
<!-- Gebäudetyp -->
<div class="form-group col-md-3">
<HelpLabel title="Gebäudetyp *">
Bitte wählen Sie hier den Gebäudetyp aus.
</HelpLabel>
<div>
<select
name="IGtyp"
class="form-control"
required
autocomplete="off"
>
<option>Bitte auswählen</option>
<option value="Einfamilienhaus">Einfamilienhaus</option>
<option value="Freistehendes Einfamilienhaus"
>Freistehendes Einfamilienhaus</option
>
<option value="Freistehendes Zweifamilienhaus"
>Freistehendes Zweifamilienhaus</option
>
<option value="Doppelhaushälfte"
>Doppelhaushälfte</option
>
<option value="Reihenendhaus">Reihenendhaus</option>
<option value="Reihenmittelhaus"
>Reihenmittelhaus</option
>
<option value="Mehrfamilienhaus"
>Mehrfamilienhaus</option
>
<option value="Wohn- und Geschäftshaus"
>Wohn- und Geschäftshaus</option
>
<option value="Atrium-Bungalow">Atrium-Bungalow</option>
<option value="Winkelbungalow">Winkelbungalow</option>
</select>
</div>
</div>
<!-- Gebäudeteil -->
<div class="form-group col-md-3">
<HelpLabel title="Gebäudeteil *">
Bitte geben Sie hier den Gebäudeteil ein. In den meisten
Fällen handelt es sich um das Gesamtgebäude. Sollte es sich
allerdings um ein Gebäude mit mehr als 10% Gewerbeanteil
handeln, so sollten 2 Ausweise erstellt werden. In diesem
Fall wählen Sie Gebäudeteil 'Wohnen' bzw. Gebäudeteil
'Gewerbe'.
</HelpLabel>
<div>
<select
name="IGteil"
class="form-control"
required
autocomplete="off"
>
<option>Bitte auswählen</option>
<option value="Gesamtgebäude">Gesamtgebäude</option>
<option value="Wohnen">Wohnen</option>
</select>
</div>
</div>
<!-- Lüftung -->
<div class="form-group col-md-2">
<HelpLabel title="Lüftung durch *">
Bitte geben Sie hier ein ob über die Fenster natürlich
belüftet wird oder über eine Lüftungsanlage.
</HelpLabel>
<div>
<select
name="IGlueftung"
class="form-control"
required
autocomplete="off"
>
<option>Bitte auswählen</option>
<option value="Fensterlüftung">Fensterlüftung</option>
<option value="Schachtlüftung">Schachtlüftung</option>
<option value="Lüftungsanlage ohne Wärmerückgewinnung"
>Lüftungsanlage ohne Wärmerückgewinnung</option
>
<option value="Lüftungsanlage mit Wärmerückgewinnung"
>Lüftungsanlage mit Wärmerückgewinnung</option
>
</select>
</div>
</div>
<!-- Lüftung -->
<div class="form-group col-md-2">
<HelpLabel title="Anlage Kühlung *">
Bitte geben Sie an ob das Gebäude im Sommer zusätzlich
gekühlt wird.
</HelpLabel>
<div>
<select
name="IGkuehlung"
class="form-control"
required
autocomplete="off"
>
<option>Bitte auswählen</option>
<option value="1">vorhanden</option>
<option value="0">nicht vorhanden</option>
</select>
</div>
</div>
<!-- Leerstand -->
<div class="form-group col-md-2">
<HelpLabel title="Leerstand in %">
Bitte geben Sie hier den Leerstand in % des Gesamtzeitraumes
(3 Jahre) ein. Zum Beispiel 4 Monate Leerstand in 36 Monaten
wären dann ca. 11%.
</HelpLabel>
<div>
<input
name="IGleer"
maxlength="2"
class="input-md zahlen"
type="text"
autocomplete="off"
/>
</div>
</div>
</div>
<hr />
<div class="form-group col-md-12">
<Label
>F - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
Gebäudes</Label
>
</div>
<div class="GRB3">
<HelpLabel title="Heizungsanlage (bitte zutreffendes ankreuzen) *">
Wir benötigen diese Angaben um den allgemeinen
Modernisierungsstand einschätzen zu können. Bitte setzen Sie den
Haken wenn zutreffend. Das seit Mai 2021 gültige GEG erfordert
eine genauere Prüfung anhand von Fotos. Bitte laden Sie ein oder
mehrere Fotos der Heizungsanlage bzw. des Heizungsraums hoch.
</HelpLabel>
<hr />
<div class="grid grid-cols-4">
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage1"
value="ZH"
/>Zentral/Etage</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage2"
value="EO"
/>Einzelöfen</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage3"
value="DH"
/>Durchlauferhitzer</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage4"
value="SK"
/>Standardkessel</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage5"
value="SSWW"
/>Solarsystem für Warmwasser</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage6"
value="WP"
/>Wärmepumpe</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage7"
value="NK"
/>Niedertemperaturkessel</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage8"
value="BWK"
/>Brennwertkessel</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage9"
value="WRGD"
/>Warmwasserrohre gedämmt</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage10"
value="HRGD"
/>Heizungsrohre gedämmt</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage11"
value="ZK"
/>Zirkulation</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGheizungsanlage12"
value="RTR"
/>Raumtemperaturregler</label
>
</div>
</div>
</div>
<hr />
<HeizungImage />
<hr />
<div class="GRB3">
<HelpLabel
title="Fenster/Dachfenster/Türen (bitte zutreffendes ankreuzen):*"
>
Wir benötigen diese Angaben um den allgemeinen
Modernisierungsstand einschätzen zu können. Bitte setzen Sie den
Haken wenn zutreffend.
</HelpLabel>
<hr />
<div class="grid grid-cols-4">
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach1"
value="EG"
/>Einfachglas</label
>
</div>
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach2"
value="DF"
/>Doppelverglasung</label
>
</div>
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach3"
value="IVG"
/>Isolierverglasung</label
>
</div>
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach4"
value="PHF"
/>Dreifachverglasung</label
>
</div>
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach5"
value="FD"
/>Alle Fenster dicht</label
>
</div>
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach6"
value="FTUD"
/>Fenster teilweise undicht</label
>
</div>
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach7"
value="TD"
/>Alle Türen dicht</label
>
</div>
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach8"
value="TUD"
/>Türen teilweise undicht</label
>
</div>
<div class="form-group col-md-3">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGfensterdach9"
value="RKD"
/>Rollladenkästen gedämmt, luftdicht</label
>
</div>
</div>
</div>
<hr />
<FensterImage />
<hr />
<div class="GRB3">
<div class="form-group col-md-12">
<HelpLabel
title="Wärmedämmung (bitte zutreffendes ankreuzen) *"
>
Wir benötigen diese Angaben um den allgemeinen
Modernisierungsstand einschätzen zu können. Bitte setzen Sie
den Haken wenn zutreffend. Das seit Mai 2021 gültige GEG
erfordert eine genauere Prüfung anhand von Fotos. Bitte
laden Sie ein oder mehrere Fotos der Außenwand und des
Dachbereiches hoch.
</HelpLabel>
<hr />
</div>
<div class="grid grid-cols-4">
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGwaermedaemmung1"
value="AWD"
/>Außenwand gedämmt</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGwaermedaemmung2"
value="KWD"
/>Kelleraußenwand gedämmt</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGwaermedaemmung3"
value="KDD"
/>Kellerdecke gedämmt</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGwaermedaemmung4"
value="DGD"
/>Dachgeschoss gedämmt</label
>
</div>
<div class="form-group col-md-3 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGwaermedaemmung5"
value="OGDDW"
/>Oberste Geschossdecke gedämmt</label
>
</div>
<div class="form-group col-md-6 mw1">
<label class="checkbox-inline"
><input
type="checkbox"
name="IGwaermedaemmung6"
value="OGDD"
/>Oberste Geschossdecke min. 12cm gedämmt</label
>
</div>
</div>
</div>
<hr />
<DaemmungImage />
<hr />
<div class="form-group col-md-12">
<Label
>G - Hier können Sie ein Gebäudebild hochladen und sich Ihren
Energieausweis als PDF anschauen</Label
>
</div>
<AusweisPreviewContainer />
<div class="flex flex-row justify-between">
<Hilfe />
<button formnovalidate>Weiter</button>
</div>
</fieldset>
</form>
<style is:global>
:global(.GRB) {
@apply border-2 border-[#ffcc03] p-4 flex flex-row rounded-lg justify-between w-full;
background: linear-gradient(
135deg,
rgba(252, 234, 187, 1) 0%,
rgba(253, 235, 189, 1) 52%,
rgba(251, 223, 147, 1) 100%
);
}
:global(.GRB3) {
@apply flex flex-col border-2 border-[#ffcc03] p-4 rounded-lg;
background: linear-gradient(
135deg,
rgba(252, 234, 187, 1) 0%,
rgba(253, 235, 189, 1) 52%,
rgba(251, 223, 147, 1) 100%
);
}
:global(.headline) {
@apply text-lg;
}
:global(.radio-inline) {
@apply flex flex-row gap-2;
}
:global(.checkbox-inline) {
@apply flex flex-row gap-2;
}
:global(input[type="checkbox"]) {
width: auto;
}
</style>

View File

@@ -0,0 +1,39 @@
/**
*
* @param energyConsumption Ein Array aus allen Verbräuchen der drei Verbrauchsjahre für die primäre Energiequelle
* @param additionalEnergyConsumption Ein Array aus allen Verbräuchen der drei Verbrauchsjahre für die sekundäre Energiequelle
* @param waterHeatingPortion Der Anteil den Warmwasser am Energieverbrauch ausgemacht hat
* @param climateFactors Ein Array aus drei Klimafaktoren für die Verbrauchsjahre
* @param area Die Nutzfläche des Gebäudes
* @param conversionFactor Der Umrechnungsfaktor des Energieträgers
* @param calorificValueFactor Der Heizwertfaktor des Energieträgers
* @returns Den Performance Wert den das Gebäude erzielt hat.
*/
export function calculateEnergyPerformanceScore(
energyConsumption: number[],
additionalEnergyConsumption: number[],
waterHeatingPortion: number,
climateFactors: number[],
area: number,
conversionFactor: number,
calorificValueFactor: number
): number {
// Alle Werte müssen in kWh umgerechnet werden.
let energyConsumptionKWh = energyConsumption.map((x) => convertEnergyConsumptionToKWh(x, conversionFactor, calorificValueFactor))
let additionalEnergyConsumptionKWh = additionalEnergyConsumption.map((x) => convertEnergyConsumptionToKWh(x, conversionFactor, calorificValueFactor))
let heatingPortion = 1 - (waterHeatingPortion / 100);
return (heatingPortion * (energyConsumptionKWh[0] + additionalEnergyConsumptionKWh[0]) * climateFactors[0] +
(waterHeatingPortion / 100) * (energyConsumptionKWh[0] + additionalEnergyConsumptionKWh[0]) +
heatingPortion * (energyConsumptionKWh[1] + additionalEnergyConsumptionKWh[1]) * climateFactors[1] +
(waterHeatingPortion / 100) * (energyConsumptionKWh[1] + additionalEnergyConsumptionKWh[1]) +
heatingPortion * (energyConsumptionKWh[2] + additionalEnergyConsumptionKWh[2]) * climateFactors[2] +
(waterHeatingPortion / 100) * (energyConsumptionKWh[2] + additionalEnergyConsumptionKWh[2])) /
3 /
area;
}
function convertEnergyConsumptionToKWh(consumption: number, conversionFactor: number, calorificValueFactor: number): number {
return (consumption * conversionFactor) / calorificValueFactor;
}

View File

@@ -0,0 +1 @@
export { default as VerbrauchsausweisContent } from "./VerbrauchsausweisContent.svelte"