Verbrauchsausweis Klasse

This commit is contained in:
Moritz Utcke
2023-04-29 19:41:33 +04:00
parent a3be210160
commit bc3878e645
4 changed files with 310 additions and 48 deletions

View File

@@ -12,11 +12,10 @@
import AusweisPreviewContainer from "~/components/Ausweis/AusweisPreviewContainer.svelte"; import AusweisPreviewContainer from "~/components/Ausweis/AusweisPreviewContainer.svelte";
import { calculateEnergyPerformanceScore } from "./energyPerformanceCalculation"; import { calculateEnergyPerformanceScore } from "./energyPerformanceCalculation";
import ZipSearch from "../ZIPSearch.svelte"; import ZipSearch from "../ZIPSearch.svelte";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
const ausweis = new Verbrauchsausweis();
let additionalHeating: boolean = false;
let heatedWaterIncluded: boolean = false;
let heatedWaterPortion: number = 18;
let hasCellar: boolean = false;
let conversionFactor: number = 0; let conversionFactor: number = 0;
let calorificValueFactor: number = 0; let calorificValueFactor: number = 0;
@@ -26,55 +25,42 @@
let area = 0; let area = 0;
let energyPerformance = 0; let energyPerformance = 0;
let zip: string = "";
let city: string = "";
$: { $: {
energyPerformance = calculateEnergyPerformanceScore( energyPerformance = calculateEnergyPerformanceScore(
energyConsumption, energyConsumption,
additionalEnergyConsumption, additionalEnergyConsumption,
heatedWaterPortion, ausweis.anteil_warmwasser_1,
climateFactors, climateFactors,
area * (hasCellar ? 1.35 : 1.2), area * (ausweis.keller_beheizt ? 1.35 : 1.2),
conversionFactor, conversionFactor,
calorificValueFactor calorificValueFactor
); );
} }
let baujahrGebaeude: number;
let baujahrHeizungsAnlage: number;
let apartmentCount: number;
let certificateReason:
| "Vermietung"
| "Neubau"
| "Verkauf"
| "Modernisierung"
| "Sonstiges";
let sanitationStatus: boolean;
let needsRequirementCertificate: boolean = false; let needsRequirementCertificate: boolean = false;
$: needsRequirementCertificate = $: needsRequirementCertificate =
(baujahrGebaeude < 1978 && (ausweis.baujahr_gebaeude < 1978 &&
apartmentCount <= 4 && ausweis.anzahl_einheiten <= 4 &&
sanitationStatus == false && ausweis.objekt_saniert == false &&
(certificateReason == "Vermietung" || (ausweis.ausstellgrund == "Vermietung" ||
certificateReason == "Sonstiges")) || ausweis.ausstellgrund == "Sonstiges")) ||
certificateReason == "Neubau" || ausweis.ausstellgrund == "Neubau" ||
certificateReason == "Modernisierung" || ausweis.ausstellgrund == "Modernisierung" ||
certificateReason == "Verkauf"; ausweis.ausstellgrund == "Verkauf";
function automatischAusfüllen() { function automatischAusfüllen() {
baujahrGebaeude = 1962; ausweis.baujahr_gebaeude = 1962;
baujahrHeizungsAnlage = 1974; ausweis.baujahr_anlage = 1974;
sanitationStatus = true; ausweis.objekt_saniert = true;
apartmentCount = 1; ausweis.anzahl_einheiten = 1;
certificateReason = "Vermietung"; ausweis.ausstellgrund = "Vermietung";
energyConsumption = [15000, 14000, 16000] energyConsumption = [15000, 14000, 16000]
area = 152; area = 152;
hasCellar = true; ausweis.keller_beheizt = true;
heatedWaterIncluded = true; ausweis.warmwasser_enthalten = true;
heatedWaterPortion = 18; ausweis.anteil_warmwasser_1 = 18;
} }
</script> </script>
@@ -106,11 +92,11 @@
</div> </div>
<Ausweisart <Ausweisart
bind:baujahrGebaeude bind:baujahrGebaeude={ausweis.baujahr_gebaeude}
bind:apartmentCount bind:apartmentCount={ausweis.anzahl_einheiten}
bind:certificateReason bind:certificateReason={ausweis.ausstellgrund}
bind:sanitationStatus bind:sanitationStatus={ausweis.objekt_saniert}
bind:baujahrHeizungsAnlage bind:baujahrHeizungsAnlage={ausweis.baujahr_anlage}
/> />
<div <div
@@ -166,7 +152,7 @@
<!-- PLZ --> <!-- PLZ -->
<div class="form-group col-md-4 PLZ"> <div class="form-group col-md-4 PLZ">
<ZipSearch bind:zip bind:city name="zip" /> <ZipSearch bind:zip={ausweis.objekt_plz} bind:city={ausweis.objekt_ort} name="zip" />
</div> </div>
<!-- IGort: readonly entfernt - Nelson --> <!-- IGort: readonly entfernt - Nelson -->
@@ -179,7 +165,7 @@
name="IGort" name="IGort"
class="input-md buchstaben" class="input-md buchstaben"
readonly={true} readonly={true}
bind:value={city} bind:value={ausweis.objekt_ort}
type="text" type="text"
/> />
</div> </div>
@@ -210,7 +196,7 @@
<div class="form-group col-md-4"> <div class="form-group col-md-4">
<Label>Keller *</Label> <Label>Keller *</Label>
<div> <div>
<select name="IGkeller" required bind:value={hasCellar}> <select name="IGkeller" required bind:value={ausweis.keller_beheizt}>
<option>Bitte auswählen</option> <option>Bitte auswählen</option>
<option value={false}>nicht vorhanden</option> <option value={false}>nicht vorhanden</option>
<option value={false}>unbeheizt</option> <option value={false}>unbeheizt</option>
@@ -241,7 +227,7 @@
<div class="GRB"> <div class="GRB">
<Verbrauch <Verbrauch
bind:additionalHeating bind:additionalHeating={ausweis.zusaetzliche_heizquelle}
bind:energyConsumption bind:energyConsumption
bind:additionalEnergyConsumption bind:additionalEnergyConsumption
bind:climateFactors bind:climateFactors
@@ -268,7 +254,7 @@
type="checkbox" type="checkbox"
class="IGwwbool" class="IGwwbool"
name="IGwwbool" name="IGwwbool"
bind:checked={heatedWaterIncluded} bind:checked={ausweis.warmwasser_enthalten}
/>Warmwasser im Verbrauch enthalten</label />Warmwasser im Verbrauch enthalten</label
> >
</div> </div>
@@ -285,8 +271,8 @@
name="IGwarmwasser" name="IGwarmwasser"
maxlength="2" maxlength="2"
type="text" type="text"
bind:value={heatedWaterPortion} bind:value={ausweis.anteil_warmwasser_1}
disabled={!heatedWaterIncluded} disabled={!ausweis.warmwasser_enthalten}
autocomplete="off" autocomplete="off"
/> />
</div> </div>
@@ -302,7 +288,7 @@
maxlength="3" maxlength="3"
type="text" type="text"
autocomplete="off" autocomplete="off"
disabled={!additionalHeating} disabled={!ausweis.zusaetzliche_heizquelle}
/> />
</div> </div>

View File

@@ -0,0 +1,245 @@
import { getKlimafaktorenClient } from "../Klimafaktoren";
export enum AusweisType {
VERBRAUCHSAUSWEIS,
VERBRAUCHSAUSWEIS_NICHT_WOHNGEBAEUDE,
BEDARFSAUSWEIS,
}
export enum 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 {
public ausweisart: Ausweisart = "VA";
public id: number = 0;
public user_id: number = 0;
public rechnung_adresse: number = 0;
public versand_adresse: number = 0;
public objekt_typ: string = "";
public objekt_plz: string = "";
public objekt_ort: string = "";
public objekt_strasse: string = "";
public objekt_gebaeudeteil: string = "";
public objekt_saniert: boolean = false;
public baujahr_gebaeude: number = 0;
public baujahr_anlage: number = 0;
public anzahl_einheiten: number = 0;
public erstellungsdatum: Date = new Date();
public ausstellgrund: Ausstellgrund = "Vermietung";
public energieverbrauch_zeitraum_monat: number = 0;
public energieverbrauch_zeitraum_jahr: number = 0;
public energieverbrauch_1_heizquelle_1: number = 0;
public energieverbrauch_2_heizquelle_1: number = 0;
public energieverbrauch_3_heizquelle_1: number = 0;
public energieverbrauch_1_heizquelle_2: number = 0;
public energieverbrauch_2_heizquelle_2: number = 0;
public energieverbrauch_3_heizquelle_2: number = 0;
public energietraeger_einheit_heizquelle_1: string = "";
public energietraeger_einheit_heizquelle_2: string = "";
public energietraeger_1: string = "";
public energietraeger_2: string = "";
public anteil_warmwasser_1: number = 0;
public anteil_warmwasser_2: number = 0;
public public_id: string = "";
public wohnflaeche: number = 0;
public keller_beheizt: boolean = false;
public dachgeschoss: string = "";
public zusaetzliche_heizquelle: boolean = false;
public warmwasser_enthalten: boolean = false;
public lueftungskonzept: Lueftungskonzept = Lueftungskonzept.Fensterlüftung;
public wird_gekuehlt: boolean = false;
public leerstand: number = 0;
public images: string[] = [];
public versorgungssysteme: number = 0;
public fenster_dach: number = 0;
public energiequelle_2_nutzung: number = 0;
public daemmung: number = 0;
public energetische_nutzfläche: number = 0;
/**
* Bedarfsausweis spezifische Eigenschaften
*/
public anzahl_vollgeschosse: number = 0;
public geschosshoehe: number = 0;
public anzahl_gauben: number = 0;
public breite_gauben: number = 0;
public masse_a: number = 0;
public masse_b: number = 0;
public masse_c: number = 0;
public masse_d: number = 0;
public masse_e: number = 0;
public masse_f: number = 0;
public fensterflaeche_so_sw: number = 0;
public fensterflaeche_nw_no: number = 0;
public aussenwandflaeche_unbeheizt: number = 0;
public dachflaeche: number = 0;
public dach_u_wert: number = 0;
public deckenflaeche: number = 0;
public decke_u_wert: number = 0;
public aussenwand_flaeche: number = 0;
public aussenwand_u_wert: number = 0;
public fussboden_flaeche: number = 0;
public fussboden_u_wert: number = 0;
public volumen: number = 0;
public dicht: boolean = false;
public fenster_flaeche_1: number = 0;
public fenster_art_1: string = "";
public fenster_flaeche_2: number = 0;
public fenster_art_2: string = "";
public dachfenster_flaeche: number = 0;
public dachfenster_art: string = "";
public haustuer_flaeche: number = 0;
public haustuer_art: string = "";
public dach_bauart: string = "";
public dach_daemmung: number = 0;
public decke_bauart: string = "";
public decke_daemmung: number = 0;
public aussenwand_bauart: string = "";
public aussenwand_daemmung: number = 0;
public boden_bauart: string = "";
public boden_daemmung: number = 0;
public warmwasser_verteilung: string = "";
public warmwasser_speicherung: string = "";
public warmwasser_erzeugung: string = "";
public heizung_zentral: boolean = false;
public heizung_verteilung: string = "";
public heizung_speicherung: string = "";
public waerme_erzeugung_heizung: string = "";
public anteil_zusatzheizung: number = 0;
public kollektor_flaeche: number = 0;
// VANW
public vanw_stromverbrauch_enthalten: number = 0;
public vanw_stromverbrauch_sonstige: string = "";
public vanw_strom_1: number = 0;
public vanw_strom_2: number = 0;
public vanw_strom_3: number = 0;
public regnummer: string = "";
public erledigt: boolean = false;
public anrede: string = "";
public name: string = "";
public vorname: string = "";
public email: string = "";
public telefonnummer: string = "";
public constructor() {}
public async endEnergieVerbrauch(): Promise<number> {
const date = Date.parse(
`${this.energieverbrauch_zeitraum_jahr}-${this.energieverbrauch_zeitraum_monat}-01 00:00:01`
);
const klimafaktoren = await getKlimafaktorenClient(
date,
this.objekt_plz
);
// Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let [umrechnungsfaktor, primaerfaktor, heizwertfaktor, coe] = [
1, 1, 1, 1,
];
let [umrechnungsfaktor_1, primaerfaktor_1, heizwertfaktor_1, coe_1] = [
1, 1, 1, 1,
];
if (this.energietraeger_1 && this.energietraeger_einheit_heizquelle_1) {
[umrechnungsfaktor, primaerfaktor, heizwertfaktor, coe] =
getHeizwertfaktor(
this.energietraeger_1,
this.energietraeger_einheit_heizquelle_1
);
}
if (this.energietraeger_2 && this.energietraeger_einheit_heizquelle_2) {
[umrechnungsfaktor_1, primaerfaktor_1, heizwertfaktor_1, coe_1] =
getHeizwertfaktor(
this.energietraeger_2,
this.energietraeger_einheit_heizquelle_2
);
}
let verbrauch_1_kwh =
(this.energieverbrauch_1_heizquelle_1 * umrechnungsfaktor) /
heizwertfaktor;
let verbrauch_2_kwh =
(this.energieverbrauch_2_heizquelle_1 * umrechnungsfaktor) /
heizwertfaktor;
let verbrauch_3_kwh =
(this.energieverbrauch_3_heizquelle_1 * umrechnungsfaktor) /
heizwertfaktor;
let verbrauch_4_kwh =
(this.energieverbrauch_1_heizquelle_2 * umrechnungsfaktor_1) /
heizwertfaktor_1;
let verbrauch_5_kwh =
(this.energieverbrauch_2_heizquelle_2 * umrechnungsfaktor_1) /
heizwertfaktor_1;
let verbrauch_6_kwh =
(this.energieverbrauch_3_heizquelle_2 * umrechnungsfaktor_1) /
heizwertfaktor_1;
let warmwasserZuschlag = 0;
let leerstandsZuschlag = 0;
let kuehlungsZuschlag = 0;
if (this.anteil_warmwasser_1 == 0) {
warmwasserZuschlag = 20 * this.energetische_nutzfläche * 3;
}
if (this.leerstand > 0) {
let durchschnittsKlimafaktor =
klimafaktoren.reduce((a, b) => a + b, 0) / 3;
leerstandsZuschlag =
((verbrauch_1_kwh +
verbrauch_2_kwh +
verbrauch_3_kwh +
verbrauch_4_kwh +
verbrauch_5_kwh +
verbrauch_6_kwh) *
(this.leerstand / 100)) /
durchschnittsKlimafaktor;
}
if (energiequelle_2_nutzung[3]) {
kuehlungsZuschlag = 6 * this.energetische_nutzfläche * 3;
}
let anteil_heizung = 1 - this.anteil_warmwasser_1 / 100;
let anteil_warmwasser = this.anteil_warmwasser_1 / 100;
let Energieverbrauchskennwert =
(anteil_heizung *
(verbrauch_1_kwh + verbrauch_4_kwh) *
klimafaktoren[0] +
anteil_warmwasser * (verbrauch_1_kwh + verbrauch_4_kwh) +
anteil_heizung *
(verbrauch_2_kwh + verbrauch_5_kwh) *
klimafaktoren[1] +
anteil_warmwasser * (verbrauch_2_kwh + verbrauch_5_kwh) +
anteil_heizung *
(verbrauch_3_kwh + verbrauch_6_kwh) *
klimafaktoren[2] +
anteil_warmwasser * (verbrauch_3_kwh + verbrauch_6_kwh) +
warmwasserZuschlag +
leerstandsZuschlag +
kuehlungsZuschlag) /
3 /
this.energetische_nutzfläche;
return Energieverbrauchskennwert;
}
}

13
src/lib/Klimafaktoren.ts Normal file
View File

@@ -0,0 +1,13 @@
import moment from "moment";
import { memoize } from "./Memization";
export const getKlimafaktorenClient = memoize<Promise<number[]>>(async (date: Date, zip: string) => {
const response = await fetch(`/api/klimafaktoren?date=${moment(date).format("YYYY-MM-DD")}&zip=${zip}`);
const json = await response.json();
return json;
});
export const getKlimafaktorenServer = memoize(async (date: Date, zip: string) => {
});

18
src/lib/Memization.ts Normal file
View File

@@ -0,0 +1,18 @@
type MemoizedFunction<T> = (...args: any[]) => T;
export function memoize<T>(func: (...args: any[]) => T): MemoizedFunction<T> {
const cache = new Map<string, T>();
return (...args: any[]): T => {
const key = JSON.stringify(args);
if (cache.has(key)) {
return cache.get(key)!;
}
const result = func(...args);
cache.set(key, result);
return result;
};
}